Misc fixes regarding cable network node removals
This commit is contained in:
parent
fcc8fe157e
commit
f9bd671e88
@ -8,6 +8,7 @@ import ru.dbotthepony.mc.otm.SERVER_IS_LIVE
|
||||
import ru.dbotthepony.mc.otm.UNIVERSE_TICKS
|
||||
import ru.dbotthepony.mc.otm.capability.receiveEnergy
|
||||
import ru.dbotthepony.mc.otm.config.CablesConfig
|
||||
import ru.dbotthepony.mc.otm.core.addAll
|
||||
import ru.dbotthepony.mc.otm.core.collect.map
|
||||
import ru.dbotthepony.mc.otm.core.collect.reduce
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
@ -186,7 +187,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
nodes.add(node)
|
||||
}
|
||||
|
||||
private val nodes = LinkedHashSet<EnergyCableBlockEntity.Node>()
|
||||
val nodes = LinkedHashSet<EnergyCableBlockEntity.Node>()
|
||||
var paths = ReferenceLinkedOpenHashSet<SegmentPath>()
|
||||
|
||||
operator fun contains(node: EnergyCableBlockEntity.Node): Boolean {
|
||||
@ -244,7 +245,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
val newState = transferredLastTick.isPositive
|
||||
val numState = if (newState) 1 else -1
|
||||
|
||||
if (numState != lastPoweredStatus) {
|
||||
if (numState != lastPoweredStatus || true) {
|
||||
lastPoweredStatus = numState
|
||||
nodes.forEach { if (it.segment === this) it.updatePoweredState(newState) }
|
||||
}
|
||||
@ -257,7 +258,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
private fun blockstateUpdateStep() {
|
||||
val new = updateBlockstates()
|
||||
val changed = hasBlockstateTimer != new
|
||||
hasBlockstateTimer = updateBlockstates()
|
||||
hasBlockstateTimer = new
|
||||
lastPoweredSwitchFrequency = (lastPoweredSwitchFrequency shl 1) or (if (changed) 1 else 0)
|
||||
|
||||
if (hasBlockstateTimer && SERVER_IS_LIVE) {
|
||||
@ -383,6 +384,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
v.segment = Segment()
|
||||
v.segment.throughput = v.energyThroughput
|
||||
v.segment.throughputKnown = true
|
||||
v.segment.lastTick = lastTick
|
||||
v.segment.transferredLastTick = transferredLastTick
|
||||
v.segment.paths = paths.clone()
|
||||
v.updatePoweredState(false)
|
||||
@ -392,6 +394,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
result.add(v.segment)
|
||||
}
|
||||
|
||||
lastPoweredStatus = 0
|
||||
paths.forEach { it.nodes.addAll(nodes) }
|
||||
return result
|
||||
}
|
||||
@ -405,6 +408,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
val segment = Segment()
|
||||
v._segment = segment
|
||||
segment.nodes.add(v)
|
||||
segment.lastTick = lastTick
|
||||
segment.throughput = v.energyThroughput
|
||||
segment.throughputKnown = true
|
||||
segment.transferredLastTick = transferredLastTick
|
||||
@ -428,7 +432,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
}
|
||||
|
||||
private fun tryCombineWith(segment: Segment): Boolean {
|
||||
if (segment === this || segment.nodes.isEmpty()) return false
|
||||
if (segment === this || segment.nodes.isEmpty() || segment.paths.isEmpty()) return false
|
||||
|
||||
// if nodes have same set of paths then it is safe to combine this with target segment
|
||||
if (segment.paths == paths) {
|
||||
@ -456,7 +460,7 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
}
|
||||
|
||||
fun tryCombine(with: Collection<Segment>) {
|
||||
if (nodes.isEmpty()) return
|
||||
if (nodes.isEmpty() || paths.isEmpty()) return
|
||||
|
||||
for (segment in with) {
|
||||
if (tryCombineWith(segment)) return
|
||||
@ -581,12 +585,23 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
check(livelyNodesList.remove(node))
|
||||
}
|
||||
|
||||
node.segment.paths.forEach {
|
||||
val touchedSegments = HashSet<Segment>()
|
||||
|
||||
node.segment.paths.toTypedArray().forEach {
|
||||
pathCache.remove(it.a to it.b)
|
||||
|
||||
it.segments.forEach { s ->
|
||||
touchedSegments.add(s)
|
||||
s.paths.remove(it)
|
||||
|
||||
// this doesn't cover 100% of cases where previously split path segments
|
||||
// due to "this" path get recombined, but it should be good enough
|
||||
s.paths.forEach { touchedSegments.addAll(it.segments) }
|
||||
}
|
||||
}
|
||||
|
||||
node.segment.paths = ReferenceLinkedOpenHashSet()
|
||||
node.segment.split()
|
||||
touchedSegments.addAll(node.segment.split())
|
||||
touchedSegments.forEach { it.tryCombine(touchedSegments) }
|
||||
}
|
||||
|
||||
override fun onNodeAdded(node: EnergyCableBlockEntity.Node) {
|
||||
|
Loading…
Reference in New Issue
Block a user