package com.flansmod.common.driveables; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.BlockLiquid; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.BlockPos; import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.MovingObjectPosition.MovingObjectType; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import com.flansmod.common.FlansMod; import com.flansmod.common.parts.PartType; import com.flansmod.common.types.EnumType; import com.flansmod.common.types.IFlanItem; import com.flansmod.common.types.IPaintableItem; import com.flansmod.common.types.InfoType; import com.flansmod.common.types.PaintableType; public class ItemPlane extends Item implements IPaintableItem { public PlaneType type; public ItemPlane(PlaneType type1) { maxStackSize = 1; type = type1; type.item = this; setCreativeTab(FlansMod.tabFlanDriveables); GameRegistry.registerItem(this, type.shortName, FlansMod.MODID); } @Override /** Make sure client and server side NBTtags update */ public boolean getShareTag() { return true; } private NBTTagCompound getTagCompound(ItemStack stack, World world) { if(stack.getTagCompound() == null) { if(!world.isRemote && stack.getItemDamage() != 0) stack.setTagCompound(getOldTagCompound(stack, world)); if(stack.getTagCompound() == null) { NBTTagCompound tags = new NBTTagCompound(); stack.setTagCompound(tags); tags.setString("Type", type.shortName); tags.setString("Engine", PartType.defaultEngines.get(EnumType.plane).shortName); } } return stack.getTagCompound(); } private NBTTagCompound getOldTagCompound(ItemStack stack, World world) { try { File file1 = world.getSaveHandler().getMapFileFromName("plane_" + stack.getItemDamage()); if(file1 != null && file1.exists()) { FileInputStream fileinputstream = new FileInputStream(file1); NBTTagCompound tags = CompressedStreamTools.readCompressed(fileinputstream).getCompoundTag("data"); for(EnumDriveablePart part : EnumDriveablePart.values()) { tags.setInteger(part.getShortName() + "_Health", type.health.get(part) == null ? 0 : type.health.get(part).health); tags.setBoolean(part.getShortName() + "_Fire", false); } fileinputstream.close(); return tags; } } catch(IOException e) { FlansMod.log("Failed to read old vehicle file"); e.printStackTrace(); } return null; } @Override public void addInformation(ItemStack stack, EntityPlayer player, List lines, boolean advancedTooltips) { NBTTagCompound tags = getTagCompound(stack, player.worldObj); String engineName = tags.getString("Engine"); PartType part = PartType.getPart(engineName); if(part != null) lines.add(part.name); } @Override public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer) { //Raytracing float cosYaw = MathHelper.cos(-entityplayer.rotationYaw * 0.01745329F - 3.141593F); float sinYaw = MathHelper.sin(-entityplayer.rotationYaw * 0.01745329F - 3.141593F); float cosPitch = -MathHelper.cos(-entityplayer.rotationPitch * 0.01745329F); float sinPitch = MathHelper.sin(-entityplayer.rotationPitch * 0.01745329F); double length = 5D; Vec3 posVec = new Vec3(entityplayer.posX, entityplayer.posY + 1.62D - entityplayer.getYOffset(), entityplayer.posZ); Vec3 lookVec = posVec.addVector(sinYaw * cosPitch * length, sinPitch * length, cosYaw * cosPitch * length); MovingObjectPosition movingobjectposition = world.rayTraceBlocks(posVec, lookVec, type.placeableOnWater); //Result check if(movingobjectposition == null) { return itemstack; } if(movingobjectposition.typeOfHit == MovingObjectType.BLOCK) { BlockPos pos = movingobjectposition.getBlockPos(); Block block = world.getBlockState(pos).getBlock(); if(type.placeableOnLand || block instanceof BlockLiquid) { if(!world.isRemote) { DriveableData data = getPlaneData(itemstack, world); if(data != null) world.spawnEntityInWorld(new EntityPlane(world, (double)pos.getX() + 0.5F, (double)pos.getY() + 2.5F, (double)pos.getZ() + 0.5F, entityplayer, type, data)); } if(!entityplayer.capabilities.isCreativeMode) { itemstack.stackSize--; } } } return itemstack; } public Entity spawnPlane(World world, double x, double y, double z, ItemStack stack) { DriveableData data = getPlaneData(stack, world); if(data != null) { Entity entity = new EntityPlane(world, x, y, z, type, data); if(!world.isRemote) { world.spawnEntityInWorld(entity); } return entity; } return null; } public DriveableData getPlaneData(ItemStack itemstack, World world) { return new DriveableData(getTagCompound(itemstack, world), itemstack.getItemDamage()); } @Override @SideOnly(Side.CLIENT) public int getColorFromItemStack(ItemStack par1ItemStack, int par2) { return type.colour; } /** Make sure that creatively spawned planes have nbt data */ @Override public void getSubItems(Item item, CreativeTabs tabs, List list) { ItemStack planeStack = new ItemStack(item, 1, 0); NBTTagCompound tags = new NBTTagCompound(); tags.setString("Type", type.shortName); if(PartType.defaultEngines.containsKey(EnumType.plane)) tags.setString("Engine", PartType.defaultEngines.get(EnumType.plane).shortName); for(EnumDriveablePart part : EnumDriveablePart.values()) { tags.setInteger(part.getShortName() + "_Health", type.health.get(part) == null ? 0 : type.health.get(part).health); tags.setBoolean(part.getShortName() + "_Fire", false); } planeStack.setTagCompound(tags); list.add(planeStack); } @Override public InfoType getInfoType() { return type; } @Override public PaintableType GetPaintableType() { return type; } }