package zmaster587.advancedRocketry.tile; import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import zmaster587.advancedRocketry.api.Configuration; import zmaster587.advancedRocketry.api.stations.ISpaceObject; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.item.ItemAsteroidChip; import zmaster587.advancedRocketry.item.ItemPlanetIdentificationChip; import zmaster587.advancedRocketry.item.ItemStationChip; import zmaster587.advancedRocketry.stations.SpaceObject; import zmaster587.advancedRocketry.stations.SpaceObjectManager; import zmaster587.libVulpes.inventory.modules.IModularInventory; import zmaster587.libVulpes.inventory.modules.ModuleBase; import zmaster587.libVulpes.tile.multiblock.hatch.TileInventoryHatch; import zmaster587.libVulpes.util.BlockPosition; import zmaster587.libVulpes.util.Vector3F; public class TileGuidanceComputer extends TileInventoryHatch implements IModularInventory { int destinationId; Vector3F<Float> landingPos; public TileGuidanceComputer() { super(1); landingPos = new Vector3F<Float>(0f, 0f, 0f); destinationId = -1; } @Override public List<ModuleBase> getModules(int ID, EntityPlayer player) { return super.getModules(ID, player); } @Override public int getInventoryStackLimit() { return 1; } /** * Gets the dimension to travel to if applicable * @return The dimension to travel to or -1 if not valid */ public int getDestinationDimId(int currentDimension, int x, int z) { ItemStack stack = getStackInSlot(0); if(stack != null){ Item itemType = stack.getItem(); if (itemType instanceof ItemPlanetIdentificationChip) { ItemPlanetIdentificationChip item = (ItemPlanetIdentificationChip)itemType; return item.getDimensionId(stack); } else if(itemType instanceof ItemStationChip) { if(Configuration.spaceDimId == currentDimension) { ISpaceObject object = SpaceObjectManager.getSpaceManager().getSpaceStationFromBlockCoords((int)x, (int)z); if(object != null) return object.getOrbitingPlanetId(); return -1; } return Configuration.spaceDimId; } else if(itemType instanceof ItemAsteroidChip) { return currentDimension; } } return destinationId; } /** * returns the location the rocket should land * @return */ public Vector3F<Float> getLandingLocation(int landingDimension, boolean commit) { ItemStack stack = getStackInSlot(0); if(stack != null && stack.getItem() instanceof ItemStationChip) { ItemStationChip chip = (ItemStationChip)stack.getItem(); if(landingDimension == Configuration.spaceDimId) { //TODO: handle Exception Long uuid = chip.getUUID(stack); if(uuid == null) return null; ISpaceObject object = SpaceObjectManager.getSpaceManager().getSpaceStation((int)(long)uuid); BlockPosition vec = null; if(object instanceof SpaceObject) vec = ((SpaceObject)object).getNextLandingPad(commit); if(object == null) return null; if(vec == null) vec = object.getSpawnLocation(); return new Vector3F<Float>(new Float(vec.x), new Float(vec.y), new Float(vec.z)); } else { return chip.getTakeoffCoords(stack, landingDimension); } } if(destinationId != -1) return landingPos; return null; } public void setFallbackDestination(int dimID, Vector3F<Float> coords) { this.destinationId = dimID; this.landingPos = coords; } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setInteger("destDimId", destinationId); nbt.setFloat("landingx", landingPos.x); nbt.setFloat("landingy", landingPos.y); nbt.setFloat("landingz", landingPos.z); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); destinationId = nbt.getInteger("destDimId"); landingPos.x = nbt.getFloat("landingx"); landingPos.y = nbt.getFloat("landingy"); landingPos.z = nbt.getFloat("landingz"); } @Override public void setInventorySlotContents(int slot, ItemStack stack) { super.setInventorySlotContents(slot, stack); //If the item in the slot is modified then reset dimid if(stack != null) destinationId = -1; } public void setReturnPosition(Vector3F<Float> pos, int dimid) { ItemStack stack = getStackInSlot(0); if(stack != null && stack.getItem() instanceof ItemStationChip) { ItemStationChip item = (ItemStationChip)stack.getItem(); item.setTakeoffCoords(stack, pos, dimid); } } @Override public String getModularInventoryName() { return "tile.guidanceComputer.name"; } }