package zmaster587.advancedRocketry.tile.Satellite; import java.util.LinkedList; import java.util.List; import io.netty.buffer.ByteBuf; import cpw.mods.fml.relauncher.Side; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraftforge.common.util.ForgeDirection; import zmaster587.advancedRocketry.api.DataStorage; import zmaster587.advancedRocketry.api.DataStorage.DataType; import zmaster587.advancedRocketry.api.satellite.IDataHandler; import zmaster587.advancedRocketry.api.satellite.SatelliteBase; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.inventory.TextureResources; import zmaster587.advancedRocketry.inventory.modules.ModuleData; import zmaster587.advancedRocketry.inventory.modules.ModuleSatellite; import zmaster587.advancedRocketry.item.ItemData; import zmaster587.advancedRocketry.item.ItemSatelliteIdentificationChip; import zmaster587.advancedRocketry.satellite.SatelliteData; import zmaster587.advancedRocketry.util.IDataInventory; import zmaster587.libVulpes.inventory.modules.IButtonInventory; import zmaster587.libVulpes.inventory.modules.IModularInventory; import zmaster587.libVulpes.inventory.modules.ModuleBase; import zmaster587.libVulpes.inventory.modules.ModuleButton; import zmaster587.libVulpes.inventory.modules.ModulePower; import zmaster587.libVulpes.inventory.modules.ModuleSlotArray; import zmaster587.libVulpes.inventory.modules.ModuleText; import zmaster587.libVulpes.inventory.modules.ModuleToggleSwitch; import zmaster587.libVulpes.network.PacketHandler; import zmaster587.libVulpes.network.PacketMachine; import zmaster587.libVulpes.tile.TileInventoriedRFConsumer; import zmaster587.libVulpes.util.INetworkMachine; public class TileEntitySatelliteControlCenter extends TileInventoriedRFConsumer implements INetworkMachine, IModularInventory, IButtonInventory, IDataInventory { //ModuleText satelliteText; ModuleSatellite moduleSatellite; ModuleText moduleText; DataStorage data; public TileEntitySatelliteControlCenter() { super(10000, 2); data = new DataStorage(); data.setMaxData(1000); } @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { return new int[0]; } @Override public String getModularInventoryName() { return "container.satelliteMonitor"; } @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return true; } @Override public boolean canPerformFunction() { return worldObj.getTotalWorldTime() % 16 == 0 && getSatelliteFromSlot(0) != null; } @Override public int getPowerPerOperation() { return 1; } @Override public void performFunction() { if(worldObj.isRemote) updateInventoryInfo(); } @Override public void writeDataToNetwork(ByteBuf out, byte packetId) { } @Override public void readDataFromNetwork(ByteBuf in, byte packetId, NBTTagCompound nbt) { } @Override public void updateEntity() { super.updateEntity(); } @Override public void useNetworkData(EntityPlayer player, Side side, byte id, NBTTagCompound nbt) { if(id == 0) { storeData(); } else if( id == 100 ) { SatelliteBase satellite = moduleSatellite.getSatellite(); if(satellite != null && satellite.getDimensionId() == this.worldObj.provider.dimensionId) { satellite.performAction(player, worldObj, xCoord, yCoord, zCoord); } } else if( id == 101) { onInventoryButtonPressed(id - 100); } } @Override public void setInventorySlotContents(int slot, ItemStack stack) { super.setInventorySlotContents(slot, stack); moduleSatellite.setSatellite(getSatelliteFromSlot(0)); updateInventoryInfo(); } public void updateInventoryInfo() { if(moduleText != null) { SatelliteBase satellite = moduleSatellite.getSatellite(); if(satellite != null) { if(getEnergyStored() < getPowerPerOperation()) moduleText.setText("Not Enough power!"); else if(satellite.getDimensionId() != DimensionManager.getEffectiveDimId(worldObj, xCoord, zCoord).getId()) { moduleText.setText(satellite.getName() + "\n\nToo Far" ); } else moduleText.setText(satellite.getName() + "\n\nInfo:\n" + satellite.getInfo(worldObj)); } else moduleText.setText("No Link..."); } } public SatelliteBase getSatelliteFromSlot(int slot) { ItemStack stack = getStackInSlot(slot); if(stack != null && stack.getItem() instanceof ItemSatelliteIdentificationChip) { ItemSatelliteIdentificationChip idchip = (ItemSatelliteIdentificationChip)stack.getItem(); return idchip.getSatellite(stack); } return null; } @Override public List<ModuleBase> getModules(int ID, EntityPlayer player) { List<ModuleBase> modules = new LinkedList<ModuleBase>(); modules.add(new ModulePower(18, 20, this.energy)); modules.add(new ModuleButton(116, 70, 0, "Connect!", this, zmaster587.libVulpes.inventory.TextureResources.buttonBuild)); modules.add(new ModuleButton(173, 3, 1, "", this, TextureResources.buttonKill, "Destroy Satellite", 24, 24)); modules.add(new ModuleData(28, 20, 1, this, data)); moduleSatellite = new ModuleSatellite(152, 10, this, 0); modules.add(moduleSatellite); //Try to assign a satellite ASAP moduleSatellite.setSatellite(getSatelliteFromSlot(0)); moduleText = new ModuleText(60, 20, "No Link...", 0x404040); modules.add(moduleText); updateInventoryInfo(); return modules; } @Override public void onInventoryButtonPressed(int buttonId) { if(buttonId == 0) { PacketHandler.sendToServer(new PacketMachine(this, (byte)(100 + buttonId)) ); } else if(buttonId == 1) { ItemStack stack = getStackInSlot(0); if(stack != null && stack.getItem() instanceof ItemSatelliteIdentificationChip) { ItemSatelliteIdentificationChip idchip = (ItemSatelliteIdentificationChip)stack.getItem(); SatelliteBase satellite = idchip.getSatellite(stack); //Somebody might want to erase the chip of an already existing satellite if(satellite != null) DimensionManager.getInstance().getDimensionProperties(satellite.getDimensionId()).removeSatellite(satellite.getId()); idchip.erase(stack); setInventorySlotContents(0, stack); PacketHandler.sendToServer(new PacketMachine(this, (byte)(100 + buttonId)) ); } } } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); NBTTagCompound data = new NBTTagCompound(); this.data.writeToNBT(data); nbt.setTag("data", data); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagCompound data = nbt.getCompoundTag("data"); this.data.readFromNBT(data); } @Override public void loadData() { } @Override public void storeData() { if(!worldObj.isRemote) { ItemStack inv = getStackInSlot(1); if(inv != null && inv.getItem() instanceof ItemData && inv.stackSize == 1) { ItemData dataItem = (ItemData)inv.getItem(); data.removeData(dataItem.addData(inv, data.getData(), data.getDataType()), true); } } else { PacketHandler.sendToServer(new PacketMachine(this, (byte)0)); } } @Override public int extractData(int maxAmount, DataType type, ForgeDirection dir, boolean commit) { //TODO if(type == data.getDataType() || data.getDataType() == DataType.UNDEFINED) { SatelliteBase satellite = getSatelliteFromSlot(0); if(satellite != null && satellite instanceof SatelliteData && satellite.getDimensionId() == this.worldObj.provider.dimensionId) { satellite.performAction(null, worldObj, this.xCoord, this.yCoord, this .zCoord); } return data.removeData(maxAmount, commit); } return 0; } @Override public int addData(int maxAmount, DataType type, ForgeDirection dir, boolean commit) { if(dir == ForgeDirection.UNKNOWN) return data.addData(maxAmount, type, commit); return 0; } @Override public boolean canInteractWithContainer(EntityPlayer entity) { return true; } }