Skip to content

Commit f64cb94

Browse files
authored
Merge pull request #299 from RedstoneTools/dev
Release 2.0.0
2 parents 10e793f + c5219d8 commit f64cb94

File tree

79 files changed

+1572
-1040
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1572
-1040
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ org.gradle.parallel=true
99
loader_version=0.14.6
1010

1111
# Mod Properties
12-
mod_version = 1.18.2-1.2.0
12+
mod_version = 1.18.2-2.0.0
1313
maven_group = tools.redstone
1414
archives_base_name = redstonetools
1515

src/main/java/tools/redstone/redstonetools/RedstoneToolsClient.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@
22

33
import net.fabricmc.api.ClientModInitializer;
44
import net.fabricmc.loader.api.FabricLoader;
5+
import net.minecraft.client.MinecraftClient;
56
import org.slf4j.Logger;
67
import org.slf4j.LoggerFactory;
78
import rip.hippo.inject.Doctor;
89
import rip.hippo.inject.Injector;
9-
import tools.redstone.redstonetools.macros.WorldlessCommandHelper;
10+
import tools.redstone.redstonetools.utils.DependencyLookup;
1011
import tools.redstone.redstonetools.utils.ReflectionUtils;
1112

13+
import java.nio.file.Path;
14+
1215
public class RedstoneToolsClient implements ClientModInitializer {
16+
1317
public static final String MOD_ID = "redstonetools";
1418
public static final String MOD_VERSION = "v" + FabricLoader.getInstance().getModContainer(MOD_ID).orElseThrow().getMetadata().getVersion().getFriendlyString();
1519
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
20+
public static final Path CONFIG_DIR = FabricLoader.getInstance().getConfigDir().resolve("redstonetools");
1621
public static final Injector INJECTOR = Doctor.createInjector(ReflectionUtils.getModules());
1722

1823
@Override
@@ -24,12 +29,14 @@ public void onInitializeClient() {
2429

2530
// Register features
2631
ReflectionUtils.getFeatures().forEach(feature -> {
27-
LOGGER.trace("Registering feature {}", feature);
32+
LOGGER.trace("Registering feature {}", feature.getClass().getName());
2833

34+
if (feature.requiresWorldEdit() && !DependencyLookup.WORLDEDIT_PRESENT) {
35+
LOGGER.warn("Feature {} requires WorldEdit, but WorldEdit is not loaded. Skipping registration.", feature.getName());
36+
return;
37+
}
2938
feature.register();
3039
});
31-
32-
// should call the "static" block
33-
WorldlessCommandHelper.dummyNetworkHandler.getCommandDispatcher();
3440
}
41+
3542
}

src/main/java/tools/redstone/redstonetools/RedstoneToolsGameRules.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory;
44
import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry;
55
import net.minecraft.world.GameRules;
6+
import tools.redstone.redstonetools.utils.DependencyLookup;
67

78

