    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    }