Some more work on the multimeter

This commit is contained in:
Calclavia 2014-01-31 12:01:06 +08:00
parent d2bb7b870d
commit 9380b03dc0
6 changed files with 184 additions and 56 deletions

View file

@ -13,24 +13,29 @@ import net.minecraft.nbt.NBTTagList;
* @author Calclavia * @author Calclavia
* *
*/ */
public class Graph public abstract class Graph<V extends Comparable<V>>
{ {
private final int maxPoints; private final int maxPoints;
/** /**
* Each point represents a tick. * Each point represents a tick.
*/ */
private List<Long> points = new ArrayList<Long>(); protected List<V> points = new ArrayList<V>();
private long peak; private V peak;
/**
* Queue for the next update to insert into the graph.
*/
protected V queue;
public Graph(int maxPoints) public Graph(int maxPoints)
{ {
this.maxPoints = maxPoints; this.maxPoints = maxPoints;
} }
public void add(long y) public void add(V y)
{ {
if (y > peak) if (y.compareTo(peak) > 0)
{ {
peak = y; peak = y;
} }
@ -41,47 +46,34 @@ public class Graph
{ {
if (points.get(maxPoints) == peak) if (points.get(maxPoints) == peak)
{ {
peak = 0; peak = getDefault();
} }
points.remove(maxPoints); points.remove(maxPoints);
} }
} }
public long getPeak() public V getPeak()
{ {
return peak; return peak;
} }
public long get(int x) public V get(int x)
{ {
return points.size() > x ? points.get(x) : 0; return points.size() > x ? points.get(x) : getDefault();
} }
public void load(NBTTagCompound nbt) public abstract void queue(V value);
{
NBTTagList nbtList = nbt.getTagList("DataPoints");
for (int i = 0; i < nbtList.tagCount(); ++i) public void doneQueue()
{ {
NBTTagCompound nbtPoint = (NBTTagCompound) nbtList.tagAt(i); add(queue);
points.add(nbtPoint.getLong("data"));
}
} }
public NBTTagCompound save() public abstract V getDefault();
{
NBTTagCompound nbt = new NBTTagCompound();
NBTTagList data = new NBTTagList();
for (long value : points) public abstract void load(NBTTagCompound nbt);
{
NBTTagCompound nbtPoint = new NBTTagCompound();
nbtPoint.setLong("data", value);
data.appendTag(nbtPoint); public abstract NBTTagCompound save();
}
nbt.setTag("DataPoints", data);
return nbt;
}
} }

View file

