package crazypants.enderio.item;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import org.lwjgl.input.Keyboard;
import com.enderio.core.common.util.ChatUtil;
import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent;
import crazypants.enderio.EnderIO;
import crazypants.enderio.api.tool.IConduitControl;
import crazypants.enderio.conduit.ConduitDisplayMode;
import crazypants.enderio.config.Config;
import crazypants.enderio.item.PacketMagnetState.SlotType;
import crazypants.enderio.item.darksteel.DarkSteelController;
import crazypants.enderio.item.darksteel.DarkSteelItems;
import crazypants.enderio.item.darksteel.PacketUpgradeState;
import crazypants.enderio.item.darksteel.PacketUpgradeState.Type;
import crazypants.enderio.item.darksteel.SoundDetector;
import crazypants.enderio.item.darksteel.upgrade.JumpUpgrade;
import crazypants.enderio.item.darksteel.upgrade.SoundDetectorUpgrade;
import crazypants.enderio.item.darksteel.upgrade.SpeedUpgrade;
import crazypants.enderio.network.PacketHandler;
import crazypants.enderio.thaumcraft.GogglesOfRevealingUpgrade;
import crazypants.util.BaublesUtil;
import static crazypants.enderio.item.darksteel.DarkSteelItems.itemMagnet;
public class KeyTracker {
public static final KeyTracker instance = new KeyTracker();
private final KeyBinding glideKey;
private final KeyBinding soundDetectorKey;
private final KeyBinding nightVisionKey;
private final KeyBinding stepAssistKey;
private final KeyBinding speedKey;
private final KeyBinding jumpKey;
private final KeyBinding gogglesKey;
private final KeyBinding yetaWrenchMode;
private final KeyBinding magnetKey;
public KeyTracker() {
glideKey = new KeyBinding(EnderIO.lang.localize("keybind.glidertoggle"), Keyboard.KEY_G, EnderIO.lang.localize("category.darksteelarmor"));
ClientRegistry.registerKeyBinding(glideKey);
soundDetectorKey = new KeyBinding(EnderIO.lang.localize("keybind.soundlocator"), Keyboard.KEY_L, EnderIO.lang.localize("category.darksteelarmor"));
ClientRegistry.registerKeyBinding(soundDetectorKey);
nightVisionKey = new KeyBinding(EnderIO.lang.localize("keybind.nightvision"), Keyboard.KEY_P, EnderIO.lang.localize("category.darksteelarmor"));
ClientRegistry.registerKeyBinding(nightVisionKey);
gogglesKey = new KeyBinding(EnderIO.lang.localize("keybind.gogglesofrevealing"), Keyboard.KEY_R, EnderIO.lang.localize("category.darksteelarmor"));
ClientRegistry.registerKeyBinding(gogglesKey);
stepAssistKey = new KeyBinding(EnderIO.lang.localize("keybind.stepassist"), Keyboard.KEY_NONE, EnderIO.lang.localize("category.darksteelarmor"));
ClientRegistry.registerKeyBinding(stepAssistKey);
speedKey = new KeyBinding(EnderIO.lang.localize("keybind.speed"), Keyboard.KEY_NONE, EnderIO.lang.localize("category.darksteelarmor"));
ClientRegistry.registerKeyBinding(speedKey);
jumpKey = new KeyBinding(EnderIO.lang.localize("keybind.jump"), Keyboard.KEY_NONE, EnderIO.lang.localize("category.darksteelarmor"));
ClientRegistry.registerKeyBinding(jumpKey);
yetaWrenchMode = new KeyBinding(EnderIO.lang.localize("keybind.yetawrenchmode"), Keyboard.KEY_Y, EnderIO.lang.localize("category.tools"));
ClientRegistry.registerKeyBinding(yetaWrenchMode);
magnetKey = new KeyBinding(EnderIO.lang.localize("keybind.magnet"), Keyboard.CHAR_NONE, EnderIO.lang.localize("category.tools"));
ClientRegistry.registerKeyBinding(magnetKey);
}
@SubscribeEvent
public void onKeyInput(KeyInputEvent event) {
handleGlide();
handleSoundDetector();
handleNightVision();
handleYetaWrench();
handleGoggles();
handleStepAssist();
handleSpeed();
handleJump();
handleMagnet();
}
private void sendEnabledChatMessage(String messageBase, boolean isActive) {
String message = messageBase.concat(isActive ? ".enabled" : ".disabled");
ChatUtil.sendNoSpamClientUnloc(EnderIO.lang, message);
}
private void toggleDarkSteelController(Type type, String messageBase) {
boolean isActive = !DarkSteelController.instance.isActive(Minecraft.getMinecraft().thePlayer, type);
sendEnabledChatMessage(messageBase, isActive);
DarkSteelController.instance.setActive(Minecraft.getMinecraft().thePlayer, type, isActive);
PacketHandler.INSTANCE.sendToServer(new PacketUpgradeState(type, isActive));
}
private void handleMagnet() {
if(magnetKey.isPressed()) {
EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
ItemStack[] inv = player.inventory.mainInventory;
for (int i = 0; i < 9; i++) {
if(inv[i] != null && inv[i].getItem() != null && inv[i].getItem() == itemMagnet) {
boolean isActive = !ItemMagnet.isActive(inv[i]);
PacketHandler.INSTANCE.sendToServer(new PacketMagnetState(SlotType.INVENTORY, i, isActive));
return;
}
}
IInventory baubles = BaublesUtil.instance().getBaubles(player);
if(baubles != null) {
for (int i = 0; i < baubles.getSizeInventory(); i++) {
ItemStack stack = baubles.getStackInSlot(i);
if(stack != null && stack.getItem() != null && stack.getItem() == itemMagnet) {
boolean isActive = !ItemMagnet.isActive(stack);
PacketHandler.INSTANCE.sendToServer(new PacketMagnetState(SlotType.BAUBLES, i, isActive));
return;
}
}
}
}
}
private void handleJump() {
if(!JumpUpgrade.isEquipped(Minecraft.getMinecraft().thePlayer)) {
return;
}
if(jumpKey.isPressed()) {
toggleDarkSteelController(Type.JUMP, "darksteel.upgrade.jump");
}
}
private void handleSpeed() {
if(!SpeedUpgrade.isEquipped(Minecraft.getMinecraft().thePlayer)) {
return;
}
if(speedKey.isPressed()) {
toggleDarkSteelController(Type.SPEED, "darksteel.upgrade.speed");
}
}
private void handleStepAssist() {
if(!JumpUpgrade.isEquipped(Minecraft.getMinecraft().thePlayer)) {
return;
}
if(stepAssistKey.isPressed()) {
toggleDarkSteelController(Type.STEP_ASSIST, "darksteel.upgrade.stepAssist");
}
}
private void handleGoggles() {
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
if(!GogglesOfRevealingUpgrade.isUpgradeEquipped(player)){
return;
}
if(gogglesKey.isPressed()) {
boolean isActive = !DarkSteelItems.itemDarkSteelHelmet.isGogglesUgradeActive();
sendEnabledChatMessage("darksteel.upgrade.goggles", isActive);
DarkSteelItems.itemDarkSteelHelmet.setGogglesUgradeActive(isActive);
}
}
private void handleYetaWrench() {
if(!yetaWrenchMode.isPressed()) {
if (yetaWrenchMode.getKeyCode() == 0) {
Config.checkYetaAccess();
}
return;
}
EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
ItemStack equipped = player.getCurrentEquippedItem();
if(equipped == null) {
return;
}
if(equipped.getItem() instanceof IConduitControl) {
ConduitDisplayMode curMode = ConduitDisplayMode.getDisplayMode(equipped);
if(curMode == null) {
curMode = ConduitDisplayMode.ALL;
}
ConduitDisplayMode newMode = player.isSneaking() ? curMode.previous() : curMode.next();
ConduitDisplayMode.setDisplayMode(equipped, newMode);
PacketHandler.INSTANCE.sendToServer(new YetaWrenchPacketProcessor(player.inventory.currentItem, newMode));
} else if(equipped.getItem() == EnderIO.itemConduitProbe) {
int newMeta = equipped.getItemDamage() == 0 ? 1 : 0;
equipped.setItemDamage(newMeta);
PacketHandler.INSTANCE.sendToServer(new PacketConduitProbeMode());
player.swingItem();
}
}
private void handleSoundDetector() {
if(!isSoundDetectorUpgradeEquipped(Minecraft.getMinecraft().thePlayer)) {
SoundDetector.instance.setEnabled(false);
return;
}
if(soundDetectorKey.isPressed()) {
boolean isActive = !SoundDetector.instance.isEnabled();
sendEnabledChatMessage("darksteel.upgrade.sound", isActive);
SoundDetector.instance.setEnabled(isActive);
}
}
private void handleGlide() {
if(!DarkSteelController.instance.isGliderUpgradeEquipped(Minecraft.getMinecraft().thePlayer)) {
return;
}
if(glideKey.isPressed()) {
toggleDarkSteelController(Type.GLIDE, "darksteel.upgrade.glider");
}
}
private void handleNightVision() {
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
if(!DarkSteelController.instance.isNightVisionUpgradeEquipped(player)){
return;
}
if(nightVisionKey.isPressed()) {
boolean isActive = !DarkSteelController.instance.isNightVisionActive();
if(isActive) {
player.worldObj.playSound(player.posX, player.posY, player.posZ, EnderIO.DOMAIN + ":ds.nightvision.on", 0.1f, player.worldObj.rand.nextFloat() * 0.4f - 0.2f + 1.0f, false);
} else {
player.worldObj.playSound(player.posX, player.posY, player.posZ, EnderIO.DOMAIN + ":ds.nightvision.off", 0.1f, 1.0f, false);
}
DarkSteelController.instance.setNightVisionActive(isActive);
}
}
public boolean isSoundDetectorUpgradeEquipped(EntityClientPlayerMP player) {
ItemStack helmet = player.getEquipmentInSlot(4);
SoundDetectorUpgrade upgrade = SoundDetectorUpgrade.loadFromItem(helmet);
if(upgrade == null) {
return false;
}
return true;
}
public KeyBinding getYetaWrenchMode() {
return yetaWrenchMode;
}
}