001 /*
002 * The FML Forge Mod Loader suite.
003 * Copyright (C) 2012 cpw
004 *
005 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free
006 * Software Foundation; either version 2.1 of the License, or any later version.
007 *
008 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
009 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
010 *
011 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51
012 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
013 */
014
015 package cpw.mods.fml.client.modloader;
016
017 import java.util.Arrays;
018 import java.util.EnumSet;
019 import java.util.List;
020
021 import org.lwjgl.input.Mouse;
022
023 import com.google.common.collect.ObjectArrays;
024 import com.google.common.primitives.Booleans;
025
026 import net.minecraft.client.settings.KeyBinding;
027 import cpw.mods.fml.client.registry.KeyBindingRegistry;
028 import cpw.mods.fml.common.TickType;
029 import cpw.mods.fml.common.modloader.ModLoaderModContainer;
030
031 /**
032 * @author cpw
033 *
034 */
035 public class ModLoaderKeyBindingHandler extends KeyBindingRegistry.KeyHandler
036 {
037 private ModLoaderModContainer modContainer;
038 private List<KeyBinding> helper;
039 private boolean[] active = new boolean[0];
040 private boolean[] mlRepeats = new boolean[0];
041 private boolean[] armed = new boolean[0];
042
043 public ModLoaderKeyBindingHandler()
044 {
045 super(new KeyBinding[0], new boolean[0]);
046 }
047
048 void setModContainer(ModLoaderModContainer modContainer)
049 {
050 this.modContainer = modContainer;
051 }
052
053 public void fireKeyEvent(KeyBinding kb)
054 {
055 ((net.minecraft.src.BaseMod)modContainer.getMod()).keyboardEvent(kb);
056 }
057
058 @Override
059 public void keyDown(EnumSet<TickType> type, KeyBinding kb, boolean end, boolean repeats)
060 {
061 if (!end)
062 {
063 return;
064 }
065 int idx = helper.indexOf(kb);
066 if (type.contains(TickType.CLIENT))
067 {
068 armed[idx] = true;
069 }
070 if (armed[idx] && type.contains(TickType.RENDER) && (!active[idx] || mlRepeats[idx]))
071 {
072 fireKeyEvent(kb);
073 active[idx] = true;
074 armed[idx] = false;
075 }
076 }
077
078 @Override
079 public void keyUp(EnumSet<TickType> type, KeyBinding kb, boolean end)
080 {
081 if (!end)
082 {
083 return;
084 }
085 int idx = helper.indexOf(kb);
086 active[idx] = false;
087 }
088
089 @Override
090 public EnumSet<TickType> ticks()
091 {
092 return EnumSet.of(TickType.CLIENT, TickType.RENDER);
093 }
094
095 @Override
096 public String getLabel()
097 {
098 return modContainer.getModId() +" KB "+keyBindings[0].keyCode;
099 }
100
101 void addKeyBinding(KeyBinding binding, boolean repeats)
102 {
103 this.keyBindings = ObjectArrays.concat(this.keyBindings, binding);
104 this.repeatings = new boolean[this.keyBindings.length];
105 Arrays.fill(this.repeatings, true);
106 this.active = new boolean[this.keyBindings.length];
107 this.armed = new boolean[this.keyBindings.length];
108 this.mlRepeats = Booleans.concat(this.mlRepeats, new boolean[] { repeats });
109 this.keyDown = new boolean[this.keyBindings.length];
110 this.helper = Arrays.asList(this.keyBindings);
111 }
112 }