package dmillerw.menu.handler; import dmillerw.menu.data.menu.RadialMenu; import dmillerw.menu.gui.GuiRadialMenu; import dmillerw.menu.helper.KeyReflectionHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @author dmillerw */ public class KeyboardHandler { public static final KeyboardHandler INSTANCE = new KeyboardHandler(); private static final KeyBinding WHEEL = new KeyBinding("key.open_menu", Keyboard.KEY_R, "key.categories.misc"); public static void register() { MinecraftForge.EVENT_BUS.register(KeyboardHandler.INSTANCE); ClientRegistry.registerKeyBinding(WHEEL); } private static boolean lastWheelState = false; private final List<KeyBinding> firedKeys = new ArrayList<KeyBinding>(); private final List<KeyBinding> toggledKeys = new ArrayList<KeyBinding>(); private boolean ignoreNextTick = false; private KeyboardHandler() { } public void fireKey(KeyBinding key) { firedKeys.add(key); KeyReflectionHelper.pressKey(key); KeyReflectionHelper.increasePressTime(key); boolean old = Minecraft.getMinecraft().inGameHasFocus; Minecraft.getMinecraft().inGameHasFocus = true; MinecraftForge.EVENT_BUS.post(new InputEvent.KeyInputEvent()); Minecraft.getMinecraft().inGameHasFocus = old; ignoreNextTick = true; } public void toggleKey(KeyBinding key) { if (!toggledKeys.contains(key)) { toggledKeys.add(key); KeyReflectionHelper.pressKey(key); KeyReflectionHelper.increasePressTime(key); } else { toggledKeys.remove(key); KeyReflectionHelper.unpressKey(key); } boolean old = Minecraft.getMinecraft().inGameHasFocus; Minecraft.getMinecraft().inGameHasFocus = true; MinecraftForge.EVENT_BUS.post(new InputEvent.KeyInputEvent()); Minecraft.getMinecraft().inGameHasFocus = old; ignoreNextTick = true; } @SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent event) { if (event.phase == TickEvent.Phase.END) { return; } Minecraft mc = Minecraft.getMinecraft(); if (mc.world == null) { return; } boolean wheelKeyPressed = (WHEEL.getKeyCode() >= 0 ? Keyboard.isKeyDown(WHEEL.getKeyCode()) : Mouse.isButtonDown(WHEEL.getKeyCode() + 100)); if (wheelKeyPressed != lastWheelState) { if (ConfigHandler.toggle) { if (wheelKeyPressed) { if (GuiRadialMenu.active) { if (ConfigHandler.releaseToSelect) { GuiRadialMenu.INSTANCE.mouseClicked(Mouse.getX(), Mouse.getY(), 0); } GuiRadialMenu.deactivate(); } else { if (mc.currentScreen == null || mc.currentScreen instanceof GuiRadialMenu) { RadialMenu.resetCategory(); RadialMenu.resetTimer(); GuiRadialMenu.activate(); } } } } else { if (wheelKeyPressed != GuiRadialMenu.active) { if (wheelKeyPressed) { if (mc.currentScreen == null || mc.currentScreen instanceof GuiRadialMenu) { RadialMenu.resetCategory(); RadialMenu.resetTimer(); GuiRadialMenu.activate(); } } else { if (ConfigHandler.releaseToSelect) { GuiRadialMenu.INSTANCE.mouseClicked(Mouse.getX(), Mouse.getY(), 0); } GuiRadialMenu.deactivate(); } } } } lastWheelState = wheelKeyPressed; if (ignoreNextTick) { ignoreNextTick = false; return; } Iterator<KeyBinding> iterator = firedKeys.iterator(); while (iterator.hasNext()) { KeyBinding keyBinding = iterator.next(); KeyReflectionHelper.unpressKey(keyBinding); iterator.remove(); } iterator = toggledKeys.iterator(); while (iterator.hasNext()) { KeyBinding keyBinding = iterator.next(); if ((keyBinding.getKeyCode() >= 0 ? Keyboard.isKeyDown(keyBinding.getKeyCode()) : Mouse.isButtonDown(keyBinding.getKeyCode() + 100))) { iterator.remove(); } } for (KeyBinding keyBinding : toggledKeys) { KeyReflectionHelper.increasePressTime(keyBinding); } } }