package flaxbeard.cyberware.common.item; import java.util.ArrayList; import java.util.List; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.MobEffects; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity; import net.minecraftforge.client.event.RenderBlockOverlayEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; import net.minecraftforge.fml.common.gameevent.TickEvent.RenderTickEvent; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import flaxbeard.cyberware.api.CyberwareAPI; import flaxbeard.cyberware.api.CyberwareUpdateEvent; import flaxbeard.cyberware.api.item.EnableDisableHelper; import flaxbeard.cyberware.api.item.IHudjack; import flaxbeard.cyberware.api.item.IMenuItem; import flaxbeard.cyberware.common.CyberwareContent; public class ItemCybereyeUpgrade extends ItemCyberware implements IMenuItem, IHudjack { public ItemCybereyeUpgrade(String name, EnumSlot slot, String[] subnames) { super(name, slot, subnames); MinecraftForge.EVENT_BUS.register(this); FMLCommonHandler.instance().bus().register(this); } @Override public ItemStack[][] required(ItemStack stack) { if (stack.getItemDamage() > 2 && stack.getItemDamage() != 4) { return new ItemStack[][] { new ItemStack[] { new ItemStack(CyberwareContent.cybereyes) }, new ItemStack[] { new ItemStack(this, 1, 2) }}; } return new ItemStack[][] { new ItemStack[] { new ItemStack(CyberwareContent.cybereyes) }}; } private static List<EntityLivingBase> affected = new ArrayList<EntityLivingBase>(); @SubscribeEvent @SideOnly(Side.CLIENT) public void handleHighlight(RenderTickEvent event) { EntityPlayer p = Minecraft.getMinecraft().thePlayer; ItemStack testItem = new ItemStack(this, 1, 3); if (CyberwareAPI.isCyberwareInstalled(p, testItem) && EnableDisableHelper.isEnabled(CyberwareAPI.getCyberware(p, testItem))) { if (event.phase == Phase.START) { affected.clear(); float range = 25F; List<EntityLivingBase> test = p.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, new AxisAlignedBB(p.posX - range, p.posY - range, p.posZ - range, p.posX + p.width + range, p.posY + p.height + range, p.posZ + p.width + range)); for (EntityLivingBase e : test) { if (p.getDistanceToEntity(e) <= range && e != p && !e.isGlowing()) { e.setGlowing(true); affected.add(e); } } } else if (event.phase == Phase.END) { for (EntityLivingBase e : affected) { e.setGlowing(false); } } } } @SideOnly(Side.CLIENT) @SubscribeEvent public void handleFog(FogDensity event) { EntityPlayer p = Minecraft.getMinecraft().thePlayer; if (CyberwareAPI.isCyberwareInstalled(p, new ItemStack(this, 1, 1))) { if (p.isInsideOfMaterial(Material.WATER)) { event.setDensity(0.01F); event.setCanceled(true); } else if (p.isInsideOfMaterial(Material.LAVA)) { event.setDensity(0.7F); event.setCanceled(true); } } } @SubscribeEvent public void handleNightVision(CyberwareUpdateEvent event) { EntityLivingBase e = event.getEntityLiving(); ItemStack testItem = new ItemStack(this, 1, 0); if (CyberwareAPI.isCyberwareInstalled(e, testItem) && EnableDisableHelper.isEnabled(CyberwareAPI.getCyberware(e, testItem))) { e.addPotionEffect(new PotionEffect(MobEffects.NIGHT_VISION, Integer.MAX_VALUE, 53, true, false)); } else { PotionEffect effect = e.getActivePotionEffect(MobEffects.NIGHT_VISION); if (effect != null && effect.getAmplifier() == 53) { e.removePotionEffect(MobEffects.NIGHT_VISION); } } } @SubscribeEvent @SideOnly(Side.CLIENT) public void handleWaterVision(RenderBlockOverlayEvent event) { if (CyberwareAPI.isCyberwareInstalled(event.getPlayer(), new ItemStack(this, 1, 1))) { if (event.getBlockForOverlay().getMaterial() == Material.WATER || event.getBlockForOverlay().getMaterial() == Material.LAVA) { event.setCanceled(true); } } } private static boolean inUse = false; private static boolean wasInUse = false; private static int zoomSettingOn = 0; private static float fov = 0F; private static float sensitivity = 0F; private static EntityPlayer player = null; @SubscribeEvent @SideOnly(Side.CLIENT) public void tickStart(TickEvent.ClientTickEvent event) { Minecraft mc = Minecraft.getMinecraft(); if (event.phase == Phase.START) { wasInUse = inUse; EntityPlayer p = mc.thePlayer; if (!inUse && !wasInUse) { fov = mc.gameSettings.fovSetting; sensitivity = mc.gameSettings.mouseSensitivity; } if (CyberwareAPI.isCyberwareInstalled(p, new ItemStack(this, 1, 4))) { player = p; if (mc.gameSettings.thirdPersonView == 0) { switch (zoomSettingOn) { case 0: mc.gameSettings.fovSetting = fov; mc.gameSettings.mouseSensitivity = sensitivity; break; case 1: mc.gameSettings.fovSetting = fov; mc.gameSettings.mouseSensitivity = sensitivity; int i = 0; while (Math.abs((mc.gameSettings.fovSetting - ((fov + 5F)) / 2.0F)) > 2.5F && i < 200) { mc.gameSettings.fovSetting -= 2.5F; mc.gameSettings.mouseSensitivity -= 0.01F; i++; } break; case 2: mc.gameSettings.fovSetting = fov; mc.gameSettings.mouseSensitivity = sensitivity; i = 0; while (Math.abs((mc.gameSettings.fovSetting - ((fov + 5F)) / 5.0F)) > 2.5F && i < 200) { mc.gameSettings.fovSetting -= 2.5F; mc.gameSettings.mouseSensitivity -= 0.01F; i++; } break; case 3: mc.gameSettings.fovSetting = fov; mc.gameSettings.mouseSensitivity = sensitivity; i = 0; while (Math.abs((mc.gameSettings.fovSetting - ((fov + 5F)) / 12.0F)) > 2.5F && i < 200) { mc.gameSettings.fovSetting -= 2.5F; mc.gameSettings.mouseSensitivity -= 0.01F; i++; } break; } } } else { zoomSettingOn = 0; } inUse = zoomSettingOn != 0; if (!inUse && wasInUse) { mc.gameSettings.fovSetting = fov; mc.gameSettings.mouseSensitivity = sensitivity; } } } @Override public boolean hasMenu(ItemStack stack) { return stack.getItemDamage() == 0 || stack.getItemDamage() == 3 || stack.getItemDamage() == 2 || stack.getItemDamage() == 4; } @Override public void use(Entity e, ItemStack stack) { if (stack.getItemDamage() == 4) { if (e == this.player) { if (e.isSneaking()) { zoomSettingOn = (zoomSettingOn + 4 - 1) % 4; } else { zoomSettingOn = (zoomSettingOn + 1) % 4; } } return; } EnableDisableHelper.toggle(stack); } @Override public String getUnlocalizedLabel(ItemStack stack) { if (stack.getItemDamage() == 4) { return "cyberware.gui.active.zoom"; } return EnableDisableHelper.getUnlocalizedLabel(stack); } private static final float[] f = new float[] { 1F, 0F, 0F }; @Override public float[] getColor(ItemStack stack) { if (stack.getItemDamage() == 4) { return null; } return EnableDisableHelper.isEnabled(stack) ? f : null; } @Override public boolean isActive(ItemStack stack) { return stack.getItemDamage() == 2 && EnableDisableHelper.isEnabled(stack); } }