Fixed graph and mechanical node errors

This commit is contained in:
Calclavia 2015-01-23 09:18:36 +08:00
parent 65c3661f90
commit 16561c9d32
8 changed files with 44 additions and 48 deletions

View File

@ -91,12 +91,11 @@ class TileMotor extends SpatialTile(Material.iron) with TIO with TElectric with
* Produce torque based on current.
* T = NBA * I / (2pi)
*/
val power = electricNode.power
val torque = TileMotor.motorConstant * electricNode.current / (2 * Math.PI)
//TODO: Check if angular velocity should be generated based on torque
if (torque != 0)
mechNode.rotate(torque, power / torque)
mechNode.accelerate(torque)
/**
* Motors produce emf or counter-emf by Lenz's law based on angular velocity

View File

@ -28,11 +28,16 @@ class Graph[V](val name: String, val maxPoints: Int = 0)(implicit n: Numeric[V])
def head: V = apply(0)
def apply(x: Int): V = if (points.size > x) points.get(x) else default
def apply(x: Int = 0): V = if (points.size > x) points.get(x) else default
def default: V = n.zero
def queue(value: V) = queue = value
def getDouble(x: Int = 0) = n.toDouble(this(x))
def queue(value: V)
{
queue = value
}
def doneQueue = this += queue
@ -46,12 +51,13 @@ class Graph[V](val name: String, val maxPoints: Int = 0)(implicit n: Numeric[V])
def load(nbt: NBTTagCompound)
{
points.clear()
points.addAll(nbt.getArray("DataPoints").toList)
val array = nbt.getArray[Double]("DataPoints")
points.addAll(array.map(_.asInstanceOf[V]).toList)
}
def save(nbt: NBTTagCompound)
{
nbt.setArray("DataPoints", points.toArray)
nbt.setArray("DataPoints", points.map(n.toDouble).toArray)
}
def getAverage: Double = if (points.size > 0) n.toDouble(points.foldLeft(n.zero)((b, a) => n.plus(b, a))) / points.size else 0

View File

@ -1,8 +1,7 @@
package edx.electrical.multimeter
import net.minecraft.nbt.{NBTTagCompound, NBTTagList}
import resonant.api.IUpdate
import resonant.lib.grid.core.{Grid, UpdateTicker}
import resonant.lib.grid.core.Grid
import resonant.lib.transform.vector.Vector3
import resonant.lib.utility.LanguageUtility
import resonant.lib.utility.science.UnitDisplay
@ -10,7 +9,7 @@ import resonant.lib.utility.science.UnitDisplay
import scala.collection.convert.wrapAll._
import scala.collection.mutable.ArrayBuffer
class GridMultimeter extends Grid[PartMultimeter] with IUpdate
class GridMultimeter extends Grid[PartMultimeter]
{
final val displayInformation = new ArrayBuffer[String]
/**
@ -53,7 +52,6 @@ class GridMultimeter extends Grid[PartMultimeter] with IUpdate
graphs += energyGraph
graphs += powerGraph
graphs += energyCapacityGraph
graphs += voltageGraph
graphs += torqueGraph
graphs += angularVelocityGraph
@ -65,15 +63,14 @@ class GridMultimeter extends Grid[PartMultimeter] with IUpdate
{
val graph = graphs(graphID)
var graphValue: String = ""
if (graph == energyGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.JOULES, energyGraph.get).toString
if (graph == powerGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.WATT, powerGraph.get).toString
if (graph == energyCapacityGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.JOULES, energyCapacityGraph.get).toString
if (graph == voltageGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.VOLTAGE, voltageGraph.get).toString
if (graph == torqueGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.NEWTON_METER, torqueGraph.get, true).toString
if (graph == angularVelocityGraph) graphValue = UnitDisplay.roundDecimals(angularVelocityGraph.get) + " rad/s"
if (graph == fluidGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.LITER, fluidGraph.get.toInt).toString
if (graph == thermalGraph) graphValue = UnitDisplay.roundDecimals(thermalGraph.get.toFloat) + " K"
if (graph == pressureGraph) graphValue = UnitDisplay.roundDecimals(pressureGraph.get.toInt) + " Pa"
if (graph == energyGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.JOULES, energyGraph()).toString
if (graph == powerGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.WATT, powerGraph()).toString
if (graph == voltageGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.VOLTAGE, voltageGraph()).toString
if (graph == torqueGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.NEWTON_METER, torqueGraph(), true).toString
if (graph == angularVelocityGraph) graphValue = UnitDisplay.roundDecimals(angularVelocityGraph()) + " rad/s"
if (graph == fluidGraph) graphValue = new UnitDisplay(UnitDisplay.Unit.LITER, fluidGraph()).toString
if (graph == thermalGraph) graphValue = UnitDisplay.roundDecimals(thermalGraph()) + " K"
if (graph == pressureGraph) graphValue = UnitDisplay.roundDecimals(pressureGraph()) + " Pa"
return getLocalized(graph) + ": " + graphValue
}
@ -87,22 +84,11 @@ class GridMultimeter extends Grid[PartMultimeter] with IUpdate
return primaryMultimeter == check
}
def update(delta: Double)
{
if (doUpdate)
{
graphs.foreach(_.doneQueue())
doUpdate = false
}
}
def markUpdate
{
doUpdate = true
}
override def updatePeriod: Int = if (getNodes.size > 0) 50 else 0
override def isValidNode(node: AnyRef): Boolean =
{
return node.isInstanceOf[PartMultimeter] && node.asInstanceOf[PartMultimeter].world != null && node.asInstanceOf[PartMultimeter].tile != null
@ -138,7 +124,6 @@ class GridMultimeter extends Grid[PartMultimeter] with IUpdate
size = new Vector3(Math.abs(upperBound.x) + Math.abs(lowerBound.x), Math.abs(upperBound.y) + Math.abs(lowerBound.y), Math.abs(upperBound.z) + Math.abs(lowerBound.z))
val area: Double = (if (size.x != 0) size.x else 1) * (if (size.y != 0) size.y else 1) * (if (size.z != 0) size.z else 1)
isEnabled = area == getNodes.size
UpdateTicker.threaded.addUpdater(this)
getNodes foreach (c =>
{
@ -163,9 +148,16 @@ class GridMultimeter extends Grid[PartMultimeter] with IUpdate
def save: NBTTagCompound =
{
val nbt: NBTTagCompound = new NBTTagCompound
val data: NBTTagList = new NBTTagList
graphs.foreach(g => data.appendTag(g.save()))
val nbt = new NBTTagCompound
val data = new NBTTagList
graphs.foreach(
g =>
{
val tag = new NBTTagCompound
g.save(tag)
data.appendTag(tag)
}
)
nbt.setTag("graphs", data)
return nbt
}

View File

@ -81,7 +81,7 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi
if (!world.isRemote)
{
if (doDetect) updateDetections
val detectedValue = getGrid.graphs(detectType).getDouble
val detectedValue = getGrid.graphs(detectType).getDouble()
var outputRedstone = false
detectMode match
@ -152,7 +152,6 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi
}
}
getGrid.energyGraph.queue(Compatibility.getEnergy(tileEntity, receivingSide))
getGrid.energyCapacityGraph.queue(Compatibility.getMaxEnergy(tileEntity, receivingSide))
}
def getDetectedTile: TileEntity =
@ -243,16 +242,16 @@ class PartMultimeter extends PartFace with IRedstonePart with IPacketReceiver wi
updateServer
}
def updateServer
{
}
def toggleDetectionValue
{
detectType = ((detectType + 1) % getGrid.graphs.size).asInstanceOf[Byte]
updateServer
}
def updateServer
{
}
def getGrid: GridMultimeter =
{
if (grid == null)

View File

@ -103,7 +103,7 @@ object RenderMultimeter extends ISimpleItemRenderer
for (i <- 0 until part.getGrid.graphs.size)
{
if (part.getGrid.graphs(i).head != null && !(part.getGrid.graphs(i).head == part.getGrid.graphs(i).getDefault))
if (part.getGrid.graphs(i).head != null /*&& !(part.getGrid.graphs(i).head == part.getGrid.graphs(i))*/ )
{
information :+= part.getGrid.getDisplay(i)
}

