Multimeters now display torque and angular velocity

This commit is contained in:
Calclavia 2014-01-31 18:45:33 +08:00
parent 84b13c027c
commit 2a858059b4
7 changed files with 126 additions and 43 deletions

View file

@ -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)

View file

@ -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();

View file

@ -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;
}
}

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -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)

View file

@ -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)