package moe.ymc.acron.mixin; import com.mojang.brigadier.CommandDispatcher; import moe.ymc.acron.cmd.CmdSrc; import moe.ymc.acron.config.ConfigReloadCmd; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; 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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import static net.minecraft.server.command.CommandManager.literal; @Mixin(CommandManager.class) public abstract class CommandManagerMixin { private static final Logger AC_LOGGER = LogManager.getLogger(); @Shadow @Final private CommandDispatcher dispatcher; @Inject(method = "", at = @At("RETURN")) private void onRegister(CommandManager.RegistrationEnvironment arg, CallbackInfo ci) { AC_LOGGER.debug("onRegister"); dispatcher.register( literal("acron").requires(player -> player.hasPermissionLevel(4)).then( literal("rule").then( literal("update") .executes(new ConfigReloadCmd())) ) ); } @Inject(at = @At(value = "RETURN"), method = "execute") // Unfortunately we cannot inject into the catch blocks, so // a cursed approach would be always sending the result if we // haven't. public void execute(ServerCommandSource commandSource, String command, CallbackInfoReturnable cir) { if (commandSource instanceof CmdSrc src) { src.sendResultIfNot(); } } }