diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index 3b9a19e89..a279abffd 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -1546,8 +1546,11 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial } fun onPlayerChangeDimensionEvent(event: PlayerEvent.PlayerChangedDimensionEvent) { - event.entity.getCapability(MatteryCapability.MATTERY_PLAYER).ifPresentK { - it.invalidateNetworkState() + onceServer { + event.entity.getCapability(MatteryCapability.MATTERY_PLAYER).ifPresentK { + it.invalidateNetworkState() + it.recreateExoPackMenu() + } } } @@ -1604,8 +1607,9 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial it.invalidateNetworkState() event.original.invalidateCaps() - if (SERVER_IS_LIVE) { - it.tickList.timer(20) { + onceServer { + event.entity.getCapability(MatteryCapability.MATTERY_PLAYER).ifPresentK { + it.invalidateNetworkState() it.recreateExoPackMenu() } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSynchronizer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSynchronizer.kt index c8140a121..c9dd51db8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSynchronizer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSynchronizer.kt @@ -1700,6 +1700,36 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa super.remove() } + override fun markDirty() { + check(!isRemoved) { "Field was removed" } + + if (isRemote || endpoints.isEmpty()) + return + + isDirty = true + + val endpoints = LinkedList Unit>>>() + + forEachEndpoint { + endpoints.add(it.getSetBacklog(this)) + it.addDirtyField(this) + } + + endpoints.forEach { + it.clear() + it.add(null to ClearBacklogEntry) + } + + for (value in backingSet) { + val valueCopy = codec.copy(value) + val pair: Pair Unit> = valueCopy to { it.write(ChangesetAction.ADD.ordinal + 1); codec.write(it, valueCopy) } + + endpoints.forEach { + it.add(pair) + } + } + } + override fun markDirty(endpoint: Endpoint) { super.markDirty(endpoint) @@ -1708,7 +1738,8 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa it.add(null to ClearBacklogEntry) for (value in backingSet) { - it.add(value to { it.write(ChangesetAction.ADD.ordinal + 1); codec.write(it, value) }) + val valueCopy = codec.copy(value) + it.add(valueCopy to { it.write(ChangesetAction.ADD.ordinal + 1); codec.write(it, valueCopy) }) } } } @@ -1950,14 +1981,14 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa for ((key, value) in backingMap) { val valueCopy = valueCodec.copy(value) - val action = { it: DataOutputStream -> + val action = key to { it: DataOutputStream -> it.write(ChangesetAction.ADD.ordinal + 1) keyCodec.write(it, key) valueCodec.write(it, valueCopy) } for (backlog in backlogs) { - backlog.add(key to action) + backlog.add(action) } } }