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    }