package crazypants.enderio.machine.monitor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; import com.enderio.core.common.util.DyeColor; import crazypants.enderio.EnderIO; import crazypants.enderio.ModObject; import crazypants.enderio.conduit.AbstractConduitNetwork; import crazypants.enderio.conduit.ConduitUtil; import crazypants.enderio.conduit.power.IPowerConduit; import crazypants.enderio.conduit.power.NetworkPowerManager; import crazypants.enderio.conduit.power.PowerConduitNetwork; import crazypants.enderio.conduit.power.PowerTracker; import crazypants.enderio.conduit.redstone.Signal; import crazypants.enderio.machine.AbstractPowerConsumerEntity; import crazypants.enderio.machine.IoMode; import crazypants.enderio.machine.SlotDefinition; import crazypants.enderio.network.PacketHandler; import crazypants.enderio.power.IInternalPoweredTile; public class TilePowerMonitor extends AbstractPowerConsumerEntity implements IInternalPoweredTile { int energyPerTick = 1; int powerInConduits; int maxPowerInConduits; long powerInCapBanks; long maxPowerInCapBanks; long powerInMachines; long maxPowerInMachines; float aveRfSent; float aveRfReceived; boolean engineControlEnabled = false; float startLevel = 0.75f; float stopLevel = 0.99f; private Signal currentlyEmmittedSignal; public TilePowerMonitor() { super(new SlotDefinition(0, 0)); } @Override public boolean supportsMode(ForgeDirection faceHit, IoMode mode) { return mode == IoMode.NONE; } public int[] getRednetOutputValues(ForgeDirection side) { if(currentlyEmmittedSignal == null) { return new int[16]; } int[] res = new int[DyeColor.values().length]; for (DyeColor col : DyeColor.values()) { res[col.ordinal()] = currentlyEmmittedSignal.color == col ? 15 : 0; } return res; } public int getRednetOutputValue(ForgeDirection side, int subnet) { if(currentlyEmmittedSignal != null) { return 15; } return 0; } public boolean isEngineControlEnabled() { return this.engineControlEnabled; } public void setEngineControlEnabled(boolean control) { this.engineControlEnabled = control; } public float getStartLevel() { return this.startLevel; } public void setStartLevel(float start) { this.startLevel = start; } public float getStopLevel() { return this.stopLevel; } public void setStopLevel(float stop) { this.stopLevel = stop; } int asPercentInt(float val) { return Math.round(val * 100); } float asPercentFloat(int val) { return val / 100f; } @Override public String getInventoryName() { return EnderIO.blockPowerMonitor.getUnlocalizedName(); } @Override public String getMachineName() { return ModObject.blockPowerMonitor.unlocalisedName; } @Override protected boolean isMachineItemValidForSlot(int i, ItemStack itemstack) { return false; } @Override public boolean isActive() { return false; } public float getEnergyPerTick() { return energyPerTick; } public float getPowerInConduits() { return powerInConduits; } public float getMaxPowerInConduits() { return maxPowerInConduits; } public float getPowerInCapBanks() { return powerInCapBanks; } public float getMaxPowerInCapBanks() { return maxPowerInCapBanks; } public float getPowerInMachines() { return powerInMachines; } public float getMaxPowerInMachines() { return maxPowerInMachines; } public float getAveRfSent() { return aveRfSent; } public float getAveRfReceived() { return aveRfReceived; } @Override protected boolean processTasks(boolean redstoneCheckPassed) { setEnergyStored(getEnergyStored() - energyPerTick); boolean update = worldObj.getWorldInfo().getWorldTotalTime() % 10 == 0; NetworkPowerManager pm = getPowerManager(); if(pm != null && update) { update(pm); Signal sig = null; if(!engineControlEnabled) { sig = null; } else { float percentFull = getPercentFull(); if(currentlyEmmittedSignal == null) { if(percentFull <= startLevel) { sig = new Signal(xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN, 15, DyeColor.RED); } } else { if(percentFull >= stopLevel) { sig = null; } else { sig = currentlyEmmittedSignal; } } } if(currentlyEmmittedSignal != sig) { currentlyEmmittedSignal = sig; broadcastSignal(); } } if(update) { PacketHandler.sendToAllAround(new PacketPowerInfo(this), this); } return false; } private void broadcastSignal() { worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, EnderIO.blockPowerMonitor); } private float getPercentFull() { return (float)(powerInConduits + powerInCapBanks) / (maxPowerInConduits + maxPowerInCapBanks); } private void update(NetworkPowerManager pm) { powerInConduits = pm.getPowerInConduits(); maxPowerInConduits = pm.getMaxPowerInConduits(); powerInCapBanks = pm.getPowerInCapacitorBanks(); maxPowerInCapBanks = pm.getMaxPowerInCapacitorBanks(); powerInMachines = pm.getPowerInReceptors(); maxPowerInMachines = pm.getMaxPowerInReceptors(); PowerTracker tracker = pm.getNetworkPowerTracker(); aveRfSent = tracker.getAverageRfTickSent(); aveRfReceived = tracker.getAverageRfTickRecieved(); } private NetworkPowerManager getPowerManager() { for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { IPowerConduit con = ConduitUtil.getConduit(worldObj, this, dir, IPowerConduit.class); if(con != null) { AbstractConduitNetwork<?, ?> n = con.getNetwork(); if(n instanceof PowerConduitNetwork) { NetworkPowerManager pm = ((PowerConduitNetwork) n).getPowerManager(); if(pm != null) { return pm; } } } } return null; } @Override public void readCustomNBT(NBTTagCompound nbtRoot) { super.readCustomNBT(nbtRoot); readPowerInfoFromNBT(nbtRoot); } public void readPowerInfoFromNBT(NBTTagCompound nbtRoot) { powerInConduits = nbtRoot.getInteger("powerInConduits"); maxPowerInConduits = nbtRoot.getInteger("maxPowerInConduits"); if(nbtRoot.hasKey("powerInCapBanks")) { powerInCapBanks = nbtRoot.getInteger("powerInCapBanks"); maxPowerInCapBanks = nbtRoot.getInteger("maxPowerInCapBanks"); } else { powerInCapBanks = nbtRoot.getLong("powerInCapBanksL"); maxPowerInCapBanks = nbtRoot.getLong("maxPowerInCapBanksL"); } powerInMachines = nbtRoot.getLong("powerInMachines"); maxPowerInMachines = nbtRoot.getLong("maxPowerInMachines"); aveRfSent = nbtRoot.getFloat("aveRfSent"); aveRfReceived = nbtRoot.getFloat("aveRfReceived"); engineControlEnabled = nbtRoot.getBoolean("engineControlEnabled"); startLevel = nbtRoot.getFloat("startLevel"); stopLevel = nbtRoot.getFloat("stopLevel"); } @Override public void writeCustomNBT(NBTTagCompound nbtRoot) { super.writeCustomNBT(nbtRoot); writePowerInfoToNBT(nbtRoot); } public void writePowerInfoToNBT(NBTTagCompound nbtRoot) { nbtRoot.setInteger("powerInConduits", powerInConduits); nbtRoot.setInteger("maxPowerInConduits", maxPowerInConduits); nbtRoot.setLong("powerInCapBanksL", powerInCapBanks); nbtRoot.setLong("maxPowerInCapBanksL", maxPowerInCapBanks); nbtRoot.setLong("powerInMachines", powerInMachines); nbtRoot.setLong("maxPowerInMachines", maxPowerInMachines); nbtRoot.setFloat("aveRfSent", aveRfSent); nbtRoot.setFloat("aveRfReceived", aveRfReceived); nbtRoot.setBoolean("engineControlEnabled", engineControlEnabled); nbtRoot.setFloat("startLevel", startLevel); nbtRoot.setFloat("stopLevel", stopLevel); } @Override public boolean hasCustomInventoryName() { return false; } }