summaryrefslogtreecommitdiff
path: root/src/main/java/dev/plutorocks/mixin/ChatScreenMixin.java
diff options
context:
space:
mode:
authorplutorocks <>2026-02-26 16:53:24 -0500
committerplutorocks <>2026-02-26 16:53:24 -0500
commit8b123f240f098b24f8e348f1f36ab3eb72599176 (patch)
tree91a532a9a422104a667137a18137527c83c6889f /src/main/java/dev/plutorocks/mixin/ChatScreenMixin.java
initial commitHEADmain
Diffstat (limited to 'src/main/java/dev/plutorocks/mixin/ChatScreenMixin.java')
-rw-r--r--src/main/java/dev/plutorocks/mixin/ChatScreenMixin.java103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/main/java/dev/plutorocks/mixin/ChatScreenMixin.java b/src/main/java/dev/plutorocks/mixin/ChatScreenMixin.java
new file mode 100644
index 0000000..6ea5e64
--- /dev/null
+++ b/src/main/java/dev/plutorocks/mixin/ChatScreenMixin.java
@@ -0,0 +1,103 @@
+package dev.plutorocks.mixin;
+
+import dev.plutorocks.PlutoBridge;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.screen.ChatScreen;
+import net.minecraft.text.MutableText;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(ChatScreen.class)
+public abstract class ChatScreenMixin {
+
+ @Inject(method = "sendMessage", at = @At("HEAD"), cancellable = true)
+ private void bridge$interceptBridgeMessages(String chatText, boolean addToHistory, CallbackInfo ci) {
+ if (chatText == null) {
+ return;
+ }
+
+ String trimmed = chatText.trim();
+ if (trimmed.isEmpty()) {
+ return;
+ }
+
+ if (trimmed.startsWith("/")) {
+ return;
+ }
+
+ boolean startsWithBang = trimmed.startsWith("!");
+ boolean bridgeDefault = PlutoBridge.bridgeChatDefault;
+
+ boolean wantsBridge;
+ if (!bridgeDefault) {
+ if (!startsWithBang) {
+ return;
+ }
+ wantsBridge = true;
+ } else {
+ wantsBridge = !startsWithBang;
+ }
+
+ MinecraftClient client = MinecraftClient.getInstance();
+ if (client == null || client.player == null) {
+ return;
+ }
+
+ if (PlutoBridge.BRIDGE_CLIENT == null || !PlutoBridge.BRIDGE_CLIENT.isConnected()) {
+ if (wantsBridge) {
+ if (client.inGameHud != null) {
+ MutableText prefix = Text.literal("[Bridge] ").formatted(Formatting.AQUA);
+ MutableText body = Text.literal("Not connected. Use /bridge connect first.")
+ .formatted(Formatting.GRAY);
+ client.inGameHud.getChatHud().addMessage(prefix.append(body));
+ }
+ ci.cancel();
+ }
+ return;
+ }
+
+ // at this point we are connected.
+ if (bridgeDefault && startsWithBang && !wantsBridge) {
+ // bridge mode ON and user prefixed with "!" => send to normal chat.
+ String normalMessage = trimmed.substring(1);
+ if (!normalMessage.isEmpty()) {
+ client.player.networkHandler.sendChatMessage(normalMessage);
+ }
+ } else {
+ // send to the bridge.
+ String bridgeMessage;
+ if (!bridgeDefault) {
+ // default mode: strip the leading "!" for bridge messages.
+ bridgeMessage = trimmed.substring(1);
+ } else {
+ // bridge mode: already without prefix for bridge messages.
+ bridgeMessage = trimmed;
+ }
+
+ // enforce max message length client-side to match server.
+ int len = bridgeMessage.codePointCount(0, bridgeMessage.length());
+ if (len > PlutoBridge.MAX_MESSAGE_LEN) {
+ if (client.inGameHud != null) {
+ MutableText prefix = Text.literal("[Bridge] ").formatted(Formatting.AQUA);
+ MutableText body = Text.literal(
+ "Message too long (max " + PlutoBridge.MAX_MESSAGE_LEN + " characters)."
+ ).formatted(Formatting.GRAY);
+ client.inGameHud.getChatHud().addMessage(prefix.append(body));
+ }
+ ci.cancel();
+ return;
+ }
+
+ if (!bridgeMessage.isEmpty()) {
+ PlutoBridge.BRIDGE_CLIENT.sendChatMessage(bridgeMessage);
+ }
+ }
+
+ // prevent this message from going to normal MC chat
+ ci.cancel();
+ }
+} \ No newline at end of file