package ru.nevetime.clientirc.mixin; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.ChatScreen; import org.lwjgl.glfw.GLFW; 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.CallbackInfoReturnable; @Mixin(ChatScreen.class) public abstract class ChatScreenMixin { @Shadow protected EditBox input; private static final String[] CLIENTIRC_COMMANDS = new String[] { ".irc", ".irc status", ".irc reconnect", ".irc reload", ".friends add ", ".friends remove ", ".friends list", ".marker remove", ".help" }; @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) private void clientirc$tabComplete(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable cir) { if (keyCode != GLFW.GLFW_KEY_TAB) return; if (input == null) return; String value = input.getValue(); if (value == null || !value.startsWith(".")) return; String best = null; for (String candidate : CLIENTIRC_COMMANDS) { if (candidate.startsWith(value) && !candidate.equals(value)) { if (best == null || candidate.length() < best.length()) { best = candidate; } } } if (best != null) { input.setValue(best); input.setCursorPosition(best.length()); cir.setReturnValue(true); } } }