diff --git a/src/main/java/tools/redstone/redstonetools/features/commands/SilentCommandFeature.java b/src/main/java/tools/redstone/redstonetools/features/commands/SilentCommandFeature.java new file mode 100644 index 00000000..916b43c5 --- /dev/null +++ b/src/main/java/tools/redstone/redstonetools/features/commands/SilentCommandFeature.java @@ -0,0 +1,20 @@ +package tools.redstone.redstonetools.features.commands; + +import com.google.auto.service.AutoService; +import com.mojang.brigadier.CommandDispatcher; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import tools.redstone.redstonetools.features.AbstractFeature; +import tools.redstone.redstonetools.features.Feature; +@AutoService(AbstractFeature.class) +@Feature(name = "Silent", description = "allows you to use commands without output", command = "silent") +public class SilentCommandFeature extends AbstractFeature{ + + @Override + protected void registerCommands(CommandDispatcher dispatcher, boolean dedicated) { + var commandManager = CommandManager.literal("silent").redirect(dispatcher.getRoot()).executes( context -> { + return 1; + }); + dispatcher.register(commandManager); + } +} diff --git a/src/main/java/tools/redstone/redstonetools/macros/Macro.java b/src/main/java/tools/redstone/redstonetools/macros/Macro.java index 2e30e36e..28798749 100644 --- a/src/main/java/tools/redstone/redstonetools/macros/Macro.java +++ b/src/main/java/tools/redstone/redstonetools/macros/Macro.java @@ -15,29 +15,31 @@ public class Macro { public static Macro buildEmpty() { - return new Macro("",true,InputUtil.UNKNOWN_KEY,new ArrayList<>()); + return new Macro("",true,InputUtil.UNKNOWN_KEY, new ArrayList<>(), true); } private KeyBinding keyBinding; public String name; private Key key; public boolean enabled; + public boolean output; public List actions; private final Macro original; - public Macro(String name, boolean enabled, Key key, List actions) { - this(name,enabled,key,actions,null); + public Macro(String name, boolean enabled, Key key, List actions, boolean output) { + this(name,enabled,key,actions,output,null); keyBinding = new KeyBinding("macro." + System.nanoTime(),-1,"macros"); registerKeyBinding(); changeKeyBindingKeyCode(); } - public Macro(String name, boolean enabled, Key key, List actions, Macro original) { + public Macro(String name, boolean enabled, Key key, List actions, boolean output, Macro original) { this.name = name; this.enabled = enabled; this.key = key; this.actions = actions; + this.output = output; this.original = original; } @@ -59,7 +61,13 @@ public void run() { } for (Action action : actions) { - action.run(); + if (output){ + action.run(); + } + else{ + action.runSilent(); + } + } } @@ -70,6 +78,7 @@ public void applyChangesToOriginal() { original.enabled = enabled; original.setKey(key); original.actions = new ArrayList<>(actions); + original.output = output; } public boolean isCopy(){ @@ -99,7 +108,7 @@ public Key getKey(){ } public Macro createCopy() { - return new Macro(name,enabled,key,new ArrayList<>(actions),this); + return new Macro(name,enabled,key,new ArrayList<>(actions),output,this); } public void unregisterKeyBinding(){ @@ -123,7 +132,7 @@ public boolean equals(Object obj) { if (!actions.get(i).equals(macro.actions.get(i))) return false; } - return macro.name.equals(name) && macro.key.equals(key) && macro.enabled == enabled; + return macro.name.equals(name) && macro.key.equals(key) && macro.enabled == enabled && macro.output == output; } return super.equals(obj); diff --git a/src/main/java/tools/redstone/redstonetools/macros/MacroManager.java b/src/main/java/tools/redstone/redstonetools/macros/MacroManager.java index 95b1f0cf..2719040c 100644 --- a/src/main/java/tools/redstone/redstonetools/macros/MacroManager.java +++ b/src/main/java/tools/redstone/redstonetools/macros/MacroManager.java @@ -2,6 +2,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.util.InputUtil; +import tools.redstone.redstonetools.RedstoneToolsClient; import tools.redstone.redstonetools.macros.actions.Action; import tools.redstone.redstonetools.macros.actions.CommandAction; @@ -104,6 +105,7 @@ private JsonObject getMacroJson(Macro macro) { return Json.createObjectBuilder() .add("name", macro.name) .add("enabled", macro.enabled) + .add("output", macro.output) .add("key", macro.getKey().getTranslationKey()) .add("actions", actionsJson) .build(); @@ -141,7 +143,7 @@ private Macro createCommandMacro(String name, String[] commands) { actions[i] = new CommandAction(commands[i]); } - return new Macro(name, true, InputUtil.UNKNOWN_KEY, List.of(actions)); + return new Macro(name, true, InputUtil.UNKNOWN_KEY, List.of(actions), true); } private List getMacrosFromJson(JsonArray macrosJson) { @@ -157,10 +159,11 @@ private List getMacrosFromJson(JsonArray macrosJson) { private Macro getMacroFromJson(JsonObject macroJson) { var name = macroJson.getString("name"); var enabled = macroJson.getBoolean("enabled"); + var output = macroJson.getBoolean("output"); var key = macroJson.getString("key"); var actions = getActionsFromJson(macroJson.getJsonArray("actions")); - return new Macro(name, enabled, InputUtil.fromTranslationKey(key), actions); + return new Macro(name, enabled, InputUtil.fromTranslationKey(key), actions, output); } private List getActionsFromJson(JsonArray actionsJson) { diff --git a/src/main/java/tools/redstone/redstonetools/macros/actions/Action.java b/src/main/java/tools/redstone/redstonetools/macros/actions/Action.java index 5cca93f1..ff6780c6 100644 --- a/src/main/java/tools/redstone/redstonetools/macros/actions/Action.java +++ b/src/main/java/tools/redstone/redstonetools/macros/actions/Action.java @@ -2,4 +2,5 @@ public abstract class Action { public abstract void run(); + public abstract void runSilent(); } diff --git a/src/main/java/tools/redstone/redstonetools/macros/actions/CommandAction.java b/src/main/java/tools/redstone/redstonetools/macros/actions/CommandAction.java index 6c680e74..5a732823 100644 --- a/src/main/java/tools/redstone/redstonetools/macros/actions/CommandAction.java +++ b/src/main/java/tools/redstone/redstonetools/macros/actions/CommandAction.java @@ -1,6 +1,8 @@ package tools.redstone.redstonetools.macros.actions; import net.minecraft.client.MinecraftClient; +import net.royawesome.jlibnoise.module.combiner.Min; +import tools.redstone.redstonetools.utils.CommandSourceUtils; public class CommandAction extends Action { public String command; @@ -17,6 +19,22 @@ public void run() { player.sendChatMessage(command.startsWith("/") ? command : "/" + command); } + @Override + public void runSilent(){ + MinecraftClient client = MinecraftClient.getInstance(); + if (!client.isIntegratedServerRunning()){ + run(); + return; + } + var player = MinecraftClient.getInstance().player; + assert player != null; + + if (command.startsWith("/")){ + command = command.replace("/", ""); + } + player.sendChatMessage("/" + "silent " + command); + } + @Override public boolean equals(Object obj) { if (obj instanceof CommandAction commandAction) { diff --git a/src/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroEditScreen.java b/src/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroEditScreen.java index 8ad466c9..9e99d2cb 100644 --- a/src/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroEditScreen.java +++ b/src/main/java/tools/redstone/redstonetools/macros/gui/screen/MacroEditScreen.java @@ -1,8 +1,8 @@ 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 net.minecraft.client.gui.widget.*; +import net.minecraft.loot.function.EnchantRandomlyLootFunction; import tools.redstone.redstonetools.macros.Macro; import tools.redstone.redstonetools.macros.MacroManager; import tools.redstone.redstonetools.macros.actions.Action; @@ -14,8 +14,6 @@ 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; @@ -39,7 +37,7 @@ public class MacroEditScreen extends GameOptionsScreen { private TextFieldWidget nameField; private ButtonWidget doneButton; private ButtonWidget keyBindButton; - + private CheckboxWidget outputToggle; private boolean overlapped = false; private boolean detectingKeycodeKey = false; @@ -94,7 +92,7 @@ public void init() { 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) -> { + keyBindButton = new ButtonWidget(this.width / 2 - 80, 55, 75, 20, text, (button) -> { detectingKeycodeKey = true; keyBindButton.setMessage((new LiteralText("> ")).append(keyBindButton.getMessage().shallowCopy().formatted(Formatting.YELLOW)).append(" <").formatted(Formatting.YELLOW)); }); @@ -130,6 +128,8 @@ public void init() { commandList.setScrollAmount(scrollAmount); this.addSelectableChild(commandList); + outputToggle = new CheckboxWidget(this.width / 2 + 168 - 20, 55, 20, 20, null, macro.output, false); + this.addDrawableChild(outputToggle); } private boolean canClickDone() { @@ -149,7 +149,8 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float 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); + drawCenteredText(matrices, this.textRenderer, "Key Bind", width / 2 - (168 - textRenderer.getWidth("Key Bind") / 2), 55 + textRenderer.fontHeight / 2, 16777215); + drawCenteredText(matrices, this.textRenderer, "Command Output", width / 2 + (textRenderer.getWidth("Command Output") / 2) + 5, 55+ textRenderer.fontHeight / 2, 16777215); nameField.render(matrices, mouseX, mouseY, delta); if (nameField.getText().isEmpty() && !nameField.isFocused()) { @@ -163,6 +164,7 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { public void tick() { nameField.tick(); commandList.tick(); + macro.output = outputToggle.isChecked(); super.tick(); } diff --git a/src/main/java/tools/redstone/redstonetools/mixin/macros/DisableCommandOutputMixin.java b/src/main/java/tools/redstone/redstonetools/mixin/macros/DisableCommandOutputMixin.java new file mode 100644 index 00000000..ee4c4111 --- /dev/null +++ b/src/main/java/tools/redstone/redstonetools/mixin/macros/DisableCommandOutputMixin.java @@ -0,0 +1,34 @@ +package tools.redstone.redstonetools.mixin.macros; + + +import net.minecraft.entity.Entity; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +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; + +@Mixin(CommandManager.class) +public abstract class DisableCommandOutputMixin { + + @Shadow public abstract int execute(ServerCommandSource commandSource, String command); + + @Inject(method = "execute", at=@At("HEAD"), cancellable = true) + public void execute(ServerCommandSource commandSource, String command, CallbackInfoReturnable cir){ + if (command.contains("/silent ")) { + command = command.replace("/silent ", ""); + System.out.println("silent "); + System.out.println(command); + command = command; + commandSource = commandSource.withSilent(); + + execute(commandSource, command); + cir.cancel(); + } + } + + +} diff --git a/src/main/resources/redstonetools.mixins.json b/src/main/resources/redstonetools.mixins.json index e896d6b0..26e6159b 100644 --- a/src/main/resources/redstonetools.mixins.json +++ b/src/main/resources/redstonetools.mixins.json @@ -13,6 +13,9 @@ "features.CopyStateMixin", "features.ItemBindMixin$ItemStackMixin", "gamerules.DoContainerDropsMixin", + "macros.DisableCommandOutputMixin", + "telemetry.SendCommandMixin", + "telemetry.ShowTelemetryPopupMixin" ], "client": [ "accessors.MinecraftClientAccessor",