diff --git a/oldSrc/main/java/tools/redstone/redstonetools/RedstoneToolsClient.java b/oldSrc/main/java/tools/redstone/redstonetools/RedstoneToolsClient.java deleted file mode 100644 index 2207c32b..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/RedstoneToolsClient.java +++ /dev/null @@ -1,42 +0,0 @@ -package tools.redstone.redstonetools; - -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.MinecraftClient; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import rip.hippo.inject.Doctor; -import rip.hippo.inject.Injector; -import tools.redstone.redstonetools.utils.DependencyLookup; -import tools.redstone.redstonetools.utils.ReflectionUtils; - -import java.nio.file.Path; - -public class RedstoneToolsClient implements ClientModInitializer { - - public static final String MOD_ID = "redstonetools"; - public static final String MOD_VERSION = "v" + FabricLoader.getInstance().getModContainer(MOD_ID).orElseThrow().getMetadata().getVersion().getFriendlyString(); - public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - public static final Path CONFIG_DIR = FabricLoader.getInstance().getConfigDir().resolve("redstonetools"); - public static final Injector INJECTOR = Doctor.createInjector(ReflectionUtils.getModules()); - - @Override - public void onInitializeClient() { - LOGGER.info("Initializing Redstone Tools"); - - // Register game rules - RedstoneToolsGameRules.register(); - - // Register features - ReflectionUtils.getFeatures().forEach(feature -> { - LOGGER.trace("Registering feature {}", feature.getClass().getName()); - - if (feature.requiresWorldEdit() && !DependencyLookup.WORLDEDIT_PRESENT) { - LOGGER.warn("Feature {} requires WorldEdit, but WorldEdit is not loaded. Skipping registration.", feature.getName()); - return; - } - feature.register(); - }); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/RedstoneToolsGameRules.java b/oldSrc/main/java/tools/redstone/redstonetools/RedstoneToolsGameRules.java deleted file mode 100644 index 73a9e2f8..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/RedstoneToolsGameRules.java +++ /dev/null @@ -1,23 +0,0 @@ -package tools.redstone.redstonetools; - -import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory; -import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry; -import net.minecraft.world.GameRules; -import tools.redstone.redstonetools.utils.DependencyLookup; - - -public class RedstoneToolsGameRules { - private RedstoneToolsGameRules() { - } - - public static GameRules.Key DO_CONTAINER_DROPS; - public static GameRules.Key DO_BLOCK_UPDATES_AFTER_EDIT; - - public static void register() { - DO_CONTAINER_DROPS = GameRuleRegistry.register("doContainerDrops", GameRules.Category.DROPS, GameRuleFactory.createBooleanRule(true)); - - if (DependencyLookup.WORLDEDIT_PRESENT) { - DO_BLOCK_UPDATES_AFTER_EDIT = GameRuleRegistry.register("doBlockUpdatesAfterEdit", GameRules.Category.UPDATES, GameRuleFactory.createBooleanRule(false)); - } - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/di/FeatureModule.java b/oldSrc/main/java/tools/redstone/redstonetools/di/FeatureModule.java deleted file mode 100644 index 505e2179..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/di/FeatureModule.java +++ /dev/null @@ -1,18 +0,0 @@ -package tools.redstone.redstonetools.di; - -import com.google.auto.service.AutoService; -import rip.hippo.inject.DoctorModule; -import rip.hippo.inject.binding.Binder; -import tools.redstone.redstonetools.utils.ReflectionUtils; - -@AutoService(DoctorModule.class) -public class FeatureModule implements DoctorModule { - @SuppressWarnings({"rawtypes", "unchecked"}) // this is probably the only way to make it work - @Override - public void configure(Binder binder) { - for (var feature : ReflectionUtils.getFeatures()) { - Class clazz = feature.getClass(); - binder.bind(clazz).toInstance(feature); - } - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/di/UtilityModule.java b/oldSrc/main/java/tools/redstone/redstonetools/di/UtilityModule.java deleted file mode 100644 index 3415b5e3..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/di/UtilityModule.java +++ /dev/null @@ -1,15 +0,0 @@ -package tools.redstone.redstonetools.di; - -import com.google.auto.service.AutoService; -import rip.hippo.inject.DoctorModule; -import rip.hippo.inject.binding.Binder; -import tools.redstone.redstonetools.features.feedback.AbstractFeedbackSender; -import tools.redstone.redstonetools.features.feedback.FeedbackSender; - -@AutoService(DoctorModule.class) -public class UtilityModule implements DoctorModule { - @Override - public void configure(Binder binder) { - binder.bind(AbstractFeedbackSender.class).to(FeedbackSender.class); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/AbstractFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/AbstractFeature.java deleted file mode 100644 index e8e6f1af..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/AbstractFeature.java +++ /dev/null @@ -1,60 +0,0 @@ -package tools.redstone.redstonetools.features; - -import com.mojang.brigadier.CommandDispatcher; -import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; -import net.minecraft.server.command.ServerCommandSource; - -public abstract class AbstractFeature { - - private final Feature featureInfo; - private final String id; - - { - featureInfo = getClass().getAnnotation(Feature.class); - - if (featureInfo == null) { - throw new IllegalStateException("Feature " + getClass() + " is not annotated with @Feature"); - } - - String id = featureInfo.id(); - if (id.isEmpty()) { - // derive id from name - // Air Place -> airplace - id = featureInfo.name() - .toLowerCase() - .replace(" ", ""); - } - - this.id = id; - } - - public String getID() { - return id; - } - - public String getName() { - return featureInfo.name(); - } - - public String getDescription() { - return featureInfo.description(); - } - - public String getCommand() { - return featureInfo.command(); - } - - public boolean requiresWorldEdit() { - return featureInfo.worldedit(); - } - - /** - * Register this feature. - */ - public void register() { - CommandRegistrationCallback.EVENT.register(this::registerCommands); - } - - protected abstract void registerCommands(CommandDispatcher dispatcher, boolean dedicated); - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/Feature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/Feature.java deleted file mode 100644 index 14979af7..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/Feature.java +++ /dev/null @@ -1,16 +0,0 @@ -package tools.redstone.redstonetools.features; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface Feature { - String id() default ""; - String name(); - String description(); - String command(); - boolean worldedit() default false; -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/Argument.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/Argument.java deleted file mode 100644 index 683536c0..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/Argument.java +++ /dev/null @@ -1,80 +0,0 @@ -package tools.redstone.redstonetools.features.arguments; - -import tools.redstone.redstonetools.features.arguments.serializers.TypeSerializer; -import com.mojang.brigadier.context.CommandContext; - -public class Argument { - private String name; - private final TypeSerializer type; - private boolean optional = false; - private volatile T value; - private T defaultValue; - - private Argument(TypeSerializer type) { - this.type = type; - } - - public static Argument ofType(TypeSerializer type) { - return new Argument<>(type); - } - - public Argument withDefault(T defaultValue) { - optional = true; - this.defaultValue = defaultValue; - this.value = defaultValue; // for options, temporary - - return this; - } - - public T getDefaultValue() { - return defaultValue; - } - - public Argument named(String name) { - this.name = name; - - return this; - } - - public Argument ensureNamed(String fieldName) { - if (name == null) { - name = fieldName; - } - - return this; - } - - public String getName() { - return name; - } - - public TypeSerializer getType() { - return type; - } - - public boolean isOptional() { - return optional; - } - - @SuppressWarnings("unchecked") - public void updateValue(CommandContext context) { - try { - value = (T) context.getArgument(name, Object.class); - } catch (IllegalArgumentException e) { - if (!optional) { - throw e; - } - - value = defaultValue; - } - } - - public void setValue(T value) { - this.value = value; - } - - public T getValue() { - return value; - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BigIntegerSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BigIntegerSerializer.java deleted file mode 100644 index 36b94bbb..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BigIntegerSerializer.java +++ /dev/null @@ -1,33 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import java.math.BigInteger; -import java.util.Optional; - -public class BigIntegerSerializer extends IntLikeSerializer { - private static final BigIntegerSerializer INSTANCE = new BigIntegerSerializer(null, null); - - public static BigIntegerSerializer bigInteger() { - return INSTANCE; - } - - public static BigIntegerSerializer bigInteger(BigInteger min) { - return new BigIntegerSerializer(min, null); - } - - public static BigIntegerSerializer bigInteger(BigInteger min, BigInteger max) { - return new BigIntegerSerializer(min, max); - } - - private BigIntegerSerializer(BigInteger min, BigInteger max) { - super(BigInteger.class, min, max); - } - - @Override - protected Optional tryParseOptional(String string, int radix) { - try { - return Optional.of(new BigInteger(string, radix)); - } catch (NumberFormatException ignored) { - return Optional.empty(); - } - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BlockColorSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BlockColorSerializer.java deleted file mode 100644 index a90c2a85..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BlockColorSerializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import tools.redstone.redstonetools.utils.BlockColor; - -public class BlockColorSerializer extends EnumSerializer { - private static final BlockColorSerializer INSTANCE = new BlockColorSerializer(); - - private BlockColorSerializer() { - super(BlockColor.class); - } - - public static BlockColorSerializer blockColor() { - return INSTANCE; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BlockStateArgumentSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BlockStateArgumentSerializer.java deleted file mode 100644 index 705bebac..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BlockStateArgumentSerializer.java +++ /dev/null @@ -1,60 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.command.argument.BlockStateArgument; -import net.minecraft.command.argument.BlockStateArgumentType; -import net.minecraft.util.registry.Registry; - -public class BlockStateArgumentSerializer extends BrigadierSerializer { - - private static final BlockStateArgumentSerializer INSTANCE = new BlockStateArgumentSerializer(); - - private BlockStateArgumentSerializer() { - super(BlockStateArgument.class, BlockStateArgumentType.blockState()); - } - - public static BlockStateArgumentSerializer blockState() { - return INSTANCE; - } - - @Override - public BlockStateArgument deserialize(String serialized) { - try { - return deserialize(new StringReader(serialized)); - } catch (CommandSyntaxException e) { - throw new IllegalStateException("Syntax Exception: " + e.getMessage()); - } - } - - @Override - public String serialize(BlockStateArgument value) { - var state = value.getBlockState(); - var block = state.getBlock(); - - var builder = new StringBuilder() - .append(Registry.BLOCK.getId(block)); - - if (state.getProperties().size() == 0) { - return builder.toString(); - } - - builder.append('['); - var first = true; - for (var prop : state.getProperties()) { - if (first) { - first = false; - } else { - builder.append(','); - } - - builder.append(prop.getName()) - .append('=') - .append(state.get(prop)); - } - builder.append(']'); - - return builder.toString(); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BoolSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BoolSerializer.java deleted file mode 100644 index 02fb39e5..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BoolSerializer.java +++ /dev/null @@ -1,23 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.arguments.BoolArgumentType; - -public class BoolSerializer extends StringBrigadierSerializer { - - private static final BoolSerializer INSTANCE = new BoolSerializer(BoolArgumentType.bool()); - - public static BoolSerializer bool() { - return INSTANCE; - } - - private BoolSerializer(ArgumentType argumentType) { - super(Boolean.class, argumentType); - } - - @Override - public String serialize(Boolean value) { - return String.valueOf(value); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BrigadierSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BrigadierSerializer.java deleted file mode 100644 index 5a2e5ba9..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/BrigadierSerializer.java +++ /dev/null @@ -1,38 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; - -import java.util.Collection; -import java.util.concurrent.CompletableFuture; - -public abstract class BrigadierSerializer extends TypeSerializer { - - // the wrapped brigadier argument type - private final ArgumentType argumentType; - - public BrigadierSerializer(Class clazz, ArgumentType argumentType) { - super(clazz); - this.argumentType = argumentType; - } - - @Override - public T deserialize(StringReader reader) throws CommandSyntaxException { - return argumentType.parse(reader); - } - - @Override - public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return argumentType.listSuggestions(context, builder); - } - - @Override - public Collection getExamples() { - return argumentType.getExamples(); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/CollectionSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/CollectionSerializer.java deleted file mode 100644 index c68c7c29..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/CollectionSerializer.java +++ /dev/null @@ -1,176 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; - -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.function.Function; - -/** - * Serializes any collection type as a list, - * and handles it specially for configuration. - * - * @param The element type. - * @param The collection type. - */ -public class CollectionSerializer> - extends TypeSerializer> -{ - - public static CollectionSerializer> listOf(TypeSerializer element) { - return new CollectionSerializer<>(List.class, element, ArrayList::new); - } - - public static CollectionSerializer> setOf(TypeSerializer element) { - return new CollectionSerializer<>(Set.class, element, HashSet::new); - } - - final TypeSerializer elementType; - final Function, C> collectionFactory; - - // cache example because - // its relatively expensive - // to compute correctly - final String example; - - @SuppressWarnings("unchecked") - protected CollectionSerializer(Class clazz, - TypeSerializer elementType, - Function, C> collectionFactory) { - super((Class) clazz); - this.elementType = (TypeSerializer) elementType; - this.collectionFactory = collectionFactory; - - // build example - StringBuilder b = new StringBuilder("["); - for (String elemStr : elementType.getExamples()) { - b.append(elemStr); - b.append(", "); - } - - this.example = b.delete(b.length() - 3, b.length()).append("]").toString(); - } - - public TypeSerializer getElementType() { - return elementType; - } - - @Override - public C deserialize(StringReader reader) throws CommandSyntaxException { - List list = new ArrayList<>(); - reader.expect('['); - reader.skipWhitespace(); - if (reader.peek() == ']') { // empty list - reader.skip(); - return collectionFactory.apply(list); - } - - while (reader.canRead()) { - E element = elementType.deserialize(reader); - list.add(element); - reader.skipWhitespace(); - if (reader.peek() == ']') - break; - reader.expect(','); - reader.skipWhitespace(); - } - - reader.skipWhitespace(); - reader.expect(']'); - - return collectionFactory.apply(list); - } - - @Override - public Collection getExamples() { - return List.of("[a, b, c]"); - } - - @Override - public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - String remaining = builder.getRemaining(); - - if (remaining.isBlank()) { - // suggest opening the list - builder.suggest("["); - } else { - builder.suggest(","); - builder.suggest("]"); - - // suggest element options - // the start index is the index - // of the last comma if open, otherwise - // it will be -1 and no elements will - // be suggested - // TODO: fix because this doesnt work for some reason - StringReader inputParser = new StringReader(remaining); - int startIndex = -1; - try { - inputParser.skip(); // [ - while (inputParser.canRead()) { - // skip element - int oldCursor = inputParser.getCursor(); - try { - elementType.deserialize(inputParser); - } catch (CommandSyntaxException ignored) { } - if (oldCursor == inputParser.getCursor()) - break; - inputParser.skipWhitespace(); - - // skip and register comma - if (inputParser.peek() == ',') { - startIndex = inputParser.getCursor(); - } - - inputParser.skip(); - if (!inputParser.canRead()) - break; - - // end on closer - if (inputParser.peek() == ']') { - startIndex = -1; - break; - } - - inputParser.skipWhitespace(); - } - } catch (Exception e) { - startIndex = -1; - } - - if (startIndex != -1) { - SuggestionsBuilder b2 = new SuggestionsBuilder( - remaining, - remaining.toLowerCase(), - startIndex + 1); - - elementType.listSuggestions(context, b2); - builder.add(b2); - } - } - - return builder.buildFuture(); - } - - @Override - @SuppressWarnings({ "rawtypes", "unchecked" }) - public C deserialize(List in) { - List elementList = in.stream() - .map(elementType::deserialize) - .toList(); - return collectionFactory.apply(elementList); - } - - @Override - public List serialize(C value) { - return value - .stream() - .map(elementType::serialize) - .toList(); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/ColoredBlockTypeSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/ColoredBlockTypeSerializer.java deleted file mode 100644 index 3b7b6e99..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/ColoredBlockTypeSerializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import tools.redstone.redstonetools.utils.ColoredBlockType; - -public class ColoredBlockTypeSerializer extends EnumSerializer { - private static final ColoredBlockTypeSerializer INSTANCE = new ColoredBlockTypeSerializer(); - - private ColoredBlockTypeSerializer() { - super(ColoredBlockType.class); - } - - public static ColoredBlockTypeSerializer coloredBlockType() { - return INSTANCE; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/DirectionSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/DirectionSerializer.java deleted file mode 100644 index 9a2f3b36..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/DirectionSerializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import tools.redstone.redstonetools.utils.DirectionArgument; - -public class DirectionSerializer extends EnumSerializer { - private static final DirectionSerializer INSTANCE = new DirectionSerializer(); - - private DirectionSerializer() { - super(DirectionArgument.class); - } - - public static DirectionSerializer direction() { - return INSTANCE; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/DoubleSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/DoubleSerializer.java deleted file mode 100644 index 86daafa0..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/DoubleSerializer.java +++ /dev/null @@ -1,31 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.arguments.DoubleArgumentType; - -public class DoubleSerializer extends StringBrigadierSerializer { - - private static final DoubleSerializer INSTANCE = new DoubleSerializer(DoubleArgumentType.doubleArg()); - - public static DoubleSerializer doubleArg() { - return INSTANCE; - } - - public static DoubleSerializer doubleArg(double min) { - return new DoubleSerializer(DoubleArgumentType.doubleArg(min)); - } - - public static DoubleSerializer doubleArg(double min, double max) { - return new DoubleSerializer(DoubleArgumentType.doubleArg(min, max)); - } - - private DoubleSerializer(ArgumentType argumentType) { - super(Double.class, argumentType); - } - - @Override - public String serialize(Double value) { - return String.valueOf(value); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/EnumSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/EnumSerializer.java deleted file mode 100644 index be6d2e92..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/EnumSerializer.java +++ /dev/null @@ -1,80 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.minecraft.text.Text; - -import java.util.Collection; -import java.util.EnumSet; -import java.util.concurrent.CompletableFuture; - -public abstract class EnumSerializer> - extends TypeSerializer { - - protected EnumSerializer(Class clazz) { - super(clazz); - } - - // common method for stringification - // of the enum constants, can be overridden - @Override - public String serialize(T value) { - return value.toString(); - } - - @Override - public T deserialize(StringReader reader) throws CommandSyntaxException { - var input = reader.readUnquotedString(); - - try { - return deserialize(input); - } catch (IllegalArgumentException e) { - throw new CommandSyntaxException(null, Text.of(e.getMessage())); - } - } - - @Override - public T deserialize(String input) { - String inputLowerCase = input.toLowerCase(); - - var matches = EnumSet.allOf(clazz) - .stream() - .filter(elem -> serialize(elem).toLowerCase().startsWith(inputLowerCase)) - .toList(); - - var exactMatch = matches.stream().filter(elem -> serialize(elem).toLowerCase().equals(input)).findFirst(); - if (exactMatch.isPresent()) { - return exactMatch.get(); - } - - if (matches.isEmpty()) { - throw new IllegalArgumentException("No such option '" + input + "'"); - } - - if (matches.size() > 1) { - throw new IllegalArgumentException("Ambiguous option '" + input + "'"); - } - - return matches.get(0); - } - - @Override - public Collection getExamples() { - return EnumSet.allOf(clazz).stream() - .map(this::serialize) - .toList(); - } - - @Override - public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - for (var value : EnumSet.allOf(clazz)) { - builder = builder.suggest(serialize(value)); - } - - return builder.buildFuture(); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/FloatSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/FloatSerializer.java deleted file mode 100644 index 3511e418..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/FloatSerializer.java +++ /dev/null @@ -1,31 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.arguments.FloatArgumentType; - -public class FloatSerializer extends StringBrigadierSerializer { - - private static final FloatSerializer INSTANCE = new FloatSerializer(FloatArgumentType.floatArg()); - - public static FloatSerializer floatArg() { - return INSTANCE; - } - - public static FloatSerializer floatArg(float min) { - return new FloatSerializer(FloatArgumentType.floatArg(min)); - } - - public static FloatSerializer floatArg(float min, float max) { - return new FloatSerializer(FloatArgumentType.floatArg(min, max)); - } - - private FloatSerializer(ArgumentType argumentType) { - super(Float.class, argumentType); - } - - @Override - public String serialize(Float value) { - return String.valueOf(value); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/IntLikeSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/IntLikeSerializer.java deleted file mode 100644 index 0cfc6974..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/IntLikeSerializer.java +++ /dev/null @@ -1,129 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.minecraft.text.Text; -import tools.redstone.redstonetools.utils.NumberBase; - -import java.util.Collection; -import java.util.Collections; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -public abstract class IntLikeSerializer> extends TypeSerializer { - private final T min; - private final boolean hasMin; - private final T max; - private final boolean hasMax; - - protected IntLikeSerializer(Class clazz, T min, T max) { - super(clazz); - - this.min = min; - hasMin = min != null; - this.max = max; - hasMax = max != null; - } - - @Override - public T deserialize(StringReader reader) throws CommandSyntaxException { - var input = reader.readUnquotedString(); - - try { - return deserialize(input); - } catch (IllegalArgumentException e) { - throw new CommandSyntaxException(null, Text.of(e.getMessage())); - } - } - - @Override - public T deserialize(String serialized) { - var value = deserializeUnchecked(serialized); - - if (hasMin && value.compareTo(min) < 0) { - throw new IllegalArgumentException(value + " is below the minimum of " + min + "."); - } else if (hasMax && value.compareTo(max) > 0) { - throw new IllegalArgumentException(value + " is above the maximum of " + max + "."); - } - - return value; - } - - private T deserializeUnchecked(String serialized) { - boolean isNegative = false; - if (serialized.length() == 1) { - return tryParse(serialized); - } - - if(serialized.charAt(0) == '-' && serialized.chars().filter(ch -> ch == '-').count() == 1){ - isNegative = true; - serialized = serialized.replace("-",""); - } - - if (serialized.charAt(0) == '0') { - if(serialized.length() > 1) { - var prefixedBase = serialized.substring(0, 2); - var number = serialized.substring(2); - - var numberBase = NumberBase.fromPrefix(prefixedBase).orElse(null); - - if (numberBase != null) { - return isNegative ? tryParse("-" + number, numberBase.toInt()) : tryParse(number, numberBase.toInt()); - } - } else { - return tryParse(serialized,10); - } - } - - var parts = serialized.split("_", 2); - if (parts.length == 2) { - var number = parts[0]; - - int base; - try { - base = Integer.parseInt(parts[1]); - - if (2 > base || base > 36) { - throw new NumberFormatException(); - } - } catch (NumberFormatException ignored) { - throw new IllegalArgumentException("Invalid base '" + parts[1] + "'."); - } - - return isNegative ? tryParse("-"+number, base) : tryParse(number, base); - } - - return isNegative ? tryParse("-"+serialized) : tryParse(serialized); - } - - private T tryParse(String string) { - return tryParse(string, 10); - } - - private T tryParse(String string, int radix) { - return tryParseOptional(string, radix) - .orElseThrow(() -> new IllegalArgumentException(radix == 10 - ? "Invalid number '" + string + "'." - : "Invalid base " + radix + " number '" + string + "'.")); - } - - protected abstract Optional tryParseOptional(String string, int radix); - - @Override - public String serialize(T value) { - return String.valueOf(value); - } - - @Override - public Collection getExamples() { - return Collections.emptyList(); - } - - @Override - public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - return builder.buildFuture(); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/IntegerSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/IntegerSerializer.java deleted file mode 100644 index 8a53cf08..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/IntegerSerializer.java +++ /dev/null @@ -1,32 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import java.util.Optional; - -public class IntegerSerializer extends IntLikeSerializer { - private static final IntegerSerializer INSTANCE = new IntegerSerializer(Integer.MIN_VALUE, Integer.MAX_VALUE); - - public static IntegerSerializer integer() { - return INSTANCE; - } - - public static IntegerSerializer integer(int min) { - return new IntegerSerializer(min, Integer.MAX_VALUE); - } - - public static IntegerSerializer integer(int min, int max) { - return new IntegerSerializer(min, max); - } - - private IntegerSerializer(int min, int max) { - super(Integer.class, min, max); - } - - @Override - protected Optional tryParseOptional(String string, int radix) { - try { - return Optional.of(Integer.parseInt(string, radix)); - } catch (NumberFormatException ignored) { - return Optional.empty(); - } - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/LongSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/LongSerializer.java deleted file mode 100644 index 43516d84..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/LongSerializer.java +++ /dev/null @@ -1,32 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import java.util.Optional; - -public class LongSerializer extends IntLikeSerializer { - private static final LongSerializer INSTANCE = new LongSerializer(Long.MIN_VALUE, Long.MAX_VALUE); - - public static LongSerializer longArg() { - return INSTANCE; - } - - public static LongSerializer longArg(long min) { - return new LongSerializer(min, Long.MAX_VALUE); - } - - public static LongSerializer longArg(long min, long max) { - return new LongSerializer(min, max); - } - - private LongSerializer(long min, long max) { - super(Long.class, min, max); - } - - @Override - protected Optional tryParseOptional(String string, int radix) { - try { - return Optional.of(Long.parseLong(string, radix)); - } catch (NumberFormatException ignored) { - return Optional.empty(); - } - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/MacroNameSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/MacroNameSerializer.java deleted file mode 100644 index 2d4c697c..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/MacroNameSerializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import tools.redstone.redstonetools.macros.MacroManager; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import java.util.concurrent.CompletableFuture; - -import static tools.redstone.redstonetools.RedstoneToolsClient.INJECTOR; - - -public class MacroNameSerializer extends StringSerializer { - private static final MacroNameSerializer INSTANCE = new MacroNameSerializer(); - - private MacroNameSerializer() { - - super(StringSerializer.greedyString()); - - } - - public static MacroNameSerializer macroName() { - return INSTANCE; - } - - @Override - public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - - for (var macro : INJECTOR.getInstance(MacroManager.class).getMacros()) { - - builder = builder.suggest(serialize(macro.name)); - } - - return builder.buildFuture(); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/NumberBaseSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/NumberBaseSerializer.java deleted file mode 100644 index 87126ee2..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/NumberBaseSerializer.java +++ /dev/null @@ -1,75 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.minecraft.text.Text; -import tools.redstone.redstonetools.utils.NumberBase; - -import java.util.Arrays; -import java.util.Collection; -import java.util.concurrent.CompletableFuture; - -public class NumberBaseSerializer extends TypeSerializer { - private static final IntegerSerializer INT_SERIALIZER = IntegerSerializer.integer(2, 36); - private static final NumberBaseSerializer INSTANCE = new NumberBaseSerializer(); - - public static NumberBaseSerializer numberBase() { - return INSTANCE; - } - - protected NumberBaseSerializer() { - super(Integer.class); - } - - @Override - public Integer deserialize(StringReader reader) throws CommandSyntaxException { - var input = reader.readUnquotedString(); - - try { - return deserialize(input); - } catch (IllegalArgumentException e) { - throw new CommandSyntaxException(null, Text.of(e.getMessage())); - } - } - - @Override - public Integer deserialize(String serialized) { - try { - return NumberBase.fromString(serialized) - .map(NumberBase::toInt) - .orElseGet(() -> INT_SERIALIZER.deserialize(serialized)); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("Invalid base '" + serialized + "'.", e); - } - } - - @Override - public String serialize(Integer value) { - return NumberBase.fromInt(value) - .map(NumberBase::toString) - .orElseGet(() -> INT_SERIALIZER.serialize(value)); - } - - public String serialize(NumberBase value) { - return serialize(value.toInt()); - } - - @Override - public Collection getExamples() { - return Arrays.stream(NumberBase.values()) - .map(this::serialize) - .toList(); - } - - @Override - public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - for (var value : NumberBase.values()) { - builder = builder.suggest(serialize(value)); - } - - return builder.buildFuture(); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/NumberSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/NumberSerializer.java deleted file mode 100644 index 320eb217..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/NumberSerializer.java +++ /dev/null @@ -1,34 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import tools.redstone.redstonetools.utils.NumberArg; - -import java.util.Optional; - -public class NumberSerializer extends IntLikeSerializer { - private static final NumberSerializer INSTANCE = new NumberSerializer(null,null); - - public static NumberSerializer numberArg(){ - return INSTANCE; - } - - public static NumberSerializer numberArg(NumberArg min) { - return new NumberSerializer(min, null); - } - - public static NumberSerializer numberArg(NumberArg min, NumberArg max) { - return new NumberSerializer(min, max); - } - - private NumberSerializer(NumberArg min, NumberArg max){ - super(NumberArg.class,min, max); - } - - @Override - protected Optional tryParseOptional(String string, int radix) { - try { - return Optional.of(new NumberArg(string, radix)); - } catch (NumberFormatException ignored) { - return Optional.empty(); - } - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/SignalBlockSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/SignalBlockSerializer.java deleted file mode 100644 index 14c12ad3..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/SignalBlockSerializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import tools.redstone.redstonetools.utils.SignalBlock; - -public class SignalBlockSerializer extends EnumSerializer { - private static final SignalBlockSerializer INSTANCE = new SignalBlockSerializer(); - - private SignalBlockSerializer() { - super(SignalBlock.class); - } - - public static SignalBlockSerializer signalBlock() { - return INSTANCE; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/StringBrigadierSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/StringBrigadierSerializer.java deleted file mode 100644 index f5dba14b..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/StringBrigadierSerializer.java +++ /dev/null @@ -1,22 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.exceptions.CommandSyntaxException; - -public abstract class StringBrigadierSerializer extends BrigadierSerializer { - - public StringBrigadierSerializer(Class clazz, ArgumentType argumentType) { - super(clazz, argumentType); - } - - @Override - public T deserialize(String serialized) { - try { - return deserialize(new StringReader(serialized)); - } catch (CommandSyntaxException e) { - throw new IllegalStateException("Syntax Exception: " + e.getMessage()); - } - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/StringSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/StringSerializer.java deleted file mode 100644 index a7ddbf29..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/StringSerializer.java +++ /dev/null @@ -1,34 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.arguments.StringArgumentType; - -public class StringSerializer extends StringBrigadierSerializer { - - private static final StringSerializer INSTANCE_WORD = new StringSerializer(StringArgumentType.word()); - private static final StringSerializer INSTANCE_STRING = new StringSerializer(StringArgumentType.string()); - private static final StringSerializer INSTANCE_GREEDY_STRING = new StringSerializer(StringArgumentType.greedyString()); - - public static StringSerializer string() { - return INSTANCE_STRING; - } - - public static StringSerializer word() { - return INSTANCE_WORD; - } - - public static StringSerializer greedyString() { - return INSTANCE_GREEDY_STRING; - } - - protected StringSerializer(ArgumentType argumentType) { - super(String.class, argumentType); - } - - @Override - public String serialize(String value) { - // TODO: Check if this is correct, doesn't StringArgumentType.string() require quotes which this doesn't add? - return value; - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/TypeSerializer.java b/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/TypeSerializer.java deleted file mode 100644 index 9796c052..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/arguments/serializers/TypeSerializer.java +++ /dev/null @@ -1,47 +0,0 @@ -package tools.redstone.redstonetools.features.arguments.serializers; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; - -import java.util.Collection; -import java.util.concurrent.CompletableFuture; - -/** - * Base class for the 'wrapped' argument type. - * - * @param The value type. - * @param The serialized type. - */ -public abstract class TypeSerializer implements ArgumentType { - - protected final Class clazz; - - // TODO: Consider moving this constructor to enum serializer as it's the only class that uses the clazz field - protected TypeSerializer(Class clazz) { - this.clazz = clazz; - } - - public Class getTypeClass() { - return clazz; - } - - /* ArgumentType impl */ - @Override - public final T parse(StringReader reader) throws CommandSyntaxException { - return deserialize(reader); - } - - /* String Serialization */ - public abstract T deserialize(StringReader reader) throws CommandSyntaxException; - public abstract T deserialize(S serialized); - public abstract S serialize(T value); - - /* Usage In Commands */ - public abstract Collection getExamples(); - public abstract CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder); - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/BaseConvertFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/BaseConvertFeature.java deleted file mode 100644 index 818d4203..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/BaseConvertFeature.java +++ /dev/null @@ -1,32 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import net.minecraft.server.command.ServerCommandSource; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.NumberArg; - - -import static tools.redstone.redstonetools.features.arguments.serializers.NumberBaseSerializer.numberBase; -import static tools.redstone.redstonetools.features.arguments.serializers.NumberSerializer.numberArg; - -@AutoService(AbstractFeature.class) -@Feature(name = "Base Convert", description = "Converts a number from one base to another.", command = "base") -public class BaseConvertFeature extends CommandFeature { - - public static final Argument inputNum = Argument - .ofType(numberArg()); - public static final Argument toBase = Argument - .ofType(numberBase()) - .withDefault(10); - - @Override - protected Feedback execute(ServerCommandSource source) { - var input = inputNum.getValue().toPrefixedString(); - var output = inputNum.getValue().toPrefixedString(toBase.getValue()); - - return Feedback.success("{} = {}", input, output); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/BinaryBlockReadFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/BinaryBlockReadFeature.java deleted file mode 100644 index 808f5d10..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/BinaryBlockReadFeature.java +++ /dev/null @@ -1,101 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.WorldEditUtils; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.sk89q.worldedit.math.BlockVector3; -import net.minecraft.block.Blocks; -import net.minecraft.block.RedstoneLampBlock; -import net.minecraft.command.argument.BlockStateArgument; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.math.BlockPos; - -import java.util.Collections; - -import static tools.redstone.redstonetools.features.arguments.serializers.BlockStateArgumentSerializer.blockState; -import static tools.redstone.redstonetools.features.arguments.serializers.BoolSerializer.bool; -import static tools.redstone.redstonetools.features.arguments.serializers.IntegerSerializer.integer; -import static tools.redstone.redstonetools.features.arguments.serializers.NumberBaseSerializer.numberBase; - -@AutoService(AbstractFeature.class) -@Feature(name = "Binary Block Read", description = "Interprets your WorldEdit selection as a binary number.", command = "/read", worldedit = true) -public class BinaryBlockReadFeature extends CommandFeature { - private static final BlockStateArgument LIT_LAMP_ARG = new BlockStateArgument( - Blocks.REDSTONE_LAMP.getDefaultState().with(RedstoneLampBlock.LIT, true), - Collections.singleton(RedstoneLampBlock.LIT), - null - ); - - public static final Argument offset = Argument - .ofType(integer(1)) - .withDefault(2); - public static final Argument onBlock = Argument - .ofType(blockState()) - .withDefault(LIT_LAMP_ARG); - public static final Argument toBase = Argument - .ofType(numberBase()) - .withDefault(10); - public static final Argument reverseBits = Argument - .ofType(bool()) - .withDefault(false); - - @Override - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - var selectionOrFeedback = WorldEditUtils.getSelection(source.getPlayer()); - - if (selectionOrFeedback.right().isPresent()) { - return selectionOrFeedback.right().get(); - } - - assert selectionOrFeedback.left().isPresent(); - var selection = selectionOrFeedback.left().get(); - - var boundingBox = selection.getBoundingBox(); - var pos1 = boundingBox.getPos1(); - var pos2 = boundingBox.getPos2(); - var direction = pos2.subtract(pos1).normalize(); - - // prevent infinite loop - if (direction.lengthSq() == 0) { - direction = BlockVector3.at(0, 0, 1); - } - - var spacingVector = direction.multiply(offset.getValue()); - - if (direction.getBlockX() + direction.getBlockY() + direction.getBlockZ() > 1) { - return Feedback.invalidUsage("The selection must have 2 axis the same."); - } - - var bits = new StringBuilder(); - for (BlockVector3 point = pos1; boundingBox.contains(point); point = point.add(spacingVector)) { - var pos = new BlockPos(point.getBlockX(), point.getBlockY(), point.getBlockZ()); - var actualState = source.getWorld().getBlockState(pos); - - var matches = actualState.getBlock() == onBlock.getValue().getBlockState().getBlock(); - if (matches) { - for (var property : onBlock.getValue().getProperties()) { - var propertyValue = onBlock.getValue().getBlockState().get(property); - - if (!actualState.get(property).equals(propertyValue)) { - matches = false; - break; - } - } - } - - bits.append(matches ? 1 : 0); - } - - if (reverseBits.getValue()) { - bits.reverse(); - } - - var output = Integer.toString(Integer.parseInt(bits.toString(), 2), toBase.getValue()); - return Feedback.success("{}.", output); - } - -} \ No newline at end of file diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/BlockRaycastFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/BlockRaycastFeature.java deleted file mode 100644 index d8c1b842..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/BlockRaycastFeature.java +++ /dev/null @@ -1,42 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.BlockInfo; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.client.MinecraftClient; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.Text; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; - -import javax.annotation.Nullable; - -public abstract class BlockRaycastFeature extends CommandFeature { - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - MinecraftClient client = MinecraftClient.getInstance(); - if (client.player == null || client.world == null) { - throw new CommandSyntaxException(null, Text.of("This command is client-side only.")); - } - - if (client.crosshairTarget == null || client.crosshairTarget.getType() != HitResult.Type.BLOCK) { - if (requiresBlock()) { - return Feedback.invalidUsage("You must be looking at a block to use this command."); - } else { - return execute(source, null); - } - } - - var blockPos = ((BlockHitResult) client.crosshairTarget).getBlockPos(); - var blockState = client.world.getBlockState(blockPos); - var blockEntity = client.world.getBlockEntity(blockPos); - var block = blockState.getBlock(); - - return execute(source, new BlockInfo(block, blockPos, blockState, blockEntity)); - } - - protected boolean requiresBlock() { - return true; - } - - protected abstract Feedback execute(ServerCommandSource source, @Nullable BlockInfo blockInfo) throws CommandSyntaxException; -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/ColorCodeFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/ColorCodeFeature.java deleted file mode 100644 index 00742feb..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/ColorCodeFeature.java +++ /dev/null @@ -1,113 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.BlockColor; -import tools.redstone.redstonetools.utils.ColoredBlock; -import tools.redstone.redstonetools.utils.WorldEditUtils; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.fabric.FabricAdapter; -import com.sk89q.worldedit.function.mask.Mask; -import com.sk89q.worldedit.function.mask.Mask2D; -import com.sk89q.worldedit.function.operation.Operations; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.world.World; -import com.sk89q.worldedit.world.block.BaseBlock; -import com.sk89q.worldedit.world.block.BlockType; -import net.minecraft.server.command.ServerCommandSource; -import org.jetbrains.annotations.Nullable; -import static tools.redstone.redstonetools.features.arguments.serializers.BlockColorSerializer.blockColor; - -@AutoService(AbstractFeature.class) -@Feature(name = "Color Code", description = "Color codes all color-able blocks in your WorldEdit selection.", command = "/colorcode", worldedit = true) -public class ColorCodeFeature extends CommandFeature { - public static final Argument color = Argument - .ofType(blockColor()); - public static final Argument onlyColor = Argument - .ofType(blockColor()) - .withDefault(null); - - private boolean shouldBeColored(World world, BlockVector3 pos, BlockColor onlyColor) { - var state = world.getBlock(pos); - var blockId = state.getBlockType().getId(); - - var coloredBlock = ColoredBlock.fromBlockId(blockId); - if (coloredBlock == null) return false; - - if (onlyColor == null) return true; - - var blockColor = coloredBlock.color; - return blockColor == onlyColor; - } - - private BaseBlock getColoredBlock(World world, BlockVector3 pos, BlockColor color) { - var state = world.getBlock(pos); - var blockId = state.getBlockType().getId(); - - var coloredBlock = ColoredBlock.fromBlockId(blockId); - if (coloredBlock == null) return state.toBaseBlock(); - - var blockType = BlockType.REGISTRY.get(coloredBlock.withColor(color).toBlockId()); - assert blockType != null; - - return blockType.getDefaultState().toBaseBlock(); - } - - @Override - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - var player = source.getPlayer(); - - var selectionOrFeedback = WorldEditUtils.getSelection(player); - if (selectionOrFeedback.right().isPresent()) { - return selectionOrFeedback.right().get(); - } - - assert selectionOrFeedback.left().isPresent(); - var selection = selectionOrFeedback.left().get(); - - var worldEdit = WorldEdit.getInstance(); - var wePlayer = FabricAdapter.adaptPlayer(player); - var playerSession = worldEdit.getSessionManager().get(wePlayer); - - // for each block in the selection - final World world = FabricAdapter.adapt(player.getWorld()); - try (EditSession session = worldEdit.newEditSession(FabricAdapter.adapt(player.getWorld()))) { - // create mask and pattern and execute block set - int blocksColored = session.replaceBlocks(selection, - new Mask() { - @Override - public boolean test(BlockVector3 vector) { - return shouldBeColored(world, vector, onlyColor.getValue()); - } - - @Nullable - @Override - public Mask2D toMask2D() { - return null; - } - }, - new com.sk89q.worldedit.function.pattern.Pattern() { - @Override - public BaseBlock applyBlock(BlockVector3 position) { - return getColoredBlock(world, position, color.getValue()); - } - } - ); - - Operations.complete(session.commit()); - - // call remember to allow undo - playerSession.remember(session); - - return Feedback.success("Successfully colored {} block(s) {}.", blocksColored, color.getValue()); - } catch (Exception e) { - return Feedback.error("An error occurred while coloring the block(s)."); - } - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/ColoredFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/ColoredFeature.java deleted file mode 100644 index d7505c29..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/ColoredFeature.java +++ /dev/null @@ -1,38 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.BlockColor; -import tools.redstone.redstonetools.utils.BlockInfo; -import com.mojang.datafixers.util.Either; -import net.minecraft.item.ItemStack; -import net.minecraft.server.command.ServerCommandSource; -import tools.redstone.redstonetools.utils.ColoredBlockType; - -import javax.annotation.Nullable; - -import static tools.redstone.redstonetools.features.arguments.serializers.ColoredBlockTypeSerializer.coloredBlockType; - -@AutoService(AbstractFeature.class) -@Feature(name = "Colored", description = "Gives the player specified variant of block being looked at, with the same color. Default is White.", command = "colored") -public class ColoredFeature extends PickBlockFeature { - public static final Argument blockType = Argument.ofType(coloredBlockType()); - @Override - protected boolean requiresBlock() { - return false; - } - - @Override - protected Either getItemStack(ServerCommandSource source, @Nullable BlockInfo blockInfo) { - var color = blockInfo == null - ? BlockColor.WHITE - : BlockColor.fromBlock(blockInfo.block); - - var coloredBlock = blockType.getValue().withColor(color); - - return Either.left(new ItemStack(coloredBlock.toBlock())); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/CommandFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/CommandFeature.java deleted file mode 100644 index cc5f9412..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/CommandFeature.java +++ /dev/null @@ -1,78 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.feedback.AbstractFeedbackSender; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.CommandUtils; -import tools.redstone.redstonetools.utils.ReflectionUtils; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.server.command.ServerCommandSource; - -import java.util.ArrayList; -import java.util.List; - -import static tools.redstone.redstonetools.RedstoneToolsClient.INJECTOR; - - -public abstract class CommandFeature extends AbstractFeature { - private static final List keyBindings = new ArrayList<>(); - - @Override - public void register() { - super.register(); - - var containsRequiredArguments = ReflectionUtils.getArguments(getClass()).stream() - .anyMatch(a -> !a.isOptional()); - if (containsRequiredArguments) { - return; - } - - var info = ReflectionUtils.getFeatureInfo(getClass()); - var keyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding( - info.name(), - InputUtil.Type.KEYSYM, - -1, - "Redstone Tools" - )); - - keyBindings.add(keyBinding); - - ClientTickEvents.END_CLIENT_TICK.register(client -> { - while (keyBinding.wasPressed()) { - assert client.player != null; - client.player.sendChatMessage("/" + info.command()); - } - }); - } - - @Override - protected void registerCommands(CommandDispatcher dispatcher, boolean dedicated) { - var info = ReflectionUtils.getFeatureInfo(getClass()); - var arguments = ReflectionUtils.getArguments(getClass()); - - CommandUtils.register( - info.command(), - arguments, - context -> { - for (var argument : arguments) { - argument.updateValue(context); - } - - var feedback = execute(context.getSource()); - - INJECTOR.getInstance(AbstractFeedbackSender.class) - .sendFeedback(context.getSource(), feedback); - - return feedback.getType().getCode(); - }, - dispatcher, - dedicated); - } - - protected abstract Feedback execute(ServerCommandSource source) throws CommandSyntaxException; -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/CopyStateFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/CopyStateFeature.java deleted file mode 100644 index 3e0a7cc3..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/CopyStateFeature.java +++ /dev/null @@ -1,48 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import com.mojang.datafixers.util.Either; -import net.minecraft.block.BlockState; -import net.minecraft.client.MinecraftClient; -import net.minecraft.item.ItemStack; -import net.minecraft.server.command.ServerCommandSource; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.mixin.accessors.MinecraftClientAccessor; -import tools.redstone.redstonetools.utils.BlockInfo; -import tools.redstone.redstonetools.utils.BlockStateNbtUtil; - - -import static tools.redstone.redstonetools.utils.ItemUtils.addExtraNBTText; - - -@AutoService(AbstractFeature.class) -@Feature(name = "Copy State", description = "Gives you a copy of the block you're looking at with its BlockState.", command = "copystate") -public class CopyStateFeature extends PickBlockFeature { - @Override - protected Either getItemStack(ServerCommandSource source, BlockInfo blockInfo) { - MinecraftClient client = MinecraftClient.getInstance(); - - ItemStack itemStack = blockInfo.block.getPickStack(client.world, blockInfo.pos, blockInfo.state); - - if (blockInfo.state.hasBlockEntity()) { - ((MinecraftClientAccessor) client).invokeAddBlockEntityNbt(itemStack, blockInfo.entity); - } - - int i = addBlockStateNbt(itemStack, blockInfo.state); - if (i == -1) { - return Either.right(Feedback.invalidUsage("This block doesn't have any BlockState!")); - } - - return Either.left(itemStack); - } - - private int addBlockStateNbt(ItemStack itemStack, BlockState blockState) { - addExtraNBTText(itemStack, "BlockState"); - BlockStateNbtUtil.putPlacement(itemStack, blockState); - return 1; - } - - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/ItemBindFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/ItemBindFeature.java deleted file mode 100644 index 4403353b..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/ItemBindFeature.java +++ /dev/null @@ -1,53 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - - -import com.google.auto.service.AutoService; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.client.MinecraftClient; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtString; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.ItemUtils; - -@AutoService(AbstractFeature.class) -@Feature(command = "itembind", description = "Allows you to bind command to a specific item", name = "Item Bind") -public class ItemBindFeature extends CommandFeature{ - public static boolean waitingForCommand = false; - private static ServerPlayerEntity player; - - - @Override - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - - player = source.getPlayer(); - waitingForCommand = true; - - return Feedback.success("Please run any command and hold the item you want the command be bound to"); - } - - public static Feedback addCommand(String command) { - if (!waitingForCommand || MinecraftClient.getInstance().getServer() == null) return null; - - if (player == null || MinecraftClient.getInstance().getServer().getPlayerManager().getPlayer(player.getUuid()) != player) { - waitingForCommand = false; - return null; - } - - ItemStack mainHandStack = player.getMainHandStack(); - if (mainHandStack == null || mainHandStack.getItem() == Items.AIR) { - return Feedback.error("You need to be holding an item!"); - } - - mainHandStack.getOrCreateNbt().put("command", NbtString.of(command)); - ItemUtils.addExtraNBTText(mainHandStack,"Command"); - - waitingForCommand = false; - - return Feedback.success("Successfully bound command: '{}' to this item ({})!", command, mainHandStack.getItem()); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/MacroFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/MacroFeature.java deleted file mode 100644 index 6afa69ba..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/MacroFeature.java +++ /dev/null @@ -1,31 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.macros.MacroManager; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.server.command.ServerCommandSource; -import static tools.redstone.redstonetools.RedstoneToolsClient.INJECTOR; -import static tools.redstone.redstonetools.features.arguments.serializers.MacroNameSerializer.macroName; - -@AutoService(AbstractFeature.class) -@Feature(command = "macro", description = "Allows you to execute a macro", name = "Macro") -public class MacroFeature extends CommandFeature { - public static final Argument macro = Argument.ofType(macroName()); - - @Override - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - var macroObj = INJECTOR.getInstance(MacroManager.class).getMacro(macro.getValue()); - - - if (macroObj == null) { - return Feedback.invalidUsage("Macro \"{}\" does not exist.", macro.getValue()); - } - - macroObj.run(); - return Feedback.none(); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/MinSelectionFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/MinSelectionFeature.java deleted file mode 100644 index 388da842..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/MinSelectionFeature.java +++ /dev/null @@ -1,126 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.WorldEditUtils; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.fabric.FabricAdapter; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.regions.Region; -import com.sk89q.worldedit.regions.RegionOperationException; -import com.sk89q.worldedit.world.World; -import com.sk89q.worldedit.world.block.BlockTypes; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.Text; - -import java.util.ArrayList; -import java.util.List; - -@AutoService(AbstractFeature.class) -@Feature(command = "/minsel", description = "Removes all air-only layers from a selection", name = "Minimize Selection", worldedit = true) -public class MinSelectionFeature extends CommandFeature { - - @Override - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - var selectionOrFeedback = WorldEditUtils.getSelection(source.getPlayer()); - if (selectionOrFeedback.right().isPresent()) { - return selectionOrFeedback.right().get(); - } - - assert selectionOrFeedback.left().isPresent(); - var selection = selectionOrFeedback.left().get(); - var selectionWorld = selection.getWorld(); - - var actor = FabricAdapter.adaptPlayer(source.getPlayer()); - - var localSession = WorldEdit.getInstance() - .getSessionManager() - .get(actor); - - var selector = localSession.getRegionSelector(selectionWorld); - - boolean isEmpty = true; - for (BlockVector3 point : selection) { - if (!selectionWorld.getBlock(point).equals(BlockTypes.AIR.getDefaultState())) - isEmpty = false; - } - - if (isEmpty) { - return Feedback.invalidUsage("Cannot minimize empty selections."); - } - - - minimiseSelection(selectionWorld, selection); - - selector.learnChanges(); - selector.explainRegionAdjust(actor, localSession); - - return Feedback.success("Minimized selection."); - } - - private void minimiseSelection(World selectionWorld, Region selection) - throws CommandSyntaxException { - List changes = new ArrayList<>(); - var faces = getFaces(selection); - var finished = true; - - for (CuboidRegion face : faces) { - var isOnlyAir = true; - - for (BlockVector3 point : face) { - if (selectionWorld.getBlock(point).getBlockType().getDefaultState() != BlockTypes.AIR - .getDefaultState()) { - isOnlyAir = false; - break; - } - } - - if (!isOnlyAir) - continue; - - var difference = selection.getCenter().subtract(face.getCenter()); - difference = difference.normalize(); - - changes.add(difference.toBlockPoint()); - - finished = false; - - } - - try { - selection.contract(changes.toArray(new BlockVector3[changes.size()])); - } catch (RegionOperationException e) { - throw new net.minecraft.command.CommandException(Text.of("There was an error modifying the region.")); - } - - if (!finished) - minimiseSelection(selectionWorld, selection); - - } - - private List getFaces(Region selection) { - var faces = new ArrayList(); - - var pos1 = selection.getBoundingBox().getPos1(); - var pos2 = selection.getBoundingBox().getPos2(); - - var min = selection.getMinimumPoint(); - var max = selection.getMaximumPoint(); - - faces.add(new CuboidRegion(pos1.withX(min.getX()), pos2.withX(min.getX()))); - faces.add(new CuboidRegion(pos1.withX(max.getX()), pos2.withX(max.getX()))); - - faces.add(new CuboidRegion(pos1.withZ(min.getZ()), pos2.withZ(min.getZ()))); - faces.add(new CuboidRegion(pos1.withZ(max.getZ()), pos2.withZ(max.getZ()))); - - faces.add(new CuboidRegion(pos1.withY(min.getY()), pos2.withY(min.getY()))); - faces.add(new CuboidRegion(pos1.withY(max.getY()), pos2.withY(max.getY()))); - - return faces; - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/PickBlockFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/PickBlockFeature.java deleted file mode 100644 index 756563e3..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/PickBlockFeature.java +++ /dev/null @@ -1,45 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.BlockInfo; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.datafixers.util.Either; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.Text; -import net.minecraft.util.Hand; - -import javax.annotation.Nullable; - -public abstract class PickBlockFeature extends BlockRaycastFeature { - @Override - protected final Feedback execute(ServerCommandSource source, @Nullable BlockInfo blockInfo) throws CommandSyntaxException { - MinecraftClient client = MinecraftClient.getInstance(); - if (client.player == null) { - return Feedback.error("Failed to get player."); - } - - var stackOrFeedback = getItemStack(source, blockInfo); - if (stackOrFeedback.right().isPresent()) { - return stackOrFeedback.right().get(); - } - - assert stackOrFeedback.left().isPresent(); - var stack = stackOrFeedback.left().get(); - - PlayerInventory playerInventory = client.player.getInventory(); - playerInventory.addPickBlock(stack); - - if (client.interactionManager == null) { - throw new CommandSyntaxException(null, Text.of("Failed to get interaction manager.")); - } - - client.interactionManager.clickCreativeStack(client.player.getStackInHand(Hand.MAIN_HAND), 36 + playerInventory.selectedSlot); - - return Feedback.none(); - } - - protected abstract Either getItemStack(ServerCommandSource source, @Nullable BlockInfo blockInfo) throws CommandSyntaxException; -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/QuickTpFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/QuickTpFeature.java deleted file mode 100644 index dc3a6593..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/QuickTpFeature.java +++ /dev/null @@ -1,60 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.PositionUtils; -import tools.redstone.redstonetools.utils.RaycastUtils; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.Vec3d; -import static tools.redstone.redstonetools.features.arguments.serializers.BoolSerializer.bool; -import static tools.redstone.redstonetools.features.arguments.serializers.FloatSerializer.floatArg; - -@AutoService(AbstractFeature.class) -@Feature(name = "Quick TP", description = "Teleports you in the direction you are looking.", command = "quicktp") -public class QuickTpFeature extends CommandFeature { - public static final Argument distance = Argument - .ofType(floatArg(1.0f)) - .withDefault(50.0f); - public static final Argument includeFluids = Argument - .ofType(bool()) - .withDefault(false); - - @Override - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - var player = source.getPlayer(); - - var targetPosition = getTargetPosition(player); - - player.teleport(targetPosition.x, targetPosition.y, targetPosition.z); - - return Feedback.none(); - } - - private Vec3d getTargetPosition(PlayerEntity player) { - // 8 chunks default, 16 blocks per chunk - var renderDistanceBlocks = PlayerEntity.getRenderDistanceMultiplier() * 8 * 16; - var hit = player.raycast(Math.min(distance.getValue(), renderDistanceBlocks), 0, includeFluids.getValue()); - - return clampHitPosition(hit).subtract(0, 1.12, 0); - } - - private Vec3d clampHitPosition(HitResult hit) { - if (hit.getType() != HitResult.Type.BLOCK) { - return hit.getPos().subtract(0, 0.5, 0); - } - - var blockHit = (BlockHitResult) hit; - - var neighbor = RaycastUtils.getBlockHitNeighbor(blockHit); - var neighborPos = neighbor.getBlockPos(); - - return PositionUtils.getBottomPositionOfBlock(neighborPos); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/RStackFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/RStackFeature.java deleted file mode 100644 index d06452a5..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/RStackFeature.java +++ /dev/null @@ -1,98 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.DirectionArgument; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.sk89q.worldedit.IncompleteRegionException; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.fabric.FabricAdapter; -import com.sk89q.worldedit.function.mask.Mask; -import com.sk89q.worldedit.function.mask.Mask2D; -import com.sk89q.worldedit.function.operation.ForwardExtentCopy; -import com.sk89q.worldedit.function.operation.Operations; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.Region; -import net.minecraft.server.command.ServerCommandSource; -import org.jetbrains.annotations.Nullable; - -import static tools.redstone.redstonetools.features.arguments.serializers.DirectionSerializer.direction; -import static tools.redstone.redstonetools.features.arguments.serializers.IntegerSerializer.integer; -import static tools.redstone.redstonetools.utils.DirectionUtils.directionToBlock; -import static tools.redstone.redstonetools.utils.DirectionUtils.matchDirection; - -@AutoService(AbstractFeature.class) -@Feature(name = "RStack", description = "Stacks with custom distance", command = "/rstack", worldedit = true) -public class RStackFeature extends CommandFeature { - public static final Argument count = Argument - .ofType(integer()) - .withDefault(1); - - public static final Argument direction = Argument - .ofType(direction()) - .withDefault(DirectionArgument.ME); - - public static final Argument offset = Argument - .ofType(integer(1)) - .withDefault(2); - - @Override - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - var actor = FabricAdapter.adaptPlayer(source.getPlayer()); - - var localSession = WorldEdit.getInstance() - .getSessionManager() - .get(actor); - - final var selectionWorld = localSession.getSelectionWorld(); - assert selectionWorld != null; - - final Region selection; - try { - selection = localSession.getSelection(selectionWorld); - } catch (IncompleteRegionException ex) { - return Feedback.error("Please make a selection with WorldEdit first."); - } - - final Mask airFilter = new Mask() { - @Override - public boolean test(BlockVector3 vector) { - return !"minecraft:air".equals(selectionWorld.getBlock(vector).getBlockType().getId()); - } - - @Nullable - @Override - public Mask2D toMask2D() { - return null; - } - }; - - var playerFacing = actor.getLocation().getDirectionEnum(); - var stackDirection = matchDirection(direction.getValue(), playerFacing); - - var stackVector = directionToBlock(stackDirection); - - - try (var editSession = localSession.createEditSession(actor)) { - for (var i = 1; i <= count.getValue(); i++) { - var copy = new ForwardExtentCopy( - editSession, - selection, - editSession, - selection.getMinimumPoint().add(stackVector.multiply(i * offset.getValue())) - ); - copy.setSourceMask(airFilter); - Operations.complete(copy); - } - localSession.remember(editSession); - } catch (WorldEditException e) { - throw new RuntimeException(e); - } - - return Feedback.success("Stacked {} time(s).", count.getValue()); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/SignalStrengthBlockFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/SignalStrengthBlockFeature.java deleted file mode 100644 index 066bbcba..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/SignalStrengthBlockFeature.java +++ /dev/null @@ -1,53 +0,0 @@ -package tools.redstone.redstonetools.features.commands; - -import com.google.auto.service.AutoService; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; -import net.minecraft.item.ItemStack; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.Text; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.arguments.serializers.SignalBlockSerializer; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.SignalBlock; - -import java.util.Random; - -import static tools.redstone.redstonetools.features.arguments.serializers.IntegerSerializer.integer; - -@AutoService(AbstractFeature.class) -@Feature(name = "Signal Strength Block", description = "Creates a block with the specified signal strength.", command = "ssb") -public class SignalStrengthBlockFeature extends CommandFeature { - - public static final Argument signalStrength = Argument - .ofType(integer(0)); - - public static final Argument block = Argument - .ofType(SignalBlockSerializer.signalBlock()) - .withDefault(SignalBlock.AUTO); - - @Override - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - try { - ItemStack itemStack = block.getValue().getItemStack(signalStrength.getValue()); - source.getPlayer().giveItemStack(itemStack); - } catch (IllegalArgumentException | IllegalStateException e) { - return Feedback.error(e.getMessage()); - } - - //funny - if(signalStrength.getValue() == 0) { - String[] funny = { - "Why would you want this??", "Wtf are you going to use this for?", "What for?", - "... Ok, if you're sure.", "I'm 99% sure you could just use any other block.", - "This seems unnecessary.", "Is that a typo?", "Do you just like the glint?", - "Wow, what a fancy but otherwise useless barrel.", "For decoration?"}; - return Feedback.success(funny[new Random().nextInt(funny.length)]); - } - - return Feedback.none(); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/update/RegionUpdater.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/update/RegionUpdater.java deleted file mode 100644 index 3f23d3d3..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/update/RegionUpdater.java +++ /dev/null @@ -1,28 +0,0 @@ -package tools.redstone.redstonetools.features.commands.update; - -import tools.redstone.redstonetools.features.feedback.Feedback; -import com.sk89q.worldedit.math.BlockVector3; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class RegionUpdater { - - - public static Feedback updateRegion(World world, BlockVector3 minPos, BlockVector3 maxPos) { - long blockCount = 0; - - for (int x = minPos.getX() - 1; x <= maxPos.getX() + 1; x++) { - for (int y = minPos.getY() - 1; y <= maxPos.getY() + 1; y++) { - for (int z = minPos.getZ() - 1; z <= maxPos.getZ() + 1; z++) { - BlockPos pos = new BlockPos(x, y, z); - - world.updateNeighbors(new BlockPos(x, y, z), world.getBlockState(pos).getBlock()); - blockCount++; - - } - } - } - return Feedback.success("Successfully forced block updates for {} block(s).", blockCount); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/update/UpdateFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/commands/update/UpdateFeature.java deleted file mode 100644 index f7e1078e..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/commands/update/UpdateFeature.java +++ /dev/null @@ -1,28 +0,0 @@ -package tools.redstone.redstonetools.features.commands.update; - -import com.google.auto.service.AutoService; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.server.command.ServerCommandSource; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.commands.CommandFeature; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.WorldEditUtils; - -@AutoService(AbstractFeature.class) -@Feature(name = "Update", description = "Forces block updates in the selected area.", command = "/update") -public class UpdateFeature extends CommandFeature { - @Override - protected Feedback execute(ServerCommandSource source) throws CommandSyntaxException { - var selectionOrFeedback = WorldEditUtils.getSelection(source.getPlayer()); - if (selectionOrFeedback.right().isPresent()) { - return selectionOrFeedback.right().get(); - } - - assert selectionOrFeedback.left().isPresent(); - var selection = selectionOrFeedback.left().get(); - - - return RegionUpdater.updateRegion(source.getWorld(), selection.getMinimumPoint(), selection.getMaximumPoint()); - } -} \ No newline at end of file diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/AbstractFeedbackSender.java b/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/AbstractFeedbackSender.java deleted file mode 100644 index b61374b4..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/AbstractFeedbackSender.java +++ /dev/null @@ -1,7 +0,0 @@ -package tools.redstone.redstonetools.features.feedback; - -import net.minecraft.server.command.ServerCommandSource; - -public abstract class AbstractFeedbackSender { - public abstract void sendFeedback(ServerCommandSource source, Feedback feedback); -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/Feedback.java b/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/Feedback.java deleted file mode 100644 index c3d6df18..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/Feedback.java +++ /dev/null @@ -1,178 +0,0 @@ -package tools.redstone.redstonetools.features.feedback; - -import com.mojang.brigadier.context.CommandContext; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.Formatting; -import tools.redstone.redstonetools.RedstoneToolsClient; - -import javax.annotation.Nullable; - -public abstract class Feedback { - private final @Nullable String message; - private final @Nullable Object[] values; - - protected Feedback(@Nullable String message, @Nullable Object... values) { - this.message = message; - this.values = values; - } - - private String formatMessage(String message) { - return String.format("%s[%sRST%s]%s ", Formatting.GRAY, Formatting.RED, Formatting.GRAY, Formatting.RESET) + message; - } - - public final String getMessage() { - if (message != null) { - String sentMessage = message; - for (Object value : values) { - sentMessage = sentMessage.replaceFirst("\\{\\}", Formatting.RED + value.toString() + getFormatting()); - } - - return formatMessage(sentMessage); - } else { - return formatMessage(getDefaultMessage()); - } - } - - /** Returns the status code. */ - public int send(ServerCommandSource source) { - RedstoneToolsClient.INJECTOR - .getInstance(FeedbackSender.class) - .sendFeedback(source, this); - - return getType().getCode(); - } - - /** Returns the status code. */ - public int send(CommandContext context) { - return send(context.getSource()); - } - - public abstract Formatting getFormatting(); - public abstract String getDefaultMessage(); - public abstract FeedbackType getType(); - - public static None none() { - return new None(); - } - - public static class None extends Feedback { - public None() { - super(null); - } - - @Override - public Formatting getFormatting() { - return Formatting.WHITE; - } - - @Override - public String getDefaultMessage() { - return ""; - } - - @Override - public FeedbackType getType() { - return FeedbackType.NONE; - } - } - - public static Success success(@Nullable String message, @Nullable Object... values) { - return new Success(message, values); - } - - public static class Success extends Feedback { - public Success(@Nullable String message, @Nullable Object... values) { - super(message, values); - } - - @Override - public Formatting getFormatting() { - return Formatting.WHITE; - } - - @Override - public String getDefaultMessage() { - return "Success"; - } - - @Override - public FeedbackType getType() { - return FeedbackType.SUCCESS; - } - } - - public static Warning warning(@Nullable String message, @Nullable Object... values) { - return new Warning(message, values); - } - - public static class Warning extends Feedback { - public Warning(@Nullable String message, @Nullable Object... values) { - super(message, values); - } - - @Override - public Formatting getFormatting() { - return Formatting.YELLOW; - } - - @Override - public String getDefaultMessage() { - return "Warning"; - } - - @Override - public FeedbackType getType() { - return FeedbackType.WARNING; - } - } - - public static Error error(@Nullable String message, @Nullable Object... values) { - return new Error(message, values); - } - - public static class Error extends Feedback { - public Error(@Nullable String message, @Nullable Object... values) { - super(message, values); - } - - @Override - public Formatting getFormatting() { - return Formatting.RED; - } - - @Override - public String getDefaultMessage() { - return "Error"; - } - - @Override - public FeedbackType getType() { - return FeedbackType.ERROR; - } - } - - public static InvalidUsage invalidUsage(@Nullable String message, @Nullable Object... values) { - return new InvalidUsage(message, values); - } - - public static class InvalidUsage extends Feedback { - public InvalidUsage(@Nullable String message, @Nullable Object... values) { - super(message, values); - } - - @Override - public Formatting getFormatting() { - return Formatting.RED; - } - - @Override - public String getDefaultMessage() { - return "Invalid usage"; - } - - @Override - public FeedbackType getType() { - return FeedbackType.ERROR; - } - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/FeedbackSender.java b/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/FeedbackSender.java deleted file mode 100644 index efd5a156..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/FeedbackSender.java +++ /dev/null @@ -1,19 +0,0 @@ -package tools.redstone.redstonetools.features.feedback; - -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.text.LiteralText; - -import javax.inject.Singleton; - -@Singleton -public class FeedbackSender extends AbstractFeedbackSender { - @Override - public void sendFeedback(ServerCommandSource source, Feedback feedback) { - if (feedback.getType() == FeedbackType.NONE) { - return; - } - - source.sendFeedback(new LiteralText(feedback.getMessage()) - .formatted(feedback.getFormatting()), false); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/FeedbackType.java b/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/FeedbackType.java deleted file mode 100644 index 81f81e9b..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/feedback/FeedbackType.java +++ /dev/null @@ -1,18 +0,0 @@ -package tools.redstone.redstonetools.features.feedback; - -public enum FeedbackType { - SUCCESS(1), - NONE(0), - WARNING(0), - ERROR(-1); - - private final int code; - - FeedbackType(int code) { - this.code = code; - } - - public int getCode() { - return code; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/AirPlaceFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/AirPlaceFeature.java deleted file mode 100644 index db0eba6a..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/AirPlaceFeature.java +++ /dev/null @@ -1,125 +0,0 @@ -package tools.redstone.redstonetools.features.toggleable; - -import com.google.auto.service.AutoService; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.arguments.serializers.BoolSerializer; -import tools.redstone.redstonetools.mixin.accessors.WorldRendererAccessor; -import tools.redstone.redstonetools.utils.ItemUtils; -import tools.redstone.redstonetools.utils.RaycastUtils; - -import static tools.redstone.redstonetools.features.arguments.serializers.FloatSerializer.floatArg; - -@AutoService(AbstractFeature.class) -@Feature(name = "Air Place", description = "Allows you to place blocks in the air.", command = "airplace") -public class AirPlaceFeature extends ToggleableFeature { - - public static boolean canAirPlace(PlayerEntity player) { - ItemStack itemStack = ItemUtils.getMainItem(player); - - // empty slot - if (itemStack == null || itemStack.getItem() == Items.AIR) - return false; - - // rocket boost for elytra - if (itemStack.getItem() == Items.FIREWORK_ROCKET && - player.getEquippedStack(EquipmentSlot.CHEST).getItem() == Items.ELYTRA && - player.isFallFlying()) - return false; - - return true; - } - - public static HitResult findAirPlacePosition(MinecraftClient client) { - if (client.player == null) - return null; - ClientPlayerEntity player = client.player; - - float reach = AirPlaceFeature.reach.getValue(); - return player.raycast(reach, 0, false); - } - - public static BlockHitResult findAirPlaceBlockHit(PlayerEntity playerEntity) { - var hit = RaycastUtils.rayCastFromEye(playerEntity, reach.getValue()); - return new BlockHitResult(hit.getPos(), hit.getSide(), hit.getBlockPos(), false); - } - - public static final Argument reach = Argument - .ofType(floatArg(3.0f)) - .withDefault(5.0f); - - public static final Argument showOutline = Argument - .ofType(BoolSerializer.bool()) - .withDefault(true); - - private static final BlockState FULL_BLOCK_STATE = Blocks.BEDROCK.getDefaultState(); - - { - // register ghost block renderer - WorldRenderEvents.BEFORE_BLOCK_OUTLINE.register((context, blockOutlineContext) -> { - if (!isEnabled()) - return true; - if (showOutline.getValue() != Boolean.TRUE) - return true; - - MinecraftClient client = MinecraftClient.getInstance(); - if (client.player == null || client.interactionManager == null) - return true; - if (blockOutlineContext.getType() != HitResult.Type.MISS) - return true; - - if (!canAirPlace(client.player)) - return true; - - HitResult hitResult = findAirPlacePosition(client); - if (hitResult == null) - return true; - BlockPos blockPos = new BlockPos(hitResult.getPos()); - - BlockState blockState = ItemUtils.getUseState(client.player, - ItemUtils.getMainItem(client.player), - reach.getValue()); - if (blockState == null) - return true; - - /* render block outline */ - Camera camera = client.gameRenderer.getCamera(); - Vec3d camPos = camera.getPos(); - - try { - VertexConsumer consumer = context.consumers().getBuffer(RenderLayer.getLines()); - - ((WorldRendererAccessor)context.worldRenderer()).invokeDrawBlockOutline( - context.matrixStack(), - consumer, - client.player, - camPos.x, camPos.y, camPos.z, - blockPos, - blockState - ); - } catch (Throwable t) { - throw new IllegalStateException(t); - } - - return true; - }); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/AutoDustFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/AutoDustFeature.java deleted file mode 100644 index 9a9e1c7a..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/AutoDustFeature.java +++ /dev/null @@ -1,11 +0,0 @@ -package tools.redstone.redstonetools.features.toggleable; - -import com.google.auto.service.AutoService; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; - -@AutoService(AbstractFeature.class) -@Feature(name = "Auto Dust", description = "Automatically places redstone on top of colored blocks.", command = "autodust") -public class AutoDustFeature extends ToggleableFeature { - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/BigDustFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/BigDustFeature.java deleted file mode 100644 index 6f6490c8..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/BigDustFeature.java +++ /dev/null @@ -1,16 +0,0 @@ -package tools.redstone.redstonetools.features.toggleable; - -import com.google.auto.service.AutoService; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.arguments.serializers.IntegerSerializer; - -@AutoService(AbstractFeature.class) -@Feature(name = "Big Dust", description = "Change the size of redstone's hitbox.", command = "bigdust") -public class BigDustFeature extends ToggleableFeature { - - public static final Argument heightInPixels = Argument.ofType(IntegerSerializer.integer(1, 16)) - .withDefault(1); - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/ToggleableFeature.java b/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/ToggleableFeature.java deleted file mode 100644 index 2ace5531..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/features/toggleable/ToggleableFeature.java +++ /dev/null @@ -1,257 +0,0 @@ -package tools.redstone.redstonetools.features.toggleable; - -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.features.feedback.FeedbackSender; -import tools.redstone.redstonetools.utils.ReflectionUtils; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; -import net.minecraft.server.command.ServerCommandSource; -import tools.redstone.redstonetools.RedstoneToolsClient; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.arguments.Argument; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.utils.ReflectionUtils; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -import java.util.ArrayList; -import java.util.List; - -import static tools.redstone.redstonetools.RedstoneToolsClient.INJECTOR; - -import static net.minecraft.server.command.CommandManager.argument; -import static net.minecraft.server.command.CommandManager.literal; - -public abstract class ToggleableFeature extends AbstractFeature { - - private static final List keyBindings = new ArrayList<>(); - - @Override - public void register() { - super.register(); - - // load user settings - // and register save hook - loadConfig(); - ClientLifecycleEvents.CLIENT_STOPPING.register(client -> { - saveConfig(); - }); - - var containsRequiredArguments = ReflectionUtils.getArguments(getClass()).stream() - .anyMatch(a -> !a.isOptional()); - if (containsRequiredArguments) { - return; - } - - var info = ReflectionUtils.getFeatureInfo(getClass()); - var keyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding( - info.name(), - InputUtil.Type.KEYSYM, - -1, - "Redstone Tools" - )); - - keyBindings.add(keyBinding); - - ClientTickEvents.END_CLIENT_TICK.register(client -> { - while (keyBinding.wasPressed()) { - assert client.player != null; - client.player.sendChatMessage("/" + info.command()); - } - }); - } - - private static final Executor IO_EXECUTOR = Executors.newSingleThreadExecutor(); - - private static final Gson GSON = new GsonBuilder() - .setPrettyPrinting() - .create(); - - private volatile boolean enabled; // volatile for thread safety - - private final List> arguments = ReflectionUtils.getArguments(getClass()); - - private final Path configFile = RedstoneToolsClient.CONFIG_DIR - .resolve("features").resolve(getID() + ".json"); - - @SuppressWarnings({ "rawtypes", "unchecked" }) - - @Override - protected void registerCommands(CommandDispatcher dispatcher, boolean dedicated) { - var baseCommand = literal(getCommand()) - .executes(this::toggle); - - // add option configurations - for (Argument argument : arguments) { - String name = argument.getName(); - baseCommand.then(literal(name) - .executes(context -> { - Object value = argument.getValue(); - return Feedback.success("Option {} of feature {} is set to: {}", name, getName(), argument.getType().serialize(value)).send(context); - }) - .then(argument("value", argument.getType()).executes(context -> { - Object value = context.getArgument("value", argument.getType().getTypeClass()); - - argument.setValue(value); - - if (!enabled) { - enable(context); - } - - IO_EXECUTOR.execute(this::saveConfig); - - return Feedback.success("Set {} to {} for feature {}", name, value, getName()).send(context); - })) - ); - } - - dispatcher.register(baseCommand); - } - - public boolean isEnabled() { - return enabled; - } - - public int toggle(CommandContext context) throws CommandSyntaxException { - return toggle(context.getSource()); - } - - public int toggle(ServerCommandSource source) throws CommandSyntaxException { - return !enabled ? enable(source) : disable(source); - } - - public void setEnabled(boolean status) { - if (status == enabled) - return; // no work to do - - if (status) { - enable(); - } else { - disable(); - } - } - - public void enable() { - enabled = true; - onEnable(); - } - - public int enable(ServerCommandSource source) throws CommandSyntaxException { - enable(); - Feedback.success("Enabled feature {}", getName()).send(source); - return 0; - } - - public int enable(CommandContext context) throws CommandSyntaxException { - return enable(context.getSource()); - } - - public void disable() { - enabled = false; - onDisable(); - } - - public int disable(ServerCommandSource source) throws CommandSyntaxException { - disable(); - Feedback.success("Disabled feature {}", getName()).send(source); - return 0; - } - - public int disable(CommandContext context) throws CommandSyntaxException { - return disable(context.getSource()); - } - - protected void onEnable() { } - protected void onDisable() { } - - // todo: right now the configuration methods are assuming every - // type is serialized to a string, this should be fixed in the future - // but for now it works because every type right now serializes to a string - // + it will probably be refactored soon - - /** Reloads the configuration from the disk. */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void loadConfig() { - try { - boolean enabled = false; - if (Files.exists(configFile)) { - JsonObject object = GSON.fromJson(new BufferedReader( - new InputStreamReader(Files.newInputStream(configFile), StandardCharsets.UTF_8)), - JsonObject.class); - - enabled = Boolean.parseBoolean(object.get("enabled").getAsString()); - - // read options - for (Argument argument : arguments) { - if (!object.has(argument.getName())) - continue; - - String valueString = object.get(argument.getName()).getAsString(); - Object value = argument.getType().deserialize(valueString); - - argument.setValue(value); - } - } - - setEnabled(enabled); - - RedstoneToolsClient.LOGGER.info("Loaded configuration for feature " + getID() + " file(" + configFile + ")"); - } catch (Exception e) { - RedstoneToolsClient.LOGGER.error("Failed to load configuration for feature " + getID() + " file(" + configFile + ")"); - e.printStackTrace(); - } - } - - /** Saves the configuration to the disk. */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void saveConfig() { - try { - if (!Files.exists(configFile)) { - if (!Files.exists(configFile.getParent())) - Files.createDirectories(configFile.getParent()); - Files.createFile(configFile); - } - - // serialize configuration - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("enabled", Boolean.toString(enabled)); - for (Argument argument : arguments) { - Object value = argument.getValue(); - String valueSerialized = (String) argument.getType().serialize(value); - - jsonObject.addProperty(argument.getName(), valueSerialized); - } - - // write json document - String json = GSON.toJson(jsonObject); - OutputStream outputStream = Files.newOutputStream(configFile); - outputStream.write(json.getBytes(StandardCharsets.UTF_8)); - outputStream.close(); - - RedstoneToolsClient.LOGGER.info("Saved configuration for feature " + getID() + " file(" + configFile + ")"); - } catch (Exception e) { - RedstoneToolsClient.LOGGER.error("Failed to save configuration for feature " + getID() + " file(" + configFile + ")"); - e.printStackTrace(); - } - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/ClientPlayerEntityMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/ClientPlayerEntityMixin.java deleted file mode 100644 index ddb2e4d7..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/ClientPlayerEntityMixin.java +++ /dev/null @@ -1,9 +0,0 @@ -package tools.redstone.redstonetools.macros; - -import net.minecraft.client.network.ClientPlayNetworkHandler; - -public interface ClientPlayerEntityMixin { - - void setNetworkHandler(ClientPlayNetworkHandler networkHandler); - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/KeyBindingMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/KeyBindingMixin.java deleted file mode 100644 index 3e0f1cda..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/KeyBindingMixin.java +++ /dev/null @@ -1,12 +0,0 @@ -package tools.redstone.redstonetools.macros; - -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil.Key; - -public interface KeyBindingMixin { - - void removeKeybinding(KeyBinding keyBinding); - - KeyBinding getBindingFromKey(Key key); - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/Macro.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/Macro.java deleted file mode 100644 index 2e30e36e..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/Macro.java +++ /dev/null @@ -1,132 +0,0 @@ -package tools.redstone.redstonetools.macros; - -import net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry; -import tools.redstone.redstonetools.macros.actions.Action; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; -import net.minecraft.client.util.InputUtil.Key; -import tools.redstone.redstonetools.utils.KeyBindingUtils; - -import java.util.ArrayList; -import java.util.List; - -public class Macro { - - public static Macro buildEmpty() { - return new Macro("",true,InputUtil.UNKNOWN_KEY,new ArrayList<>()); - } - - private KeyBinding keyBinding; - public String name; - private Key key; - public boolean enabled; - public List actions; - - private final Macro original; - - public Macro(String name, boolean enabled, Key key, List actions) { - this(name,enabled,key,actions,null); - keyBinding = new KeyBinding("macro." + System.nanoTime(),-1,"macros"); - registerKeyBinding(); - changeKeyBindingKeyCode(); - } - - public Macro(String name, boolean enabled, Key key, List actions, Macro original) { - this.name = name; - this.enabled = enabled; - this.key = key; - this.actions = actions; - this.original = original; - } - - public void registerKeyBinding() { - if (keyBinding == null) return; - - ClientTickEvents.END_CLIENT_TICK.register(client -> { - if (keyBinding == null || key == InputUtil.UNKNOWN_KEY) return; - - if (keyBinding.wasPressed()) { - run(); - } - }); - } - - public void run() { - if (!enabled) { - return; - } - - for (Action action : actions) { - action.run(); - } - } - - public void applyChangesToOriginal() { - assert isCopy(); - - original.name = name; - original.enabled = enabled; - original.setKey(key); - original.actions = new ArrayList<>(actions); - } - - public boolean isCopy(){ - return original != null; - } - - public boolean isCopyOf(Macro macro) { - return original == macro; - } - - public void setKey(Key key) { - this.key = key; - changeKeyBindingKeyCode(); - } - - public void changeKeyBindingKeyCode() { - - if (this.keyBinding != null) { - MinecraftClient.getInstance().options.setKeyCode(keyBinding,key); - KeyBinding.updateKeysByCode(); - } - - } - - public Key getKey(){ - return key; - } - - public Macro createCopy() { - return new Macro(name,enabled,key,new ArrayList<>(actions),this); - } - - public void unregisterKeyBinding(){ - KeyBindingUtils.removeKeyBinding(keyBinding); - } - - public boolean needsSaving() { - return !isCopy() || !original.equals(this); - } - - public boolean isEmpty() { - return name.isEmpty() && key == InputUtil.UNKNOWN_KEY && actions.isEmpty(); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Macro macro) { - - if (actions.size() != macro.actions.size()) return false; - for (int i = 0; i < actions.size(); i++) { - if (!actions.get(i).equals(macro.actions.get(i))) return false; - } - - return macro.name.equals(name) && macro.key.equals(key) && macro.enabled == enabled; - } - - return super.equals(obj); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/MacroManager.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/MacroManager.java deleted file mode 100644 index 95b1f0cf..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/MacroManager.java +++ /dev/null @@ -1,192 +0,0 @@ -package tools.redstone.redstonetools.macros; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.InputUtil; -import tools.redstone.redstonetools.macros.actions.Action; -import tools.redstone.redstonetools.macros.actions.CommandAction; - -import javax.inject.Singleton; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -@Singleton -public class MacroManager { - private final Path macrosFilePath; - private final List macros; - - public MacroManager() { - macrosFilePath = MinecraftClient.getInstance().runDirectory.toPath() - .resolve("config") - .resolve("redstonetools") - .resolve("macros.json"); - - - JsonArray macrosJson = null; - try { - Files.createDirectories(macrosFilePath.getParent()); - if (Files.exists(macrosFilePath)) { - var reader = Json.createReader(new FileReader(macrosFilePath.toFile())); - macrosJson = reader.readArray(); - reader.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - - if (macrosJson == null) { - macros = new ArrayList<>(); - macros.addAll(getDefaultMacros()); - } else { - macros = getMacrosFromJson(macrosJson); - } - } - - public List getMacros() { - return macros; - } - - public Macro getMacro(String name) { - for (Macro macro : macros) { - if (macro.name.equals(name)) { - return macro; - } - } - - return null; - } - - public void addMacro(Macro macro) { - macros.add(macro); - - saveChanges(); - } - - public void removeMacro(Macro macro) { - macros.remove(macro); - - saveChanges(); - } - - public void saveChanges() { - // Write %appdata%/.minecraft/config/redstonetools/macros.json - try { - Files.createDirectories(macrosFilePath.getParent()); - } catch (IOException e) { - e.printStackTrace(); - } - - var macrosJson = Json.createArrayBuilder(); - for (Macro macro : macros) { - macrosJson.add(getMacroJson(macro)); - } - - try (var writer = Json.createWriter(new FileWriter(macrosFilePath.toFile()))) { - writer.writeArray(macrosJson.build()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - private JsonObject getMacroJson(Macro macro) { - var actionsJson = Json.createArrayBuilder(); - for (Action action : macro.actions) { - actionsJson.add(getActionJson(action)); - } - - return Json.createObjectBuilder() - .add("name", macro.name) - .add("enabled", macro.enabled) - .add("key", macro.getKey().getTranslationKey()) - .add("actions", actionsJson) - .build(); - } - - private JsonObject getActionJson(Action action) { - if (action instanceof CommandAction commandAction) { - return Json.createObjectBuilder() - .add("type", "command") - .add("command", commandAction.command) - .build(); - } - - throw new RuntimeException("Unknown action type: " + action.getClass().getName()); - } - - private List getDefaultMacros() { - return List.of( - createCommandMacro("redstoner", new String[] { - "/gamerule doTileDrops false", - "/gamerule doTraderSpawning false", - "/gamerule doWeatherCycle false", - "/gamerule doDaylightCycle false", - "/gamerule doMobSpawning false", - "/gamerule doContainerDrops false", - "/time set noon", - "/weather clear" - }) - ); - } - - private Macro createCommandMacro(String name, String[] commands) { - var actions = new Action[commands.length]; - for (int i = 0; i < commands.length; i++) { - actions[i] = new CommandAction(commands[i]); - } - - return new Macro(name, true, InputUtil.UNKNOWN_KEY, List.of(actions)); - } - - private List getMacrosFromJson(JsonArray macrosJson) { - List macros = new ArrayList<>(); - - for (int i = 0; i < macrosJson.size(); i++) { - macros.add(getMacroFromJson(macrosJson.getJsonObject(i))); - } - - return macros; - } - - private Macro getMacroFromJson(JsonObject macroJson) { - var name = macroJson.getString("name"); - var enabled = macroJson.getBoolean("enabled"); - var key = macroJson.getString("key"); - var actions = getActionsFromJson(macroJson.getJsonArray("actions")); - - return new Macro(name, enabled, InputUtil.fromTranslationKey(key), actions); - } - - private List getActionsFromJson(JsonArray actionsJson) { - List actions = new ArrayList<>(); - - for (int i = 0; i < actionsJson.size(); i++) { - actions.add(getActionFromJson(actionsJson.getJsonObject(i))); - } - - return actions; - } - - private Action getActionFromJson(JsonObject actionJson) { - var type = actionJson.getString("type"); - - if ("command".equals(type)) { - return new CommandAction(actionJson.getString("command")); - } - - throw new RuntimeException("Unknown action type: " + type); - } - - public void updateMacroKeys() { - for (Macro macro : macros) { - macro.changeKeyBindingKeyCode(); - } - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/actions/Action.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/actions/Action.java deleted file mode 100644 index 5cca93f1..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/actions/Action.java +++ /dev/null @@ -1,5 +0,0 @@ -package tools.redstone.redstonetools.macros.actions; - -public abstract class Action { - public abstract void run(); -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/actions/CommandAction.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/actions/CommandAction.java deleted file mode 100644 index 6c680e74..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/actions/CommandAction.java +++ /dev/null @@ -1,29 +0,0 @@ -package tools.redstone.redstonetools.macros.actions; - -import net.minecraft.client.MinecraftClient; - -public class CommandAction extends Action { - public String command; - - public CommandAction(String command) { - this.command = command; - } - - @Override - public void run() { - var player = MinecraftClient.getInstance().player; - assert player != null; - - player.sendChatMessage(command.startsWith("/") ? command : "/" + command); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof CommandAction commandAction) { - return command.equals(commandAction.command); - } - - return super.equals(obj); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/MaroCommandSuggestor.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/MaroCommandSuggestor.java deleted file mode 100644 index 9e4b9314..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/MaroCommandSuggestor.java +++ /dev/null @@ -1,42 +0,0 @@ -package tools.redstone.redstonetools.macros.gui; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.CommandSuggestor; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.TextFieldWidget; - -import java.util.HashMap; - -public class MaroCommandSuggestor extends CommandSuggestor { - private static final HashMap yMap = new HashMap<>(); - - - - public MaroCommandSuggestor(MinecraftClient client, Screen owner, TextFieldWidget textField, TextRenderer textRenderer, boolean slashOptional, boolean suggestingWhenEmpty, int y, int maxSuggestionSize, int color) { - super(client, owner, textField, textRenderer, slashOptional, suggestingWhenEmpty, 0, maxSuggestionSize, false, color); - yMap.put(this,y); - - } - - public void close(){ - yMap.remove(this); - } - - public static boolean instance(Object object) { - return object instanceof MaroCommandSuggestor; - } - - public static int getY(Object object){ - return yMap.get(object); - } - - @Override - public void refresh() { - if (MinecraftClient.getInstance().player == null) return; - super.refresh(); - - } - - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/screen/CommandEditScreen.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/screen/CommandEditScreen.java deleted file mode 100644 index 4e64fd5f..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/screen/CommandEditScreen.java +++ /dev/null @@ -1,108 +0,0 @@ -package tools.redstone.redstonetools.macros.gui.screen; - -import tools.redstone.redstonetools.macros.gui.MaroCommandSuggestor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.option.GameOptionsScreen; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.option.GameOptions; -import net.minecraft.client.util.InputUtil; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; - - -public class CommandEditScreen extends GameOptionsScreen { - - private final TextFieldWidget commandField; - private final MaroCommandSuggestor commandMaroCommandSuggestor; - private boolean changed = false; - - public CommandEditScreen(Screen parent, GameOptions gameOptions, TextFieldWidget commandField) { - super(parent, gameOptions, Text.of("")); - this.commandField = commandField; - client = MinecraftClient.getInstance(); - this.commandMaroCommandSuggestor = new MaroCommandSuggestor(client, parent, commandField,client.textRenderer,true,false, commandField.y -20,5,-805306368); - - commandField.setChangedListener((s) -> changed = true); - commandMaroCommandSuggestor.setWindowActive(true); - commandMaroCommandSuggestor.refresh(); - } - - @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - parent.render(matrices, mouseX, mouseY, delta); - - this.fillGradient(matrices, 0, 0, this.width, this.height, -1072689136, -804253680); - - commandField.render(matrices, mouseX, mouseY, delta); - - commandMaroCommandSuggestor.render(matrices, mouseX, mouseY); - if (changed) { - commandMaroCommandSuggestor.refresh(); - changed = false; - } - - super.render(matrices, mouseX, mouseY, delta); - - } - - @Override - public void tick() { - super.tick(); - commandField.tick(); - } - - @Override - public void resize(MinecraftClient client, int width, int height) { - parent.resize(client,width,height); - } - - @Override - public void close() { - super.close(); - commandField.setTextFieldFocused(false); - commandField.setChangedListener(null); - commandMaroCommandSuggestor.setWindowActive(false); - commandMaroCommandSuggestor.refresh(); - commandMaroCommandSuggestor.close(); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (!commandField.mouseClicked(mouseX, mouseY, button)) { - if (!commandMaroCommandSuggestor.mouseClicked(mouseX, mouseY, button)) { - close(); - } else { - commandField.setTextFieldFocused(true); - } - return false; - } - return super.mouseClicked(mouseX, mouseY, button); - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double amount) { - return commandMaroCommandSuggestor.mouseScrolled(amount); - } - - @Override - public boolean charTyped(char chr, int modifiers) { - return commandField.charTyped(chr,modifiers); - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == InputUtil.GLFW_KEY_ESCAPE || keyCode == InputUtil.GLFW_KEY_ENTER || keyCode == InputUtil.GLFW_KEY_KP_ENTER) { - close(); - return true; - } - commandMaroCommandSuggestor.keyPressed(keyCode, scanCode, modifiers); - - return commandField.keyPressed(keyCode, scanCode, modifiers); - } - - @Override - public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - return commandField.keyReleased(keyCode, scanCode, modifiers); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroEditScreen.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroEditScreen.java deleted file mode 100644 index 8ad466c9..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroEditScreen.java +++ /dev/null @@ -1,259 +0,0 @@ -package tools.redstone.redstonetools.macros.gui.screen; - -import net.minecraft.client.gui.screen.ConfirmScreen; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.util.math.MathHelper; -import tools.redstone.redstonetools.macros.Macro; -import tools.redstone.redstonetools.macros.MacroManager; -import tools.redstone.redstonetools.macros.actions.Action; -import tools.redstone.redstonetools.macros.actions.CommandAction; -import tools.redstone.redstonetools.macros.gui.widget.commandlist.CommandEntry; -import tools.redstone.redstonetools.macros.gui.widget.commandlist.CommandListWidget; -import tools.redstone.redstonetools.macros.gui.widget.macrolist.MacroListWidget; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ScreenTexts; -import net.minecraft.client.gui.screen.option.GameOptionsScreen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.option.GameOptions; -import net.minecraft.client.util.InputUtil; -import net.minecraft.client.util.InputUtil.Key; -import net.minecraft.client.util.InputUtil.Type; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.LiteralText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import tools.redstone.redstonetools.utils.KeyBindingUtils; - -import java.util.List; - -import static tools.redstone.redstonetools.RedstoneToolsClient.INJECTOR; - - -public class MacroEditScreen extends GameOptionsScreen { - private final MacroListWidget macroListWidget; - private final Macro macro; - - private CommandListWidget commandList; - private TextFieldWidget nameField; - private ButtonWidget doneButton; - private ButtonWidget keyBindButton; - - private boolean overlapped = false; - private boolean detectingKeycodeKey = false; - - public MacroEditScreen(Screen parent, GameOptions gameOptions, Text title, MacroListWidget macroListWidget) { - super(parent, gameOptions, title); - this.macroListWidget = macroListWidget; - this.macro = Macro.buildEmpty(); - } - - public MacroEditScreen(Screen parent, GameOptions gameOptions, Text title, MacroListWidget macroListWidget, Macro macro) { - super(parent, gameOptions, title); - this.macroListWidget = macroListWidget; - this.macro = macro.createCopy(); - } - - - @Override - public void init() { - super.init(); - overlapped = false; - nameField = new TextFieldWidget(this.textRenderer, this.width / 2 - 100, 22, 200, 20, Text.of("")); - nameField.setText(macro.name.trim()); - - doneButton = this.addDrawableChild(new ButtonWidget(this.width / 2 - 100, this.height / 4 + 144 + 5, 98, 20, Text.of("Done"), (button) -> { - String name = nameField.getText().trim(); - if (name.isEmpty()) return; - - updateMacroActions(); - - if (!macro.isCopy()) macroListWidget.addMacro(macro); - else macro.applyChangesToOriginal(); - - INJECTOR.getInstance(MacroManager.class).saveChanges(); - - client.setScreen(parent); - })); - doneButton.active = canClickDone(); - - nameField.setChangedListener(s -> { - macro.name = s.trim(); - doneButton.active = canClickDone(); - }); - addSelectableChild(nameField); - - - this.addDrawableChild(new ButtonWidget(this.width / 2 + 2, this.height / 4 + 144 + 5, 98, 20, ScreenTexts.CANCEL, (button) -> { - close(); - })); - - Key keyCode = macro.getKey(); - Text text = keyCode.getLocalizedText(); - if (keyCode == InputUtil.UNKNOWN_KEY) text = Text.of(""); - if ( KeyBindingUtils.isKeyAlreadyBound(keyCode) ) { text = new LiteralText(text.getString()).formatted(Formatting.RED); } - - keyBindButton = new ButtonWidget(this.width / 2 + 26, 55, 75, 20, text, (button) -> { - detectingKeycodeKey = true; - keyBindButton.setMessage((new LiteralText("> ")).append(keyBindButton.getMessage().shallowCopy().formatted(Formatting.YELLOW)).append(" <").formatted(Formatting.YELLOW)); - }); - if (detectingKeycodeKey) keyBindButton.onPress(); - - this.addDrawableChild(keyBindButton); - - int widgetWidth = 339; - List entries = null; - double scrollAmount = 0; - if (commandList != null) { - entries = commandList.children(); - scrollAmount = commandList.getScrollAmount(); - } - - commandList = new CommandListWidget(client, this, widgetWidth, height, 85, this.height / 4 + 144 + 5 - 10, 24); - commandList.setLeftPos(width / 2 - widgetWidth / 2); - - - if (entries != null) { - commandList.children().clear(); - for (CommandEntry entry : entries) { - entry.setOwner(commandList); - commandList.children().add(entry); - } - } else { - for (Action action : macro.actions) { - if (action instanceof CommandAction commandAction) { - commandList.addCommand(commandAction.command); - } - } - } - commandList.setScrollAmount(scrollAmount); - - this.addSelectableChild(commandList); - } - - private boolean canClickDone() { - return !nameField.getText().trim().isEmpty() && macroListWidget.canAdd(macro); - } - - @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - if (overlapped) { - mouseX = -1; - mouseY = -1; - } - - this.renderBackgroundTexture(0); - commandList.render(matrices, mouseX, mouseY, delta); - super.render(matrices, mouseX, mouseY, delta); - - drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 8, 16777215); - - drawCenteredText(matrices, this.textRenderer, "Key Bind", width / 2 - (99 - textRenderer.getWidth("Key Bind") / 2), 55 + textRenderer.fontHeight / 2, 16777215); - nameField.render(matrices, mouseX, mouseY, delta); - - if (nameField.getText().isEmpty() && !nameField.isFocused()) { - nameField.setSuggestion("Name"); - } else { - nameField.setSuggestion(""); - } - } - - @Override - public void tick() { - nameField.tick(); - commandList.tick(); - - super.tick(); - } - - @Override - public void resize(MinecraftClient client, int width, int height) { - super.resize(client, width, height); - if (overlapped) client.setScreen(new CommandEditScreen(this,gameOptions,commandList.getFocused().command)); - } - - - @Override - public void close(){ - if (!macro.isCopy() && macro.isEmpty()) { - super.close(); - return; - } - - updateMacroActions(); - if (macro.needsSaving()) { - client.setScreen(new ConfirmScreen(accept -> { - if (accept) client.setScreen(parent); - else client.setScreen(this); - }, Text.of("Unsaved changes"), Text.of("Are you sure you want to discard changes?"))); - } else { - super.close(); - } - } - - private void updateMacroActions() { - macro.actions.clear(); - - for (String command : commandList.getCommandList()) { - macro.actions.add(new CommandAction(command)); - } - } - - public void editCommandField(TextFieldWidget commandField) { - client.setScreen(new CommandEditScreen(this,gameOptions, commandField)); - overlapped = true; - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - Key key = InputUtil.fromKeyCode(keyCode, scanCode); - if (keyCode == InputUtil.GLFW_KEY_ESCAPE) key = InputUtil.UNKNOWN_KEY; - - if (updateKeybinding(key)) return false; - if (commandList.keyPressed(keyCode, scanCode, modifiers)) return false; - if (keyCode == InputUtil.GLFW_KEY_TAB || keyCode == InputUtil.GLFW_KEY_SPACE) return false; - - return super.keyPressed(keyCode, scanCode, modifiers); - } - - @Override - public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - if (commandList.keyReleased(keyCode, scanCode, modifiers)) return false; - - return super.keyReleased(keyCode, scanCode, modifiers); - } - - @Override - public boolean charTyped(char chr, int modifiers) { - if (commandList.charTyped(chr, modifiers)) return false; - - return super.charTyped(chr, modifiers); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (!commandList.isMouseOver(mouseX, mouseY)) commandList.mouseClicked(mouseX, mouseY, button); - if (updateKeybinding(Type.MOUSE.createFromCode(button))) return false; - - - return super.mouseClicked(mouseX, mouseY, button); - } - - private boolean updateKeybinding(Key key) { - if (detectingKeycodeKey) { - detectingKeycodeKey = false; - Text text = key.getLocalizedText(); - if (key == InputUtil.UNKNOWN_KEY) text = Text.of(""); - if ( KeyBindingUtils.isKeyAlreadyBound(key) ) { text = new LiteralText(text.getString()).formatted(Formatting.RED); } - - keyBindButton.setMessage(text); - macro.setKey(key); - return true; - } - - return false; - } - - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroSelectScreen.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroSelectScreen.java deleted file mode 100644 index cab88a08..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroSelectScreen.java +++ /dev/null @@ -1,52 +0,0 @@ -package tools.redstone.redstonetools.macros.gui.screen; - -import tools.redstone.redstonetools.macros.gui.widget.macrolist.MacroEntry; -import tools.redstone.redstonetools.macros.gui.widget.macrolist.MacroListWidget; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ScreenTexts; -import net.minecraft.client.gui.screen.option.GameOptionsScreen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.option.GameOptions; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; - -public class MacroSelectScreen extends GameOptionsScreen { - - - private MacroListWidget macroList; - - public MacroSelectScreen(Screen parent, GameOptions gameOptions, Text title) { - super(parent, gameOptions, title); - } - - @Override - public void init() { - super.init(); - - this.macroList = new MacroListWidget(this,client); - this.addSelectableChild(this.macroList); - - this.addDrawableChild(new ButtonWidget(this.width / 2 +1, this.height - 29, 150, 20, Text.of("Create New..."), (button) -> { - this.client.setScreen(new MacroEditScreen(this,gameOptions,Text.of("New Macro"), macroList)); - })); - - this.addDrawableChild(new ButtonWidget(this.width / 2 - 151, this.height - 29, 150, 20, ScreenTexts.DONE, (button) -> { - this.client.setScreen(this.parent); - })); - } - - @Override - public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { - this.renderBackgroundTexture(0); - macroList.render(matrices, mouseX, mouseY, delta); - - drawCenteredText(matrices, this.textRenderer, this.title, this.width / 2, 8, 16777215); - super.render(matrices, mouseX, mouseY, delta); - - } - - public void openEditScreen(MacroEntry entry) { - client.setScreen(new MacroEditScreen(this,gameOptions,Text.of("Edit Macro"), macroList, entry.macro)); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/IconButtonWidget.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/IconButtonWidget.java deleted file mode 100644 index e6e08235..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/IconButtonWidget.java +++ /dev/null @@ -1,35 +0,0 @@ -package tools.redstone.redstonetools.macros.gui.widget; - -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -public class IconButtonWidget extends ButtonWidget { - - public static Identifier CROSS_ICON = new Identifier("redstonetools","gui/cross.png"); - public static Identifier PENCIL_ICON = new Identifier("redstonetools","gui/pencil.png"); - - private final Identifier texture; - public IconButtonWidget(Identifier texture ,int x, int y, int width, int height, Text message, PressAction onPress) { - super(x, y, width, height, message, onPress); - this.texture = texture; - } - - public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { - super.renderButton(matrices, mouseX, mouseY, delta); - - - RenderSystem.setShaderTexture(0, texture); - RenderSystem.enableDepthTest(); - - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA); - drawTexture(matrices, this.x, this.y, 0,0, 20, this.height, 20, 20); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/commandlist/CommandEntry.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/commandlist/CommandEntry.java deleted file mode 100644 index afb75e28..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/commandlist/CommandEntry.java +++ /dev/null @@ -1,112 +0,0 @@ -package tools.redstone.redstonetools.macros.gui.widget.commandlist; - -import tools.redstone.redstonetools.macros.gui.MaroCommandSuggestor; -import tools.redstone.redstonetools.macros.gui.widget.IconButtonWidget; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.EntryListWidget; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; - -public class CommandEntry extends EntryListWidget.Entry { - - - protected CommandListWidget owner; - - public final TextFieldWidget command; - protected final ButtonWidget deleteButton; - - - public CommandEntry(MinecraftClient client, CommandListWidget owner, String text) { - this.owner = owner; - - command = new TextFieldWidget(client.textRenderer, 0, 0, 300, 20, Text.of("")); - command.setMaxLength(255); - command.setText(text); - - deleteButton = new IconButtonWidget(IconButtonWidget.CROSS_ICON,0, 0, 20, 20, Text.of(""), (button) -> { - this.owner.removeCommand(this); - }); - - MaroCommandSuggestor commandMaroCommandSuggestor = new MaroCommandSuggestor(client, owner.getParent(), command,client.textRenderer,true,false, 0,0,0); - commandMaroCommandSuggestor.setWindowActive(false); - commandMaroCommandSuggestor.refresh(); - commandMaroCommandSuggestor.close(); - } - - - @Override - public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - command.x = owner.getParent().width/2-owner.getWidth()/2+5; - command.y = y; - command.render(matrices,mouseX,mouseY,tickDelta); - - - deleteButton.x = command.x + command.getWidth()+5; - deleteButton.y = y; - deleteButton.render(matrices,mouseX,mouseY,tickDelta); - - if (edit) { - edit = false; - owner.getParent().editCommandField(command); - } - } - - public void tick() { - command.tick(); - } - private boolean edit = false; - - public void setFocused(boolean focused){ - command.setTextFieldFocused(focused); - if (focused){ - owner.centerScrollOn(this); - edit = true; - } - owner.focusOn(this); - } - - protected String getText() { - return command.getText(); - } - - public void setOwner(CommandListWidget owner) { - this.owner = owner; - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (command.mouseClicked(mouseX,mouseY,button)) { - owner.centerScrollOn(this); - edit = true; - return true; - } - deleteButton.mouseClicked(mouseX,mouseY,button); - - return super.mouseClicked(mouseX, mouseY, button); - } - - @Override - public boolean charTyped(char chr, int modifiers) { - if (command.isFocused()) return command.charTyped(chr,modifiers); - - return super.charTyped(chr, modifiers); - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (command.isFocused()) { - return command.keyPressed(keyCode, scanCode, modifiers); - } - - return super.keyPressed(keyCode, scanCode, modifiers); - } - - @Override - public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - if (command.isFocused()) return command.keyReleased(keyCode, scanCode, modifiers); - - return super.keyReleased(keyCode, scanCode, modifiers); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/commandlist/CommandEntryPlaceHolder.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/commandlist/CommandEntryPlaceHolder.java deleted file mode 100644 index ac8103de..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/commandlist/CommandEntryPlaceHolder.java +++ /dev/null @@ -1,23 +0,0 @@ -package tools.redstone.redstonetools.macros.gui.widget.commandlist; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.math.MatrixStack; - -public class CommandEntryPlaceHolder extends CommandEntry{ - public CommandEntryPlaceHolder(MinecraftClient client, CommandListWidget owner, String text) { - super(client, owner, text); - super.deleteButton.visible = false; - } - - @Override - public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - command.setSuggestion("Add new command"); - if (!super.command.getText().isEmpty()) { - super.owner.addCommandFromPlaceHolder(command.getText(),this); - command.setText(""); - } - - super.render(matrices, index, y, x, entryWidth, entryHeight, mouseX, mouseY, hovered, tickDelta); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/commandlist/CommandListWidget.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/commandlist/CommandListWidget.java deleted file mode 100644 index a62653b3..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/commandlist/CommandListWidget.java +++ /dev/null @@ -1,127 +0,0 @@ -package tools.redstone.redstonetools.macros.gui.widget.commandlist; - -import tools.redstone.redstonetools.macros.gui.screen.MacroEditScreen; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; -import net.minecraft.client.gui.widget.EntryListWidget; - -import java.util.ArrayList; -import java.util.List; - -public class CommandListWidget extends EntryListWidget { - - private final MacroEditScreen parent; - - public CommandListWidget(MinecraftClient client, MacroEditScreen parent, int width, int height, int top, int bottom, int itemHeight) { - super(client, width, height, top, bottom, itemHeight); - this.parent = parent; - addEntry(new CommandEntryPlaceHolder(client,this,"")); - } - - public void tick() { - for (CommandEntry entry : children()) { - entry.tick(); - } - } - - - - public CommandEntry addCommand(String command) { - CommandEntry entry = new CommandEntry(client,this,command); - List entries = children(); - - entries.add(entries.size()-1,entry); - - return entry; - } - - protected void addCommandFromPlaceHolder(String command,CommandEntryPlaceHolder placeHolder) { - CommandEntry entry = addCommand(command); - placeHolder.setFocused(false); - - entry.command.x = placeHolder.command.x; - entry.command.y = placeHolder.command.y; - entry.setFocused(true); - } - - public void centerScrollOn(CommandEntry entry) { - super.centerScrollOn(entry); - } - - - - protected void removeCommand(CommandEntry command) { - removeEntry(command); - setScrollAmount(getScrollAmount()); - } - - protected int getScrollbarPositionX() { - return parent.width/2+this.width/2-4; - } - - public List getCommandList() { - List list = new ArrayList<>(); - - for (int i = 0; i < children().size(); i++){ - CommandEntry command = getEntry(i); - if (command instanceof CommandEntryPlaceHolder) continue; - - list.add(command.getText()); - } - - return list; - } - - @Override - public boolean charTyped(char chr, int modifiers) { - for (CommandEntry entry : children()) { - entry.charTyped(chr,modifiers); - } - - return super.charTyped(chr, modifiers); - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - for (CommandEntry entry : children()) { - entry.keyPressed(keyCode, scanCode, modifiers); - } - - return super.keyPressed(keyCode, scanCode, modifiers); - } - - @Override - public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - for (CommandEntry entry : children()) { - entry.keyReleased(keyCode, scanCode, modifiers); - } - - return super.keyReleased(keyCode, scanCode, modifiers); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - CommandEntry clickedEntry = getEntryAtPosition(mouseX,mouseY); - for (CommandEntry entry : children()) { - if (entry != clickedEntry) entry.setFocused(false); - } - - return super.mouseClicked(mouseX, mouseY, button); - } - - protected MacroEditScreen getParent() { - return parent; - } - - @Override - public int getRowWidth() { - return width; - } - - public int getWidth() { - return this.width; - } - - @Override - public void appendNarrations(NarrationMessageBuilder builder) {} -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/macrolist/MacroEntry.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/macrolist/MacroEntry.java deleted file mode 100644 index 443de635..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/macrolist/MacroEntry.java +++ /dev/null @@ -1,117 +0,0 @@ -package tools.redstone.redstonetools.macros.gui.widget.macrolist; - -import tools.redstone.redstonetools.macros.Macro; -import tools.redstone.redstonetools.macros.gui.widget.IconButtonWidget; -import net.minecraft.client.gui.screen.ConfirmScreen; -import net.minecraft.client.gui.widget.*; -import net.minecraft.client.sound.PositionedSoundInstance; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.sound.SoundEvents; -import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; - -public class MacroEntry extends AlwaysSelectedEntryListWidget.Entry{ - - private final MacroListWidget owner; - - private final CheckboxWidget buttonWidget; - private final ButtonWidget deleteButton; - private final ButtonWidget editButton; - public final Macro macro; - - - public MacroEntry(Macro macro, MacroListWidget owner) { - this.macro = macro; - this.owner = owner; - - buttonWidget = new CheckboxWidget(0, 0, 20, 20, null, macro.enabled, false); - deleteButton = new IconButtonWidget(IconButtonWidget.CROSS_ICON,0, 0, 20, 20 ,Text.of(""), (button) -> { - deleteIfConfirmed(); - }); - editButton = new IconButtonWidget(IconButtonWidget.PENCIL_ICON,0, 0, 20, 20, Text.of(""), (button) -> { - owner.parent.openEditScreen(this); - }); - } - - - public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - renderWidget(buttonWidget,matrices,mouseX,mouseY,tickDelta,x-30,y-2); - renderWidget(editButton,matrices,mouseX,mouseY,tickDelta,x+entryWidth,y-2); - renderWidget(deleteButton,matrices,mouseX,mouseY,tickDelta,x+entryWidth+22,y-2); - - String text = macro.name; - - if (owner.client.textRenderer.getWidth(text) > owner.getRowWidth()-2) { - while (owner.client.textRenderer.getWidth(text + "...") > owner.getRowWidth()-2) { - text = text.substring(0,text.length()-1); - } - - text += "..."; - } - - - owner.client.textRenderer.drawWithShadow(matrices, text, x, y+3,macro.enabled?16777215:8355711, true); - } - - private void renderWidget(PressableWidget widget, MatrixStack matrices, int mouseX, int mouseY, float tickDelta, int x, int y) { - widget.x = x; - widget.y = y; - widget.render(matrices,mouseX,mouseY,tickDelta); - } - - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (button == 0) { - this.onPressed(); - return true; - } else { - return false; - } - } - - public void mouseClickedInRow(double mouseX, double mouseY, int button) { - if (button != 0) return; - - if (clickWidget(buttonWidget, mouseX, mouseY)) macro.enabled = buttonWidget.isChecked(); - clickWidget(editButton,mouseX,mouseY); - clickWidget(deleteButton,mouseX,mouseY); - - - } - - - private boolean clickWidget(ClickableWidget widget, double mouseX, double mouseY) { - if (widget.isMouseOver(mouseX,mouseY)) { - owner.client.getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - widget.onClick(mouseX,mouseY); - - return true; - } - return false; - } - - private void onPressed() { - owner.setSelected(this); - } - - public Text getNarration() { - return new TranslatableText("narrator.select"); - } - - - public void delete() { - owner.removeEntry(this); - macro.unregisterKeyBinding(); - MacroListWidget.macroManager.removeMacro(this.macro); - MacroListWidget.macroManager.updateMacroKeys(); - } - - public void deleteIfConfirmed() { - owner.client.setScreen(new ConfirmScreen((confirmed) -> { - if (confirmed) { - this.delete(); - } - - owner.client.setScreen(owner.parent); - }, Text.of("Delete macro"), Text.of("Are you sure you want to delete '" + macro.name + "'?"))); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/macrolist/MacroListWidget.java b/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/macrolist/MacroListWidget.java deleted file mode 100644 index 333f2bf4..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/macros/gui/widget/macrolist/MacroListWidget.java +++ /dev/null @@ -1,77 +0,0 @@ -package tools.redstone.redstonetools.macros.gui.widget.macrolist; - -import tools.redstone.redstonetools.macros.Macro; -import tools.redstone.redstonetools.macros.MacroManager; -import tools.redstone.redstonetools.macros.gui.screen.MacroSelectScreen; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget; -import net.minecraft.client.util.math.MatrixStack; - -import static tools.redstone.redstonetools.RedstoneToolsClient.INJECTOR; - -public class MacroListWidget extends AlwaysSelectedEntryListWidget { - - protected static final MacroManager macroManager = INJECTOR.getInstance(MacroManager.class); - - protected final MacroSelectScreen parent; - protected final MinecraftClient client; - - - public MacroListWidget(MacroSelectScreen parent, MinecraftClient client) { - super(client, parent.width, parent.height, 20, parent.height - 42, 20); - this.parent = parent; - this.client = client; - - for (Macro macro : macroManager.getMacros()) { - addEntry(new MacroEntry(macro,this)); - } - - - if (this.getSelectedOrNull() != null) { - this.centerScrollOn(this.getEntry(0)); - } - } - - public void addMacro(Macro macro) { - macroManager.addMacro(macro); - addEntry(new MacroEntry(macro, this)); - } - - public boolean canAdd(Macro macro) { - Macro macroFromName = macroManager.getMacro(macro.name); - - return macroFromName == null || macro.isCopyOf(macroFromName); - } - - protected int getScrollbarPositionX() { - return super.getScrollbarPositionX() + 20; - } - - - protected void renderBackground(MatrixStack matrices) { - parent.renderBackground(matrices); - } - - protected boolean isFocused() { - return parent.getFocused() == this; - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - MacroEntry entry = super.getEntryAtPosition(width/2,mouseY); - if (entry != null) entry.mouseClickedInRow(mouseX,mouseY,button); - - return super.mouseClicked(mouseX, mouseY, button); - } - - @Override - public int getRowWidth() { - return 120; - } - - @Override - public boolean removeEntry(MacroEntry entry){ - return super.removeEntry(entry); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/accessors/MinecraftClientAccessor.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/accessors/MinecraftClientAccessor.java deleted file mode 100644 index 6996cf54..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/accessors/MinecraftClientAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package tools.redstone.redstonetools.mixin.accessors; - -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.item.ItemStack; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(MinecraftClient.class) -public interface MinecraftClientAccessor { - - @Invoker - ItemStack invokeAddBlockEntityNbt(ItemStack stack, BlockEntity blockEntity); - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/accessors/WorldRendererAccessor.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/accessors/WorldRendererAccessor.java deleted file mode 100644 index 88ff872a..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/accessors/WorldRendererAccessor.java +++ /dev/null @@ -1,18 +0,0 @@ -package tools.redstone.redstonetools.mixin.accessors; - -import net.minecraft.block.BlockState; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.WorldRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(WorldRenderer.class) -public interface WorldRendererAccessor { - - @Invoker - void invokeDrawBlockOutline(MatrixStack matrices, VertexConsumer vertexConsumer, Entity entity, double d, double e, double f, BlockPos pos, BlockState state); - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/blocks/RedstoneHitboxMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/blocks/RedstoneHitboxMixin.java deleted file mode 100644 index 663852fc..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/blocks/RedstoneHitboxMixin.java +++ /dev/null @@ -1,46 +0,0 @@ -package tools.redstone.redstonetools.mixin.blocks; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.RedstoneWireBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import tools.redstone.redstonetools.RedstoneToolsClient; -import tools.redstone.redstonetools.features.toggleable.BigDustFeature; - -import java.util.HashMap; -import java.util.Map; - -@Pseudo -@Mixin(RedstoneWireBlock.class) -public class RedstoneHitboxMixin { - - private static BigDustFeature bigDustFeature; - - // use array for better performance - private static final VoxelShape[] SHAPES = new VoxelShape[16]; - - @Inject(method="getOutlineShape", at = @At("HEAD"), cancellable = true) - public void getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context, CallbackInfoReturnable cir) { - if (bigDustFeature == null) { - bigDustFeature = RedstoneToolsClient.INJECTOR.getInstance(BigDustFeature.class); - } - - if (bigDustFeature.isEnabled()) { - cir.setReturnValue(SHAPES[BigDustFeature.heightInPixels.getValue() - 1]); - } - } - - static { - for (int i = 1; i <= 16; i++) { - SHAPES[i - 1] = Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, i, 16.0); - } - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/AirPlaceClientMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/AirPlaceClientMixin.java deleted file mode 100644 index 9236718d..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/AirPlaceClientMixin.java +++ /dev/null @@ -1,85 +0,0 @@ -package tools.redstone.redstonetools.mixin.features; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import tools.redstone.redstonetools.RedstoneToolsClient; -import tools.redstone.redstonetools.features.toggleable.AirPlaceFeature; -import tools.redstone.redstonetools.utils.RaycastUtils; - -@Mixin(MinecraftClient.class) -public class AirPlaceClientMixin { - private final AirPlaceFeature airPlaceFeature = RedstoneToolsClient.INJECTOR.getInstance(AirPlaceFeature.class); - - @Shadow - public HitResult crosshairTarget; - - @Inject(method = "doItemUse", at = @At(value = "HEAD"), locals = LocalCapture.CAPTURE_FAILHARD) - public void doItemUse(CallbackInfo callbackInfo) { - if (!isAirPlaceAllowed()) { - return; - } - - crosshairTarget = AirPlaceFeature.findAirPlaceBlockHit(getPlayer()); - } - - @Inject(method = "doAttack", at = @At(value = "HEAD"), locals = LocalCapture.CAPTURE_FAILHARD) - public void doAttack(CallbackInfoReturnable cir) { - if (!isAirPlaceAllowed()) { - return; - } - - // Call interactionManager directly because the block is air, with which the player cannot interact - var hit = AirPlaceFeature.findAirPlaceBlockHit(getPlayer()); - getInteractionManager().attackBlock(hit.getBlockPos(), hit.getSide()); - } - - private boolean isAirPlaceAllowed() { - // If air place is disabled - if (!airPlaceFeature.isEnabled()) { - return false; - } - - // If the hit result is already set - if (crosshairTarget != null && crosshairTarget.getType() != HitResult.Type.MISS) { - return false; - } - - // If the player or interactionManager not initialized - if (getPlayer() == null || getInteractionManager() == null) { - return false; - } - - // If air place isn't possible with the current - // player equipment and state - if (!AirPlaceFeature.canAirPlace(getPlayer())) { - return false; - } - - return true; - } - - private MinecraftClient getMinecraftClient() { - return (MinecraftClient) (Object) this; - } - - private ClientPlayerEntity getPlayer() { - return getMinecraftClient().player; - } - - private ClientPlayerInteractionManager getInteractionManager() { - return getMinecraftClient().interactionManager; - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/AirPlaceServerMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/AirPlaceServerMixin.java deleted file mode 100644 index 5b12380e..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/AirPlaceServerMixin.java +++ /dev/null @@ -1,27 +0,0 @@ -package tools.redstone.redstonetools.mixin.features; - -import net.minecraft.server.network.ServerPlayNetworkHandler; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; -import tools.redstone.redstonetools.RedstoneToolsClient; -import tools.redstone.redstonetools.features.toggleable.AirPlaceFeature; - -@Mixin(ServerPlayNetworkHandler.class) -public class AirPlaceServerMixin { - - private final AirPlaceFeature airPlaceFeature = RedstoneToolsClient.INJECTOR.getInstance(AirPlaceFeature.class); - - @ModifyConstant(method = "onPlayerInteractBlock", constant = @Constant(doubleValue = 64.0) ) - private double modifyConstant(double originalValue) { - - if (airPlaceFeature.isEnabled()) { - float reach5 = AirPlaceFeature.reach.getValue() + 5; - return reach5 * reach5; - } else { - return originalValue; - } - - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/AutoDustMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/AutoDustMixin.java deleted file mode 100644 index f1131970..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/AutoDustMixin.java +++ /dev/null @@ -1,54 +0,0 @@ -package tools.redstone.redstonetools.mixin.features; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import tools.redstone.redstonetools.RedstoneToolsClient; -import tools.redstone.redstonetools.features.toggleable.AutoDustFeature; -import tools.redstone.redstonetools.utils.ColoredBlock; - -@Mixin(Block.class) -public abstract class AutoDustMixin { - private AutoDustFeature autoDustFeature; - - private AutoDustFeature getAutoDustFeature() { - if (autoDustFeature == null) { - autoDustFeature = RedstoneToolsClient.INJECTOR.getInstance(AutoDustFeature.class); - } - - return autoDustFeature; - } - - @Inject(method = "onPlaced", at = @At("TAIL")) - private void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack, CallbackInfo ci) { - if (!getAutoDustFeature().isEnabled()) { - return; - } - - var dustPos = pos.up(); - var block = world.getBlockState(pos).getBlock(); - var blockAbove = world.getBlockState(dustPos).getBlock(); - - if (!blockAbove.equals(Blocks.AIR) || ColoredBlock.fromBlock(block) == null) { - return; - } - - ItemPlacementContext context = new ItemPlacementContext((PlayerEntity) placer, Hand.MAIN_HAND,new ItemStack(Items.REDSTONE),new BlockHitResult(new Vec3d(dustPos.getX(),dustPos.getY(),dustPos.getZ()), Direction.UP, dustPos,false)); - placer.getWorld().setBlockState(dustPos, Blocks.REDSTONE_WIRE.getPlacementState(context)); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/CopyStateMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/CopyStateMixin.java deleted file mode 100644 index 1478b497..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/CopyStateMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package tools.redstone.redstonetools.mixin.features; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemPlacementContext; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import tools.redstone.redstonetools.utils.BlockStateNbtUtil; - - -@Mixin(BlockItem.class) -public abstract class CopyStateMixin { - - @Shadow protected abstract boolean canPlace(ItemPlacementContext context, BlockState state); - @Shadow public abstract Block getBlock(); - - @Inject(method = "getPlacementState", at = @At("TAIL"), cancellable = true) - public void getPlacementState(ItemPlacementContext context, CallbackInfoReturnable cir) { - BlockState state = BlockStateNbtUtil.getPlacementStateOrNull(context.getStack()); - if (state != null && this.canPlace(context, state)) { - cir.setReturnValue(state); - } - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/ItemBindMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/ItemBindMixin.java deleted file mode 100644 index ee194cba..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/features/ItemBindMixin.java +++ /dev/null @@ -1,78 +0,0 @@ -package tools.redstone.redstonetools.mixin.features; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtString; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import tools.redstone.redstonetools.features.commands.ItemBindFeature; -import tools.redstone.redstonetools.features.feedback.Feedback; -import tools.redstone.redstonetools.features.feedback.FeedbackSender; - -import static tools.redstone.redstonetools.RedstoneToolsClient.INJECTOR; - - -public abstract class ItemBindMixin { - - @Mixin(ItemStack.class) - private abstract static class ItemStackMixin { - - @Shadow - public abstract @Nullable NbtCompound getNbt(); - - @Inject(method = "use", at = @At("HEAD"), cancellable = true) - public void checkCommandNBT(World world, PlayerEntity user, Hand hand, CallbackInfoReturnable> cir) { - if (tryToExecuteNBTCommand(hand, world)) { - cir.setReturnValue(TypedActionResult.pass((ItemStack) ((Object) this))); - } - } - - @Inject(method = "useOnBlock", at = @At("HEAD"), cancellable = true) - public void checkCommandNBT(ItemUsageContext context, CallbackInfoReturnable cir) { - if (tryToExecuteNBTCommand(context.getHand(), context.getWorld())) { - cir.setReturnValue(ActionResult.PASS); - } - } - - private boolean tryToExecuteNBTCommand(Hand hand, World world) { - if (hand == Hand.OFF_HAND || world.isClient) return false; - NbtCompound nbt = getNbt(); - if (nbt == null || !nbt.contains("command")) return false; - NbtString command = (NbtString) nbt.get("command"); - MinecraftClient.getInstance().player.sendChatMessage(command.asString()); - - return true; - } - } - - @Mixin(ClientPlayerEntity.class) - private abstract static class PlayerMixin { - - @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true) - public void injectCommand(String message, CallbackInfo ci) { - if (!message.startsWith("/") || !ItemBindFeature.waitingForCommand) return; - - Feedback addCommandFeedback = ItemBindFeature.addCommand(message); - if (addCommandFeedback != null) { - INJECTOR.getInstance(FeedbackSender.class).sendFeedback(((Entity) ((Object)this)).getCommandSource(),addCommandFeedback); - ci.cancel(); - } - } - } - - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/gamerules/DoContainerDropsMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/gamerules/DoContainerDropsMixin.java deleted file mode 100644 index 48280e65..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/gamerules/DoContainerDropsMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package tools.redstone.redstonetools.mixin.gamerules; - -import net.minecraft.inventory.Inventory; -import net.minecraft.util.ItemScatterer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import static tools.redstone.redstonetools.RedstoneToolsGameRules.DO_CONTAINER_DROPS; - -@Mixin(ItemScatterer.class) -public class DoContainerDropsMixin { - @Inject(method = "spawn(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/inventory/Inventory;)V", at = @At("HEAD"), cancellable = true) - private static void spawn(World world, BlockPos pos, Inventory inventory, CallbackInfo ci) { - if (!world.getGameRules().getBoolean(DO_CONTAINER_DROPS)) ci.cancel(); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/AddMacroButtonMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/AddMacroButtonMixin.java deleted file mode 100644 index df394185..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/AddMacroButtonMixin.java +++ /dev/null @@ -1,27 +0,0 @@ -package tools.redstone.redstonetools.mixin.macros; - -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.option.ControlsOptionsScreen; -import net.minecraft.client.gui.screen.option.GameOptionsScreen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.option.GameOptions; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import tools.redstone.redstonetools.macros.gui.screen.MacroSelectScreen; - -@Mixin(ControlsOptionsScreen.class) -public class AddMacroButtonMixin extends GameOptionsScreen { - public AddMacroButtonMixin(Screen parent, GameOptions gameOptions, Text title) { - super(parent, gameOptions, title); - } - - @Inject(method = "init", at = @At("TAIL")) - public void init(CallbackInfo ci) { - this.addDrawableChild(new ButtonWidget(this.width / 2 + 5, this.height / 6 + 36, 150, 20, Text.of("Macros..."), (button) -> { - this.client.setScreen(new MacroSelectScreen(this,super.gameOptions,Text.of("Macros"))); - })); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/InitializeMacroManagerMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/InitializeMacroManagerMixin.java deleted file mode 100644 index ea9ae3ab..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/InitializeMacroManagerMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package tools.redstone.redstonetools.mixin.macros; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.RunArgs; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import tools.redstone.redstonetools.RedstoneToolsClient; -import tools.redstone.redstonetools.macros.MacroManager; - -@Mixin(MinecraftClient.class) -public class InitializeMacroManagerMixin { - @Inject(method = "", at = @At("TAIL")) - public void registerMacros(RunArgs args, CallbackInfo ci){ - RedstoneToolsClient.INJECTOR.getInstance(MacroManager.class);// should register macro keybinds - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/KeyBindingMixinImpl.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/KeyBindingMixinImpl.java deleted file mode 100644 index 8ac71b89..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/KeyBindingMixinImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package tools.redstone.redstonetools.mixin.macros; - -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import tools.redstone.redstonetools.macros.KeyBindingMixin; - -import java.util.Map; - -@Mixin(KeyBinding.class) -public class KeyBindingMixinImpl implements KeyBindingMixin { - - @Shadow @Final private static Map KEYS_BY_ID; - - @Shadow @Final private static Map KEY_TO_BINDINGS; - - @Override - public void removeKeybinding(KeyBinding keyBinding) { - KEYS_BY_ID.entrySet().removeIf(entry -> entry.getValue().equals(this)); - KEY_TO_BINDINGS.entrySet().removeIf(entry -> entry.getValue().equals(this)); - } - - @Override - public KeyBinding getBindingFromKey(InputUtil.Key key) { - return KEY_TO_BINDINGS.get(key); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/autocomplete/ClientPlayerEntityMixinImpl.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/autocomplete/ClientPlayerEntityMixinImpl.java deleted file mode 100644 index bab50f77..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/autocomplete/ClientPlayerEntityMixinImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package tools.redstone.redstonetools.mixin.macros.autocomplete; - -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.network.ClientPlayerEntity; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; -import tools.redstone.redstonetools.macros.ClientPlayerEntityMixin; - -@Mixin(ClientPlayerEntity.class) -public class ClientPlayerEntityMixinImpl implements ClientPlayerEntityMixin { - - @Mutable - @Shadow @Final public ClientPlayNetworkHandler networkHandler; - - - public void setNetworkHandler(ClientPlayNetworkHandler networkHandler) { - this.networkHandler = networkHandler; - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/autocomplete/CommandSuggestorMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/autocomplete/CommandSuggestorMixin.java deleted file mode 100644 index c88c08b4..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/macros/autocomplete/CommandSuggestorMixin.java +++ /dev/null @@ -1,71 +0,0 @@ -package tools.redstone.redstonetools.mixin.macros.autocomplete; - -import com.mojang.brigadier.suggestion.Suggestions; -import net.minecraft.client.gui.screen.CommandSuggestor; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.util.math.MatrixStack; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import tools.redstone.redstonetools.macros.gui.MaroCommandSuggestor; - -import java.util.concurrent.CompletableFuture; - - -@Mixin(CommandSuggestor.class) -public class CommandSuggestorMixin{ - - @Shadow @Final - TextFieldWidget textField; - @Shadow private @Nullable CompletableFuture pendingSuggestions; - @Shadow @Final - int maxSuggestionSize; - - - @ModifyVariable(method = "showSuggestions", at = @At("STORE"), ordinal = 1) - public int suggestionWindXPos(int j){ - if (MaroCommandSuggestor.instance(this)) { - Suggestions suggestions = this.pendingSuggestions.join(); - return this.textField.getCharacterX(suggestions.getRange().getStart())+4; - } - return j; - } - - @ModifyVariable(method = "showSuggestions", at = @At("STORE"), ordinal = 2) - public int suggestionWindYPos(int k){ - if (MaroCommandSuggestor.instance(this)) { - Suggestions suggestions = this.pendingSuggestions.join(); - - int y = MaroCommandSuggestor.getY(this)-2; - return y +20 - Math.min(suggestions.getList().size(), this.maxSuggestionSize) * 12; - } - return k; - } - - - private int i = 0; - - @Inject(method = "render", at = @At("HEAD")) - public void render(MatrixStack matrices, int mouseX, int mouseY, CallbackInfo ci){ - i = 0; - } - - @ModifyVariable(method = "render", at = @At("STORE"), ordinal = 3) - public int messageYPos(int j) { - if (MaroCommandSuggestor.instance(this)) { - int y = MaroCommandSuggestor.getY(this); - i++; - return y - 12*(i-1)+43; - } - return j; - } - - - - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/mixin/update/CheckUpdateMixin.java b/oldSrc/main/java/tools/redstone/redstonetools/mixin/update/CheckUpdateMixin.java deleted file mode 100644 index d2642ae4..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/mixin/update/CheckUpdateMixin.java +++ /dev/null @@ -1,91 +0,0 @@ -package tools.redstone.redstonetools.mixin.update; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.TitleScreen; -import net.minecraft.client.gui.widget.PressableTextWidget; -import net.minecraft.text.*; -import net.minecraft.util.Util; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import tools.redstone.redstonetools.RedstoneToolsClient; - -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; - -import static tools.redstone.redstonetools.RedstoneToolsClient.LOGGER; -import static tools.redstone.redstonetools.RedstoneToolsClient.MOD_VERSION; - -@Mixin(TitleScreen.class) -public class CheckUpdateMixin extends Screen { - private static boolean updateChecked = false; - - private static MutableText updateStatus = (MutableText) Text.of("Redstone Tools Version: " + MOD_VERSION + "(Bug found, report on Github)"); - private static URI uri; - public CheckUpdateMixin() { - super(Text.of("UpdateText(Bug found, report on Github)")); - } - - @Inject(method = "init", at = @At("TAIL")) - public void checkUpdate(CallbackInfo ci) { - if (updateChecked) - return; - - try { - LOGGER.info("Checking for updates..."); - - HttpClient client = HttpClient.newBuilder() - .build(); - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create("https://api.github.com/repositories/597142955/releases/latest")) - .GET() - .build(); - - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - String responseBody = response.body(); - - if (response.statusCode() < 200 || 299 < response.statusCode()) { - LOGGER.error("Got status code " + response.statusCode() + " while trying to check for updates"); - return; - } - - Gson gson = new Gson(); - JsonObject release = gson.fromJson(responseBody, JsonObject.class); - uri = new URI(release.get("html_url").getAsString()); - String newVersion = release.get("tag_name").getAsString(); - - LOGGER.info("Found latest version: " + newVersion); - if (newVersion.contains("alpha") || newVersion.contains("beta")) { - LOGGER.info("Not showing an update popup for alpha or beta release, current version: " + MOD_VERSION + ", new version: " + newVersion); - return; - } - - Style underline = Style.EMPTY; - if (RedstoneToolsClient.MOD_VERSION.equals(newVersion)) { - LOGGER.info("Already up to date, current version: " + MOD_VERSION); - updateStatus = (MutableText) Text.of("Redstone Tools " + MOD_VERSION); - } else { - LOGGER.info("Found newer version, current version: " + RedstoneToolsClient.MOD_VERSION + ", new version: " + newVersion); - updateStatus = (MutableText) Text.of("Redstone Tools " + MOD_VERSION + " ("); - updateStatus.append(Text.of("Click to Update").getWithStyle(underline.withUnderline(true)).get(0)); - updateStatus.append(")"); - } - - } catch (Exception e) { - LOGGER.warn("Failed to check for RedstoneTools updates"); - e.printStackTrace(); - } finally { - updateChecked = true; - } - } - - @Inject(method="init", at = @At("HEAD")) - public void updateTextInjection(CallbackInfo ci){ - this.addDrawableChild(new PressableTextWidget(4,4, textRenderer.getWidth(updateStatus), textRenderer.fontHeight,updateStatus,button -> {Util.getOperatingSystem().open(uri);},textRenderer)); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/BlockColor.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/BlockColor.java deleted file mode 100644 index 62dee464..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/BlockColor.java +++ /dev/null @@ -1,50 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.block.Block; - -import java.util.Arrays; - -public enum BlockColor { - WHITE("white"), - ORANGE("orange"), - MAGENTA("magenta"), - LIGHT_BLUE("light_blue"), - YELLOW("yellow"), - LIME("lime"), - PINK("pink"), - GRAY("gray"), - LIGHT_GRAY("light_gray"), - CYAN("cyan"), - PURPLE("purple"), - BLUE("blue"), - BROWN("brown"), - GREEN("green"), - RED("red"), - BLACK("black"); - - private final String name; - - BlockColor(String name) { - this.name = name; - } - - public static BlockColor fromString(String name) { - return Arrays.stream(BlockColor.values()) - .filter(color -> color.name.equals(name)) - .findFirst() - .orElseThrow(); - } - - public static BlockColor fromBlock(Block block) { - var coloredBlock = ColoredBlock.fromBlock(block); - - return coloredBlock == null - ? BlockColor.WHITE - : coloredBlock.color; - } - - @Override - public String toString() { - return name; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/BlockInfo.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/BlockInfo.java deleted file mode 100644 index 3c1997f6..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/BlockInfo.java +++ /dev/null @@ -1,20 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.util.math.BlockPos; - -public class BlockInfo { - public final Block block; - public final BlockPos pos; - public final BlockState state; - public final BlockEntity entity; - - public BlockInfo(Block block, BlockPos pos, BlockState state, BlockEntity entity) { - this.block = block; - this.pos = pos; - this.state = state; - this.entity = entity; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/BlockStateNbtUtil.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/BlockStateNbtUtil.java deleted file mode 100644 index fcef4e28..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/BlockStateNbtUtil.java +++ /dev/null @@ -1,181 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.property.Property; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; - -import java.util.Objects; - -/** - * Utilities for block state (de)serialization into NBT tags. - */ -public final class BlockStateNbtUtil { - - private BlockStateNbtUtil() { - } - - /** - * Serializes the given block state into an NBT compound. - * - * @param state The state. - * @return The NBT tag or null if the block state is null. - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - public static NbtCompound toNBT(BlockState state) { - if (state == null) { - return null; - } - - NbtCompound root = new NbtCompound(); - root.putString("Id", Registry.BLOCK.getId(state.getBlock()).toString()); - - // serialize properties - if (!state.getProperties().isEmpty()) { - NbtList properties = new NbtList(); - for (Property property : state.getProperties()) { - // todo: maybe compress this? to optimize for memory - NbtCompound propertyTag = new NbtCompound(); - propertyTag.putString("K", property.getName()); - propertyTag.putString("V", property.name(state.get(property))); - properties.add(propertyTag); - } - - root.put("Properties", properties); - } - - return root; - } - - /** - * Attempts to deserialize a block state from the given NBT tag. - * - * @param compound The NBT tag. - * @return The block state or null if the tag is null/empty. - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - public static BlockState fromNBT(NbtCompound compound) { - if (compound == null || compound.isEmpty()) { - return null; - } - - // find the block - // we use new Identifier(...) here to allow it to throw exceptions - // instead of getting a cryptic NPE - Identifier identifier = new Identifier(compound.getString("Id")); - Block block = Registry.BLOCK.get(identifier); - - // deserialize properties - BlockState state = block.getDefaultState(); - NbtList propertiesTag = compound.getList("Properties", NbtElement.COMPOUND_TYPE); - if (propertiesTag != null) { - for (NbtElement element : propertiesTag) { - // this cast is checked, as we require the COMPOUND type - // when getting the list - NbtCompound propertyTag = (NbtCompound) element; - - Property property = block.getStateManager().getProperty(propertyTag.getString("K")); - if (property == null) - continue; - - state = state.with(property, (Comparable) property.parse(propertyTag.getString("V")).get()); - } - } - - return state; - } - - /** - * Attempts to deserialize a block state from the given NBT tag, - * or returns the given default if the tag is null/empty. - * - * @param compound The NBT tag. - * @param def The default. - * @return The block state or {@code def} if the tag is null/empty. - */ - public static BlockState fromNBT(NbtCompound compound, BlockState def) { - BlockState state = fromNBT(compound); - return state == null ? def : state; - } - - /** - * The key for the exact placement state in an items NBT. - */ - public static final String EXACT_STATE_KEY = "ExactBlockState"; - - /** - * Modifies the given item stack to add the exact block state - * placement data. The item stack should place the exact given - * block state when attempted. - * - * @param stack The input stack. - * @param state The block state to assign. - */ - public static void putPlacement(ItemStack stack, BlockState state) { - Objects.requireNonNull(stack); - stack.getOrCreateNbt().put(EXACT_STATE_KEY, toNBT(state)); - } - - /** - * Creates an item stack which should place the exact given - * block state when attempted. - * - * The created item stack has a count of 1 by default. - * - * @param state The placement state. - * @return The item stack. - */ - public static ItemStack createPlacementStack(BlockState state) { - ItemStack stack = new ItemStack(state.getBlock()); - putPlacement(stack, state); - return stack; - } - - /** - * Tries to get the exact placement state for the given - * item stack. If it is unable to determine the exact - * block state it will return null. - * - * @param stack The item stack. - * @return The block state or null. - */ - public static BlockState getPlacementStateOrNull(ItemStack stack) { - NbtCompound nbt = stack.getNbt(); - if (nbt == null || !nbt.contains(EXACT_STATE_KEY)) { - return null; - } - - return fromNBT(nbt.getCompound(EXACT_STATE_KEY)); - } - - /** - * Tries to get the exact placement state for the given - * item stack. If it is unable to determine the exact - * block state it will return the blocks default state - * if the item is a {@link BlockItem}, or null otherwise. - * - * @param stack The item stack. - * @return The block state or null. - */ - public static BlockState getPlacementState(ItemStack stack) { - NbtCompound nbt = stack.getNbt(); - if (nbt == null || !nbt.contains(EXACT_STATE_KEY)) { - if (stack.getItem() instanceof BlockItem blockItem) - return blockItem.getBlock().getDefaultState(); - return null; - } - - BlockState def = stack.getItem() instanceof BlockItem blockItem ? - blockItem.getBlock().getDefaultState() : - null; - return fromNBT(nbt.getCompound(EXACT_STATE_KEY), def); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/ColoredBlock.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/ColoredBlock.java deleted file mode 100644 index 266ab358..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/ColoredBlock.java +++ /dev/null @@ -1,85 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.block.Block; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.regex.Pattern; - -public class ColoredBlock { - private static final Pattern COLORED_BLOCK_REGEX = Pattern.compile( - "^minecraft:(\\w+?)_(wool|stained_glass|concrete_powder|concrete|glazed_terracotta|terracotta)$" - ); - - private static final HashMap COLORLESS_BLOCKS = new HashMap<>() {{ - put("minecraft:glass", new ColoredBlock("minecraft:%s_stained_glass", BlockColor.WHITE)); - put("minecraft:terracotta", new ColoredBlock("minecraft:%s_terracotta", BlockColor.WHITE)); - }}; - - private static final HashMap COLORED_BLOCK_CACHE = new HashMap<>() {{ - putAll(COLORLESS_BLOCKS); - }}; - - private final String blockIdFormat; - public final BlockColor color; - - public ColoredBlock(String blockIdFormat, BlockColor color) { - this.blockIdFormat = blockIdFormat; - this.color = color; - } - - public ColoredBlock withColor(BlockColor color) { - return new ColoredBlock(blockIdFormat, color); - } - - public static ColoredBlock fromBlockId(String blockId) { - if (COLORED_BLOCK_CACHE.containsKey(blockId)) { - return COLORED_BLOCK_CACHE.get(blockId); - } - - var matcher = COLORED_BLOCK_REGEX.matcher(blockId); - if (!matcher.matches()) { - return null; - } - - var color = matcher.group(1); - var blockType = matcher.group(2); - - var coloredBlock = new ColoredBlock("minecraft:%s_" + blockType, BlockColor.fromString(color)); - - COLORED_BLOCK_CACHE.put(blockId, coloredBlock); - - return coloredBlock; - } - - public String toBlockId() { - return String.format(blockIdFormat, color); - } - - public static ColoredBlock fromBlock(@NotNull Block block) { - var blockId = Registry.BLOCK.getId(block).toString(); - if (COLORED_BLOCK_CACHE.containsKey(blockId)) { - return COLORED_BLOCK_CACHE.get(blockId); - } - - var coloredBlock = fromBlockId(blockId); - - // The reason we only cache nulls here and not in the fromBlockId method is because the fromBlockId method would - // also cache invalid block ids (literally any string) which would make the cache massive. This method however - // only accepts actual blocks which means that the cache will never grow bigger than the amount of mc blocks. - COLORED_BLOCK_CACHE.put(blockId, coloredBlock); - - return coloredBlock; - } - - public Block toBlock() { - return Registry.BLOCK.get(Identifier.tryParse(toBlockId())); - } - - @Override - public String toString() { - return toBlockId(); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/ColoredBlockType.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/ColoredBlockType.java deleted file mode 100644 index 701447c7..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/ColoredBlockType.java +++ /dev/null @@ -1,39 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.block.Block; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; - -public enum ColoredBlockType { - // TODO: Merge some things with the ColoredBlock class so we dont have to repeat the formats and stuff - WOOL("wool", "minecraft:%s_wool"), - GLASS("glass", "minecraft:%s_stained_glass"), - CONCRETE("concrete", "minecraft:%s_concrete"), - TERRACOTTA("terracotta", "minecraft:%s_terracotta"); - - private final String displayName; - private final String blockIdFormat; - - ColoredBlockType(String displayName, String blockIdFormat) { - this.displayName = displayName; - this.blockIdFormat = blockIdFormat; - } - - @Override - public String toString() { - return displayName; - } - - public ColoredBlock withColor(BlockColor color) { - return ColoredBlock.fromBlock(toBlock()) - .withColor(color); - } - - public String toBlockId() { - return String.format(blockIdFormat, BlockColor.WHITE); - } - - public Block toBlock() { - return Registry.BLOCK.get(Identifier.tryParse(toBlockId())); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/CommandSourceUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/CommandSourceUtils.java deleted file mode 100644 index fd0b5c4a..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/CommandSourceUtils.java +++ /dev/null @@ -1,12 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.server.command.ServerCommandSource; - -public class CommandSourceUtils { - private CommandSourceUtils() { - } - - public static void executeCommand(ServerCommandSource source, String command) { - source.getServer().getCommandManager().execute(source, command); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/CommandUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/CommandUtils.java deleted file mode 100644 index 5d42ef6f..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/CommandUtils.java +++ /dev/null @@ -1,59 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import tools.redstone.redstonetools.features.arguments.Argument; -import com.mojang.brigadier.Command; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.builder.ArgumentBuilder; -import net.minecraft.server.command.CommandManager; -import net.minecraft.server.command.ServerCommandSource; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class CommandUtils { - private CommandUtils() { } - - public static LiteralArgumentBuilder build(String name, List> arguments, Command executor) { - var base = CommandManager.literal(name); - - if (arguments.stream().allMatch(Argument::isOptional)) { - base.executes(executor); - } - - if (!arguments.isEmpty()) { - base.then(createArgumentChain(arguments.stream() - .sorted((a, b) -> Boolean.compare(a.isOptional(), b.isOptional())) - .toList(), executor)); - } - - return base; - } - - public static void register(String name, List> arguments, Command executor, CommandDispatcher dispatcher, boolean dedicated) { - var base = build(name, arguments, executor); - dispatcher.register(base); - } - - private static ArgumentBuilder createArgumentChain(List> arguments, Command executor) { - var reversedArguments = new ArrayList<>(arguments); - Collections.reverse(reversedArguments); - - ArgumentBuilder argument = null; - for (var arg : reversedArguments) { - if (argument == null) { - argument = CommandManager.argument(arg.getName(), arg.getType()).executes(executor); - } else { - argument = CommandManager.argument(arg.getName(), arg.getType()).then(argument); - - // If the argument is optional or if this is the last required argument it should run the executor - if (arg.isOptional() || reversedArguments.get(reversedArguments.indexOf(arg) - 1).isOptional()) { - argument.executes(executor); - } - } - } - - return argument; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/DependencyLookup.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/DependencyLookup.java deleted file mode 100644 index a316d3b8..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/DependencyLookup.java +++ /dev/null @@ -1,25 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DependencyLookup { - private static final Logger LOGGER = - LoggerFactory.getLogger(DependencyLookup.class); - public static final boolean WORLDEDIT_PRESENT = - require("com.sk89q.worldedit.WorldEdit"); - - private static boolean require(String... classNames) { - for (String className : classNames) { - try { - Class.forName(className); - } catch (ClassNotFoundException e) { - return false; - } catch (Throwable t) { - LOGGER.warn("Unexpected error while checking for dependency {}", className, t); - return false; - } - } - return true; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/DirectionArgument.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/DirectionArgument.java deleted file mode 100644 index 3bc66d24..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/DirectionArgument.java +++ /dev/null @@ -1,24 +0,0 @@ -package tools.redstone.redstonetools.utils; - -public enum DirectionArgument { - ME, - FORWARD, - BACK, - NORTH, - EAST, - SOUTH, - WEST, - NORTHEAST, - NORTHWEST, - SOUTHEAST, - SOUTHWEST, - UP, - DOWN, - LEFT, - RIGHT; - - @Override - public String toString() { - return this.name().toLowerCase(); - } -} \ No newline at end of file diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/DirectionUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/DirectionUtils.java deleted file mode 100644 index 2eb14654..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/DirectionUtils.java +++ /dev/null @@ -1,115 +0,0 @@ -package tools.redstone.redstonetools.utils; - - -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.util.Direction; -import net.minecraft.command.CommandException; -import net.minecraft.text.Text; -import org.jetbrains.annotations.NotNull; - -public class DirectionUtils { - public static Direction firstOrdinal(Direction playerFacing) { - return switch (playerFacing) { - case EAST_NORTHEAST, NORTH_NORTHEAST -> Direction.NORTHEAST; - case NORTH_NORTHWEST, WEST_NORTHWEST -> Direction.NORTHWEST; - case EAST_SOUTHEAST, SOUTH_SOUTHEAST -> Direction.SOUTHEAST; - case SOUTH_SOUTHWEST, WEST_SOUTHWEST -> Direction.SOUTHWEST; - default -> playerFacing; - }; - } - - public static DirectionArgument relativeToAbsolute(DirectionArgument direction, Direction playerFacing) { - return switch (direction) { - case ME, FORWARD -> switch (firstOrdinal(playerFacing)) { - case UP -> DirectionArgument.UP; - case DOWN -> DirectionArgument.DOWN; - case NORTH -> DirectionArgument.NORTH; - case EAST -> DirectionArgument.EAST; - case SOUTH -> DirectionArgument.SOUTH; - case WEST -> DirectionArgument.WEST; - case NORTHEAST -> DirectionArgument.NORTHEAST; - case NORTHWEST -> DirectionArgument.NORTHWEST; - case SOUTHWEST -> DirectionArgument.SOUTHWEST; - case SOUTHEAST -> DirectionArgument.SOUTHEAST; - default -> null; - }; - case LEFT -> switch (firstOrdinal(playerFacing)) { - case UP, DOWN -> throw new CommandException(Text.of("Can't determine direction")); - case NORTH -> DirectionArgument.WEST; - case EAST -> DirectionArgument.NORTH; - case SOUTH -> DirectionArgument.EAST; - case WEST -> DirectionArgument.SOUTH; - case NORTHWEST -> DirectionArgument.SOUTHWEST; - case NORTHEAST -> DirectionArgument.NORTHWEST; - case SOUTHEAST -> DirectionArgument.NORTHEAST; - case SOUTHWEST -> DirectionArgument.SOUTHEAST; - default -> null; - }; - case RIGHT -> switch (firstOrdinal(playerFacing)) { - case UP, DOWN -> throw new CommandException(Text.of("Can't determine direction")); - case NORTH -> DirectionArgument.EAST; - case EAST -> DirectionArgument.SOUTH; - case SOUTH -> DirectionArgument.WEST; - case WEST -> DirectionArgument.NORTH; - case NORTHEAST -> DirectionArgument.SOUTHEAST; - case NORTHWEST -> DirectionArgument.NORTHEAST; - case SOUTHWEST -> DirectionArgument.NORTHWEST; - case SOUTHEAST -> DirectionArgument.SOUTHWEST; - default -> null; - }; - case BACK -> switch (firstOrdinal(playerFacing)) { - case UP -> DirectionArgument.DOWN; - case DOWN -> DirectionArgument.UP; - case NORTH -> DirectionArgument.SOUTH; - case EAST -> DirectionArgument.WEST; - case SOUTH -> DirectionArgument.NORTH; - case WEST -> DirectionArgument.EAST; - case NORTHWEST -> DirectionArgument.SOUTHEAST; - case NORTHEAST -> DirectionArgument.SOUTHWEST; - case SOUTHEAST -> DirectionArgument.NORTHWEST; - case SOUTHWEST -> DirectionArgument.NORTHEAST; - default -> null; - }; - default -> direction; - }; - } - - // big evil match direction function, there might be a better way to do this but i don't know how - @NotNull - public static Direction matchDirection(DirectionArgument direction, Direction playerFacing) throws CommandException { - var absoluteDirection = relativeToAbsolute(direction, playerFacing); - return switch (absoluteDirection) { - case NORTH -> Direction.NORTH; - case EAST -> Direction.EAST; - case SOUTH -> Direction.SOUTH; - case WEST -> Direction.WEST; - case NORTHEAST -> Direction.NORTHEAST; - case NORTHWEST -> Direction.NORTHWEST; - case SOUTHEAST -> Direction.SOUTHEAST; - case SOUTHWEST -> Direction.SOUTHWEST; - case UP -> Direction.UP; - case DOWN -> Direction.DOWN; - default -> { - assert false; - yield null; - } - }; - } - - // so many switch cases - public static BlockVector3 directionToBlock(Direction direction) { - return switch (direction) { - case NORTH -> BlockVector3.at(0, 0, -1); - case EAST -> BlockVector3.at(1, 0, 0); - case SOUTH -> BlockVector3.at(0, 0, 1); - case WEST -> BlockVector3.at(-1, 0, 0); - case UP -> BlockVector3.at(0, 1, 0); - case DOWN -> BlockVector3.at(0, -1, 0); - case NORTHEAST -> BlockVector3.at(1, 0, -1); - case NORTHWEST -> BlockVector3.at(-1, 0, -1); - case SOUTHEAST -> BlockVector3.at(1, 0, 1); - case SOUTHWEST -> BlockVector3.at(-1, 0, 1); - default -> null; - }; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/ItemUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/ItemUtils.java deleted file mode 100644 index 652b9081..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/ItemUtils.java +++ /dev/null @@ -1,68 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.*; -import net.minecraft.util.registry.Registry; -import net.minecraft.world.BlockStateRaycastContext; -import net.minecraft.world.RaycastContext; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; - -public class ItemUtils { - - private ItemUtils(){ - } - - public static void addExtraNBTText(ItemStack itemStack, String text) { - NbtCompound displayNbt = itemStack.getSubNbt("display"); - NbtList loreList = new NbtList(); - - if (displayNbt == null) { - displayNbt = new NbtCompound(); - } else { - loreList = (NbtList) displayNbt.get("Lore"); - } - String lore = "\"(+"+text +")\""; - - if (loreList != null && !loreList.contains(NbtString.of(lore))) loreList.add(NbtString.of(lore)); - displayNbt.put("Lore", loreList); - itemStack.setSubNbt("display", displayNbt); - } - - public static boolean isEmpty(ItemStack itemStack) { - return itemStack == null || itemStack.getItem() == Items.AIR || itemStack.getCount() == 0; - } - - public static ItemStack getMainItem(PlayerEntity player) { - ItemStack stack = player.getMainHandStack(); - return isEmpty(stack) ? player.getOffHandStack() : stack; - } - - public static BlockState getPlacementState(ClientPlayerEntity player, ItemStack stack, float reach) { - Item type = stack.getItem(); - if (!(type instanceof BlockItem blockItem)) - return null; - return blockItem.getBlock().getPlacementState(new ItemPlacementContext( - player, - player.getActiveHand(), - stack, - RaycastUtils.rayCastFromEye(player, reach) - )); - } - - public static BlockState getUseState(ClientPlayerEntity player, ItemStack stack, float reach) { - if (stack == null || stack.getItem() == Items.AIR) - return null; - BlockState state = getPlacementState(player, stack, reach); - if (state == null) - state = Blocks.BEDROCK.getDefaultState(); - return state; - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/KeyBindingUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/KeyBindingUtils.java deleted file mode 100644 index 56e752eb..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/KeyBindingUtils.java +++ /dev/null @@ -1,19 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil.Key; -import tools.redstone.redstonetools.macros.KeyBindingMixin; - -public class KeyBindingUtils { - - public static void removeKeyBinding(KeyBinding keyBinding) { - ((KeyBindingMixin)keyBinding).removeKeybinding(keyBinding); - } - - public static boolean isKeyAlreadyBound(Key key) { - KeyBinding foundKeyBinding = ( (KeyBindingMixin)MinecraftClient.getInstance().options.attackKey ).getBindingFromKey(key); - return foundKeyBinding != null; - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/NumberArg.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/NumberArg.java deleted file mode 100644 index 130ddfeb..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/NumberArg.java +++ /dev/null @@ -1,62 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import org.jetbrains.annotations.NotNull; - -import java.math.BigInteger; - -public class NumberArg implements Comparable { - public final BigInteger numValue; - - public final Integer originalBase; - - public NumberArg(String num, int base){ - this.numValue = new BigInteger(num, base); - this.originalBase = base; - } - - public BigInteger getNum(){ - return this.numValue; - } - public Integer getBase(){ - return this.originalBase; - } - - /** - * Returns the number in a string format without a base prefix. - * @return Formatted String - */ - public String toString(){ - return this.toString(this.originalBase); - } - - /** - * Returns the number in a string format converted to another radix and without a base prefix. - * @param radix The Radix to turn use on the number - * @return Formatted String - */ - public String toString(int radix){ - return this.numValue.toString(radix); - } - - /** - * Returns the number in a string format with a base prefix. - * @return Formatted String - */ - public String toPrefixedString(){ - return toPrefixedString(this.originalBase); - } - - /** - * Returns the number in a string format converted to another radix and with a base prefix. - * @param radix The Radix to turn use on the number - * @return Formatted String - */ - public String toPrefixedString(int radix){ - return NumberBase.formatNumber(this.numValue.toString(radix),radix); - } - - @Override - public int compareTo(@NotNull NumberArg o) { - return this.numValue.compareTo(o.numValue); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/NumberBase.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/NumberBase.java deleted file mode 100644 index bb8c57ff..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/NumberBase.java +++ /dev/null @@ -1,101 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import java.util.Arrays; -import java.util.Optional; - -public enum NumberBase { - BINARY(2,'b'), - OCTAL(8,'o'), - DECIMAL(10,'d'), - HEXADECIMAL(16,'x'); - - private final int base; - - private final char prefixChar; - - NumberBase(int base,char prefixChar) { - this.base = base; - this.prefixChar = prefixChar; - } - - public int toInt() { - return base; - } - - public char getPrefixChar() {return prefixChar;} - - public String getPrefix(){ - return "0" + prefixChar; - } - - @Override - public String toString() { - return super.toString().toLowerCase(); - } - - /** - * Returns an Optional for a NumberBase. Returns empty Optional if not found. - * @param string Search input for the NumberBase - * @return Optional for a NumberBase - */ - public static Optional fromString(String string) { - return Arrays.stream(values()) - .filter(b -> b.toString().equalsIgnoreCase(string)) - .findFirst(); - } - - /** - * Returns an Optional for a NumberBase. Returns empty Optional if not found. - * @param i Search input for the NumberBase - * @return Optional for a NumberBase - */ - public static Optional fromInt(int i) { - return Arrays.stream(values()) - .filter(b -> b.toInt() == i) - .findFirst(); - } - - /** - * Returns an Optional for a NumberBase. Returns empty Optional if not found. - * @param c Search input for the NumberBase - * @return Optional for a NumberBase - */ - public static Optional fromCharacter(char c) { - return Arrays.stream(values()) - .filter(b -> b.getPrefixChar() == c) - .findFirst(); - } - - /** - * Returns an Optional for a NumberBase. Returns empty Optional if not found. - * @param prefix Search input for the NumberBase - * @return Optional for a NumberBase - */ - public static Optional fromPrefix(String prefix) { - return Arrays.stream(values()) - .filter(b -> b.getPrefix().equalsIgnoreCase(prefix)) - .findFirst(); - } - - /** - * Returns a formatted String that includes the base and the number prefix together - * @param num Number to be formatted - * @param base Base to be paired with the number - * @return Formatted String - */ - public static String formatNumber(String num, int base) { - String negsign = ""; - if(Integer.parseInt(num,base) < 0){ - num = num.substring(1); - negsign = "-"; - } - num = num.toUpperCase(); - return negsign + switch (base) { - case 2 -> "0b" + num; - case 8 -> "0o" + num; - case 10 -> "0d" + num; - case 16 -> "0x" + num; - default -> num + "_" + base; - }; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/PositionUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/PositionUtils.java deleted file mode 100644 index 9f57a527..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/PositionUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; - -public class PositionUtils { - private PositionUtils() { - } - - public static Vec3d getBottomPositionOfBlock(BlockPos position) { - return Vec3d.ofCenter(position).subtract(0, 0.5, 0); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/RaycastUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/RaycastUtils.java deleted file mode 100644 index abaf26a2..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/RaycastUtils.java +++ /dev/null @@ -1,28 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.world.RaycastContext; - -public class RaycastUtils { - private RaycastUtils() { - } - - public static BlockHitResult getBlockHitNeighbor(BlockHitResult hit) { - var sideOffset = hit.getSide().getUnitVector(); - - var newBlockPos = hit.getBlockPos().add(sideOffset.getX(), sideOffset.getY(), sideOffset.getZ()); - - return hit.withBlockPos(newBlockPos); - } - - public static BlockHitResult rayCastFromEye(PlayerEntity player, float reach) { - return player.getWorld().raycast(new RaycastContext( - player.getEyePos(), - player.getEyePos().add(player.getRotationVector().multiply(reach)), - RaycastContext.ShapeType.COLLIDER, - RaycastContext.FluidHandling.NONE, - player - )); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/RedstoneUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/RedstoneUtils.java deleted file mode 100644 index bc4dc74d..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/RedstoneUtils.java +++ /dev/null @@ -1,12 +0,0 @@ -package tools.redstone.redstonetools.utils; - -public class RedstoneUtils { - private RedstoneUtils() { - - } - - public static int signalStrengthToNonStackableItemCount(int signalStrength, int containerSlots) { - // Formula copied from https://minecraft.fandom.com/wiki/Redstone_Comparator - return Math.max(signalStrength, (int) Math.ceil((containerSlots / 14.0) * (signalStrength - 1))); - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/ReflectionUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/ReflectionUtils.java deleted file mode 100644 index e80d7ceb..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/ReflectionUtils.java +++ /dev/null @@ -1,153 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import org.apache.commons.io.IOUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.Nullable; -import rip.hippo.inject.DoctorModule; -import sun.misc.Unsafe; -import tools.redstone.redstonetools.features.AbstractFeature; -import tools.redstone.redstonetools.features.Feature; -import tools.redstone.redstonetools.features.arguments.Argument; - -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Field; -import java.io.IOException; -import java.lang.reflect.Modifier; -import java.net.URL; -import java.util.*; -import java.util.stream.Collectors; - -public class ReflectionUtils { - private static final Logger LOGGER = LogManager.getLogger(); - private static DoctorModule[] modules; - private static Set features; - - private ReflectionUtils() { - throw new IllegalStateException("Utility class"); - } - - private static final MethodHandles.Lookup INTERNAL_LOOKUP; - private static final Unsafe unsafe; - - static { - try { - Field f = Unsafe.class.getDeclaredField("theUnsafe"); - f.setAccessible(true); - unsafe = (Unsafe) f.get(null); - } catch (Throwable t) { - t.printStackTrace(); - throw new ExceptionInInitializerError(t); - } - - try { - // get lookup - Field field = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP"); - MethodHandles.publicLookup(); - INTERNAL_LOOKUP = (MethodHandles.Lookup) - unsafe.getObject( - unsafe.staticFieldBase(field), - unsafe.staticFieldOffset(field) - ); - } catch (Exception e) { - e.printStackTrace(); - throw new ExceptionInInitializerError(e); - } - } - - public static MethodHandles.Lookup getInternalLookup() { - return INTERNAL_LOOKUP; - } - - public static DoctorModule[] getModules() { - if (modules == null) { - try { - modules = serviceLoad(DoctorModule.class) - .toArray(DoctorModule[]::new); - } catch (IOException e) { - throw new RuntimeException("Failed to load modules", e); - } - } - return modules; - } - - public static Set getFeatures() { - if (features == null) { - try { - features = serviceLoad(AbstractFeature.class); - } catch (IOException e) { - throw new RuntimeException("Failed to load features", e); - } - } - return features; - } - - private static Set serviceLoad(Class clazz) throws IOException { - ClassLoader cl = ReflectionUtils.class.getClassLoader(); - Enumeration serviceFiles = cl.getResources("META-INF/services/" + clazz.getName()); - Set classNames = new HashSet<>(); - while (serviceFiles.hasMoreElements()) { - URL serviceFile = serviceFiles.nextElement(); - try (var reader = serviceFile.openStream()) { - classNames.addAll(IOUtils.readLines(reader, "UTF-8")); - } - } - return classNames.stream() - .filter(it -> !it.isEmpty() && !it.isBlank()) - .map(ReflectionUtils::loadClass) - .filter(Objects::nonNull) - .filter(clazz::isAssignableFrom) - .map(it -> { - try { - return it.getDeclaredConstructor().newInstance(); - } catch (ReflectiveOperationException e) { - throw new RuntimeException("Failed to instantiate " + it, e); - } - }) - .map(clazz::cast) - .collect(Collectors.toSet()); - } - - @SuppressWarnings("unchecked") - private static @Nullable Class loadClass(String className) { - try { - return (Class) Class.forName(className); - } catch (ClassNotFoundException e) { - throw new RuntimeException("Failed to load class " + className, e); - } catch (NoClassDefFoundError e) { - LOGGER.warn("Failed to load class {}, required {}", className, e.getMessage()); - } - return null; - } - - public static List> getArguments(Class featureClass) { - return Arrays.stream(featureClass.getFields()) - .filter(field -> Argument.class.isAssignableFrom(field.getType())) - .map(field -> { - if (!Modifier.isPublic(field.getModifiers()) - || !Modifier.isStatic(field.getModifiers()) - || !Modifier.isFinal(field.getModifiers())) { - throw new RuntimeException("Field " + field.getName() + " of feature " + featureClass.getName() + " is not public static final"); - } - - try { - var argument = (Argument) field.get(null); - - return argument.ensureNamed(field.getName()); - } catch (IllegalAccessException e) { - throw new RuntimeException("Failed to get value of field " + field.getName(), e); - } - }) - .collect(Collectors.toList()); - } - - public static Feature getFeatureInfo(Class featureClass) { - var feature = featureClass.getAnnotation(Feature.class); - - if (feature == null) { - throw new RuntimeException("No feature annotation found for feature " + featureClass.getName()); - } - - return feature; - } -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/SignalBlock.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/SignalBlock.java deleted file mode 100644 index aa83bc12..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/SignalBlock.java +++ /dev/null @@ -1,48 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemStack; - -public enum SignalBlock { - COMPOSTER(Blocks.COMPOSTER, SignalBlockSupplier.composter()), - BARREL(Blocks.BARREL, SignalBlockSupplier.container(27)), - CHEST(Blocks.CHEST, SignalBlockSupplier.container(27)), - SHULKER_BOX(Blocks.SHULKER_BOX, SignalBlockSupplier.container(27)), - DISPENSER(Blocks.DISPENSER, SignalBlockSupplier.container(9)), - DROPPER(Blocks.DROPPER, SignalBlockSupplier.container(9)), - HOPPER(Blocks.HOPPER, SignalBlockSupplier.container(5)), - BREWING_STAND(Blocks.BREWING_STAND, SignalBlockSupplier.container(5)), - FURNACE(Blocks.FURNACE, SignalBlockSupplier.container(3)), - SMOKER(Blocks.SMOKER, SignalBlockSupplier.container(3)), - BLAST_FURNACE(Blocks.BLAST_FURNACE, SignalBlockSupplier.container(3)), - COMMAND_BLOCK(Blocks.COMMAND_BLOCK, SignalBlockSupplier.commandBlock()), - AUTO(null, null); - - private final Block block; - private final SignalBlockSupplier supplier; - - SignalBlock(Block block, SignalBlockSupplier supplier) { - this.block = block; - this.supplier = supplier; - } - - public static SignalBlock getBestBlock(int signal) { - return signal < 1780 - ? BARREL - : COMMAND_BLOCK; - } - - public ItemStack getItemStack(int signal) { - if (block == null || supplier == null) - return getBestBlock(signal).getItemStack(signal); - - return supplier.getItemStack(block, signal); - } - - @Override - public String toString() { - return this.name().toLowerCase(); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/SignalBlockSupplier.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/SignalBlockSupplier.java deleted file mode 100644 index 0b0d2558..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/SignalBlockSupplier.java +++ /dev/null @@ -1,131 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import net.minecraft.block.Block; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; -import net.minecraft.text.LiteralText; -import net.minecraft.text.MutableText; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.registry.Registry; - -@FunctionalInterface -public interface SignalBlockSupplier { - - NbtCompound createNbt(int signalStrength); - - default ItemStack getItemStack(Block block, int signalStrength) { - ItemStack item = new ItemStack(block); - setCompoundNbt(item, this.createNbt(signalStrength)); - setItemName(item, signalStrength); - return item; - } - - static SignalBlockSupplier container(int slots) { - return signalStrength -> { - if (isInvalidSignalStrength(signalStrength, 1779)) - throw new IllegalArgumentException("Container signal must be 0-1779"); - - NbtCompound tags = new NbtCompound(); - NbtList itemsTag = new NbtList(); - - Item item = getBestItem(signalStrength, slots); - int stackSize = getStackSize(signalStrength, item); - int itemsNeeded = Math.max(0, signalStrength == 1 - ? 1 - : (int) Math.ceil(slots * (signalStrength - 1) / 14D * item.getMaxCount())); - String itemId = Registry.ITEM.getId(item).toString(); - - // Check that the calculated number of items is correct. - // This is to prevent problems with items that have a maximum stack size of 1 but stackSize > 1. - // TODO: This can be improved by removing an item and adding stackable items up to the desired signal strength. - // Even with the improvement, this will still fail for inventories with no available slots. - if (calculateComparatorOutput(itemsNeeded, slots, item.getMaxCount()) != signalStrength) - throw new IllegalStateException("This signal strength cannot be achieved with the selected container"); - - for (int slot = 0, count = itemsNeeded; count > 0; slot++, count -= stackSize) { - NbtCompound slotTag = new NbtCompound(); - slotTag.putByte("Slot", (byte) slot); - slotTag.putString("id", itemId); - slotTag.putByte("Count", (byte) Math.min(stackSize, count)); - itemsTag.add(slotTag); - } - - NbtCompound tag = new NbtCompound(); - tag.put("Items", itemsTag); - tags.put("BlockEntityTag", tag); - - return tags; - }; - } - - static SignalBlockSupplier composter() { - return signalStrength -> { - if (signalStrength == 7 || isInvalidSignalStrength(signalStrength, 8)) - throw new IllegalArgumentException("Composter signal must be 0-6 or 8"); - - NbtCompound tags = new NbtCompound(); - NbtCompound tag = new NbtCompound(); - tag.putInt("level", signalStrength); - tags.put("BlockStateTag", tag); - return tags; - }; - } - - static SignalBlockSupplier commandBlock() { - return signalStrength -> { - if (isInvalidSignalStrength(signalStrength, Integer.MAX_VALUE)) - throw new IllegalArgumentException("Command block signal must be positive"); - - NbtCompound tags = new NbtCompound(); - NbtCompound tag = new NbtCompound(); - tag.putInt("SuccessCount", signalStrength); - tags.put("BlockEntityTag", tag); - return tags; - }; - } - - private static boolean isInvalidSignalStrength(int signalStrength, int maxSignalStrength) { - return signalStrength < 0 || signalStrength > maxSignalStrength; - } - - private static int calculateComparatorOutput(int items, int slots, int item$getMaxCount) { - float f = (float) items / (float) item$getMaxCount; - return MathHelper.floor((f /= (float)slots) * 14.0f) + (items > 0 ? 1 : 0); - } - - private static Item getBestItem(int signalStrength, int slots) { - if (signalStrength > 15) - return Items.WHITE_SHULKER_BOX; - else if (slots >= 15) - return Items.WOODEN_SHOVEL; - else - return Items.STICK; - } - - private static int getStackSize(int signalStrength, Item item) { - if (signalStrength > 897) - return 127; - else if (signalStrength > 15) - return 64; - else - return item.getMaxCount(); - } - - private static void setCompoundNbt(ItemStack item, NbtCompound nbt) { - nbt.putBoolean("HideFlags", true); - item.setNbt(nbt); - item.addEnchantment(Enchantment.byRawId(0), 0); - } - - private static void setItemName(ItemStack item, int signalStrength) { - MutableText text = new LiteralText(String.valueOf(signalStrength)); - text.setStyle(text.getStyle().withColor(Formatting.RED)); - item.setCustomName(text); - } - -} diff --git a/oldSrc/main/java/tools/redstone/redstonetools/utils/WorldEditUtils.java b/oldSrc/main/java/tools/redstone/redstonetools/utils/WorldEditUtils.java deleted file mode 100644 index 29e8ece7..00000000 --- a/oldSrc/main/java/tools/redstone/redstonetools/utils/WorldEditUtils.java +++ /dev/null @@ -1,69 +0,0 @@ -package tools.redstone.redstonetools.utils; - -import tools.redstone.redstonetools.features.feedback.Feedback; -import com.mojang.datafixers.util.Either; -import com.sk89q.worldedit.IncompleteRegionException; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.fabric.FabricAdapter; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.regions.Region; -import net.minecraft.server.network.ServerPlayerEntity; - -import java.util.function.Consumer; - -public class WorldEditUtils { - /** - * Execute a function for each block in - * the provided region. - * - * Iterates the bounding box of the region - * and checks if the position is contained - * for each block. - * - * TODO: maybe make an async version of this somehow - * - * @param region The region. - * @param consumer The function to run. - */ - public static void forEachBlockInRegion(Region region, - Consumer consumer) { - if (!DependencyLookup.WORLDEDIT_PRESENT) { - throw new IllegalStateException("WorldEdit is not loaded."); - } - - CuboidRegion bb = region.getBoundingBox(); - BlockVector3 min = bb.getMinimumPoint(); - BlockVector3 max = bb.getMaximumPoint(); - for (int x = min.getBlockX(); x <= max.getBlockX(); x++) { - for (int y = min.getBlockY(); y <= max.getBlockY(); y++) { - for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) { - BlockVector3 vec = BlockVector3.at(x, y, z); - if (!region.contains(vec)) - continue; - consumer.accept(vec); - } - } - } - } - - public static Either getSelection(ServerPlayerEntity player) { - if (!DependencyLookup.WORLDEDIT_PRESENT) { - throw new IllegalStateException("WorldEdit is not loaded."); - } - - var actor = FabricAdapter.adaptPlayer(player); - - var localSession = WorldEdit.getInstance() - .getSessionManager() - .get(actor); - - var selectionWorld = localSession.getSelectionWorld(); - - try { - return Either.left(localSession.getSelection(selectionWorld)); - } catch (IncompleteRegionException ex) { - return Either.right(Feedback.invalidUsage("Please make a selection with WorldEdit first")); - } - } -} diff --git a/oldSrc/main/resources/assets/redstonetools/gui/cross.png b/oldSrc/main/resources/assets/redstonetools/gui/cross.png deleted file mode 100644 index 16d1e189..00000000 Binary files a/oldSrc/main/resources/assets/redstonetools/gui/cross.png and /dev/null differ diff --git a/oldSrc/main/resources/assets/redstonetools/gui/pencil.png b/oldSrc/main/resources/assets/redstonetools/gui/pencil.png deleted file mode 100644 index 3c5f841d..00000000 Binary files a/oldSrc/main/resources/assets/redstonetools/gui/pencil.png and /dev/null differ diff --git a/oldSrc/main/resources/assets/redstonetools/icon.png b/oldSrc/main/resources/assets/redstonetools/icon.png deleted file mode 100644 index 508ac099..00000000 Binary files a/oldSrc/main/resources/assets/redstonetools/icon.png and /dev/null differ diff --git a/oldSrc/main/resources/assets/redstonetools/lang/en_au.json b/oldSrc/main/resources/assets/redstonetools/lang/en_au.json deleted file mode 100644 index 214f29cd..00000000 --- a/oldSrc/main/resources/assets/redstonetools/lang/en_au.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "gamerule.doContainerDrops": "Do container drops", - "gamerule.doContainerDrops.description": "Controls resource drops from containers", - "gamerule.doBlockUpdatesAfterEdit": "Do block updates after edit", - "gamerule.doBlockUpdatesAfterEdit.description": "Force update blocks after editing them in WorldEdit" -} \ No newline at end of file diff --git a/oldSrc/main/resources/assets/redstonetools/lang/en_ca.json b/oldSrc/main/resources/assets/redstonetools/lang/en_ca.json deleted file mode 100644 index 214f29cd..00000000 --- a/oldSrc/main/resources/assets/redstonetools/lang/en_ca.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "gamerule.doContainerDrops": "Do container drops", - "gamerule.doContainerDrops.description": "Controls resource drops from containers", - "gamerule.doBlockUpdatesAfterEdit": "Do block updates after edit", - "gamerule.doBlockUpdatesAfterEdit.description": "Force update blocks after editing them in WorldEdit" -} \ No newline at end of file diff --git a/oldSrc/main/resources/assets/redstonetools/lang/en_gb.json b/oldSrc/main/resources/assets/redstonetools/lang/en_gb.json deleted file mode 100644 index 214f29cd..00000000 --- a/oldSrc/main/resources/assets/redstonetools/lang/en_gb.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "gamerule.doContainerDrops": "Do container drops", - "gamerule.doContainerDrops.description": "Controls resource drops from containers", - "gamerule.doBlockUpdatesAfterEdit": "Do block updates after edit", - "gamerule.doBlockUpdatesAfterEdit.description": "Force update blocks after editing them in WorldEdit" -} \ No newline at end of file diff --git a/oldSrc/main/resources/assets/redstonetools/lang/en_nz.json b/oldSrc/main/resources/assets/redstonetools/lang/en_nz.json deleted file mode 100644 index 214f29cd..00000000 --- a/oldSrc/main/resources/assets/redstonetools/lang/en_nz.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "gamerule.doContainerDrops": "Do container drops", - "gamerule.doContainerDrops.description": "Controls resource drops from containers", - "gamerule.doBlockUpdatesAfterEdit": "Do block updates after edit", - "gamerule.doBlockUpdatesAfterEdit.description": "Force update blocks after editing them in WorldEdit" -} \ No newline at end of file diff --git a/oldSrc/main/resources/assets/redstonetools/lang/en_us.json b/oldSrc/main/resources/assets/redstonetools/lang/en_us.json deleted file mode 100644 index 214f29cd..00000000 --- a/oldSrc/main/resources/assets/redstonetools/lang/en_us.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "gamerule.doContainerDrops": "Do container drops", - "gamerule.doContainerDrops.description": "Controls resource drops from containers", - "gamerule.doBlockUpdatesAfterEdit": "Do block updates after edit", - "gamerule.doBlockUpdatesAfterEdit.description": "Force update blocks after editing them in WorldEdit" -} \ No newline at end of file diff --git a/oldSrc/main/resources/fabric.mod.json b/oldSrc/main/resources/fabric.mod.json deleted file mode 100644 index 03be2633..00000000 --- a/oldSrc/main/resources/fabric.mod.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "schemaVersion": 1, - "id": "redstonetools", - "version": "${version}", - - "name": "Redstone Tools", - "description": "A Redstone Quality of Life mod. To improve efficiency and productivity.", - "contact": { - "sources": "https://github.com/RedstoneTools/redstone-tools", - "issues": "https://github.com/RedstoneTools/redstone-tools/issues", - "discord": "https://discord.gg/nXWmrAsJQ8" - }, - "custom": { - "modmenu": { - "links": { - "modmenu.discord": "https://discord.gg/nXWmrAsJQ8" - } - } - }, - - "license": "GPL-3.0", - "icon": "assets/redstonetools/icon.png", - - "environment": "*", - "entrypoints": { - "client": [ - "tools.redstone.redstonetools.RedstoneToolsClient" - ] - }, - "mixins": [ - "redstonetools.mixins.json" - ], - - "depends": { - "fabricloader": ">=0.15.0", - "fabric": "*", - "minecraft": "~1.20.4", - "java": ">=17" - }, - "recommends": { - "worldedit": "*" - } -} diff --git a/oldSrc/main/resources/redstonetools.mixins.json b/oldSrc/main/resources/redstonetools.mixins.json deleted file mode 100644 index e896d6b0..00000000 --- a/oldSrc/main/resources/redstonetools.mixins.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "tools.redstone.redstonetools.mixin", - "compatibilityLevel": "JAVA_17", - "injectors": { - "defaultRequire": 1 - }, - "mixins": [ - "blocks.RedstoneHitboxMixin", - "features.AirPlaceServerMixin", - "features.AutoDustMixin", - "features.CopyStateMixin", - "features.ItemBindMixin$ItemStackMixin", - "gamerules.DoContainerDropsMixin", - ], - "client": [ - "accessors.MinecraftClientAccessor", - "accessors.WorldRendererAccessor", - "features.AirPlaceClientMixin", - "features.ItemBindMixin$PlayerMixin", - "macros.AddMacroButtonMixin", - "macros.InitializeMacroManagerMixin", - "macros.KeyBindingMixinImpl", - "macros.autocomplete.ClientPlayerEntityMixinImpl", - "macros.autocomplete.CommandSuggestorMixin", - "update.CheckUpdateMixin" - ] -}