diff --git a/src/main/java/resonantinduction/electrical/multimeter/Graph.java b/src/main/java/resonantinduction/electrical/multimeter/Graph.java index 79f6be0e..3fb710cd 100644 --- a/src/main/java/resonantinduction/electrical/multimeter/Graph.java +++ b/src/main/java/resonantinduction/electrical/multimeter/Graph.java @@ -3,6 +3,16 @@ package resonantinduction.electrical.multimeter; import java.util.ArrayList; import java.util.List; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +/** + * Graph for the multimeter + * + * @author Calclavia + * + */ public class Graph { private final int maxPoints; @@ -33,7 +43,6 @@ public class Graph { peak = 0; } - points.remove(maxPoints); } } @@ -45,6 +54,34 @@ public class Graph public long get(int x) { - return points.get(x); + return points.size() > x ? points.get(x) : 0; + } + + public void load(NBTTagCompound nbt) + { + NBTTagList nbtList = nbt.getTagList("DataPoints"); + + for (int i = 0; i < nbtList.tagCount(); ++i) + { + NBTTagCompound nbtPoint = (NBTTagCompound) nbtList.tagAt(i); + add(nbtPoint.getLong("data")); + } + } + + public NBTTagCompound save() + { + NBTTagCompound nbt = new NBTTagCompound(); + NBTTagList data = new NBTTagList(); + + for (long value : points) + { + NBTTagCompound nbtPoint = new NBTTagCompound(); + nbtPoint.setLong("data", value); + + data.appendTag(nbtPoint); + } + + nbt.setTag("DataPoints", data); + return nbt; } } diff --git a/src/main/java/resonantinduction/electrical/multimeter/GuiMultimeter.java b/src/main/java/resonantinduction/electrical/multimeter/GuiMultimeter.java index 5967dfb4..7d05f643 100644 --- a/src/main/java/resonantinduction/electrical/multimeter/GuiMultimeter.java +++ b/src/main/java/resonantinduction/electrical/multimeter/GuiMultimeter.java @@ -73,10 +73,10 @@ public class GuiMultimeter extends GuiContainerBase super.drawGuiContainerForegroundLayer(mouseX, mouseY); String s = LanguageUtility.getLocal("tile.resonantinduction:multimeter.name"); this.fontRenderer.drawString(s, this.xSize / 2 - this.fontRenderer.getStringWidth(s) / 2, 15, 4210752); - this.fontRenderer.drawString(EnumColor.INDIGO + LanguageUtility.getLocal("gui.resonantinduction.multimeter.averageEnergy"), 35, 15, 4210752); - this.renderUniversalDisplay(35, 25, this.multimeter.getAverageDetectedEnergy(), mouseX, mouseY, Unit.JOULES); + this.fontRenderer.drawString(EnumColor.INDIGO + LanguageUtility.getLocal("gui.resonantinduction.multimeter.energy"), 35, 15, 4210752); + this.renderUniversalDisplay(35, 25, this.multimeter.getNetwork().graph.get(0), mouseX, mouseY, Unit.JOULES); this.fontRenderer.drawString(EnumColor.INDIGO + LanguageUtility.getLocal("gui.resonantinduction.multimeter.energy"), 35, 35, 4210752); - this.renderUniversalDisplay(35, 45, this.multimeter.getDetectedEnergy(), mouseX, mouseY, Unit.JOULES); + this.renderUniversalDisplay(35, 45, this.multimeter.getNetwork().graph.get(0), mouseX, mouseY, Unit.JOULES); this.fontRenderer.drawString(EnumColor.ORANGE + LanguageUtility.getLocal("gui.resonantinduction.multimeter.redstone"), 35, 58, 4210752); this.fontRenderer.drawString(EnumColor.RED + LanguageUtility.getLocal("gui.resonantinduction.multimeter." + this.multimeter.getMode().display), 35, 68, 4210752); this.fontRenderer.drawString(Unit.JOULES.name + "(s)", 35, 100, 4210752); diff --git a/src/main/java/resonantinduction/electrical/multimeter/MultimeterNetwork.java b/src/main/java/resonantinduction/electrical/multimeter/MultimeterNetwork.java index 17162e3d..6dda7999 100644 --- a/src/main/java/resonantinduction/electrical/multimeter/MultimeterNetwork.java +++ b/src/main/java/resonantinduction/electrical/multimeter/MultimeterNetwork.java @@ -1,11 +1,17 @@ package resonantinduction.electrical.multimeter; -import net.minecraft.nbt.NBTTagCompound; +import java.util.List; + +import universalelectricity.api.net.IUpdate; import universalelectricity.api.vector.Vector3; import universalelectricity.core.net.Network; +import universalelectricity.core.net.NetworkTickHandler; -public class MultimeterNetwork extends Network +public class MultimeterNetwork extends Network implements IUpdate { + public List displayInformation; + public Graph graph = new Graph(20 * 10); + /** * The absolute center of the multimeter screens. */ @@ -14,8 +20,15 @@ public class MultimeterNetwork extends Network 0) + { + graph.add(queueGraphValue); + queueGraphValue = 0; + } + } + + @Override + public boolean canUpdate() + { + return getConnectors().size() > 0; + } + + @Override + public boolean continueUpdate() + { + return canUpdate(); + } + + public void updateGraph(long detectedValue) + { + queueGraphValue += detectedValue; } @Override @@ -58,4 +100,5 @@ public class MultimeterNetwork extends Network playersUsing = new HashSet(); private DetectMode detectMode = DetectMode.NONE; + private long redstoneTriggerLimit; - private long peakDetection; - private long energyLimit; - private long detectedEnergy; - private long detectedAverageEnergy; public boolean redstoneOn; private byte side; private int ticks; private MultimeterNetwork network; - public List displayInformation; - public Graph graph; - public void preparePlacement(int side, int itemDamage) { this.side = (byte) (side ^ 1); @@ -177,10 +171,9 @@ public class PartMultimeter extends JCuboidPart implements IConnector energyLimit; + outputRedstone = detectedEnergy > redstoneTriggerLimit; break; case GREATER_THAN_EQUAL: - outputRedstone = detectedEnergy >= energyLimit; + outputRedstone = detectedEnergy >= redstoneTriggerLimit; break; case LESS_THAN: - outputRedstone = detectedEnergy < energyLimit; + outputRedstone = detectedEnergy < redstoneTriggerLimit; break; case LESS_THAN_EQUAL: - outputRedstone = detectedEnergy <= energyLimit; + outputRedstone = detectedEnergy <= redstoneTriggerLimit; break; } + getNetwork().updateGraph(detectedEnergy); + if (outputRedstone != redstoneOn) { redstoneOn = outputRedstone; tile().notifyPartChange(this); } - if (prevDetectedEnergy != detectedEnergy) + if (getNetwork().graph.get(1) != detectedEnergy) { - writeDesc(getWriteStream()); + // writeDesc(getWriteStream()); + writeGraph(getWriteStream()); // this.getWriteStream().writeByte(3).writeByte((byte) // detectMode.ordinal()).writeLong(detectedEnergy).writeLong(detectedAverageEnergy).writeLong(energyLimit); } @@ -239,8 +235,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector