From 65482c493ab24e870038e54ff6ca3aeb8ad75bfd Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 15 May 2021 20:30:06 -0700 Subject: [PATCH] remove dependency on Fabric API --- platforms/fabric/build.gradle.kts | 2 - .../dfsek/terra/fabric/TerraFabricPlugin.java | 72 ++-------------- .../fabric/mixin/CommandManagerMixin.java | 86 +++++++++++++++++++ .../fabric/src/main/resources/fabric.mod.json | 1 - .../src/main/resources/terra.mixins.json | 1 + 5 files changed, 93 insertions(+), 69 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/CommandManagerMixin.java diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index fbdf2b8ac..f33b47582 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -27,8 +27,6 @@ dependencies { "mappings"("net.fabricmc:yarn:1.16.5+build.5:v2") "modImplementation"("net.fabricmc:fabric-loader:0.11.2") - "modImplementation"("net.fabricmc.fabric-api:fabric-api:0.31.0+1.16") - "modCompileOnly"("com.sk89q.worldedit:worldedit-fabric-mc1.16:7.2.0-SNAPSHOT") { exclude(group = "com.google.guava", module = "guava") exclude(group = "com.google.code.gson", module = "gson") diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index f53c0fc7a..a51328b45 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -8,7 +8,6 @@ import com.dfsek.terra.api.addons.annotations.Author; import com.dfsek.terra.api.addons.annotations.Version; import com.dfsek.terra.api.command.CommandManager; import com.dfsek.terra.api.command.TerraCommandManager; -import com.dfsek.terra.api.command.exception.CommandException; import com.dfsek.terra.api.command.exception.MalformedCommandException; import com.dfsek.terra.api.event.EventListener; import com.dfsek.terra.api.event.EventManager; @@ -16,9 +15,7 @@ import com.dfsek.terra.api.event.TerraEventManager; import com.dfsek.terra.api.event.annotations.Global; import com.dfsek.terra.api.event.annotations.Priority; import com.dfsek.terra.api.event.events.config.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.entity.Entity; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Tree; @@ -50,16 +47,11 @@ import com.dfsek.terra.registry.exception.DuplicateEntryException; import com.dfsek.terra.registry.master.AddonRegistry; import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.world.TerraWorld; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.builder.RequiredArgumentBuilder; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.Blocks; import net.minecraft.client.world.GeneratorType; -import net.minecraft.server.command.ServerCommandSource; import net.minecraft.text.LiteralText; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; @@ -86,15 +78,10 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Locale; import java.util.Map; -import static net.minecraft.server.command.CommandManager.argument; -import static net.minecraft.server.command.CommandManager.literal; - public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @@ -125,6 +112,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { logger.error(message); } }; + private final DebugLogger debugLogger = new DebugLogger(logger); private final ItemHandle itemHandle = new FabricItemHandle(); private final WorldHandle worldHandle = new FabricWorldHandle(); @@ -137,6 +125,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), new NotNullValidator<>()) .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); private File dataFolder; + private final CommandManager manager = new TerraCommandManager(this); + + public CommandManager getManager() { + return manager; + } public static TerraFabricPlugin getInstance() { return instance; @@ -339,68 +332,15 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); - CommandManager manager = new TerraCommandManager(this); try { CommandUtil.registerAll(manager); } catch(MalformedCommandException e) { e.printStackTrace(); // TODO do something here even though this should literally never happen } - CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { - int max = manager.getMaxArgumentDepth(); - RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); - for(int i = 0; i < max; i++) { - RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); - - arg = next.then(assemble(arg, manager)); - } - - dispatcher.register(literal("terra").executes(context -> 1).then(assemble(arg, manager))); - dispatcher.register(literal("te").executes(context -> 1).then(assemble(arg, manager))); - //dispatcher.register(literal("te").redirect(root)); - } - ); logger.info("Finished initialization."); } - private RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { - return in.suggests((context, builder) -> { - List args = parseCommand(context.getInput()); - CommandSender sender = (CommandSender) context.getSource(); - try { - sender = (Entity) context.getSource().getEntityOrThrow(); - } catch(CommandSyntaxException ignore) { - } - try { - manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); - } catch(CommandException e) { - sender.sendMessage(e.getMessage()); - } - return builder.buildFuture(); - }).executes(context -> { - List args = parseCommand(context.getInput()); - CommandSender sender = (CommandSender) context.getSource(); - try { - sender = (Entity) context.getSource().getEntityOrThrow(); - } catch(CommandSyntaxException ignore) { - } - try { - manager.execute(args.remove(0), sender, args); - } catch(CommandException e) { - context.getSource().sendError(new LiteralText(e.getMessage())); - } - return 1; - }); - } - - private List parseCommand(String command) { - if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); - else if(command.startsWith("/te ")) command = command.substring("/te ".length()); - List c = new ArrayList<>(Arrays.asList(command.split(" "))); - if(command.endsWith(" ")) c.add(""); - return c; - } - @Override public EventManager getEventManager() { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/CommandManagerMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/CommandManagerMixin.java new file mode 100644 index 000000000..13b15d7ce --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/CommandManagerMixin.java @@ -0,0 +1,86 @@ +package com.dfsek.terra.fabric.mixin; + +import com.dfsek.terra.api.command.exception.CommandException; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.platform.entity.Entity; +import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.text.LiteralText; +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.callback.CallbackInfo; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static net.minecraft.server.command.CommandManager.argument; +import static net.minecraft.server.command.CommandManager.literal; + +@Mixin(CommandManager.class) +public abstract class CommandManagerMixin { + @Shadow + @Final + private CommandDispatcher dispatcher; + + @Inject(method = "", at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/CommandDispatcher;findAmbiguities(Lcom/mojang/brigadier/AmbiguityConsumer;)V")) + private void injectTerraCommands(CommandManager.RegistrationEnvironment environment, CallbackInfo ci) { + com.dfsek.terra.api.command.CommandManager manager = TerraFabricPlugin.getInstance().getManager(); + int max = manager.getMaxArgumentDepth(); + RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); + for(int i = 0; i < max; i++) { + RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); + + arg = next.then(assemble(arg, manager)); + } + + dispatcher.register(literal("terra").executes(context -> 1).then(assemble(arg, manager))); + dispatcher.register(literal("te").executes(context -> 1).then(assemble(arg, manager))); + } + + private RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, com.dfsek.terra.api.command.CommandManager manager) { + return in.suggests((context, builder) -> { + List args = parseCommand(context.getInput()); + CommandSender sender = (CommandSender) context.getSource(); + try { + sender = (Entity) context.getSource().getEntityOrThrow(); + } catch(CommandSyntaxException ignore) { + } + try { + manager.tabComplete(args.remove(0), sender, args).forEach(builder::suggest); + } catch(CommandException e) { + sender.sendMessage(e.getMessage()); + } + return builder.buildFuture(); + }).executes(context -> { + List args = parseCommand(context.getInput()); + CommandSender sender = (CommandSender) context.getSource(); + try { + sender = (Entity) context.getSource().getEntityOrThrow(); + } catch(CommandSyntaxException ignore) { + } + try { + manager.execute(args.remove(0), sender, args); + } catch(CommandException e) { + context.getSource().sendError(new LiteralText(e.getMessage())); + } + return 1; + }); + } + + private List parseCommand(String command) { + if(command.startsWith("/terra ")) command = command.substring("/terra ".length()); + else if(command.startsWith("/te ")) command = command.substring("/te ".length()); + List c = new ArrayList<>(Arrays.asList(command.split(" "))); + if(command.endsWith(" ")) c.add(""); + return c; + } +} diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index c74cac888..bcccae4e0 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -25,7 +25,6 @@ ], "depends": { "fabricloader": ">=0.7.4", - "fabric": "*", "minecraft": "1.16.x" }, "accessWidener": "terra.accesswidener" diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index f87894d87..506962111 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -4,6 +4,7 @@ "package": "com.dfsek.terra.fabric.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "CommandManagerMixin", "GeneratorOptionsMixin", "access.BiomeEffectsAccessor", "access.MobSpawnerLogicAccessor",