@ -0,0 +1,59 @@
package resonantinduction.electrical.multimeter;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
public class GraphL extends Graph<Long>
{
public GraphL(int maxPoints)
{
super(maxPoints);
}
@Override
public void queue(Long value)
{
queue += value;
}
public void doneQueue()
{
super.doneQueue();
queue = 0L;
}
@Override
public Long getDefault()
{
return 0L;
}
public void load(NBTTagCompound nbt)
{
NBTTagList nbtList = nbt.getTagList("DataPoints");
for (int i = 0; i < nbtList.tagCount(); ++i)
{
NBTTagCompound nbtPoint = (NBTTagCompound) nbtList.tagAt(i);
points.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;
}
}

View file

@ -74,9 +74,9 @@ public class GuiMultimeter extends GuiContainerBase
String s = LanguageUtility.getLocal("tile.resonantinduction:multimeter.name"); 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(s, this.xSize / 2 - this.fontRenderer.getStringWidth(s) / 2, 15, 4210752);
this.fontRenderer.drawString(EnumColor.INDIGO + LanguageUtility.getLocal("gui.resonantinduction.multimeter.energy"), 35, 15, 4210752); this.fontRenderer.drawString(EnumColor.INDIGO + LanguageUtility.getLocal("gui.resonantinduction.multimeter.energy"), 35, 15, 4210752);
this.renderUniversalDisplay(35, 25, this.multimeter.getNetwork().valueGraph.get(0), mouseX, mouseY, Unit.JOULES); this.renderUniversalDisplay(35, 25, this.multimeter.getNetwork().energyGraph.get(0), mouseX, mouseY, Unit.JOULES);
this.fontRenderer.drawString(EnumColor.INDIGO + LanguageUtility.getLocal("gui.resonantinduction.multimeter.capacity"), 35, 35, 4210752); this.fontRenderer.drawString(EnumColor.INDIGO + LanguageUtility.getLocal("gui.resonantinduction.multimeter.capacity"), 35, 35, 4210752);
this.renderUniversalDisplay(35, 45, this.multimeter.getNetwork().valueGraph.getPeak(), mouseX, mouseY, Unit.JOULES); this.renderUniversalDisplay(35, 45, this.multimeter.getNetwork().energyGraph.getPeak(), mouseX, mouseY, Unit.JOULES);
this.fontRenderer.drawString(EnumColor.ORANGE + LanguageUtility.getLocal("gui.resonantinduction.multimeter.redstone"), 35, 58, 4210752); 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(EnumColor.RED + LanguageUtility.getLocal("gui.resonantinduction.multimeter." + this.multimeter.getMode().display), 35, 68, 4210752);
this.fontRenderer.drawString(Unit.JOULES.name + "(s)", 35, 100, 4210752); this.fontRenderer.drawString(Unit.JOULES.name + "(s)", 35, 100, 4210752);

View file

@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import universalelectricity.api.net.IUpdate; import universalelectricity.api.net.IUpdate;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import universalelectricity.core.net.Network; import universalelectricity.core.net.Network;
@ -12,8 +14,13 @@ import universalelectricity.core.net.NetworkTickHandler;
public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter> implements IUpdate public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter> implements IUpdate
{ {
public final List<String> displayInformation = new ArrayList<String>(); public final List<String> displayInformation = new ArrayList<String>();
public Graph valueGraph = new Graph(20 * 10);
public Graph capacityGraph = new Graph(20 * 10); /**
* The available graphs to be handled.
*/
private final List<Graph> graphs = new ArrayList<Graph>();
public final GraphL energyGraph = new GraphL(20 * 10);
public final GraphL energyCapacityGraph = new GraphL(20 * 10);
/** /**
* The absolute center of the multimeter screens. * The absolute center of the multimeter screens.
@ -40,6 +47,12 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
*/ */
public boolean isEnabled = true; public boolean isEnabled = true;
public MultimeterNetwork()
{
graphs.add(energyGraph);
graphs.add(energyCapacityGraph);
}
@Override @Override
public void addConnector(PartMultimeter connector) public void addConnector(PartMultimeter connector)
{ {
@ -50,14 +63,16 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
@Override @Override
public void update() public void update()
{ {
valueGraph.add(queueGraphValue); energyGraph.doneQueue();
queueGraphValue = 0; energyCapacityGraph.doneQueue();
capacityGraph.add(queueGraphCapacity);
queueGraphCapacity = 0;
displayInformation.clear();
doUpdate = false; doUpdate = false;
} }
public void markUpdate()
{
doUpdate = true;
}
@Override @Override
public boolean canUpdate() public boolean canUpdate()
{ {
@ -70,13 +85,6 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
return getConnectors().size() > 0; return getConnectors().size() > 0;
} }
public void updateGraph(long detectedValue, long detectedCapcity)
{
queueGraphValue += detectedValue;
queueGraphCapacity += detectedCapcity;
doUpdate = true;
}
@Override @Override
public boolean isValidConnector(PartMultimeter node) public boolean isValidConnector(PartMultimeter node)
{ {
@ -111,7 +119,7 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
connector.updateDesc(); connector.updateDesc();
connector.updateGraph(); connector.updateGraph();
} }
doUpdate = true; doUpdate = true;
} }
@ -140,4 +148,29 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
return new MultimeterNetwork(); return new MultimeterNetwork();
} }
public void load(NBTTagCompound nbt)
{
NBTTagList nbtList = nbt.getTagList("graphs");
for (int i = 0; i < nbtList.tagCount(); ++i)
{
NBTTagCompound nbtPoint = (NBTTagCompound) nbtList.tagAt(i);
graphs.get(i).load(nbtPoint);
}
}
public NBTTagCompound save()
{
NBTTagCompound nbt = new NBTTagCompound();
NBTTagList data = new NBTTagList();
for (Graph graph : graphs)
{
data.appendTag(graph.save());
}
nbt.setTag("graphs", data);
return nbt;
}
} }

View file

