package zmaster587.advancedRocketry.tile; import java.util.LinkedList; import java.util.List; import cpw.mods.fml.relauncher.Side; import zmaster587.advancedRocketry.api.AdvancedRocketryBlocks; import zmaster587.advancedRocketry.api.AdvancedRocketryItems; import zmaster587.advancedRocketry.inventory.TextureResources; import zmaster587.advancedRocketry.item.ItemPackedStructure; import zmaster587.advancedRocketry.item.ItemStationChip; import zmaster587.advancedRocketry.stations.SpaceObject; import zmaster587.advancedRocketry.stations.SpaceObjectManager; import zmaster587.advancedRocketry.util.StorageChunk; import zmaster587.libVulpes.api.LibVulpesBlocks; import zmaster587.libVulpes.inventory.modules.ModuleBase; import zmaster587.libVulpes.inventory.modules.ModuleButton; import zmaster587.libVulpes.inventory.modules.ModulePower; import zmaster587.libVulpes.inventory.modules.ModuleProgress; import zmaster587.libVulpes.inventory.modules.ModuleSlotArray; import zmaster587.libVulpes.inventory.modules.ModuleSync; import zmaster587.libVulpes.inventory.modules.ModuleText; import zmaster587.libVulpes.inventory.modules.ModuleTexturedSlotArray; import zmaster587.libVulpes.util.EmbeddedInventory; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; public class TileStationBuilder extends TileRocketBuilder implements IInventory { EmbeddedInventory inventory; Long storedId; public TileStationBuilder() { super(); inventory = new EmbeddedInventory(4); status = ErrorCodes.EMPTY; } @Override public boolean canScan() { ItemStack stack = new ItemStack(AdvancedRocketryBlocks.blockLoader,1,1); if(inventory.getStackInSlot(0) == null || !stack.isItemEqual(inventory.getStackInSlot(0))) { status = ErrorCodes.NOSATELLITEHATCH; return false; } if(inventory.getStackInSlot(1) == null || AdvancedRocketryItems.itemSpaceStationChip != inventory.getStackInSlot(1).getItem()) { status = ErrorCodes.NOSATELLITECHIP; return false; } if( inventory.getStackInSlot(2) != null || inventory.getStackInSlot(3) != null) { status = ErrorCodes.OUTPUTBLOCKED; return false; } return super.canScan(); } @Override public void scanRocket(World world, int x, int y, int z, AxisAlignedBB bb) { int actualMinX = (int)bb.maxX, actualMinY = (int)bb.maxY, actualMinZ = (int)bb.maxZ, actualMaxX = (int)bb.minX, actualMaxY = (int)bb.minY, actualMaxZ = (int)bb.minZ; for(int xCurr = (int)bb.minX; xCurr <= bb.maxX; xCurr++) { for(int zCurr = (int)bb.minZ; zCurr <= bb.maxZ; zCurr++) { for(int yCurr = (int)bb.minY; yCurr<= bb.maxY; yCurr++) { Block block = world.getBlock(xCurr, yCurr, zCurr); if(!block.isAir(world, xCurr, yCurr, zCurr)) { if(xCurr < actualMinX) actualMinX = xCurr; if(yCurr < actualMinY) actualMinY = yCurr; if(zCurr < actualMinZ) actualMinZ = zCurr; if(xCurr > actualMaxX) actualMaxX = xCurr; if(yCurr > actualMaxY) actualMaxY = yCurr; if(zCurr > actualMaxZ) actualMaxZ = zCurr; } } } } status = ErrorCodes.SUCCESS_STATION; } @Override public void assembleRocket() { if(!worldObj.isRemote) { if(bbCache == null) return; //Need to scan again b/c something may have changed scanRocket(worldObj, xCoord, yCoord, zCoord, bbCache); if(status != ErrorCodes.SUCCESS_STATION) return; StorageChunk storageChunk = StorageChunk.cutWorldBB(worldObj, bbCache); ItemStack outputStack; SpaceObject object = null; if(storedId == null) { object = new SpaceObject(); SpaceObjectManager.getSpaceManager().registerSpaceObject(object, -1); outputStack = new ItemStack(AdvancedRocketryItems.itemSpaceStation,1,object.getId()); } else outputStack = new ItemStack(AdvancedRocketryItems.itemSpaceStation,1, (int)(long)storedId); ((ItemPackedStructure)outputStack.getItem()).setStructure(outputStack, storageChunk); inventory.setInventorySlotContents(2, outputStack); if(storedId == null) { outputStack = new ItemStack(AdvancedRocketryItems.itemSpaceStationChip,1); ItemStationChip.setUUID(outputStack, object.getId()); inventory.setInventorySlotContents(3, outputStack); } this.status = ErrorCodes.FINISHED; storedId = null; this.markDirty(); this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } } @Override protected void updateText() { errorText.setText(status.getErrorCode()); } @Override public List<ModuleBase> getModules(int ID, EntityPlayer player) { List<ModuleBase> modules = new LinkedList<ModuleBase>(); modules.add(new ModulePower(160, 30, this)); modules.add(new ModuleProgress(149, 30, 2, verticalProgressBar, this)); modules.add(new ModuleButton(5, 34, 0, "Scan", this, zmaster587.libVulpes.inventory.TextureResources.buttonScan)); ModuleButton buttonBuild; modules.add(buttonBuild = new ModuleButton(5, 60, 1, "Build", this, zmaster587.libVulpes.inventory.TextureResources.buttonBuild)); buttonBuild.setColor(0xFFFF2222); modules.add(errorText = new ModuleText(5, 24, "", 0xFFFFFF22)); modules.add(new ModuleSync(4, this)); updateText(); modules.add(new ModuleSlotArray(90, 20, inventory, 0, 1)); modules.add(new ModuleTexturedSlotArray(108, 20, inventory, 1, 2, TextureResources.idChip)); modules.add(new ModuleSlotArray(90, 60, inventory, 2, 4)); return modules; } @Override public void useNetworkData(EntityPlayer player, Side side, byte id, NBTTagCompound nbt) { super.useNetworkData(player, side, id, nbt); if(id == 1 && canScan()) { inventory.decrStackSize(0, 1); storedId = (long)ItemStationChip.getUUID(inventory.getStackInSlot(1)); if(storedId == 0) storedId = null; if(storedId == null) inventory.decrStackSize(1, 1); } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); inventory.writeToNBT(nbt); if(storedId != null) { nbt.setLong("storedID", storedId); } } public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); inventory.readFromNBT(nbt); if(nbt.hasKey("storedID")) { storedId = nbt.getLong("storedID"); } } @Override public int getSizeInventory() { return inventory.getSizeInventory(); } @Override public ItemStack getStackInSlot(int slot) { return inventory.getStackInSlot(slot); } @Override public ItemStack decrStackSize(int slot, int amt) { return inventory.decrStackSize(slot, amt); } @Override public ItemStack getStackInSlotOnClosing(int slot) { return inventory.getStackInSlotOnClosing(slot); } @Override public void setInventorySlotContents(int slot, ItemStack stack) { inventory.setInventorySlotContents(slot, stack); } @Override public String getInventoryName() { return "tile.stationBuilder.name"; } @Override public boolean hasCustomInventoryName() { return false; } @Override public int getInventoryStackLimit() { return inventory.getInventoryStackLimit(); } @Override public boolean isUseableByPlayer(EntityPlayer player) { return inventory.isUseableByPlayer(player); } @Override public void openInventory() { } @Override public void closeInventory() { } @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return inventory.isItemValidForSlot(slot, stack); } }