diff --git a/src/main/java/me/senseiwells/essentialclient/feature/CarpetClient.java b/src/main/java/me/senseiwells/essentialclient/feature/CarpetClient.java index 07fd2f2e..42178cb2 100644 --- a/src/main/java/me/senseiwells/essentialclient/feature/CarpetClient.java +++ b/src/main/java/me/senseiwells/essentialclient/feature/CarpetClient.java @@ -63,6 +63,10 @@ public boolean isCarpetManager(String name) { return this.MANAGERS.contains(name); } + public CarpetClientRule getRule(String name) { + return this.CURRENT_RULES.get(name); + } + public void onDisconnect() { this.isServerCarpet = false; this.CURRENT_RULES.clear(); diff --git a/src/main/java/me/senseiwells/essentialclient/mixins/longChatMessages/ChatMessageC2SPacketMixin.java b/src/main/java/me/senseiwells/essentialclient/mixins/longChatMessages/ChatMessageC2SPacketMixin.java new file mode 100644 index 00000000..b6a0bee3 --- /dev/null +++ b/src/main/java/me/senseiwells/essentialclient/mixins/longChatMessages/ChatMessageC2SPacketMixin.java @@ -0,0 +1,15 @@ +package me.senseiwells.essentialclient.mixins.longChatMessages; + +import me.senseiwells.essentialclient.utils.EssentialUtils; +import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +@Mixin(ChatMessageC2SPacket.class) +public class ChatMessageC2SPacketMixin { + @ModifyConstant(method = "(Ljava/lang/String;)V", constant = @Constant(intValue = 256)) + private int onMaxLength(int constant) { + return EssentialUtils.getMaxChatLength(constant); + } +} diff --git a/src/main/java/me/senseiwells/essentialclient/mixins/longChatMessages/ChatScreenMixin.java b/src/main/java/me/senseiwells/essentialclient/mixins/longChatMessages/ChatScreenMixin.java new file mode 100644 index 00000000..c394f258 --- /dev/null +++ b/src/main/java/me/senseiwells/essentialclient/mixins/longChatMessages/ChatScreenMixin.java @@ -0,0 +1,15 @@ +package me.senseiwells.essentialclient.mixins.longChatMessages; + +import me.senseiwells.essentialclient.utils.EssentialUtils; +import net.minecraft.client.gui.screen.ChatScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +@Mixin(ChatScreen.class) +public class ChatScreenMixin { + @ModifyConstant(method = "init", constant = @Constant(intValue = 256)) + private int getMaxLength(int constant) { + return EssentialUtils.getMaxChatLength(constant); + } +} diff --git a/src/main/java/me/senseiwells/essentialclient/utils/EssentialUtils.java b/src/main/java/me/senseiwells/essentialclient/utils/EssentialUtils.java index 8f5cd04e..4f87aa76 100644 --- a/src/main/java/me/senseiwells/essentialclient/utils/EssentialUtils.java +++ b/src/main/java/me/senseiwells/essentialclient/utils/EssentialUtils.java @@ -1,5 +1,9 @@ package me.senseiwells.essentialclient.utils; +import me.senseiwells.essentialclient.feature.CarpetClient; +import me.senseiwells.essentialclient.rule.carpet.CarpetClientRule; +import me.senseiwells.essentialclient.rule.carpet.IntegerCarpetRule; +import me.senseiwells.essentialclient.rule.carpet.StringCarpetRule; import me.senseiwells.essentialclient.utils.render.Texts; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.MinecraftVersion; @@ -123,6 +127,25 @@ public static boolean canMineBlock(ClientPlayerEntity player, BlockPos pos) { return !state.isAir() && !state.contains(FluidBlock.LEVEL) && state.getHardness(null, null) >= 0; } + public static int getMaxChatLength(int fallback) { + if (CarpetClient.INSTANCE.isServerCarpet()) { + CarpetClientRule rule = CarpetClient.INSTANCE.getRule("maxChatLength"); + if (rule instanceof IntegerCarpetRule intRule) { + int maxLength = intRule.getValue(); + if (maxLength > 0) { + return maxLength; + } + } + if (rule instanceof StringCarpetRule stringRule) { + Integer maxLength = catchAsNull(() -> Integer.parseInt(stringRule.getValue())); + if (maxLength != null && maxLength >= 0) { + return maxLength; + } + } + } + return fallback; + } + public static void throwAsRuntime(ThrowableRunnable runnable) { try { runnable.run(); diff --git a/src/main/resources/essentialclient.mixins.json b/src/main/resources/essentialclient.mixins.json index 119e8942..db6a7253 100644 --- a/src/main/resources/essentialclient.mixins.json +++ b/src/main/resources/essentialclient.mixins.json @@ -59,6 +59,8 @@ "gameRuleSync.RuleInvoker", "gameRuleSync.RuleMixin", "keyboard.KeyboardMixin", + "longChatMessages.ChatMessageC2SPacketMixin", + "longChatMessages.ChatScreenMixin" "mouseScrollRules.MouseMixin", "openScreenshotDirectory.ScreenshotRecorderMixin", "overrideCreativeWalkSpeed.LivingEntityMixin",