View File

@ -62,7 +62,7 @@ class PartGear extends PartMechanical with IMultiBlockStructure[PartGear]
if (manualCrankTime > 0)
{
//A punch has around 5000 Newtons
mechanicalNode.rotate((if (isClockwiseCrank) 2 else -2) * manualCrankTime, (if (isClockwiseCrank) 0.5 else -0.5) * manualCrankTime)
mechanicalNode.accelerate((if (isClockwiseCrank) 2 else -2) * manualCrankTime)
manualCrankTime -= 1
}
}

View File

@ -58,7 +58,7 @@ class TileWaterTurbine extends TileTurbine
{
if (powerTicks > 0)
{
getMultiBlock.get.mechanicalNode.rotate(getWaterPower, getWaterPower / 100)
getMultiBlock.get.mechanicalNode.accelerate(getWaterPower)
powerTicks -= 1
}
@ -74,7 +74,7 @@ class TileWaterTurbine extends TileTurbine
powerTicks = 20
worldObj.setBlockToAir(xCoord, yCoord + 1, zCoord)
worldObj.setBlock(xCoord, yCoord - 1, zCoord, Blocks.flowing_water)
getMultiBlock.get.mechanicalNode.rotate(10000, 10)
getMultiBlock.get.mechanicalNode.accelerate(10000)
}
}
}
@ -98,12 +98,12 @@ class TileWaterTurbine extends TileTurbine
if (getDirection.offsetX != 0)
{
getMultiBlock.get.mechanicalNode.rotate(if (invert) -1 else 1 * Math.abs(getWaterPower * vector.z * (7 - metadata) / 7f), 10)
getMultiBlock.get.mechanicalNode.accelerate(if (invert) -1 else 1 * Math.abs(getWaterPower * vector.z * (7 - metadata) / 7f))
powerTicks = 20
}
if (getDirection.offsetZ != 0)
{
getMultiBlock.get.mechanicalNode.rotate(if (invert) -1 else 1 * Math.abs(getWaterPower * vector.x * (7 - metadata) / 7f), 10)
getMultiBlock.get.mechanicalNode.accelerate(if (invert) -1 else 1 * Math.abs(getWaterPower * vector.x * (7 - metadata) / 7f))
powerTicks = 20
}
}

View File

@ -77,12 +77,12 @@ class TileWindTurbine extends TileTurbine with IBoilHandler
computePower()
windPower = MathUtility.lerp(windPower, nextWindPower, ticks % 20 / 20d)
getMultiBlock.get.mechanicalNode.rotate(windPower * multiBlockRadius / 20, windPower / multiBlockRadius / 20)
getMultiBlock.get.mechanicalNode.accelerate(windPower * multiBlockRadius / 20)
}
//Generate from steam
val steamPower = if (gasTank.getFluid != null) gasTank.drain(gasTank.getFluidAmount, true).amount else 0 * 1000 * Settings.steamMultiplier
getMultiBlock.get.mechanicalNode.rotate(steamPower * multiBlockRadius / 20, steamPower / multiBlockRadius / 20)
getMultiBlock.get.mechanicalNode.accelerate(steamPower * multiBlockRadius / 20)
}
}
}