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
*
*/
public class Graph
public abstract class Graph<V extends Comparable<V>>
{
private final int maxPoints;
/**
* Each point represents a tick.
*/
private List<Long> points = new ArrayList<Long>();
private long peak;
protected List<V> points = new ArrayList<V>();
private V peak;
/**
* Queue for the next update to insert into the graph.
*/
protected V queue;
public Graph(int maxPoints)
{
this.maxPoints = maxPoints;
}
public void add(long y)
public void add(V y)
{
if (y > peak)
if (y.compareTo(peak) > 0)
{
peak = y;
}
@ -41,47 +46,34 @@ public class Graph
{
if (points.get(maxPoints) == peak)
{
peak = 0;
peak = getDefault();
}
points.remove(maxPoints);
}
}
public long getPeak()
public V getPeak()
{
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)
{
NBTTagList nbtList = nbt.getTagList("DataPoints");
public abstract void queue(V value);
for (int i = 0; i < nbtList.tagCount(); ++i)
{
NBTTagCompound nbtPoint = (NBTTagCompound) nbtList.tagAt(i);
points.add(nbtPoint.getLong("data"));
}
public void doneQueue()
{
add(queue);
}
public NBTTagCompound save()
{
NBTTagCompound nbt = new NBTTagCompound();
NBTTagList data = new NBTTagList();
public abstract V getDefault();
for (long value : points)
{
NBTTagCompound nbtPoint = new NBTTagCompound();
nbtPoint.setLong("data", value);
public abstract void load(NBTTagCompound nbt);
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");
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.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.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.RED + LanguageUtility.getLocal("gui.resonantinduction.multimeter." + this.multimeter.getMode().display), 35, 68, 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.List;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import universalelectricity.api.net.IUpdate;
import universalelectricity.api.vector.Vector3;
import universalelectricity.core.net.Network;
@ -12,8 +14,13 @@ import universalelectricity.core.net.NetworkTickHandler;
public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter> implements IUpdate
{
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.
@ -40,6 +47,12 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
*/
public boolean isEnabled = true;
public MultimeterNetwork()
{
graphs.add(energyGraph);
graphs.add(energyCapacityGraph);
}
@Override
public void addConnector(PartMultimeter connector)
{
@ -50,14 +63,16 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
@Override
public void update()
{
valueGraph.add(queueGraphValue);
queueGraphValue = 0;
capacityGraph.add(queueGraphCapacity);
queueGraphCapacity = 0;
displayInformation.clear();
energyGraph.doneQueue();
energyCapacityGraph.doneQueue();
doUpdate = false;
}
public void markUpdate()
{
doUpdate = true;
}
@Override
public boolean canUpdate()
{
@ -70,13 +85,6 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
return getConnectors().size() > 0;
}
public void updateGraph(long detectedValue, long detectedCapcity)
{
queueGraphValue += detectedValue;
queueGraphCapacity += detectedCapcity;
doUpdate = true;
}
@Override
public boolean isValidConnector(PartMultimeter node)
{
@ -111,7 +119,7 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
connector.updateDesc();
connector.updateGraph();
}
doUpdate = true;
}
@ -140,4 +148,29 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
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.electrical.Electrical;
import resonantinduction.electrical.battery.TileBattery;
import resonantinduction.mechanical.network.IMechanical;
import universalelectricity.api.CompatibilityModule;
import universalelectricity.api.energy.IConductor;
import universalelectricity.api.energy.IEnergyNetwork;
@ -206,7 +207,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
break;
}
getNetwork().updateGraph(detectedEnergy, getDetectedCapacity());
getNetwork().markUpdate();
if (ticks % 10 == 0)
{
@ -216,7 +217,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
tile().notifyPartChange(this);
}
if (getNetwork().valueGraph.get(1) != detectedEnergy)
if (getNetwork().energyGraph.get(1) != detectedEnergy)
{
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
public void readDesc(MCDataInput packet)
{
@ -257,8 +293,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
public void writeGraph(MCDataOutput packet)
{
packet.writeByte(2);
packet.writeNBTTagCompound(getNetwork().valueGraph.save());
packet.writeNBTTagCompound(getNetwork().capacityGraph.save());
packet.writeNBTTagCompound(getNetwork().save());
}
@Override
@ -284,8 +319,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
}
else if (packetID == 2)
{
getNetwork().valueGraph.load(packet.readNBTTagCompound());
getNetwork().capacityGraph.load(packet.readNBTTagCompound());
getNetwork().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);
}

View file

@ -149,12 +149,12 @@ public class RenderMultimeter
// TODO: Add other dispaly info support.
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);
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);
}