@@ -14,21 +14,24 @@ import org.joml.Quaterniond
1414import org.joml.Vector3d
1515import org.valkyrienskies.clockwork.ClockworkMod
1616import org.valkyrienskies.clockwork.content.logistics.gas.IHeatableBlockEntity
17+ import org.valkyrienskies.clockwork.util.AerodynamicUtils
1718import org.valkyrienskies.clockwork.util.universal_joint.IUniversalJoint
1819import org.valkyrienskies.core.api.ships.properties.ShipId
20+ import org.valkyrienskies.core.api.world.properties.DimensionId
1921import org.valkyrienskies.core.apigame.joints.*
2022import org.valkyrienskies.core.apigame.joints.VSD6Joint.D6Axis
2123import org.valkyrienskies.core.apigame.joints.VSD6Joint.D6Motion
22- import org.valkyrienskies.kelvin.api.ConnectionType
23- import org.valkyrienskies.kelvin.api.DuctEdge
24- import org.valkyrienskies.kelvin.api.DuctNodePos
24+ import org.valkyrienskies.kelvin.api.*
2525import org.valkyrienskies.kelvin.api.edges.PipeDuctEdge
2626import org.valkyrienskies.kelvin.util.KelvinExtensions.toDuctNodePos
2727import org.valkyrienskies.mod.common.getShipManagingPos
2828import org.valkyrienskies.mod.common.shipObjectWorld
2929import org.valkyrienskies.mod.common.util.toJOMLD
3030import java.lang.IllegalStateException
3131import java.util.EnumMap
32+ import org.valkyrienskies.kelvin.api.DuctNetwork.Companion.idealGasConstant
33+ import org.valkyrienskies.mod.api.dimensionId
34+ import kotlin.math.PI
3235
3336class ExtendonBlockEntity (type : BlockEntityType <* >? , pos : BlockPos , state : BlockState ? ) : SmartBlockEntity(type, pos, state), IUniversalJoint, IHeatableBlockEntity {
3437
@@ -57,13 +60,12 @@ class ExtendonBlockEntity(type: BlockEntityType<*>?, pos: BlockPos, state: Block
5760 val kelvin = ClockworkMod .getKelvin()
5861 val serverLevel = level as ServerLevel
5962
60- val pressure = kelvin.getPressureAt(getDuctNodePosition()) + kelvin.getPressureAt(connectedBe!! .getDuctNodePosition())
61- val distance = pressureToDistance(pressure)
63+ val distance = gasToDistance(kelvin, getDuctNodePosition(), level.dimensionId!! )
6264
6365
6466 val tempJoint = VSJointAndId (distanceJointId!! , VSDistanceJoint (distanceJoint!! .shipId0, distanceJoint!! .pose0, distanceJoint!! .shipId1, distanceJoint!! .pose1, minDistance = distance, maxDistance = distance))
6567
66- serverLevel.shipObjectWorld.updateConstraint(distanceJointId!! , tempJoint.joint)
68+ if (distance >= 0.15 ) serverLevel.shipObjectWorld.updateConstraint(distanceJointId!! , tempJoint.joint)
6769 distanceJoint = tempJoint.joint as VSDistanceJoint
6870 }
6971
@@ -205,14 +207,24 @@ class ExtendonBlockEntity(type: BlockEntityType<*>?, pos: BlockPos, state: Block
205207 }
206208
207209 companion object {
208- val force = 10000
209- val radius = 1
210210
211- fun pressureToDistance (pressure : Double ): Float {
212- val area = pressure / force
213- val height = area/ (2 * Math .PI * radius) - radius
211+ // Calculates volume of cylinder via Ideal Gas Law, and then calculates said cylinder's height
212+ // Doesn't account for the elastic force of the hose, because doing so would require solving a cubic polynomial
213+ fun gasToDistance (network : DuctNetwork <* >, pos : DuctNodePos , dimensionId : DimensionId ): Float {
214+ var moles = 0.0
215+ for (gas in network.getGasMassAt(pos)) moles + = gas.value / ( gas.key.density * 22.4 )
214216
215- return (height + 0.5 ).toFloat()
217+ if (moles < 0.01 ) return 0f
218+
219+ val pressure = AerodynamicUtils .getAirPressureForY(pos.y, dimensionId)
220+ val temperature = network.getTemperatureAt(pos)
221+
222+ val volume = temperature* idealGasConstant* moles/ pressure
223+ val height = 4 * volume / PI
224+
225+ println (" m $moles , p $pressure , t $temperature , v $volume , d $height " )
226+
227+ return height.toFloat()
216228 }
217229
218230 fun getQuaterniond (direction : Direction ): Quaterniond {
0 commit comments