Multimeters now display torque and angular velocity
This commit is contained in:
parent
84b13c027c
commit
2a858059b4
7 changed files with 126 additions and 43 deletions
|
@ -83,28 +83,22 @@ public class TileGenerator extends TileElectrical implements IRotatable
|
|||
if (tile instanceof IMechanical)
|
||||
{
|
||||
IMechanical mech = ((IMechanical) tile).getInstance(outputDir.getOpposite());
|
||||
long extract = energy.extractEnergy(energy.getEnergy() / 2, false);
|
||||
long extract = energy.extractEnergy(energy.getEnergy() / 2, false);
|
||||
|
||||
if (mech != null)
|
||||
{
|
||||
if (extract > 0)
|
||||
{
|
||||
final float maxAngularVelocity = energy.getEnergyCapacity() / (float) torqueRatio;
|
||||
final long maxTorque = (long) ((double) energy.getEnergyCapacity() / maxAngularVelocity);
|
||||
float setAngularVelocity = extract / (float) torqueRatio;
|
||||
long setTorque = (long) (((double) extract) / setAngularVelocity);
|
||||
final float maxAngularVelocity = extract / (float) torqueRatio;
|
||||
final long maxTorque = (long) (((double) extract) / maxAngularVelocity);
|
||||
|
||||
float setAngularVelocity = maxAngularVelocity;
|
||||
long setTorque = maxTorque;
|
||||
|
||||
long currentTorque = Math.abs(mech.getTorque());
|
||||
|
||||
if (currentTorque != 0)
|
||||
{
|
||||
setTorque = Math.min(+setTorque, maxTorque) * (mech.getTorque() / currentTorque);
|
||||
|
||||
if (setTorque < currentTorque)
|
||||
{
|
||||
setTorque = (long) Math.max(setTorque, currentTorque * (currentTorque / maxTorque));
|
||||
}
|
||||
}
|
||||
setTorque = Math.min(setTorque, maxTorque) * (mech.getTorque() / currentTorque);
|
||||
|
||||
float currentVelo = Math.abs(mech.getAngularVelocity());
|
||||
if (currentVelo != 0)
|
||||
|
|
|
@ -21,12 +21,12 @@ public abstract class Graph<V extends Comparable<V>>
|
|||
* Each point represents a tick.
|
||||
*/
|
||||
protected List<V> points = new ArrayList<V>();
|
||||
private V peak;
|
||||
private V peak = getDefault();
|
||||
|
||||
/**
|
||||
* Queue for the next update to insert into the graph.
|
||||
*/
|
||||
protected V queue;
|
||||
protected V queue = getDefault();
|
||||
|
||||
public Graph(int maxPoints)
|
||||
{
|
||||
|
@ -63,6 +63,11 @@ public abstract class Graph<V extends Comparable<V>>
|
|||
return points.size() > x ? points.get(x) : getDefault();
|
||||
}
|
||||
|
||||
public V get()
|
||||
{
|
||||
return get(0);
|
||||
}
|
||||
|
||||
public abstract void queue(V value);
|
||||
|
||||
public void doneQueue()
|
||||
|
@ -70,9 +75,12 @@ public abstract class Graph<V extends Comparable<V>>
|
|||
add(queue);
|
||||
}
|
||||
|
||||
public abstract V getDefault();
|
||||
protected abstract V getDefault();
|
||||
|
||||
public abstract void load(NBTTagCompound nbt);
|
||||
public void load(NBTTagCompound nbt)
|
||||
{
|
||||
points.clear();
|
||||
}
|
||||
|
||||
public abstract NBTTagCompound save();
|
||||
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
package resonantinduction.electrical.multimeter;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
|
||||
public class GraphF extends Graph<Float>
|
||||
{
|
||||
public GraphF(int maxPoints)
|
||||
{
|
||||
super(maxPoints);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void queue(Float value)
|
||||
{
|
||||
queue += value;
|
||||
}
|
||||
|
||||
public void doneQueue()
|
||||
{
|
||||
super.doneQueue();
|
||||
queue = 0f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Float getDefault()
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
|
||||
public void load(NBTTagCompound nbt)
|
||||
{
|
||||
super.load(nbt);
|
||||
|
||||
NBTTagList nbtList = nbt.getTagList("DataPoints");
|
||||
|
||||
for (int i = 0; i < nbtList.tagCount(); ++i)
|
||||
{
|
||||
NBTTagCompound nbtPoint = (NBTTagCompound) nbtList.tagAt(i);
|
||||
points.add(nbtPoint.getFloat("data"));
|
||||
}
|
||||
}
|
||||
|
||||
public NBTTagCompound save()
|
||||
{
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
NBTTagList data = new NBTTagList();
|
||||
|
||||
for (Float value : points)
|
||||
{
|
||||
NBTTagCompound nbtPoint = new NBTTagCompound();
|
||||
nbtPoint.setFloat("data", value);
|
||||
data.appendTag(nbtPoint);
|
||||
}
|
||||
|
||||
nbt.setTag("DataPoints", data);
|
||||
return nbt;
|
||||
}
|
||||
|
||||
}
|
|
@ -30,6 +30,7 @@ public class GraphL extends Graph<Long>
|
|||
|
||||
public void load(NBTTagCompound nbt)
|
||||
{
|
||||
super.load(nbt);
|
||||
NBTTagList nbtList = nbt.getTagList("DataPoints");
|
||||
|
||||
for (int i = 0; i < nbtList.tagCount(); ++i)
|
||||
|
@ -48,7 +49,6 @@ public class GraphL extends Graph<Long>
|
|||
{
|
||||
NBTTagCompound nbtPoint = new NBTTagCompound();
|
||||
nbtPoint.setLong("data", value);
|
||||
|
||||
data.appendTag(nbtPoint);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,9 +18,12 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
|
|||
/**
|
||||
* The available graphs to be handled.
|
||||
*/
|
||||
private int maxData = 20 * 10;
|
||||
private final List<Graph> graphs = new ArrayList<Graph>();
|
||||
public final GraphL energyGraph = new GraphL(20 * 10);
|
||||
public final GraphL energyCapacityGraph = new GraphL(20 * 10);
|
||||
public final GraphL energyGraph = new GraphL(maxData);
|
||||
public final GraphL energyCapacityGraph = new GraphL(1);
|
||||
public final GraphL torqueGraph = new GraphL(maxData);
|
||||
public final GraphF angularVelocityGraph = new GraphF(maxData);
|
||||
|
||||
/**
|
||||
* The absolute center of the multimeter screens.
|
||||
|
@ -51,6 +54,8 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
|
|||
{
|
||||
graphs.add(energyGraph);
|
||||
graphs.add(energyCapacityGraph);
|
||||
graphs.add(torqueGraph);
|
||||
graphs.add(angularVelocityGraph);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -63,8 +68,11 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
|
|||
@Override
|
||||
public void update()
|
||||
{
|
||||
energyGraph.doneQueue();
|
||||
energyCapacityGraph.doneQueue();
|
||||
for (Graph graph : graphs)
|
||||
{
|
||||
graph.doneQueue();
|
||||
}
|
||||
|
||||
doUpdate = false;
|
||||
}
|
||||
|
||||
|
@ -154,8 +162,8 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
|
|||
|
||||
for (int i = 0; i < nbtList.tagCount(); ++i)
|
||||
{
|
||||
NBTTagCompound nbtPoint = (NBTTagCompound) nbtList.tagAt(i);
|
||||
graphs.get(i).load(nbtPoint);
|
||||
NBTTagCompound nbtCompound = (NBTTagCompound) nbtList.tagAt(i);
|
||||
graphs.get(i).load(nbtCompound);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -182,7 +182,8 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
|
|||
|
||||
if (!world().isRemote)
|
||||
{
|
||||
long detectedEnergy = getDetectedEnergy();
|
||||
updateDetections();
|
||||
long detectedEnergy = getNetwork().energyGraph.get(0);
|
||||
|
||||
boolean outputRedstone = false;
|
||||
|
||||
|
@ -217,7 +218,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
|
|||
tile().notifyPartChange(this);
|
||||
}
|
||||
|
||||
if (getNetwork().energyGraph.get(1) != detectedEnergy)
|
||||
// if (getNetwork().energyGraph.get(1) != detectedEnergy)
|
||||
{
|
||||
updateGraph();
|
||||
}
|
||||
|
@ -238,6 +239,9 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
|
|||
ForgeDirection receivingSide = getDirection().getOpposite();
|
||||
TileEntity tileEntity = getDetectedTile();
|
||||
|
||||
/**
|
||||
* Update Energy Graph
|
||||
*/
|
||||
if (tileEntity instanceof IConductor)
|
||||
{
|
||||
IConnector<IEnergyNetwork> conductor = ((IConductor) tileEntity).getInstance(receivingSide.getOpposite());
|
||||
|
@ -259,13 +263,25 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
|
|||
{
|
||||
IMechanical instance = ((IMechanical) tileEntity).getInstance(receivingSide);
|
||||
|
||||
if (instance == null)
|
||||
{
|
||||
instance = ((IMechanical) tileEntity).getInstance(ForgeDirection.UNKNOWN);
|
||||
}
|
||||
|
||||
if (instance != null)
|
||||
{
|
||||
getNetwork().torqueGraph.queue(instance.getTorque());
|
||||
getNetwork().angularVelocityGraph.queue(instance.getAngularVelocity());
|
||||
getNetwork().energyGraph.queue((long) (instance.getTorque() * instance.getAngularVelocity()));
|
||||
}
|
||||
}
|
||||
|
||||
CompatibilityModule.getEnergy(tileEntity, receivingSide);
|
||||
getNetwork().energyGraph.queue(CompatibilityModule.getEnergy(tileEntity, receivingSide));
|
||||
|
||||
/**
|
||||
* Update Energy Capacity Graph
|
||||
*/
|
||||
getNetwork().energyCapacityGraph.queue(CompatibilityModule.getMaxEnergy(tileEntity, receivingSide));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -329,11 +345,6 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
|
|||
toggleMode();
|
||||
}
|
||||
|
||||
public long getDetectedEnergy()
|
||||
{
|
||||
return getDetectedEnergy(getDirection().getOpposite(), getDetectedTile());
|
||||
}
|
||||
|
||||
public TileEntity getDetectedTile()
|
||||
{
|
||||
ForgeDirection direction = getDirection();
|
||||
|
@ -345,6 +356,7 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
|
|||
return ForgeDirection.getOrientation(this.side);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static long getDetectedEnergy(ForgeDirection side, TileEntity tileEntity)
|
||||
{
|
||||
if (tileEntity instanceof IConductor)
|
||||
|
@ -377,16 +389,6 @@ public class PartMultimeter extends JCuboidPart implements IConnector<Multimeter
|
|||
return CompatibilityModule.getEnergy(tileEntity, side);
|
||||
}
|
||||
|
||||
public long getDetectedCapacity()
|
||||
{
|
||||
return getDetectedCapacity(getDirection().getOpposite(), getDetectedTile());
|
||||
}
|
||||
|
||||
public static long getDetectedCapacity(ForgeDirection side, TileEntity tileEntity)
|
||||
{
|
||||
return CompatibilityModule.getMaxEnergy(tileEntity, side);
|
||||
}
|
||||
|
||||
public void toggleMode()
|
||||
{
|
||||
if (!this.world().isRemote)
|
||||
|
|
|
@ -158,12 +158,23 @@ public class RenderMultimeter
|
|||
information.set(0, str);
|
||||
}
|
||||
|
||||
if (part.getNetwork().torqueGraph.get(0) != 0)
|
||||
{
|
||||
information.add("Torque: " + UnitDisplay.getDisplayShort(part.getNetwork().torqueGraph.get(0), Unit.NEWTON_METER));
|
||||
}
|
||||
if (part.getNetwork().angularVelocityGraph.get(0) != 0)
|
||||
{
|
||||
information.add("Speed: " + UnitDisplay.roundDecimals(part.getNetwork().angularVelocityGraph.get(0)));
|
||||
}
|
||||
|
||||
GL11.glTranslatef(0, 0, -0.2f * (information.size() / 2));
|
||||
|
||||
for (int i = 0; i < information.size(); i++)
|
||||
{
|
||||
String info = information.get(i);
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslatef(0, 0, 0.3f * i);
|
||||
GL11.glTranslatef(0, 0, 0.2f * i);
|
||||
if (dir.offsetX == 0)
|
||||
RenderUtility.renderText(info, (float) (part.getNetwork().size.x * 0.9f), 0.5f);
|
||||
if (dir.offsetZ == 0)
|
||||
|
|
Loading…
Reference in a new issue