Some more work on the multimeter
This commit is contained in:
parent
d2bb7b870d
commit
9380b03dc0
6 changed files with 184 additions and 56 deletions
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue