package zmaster587.advancedRocketry.satellite; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import zmaster587.advancedRocketry.api.DataStorage; import zmaster587.advancedRocketry.api.SatelliteRegistry; import zmaster587.advancedRocketry.api.DataStorage.DataType; import zmaster587.advancedRocketry.api.satellite.IDataHandler; import zmaster587.advancedRocketry.api.satellite.SatelliteBase; import zmaster587.advancedRocketry.api.satellite.SatelliteProperties; import zmaster587.advancedRocketry.item.ItemSatelliteIdentificationChip; import zmaster587.advancedRocketry.util.IDataInventory; import zmaster587.libVulpes.util.ZUtils; public abstract class SatelliteData extends SatelliteBase { DataStorage data; long lastActionTime, prevLastActionTime; @Override public String getInfo(World world) { //tiles dont update unless ppl reopen return "Power: " + satelliteProperties.getPowerStorage() + "\nData Storage: " + ZUtils.formatNumber(data.getMaxData()) + "\nData: " + ZUtils.formatNumber((data.getData() + dataCreated(world))); } private int dataCreated(World world) { return Math.min(data.getMaxData() - data.getData() , (int)Math.max(0, (world.getTotalWorldTime() - lastActionTime)/200)); //TODO: change from 10 seconds } @Override public boolean acceptsItemInConstruction(ItemStack item) { int flag = SatelliteRegistry.getSatelliteProperty(item).getPropertyFlag(); return super.acceptsItemInConstruction(item) || SatelliteProperties.Property.DATA.isOfType(flag) || SatelliteProperties.Property.POWER_GEN.isOfType(flag); } @Override public void setProperties(SatelliteProperties satelliteProperties) { super.setProperties(satelliteProperties); data.setMaxData(satelliteProperties.getMaxDataStorage()); } @Override public boolean performAction(EntityPlayer player, World world, int x, int y, int z) { //Calculate Data Recieved //TODO: pay attn to power int dataCreated = dataCreated(world); if(dataCreated > 0) { data.addData(dataCreated(world), data.getDataType(), true); lastActionTime = world.getTotalWorldTime(); } TileEntity tile = world.getTileEntity(x, y, z); if(tile instanceof IDataHandler) { IDataInventory dataInv = (IDataInventory)tile; data.removeData(dataInv.addData(data.getData(), data.getDataType(), ForgeDirection.UNKNOWN, true), true); } return false; } @Override public void setDimensionId(World world) { //TODO: send packet on orbit reached super.setDimensionId(world); lastActionTime = world.getTotalWorldTime(); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.data.readFromNBT(nbt.getCompoundTag("data")); lastActionTime = nbt.getLong("lastActionTime"); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); NBTTagCompound data = new NBTTagCompound(); this.data.writeToNBT(data); nbt.setTag("data", data); nbt.setLong("lastActionTime",lastActionTime); } @Override public int numberChangesToSend() { return 4; } @Override public void onChangeRecieved(int slot, int value) { lastActionTime = ( lastActionTime & ( ~(0xffffl << (slot*16) ) ) ) | ( ( long )value << (slot*16) ); } @Override public void sendChanges(Container container, ICrafting crafter, int variableId, int localId) { crafter.sendProgressBarUpdate(container, variableId, (short)(( lastActionTime >>> (localId*16) ) & 0xffff)); if(localId == 3) prevLastActionTime=lastActionTime; } @Override public boolean isUpdateRequired(int localId) { return lastActionTime != prevLastActionTime; } }