Increase cable visuals update frequency the more it oscillate during last 17 ticks
This commit is contained in:
parent
b4e37fbd1f
commit
bd4fe17e33
@ -1,5 +1,6 @@
|
|||||||
package ru.dbotthepony.mc.otm.block.entity.cable
|
package ru.dbotthepony.mc.otm.block.entity.cable
|
||||||
|
|
||||||
|
import it.unimi.dsi.fastutil.ints.IntLists
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet
|
import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
|
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
|
||||||
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
|
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
|
||||||
@ -110,6 +111,10 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
|||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun triggerBlockstateUpdates() {
|
||||||
|
segments.forEach { it.triggerBlockstateUpdates() }
|
||||||
|
}
|
||||||
|
|
||||||
fun refund(amount: Decimal, simulate: Boolean, instantSnapshot: MutableMap<Segment, Decimal>) {
|
fun refund(amount: Decimal, simulate: Boolean, instantSnapshot: MutableMap<Segment, Decimal>) {
|
||||||
segments.forEach { it.refund(amount, simulate, instantSnapshot) }
|
segments.forEach { it.refund(amount, simulate, instantSnapshot) }
|
||||||
}
|
}
|
||||||
@ -152,6 +157,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
|||||||
private var throughputKnown = false
|
private var throughputKnown = false
|
||||||
private var lastTick = 0
|
private var lastTick = 0
|
||||||
private var lastPoweredStatus = 0
|
private var lastPoweredStatus = 0
|
||||||
|
private var lastPoweredSwitchFrequency = 0
|
||||||
|
|
||||||
private fun updateBlockstates(): Boolean {
|
private fun updateBlockstates(): Boolean {
|
||||||
if (nodes.isEmpty()) return false
|
if (nodes.isEmpty()) return false
|
||||||
@ -175,15 +181,32 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
|||||||
private var hasBlockstateTimer = false
|
private var hasBlockstateTimer = false
|
||||||
|
|
||||||
private fun blockstateUpdateStep() {
|
private fun blockstateUpdateStep() {
|
||||||
|
val new = updateBlockstates()
|
||||||
|
val changed = hasBlockstateTimer != new
|
||||||
hasBlockstateTimer = updateBlockstates()
|
hasBlockstateTimer = updateBlockstates()
|
||||||
|
lastPoweredSwitchFrequency = (lastPoweredSwitchFrequency shl 1) or (if (changed) 1 else 0)
|
||||||
|
|
||||||
if (hasBlockstateTimer) {
|
if (hasBlockstateTimer) {
|
||||||
onceServer(20) {
|
var i = 20
|
||||||
|
|
||||||
|
for (index in 0 .. 16) {
|
||||||
|
if (lastPoweredSwitchFrequency and (index shl index) != 0) {
|
||||||
|
i--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onceServer(i) {
|
||||||
blockstateUpdateStep()
|
blockstateUpdateStep()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun triggerBlockstateUpdates() {
|
||||||
|
if (!hasBlockstateTimer && transferredLastTick > Decimal.ZERO) {
|
||||||
|
blockstateUpdateStep()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun throughput(instantSnapshot: Reference2ObjectOpenHashMap<Segment, Decimal>): Decimal {
|
fun throughput(instantSnapshot: Reference2ObjectOpenHashMap<Segment, Decimal>): Decimal {
|
||||||
if (lastTick != UNIVERSE_TICKS) {
|
if (lastTick != UNIVERSE_TICKS) {
|
||||||
transferredLastTick = Decimal.ZERO
|
transferredLastTick = Decimal.ZERO
|
||||||
@ -229,17 +252,13 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
|||||||
val diff = new - transferredLastTick
|
val diff = new - transferredLastTick
|
||||||
transferredLastTick = new
|
transferredLastTick = new
|
||||||
|
|
||||||
if (!hasBlockstateTimer) {
|
|
||||||
blockstateUpdateStep()
|
|
||||||
}
|
|
||||||
|
|
||||||
return diff
|
return diff
|
||||||
}
|
}
|
||||||
|
|
||||||
fun refund(amount: Decimal, simulate: Boolean, instantSnapshot: MutableMap<Segment, Decimal>) {
|
fun refund(amount: Decimal, simulate: Boolean, instantSnapshot: MutableMap<Segment, Decimal>) {
|
||||||
if (simulate) {
|
if (simulate) {
|
||||||
if (this in instantSnapshot) {
|
if (this in instantSnapshot) {
|
||||||
instantSnapshot[this] = maxOf(instantSnapshot[this]!! - amount, Decimal.ZERO)
|
instantSnapshot[this] = maxOf((instantSnapshot[this] ?: Decimal.ZERO) - amount, Decimal.ZERO)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
transferredLastTick = maxOf(transferredLastTick - amount, Decimal.ZERO)
|
transferredLastTick = maxOf(transferredLastTick - amount, Decimal.ZERO)
|
||||||
@ -472,6 +491,12 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
|||||||
// so cables record actual value transferred through them
|
// so cables record actual value transferred through them
|
||||||
if (thisReceived != pathTransferred) {
|
if (thisReceived != pathTransferred) {
|
||||||
path.refund(pathTransferred - thisReceived, simulate, snapshot)
|
path.refund(pathTransferred - thisReceived, simulate, snapshot)
|
||||||
|
|
||||||
|
if (!simulate && thisReceived != Decimal.ZERO) {
|
||||||
|
path.triggerBlockstateUpdates()
|
||||||
|
}
|
||||||
|
} else if (!simulate) {
|
||||||
|
path.triggerBlockstateUpdates()
|
||||||
}
|
}
|
||||||
|
|
||||||
received += thisReceived
|
received += thisReceived
|
||||||
@ -510,6 +535,10 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
|||||||
|
|
||||||
for (path in paths) {
|
for (path in paths) {
|
||||||
val passed = path.transfer(thisReceived, simulate, snapshot)
|
val passed = path.transfer(thisReceived, simulate, snapshot)
|
||||||
|
|
||||||
|
if (!simulate)
|
||||||
|
path.triggerBlockstateUpdates()
|
||||||
|
|
||||||
thisReceived -= passed
|
thisReceived -= passed
|
||||||
if (thisReceived <= Decimal.ZERO) break
|
if (thisReceived <= Decimal.ZERO) break
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user