From 885637cc7d491f6a7761208fdfd88bac761aa641 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 19 Aug 2012 01:44:33 -0400 Subject: [PATCH] Fix up keyboard events for modloader --- .../modloader/ModLoaderClientHelper.java | 30 +++++++++ .../modloader/ModLoaderKeyBindingHandler.java | 64 ++++++++++++------- .../client/registry/KeyBindingRegistry.java | 10 ++- client/net/minecraft/src/ModLoader.java | 3 +- .../src/net/minecraft/src/mod_testMod.java | 22 ++++--- 5 files changed, 91 insertions(+), 38 deletions(-) diff --git a/client/cpw/mods/fml/client/modloader/ModLoaderClientHelper.java b/client/cpw/mods/fml/client/modloader/ModLoaderClientHelper.java index 0393e78795..e1926a8ad4 100644 --- a/client/cpw/mods/fml/client/modloader/ModLoaderClientHelper.java +++ b/client/cpw/mods/fml/client/modloader/ModLoaderClientHelper.java @@ -1,16 +1,27 @@ package cpw.mods.fml.client.modloader; +import java.util.Collection; +import java.util.Collections; import java.util.Map; import java.util.Map.Entry; import net.minecraft.client.Minecraft; import net.minecraft.src.BaseMod; import net.minecraft.src.Entity; +import net.minecraft.src.KeyBinding; import net.minecraft.src.Render; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.Iterables; +import com.google.common.collect.Iterators; import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import cpw.mods.fml.client.registry.KeyBindingRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.modloader.IModLoaderSidedHelper; import cpw.mods.fml.common.modloader.ModLoaderHelper; import cpw.mods.fml.common.modloader.ModLoaderModContainer; @@ -52,13 +63,32 @@ public class ModLoaderClientHelper implements IModLoaderSidedHelper { this.client = client; ModLoaderHelper.sidedHelper = this; + keyBindingContainers = Multimaps.newMultimap(Maps.>newHashMap(), new Supplier>() + { + @Override + public Collection get() + { + return Collections.singleton(new ModLoaderKeyBindingHandler()); + } + }); } private Minecraft client; + private static Multimap keyBindingContainers; @Override public void finishModLoading(ModLoaderModContainer mc) { handleFinishLoadingFor(mc, client); } + + + public static void registerKeyBinding(BaseMod mod, KeyBinding keyHandler, boolean allowRepeat) + { + ModLoaderModContainer mlmc = (ModLoaderModContainer) Loader.instance().activeModContainer(); + ModLoaderKeyBindingHandler handler = Iterables.getOnlyElement(keyBindingContainers.get(mlmc)); + handler.setModContainer(mlmc); + handler.addKeyBinding(keyHandler, allowRepeat); + KeyBindingRegistry.registerKeyBinding(handler); + } } diff --git a/client/cpw/mods/fml/client/modloader/ModLoaderKeyBindingHandler.java b/client/cpw/mods/fml/client/modloader/ModLoaderKeyBindingHandler.java index cf4fef0bb1..f7677c41f8 100644 --- a/client/cpw/mods/fml/client/modloader/ModLoaderKeyBindingHandler.java +++ b/client/cpw/mods/fml/client/modloader/ModLoaderKeyBindingHandler.java @@ -14,7 +14,14 @@ package cpw.mods.fml.client.modloader; +import java.util.Arrays; import java.util.EnumSet; +import java.util.List; + +import org.lwjgl.input.Mouse; + +import com.google.common.collect.ObjectArrays; +import com.google.common.primitives.Booleans; import net.minecraft.src.KeyBinding; import cpw.mods.fml.client.registry.KeyBindingRegistry; @@ -28,23 +35,27 @@ import cpw.mods.fml.common.modloader.ModLoaderModContainer; public class ModLoaderKeyBindingHandler extends KeyBindingRegistry.KeyHandler { private ModLoaderModContainer modContainer; - private boolean downArmed; - private boolean upArmed; + private List helper; + private boolean[] active = new boolean[0]; + private boolean[] mlRepeats = new boolean[0]; + private boolean[] armed = new boolean[0]; /** * @param keyHandler - * @param allowRepeat - * @param modContainer */ - public ModLoaderKeyBindingHandler(KeyBinding keyBinding, boolean allowRepeat, ModLoaderModContainer modContainer) + public ModLoaderKeyBindingHandler() { - super(new KeyBinding[] { keyBinding }, new boolean[] { allowRepeat }); - this.modContainer=modContainer; + super(new KeyBinding[0], new boolean[0]); } - public void onRenderEndTick() + void setModContainer(ModLoaderModContainer modContainer) { - ((net.minecraft.src.BaseMod)modContainer.getMod()).keyboardEvent(keyBindings[0]); + this.modContainer = modContainer; + } + + public void fireKeyEvent(KeyBinding kb) + { + ((net.minecraft.src.BaseMod)modContainer.getMod()).keyboardEvent(kb); } @Override @@ -54,15 +65,16 @@ public class ModLoaderKeyBindingHandler extends KeyBindingRegistry.KeyHandler { return; } - upArmed = false; + int idx = helper.indexOf(kb); if (type.contains(TickType.CLIENT)) { - downArmed = true; + armed[idx] = true; } - if (type.contains(TickType.RENDER) && downArmed) + if (armed[idx] && type.contains(TickType.RENDER) && (!active[idx] || mlRepeats[idx])) { - onRenderEndTick(); - downArmed = false; + fireKeyEvent(kb); + active[idx] = true; + armed[idx] = false; } } @@ -73,16 +85,8 @@ public class ModLoaderKeyBindingHandler extends KeyBindingRegistry.KeyHandler { return; } - downArmed = false; - if (type.contains(TickType.CLIENT)) - { - upArmed = true; - } - if (type.contains(TickType.RENDER) && upArmed) - { - onRenderEndTick(); - upArmed = false; - } + int idx = helper.indexOf(kb); + active[idx] = false; } @Override @@ -96,4 +100,16 @@ public class ModLoaderKeyBindingHandler extends KeyBindingRegistry.KeyHandler { return modContainer.getModId() +" KB "+keyBindings[0].field_74512_d; } + + void addKeyBinding(KeyBinding binding, boolean repeats) + { + this.keyBindings = ObjectArrays.concat(this.keyBindings, binding); + this.repeatings = new boolean[this.keyBindings.length]; + Arrays.fill(this.repeatings, true); + this.active = new boolean[this.keyBindings.length]; + this.armed = new boolean[this.keyBindings.length]; + this.mlRepeats = Booleans.concat(this.mlRepeats, new boolean[] { repeats }); + this.keyDown = new boolean[this.keyBindings.length]; + this.helper = Arrays.asList(this.keyBindings); + } } diff --git a/client/cpw/mods/fml/client/registry/KeyBindingRegistry.java b/client/cpw/mods/fml/client/registry/KeyBindingRegistry.java index 328b9b64b0..ad25c22895 100644 --- a/client/cpw/mods/fml/client/registry/KeyBindingRegistry.java +++ b/client/cpw/mods/fml/client/registry/KeyBindingRegistry.java @@ -2,7 +2,7 @@ package cpw.mods.fml.client.registry; import java.util.ArrayList; import java.util.EnumSet; -import java.util.List; +import java.util.Set; import net.minecraft.src.GameSettings; import net.minecraft.src.KeyBinding; @@ -11,6 +11,7 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.Side; @@ -115,7 +116,10 @@ public class KeyBindingRegistry { keyUp(type, keyBinding, tickEnd); } - keyDown[i] = state; + if (tickEnd) + { + keyDown[i] = state; + } } } @@ -154,7 +158,7 @@ public class KeyBindingRegistry private static final KeyBindingRegistry INSTANCE = new KeyBindingRegistry(); - private List keyHandlers = Lists.newArrayList(); + private Set keyHandlers = Sets.newLinkedHashSet(); @Deprecated public static KeyBindingRegistry instance() diff --git a/client/net/minecraft/src/ModLoader.java b/client/net/minecraft/src/ModLoader.java index 4a7cf93f63..8759050f65 100644 --- a/client/net/minecraft/src/ModLoader.java +++ b/client/net/minecraft/src/ModLoader.java @@ -601,8 +601,7 @@ public class ModLoader @SideOnly(CLIENT) public static void registerKey(BaseMod mod, KeyBinding keyHandler, boolean allowRepeat) { - ModLoaderModContainer mlmc=ModLoaderHelper.registerKeyHelper(mod); - KeyBindingRegistry.registerKeyBinding(new ModLoaderKeyBindingHandler(keyHandler, allowRepeat, mlmc)); + ModLoaderClientHelper.registerKeyBinding(mod, keyHandler, allowRepeat); } /** diff --git a/eclipse/simpletestmod/src/net/minecraft/src/mod_testMod.java b/eclipse/simpletestmod/src/net/minecraft/src/mod_testMod.java index 49ac6026a8..ec57b79d60 100644 --- a/eclipse/simpletestmod/src/net/minecraft/src/mod_testMod.java +++ b/eclipse/simpletestmod/src/net/minecraft/src/mod_testMod.java @@ -2,11 +2,15 @@ package net.minecraft.src; import java.util.EnumSet; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.IScheduledTickHandler; import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.Side; import cpw.mods.fml.common.TickType; +import cpw.mods.fml.common.asm.SideOnly; import cpw.mods.fml.common.network.IPacketHandler; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.network.Player; @@ -35,15 +39,15 @@ public class mod_testMod extends BaseMod { // ModLoader.setInGameHook(this, true, false); // ModLoader.setInGUIHook(this, true, false); // FMLCommonHandler.instance().registerTickHandler(this); - TickTester t1 = new TickTester(); - t1.interval=1; - TickTester t2 = new TickTester(); - t2.interval=2; - TickTester t3 = new TickTester(); - t3.interval=3; - TickRegistry.registerScheduledTickHandler(t1, Side.CLIENT); - TickRegistry.registerScheduledTickHandler(t2, Side.SERVER); - TickRegistry.registerScheduledTickHandler(t3, Side.CLIENT); + ModLoader.registerKey(this, new KeyBinding("Fishhead",Keyboard.KEY_O), true); + } + + @Override + @SideOnly(Side.CLIENT) + public void keyboardEvent(KeyBinding event) + { + Mouse.setGrabbed(false); + System.out.println(event.field_74515_c); } @Override