@ -18,6 +18,7 @@ import net.minecraftforge.common.ForgeDirection;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import resonantinduction.electrical.Electrical; import resonantinduction.electrical.Electrical;
import resonantinduction.electrical.battery.TileBattery; import resonantinduction.electrical.battery.TileBattery;
import resonantinduction.mechanical.network.IMechanical;
import universalelectricity.api.CompatibilityModule; import universalelectricity.api.CompatibilityModule;
import universalelectricity.api.energy.IConductor; import universalelectricity.api.energy.IConductor;
import universalelectricity.api.energy.IEnergyNetwork; import universalelectricity.api.energy.IEnergyNetwork;
@ -206,7 +207,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
break; break;
} }
getNetwork().updateGraph(detectedEnergy, getDetectedCapacity()); getNetwork().markUpdate();
if (ticks % 10 == 0) if (ticks % 10 == 0)
{ {
@ -216,7 +217,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
tile().notifyPartChange(this); tile().notifyPartChange(this);
} }
if (getNetwork().valueGraph.get(1) != detectedEnergy) if (getNetwork().energyGraph.get(1) != detectedEnergy)
{ {
updateGraph(); updateGraph();
} }
@ -232,6 +233,41 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
} }
} }
public void updateDetections()
{
ForgeDirection receivingSide = getDirection().getOpposite();
TileEntity tileEntity = getDetectedTile();
if (tileEntity instanceof IConductor)
{
IConnector<IEnergyNetwork> conductor = ((IConductor) tileEntity).getInstance(receivingSide.getOpposite());
if (conductor == null)
{
conductor = ((IConductor) tileEntity).getInstance(ForgeDirection.UNKNOWN);
}
if (conductor != null)
{
// TODO: Conductor may always return null in some cases.
IEnergyNetwork network = conductor.getNetwork();
getNetwork().energyGraph.queue(network.getLastBuffer());
}
}
if (tileEntity instanceof IMechanical)
{
IMechanical instance = ((IMechanical) tileEntity).getInstance(receivingSide);
if (instance != null)
{
getNetwork().energyGraph.queue((long) (instance.getTorque() * instance.getAngularVelocity()));
}
}
CompatibilityModule.getEnergy(tileEntity, receivingSide);
}
@Override @Override
public void readDesc(MCDataInput packet) public void readDesc(MCDataInput packet)
{ {
@ -257,8 +293,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
public void writeGraph(MCDataOutput packet) public void writeGraph(MCDataOutput packet)
{ {
packet.writeByte(2); packet.writeByte(2);
packet.writeNBTTagCompound(getNetwork().valueGraph.save()); packet.writeNBTTagCompound(getNetwork().save());
packet.writeNBTTagCompound(getNetwork().capacityGraph.save());
} }
@Override @Override
@ -284,8 +319,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
} }
else if (packetID == 2) else if (packetID == 2)
{ {
getNetwork().valueGraph.load(packet.readNBTTagCompound()); getNetwork().load(packet.readNBTTagCompound());
getNetwork().capacityGraph.load(packet.readNBTTagCompound());
} }
} }
@ -330,6 +364,16 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
} }
} }
if (tileEntity instanceof IMechanical)
{
IMechanical instance = ((IMechanical) tileEntity).getInstance(side);
if (instance != null)
{
return (long) (instance.getTorque() * instance.getAngularVelocity());
}
}
return CompatibilityModule.getEnergy(tileEntity, side); return CompatibilityModule.getEnergy(tileEntity, side);
} }

View file

@ -149,12 +149,12 @@ public class RenderMultimeter
// TODO: Add other dispaly info support. // TODO: Add other dispaly info support.
List<String> information = new ArrayList<String>(); List<String> information = new ArrayList<String>();
information.add(UnitDisplay.getDisplay(part.getNetwork().valueGraph.get(0), Unit.JOULES)); information.add(UnitDisplay.getDisplay(part.getNetwork().energyGraph.get(0), Unit.JOULES));
if (part.getNetwork().capacityGraph.get(0) > 0) if (part.getNetwork().energyCapacityGraph.get(0) > 0)
{ {
String str = information.get(0); String str = information.get(0);
str = str + "/" + UnitDisplay.getDisplay(part.getNetwork().capacityGraph.get(0), Unit.JOULES); str = str + "/" + UnitDisplay.getDisplay(part.getNetwork().energyCapacityGraph.get(0), Unit.JOULES);
information.set(0, str); information.set(0, str);
} }