package openblocks.common.item;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import openblocks.Config;
import openblocks.OpenBlocks;
import openblocks.client.model.ModelCraneBackpack;
import openblocks.common.CraneRegistry;
import openmods.infobook.BookDocumentation;
@BookDocumentation(customName = "crane_backpack", hasVideo = true)
public class ItemCraneBackpack extends ItemArmor {
private static final int ARMOR_CHESTPIECE = 1;
public static final String TEXTURE_CRANE = "openblocks:textures/models/crane.png";
public ItemCraneBackpack() {
super(ArmorMaterial.IRON, 2, ARMOR_CHESTPIECE);
setCreativeTab(OpenBlocks.tabOpenBlocks);
}
@Override
public boolean isValidArmor(ItemStack stack, int armorType, Entity entity) {
return armorType == ARMOR_CHESTPIECE;
}
@Override
@SideOnly(Side.CLIENT)
public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) {
return armorSlot == ARMOR_CHESTPIECE? ModelCraneBackpack.instance : null;
}
@Override
public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) {
return TEXTURE_CRANE;
}
private static boolean isPointInBlock(World world, EntityPlayer player, double radius) {
double posX = player.posX
+ radius * MathHelper.cos((player.rotationYaw + 90) * (float)Math.PI / 180);
double posY = player.posY + player.getEyeHeight() + 0.2;
double posZ = player.posZ
+ radius * MathHelper.sin((player.rotationYaw + 90) * (float)Math.PI / 180);
AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(posX - 0.1, posY - 0.1, posZ - 0.1, posX + 0.1, posY + 0.1, posZ + 0.1);
return !world.getCollidingBoundingBoxes(player, aabb).isEmpty();
}
@Override
public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
CraneRegistry.Data data = CraneRegistry.instance.getData(player, true);
if (!world.isRemote) CraneRegistry.instance.ensureMagnetExists(player);
if (Config.doCraneCollisionCheck) {
boolean isColliding = isPointInBlock(world, player, CraneRegistry.ARM_RADIUS)
|| isPointInBlock(world, player, 2 * CraneRegistry.ARM_RADIUS / 3)
|| isPointInBlock(world, player, CraneRegistry.ARM_RADIUS / 3);
if (isColliding) {
player.rotationYaw = data.prevYaw;
player.posX = data.prevPosX;
player.posY = data.prevPosY;
player.posZ = data.prevPosZ;
player.motionX = player.motionY = player.motionZ = 0;
} else {
data.prevYaw = player.rotationYaw;
data.prevPosX = player.posX;
data.prevPosY = player.posY;
data.prevPosZ = player.posZ;
}
}
}
public static boolean isWearingCrane(EntityPlayer player) {
ItemStack armor = player.getCurrentArmor(2);
return armor != null && armor.getItem() instanceof ItemCraneBackpack;
}
}