001/* 002 * Forge Mod Loader 003 * Copyright (c) 2012-2013 cpw. 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser Public License v2.1 006 * which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 008 * 009 * Contributors: 010 * cpw - implementation 011 */ 012 013package cpw.mods.fml.client.modloader; 014 015import java.util.Arrays; 016import java.util.EnumSet; 017import java.util.List; 018 019import org.lwjgl.input.Mouse; 020 021import com.google.common.collect.ObjectArrays; 022import com.google.common.primitives.Booleans; 023 024import net.minecraft.client.settings.KeyBinding; 025import cpw.mods.fml.client.registry.KeyBindingRegistry; 026import cpw.mods.fml.common.TickType; 027import cpw.mods.fml.common.modloader.ModLoaderModContainer; 028 029/** 030 * @author cpw 031 * 032 */ 033public class ModLoaderKeyBindingHandler extends KeyBindingRegistry.KeyHandler 034{ 035 private ModLoaderModContainer modContainer; 036 private List<KeyBinding> helper; 037 private boolean[] active = new boolean[0]; 038 private boolean[] mlRepeats = new boolean[0]; 039 private boolean[] armed = new boolean[0]; 040 041 public ModLoaderKeyBindingHandler() 042 { 043 super(new KeyBinding[0], new boolean[0]); 044 } 045 046 void setModContainer(ModLoaderModContainer modContainer) 047 { 048 this.modContainer = modContainer; 049 } 050 051 public void fireKeyEvent(KeyBinding kb) 052 { 053 ((net.minecraft.src.BaseMod)modContainer.getMod()).keyboardEvent(kb); 054 } 055 056 @Override 057 public void keyDown(EnumSet<TickType> type, KeyBinding kb, boolean end, boolean repeats) 058 { 059 if (!end) 060 { 061 return; 062 } 063 int idx = helper.indexOf(kb); 064 if (type.contains(TickType.CLIENT)) 065 { 066 armed[idx] = true; 067 } 068 if (armed[idx] && type.contains(TickType.RENDER) && (!active[idx] || mlRepeats[idx])) 069 { 070 fireKeyEvent(kb); 071 active[idx] = true; 072 armed[idx] = false; 073 } 074 } 075 076 @Override 077 public void keyUp(EnumSet<TickType> type, KeyBinding kb, boolean end) 078 { 079 if (!end) 080 { 081 return; 082 } 083 int idx = helper.indexOf(kb); 084 active[idx] = false; 085 } 086 087 @Override 088 public EnumSet<TickType> ticks() 089 { 090 return EnumSet.of(TickType.CLIENT, TickType.RENDER); 091 } 092 093 @Override 094 public String getLabel() 095 { 096 return modContainer.getModId() +" KB "+keyBindings[0].keyCode; 097 } 098 099 void addKeyBinding(KeyBinding binding, boolean repeats) 100 { 101 this.keyBindings = ObjectArrays.concat(this.keyBindings, binding); 102 this.repeatings = new boolean[this.keyBindings.length]; 103 Arrays.fill(this.repeatings, true); 104 this.active = new boolean[this.keyBindings.length]; 105 this.armed = new boolean[this.keyBindings.length]; 106 this.mlRepeats = Booleans.concat(this.mlRepeats, new boolean[] { repeats }); 107 this.keyDown = new boolean[this.keyBindings.length]; 108 this.helper = Arrays.asList(this.keyBindings); 109 } 110}