diff --git a/src/main/java/net/pedroricardo/commander/Commander.java b/src/main/java/net/pedroricardo/commander/Commander.java index b1509ea..1e90654 100644 --- a/src/main/java/net/pedroricardo/commander/Commander.java +++ b/src/main/java/net/pedroricardo/commander/Commander.java @@ -9,11 +9,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import turniplabs.halplibe.helper.NetworkHelper; +import turniplabs.halplibe.util.GameStartEntrypoint; import java.util.ArrayList; import java.util.List; -public class Commander implements ModInitializer, DedicatedServerModInitializer { +public class Commander implements ModInitializer, DedicatedServerModInitializer, GameStartEntrypoint { public static final String MOD_ID = "commander"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); @@ -43,4 +44,14 @@ public void onInitialize() { public void onInitializeServer() { LOGGER.info("Commander is installed on the server. Packets with suggestions will be sent to clients with Commander."); } + + @Override + public void beforeGameStart() { + + } + + @Override + public void afterGameStart() { + + } } diff --git a/src/main/java/net/pedroricardo/commander/content/CommanderCommandManager.java b/src/main/java/net/pedroricardo/commander/content/CommanderCommandManager.java index e52622a..a7b49c0 100644 --- a/src/main/java/net/pedroricardo/commander/content/CommanderCommandManager.java +++ b/src/main/java/net/pedroricardo/commander/content/CommanderCommandManager.java @@ -43,6 +43,7 @@ public void init() { HelpCommand.register(DISPATCHER); ChunkCommand.register(DISPATCHER); GiveCommand.register(DISPATCHER); + GameRuleCommand.register(DISPATCHER); if (this.isServer) { StopCommand.register(DISPATCHER); diff --git a/src/main/java/net/pedroricardo/commander/content/commands/GameRuleCommand.java b/src/main/java/net/pedroricardo/commander/content/commands/GameRuleCommand.java new file mode 100644 index 0000000..6fae558 --- /dev/null +++ b/src/main/java/net/pedroricardo/commander/content/commands/GameRuleCommand.java @@ -0,0 +1,51 @@ +package net.pedroricardo.commander.content.commands; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.tree.CommandNode; +import net.minecraft.core.data.gamerule.GameRule; +import net.minecraft.core.data.gamerule.GameRuleBoolean; +import net.minecraft.core.data.registry.Registries; +import net.pedroricardo.commander.content.CommanderCommandSource; +import net.pedroricardo.commander.content.exceptions.CommanderExceptions; + +@SuppressWarnings("unchecked") +public class GameRuleCommand { + public static void register(CommandDispatcher dispatcher) { + final LiteralArgumentBuilder argumentBuilder = (LiteralArgumentBuilder) LiteralArgumentBuilder.literal("gamerule").requires(c -> ((CommanderCommandSource)c).hasAdmin()); + for (final GameRule gameRule : Registries.GAME_RULES) { + RequiredArgumentBuilder gameRuleValueArgument; + if (gameRule instanceof GameRuleBoolean) { + gameRuleValueArgument = RequiredArgumentBuilder.argument("value", BoolArgumentType.bool()) + .executes(c -> { + c.getSource().getWorld().getLevelData().getGameRules().setValue((GameRule) gameRule, BoolArgumentType.getBool(c, "value")); + c.getSource().sendTranslatableMessage("commands.commander.gamerule.set", gameRule.getKey(), BoolArgumentType.getBool(c, "value")); + return Command.SINGLE_SUCCESS; + }); + } else { + gameRuleValueArgument = RequiredArgumentBuilder.argument("value", StringArgumentType.greedyString()) + .executes(c -> { + Object o = gameRule.parseFromString(StringArgumentType.getString(c, "value")); + if (o == null) throw CommanderExceptions.invalidGameRuleValue().create(); + c.getSource().getWorld().getLevelData().getGameRules().setValue((GameRule) gameRule, o); + c.getSource().sendTranslatableMessage("commands.commander.gamerule.set", gameRule.getKey(), o); + return Command.SINGLE_SUCCESS; + }); + } + argumentBuilder.then(LiteralArgumentBuilder.literal(gameRule.getKey()) + .executes(c -> { + c.getSource().sendTranslatableMessage("commands.commander.gamerule.get", gameRule.getKey(), ((CommanderCommandSource)c).getWorld().getGameRule(gameRule)); + return Command.SINGLE_SUCCESS; + }) + .then(gameRuleValueArgument)); + } + CommandNode commandNode = dispatcher.register(argumentBuilder); + dispatcher.register((LiteralArgumentBuilder) LiteralArgumentBuilder.literal("gr") + .requires(source -> ((CommanderCommandSource)source).hasAdmin()) + .redirect(commandNode)); + } +} diff --git a/src/main/java/net/pedroricardo/commander/content/exceptions/CommanderExceptions.java b/src/main/java/net/pedroricardo/commander/content/exceptions/CommanderExceptions.java index 7f3e4b4..8fc5289 100644 --- a/src/main/java/net/pedroricardo/commander/content/exceptions/CommanderExceptions.java +++ b/src/main/java/net/pedroricardo/commander/content/exceptions/CommanderExceptions.java @@ -13,6 +13,7 @@ public class CommanderExceptions { private static final SimpleCommandExceptionType PLAYER_ONLY = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("argument_types.commander.entity.invalid_selector.player_only")); private static final SimpleCommandExceptionType SINGLE_PLAYER_WORLD_ONLY = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("exceptions.commander.single_player_world_only")); private static final SimpleCommandExceptionType MULTIPLAYER_WORLD_ONLY = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("exceptions.commander.multiplayer_world_only")); + private static final SimpleCommandExceptionType INVALID_GAME_RULE_VALUE = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("exceptions.commander.invalid_game_rule_value")); public static SimpleCommandExceptionType incomplete() { return INCOMPLETE_ARGUMENT; @@ -49,4 +50,8 @@ public static SimpleCommandExceptionType singlePlayerWorldOnly() { public static SimpleCommandExceptionType multiplayerWorldOnly() { return MULTIPLAYER_WORLD_ONLY; } + + public static SimpleCommandExceptionType invalidGameRuleValue() { + return INVALID_GAME_RULE_VALUE; + } } diff --git a/src/main/java/net/pedroricardo/commander/duck/EnvironmentWithManager.java b/src/main/java/net/pedroricardo/commander/duck/ClassWithManager.java similarity index 78% rename from src/main/java/net/pedroricardo/commander/duck/EnvironmentWithManager.java rename to src/main/java/net/pedroricardo/commander/duck/ClassWithManager.java index f0dc6b9..353a6ca 100644 --- a/src/main/java/net/pedroricardo/commander/duck/EnvironmentWithManager.java +++ b/src/main/java/net/pedroricardo/commander/duck/ClassWithManager.java @@ -2,6 +2,6 @@ import net.pedroricardo.commander.content.CommanderCommandManager; -public interface EnvironmentWithManager { +public interface ClassWithManager { CommanderCommandManager getManager(); } diff --git a/src/main/java/net/pedroricardo/commander/gui/GuiChatSuggestions.java b/src/main/java/net/pedroricardo/commander/gui/GuiChatSuggestions.java index 0c35cc0..04e8ee2 100644 --- a/src/main/java/net/pedroricardo/commander/gui/GuiChatSuggestions.java +++ b/src/main/java/net/pedroricardo/commander/gui/GuiChatSuggestions.java @@ -23,7 +23,7 @@ import net.pedroricardo.commander.content.CommanderCommandManager; import net.pedroricardo.commander.content.CommanderCommandSource; import net.pedroricardo.commander.content.RequestCommandManagerPacket; -import net.pedroricardo.commander.duck.EnvironmentWithManager; +import net.pedroricardo.commander.duck.ClassWithManager; import org.jetbrains.annotations.Nullable; import org.lwjgl.input.Keyboard; import turniplabs.halplibe.helper.ModVersionHelper; @@ -67,7 +67,7 @@ public GuiChatSuggestions(Minecraft mc, TextFieldEditor textFieldEditor, GuiChat } public CommanderCommandManager getManager() { - return ((EnvironmentWithManager)this.mc).getManager(); + return this.mc.theWorld == null ? new CommanderCommandManager(false) : ((ClassWithManager)this.mc.theWorld).getManager(); } public void drawScreen() { diff --git a/src/main/java/net/pedroricardo/commander/mixin/ClientManagerMixin.java b/src/main/java/net/pedroricardo/commander/mixin/ClientManagerMixin.java deleted file mode 100644 index 3c0d82a..0000000 --- a/src/main/java/net/pedroricardo/commander/mixin/ClientManagerMixin.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.pedroricardo.commander.mixin; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.render.window.GameWindow; -import net.pedroricardo.commander.content.CommanderCommandManager; -import net.pedroricardo.commander.duck.EnvironmentWithManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = Minecraft.class, remap = false) -public class ClientManagerMixin implements EnvironmentWithManager { - @Unique - private CommanderCommandManager COMMAND_MANAGER; - - @Inject(method = "", at = @At("TAIL")) - private void init(GameWindow gameWindow, CallbackInfo ci) { - this.COMMAND_MANAGER = new CommanderCommandManager(false); - this.COMMAND_MANAGER.init(); - } - - @Override - public CommanderCommandManager getManager() { - return this.COMMAND_MANAGER; - } -} diff --git a/src/main/java/net/pedroricardo/commander/mixin/GuiChatMixin.java b/src/main/java/net/pedroricardo/commander/mixin/GuiChatMixin.java index 93bc8a5..bc0caf0 100644 --- a/src/main/java/net/pedroricardo/commander/mixin/GuiChatMixin.java +++ b/src/main/java/net/pedroricardo/commander/mixin/GuiChatMixin.java @@ -41,14 +41,14 @@ private void drawSuggestionPreview(int x, int y, float renderPartialTicks, Callb int mouseY = GuiHelper.getScaledMouseY(((GuiScreenAccessor)((GuiChat)(Object)this)).mc()) - 1; if (this.shouldDrawSuggestionPreview()) { - Suggestion suggestionToRender; + Suggestion suggestionToRender = null; if (this.commander$suggestionsGui.isHoveringOverSuggestions(mouseX, mouseY)) { suggestionToRender = this.commander$suggestionsGui.getSuggestions().get(this.commander$suggestionsGui.getIndexOfSuggestionBeingHoveredOver(mouseX, mouseY).get()); - } else { + } else if (!this.commander$suggestionsGui.getSuggestions().isEmpty()) { suggestionToRender = this.commander$suggestionsGui.getSuggestions().get(0); } - if (suggestionToRender.getText().startsWith(((TextFieldEditorAccessor)((GuiChat)(Object)this)).editor().getText().substring(Math.min(suggestionToRender.getRange().getStart(), ((TextFieldEditorAccessor)((GuiChat)(Object)this)).editor().getText().length())))) { + if (suggestionToRender != null && suggestionToRender.getText().startsWith(((TextFieldEditorAccessor)((GuiChat)(Object)this)).editor().getText().substring(Math.min(suggestionToRender.getRange().getStart(), ((TextFieldEditorAccessor)((GuiChat)(Object)this)).editor().getText().length())))) { int leftMargin = 17 + ((GuiScreenAccessor) ((GuiChat) (Object) this)).fontRenderer().getStringWidth(this.commander$suggestionsGui.getMessage().substring(0, Math.min(suggestionToRender.getRange().getStart(), this.commander$suggestionsGui.getMessage().length()))); ((GuiScreenAccessor) ((GuiChat) (Object) this)).fontRenderer().drawStringWithShadow(TextFormatting.LIGHT_GRAY + suggestionToRender.getText(), leftMargin + 1, ((GuiChat) (Object) this).height - 12, 0xE0E0E0); } diff --git a/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandConsoleMixin.java b/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandConsoleMixin.java index 7a8fa8e..923c969 100644 --- a/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandConsoleMixin.java +++ b/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandConsoleMixin.java @@ -1,16 +1,11 @@ package net.pedroricardo.commander.mixin; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.EntityPlayerSP; import net.minecraft.core.net.ServerCommand; -import net.minecraft.core.net.command.TextFormatting; import net.minecraft.server.MinecraftServer; -import net.pedroricardo.commander.content.CommanderClientCommandSource; import net.pedroricardo.commander.content.CommanderConsoleCommandSource; -import net.pedroricardo.commander.duck.EnvironmentWithManager; +import net.pedroricardo.commander.duck.ClassWithManager; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -24,7 +19,7 @@ private void commandLineParser(CallbackInfo ci, ServerCommand serverCommand) { String command = serverCommand.command; CommanderConsoleCommandSource source = new CommanderConsoleCommandSource((MinecraftServer)(Object)this); try { - ((EnvironmentWithManager)((MinecraftServer)(Object)this)).getManager().execute(command, source); + ((ClassWithManager)((MinecraftServer)(Object)this).getDimensionWorld(0)).getManager().execute(command, source); } catch (CommandSyntaxException e) { source.sendMessage(e.getMessage()); } diff --git a/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandNetServerHandlerMixin.java b/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandNetServerHandlerMixin.java index c71dc99..0753135 100644 --- a/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandNetServerHandlerMixin.java +++ b/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandNetServerHandlerMixin.java @@ -7,9 +7,8 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.player.EntityPlayerMP; import net.minecraft.server.net.handler.NetServerHandler; -import net.pedroricardo.commander.content.CommanderCommandManager; import net.pedroricardo.commander.content.CommanderServerCommandSource; -import net.pedroricardo.commander.duck.EnvironmentWithManager; +import net.pedroricardo.commander.duck.ClassWithManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; @@ -31,7 +30,7 @@ private interface NetServerHandlerAccessor { private void handleSlashCommand(String s, CallbackInfo ci) { CommanderServerCommandSource serverCommandSource = new CommanderServerCommandSource(((NetServerHandlerAccessor)((NetServerHandler)(Object)this)).mcServer(), ((NetServerHandlerAccessor)((NetServerHandler)(Object)this)).playerEntity()); try { - ((EnvironmentWithManager)(((NetServerHandlerAccessor)((NetServerHandler)(Object)this)).mcServer())).getManager().execute(s.substring(1), serverCommandSource); + ((ClassWithManager)((NetServerHandlerAccessor)((NetServerHandler)(Object)this)).playerEntity().world).getManager().execute(s.substring(1), serverCommandSource); } catch (CommandSyntaxException e) { ((NetServerHandlerAccessor)((NetServerHandler)(Object)this)).playerEntity().playerNetServerHandler.sendPacket(new Packet3Chat(TextFormatting.RED + e.getMessage(), AES.keyChain.get(((NetServerHandlerAccessor)((NetServerHandler)(Object)this)).playerEntity().username))); } diff --git a/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandPlayerSPMixin.java b/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandPlayerSPMixin.java index 02ed767..ebbf385 100644 --- a/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandPlayerSPMixin.java +++ b/src/main/java/net/pedroricardo/commander/mixin/PreferCommanderCommandPlayerSPMixin.java @@ -5,8 +5,7 @@ import net.minecraft.client.entity.player.EntityPlayerSP; import net.minecraft.core.net.command.TextFormatting; import net.pedroricardo.commander.content.CommanderClientCommandSource; -import net.pedroricardo.commander.content.CommanderCommandManager; -import net.pedroricardo.commander.duck.EnvironmentWithManager; +import net.pedroricardo.commander.duck.ClassWithManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; @@ -27,7 +26,7 @@ private void sendChatMessage(String s, CallbackInfo ci) { String command = s.substring(1); CommanderClientCommandSource clientCommandSource = new CommanderClientCommandSource(((EntityPlayerSPAccessor)((EntityPlayerSP)(Object)this)).mc()); try { - ((EnvironmentWithManager)((EntityPlayerSPAccessor)((EntityPlayerSP)(Object)this)).mc()).getManager().execute(command, clientCommandSource); + ((ClassWithManager)((EntityPlayerSP)(Object)this).world).getManager().execute(command, clientCommandSource); } catch (CommandSyntaxException e) { ((EntityPlayerSPAccessor)((EntityPlayerSP)(Object)this)).mc().thePlayer.sender.sendMessage(TextFormatting.RED + e.getMessage()); } diff --git a/src/main/java/net/pedroricardo/commander/mixin/ReceiveRequestCommandManagerPacketMixin.java b/src/main/java/net/pedroricardo/commander/mixin/ReceiveRequestCommandManagerPacketMixin.java index aaa9abe..9478af7 100644 --- a/src/main/java/net/pedroricardo/commander/mixin/ReceiveRequestCommandManagerPacketMixin.java +++ b/src/main/java/net/pedroricardo/commander/mixin/ReceiveRequestCommandManagerPacketMixin.java @@ -2,16 +2,14 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.core.entity.player.EntityPlayer; import net.minecraft.core.net.handler.NetHandler; import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.player.EntityPlayerMP; import net.minecraft.server.net.handler.NetServerHandler; -import net.pedroricardo.commander.Commander; import net.pedroricardo.commander.content.CommandManagerPacket; import net.pedroricardo.commander.content.CommanderServerCommandSource; import net.pedroricardo.commander.content.RequestCommandManagerPacket; -import net.pedroricardo.commander.duck.EnvironmentWithManager; +import net.pedroricardo.commander.duck.ClassWithManager; import net.pedroricardo.commander.duck.RequestCommandManagerPacketHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -24,6 +22,6 @@ public abstract class ReceiveRequestCommandManagerPacketMixin extends NetHandler @Override public void commander$handleRequestCommandManagerPacket(RequestCommandManagerPacket packet) { EntityPlayerMP player = this.mcServer.playerList.getPlayerEntity(packet.username); - player.playerNetServerHandler.sendPacket(new CommandManagerPacket(((EnvironmentWithManager)this.mcServer).getManager().getDispatcher(), new CommanderServerCommandSource(this.mcServer, player), packet.text, packet.cursor)); + player.playerNetServerHandler.sendPacket(new CommandManagerPacket(((ClassWithManager)this.mcServer.getDimensionWorld(player.dimension)).getManager().getDispatcher(), new CommanderServerCommandSource(this.mcServer, player), packet.text, packet.cursor)); } } diff --git a/src/main/java/net/pedroricardo/commander/mixin/SendCommandManagerPacketMixin.java b/src/main/java/net/pedroricardo/commander/mixin/SendCommandManagerPacketMixin.java index cac2d8e..4e09c5b 100644 --- a/src/main/java/net/pedroricardo/commander/mixin/SendCommandManagerPacketMixin.java +++ b/src/main/java/net/pedroricardo/commander/mixin/SendCommandManagerPacketMixin.java @@ -3,15 +3,12 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.core.net.packet.Packet1Login; -import net.minecraft.core.world.chunk.ChunkCoordinates; import net.minecraft.server.MinecraftServer; import net.minecraft.server.entity.player.EntityPlayerMP; import net.minecraft.server.net.handler.NetLoginHandler; -import net.minecraft.server.net.handler.NetServerHandler; -import net.minecraft.server.world.WorldServer; import net.pedroricardo.commander.content.CommandManagerPacket; import net.pedroricardo.commander.content.CommanderServerCommandSource; -import net.pedroricardo.commander.duck.EnvironmentWithManager; +import net.pedroricardo.commander.duck.ClassWithManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -26,6 +23,6 @@ public class SendCommandManagerPacketMixin { @Inject(method = "doLogin", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/net/handler/NetServerHandler;sendPacket(Lnet/minecraft/core/net/packet/Packet;)V", ordinal = 7), locals = LocalCapture.CAPTURE_FAILSOFT) private void commander$sendCommandManagerPacket(Packet1Login packet1login, CallbackInfo ci, EntityPlayerMP player) { - player.playerNetServerHandler.sendPacket(new CommandManagerPacket(((EnvironmentWithManager)this.mcServer).getManager().getDispatcher(), new CommanderServerCommandSource(this.mcServer, player), "", 0)); + player.playerNetServerHandler.sendPacket(new CommandManagerPacket(((ClassWithManager)this.mcServer.getDimensionWorld(player.dimension)).getManager().getDispatcher(), new CommanderServerCommandSource(this.mcServer, player), "", 0)); } } diff --git a/src/main/java/net/pedroricardo/commander/mixin/ServerManagerMixin.java b/src/main/java/net/pedroricardo/commander/mixin/ServerManagerMixin.java deleted file mode 100644 index 1c2412c..0000000 --- a/src/main/java/net/pedroricardo/commander/mixin/ServerManagerMixin.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.pedroricardo.commander.mixin; - -import net.minecraft.server.MinecraftServer; -import net.pedroricardo.commander.content.CommanderCommandManager; -import net.pedroricardo.commander.duck.EnvironmentWithManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = MinecraftServer.class, remap = false) -public class ServerManagerMixin implements EnvironmentWithManager { - @Unique - private CommanderCommandManager COMMAND_MANAGER; - - @Inject(method = "", at = @At("TAIL")) - private void init(CallbackInfo ci) { - this.COMMAND_MANAGER = new CommanderCommandManager(true); - this.COMMAND_MANAGER.init(); - } - - @Override - public CommanderCommandManager getManager() { - return this.COMMAND_MANAGER; - } -} \ No newline at end of file diff --git a/src/main/java/net/pedroricardo/commander/mixin/WorldManagerMixin.java b/src/main/java/net/pedroricardo/commander/mixin/WorldManagerMixin.java new file mode 100644 index 0000000..be5d2de --- /dev/null +++ b/src/main/java/net/pedroricardo/commander/mixin/WorldManagerMixin.java @@ -0,0 +1,46 @@ +package net.pedroricardo.commander.mixin; + +import net.fabricmc.api.EnvType; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.render.window.GameWindow; +import net.minecraft.core.world.Dimension; +import net.minecraft.core.world.World; +import net.minecraft.core.world.save.LevelStorage; +import net.minecraft.core.world.type.WorldType; +import net.pedroricardo.commander.content.CommanderCommandManager; +import net.pedroricardo.commander.duck.ClassWithManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = World.class, remap = false) +public class WorldManagerMixin implements ClassWithManager { + @Unique + private CommanderCommandManager COMMAND_MANAGER; + + @Inject(method = "(Lnet/minecraft/core/world/World;Lnet/minecraft/core/world/Dimension;)V", at = @At("TAIL")) + private void init1(World world, Dimension dimension, CallbackInfo ci) { + this.COMMAND_MANAGER = new CommanderCommandManager(FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER); + this.COMMAND_MANAGER.init(); + } + + @Inject(method = "(Lnet/minecraft/core/world/save/LevelStorage;Ljava/lang/String;Lnet/minecraft/core/world/Dimension;Lnet/minecraft/core/world/type/WorldType;J)V", at = @At("TAIL")) + private void init2(LevelStorage saveHandler, String name, Dimension dimension, WorldType worldType, long seed, CallbackInfo ci) { + this.COMMAND_MANAGER = new CommanderCommandManager(FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER); + this.COMMAND_MANAGER.init(); + } + + @Inject(method = "(Lnet/minecraft/core/world/save/LevelStorage;Ljava/lang/String;JLnet/minecraft/core/world/Dimension;Lnet/minecraft/core/world/type/WorldType;)V", at = @At("TAIL")) + private void init3(LevelStorage saveHandler, String name, long seed, Dimension dimension, WorldType worldType, CallbackInfo ci) { + this.COMMAND_MANAGER = new CommanderCommandManager(FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER); + this.COMMAND_MANAGER.init(); + } + + @Override + public CommanderCommandManager getManager() { + return this.COMMAND_MANAGER; + } +} diff --git a/src/main/resources/commander.mixins.json b/src/main/resources/commander.mixins.json index 7b35f58..25eb6b1 100644 --- a/src/main/resources/commander.mixins.json +++ b/src/main/resources/commander.mixins.json @@ -7,18 +7,17 @@ "GuiChatMixin", "PreferCommanderCommandPlayerSPMixin", "PreferCommanderCommandPlayerSPMixin$EntityPlayerSPAccessor", - "StatNameAccessor" + "StatNameAccessor", + "WorldManagerMixin" ], "server": [ "PreferCommanderCommandConsoleMixin", "PreferCommanderCommandNetServerHandlerMixin", "PreferCommanderCommandNetServerHandlerMixin$NetServerHandlerAccessor", "ReceiveRequestCommandManagerPacketMixin", - "SendCommandManagerPacketMixin", - "ServerManagerMixin" + "SendCommandManagerPacketMixin" ], "client": [ - "ClientManagerMixin", "GuiScreenAccessor", "GuiSleepMixin", "ReceiveCommandManagerPacketMixin", diff --git a/src/main/resources/lang/commander/en_US.lang b/src/main/resources/lang/commander/en_US.lang index d474f67..fcb28d5 100644 --- a/src/main/resources/lang/commander/en_US.lang +++ b/src/main/resources/lang/commander/en_US.lang @@ -119,7 +119,10 @@ commands.commander.score.set.success=Set own score to %s commands.commander.score.set.success_other=Set %s's score to %s commands.commander.score.set.success_receiver=Your score has been set to %s commands.commander.emotes.success=Available emotes: +commands.commander.gamerule.get=Game rule %s is set to %s exceptions.commander.incomplete=Incomplete argument exceptions.commander.not_in_world=Argument requires sender to be in world, but they are not present exceptions.commander.single_player_world_only=Command requires the sender to be in a single player world -exceptions.commander.multiplayer_world_only=Command requires the sender to be in a multiplayer world \ No newline at end of file +exceptions.commander.multiplayer_world_only=Command requires the sender to be in a multiplayer world +exceptions.commander.invalid_game_rule_value=Invalid game rule value +commands.commander.gamerule.set=Set game rule %s to %s \ No newline at end of file