diff --git a/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatScreenMixin.java b/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatScreenMixin.java index 32218d8..e919237 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatScreenMixin.java +++ b/src/main/java/land/chipmunk/chipmunkmod/mixin/ChatScreenMixin.java @@ -1,20 +1,26 @@ package land.chipmunk.chipmunkmod.mixin; +import land.chipmunk.chipmunkmod.command.CommandManager; import land.chipmunk.chipmunkmod.modules.CustomChat; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.ChatInputSuggestor; +import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; 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.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.minecraft.client.MinecraftClient; -import land.chipmunk.chipmunkmod.command.CommandManager; @Mixin(net.minecraft.client.gui.screen.ChatScreen.class) -public class ChatScreenMixin { +public class ChatScreenMixin extends Screen { @Shadow protected TextFieldWidget chatField; + @Shadow private String originalChatText; + @Shadow ChatInputSuggestor chatInputSuggestor; + @Shadow private int messageHistorySize = -1; @Inject(at = @At("HEAD"), method = "sendMessage", cancellable = true) public void sendMessage(String chatText, boolean addToHistory, CallbackInfoReturnable cir) { @@ -35,13 +41,37 @@ public class ChatScreenMixin { } } - @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/TextFieldWidget;setMaxLength(I)V"), method = "init") - public void init (CallbackInfo ci) { - chatField.setMaxLength(Integer.MAX_VALUE); + public ChatScreenMixin(String originalChatText) { + super(Text.translatable("chat_screen.title")); + this.originalChatText = originalChatText; } - @ModifyArg(method = "normalize", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/StringHelper;truncateChat(Ljava/lang/String;)Ljava/lang/String;")) - private String normalize (String text) { - return text; + @Inject(at = @At("TAIL"), method = "init", cancellable = true) + public void init (CallbackInfo ci) { + final MinecraftClient client = MinecraftClient.getInstance(); + + this.messageHistorySize = client.inGameHud.getChatHud().getMessageHistory().size(); + this.chatField = new TextFieldWidget(client.advanceValidatingTextRenderer, 4, this.height - 12, this.width - 4, 12, Text.translatable("chat.editBox")) { + protected MutableText getNarrationMessage() { + return super.getNarrationMessage().append(ChatScreenMixin.this.chatInputSuggestor.getNarration()); + } + }; + this.chatField.setMaxLength(Integer.MAX_VALUE); + this.chatField.setDrawsBackground(false); + this.chatField.setText(this.originalChatText); + this.chatField.setChangedListener(this::onChatFieldUpdate); + this.chatField.setFocusUnlocked(false); + this.addSelectableChild(this.chatField); + this.chatInputSuggestor = new ChatInputSuggestor(this.client, this, this.chatField, this.textRenderer, false, false, 1, 10, true, -805306368); + this.chatInputSuggestor.refresh(); + this.setInitialFocus(this.chatField); + + ci.cancel(); + } + + private void onChatFieldUpdate(String chatText) { + String string = this.chatField.getText(); + this.chatInputSuggestor.setWindowActive(!string.equals(this.originalChatText)); + this.chatInputSuggestor.refresh(); } }