From 949e529b1926436588a5d11db2e3e45c27f2082b Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 21 Oct 2022 23:06:37 +0700 Subject: [PATCH] Instantly invalidate synchronizers for mattery players --- .../otm/capability/MatteryPlayerCapability.kt | 34 ++++++++----------- .../mc/otm/network/FieldSynchronizer.kt | 11 ++++++ 2 files changed, 25 insertions(+), 20 deletions(-) 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 7f4bcfe2b..f53d30e2c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -179,8 +179,6 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial private var shouldPlaySound = false private val research = IdentityHashMap() - private var invalidateNetworkIn = 10 - val isEverAndroid: Boolean get() = isAndroid || willBecomeAndroid var lastJumpTicks = 14 @@ -193,7 +191,20 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial val androidEnergy = AndroidPowerSource(ply, synchronizer, ServerConfig.ANDROID_MAX_ENERGY, ServerConfig.ANDROID_MAX_ENERGY) fun invalidateNetworkState() { - invalidateNetworkIn = 10 + synchronizer.invalidate() + publicSynchronizer.invalidate() + + for (instance in research.values) { + instance.invalidateNetwork() + } + + for (feature in featureMap.values) { + feature.invalidateNetwork() + } + + for (i in 0 until exoSuitMenu.slots.size) { + exoSuitMenu.setRemoteSlotNoCopy(i, ItemStack.EMPTY) + } } fun becomeAndroidSoft() { @@ -646,23 +657,6 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial queuedTicks.clear() - if (invalidateNetworkIn > 0 && --invalidateNetworkIn == 0) { - synchronizer.invalidate() - publicSynchronizer.invalidate() - - for (instance in research.values) { - instance.invalidateNetwork() - } - - for (feature in featureMap.values) { - feature.invalidateNetwork() - } - - for (i in 0 until exoSuitMenu.slots.size) { - exoSuitMenu.setRemoteSlotNoCopy(i, ItemStack.EMPTY) - } - } - tickedOnce = true val payload = synchronizer.collectNetworkPayload() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt index a0320a8e6..e957139e5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt @@ -418,6 +418,10 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa private var mappingVersion = -1 + fun invalidateMappings() { + mappingVersion = -1 + } + fun markUnused() { require(this === defaultEndpoint) { "This is not a default endpoint" } if (unused) return @@ -1023,10 +1027,17 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa } } + /** + * marks all fields dirty, invalidates mappings for each endpoint + */ fun invalidate() { for (field in fields) { field.markDirty() } + + forEachEndpoint { + it.invalidateMappings() + } } fun observe(): Boolean {