package com.flansmod.common.teams;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.item.ItemExpireEvent;
import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
import net.minecraftforge.fml.common.FMLCommonHandler;
import com.flansmod.common.EntityItemCustomRender;
import com.flansmod.common.PlayerHandler;
import com.flansmod.common.guns.GunType;
import com.flansmod.common.guns.ItemBullet;
import com.flansmod.common.guns.ItemGun;
import com.flansmod.common.guns.ItemShootable;
import com.flansmod.common.guns.ShootableType;
public class EntityGunItem extends EntityItemCustomRender {
public List<ItemStack> ammoStacks;
private boolean teamsModEnabled = false;
private int age;
public EntityGunItem(World w) {
super(w);
}
public EntityGunItem(EntityItem entity) {
super(entity.worldObj, entity.posX, entity.posY, entity.posZ, entity
.getEntityItem().copy());
setSize(1F, 1F);
ammoStacks = new ArrayList<ItemStack>();
}
public EntityGunItem(World w, double x, double y, double z,
ItemStack stack, List<ItemStack> stacks) {
super(w, x, y, z, stack);
setSize(1F, 1F);
ammoStacks = new ArrayList<ItemStack>();
for (ItemStack ammoStack : stacks) {
if (ammoStack != null && ammoStack.getItem() != null
&& (ammoStack.getItem() instanceof ItemBullet))
ammoStacks.add(ammoStack);
}
teamsModEnabled = true;
}
public EntityGunItem(World w, double x, double y, double z) {
super(w, x, y, z);
}
@Override
public boolean canBeCollidedWith() {
return true;
}
@Override
protected boolean canTriggerWalking() {
return true;
}
@Override
public AxisAlignedBB getEntityBoundingBox() {
return null;
}
@Override
public void onUpdate() {
onEntityUpdate();
if (getEntityItem() == null || getEntityItem().getItem() == null
|| !(getEntityItem().getItem() instanceof ItemGun))
setDead();
if (!worldObj.isRemote && ammoStacks == null)
setDead();
prevPosX = posX;
prevPosY = posY;
prevPosZ = posZ;
motionY -= 0.03999999910593033D;
if (getEntityBoundingBox() != null) {
pushOutOfBlocks(
posX,
(getEntityBoundingBox().minY + getEntityBoundingBox().maxY) / 2.0D,
posZ); // PushOutOfBlocks
}
moveEntity(motionX, motionY, motionZ);
float var2 = 0.98F;
if (onGround) {
var2 = 0.58800006F;
Block block = worldObj.getBlockState(
new BlockPos(MathHelper.floor_double(posX), MathHelper
.floor_double(getEntityBoundingBox().minY) - 1,
MathHelper.floor_double(posZ))).getBlock();
if (block != null) {
var2 = block.slipperiness * 0.98F;
}
}
motionX *= var2;
motionY *= 0.9800000190734863D;
motionZ *= var2;
if (onGround) {
motionY *= -0.5D;
}
++age;
ItemStack item = getDataWatcher().getWatchableObjectItemStack(10);
if (!worldObj.isRemote && age >= lifespan) {
if (item != null) {
ItemExpireEvent event = new ItemExpireEvent(this,
(item.getItem() == null ? 6000 : item.getItem()
.getEntityLifespan(item, worldObj)));
if (MinecraftForge.EVENT_BUS.post(event)) {
lifespan += event.extraLife;
} else {
setDead();
}
} else {
setDead();
}
}
if (item != null && item.stackSize <= 0) {
setDead();
}
// Temporary fire glitch fix
if (worldObj.isRemote)
extinguish();
}
@Override
public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) {
return true;
}
@Override
public void onCollideWithPlayer(EntityPlayer player) {
if (!worldObj.isRemote) {
if (ammoStacks != null && ammoStacks.size() > 0) {
for (int i = 0; i < player.inventory.getSizeInventory(); i++) {
ItemStack stack = player.inventory.getStackInSlot(i);
if (stack != null && stack.getItem() != null
&& stack.getItem() instanceof ItemGun) {
GunType type = ((ItemGun) stack.getItem()).GetType();
for (int j = ammoStacks.size() - 1; j >= 0; j--) {
ItemStack ammoStack = ammoStacks.get(j);
if (type.isAmmo(((ItemShootable) ammoStack
.getItem()).type)) {
if (player.inventory
.addItemStackToInventory(ammoStack)) {
FMLCommonHandler.instance()
.firePlayerItemPickupEvent(player,
this);
playSound(
"random.pop",
0.2F,
((rand.nextFloat() - rand
.nextFloat()) * 0.7F + 1.0F) * 2.0F);
ammoStacks.remove(j);
}
}
}
if (ammoStacks.size() == 0)
setDead();
}
}
} else if (!teamsModEnabled)
super.onCollideWithPlayer(player);
}
}
@Override
public boolean interactFirst(EntityPlayer player) // interact
{
if (worldObj.isRemote)
return true;
EntityItemPickupEvent event = new EntityItemPickupEvent(player, this);
TeamsManager.getInstance().playerLoot(event);
if (!event.isCanceled()) {
ItemStack currentItem = player.getCurrentEquippedItem();
if (currentItem != null && currentItem.getItem() instanceof ItemGun) {
GunType gunType = ((ItemGun) currentItem.getItem()).GetType();
List<ItemStack> newAmmoStacks = new ArrayList<ItemStack>();
for (int i = 0; i < player.inventory.getSizeInventory(); i++) {
ItemStack stack = player.inventory.getStackInSlot(i);
if (stack != null
&& stack.getItem() instanceof ItemShootable) {
ShootableType bulletType = ((ItemShootable) stack
.getItem()).type;
if (gunType.isAmmo(bulletType)) {
newAmmoStacks.add(stack.copy());
player.inventory.setInventorySlotContents(i, null);
}
}
}
EntityGunItem newGunItem = new EntityGunItem(worldObj, posX,
posY, posZ, currentItem.copy(), newAmmoStacks);
worldObj.spawnEntityInWorld(newGunItem);
player.inventory.setInventorySlotContents(
player.inventory.currentItem, getEntityItem());
for (ItemStack stack : ammoStacks) {
player.inventory.addItemStackToInventory(stack);
}
setDead();
PlayerHandler.getPlayerData(player).shootClickDelay = 10;
PlayerHandler.getPlayerData(player).isShootingRight = false;
return true;
}
}
return false;
}
@Override
public boolean canAttackWithItem() {
return true;
}
@Override
public boolean isBurning() {
return false;
}
}