diff --git a/src/datagen/java/codes/cookies/mod/datagen/lang/EnglishLanguageProvider.java b/src/datagen/java/codes/cookies/mod/datagen/lang/EnglishLanguageProvider.java index 25fddd14..72f954ea 100644 --- a/src/datagen/java/codes/cookies/mod/datagen/lang/EnglishLanguageProvider.java +++ b/src/datagen/java/codes/cookies/mod/datagen/lang/EnglishLanguageProvider.java @@ -630,6 +630,12 @@ private void addDungeonConfig(CookiesTranslationBuilder translationBuilder) { translationBuilder.addConfig(CONFIG_DUNGEON_GLOW_CLASS_COLOR, "Class based glow color",//"Glow teammates by class colors", "Overrides the default hypixel glowing by rank to glow by class color."); + translationBuilder.addConfig(CONFIG_DUNGEON_ANNOUNCE_LEAPS, + "Announce leaps", + "Announce who you leap to and their coords when you leap to a player using the custom leap ui."); + translationBuilder.addConfig(CONFIG_DUNGEON_ANNOUNCE_LEAP_COORDS, + "Announce coords", + "Announce the coords of the player you leap to as well."); translationBuilder.addConfig(CONFIG_DUNGEON_CLASS_COLOR, "Class colors", "The colors used for every class"); @@ -667,6 +673,9 @@ private void addDungeonConfig(CookiesTranslationBuilder translationBuilder) { translationBuilder.addConfig(CONFIG_DUNGEON_TERMINAL_STARTS_WITH_TERMINAL, "Starts with", "Enables the starts with solver."); + translationBuilder.addConfig(CONFIG_DUNGEON_TERMINAL_MELODY_NOTIFIER, + "Melody notifier", + "Enables chat messages that are sent when you begin melody, when you complete each row, and when you finish."); translationBuilder.addConfig(CONFIG_DUNGEON_PUZZLE, "Puzzles", "All settings related to puzzles."); translationBuilder.addConfig(CONFIG_DUNGEON_PUZZLE_CREEPER_BEAMS_SOLVER, "Creeper Beams", @@ -688,5 +697,24 @@ private void addDungeonConfig(CookiesTranslationBuilder translationBuilder) { Furthermore thank you to drek1984, Jade and bonsai which where helping Desco1 with the original and as well skytils for parts of the original solver."""); + + translationBuilder.addConfig(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS, "Chat Commands", "All of the party chat commands."); + translationBuilder.addConfig(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_PT_ME, + "Party Transfer", + "Enables the !ptme command that transfers the party to the player that ran the command."); + translationBuilder.addConfig(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_WARP, + "Party Warp", + "Enables the !warp command, running /p warp."); + translationBuilder.addConfig(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_JOIN_INSTANCE, + "Join Instance", + """ + Enables the joininstance command, which is run using !f/!m or !t, followed by the floor/kuudra tier number. ex: !f7. + Runs /joininstance based on the provided floor/kuudra tier, if you are not in an existing instance."""); + translationBuilder.addConfig(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_DOWN_TIME, + "Downtime", + "Enables the !dt command, allowing players to request downtime at the end of a run."); + translationBuilder.addConfig(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_COIN_FLIP, + "Coin flip", + "Enables the !cf command, allowing players to flip a coin, sends heads or tails to party chat."); } } diff --git a/src/main/generated/.cache/cabcb80d088276cffde41e74584028f1c00b99b8 b/src/main/generated/.cache/cabcb80d088276cffde41e74584028f1c00b99b8 index 08a5164d..fdfe85fc 100644 --- a/src/main/generated/.cache/cabcb80d088276cffde41e74584028f1c00b99b8 +++ b/src/main/generated/.cache/cabcb80d088276cffde41e74584028f1c00b99b8 @@ -1,2 +1,2 @@ -// 1.21.3 2024-12-11T11:17:47.4766913 cookies-mod/Language (en_us) -b8e506abeadfabc1b260c9088e803802d2607fc9 assets\cookies-mod\lang\en_us.json +// 1.21.3 2024-12-23T13:05:01.4950796 cookies-mod/Language (en_us) +221fcc1e2c7a96aab55552e72cd228815baa08ea assets\cookies-mod\lang\en_us.json diff --git a/src/main/generated/assets/cookies-mod/lang/en_us.json b/src/main/generated/assets/cookies-mod/lang/en_us.json index 2351fb3d..02eb7467 100644 --- a/src/main/generated/assets/cookies-mod/lang/en_us.json +++ b/src/main/generated/assets/cookies-mod/lang/en_us.json @@ -89,7 +89,23 @@ "cookies.config.dev.show_plot_price_breakdown.name": "Plot price breakdown", "cookies.config.dev.show_plot_price_breakdown.tooltip": "Shows a breakdown of how much compost you need to unlock all plots.", "cookies.config.dev.tooltip": "Development related config entries.", + "cookies.config.dungeon.announce_leap_coords.name": "Announce coords", + "cookies.config.dungeon.announce_leap_coords.tooltip": "Announce the coords of the player you leap to as well.", + "cookies.config.dungeon.announce_leaps.name": "Announce leaps", + "cookies.config.dungeon.announce_leaps.tooltip": "Announce who you leap to and their coords when you leap to a player using the custom leap ui.", "cookies.config.dungeon.name": "Dungeon Config", + "cookies.config.dungeon.party_chat_commands.coin_flip.name": "Coin flip", + "cookies.config.dungeon.party_chat_commands.coin_flip.tooltip": "Enables the !cf command, allowing players to flip a coin, sends heads or tails to party chat.", + "cookies.config.dungeon.party_chat_commands.down_time.name": "Downtime", + "cookies.config.dungeon.party_chat_commands.down_time.tooltip": "Enables the !dt command, allowing players to request downtime at the end of a run.", + "cookies.config.dungeon.party_chat_commands.join_instance.name": "Join Instance", + "cookies.config.dungeon.party_chat_commands.join_instance.tooltip": "Enables the joininstance command, which is run using !f/!m or !t, followed by the floor/kuudra tier number. ex: !f7.\nRuns /joininstance based on the provided floor/kuudra tier, if you are not in an existing instance.", + "cookies.config.dungeon.party_chat_commands.name": "Chat Commands", + "cookies.config.dungeon.party_chat_commands.pt_me.name": "Party Transfer", + "cookies.config.dungeon.party_chat_commands.pt_me.tooltip": "Enables the !ptme command that transfers the party to the player that ran the command.", + "cookies.config.dungeon.party_chat_commands.tooltip": "All of the party chat commands.", + "cookies.config.dungeon.party_chat_commands.warp.name": "Party Warp", + "cookies.config.dungeon.party_chat_commands.warp.tooltip": "Enables the !warp command, running /p warp.", "cookies.config.dungeon.player_glow_by_class_color.name": "Class based glow color", "cookies.config.dungeon.player_glow_by_class_color.tooltip": "Overrides the default hypixel glowing by rank to glow by class color.", "cookies.config.dungeon.puzzle.creeper_beams.name": "Creeper Beams", @@ -173,6 +189,8 @@ "cookies.config.dungeon.terminal.click_in_order.tooltip": "Enables the click in order solver.", "cookies.config.dungeon.terminal.correct_all_panes.name": "Correct all panes", "cookies.config.dungeon.terminal.correct_all_panes.tooltip": "Enables the correct all panes solver.", + "cookies.config.dungeon.terminal.melody_notifier.name": "Melody notifier", + "cookies.config.dungeon.terminal.melody_notifier.tooltip": "Enables chat messages that are sent when you begin melody, when you complete each row, and when you finish.", "cookies.config.dungeon.terminal.name": "Terminals", "cookies.config.dungeon.terminal.prevent_miss_clicks.name": "Prevent Missclicks", "cookies.config.dungeon.terminal.prevent_miss_clicks.tooltip": "Prevents you from clicking wrong options.", @@ -480,4 +498,4 @@ "cookies.unexpected_error": "An unexpected error occurred while executing the command!", "cookies.update_available": "Your version of the mod isn't up-to-date!", "cookies.update_modrinth": "(Click here to open modrinth)" -} +} \ No newline at end of file diff --git a/src/main/java/codes/cookies/mod/CookiesMod.java b/src/main/java/codes/cookies/mod/CookiesMod.java index 7d193a2d..a50caa48 100644 --- a/src/main/java/codes/cookies/mod/CookiesMod.java +++ b/src/main/java/codes/cookies/mod/CookiesMod.java @@ -53,6 +53,7 @@ public class CookiesMod implements ClientModInitializer { public static KeyBinding chestSearch; private static KeyBinding useGardenKeybinds; + public static KeyBinding pasteCommandFromClipboard; @Getter private static final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(4); @@ -72,7 +73,11 @@ public static void openScreen(Screen screen) { MinecraftClient.getInstance().send(() -> MinecraftClient.getInstance().setScreen(screen)); } - @Override + public static void pasteCommand() { + + } + + @Override public void onInitializeClient() { CommandManager.initialize(); CookieDataManager.load(); @@ -85,7 +90,8 @@ public void onInitializeClient() { Features.load(); CommandManager.addCommands(new OpenConfigCommand(), new DevCommand(), new CookieCommand(), new ViewForgeRecipeCommand()); CommandManager.addCommands(RepositoryConstants.warps.getWarps().entrySet().stream().map(WarpCommand::new).toArray(WarpCommand[]::new)); - UpdateChecker.init(); + + UpdateChecker.init(); PlayerListUtils.init(); HudManager.load(); CrystalStatusService.register(); @@ -102,6 +108,10 @@ private void registerKeyBindings() { InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_K, "cookies.mod.keybinds")); + pasteCommandFromClipboard = KeyBindingHelper.registerKeyBinding(new KeyBinding("cookies.mod.paste_command", + InputUtil.Type.KEYSYM, + GLFW.GLFW_KEY_UNKNOWN, + "cookies.mod.keybinds")); ClientTickEvents.END_CLIENT_TICK.register(client -> { if (chestSearch.isPressed()) { @@ -115,6 +125,13 @@ private void registerKeyBindings() { } CookiesUtils.sendMessage(Text.translatable("cookies.mod.garden.keybinds." + (GardenKeybindPredicate.keyBindToggle ? "enabled" : "disabled")), false); } + while (pasteCommandFromClipboard.wasPressed()) { + var message = client.keyboard.getClipboard(); + + if (message != null && message.startsWith("/")) { + CookiesUtils.getPlayer().map(player -> player.networkHandler.sendCommand(message.substring(1))); + } + } }); } diff --git a/src/main/java/codes/cookies/mod/config/categories/DungeonConfig.java b/src/main/java/codes/cookies/mod/config/categories/DungeonConfig.java index a342b9f7..09b006b6 100644 --- a/src/main/java/codes/cookies/mod/config/categories/DungeonConfig.java +++ b/src/main/java/codes/cookies/mod/config/categories/DungeonConfig.java @@ -1,12 +1,18 @@ package codes.cookies.mod.config.categories; import codes.cookies.mod.config.system.HudSetting; +import codes.cookies.mod.config.system.Option; import codes.cookies.mod.config.system.Parent; import codes.cookies.mod.features.dungeons.map.DungeonMapHud; import codes.cookies.mod.render.hud.HudEditScreen; import codes.cookies.mod.utils.cookies.Constants; import java.awt.Color; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import codes.cookies.mod.CookiesMod; import codes.cookies.mod.config.ConfigManager; @@ -46,6 +52,7 @@ public DungeonConfig() { public PuzzleFoldable puzzleFoldable = new PuzzleFoldable(); public ClassColorFoldable classColorFoldable = new ClassColorFoldable(); public BooleanOption glowClassColor = new BooleanOption(CONFIG_DUNGEON_GLOW_CLASS_COLOR, true); + public PartyChatCommandsFoldable partyChatCommandsFoldable = new PartyChatCommandsFoldable(); public TextDisplayOption render = new TextDisplayOption(CONFIG_DUNGEON_RENDER); public ButtonOption repositionMap = new ButtonOption(CONFIG_DUNGEON_RENDER_MAP_REPOSITION, @@ -110,6 +117,8 @@ public String getName() { public static class SpiritLeapFoldable extends Foldable { public BooleanOption colorInClassColor = new BooleanOption(CONFIG_DUNGEON_SPIRIT_LEAP_USE_CLASS_COLOR, false); + public BooleanOption announceLeaps = new BooleanOption(CONFIG_DUNGEON_ANNOUNCE_LEAPS, true); + public BooleanOption announceLeapCoords = new BooleanOption(CONFIG_DUNGEON_ANNOUNCE_LEAP_COORDS, false).onlyIf(announceLeaps); @Parent public TextDisplayOption vanillaUi = new TextDisplayOption(CONFIG_DUNGEON_SPIRIT_LEAP_VANILLA); @@ -158,6 +167,8 @@ public static class TerminalFoldable extends Foldable { new BooleanOption(CONFIG_DUNGEON_TERMINAL_SELECT_ALL_COLORS, true); public BooleanOption startsWithTerminal = new BooleanOption(CONFIG_DUNGEON_TERMINAL_STARTS_WITH_TERMINAL, true); + public BooleanOption melodyNotifier = new BooleanOption(CONFIG_DUNGEON_TERMINAL_MELODY_NOTIFIER, true); + @Override public String getName() { @@ -165,4 +176,18 @@ public String getName() { } } + public static class PartyChatCommandsFoldable extends Foldable { + public BooleanOption ptMe = new BooleanOption(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_PT_ME, true); + public BooleanOption warp = new BooleanOption(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_WARP, true); + public BooleanOption joinInstance = new BooleanOption(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_JOIN_INSTANCE, true); + public BooleanOption downTime = new BooleanOption(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_DOWN_TIME, true); + public BooleanOption coinFlip = new BooleanOption(CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_COIN_FLIP, true); + + public Map partyChatCommands = Map.of("ptme", ptMe, "warp", warp, "joininstance", joinInstance, "dt", downTime, "cf", coinFlip); + + @Override + public String getName() { + return CONFIG_DUNGEON_PARTY_CHAT_COMMANDS; + } + } } diff --git a/src/main/java/codes/cookies/mod/events/ChatListener.java b/src/main/java/codes/cookies/mod/events/ChatListener.java index 48bae0d1..81fe0a89 100644 --- a/src/main/java/codes/cookies/mod/events/ChatListener.java +++ b/src/main/java/codes/cookies/mod/events/ChatListener.java @@ -51,5 +51,4 @@ public static void lookForProfileIdMessage(Text text, boolean overlay) { } } } - } diff --git a/src/main/java/codes/cookies/mod/features/dungeons/DungeonFeatures.java b/src/main/java/codes/cookies/mod/features/dungeons/DungeonFeatures.java index 3fd867fe..e29658f1 100644 --- a/src/main/java/codes/cookies/mod/features/dungeons/DungeonFeatures.java +++ b/src/main/java/codes/cookies/mod/features/dungeons/DungeonFeatures.java @@ -1,6 +1,7 @@ package codes.cookies.mod.features.dungeons; import codes.cookies.mod.features.dungeons.map.DungeonMapHud; +import codes.cookies.mod.features.dungeons.solver.terminals.MelodyTerminalSolver; import codes.cookies.mod.render.hud.HudManager; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -73,7 +74,9 @@ public DungeonFeatures() { new ClickInOrderTerminalSolver(); new CorrectAllThePanesTerminalSolver(); new ChangeAllToSameColorTerminalSolver(); + new MelodyTerminalSolver(); SpiritLeapOverlay.init(this); + HudManager.register(DungeonMapHud.getInstance()); } diff --git a/src/main/java/codes/cookies/mod/features/dungeons/SpiritLeapOverlay.java b/src/main/java/codes/cookies/mod/features/dungeons/SpiritLeapOverlay.java index 6a691b8c..393f9397 100644 --- a/src/main/java/codes/cookies/mod/features/dungeons/SpiritLeapOverlay.java +++ b/src/main/java/codes/cookies/mod/features/dungeons/SpiritLeapOverlay.java @@ -10,6 +10,7 @@ import java.util.OptionalInt; import codes.cookies.mod.features.dungeons.map.DungeonMapHud; +import codes.cookies.mod.utils.skyblock.ChatUtils; import com.google.common.base.Predicates; import codes.cookies.mod.config.categories.DungeonConfig; import codes.cookies.mod.events.InventoryEvents; @@ -273,7 +274,7 @@ private boolean mouseClicked(Screen screen, double mouseX, double mouseY, int bu player.location.y, player.location.width, player.location.height)) { - clickedPlayer(player.slot); + clickedPlayer(player.slot, player.dungeonPlayer()); break; } } @@ -381,13 +382,22 @@ private void setPlayers() { } } - public void clickedPlayer(Slot slot) { + public void clickedPlayer(Slot slot, @Nullable DungeonPlayer player) { MinecraftClient.getInstance().interactionManager.clickSlot( this.handledScreen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, MinecraftClient.getInstance().player); + if (player != null && DungeonConfig.getInstance().spiritLeapFoldable.announceLeaps.getValue()) { + StringBuilder message = new StringBuilder("Leaped to "); + message.append(player.getName()); + if (player.getPlayer() != null && DungeonConfig.getInstance().spiritLeapFoldable.announceLeapCoords.getValue()) { + message.append(" at coords ").append(player.getPlayer().getBlockPos().toCenterPos().toString()); + } + message.append("!"); + ChatUtils.sendPartyMessage(message.toString()); + } } private boolean modifyNormalIfAvailable() { @@ -430,7 +440,7 @@ private Result setClass( handledScreen.close(); CookiesUtils.sendFailedMessage("Can't leap to yourself!"); } else { - clickedPlayer(leapPlayer.slot); + clickedPlayer(leapPlayer.slot, dungeonPlayer); } }); diff --git a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/ChangeAllToSameColorTerminalSolver.java b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/ChangeAllToSameColorTerminalSolver.java index cf2bf227..efde8aee 100644 --- a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/ChangeAllToSameColorTerminalSolver.java +++ b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/ChangeAllToSameColorTerminalSolver.java @@ -28,7 +28,7 @@ public class ChangeAllToSameColorTerminalSolver extends TerminalSolver { public ChangeAllToSameColorTerminalSolver() { InventoryEvents.beforeInit("Change all to same color!", - super.getFloorPredicate().or(super.getDebugPredicate()), + getFloorPredicate().or(getDebugPredicate()), this::modify); } diff --git a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/ClickInOrderTerminalSolver.java b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/ClickInOrderTerminalSolver.java index 43f44155..11608f4e 100644 --- a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/ClickInOrderTerminalSolver.java +++ b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/ClickInOrderTerminalSolver.java @@ -25,7 +25,7 @@ public class ClickInOrderTerminalSolver extends TerminalSolver { public ClickInOrderTerminalSolver() { InventoryEvents.beforeInit("Click in order!", - super.getFloorPredicate().or(super.getDebugPredicate()), + getFloorPredicate().or(getDebugPredicate()), this::modify); } @@ -67,7 +67,7 @@ private void update(int slot, ItemStack stack) { return; } - if (!(stack.getItem() == Items.RED_STAINED_GLASS_PANE)) { + if (stack.getItem() != Items.RED_STAINED_GLASS_PANE) { stack.set(MiscDataComponentTypes.TERMINAL_SOLVER_MODIFIED, this.doneItem); return; } diff --git a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/CorrectAllThePanesTerminalSolver.java b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/CorrectAllThePanesTerminalSolver.java index efd35a54..be513dba 100644 --- a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/CorrectAllThePanesTerminalSolver.java +++ b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/CorrectAllThePanesTerminalSolver.java @@ -15,7 +15,7 @@ public class CorrectAllThePanesTerminalSolver extends TerminalSolver { public CorrectAllThePanesTerminalSolver() { InventoryEvents.beforeInit("Correct all the panes!", - super.getFloorPredicate().or(super.getDebugPredicate()), + getFloorPredicate().or(getDebugPredicate()), this::modify); } @@ -36,6 +36,7 @@ private void update(int slot, ItemStack stack) { this.items.clear(); } this.items.add(stack); + if (slot == 44) { stack.set(MiscDataComponentTypes.TERMINAL_SOLVER_TOGGLE, Unit.INSTANCE); if (this.localToggle) { diff --git a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/MelodyTerminalSolver.java b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/MelodyTerminalSolver.java new file mode 100644 index 00000000..12ffe142 --- /dev/null +++ b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/MelodyTerminalSolver.java @@ -0,0 +1,186 @@ +package codes.cookies.mod.features.dungeons.solver.terminals; + +import codes.cookies.mod.config.categories.DungeonConfig; +import codes.cookies.mod.events.InventoryEvents; + +import codes.cookies.mod.events.api.InventoryContentUpdateEvent; + +import codes.cookies.mod.utils.accessors.SlotAccessor; +import codes.cookies.mod.utils.cookies.CookiesUtils; +import codes.cookies.mod.utils.items.CookiesDataComponentTypes; +import codes.cookies.mod.utils.items.types.MiscDataComponentTypes; +import codes.cookies.mod.utils.skyblock.ChatUtils; + +import com.google.common.util.concurrent.Runnables; + +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; + +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.texture.TextureStitcher; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.slot.Slot; +import net.minecraft.util.Unit; + +import java.util.ArrayList; + +public class MelodyTerminalSolver extends TerminalSolver { + private final ItemStack blockedInput = this.doneItem.copy().withItem(Items.BARRIER); + private int currentColumn = -1; + private int correctColumn = -1; + + + private final boolean[] percentagesAnnounced = new boolean[4]; + + public MelodyTerminalSolver() { + InventoryEvents.beforeInit("Click the button on time!", + getFloorPredicate().or(getDebugPredicate()), + this::modify); + } + + private void modify(HandledScreen handledScreen) { + if (!DungeonConfig.getInstance().terminalFoldable.melodyNotifier.getValue()) { + return; + } + + ScreenEvents.remove(handledScreen).register((screen) -> { + if (percentagesAnnounced[3]) + melodyNotify("Melody Terminal complete!"); + else + melodyNotify("Melody closed without completion???"); + + CookiesUtils.sendMessage("Melody Terminal reset!"); + percentagesAnnounced[0] = false; + percentagesAnnounced[1] = false; + percentagesAnnounced[2] = false; + percentagesAnnounced[3] = false; + this.clear(); + this.items.clear(); + this.slots.clear(); + currentColumn = -1; + correctColumn = -1; + }); + + openNewTerminal(); + + InventoryContentUpdateEvent.register(handledScreen.getScreenHandler(), (slot, stack) -> { + this.update(slot, stack, handledScreen.getScreenHandler()); + }); + } + + @Override + public void openNewTerminal() { + super.openNewTerminal(); + if (DungeonConfig.getInstance().terminalFoldable.preventMissclicks.getValue()) { + this.blockedInput.set(CookiesDataComponentTypes.ITEM_CLICK_RUNNABLE, Runnables.doNothing()); + } else { + this.blockedInput.remove(CookiesDataComponentTypes.ITEM_CLICK_RUNNABLE); + } + melodyNotify("Melody Terminal start!"); + } + + private static void melodyNotify(String message) { + if (DungeonConfig.getInstance().terminalFoldable.melodyNotifier.getValue()) { + ChatUtils.sendPartyMessage(message); + } + } + + @Override + public void setItems() { + super.setItems(); + if (!this.localToggle) + { + return; + } + for (var slot : slots) + { + SlotAccessor.setInteractionLocked(slot, false); + SlotAccessor.setItem(slot, null); + } + } + + private ArrayList slots = new ArrayList<>(); + + private void update(int slot, ItemStack stack, ScreenHandler handler) { + if (slot > 53) { + return; + } + + this.items.add(stack); + slots.add(handler.getSlot(slot)); + + if (slot == 53) { + stack.set(MiscDataComponentTypes.TERMINAL_SOLVER_TOGGLE, Unit.INSTANCE); + if (this.localToggle) { + stack.set(CookiesDataComponentTypes.OVERRIDE_ITEM, this.toggleOff); + } else { + stack.set(CookiesDataComponentTypes.OVERRIDE_ITEM, this.toggleOn); + } + if (this.localToggle) { + this.setItems(); + } + return; + } + + if (slot % 9 == 0 || slot % 9 == 6 || slot % 9 == 8) + { + return; + } + + if (stack.isOf(Items.LIME_STAINED_GLASS_PANE)) + { + int row = (slot / 9) - 1; + currentColumn = slot % 9; + + if (this.localToggle && row > 0 && !percentagesAnnounced[row]) + { + melodyNotify("Melody is " + String.format("%.0f%%", (row/4f)*100) + " (" + row +"/4) complete!"); + percentagesAnnounced[row] = true; + } + + var selectedSlot = handler.getSlot(slot + (7 - currentColumn)); + + if (!this.localToggle) + { + SlotAccessor.setInteractionLocked(selectedSlot, false); + SlotAccessor.setItem(selectedSlot, null); + return; + } + + if (currentColumn == correctColumn) + { + SlotAccessor.setInteractionLocked(selectedSlot, false); + SlotAccessor.setItem(selectedSlot, null); + } + else + { + SlotAccessor.setInteractionLocked(selectedSlot, true); + SlotAccessor.setItem(selectedSlot, this.blockedInput); + } + + return; + } + + if (stack.isOf(Items.MAGENTA_STAINED_GLASS_PANE)) + { + correctColumn = slot % 9; + return; + } + + if (stack.isOf(Items.LIME_TERRACOTTA) && this.localToggle) + { + if (currentColumn == correctColumn) + { + SlotAccessor.setInteractionLocked(handler.getSlot(slot), false); + SlotAccessor.setItem(handler.getSlot(slot), null); + } + else + { + SlotAccessor.setInteractionLocked(handler.getSlot(slot), true); + SlotAccessor.setItem(handler.getSlot(slot), this.blockedInput); + } + } + } +} diff --git a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/SelectAllColorsTerminalSolver.java b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/SelectAllColorsTerminalSolver.java index 81caf390..664da987 100644 --- a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/SelectAllColorsTerminalSolver.java +++ b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/SelectAllColorsTerminalSolver.java @@ -19,7 +19,7 @@ public class SelectAllColorsTerminalSolver extends TerminalSolver { public SelectAllColorsTerminalSolver() { InventoryEvents.beforeInit( "cookies-regex:Select all the .*? items!", - super.getFloorPredicate().or(super.getDebugPredicate()), + getFloorPredicate().or(getDebugPredicate()), this::modify); } diff --git a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/StartsWithTerminalSolver.java b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/StartsWithTerminalSolver.java index e222e489..bf3e70ca 100644 --- a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/StartsWithTerminalSolver.java +++ b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/StartsWithTerminalSolver.java @@ -29,7 +29,7 @@ public class StartsWithTerminalSolver extends TerminalSolver { public StartsWithTerminalSolver() { InventoryEvents.beforeInit( "cookies-regex:What starts with: '.'\\?", - super.getFloorPredicate().or(super.getDebugPredicate()), + getFloorPredicate().or(getDebugPredicate()), this::modify); } diff --git a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/TerminalSolver.java b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/TerminalSolver.java index 31f016bd..f891ca95 100644 --- a/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/TerminalSolver.java +++ b/src/main/java/codes/cookies/mod/features/dungeons/solver/terminals/TerminalSolver.java @@ -81,14 +81,14 @@ public void setItems() { } } - protected Predicate> getFloorPredicate() { + protected static Predicate> getFloorPredicate() { return Predicates.>alwaysTrue() .and(o -> DungeonFeatures.getInstance().getCurrentInstance().isPresent()) .and(o -> DungeonFeatures.getInstance().getCurrentInstance().map(DungeonInstance::floor).orElse(-1) == 7) .and(o -> DungeonFeatures.getInstance().getCurrentInstance().map(DungeonInstance::getPhase).orElse(null) == DungeonPhase.BOSS); } - protected Predicate> getDebugPredicate() { + protected static Predicate> getDebugPredicate() { return t -> DevUtils.isEnabled(TerminalSolver.DEBUG); } diff --git a/src/main/java/codes/cookies/mod/features/misc/MiscFeatures.java b/src/main/java/codes/cookies/mod/features/misc/MiscFeatures.java index 3fa91364..89ae29e6 100644 --- a/src/main/java/codes/cookies/mod/features/misc/MiscFeatures.java +++ b/src/main/java/codes/cookies/mod/features/misc/MiscFeatures.java @@ -19,6 +19,7 @@ static void load() { Loader.load("PingDisplay", PingDisplay::load); Loader.load("TimerFeatures", NotificationManager::register); Loader.load("GlowingMushroomHighlight", GlowingMushroomHighlights::register); + Loader.load("PartyCommands", PartyCommandsFeature::register); } diff --git a/src/main/java/codes/cookies/mod/features/misc/PartyCommandsFeature.java b/src/main/java/codes/cookies/mod/features/misc/PartyCommandsFeature.java new file mode 100644 index 00000000..74a4e8da --- /dev/null +++ b/src/main/java/codes/cookies/mod/features/misc/PartyCommandsFeature.java @@ -0,0 +1,207 @@ +package codes.cookies.mod.features.misc; + +import codes.cookies.mod.config.ConfigManager; +import codes.cookies.mod.config.categories.DungeonConfig; +import codes.cookies.mod.config.system.Option; +import codes.cookies.mod.events.ChatMessageEvents; + +import codes.cookies.mod.generated.Regions; +import codes.cookies.mod.utils.cookies.CookiesUtils; +import codes.cookies.mod.utils.skyblock.ChatUtils; +import codes.cookies.mod.utils.skyblock.LocationUtils; +import codes.cookies.mod.utils.skyblock.PartyUtils; + +import lombok.Getter; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.Map; +import java.util.Optional; +import java.util.Random; +import java.util.function.BiConsumer; +import java.util.function.Predicate; +import java.util.function.Supplier; + +import static java.util.Map.entry; + +public class PartyCommandsFeature { + public static void register() { + ChatMessageEvents.BEFORE_MODIFY.register(PartyCommandsFeature::handleChat); + } + + private static final Random random = new Random(); + + private static final Map, PartyCommand> Commands = Map.ofEntries( + entry(command -> command.equals("ptme"), new PartyCommand(() -> PartyCommandsFeature.shouldRunCommand("ptme"), (command, message) -> { + var sender = getSender(message); + if (sender.equals(MinecraftClient.getInstance().getSession().getUsername())) + return; + CookiesUtils.sendCommand("p transfer " + sender); + })), + entry(command -> command.equals("warp"), new PartyCommand(() -> PartyCommandsFeature.shouldRunCommand("warp"), (command, message) -> { + CookiesUtils.sendCommand("p warp"); + })), + entry(command ->{ + //only match f[1-7], m[1-7], and t[1-5] + return command.matches("f[1-7]|m[1-7]|t[1-5]"); + }, new PartyCommand(() -> PartyCommandsFeature.shouldRunCommand("joinInstance"), (command, message) -> { + StringBuilder joinInstanceCommand = new StringBuilder("joininstance "); + switch (command.charAt(0)) { + case 'f' -> joinInstanceCommand.append("CATACOMBS_FLOOR_"); + case 'm' -> joinInstanceCommand.append("MASTER_CATACOMBS_FLOOR_"); + case 't' -> { + joinInstanceCommand.append("KUUDRA_"); + switch (command.charAt(1)) { + case '1' -> joinInstanceCommand.append("BASIC"); + case '2' -> joinInstanceCommand.append("HOT"); + case '3' -> joinInstanceCommand.append("BURNING"); + case '4' -> joinInstanceCommand.append("FIERY"); + case '5' -> joinInstanceCommand.append("INFERNAL"); + } + CookiesUtils.sendCommand(joinInstanceCommand.toString()); + return; + } + } + + switch (command.charAt(1)) { + case '1' -> joinInstanceCommand.append("ONE"); + case '2' -> joinInstanceCommand.append("TWO"); + case '3' -> joinInstanceCommand.append("THREE"); + case '4' -> joinInstanceCommand.append("FOUR"); + case '5' -> joinInstanceCommand.append("FIVE"); + case '6' -> joinInstanceCommand.append("SIX"); + case '7' -> joinInstanceCommand.append("SEVEN"); + } + + CookiesUtils.sendCommand(joinInstanceCommand.toString()); + })), + entry(command -> command.startsWith("dt"), new DownTimeCommand(() -> PartyCommandsFeature.shouldRunCommand("dt"), null)), + entry(command -> command.equals("cf"), new PartyCommand(() -> PartyCommandsFeature.shouldRunCommand("cf"), (command, message) -> { + if (random.nextBoolean()) { + ChatUtils.sendPartyMessage("HEADS!"); + } else { + ChatUtils.sendPartyMessage("TAILS!"); + } + })) + ); + + private static boolean shouldRunCommand(String partyCommand) { + PartyUtils.request(); + var player = CookiesUtils.getPlayer(); + if (partyCommand.matches("f[1-7]|m[1-7]|t[1-5]")) { + partyCommand = "joininstance"; + } + return Optional.ofNullable(DungeonConfig.getInstance().partyChatCommandsFoldable.partyChatCommands.get(partyCommand)).map(Option::getValue).orElse(true) && player.filter(clientPlayerEntity -> PartyUtils.isInParty() && PartyUtils.getPartyLeader().equals(clientPlayerEntity.getUuid())).isPresent(); + } + + private static void handleChat(Text text, boolean b) { + if (b) return; + var message = text.getString(); + + if (!message.startsWith("§9Party §8> ")) return; + + var commandString = CookiesUtils.stripColor(message.substring(message.indexOf(": !") + 3).trim()); + + var command = Commands.entrySet().stream().filter(commandEntry -> commandEntry.getKey().test(commandString)).findFirst(); + + if (command.isPresent()) { + if (command.get().getValue().getPredicate().get()) { + var action = command.get().getValue().getAction(); + if (action != null) { + action.accept(commandString, message); + } + } + } + } + + private static String getSender(String message) { + var sender = message.substring(message.indexOf("§8> ") + 4, message.indexOf(":")).trim(); + int rank = sender.indexOf("]"); + if (rank != -1) { + sender = sender.substring(rank + 1).trim(); + } + + sender = CookiesUtils.stripColor(sender); + return sender; + } + + + @Getter + public static class PartyCommand { + private final Supplier predicate; + protected BiConsumer action; + + public PartyCommand(Supplier predicate, BiConsumer action) { + this.predicate = predicate; + this.action = action; + } + } + + public static class DownTimeCommand extends PartyCommand + { + private final ArrayList downTimesThisInstance = new ArrayList<>(); + + public DownTimeCommand(Supplier predicate, BiConsumer action) { + super( predicate, action); + ChatMessageEvents.BEFORE_MODIFY.register((text, b) -> { + if (b) return; + var message = CookiesUtils.stripColor(text.getString()); + if (!message.matches(".*> EXTRA STATS <.*")) return; + OnInstanceOver(); + }); + this.action = this::RunAction; + } + + private void RunAction(String command, String message) { + var sender = getSender(message); + + if (downTimesThisInstance.stream().anyMatch(x -> x.Requester.equals(sender))) { + ChatUtils.sendPartyMessage(sender + " has already requested down time."); + return; + } + + var split = command.split(" "); + + switch (split.length) + { + case 1 -> downTimesThisInstance.add(new DownTimeAction("Not Specified", sender, null)); + case 2 -> downTimesThisInstance.add(new DownTimeAction(split[1], sender, null)); + case 3 -> downTimesThisInstance.add(new DownTimeAction(split[1], sender, split[2])); + } + + ChatUtils.sendPartyMessage("Down time requested by " + sender); + } + + private void OnInstanceOver() { + downTimesThisInstance.forEach(DownTimeAction::OnInstanceOver); + downTimesThisInstance.clear(); + } + + + public static class DownTimeAction { + private final String Reason; + private final String Requester; + private final String Duration; + + public DownTimeAction(String Reason, String Requester, String Duration) { + this.Reason = Reason; + this.Requester = Requester; + this.Duration = Duration; + } + + public void OnInstanceOver() { + StringBuilder message = new StringBuilder("Down time requested by " + Requester); + if (Duration != null) { + message.append(" for ").append(Duration); + } + if (Reason != null) { + message.append(" because: ").append(Reason); + } + + ChatUtils.sendPartyMessage(message.toString()); + } + } + } +} diff --git a/src/main/java/codes/cookies/mod/features/misc/PasteCommand.java b/src/main/java/codes/cookies/mod/features/misc/PasteCommand.java new file mode 100644 index 00000000..a53cddcf --- /dev/null +++ b/src/main/java/codes/cookies/mod/features/misc/PasteCommand.java @@ -0,0 +1,27 @@ +package codes.cookies.mod.features.misc; + +import codes.cookies.mod.CookiesMod; + +import codes.cookies.mod.utils.cookies.CookiesUtils; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; + +public class PasteCommand +{ + /* private void sendMessage(String message, boolean hide) { + MinecraftClient client = MinecraftClient.getInstance(); + if (client.player == null) { + Scheduler.LOGGER.error("[Skyblocker Message Scheduler] Tried to send a message while player is null: {}", message); + return; + } + message = StringHelper.truncateChat(StringUtils.normalizeSpace(message.trim())); + + if (message.startsWith("/")) { + client.player.networkHandler.sendCommand(message.substring(1)); + } else { + if (!hide) client.inGameHud.getChatHud().addToMessageHistory(message); + client.player.networkHandler.sendChatMessage(message); + } + }*/ +} diff --git a/src/main/java/codes/cookies/mod/mixins/KeybindingMixin.java b/src/main/java/codes/cookies/mod/mixins/KeybindingMixin.java index adf2b689..7c769257 100644 --- a/src/main/java/codes/cookies/mod/mixins/KeybindingMixin.java +++ b/src/main/java/codes/cookies/mod/mixins/KeybindingMixin.java @@ -1,5 +1,6 @@ package codes.cookies.mod.mixins; +import codes.cookies.mod.CookiesMod; import codes.cookies.mod.config.ConfigManager; import codes.cookies.mod.config.categories.FarmingConfig; import codes.cookies.mod.data.farming.GardenKeybindsData; diff --git a/src/main/java/codes/cookies/mod/translations/TranslationKeys.java b/src/main/java/codes/cookies/mod/translations/TranslationKeys.java index 88a73bfe..a3becbaf 100644 --- a/src/main/java/codes/cookies/mod/translations/TranslationKeys.java +++ b/src/main/java/codes/cookies/mod/translations/TranslationKeys.java @@ -402,6 +402,8 @@ public interface TranslationKeys { String CONFIG_DUNGEON_SPIRIT_LEAP_USE_CLASS_COLOR = CONFIG_DUNGEON_SPIRIT_LEAP + ".use_class_color"; String CONFIG_DUNGEON_SPIRIT_LEAP_COLOR = CONFIG_DUNGEON_SPIRIT_LEAP + ".color"; String CONFIG_DUNGEON_GLOW_CLASS_COLOR = CONFIG_DUNGEON + ".player_glow_by_class_color"; + String CONFIG_DUNGEON_ANNOUNCE_LEAPS = CONFIG_DUNGEON + ".announce_leaps"; + String CONFIG_DUNGEON_ANNOUNCE_LEAP_COORDS = CONFIG_DUNGEON + ".announce_leap_coords"; String CONFIG_DUNGEON_CLASS_COLOR = CONFIG_DUNGEON_SPIRIT_LEAP + ".class_color"; String CONFIG_DUNGEON_CLASS_COLOR_HEALER = CONFIG_DUNGEON_CLASS_COLOR + ".healer"; @@ -417,6 +419,7 @@ public interface TranslationKeys { String CONFIG_DUNGEON_TERMINAL_CORRECT_ALL_PANES = CONFIG_DUNGEON_TERMINAL + ".correct_all_panes"; String CONFIG_DUNGEON_TERMINAL_SELECT_ALL_COLORS = CONFIG_DUNGEON_TERMINAL + ".select_all_colors"; String CONFIG_DUNGEON_TERMINAL_STARTS_WITH_TERMINAL = CONFIG_DUNGEON_TERMINAL + ".starts_with_terminal"; + String CONFIG_DUNGEON_TERMINAL_MELODY_NOTIFIER = CONFIG_DUNGEON_TERMINAL + ".melody_notifier"; String CONFIG_DUNGEON_PUZZLE = CONFIG_DUNGEON + ".puzzle"; String CONFIG_DUNGEON_PUZZLE_CREEPER_BEAMS_SOLVER = CONFIG_DUNGEON_PUZZLE + ".creeper_beams"; @@ -426,6 +429,14 @@ public interface TranslationKeys { String CONFIG_DUNGEON_PUZZLE_WATER_BOARD_SOLVER = CONFIG_DUNGEON_PUZZLE + ".water_board"; String CONFIG_DUNGEON_PUZZLE_WATER_BOARD_CREDITS = CONFIG_DUNGEON_PUZZLE_WATER_BOARD_SOLVER + ".credits"; + String CONFIG_DUNGEON_PARTY_CHAT_COMMANDS = CONFIG_DUNGEON + ".party_chat_commands"; + String CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_PT_ME = CONFIG_DUNGEON_PARTY_CHAT_COMMANDS + ".pt_me"; + String CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_WARP = CONFIG_DUNGEON_PARTY_CHAT_COMMANDS + ".warp"; + String CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_JOIN_INSTANCE = CONFIG_DUNGEON_PARTY_CHAT_COMMANDS + ".join_instance"; + String CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_DOWN_TIME = CONFIG_DUNGEON_PARTY_CHAT_COMMANDS + ".down_time"; + String CONFIG_DUNGEON_PARTY_CHAT_COMMANDS_COIN_FLIP = CONFIG_DUNGEON_PARTY_CHAT_COMMANDS + ".coin_flip"; + + // // internal diff --git a/src/main/java/codes/cookies/mod/utils/accessors/SlotAccessor.java b/src/main/java/codes/cookies/mod/utils/accessors/SlotAccessor.java index c8c3db40..9e527779 100644 --- a/src/main/java/codes/cookies/mod/utils/accessors/SlotAccessor.java +++ b/src/main/java/codes/cookies/mod/utils/accessors/SlotAccessor.java @@ -97,4 +97,14 @@ static ItemStack getItem(Slot slot) { @SuppressWarnings("MissingJavadoc") ItemStack cookies$getOverrideItem(); + static boolean getInteractionLocked(Slot slot) { + return getAccessor(slot).cookies$getInteractionLocked(); + } + + static void setInteractionLocked(Slot slot, boolean locked) { + getAccessor(slot).cookies$setInteractionLocked(locked); + } + + boolean cookies$getInteractionLocked(); + void cookies$setInteractionLocked(boolean locked); } diff --git a/src/main/java/codes/cookies/mod/utils/mixins/HandledScreenMixin.java b/src/main/java/codes/cookies/mod/utils/mixins/HandledScreenMixin.java index 8dc60917..76019b0e 100644 --- a/src/main/java/codes/cookies/mod/utils/mixins/HandledScreenMixin.java +++ b/src/main/java/codes/cookies/mod/utils/mixins/HandledScreenMixin.java @@ -24,6 +24,7 @@ import codes.cookies.mod.utils.items.ItemUtils; import codes.cookies.mod.utils.items.ScrollableTooltipHandler; import org.jetbrains.annotations.Nullable; +import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -85,7 +86,7 @@ public abstract class HandledScreenMixin implements InventoryScreenAccessor { @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) @SuppressWarnings("MissingJavadoc") public void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { - if (DevUtils.isEnabled(ALLOW_SCREEN_SAVING) && keyCode == 83) { + if (DevUtils.isEnabled(ALLOW_SCREEN_SAVING) && keyCode == GLFW.GLFW_KEY_S) { try { final Path path = DevInventoryUtils.saveInventory((HandledScreen) (Object) this); @@ -262,11 +263,17 @@ private void cancelMouseClick( if (slot == null) { return; } + if (SlotAccessor.getInteractionLocked(slot)) { + cir.setReturnValue(true); + return; + } + if (SlotAccessor.getOnClick(slot) != null) { SlotAccessor.getOnClick(slot).accept(button); cir.setReturnValue(true); return; } + if (SlotAccessor.getRunnable(slot) != null) { SlotAccessor.getRunnable(slot).run(); cir.setReturnValue(true); diff --git a/src/main/java/codes/cookies/mod/utils/mixins/SlotMixin.java b/src/main/java/codes/cookies/mod/utils/mixins/SlotMixin.java index 61cd0452..b595239a 100644 --- a/src/main/java/codes/cookies/mod/utils/mixins/SlotMixin.java +++ b/src/main/java/codes/cookies/mod/utils/mixins/SlotMixin.java @@ -26,8 +26,20 @@ public abstract class SlotMixin implements SlotAccessor { private Runnable cookies$runnable; @Unique private Consumer cookies$clicked; + @Unique + private boolean cookies$InteractionLocked; - @Override + @Override + public boolean cookies$getInteractionLocked() { + return cookies$InteractionLocked; + } + + @Override + public void cookies$setInteractionLocked(boolean locked) { + cookies$InteractionLocked = locked; + } + + @Override public void cookies$setOnClick(Consumer onClick) { this.cookies$clicked = onClick; } diff --git a/src/main/java/codes/cookies/mod/utils/skyblock/ChatUtils.java b/src/main/java/codes/cookies/mod/utils/skyblock/ChatUtils.java new file mode 100644 index 00000000..b511c67c --- /dev/null +++ b/src/main/java/codes/cookies/mod/utils/skyblock/ChatUtils.java @@ -0,0 +1,34 @@ +package codes.cookies.mod.utils.skyblock; + +import codes.cookies.mod.utils.cookies.CookiesUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ChatUtils { + /** + * Sends a message without specifying a channel. + */ + public static void sendRawMessage(String message) { + CookiesUtils.getPlayer().ifPresent(clientPlayerEntity -> clientPlayerEntity.networkHandler.sendChatMessage(message)); + } + + + /** + * Sends a message to the party channel. + */ + public static void sendPartyMessage(String message) { + if (!PartyUtils.isInParty()) { + return; + } + + CookiesUtils.sendCommand("pchat " + message); + } + + + /** + * Sends a message to the all channel. + */ + public static void sendAllMessage(String message) { + CookiesUtils.sendCommand("achat " + message); + } +}