package zmaster587.advancedRocketry.item.components;
import java.lang.reflect.Field;
import java.util.List;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.relauncher.ReflectionHelper;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidContainerItem;
import zmaster587.advancedRocketry.AdvancedRocketry;
import zmaster587.advancedRocketry.api.AdvancedRocketryFluids;
import zmaster587.advancedRocketry.api.AdvancedRocketryItems;
import zmaster587.advancedRocketry.api.Configuration;
import zmaster587.advancedRocketry.dimension.DimensionManager;
import zmaster587.advancedRocketry.inventory.TextureResources;
import zmaster587.libVulpes.api.IArmorComponent;
import zmaster587.libVulpes.api.IJetPack;
import zmaster587.libVulpes.api.IModularArmor;
import zmaster587.libVulpes.client.ResourceIcon;
import zmaster587.libVulpes.util.InputSyncHandler;
public class ItemJetpack extends Item implements IArmorComponent, IJetPack {
Field flySpeed;
private static enum MODES {
NORMAL,
HOVER;
}
public ItemJetpack() {
flySpeed = ReflectionHelper.findField(net.minecraft.entity.player.PlayerCapabilities.class, "flySpeed", "field_75096_f");
flySpeed.setAccessible(true);
}
private static final ResourceIcon jetpackHover = new ResourceIcon(TextureResources.jetpackIconHover);
private static final ResourceIcon jetpackEnabled = new ResourceIcon(TextureResources.jetpackIconEnabled);
private static final ResourceIcon jetpackDisabled = new ResourceIcon(TextureResources.jetpackIconDisabled);
private ResourceLocation background = TextureResources.rocketHud;
@Override
public void onTick(World world, EntityPlayer player,
ItemStack armorStack, IInventory inv, ItemStack componentStack) {
if(player.capabilities.isCreativeMode) {
try {
flySpeed.setFloat(player.capabilities, 0.05f);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return;
}
int speedUpgrades = 1;
boolean allowsHover = false;
ItemStack helm = player.getEquipmentInSlot(4);
if(helm != null && helm.getItem() instanceof IModularArmor) {
List<ItemStack> helmInv = ((IModularArmor)helm.getItem()).getComponents(helm);
for(ItemStack stack : helmInv) {
if(stack != null) {
Item item = stack.getItem();
if (item == AdvancedRocketryItems.itemUpgrade)
if(stack.getItemDamage() == 0)
allowsHover = true;
else if(stack.getItemDamage() == 1)
speedUpgrades++;
}
}
}
MODES mode = getMode(componentStack);
boolean isActive = isActive(componentStack, player);
try {
flySpeed.setFloat(player.capabilities, speedUpgrades*0.02f);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//ObfuscationReflectionHelper.setPrivateValue(net.minecraft.entity.player.PlayerCapabilities.class, player.capabilities, speedUpgrades*0.02f, "flySpeed");
player.capabilities.isFlying = false;
if(isEnabled(componentStack)) {
if(mode == MODES.HOVER) {
if(!allowsHover)
changeMode(componentStack, inv, player);
if((isActive || player.isSneaking()) && !player.onGround)
setHeight(componentStack, (int)player.posY + player.height);
onAccelerate(componentStack, inv, player);
}
else if(isActive) {
onAccelerate(componentStack, inv, player);
}
}
}
@Override
public boolean onComponentAdded(World world, ItemStack armorStack) {
return true;
}
@Override
public void onComponentRemoved(World world, ItemStack armorStack) {
}
@Override
public void onArmorDamaged(EntityLivingBase entity, ItemStack armorStack,
ItemStack componentStack, DamageSource source, int damage) {
}
@Override
public boolean isActive(ItemStack stack, EntityPlayer player) {
return InputSyncHandler.isSpaceDown(player);
}
@Override
public boolean isEnabled(ItemStack stack) {
return stack.hasTagCompound() && stack.getTagCompound().getBoolean("enabled");
}
@Override
public void setEnabledState(ItemStack stack, boolean state) {
NBTTagCompound nbt;
if(stack.hasTagCompound()) {
nbt = stack.getTagCompound();
nbt.setBoolean("enabled", state);
}
else if(state) {
nbt = new NBTTagCompound();
nbt.setBoolean("enabled", state);
stack.setTagCompound(nbt);
}
}
@Override
public void onAccelerate(ItemStack stack, IInventory inv, EntityPlayer player) {
boolean hasFuel = false;
MODES mode = getMode(stack);
for(int i = 0; i < inv.getSizeInventory(); i++) {
ItemStack fuelTank = inv.getStackInSlot(i);
if(fuelTank != null && fuelTank.getItem() instanceof IFluidContainerItem) {
FluidStack fluid = ((IFluidContainerItem)fuelTank.getItem()).drain(fuelTank, 1, false);
if(fluid != null && fluid.getFluidID() == FluidRegistry.getFluidID(AdvancedRocketryFluids.fluidHydrogen)) {
((IFluidContainerItem)fuelTank.getItem()).drain(fuelTank, 1, true);
hasFuel = true;
break;
}
}
}
if(hasFuel) {
if(mode == MODES.HOVER) {
if(Configuration.jetPackThrust > DimensionManager.getInstance().getDimensionProperties(player.worldObj.provider.dimensionId).getGravitationalMultiplier())
player.capabilities.isFlying = true;
} else
player.addVelocity(0, (double)Configuration.jetPackThrust*0.1, 0);
if(player.worldObj.isRemote) {
double xPos = player.posX;
double zPos = player.posZ;
float playerRot = (float) ((Math.PI/180f)*(player.rotationYaw - 55));
xPos = player.posX + MathHelper.cos(playerRot)*.4f;
zPos = player.posZ + MathHelper.sin(playerRot)*.4f;
float ejectSpeed = mode == MODES.HOVER ? 0.1f : 0.3f;
//AdvancedRocketry.proxy.spawnParticle("smallRocketFlame", player.worldObj, xPos, player.posY - 0.75, zPos, (player.worldObj.rand.nextFloat() - 0.5f)/18f,-.1 ,(player.worldObj.rand.nextFloat() - 0.5f)/18f);
AdvancedRocketry.proxy.spawnParticle("smallRocketFlame", player.worldObj, xPos, player.posY - 0.75, zPos, 0, player.motionY -ejectSpeed ,0);
playerRot = (float) ((Math.PI/180f)*(player.rotationYaw - 125));
xPos = player.posX + MathHelper.cos(playerRot)*.4f;
zPos = player.posZ + MathHelper.sin(playerRot)*.4f;
AdvancedRocketry.proxy.spawnParticle("smallRocketFlame", player.worldObj, xPos, player.posY - 0.75, zPos, 0, player.motionY -ejectSpeed ,0);
}
if(player.motionY > -1) {
player.fallDistance = 0;
}
}
}
@Override
@SideOnly(Side.CLIENT)
public ResourceIcon getComponentIcon(ItemStack armorStack) {
return isEnabled(armorStack) ? getMode(armorStack) == MODES.HOVER ? jetpackHover : jetpackEnabled : jetpackDisabled;
}
private MODES getMode(ItemStack stack) {
if(stack.hasTagCompound())
return MODES.values()[stack.getTagCompound().getInteger("mode")];
return MODES.values()[0];
}
private void setHeight(ItemStack stack, float height) {
if(stack.hasTagCompound())
stack.getTagCompound().setFloat("height", height);
else {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setFloat("height", height);
stack.setTagCompound(nbt);
}
}
private float getHeight(ItemStack stack) {
if(stack.hasTagCompound())
return stack.getTagCompound().getFloat("height");
return 0;
}
@Override
public void changeMode(ItemStack stack, IInventory modules, EntityPlayer player) {
NBTTagCompound nbt;
int mode = 0;
ItemStack helm = player.getEquipmentInSlot(4);
if(helm != null && helm.getItem() instanceof IModularArmor) {
List<ItemStack> helmInv = ((IModularArmor)helm.getItem()).getComponents(helm);
for(ItemStack helmStack : helmInv)
if (stack != null && helmStack.getItem() == AdvancedRocketryItems.itemUpgrade && helmStack.getItemDamage() == 0) {
mode = 1;
break;
}
}
if(stack.hasTagCompound()) {
nbt = stack.getTagCompound();
if(mode == 1) {
mode = nbt.getInteger("mode");
mode++;
if(mode >= MODES.values().length)
mode =0;
}
nbt.setInteger("mode", mode);
}
else {
nbt = new NBTTagCompound();
nbt.setInteger("mode", mode);
stack.setTagCompound(nbt);
}
if(mode == MODES.HOVER.ordinal())
setHeight(stack, (float)player.posY + player.height);
}
@Override
public boolean isAllowedInSlot(ItemStack stack, int slot) {
return slot == 1;
}
@Override
@SideOnly(Side.CLIENT)
public void renderScreen(ItemStack componentStack, List<ItemStack> modules, RenderGameOverlayEvent event, Gui gui) {
List<ItemStack> inv = modules;
int amt = 0, maxAmt = 0;
for(int i = 0; i < inv.size(); i++) {
ItemStack currentStack = inv.get(i);
if(currentStack != null && currentStack.getItem() instanceof IFluidContainerItem ) {
FluidStack fluid = ((IFluidContainerItem)currentStack.getItem()).getFluid(currentStack);
if(fluid == null)
maxAmt += ((IFluidContainerItem)currentStack.getItem()).getCapacity(currentStack);
else if(fluid.getFluidID() == AdvancedRocketryFluids.fluidHydrogen.getID()) {
maxAmt += ((IFluidContainerItem)currentStack.getItem()).getCapacity(currentStack);
amt += fluid.amount;
}
}
}
if(maxAmt > 0) {
float size = amt/(float)maxAmt;
Minecraft.getMinecraft().renderEngine.bindTexture(background);
GL11.glColor3f(1f, 1f, 1f);
int width = 83;
int screenX = event.resolution.getScaledWidth()/2 + 8;
int screenY = event.resolution.getScaledHeight() - 74;
//Draw BG
gui.drawTexturedModalRect(screenX, screenY, 23, 34, width, 17);
gui.drawTexturedModalRect(screenX , screenY, 23, 51, (int)(width*size), 17);
}
}
}