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 }