89
public class RedstoneToolsGameRules {
@@ -14,6 +15,9 @@ private RedstoneToolsGameRules() {
1415

1516
public static void register() {
1617
DO_CONTAINER_DROPS = GameRuleRegistry.register("doContainerDrops", GameRules.Category.DROPS, GameRuleFactory.createBooleanRule(true));
17-
DO_BLOCK_UPDATES_AFTER_EDIT = GameRuleRegistry.register("doBlockUpdatesAfterEdit", GameRules.Category.UPDATES, GameRuleFactory.createBooleanRule(false));
18+
19+
if (DependencyLookup.WORLDEDIT_PRESENT) {
20+
DO_BLOCK_UPDATES_AFTER_EDIT = GameRuleRegistry.register("doBlockUpdatesAfterEdit", GameRules.Category.UPDATES, GameRuleFactory.createBooleanRule(false));
21+
}
1822
}
1923
}

src/main/java/tools/redstone/redstonetools/features/AbstractFeature.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,47 @@
55
import net.minecraft.server.command.ServerCommandSource;
66

77
public abstract class AbstractFeature {
8-
private final Feature feature;
8+
9+
private final Feature featureInfo;
10+
private final String id;
911

1012
{
11-
feature = getClass().getAnnotation(Feature.class);
13+
featureInfo = getClass().getAnnotation(Feature.class);
1214

13-
if (feature == null) {
15+
if (featureInfo == null) {
1416
throw new IllegalStateException("Feature " + getClass() + " is not annotated with @Feature");
1517
}
18+
19+
String id = featureInfo.id();
20+
if (id.isEmpty()) {
21+
// derive id from name
22+
// Air Place -> airplace
23+
id = featureInfo.name()
24+
.toLowerCase()
25+
.replace(" ", "");
26+
}
27+
28+
this.id = id;
29+
}
30+
31+
public String getID() {
32+
return id;
1633
}
1734

1835
public String getName() {
19-
return feature.name();
36+
return featureInfo.name();
2037
}
2138

2239
public String getDescription() {
23-
return feature.description();
40+
return featureInfo.description();
2441
}
2542

2643
public String getCommand() {
27-
return feature.command();
44+
return featureInfo.command();
45+
}
46+
47+
public boolean requiresWorldEdit() {
48+
return featureInfo.worldedit();
2849
}
2950

3051
/**
@@ -35,4 +56,5 @@ public void register() {
3556
}
3657

3758
protected abstract void registerCommands(CommandDispatcher<ServerCommandSource> dispatcher, boolean dedicated);
59+
3860
}

src/main/java/tools/redstone/redstonetools/features/Feature.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
@Target(ElementType.TYPE)
99
@Retention(RetentionPolicy.RUNTIME)
1010
public @interface Feature {
11+
String id() default "";
1112
String name();
1213
String description();
1314
String command();
15+
boolean worldedit() default false;
1416
}

src/main/java/tools/redstone/redstonetools/features/arguments/Argument.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public class Argument<T> {
77
private String name;
88
private final TypeSerializer<T, ?> type;
99
private boolean optional = false;
10-
private T value;
10+
private volatile T value;
1111
private T defaultValue;
1212

1313
private Argument(TypeSerializer<T, ?> type) {
@@ -21,10 +21,15 @@ public static <T> Argument<T> ofType(TypeSerializer<T, ?> type) {
2121
public Argument<T> withDefault(T defaultValue) {
2222
optional = true;
2323
this.defaultValue = defaultValue;
24+
this.value = defaultValue; // for options, temporary
2425

2526
return this;
2627
}
2728

29+
public T getDefaultValue() {
30+
return defaultValue;
31+
}
32+
2833
public Argument<T> named(String name) {
2934
this.name = name;
3035

@@ -52,7 +57,7 @@ public boolean isOptional() {
5257
}
5358

5459
@SuppressWarnings("unchecked")
55-
public void setValue(CommandContext<?> context) {
60+
public void updateValue(CommandContext<?> context) {
5661
try {
5762
value = (T) context.getArgument(name, Object.class);
5863
} catch (IllegalArgumentException e) {
@@ -64,6 +69,10 @@ public void setValue(CommandContext<?> context) {
6469
}
6570
}
6671

72+
public void setValue(T value) {
73+
this.value = value;
74+
}
75+
6776
public T getValue() {
6877
return value;
6978
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package tools.redstone.redstonetools.features.arguments.serializers;
2+
3+
import tools.redstone.redstonetools.utils.ColoredBlockType;
4+
5+
public class ColoredBlockTypeSerializer extends EnumSerializer<ColoredBlockType> {
6+
private static final ColoredBlockTypeSerializer INSTANCE = new ColoredBlockTypeSerializer();
7+
8+
private ColoredBlockTypeSerializer() {
9+
super(ColoredBlockType.class);
10+
}
11+
12+
public static ColoredBlockTypeSerializer coloredBlockType() {
13+
return INSTANCE;
14+
}
15+
}

src/main/java/tools/redstone/redstonetools/features/arguments/DirectionSerializer.java renamed to src/main/java/tools/redstone/redstonetools/features/arguments/serializers/DirectionSerializer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
package tools.redstone.redstonetools.features.arguments;
1+
package tools.redstone.redstonetools.features.arguments.serializers;
22

3-
import tools.redstone.redstonetools.features.arguments.serializers.EnumSerializer;
43
import tools.redstone.redstonetools.utils.DirectionArgument;
54

65
public class DirectionSerializer extends EnumSerializer<DirectionArgument> {

src/main/java/tools/redstone/redstonetools/features/arguments/serializers/IntLikeSerializer.java

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -53,25 +53,28 @@ public T deserialize(String serialized) {
5353
}
5454

5555
private T deserializeUnchecked(String serialized) {
56+
boolean isNegative = false;
5657
if (serialized.length() == 1) {
5758
return tryParse(serialized);
5859
}
5960

61+
if(serialized.charAt(0) == '-' && serialized.chars().filter(ch -> ch == '-').count() == 1){
62+
isNegative = true;
63+
serialized = serialized.replace("-","");
64+
}
65+
6066
if (serialized.charAt(0) == '0') {
61-
var prefixedBase = serialized.substring(0, 2);
62-
var number = serialized.substring(2);
63-
64-
// TODO(Refactor): Write a NumberBase.fromCharacter method instead of this that iterates of the NumberBases (add the char to the NumberBase constructor)
65-
var numberBase = switch (prefixedBase.charAt(1)) {
66-
case 'b' -> NumberBase.BINARY;
67-
case 'o' -> NumberBase.OCTAL;
68-
case 'd' -> NumberBase.DECIMAL;
69-
case 'x' -> NumberBase.HEXADECIMAL;
70-
default -> null;
71-
};
72-
73-
if (numberBase != null) {
74-
return tryParse(number, numberBase.toInt());
67+
if(serialized.length() > 1) {
68+
var prefixedBase = serialized.substring(0, 2);
69+
var number = serialized.substring(2);
70+
71+
var numberBase = NumberBase.fromPrefix(prefixedBase).orElse(null);
72+
73+
if (numberBase != null) {
74+
return isNegative ? tryParse("-" + number, numberBase.toInt()) : tryParse(number, numberBase.toInt());
75+
}
76+
} else {
77+
return tryParse(serialized,10);
7578
}
7679
}
7780

@@ -90,10 +93,10 @@ private T deserializeUnchecked(String serialized) {
9093
throw new IllegalArgumentException("Invalid base '" + parts[1] + "'.");
9194
}
9295

93-
return tryParse(number, base);
96+
return isNegative ? tryParse("-"+number, base) : tryParse(number, base);
9497
}
9598

96-
return tryParse(serialized);
99+
return isNegative ? tryParse("-"+serialized) : tryParse(serialized);
97100
}
98101

99102
private T tryParse(String string) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package tools.redstone.redstonetools.features.arguments.serializers;
2+
3+
import tools.redstone.redstonetools.utils.NumberArg;
4+
5+
import java.util.Optional;
6+
7+
public class NumberSerializer extends IntLikeSerializer<NumberArg> {
8+
private static final NumberSerializer INSTANCE = new NumberSerializer(null,null);
9+
10+
public static NumberSerializer numberArg(){
11+
return INSTANCE;
12+
}
13+
14+
public static NumberSerializer numberArg(NumberArg min) {
15+
return new NumberSerializer(min, null);
16+
}
17+
18+
public static NumberSerializer numberArg(NumberArg min, NumberArg max) {
19+
return new NumberSerializer(min, max);
20+
}
21+
22+
private NumberSerializer(NumberArg min, NumberArg max){
23+
super(NumberArg.class,min, max);
24+
}
25+
26+
@Override
27+
protected Optional<NumberArg> tryParseOptional(String string, int radix) {
28+
try {
29+
return Optional.of(new NumberArg(string, radix));
30+
} catch (NumberFormatException ignored) {
31+
return Optional.empty();
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)