diff --git a/Server/src/main/core/game/world/GameWorld.kt b/Server/src/main/core/game/world/GameWorld.kt index 2c0b55e2c..a7b5e1f0b 100644 --- a/Server/src/main/core/game/world/GameWorld.kt +++ b/Server/src/main/core/game/world/GameWorld.kt @@ -18,7 +18,9 @@ import core.ServerStore import core.auth.AuthProvider import core.auth.Auth import core.game.system.config.ConfigParser +import core.game.world.map.RegionChunk import core.game.world.repository.Repository +import core.game.world.update.ChunkUpdateTracker import core.plugin.ClassScanner import core.storage.AccountStorageProvider import core.tools.Log @@ -164,6 +166,7 @@ object GameWorld { fun prompt(run: Boolean, directory: String?){ log(GameWorld::class.java, Log.FINE, "Prompting ${settings?.name} Game World...") Cache.init(ServerConstants.CACHE_PATH) + RegionChunk.dirtyListener = ChunkUpdateTracker //go overboard with checks to make sure dev mode authenticator never triggers on live Auth.configure() ConfigParser().prePlugin() diff --git a/Server/src/main/core/game/world/map/RegionChunk.java b/Server/src/main/core/game/world/map/RegionChunk.java index 94abe9189..35aa5c707 100644 --- a/Server/src/main/core/game/world/map/RegionChunk.java +++ b/Server/src/main/core/game/world/map/RegionChunk.java @@ -9,6 +9,7 @@ import core.game.node.scenery.Constructed; import core.game.node.scenery.Scenery; import core.game.node.scenery.SceneryBuilder; import core.game.world.map.build.ChunkFlags; +import core.game.world.update.ChunkDirtyListener; import core.game.world.update.flag.chunk.ItemUpdateFlag; import core.net.packet.PacketRepository; import core.net.packet.context.BuildItemContext; @@ -41,6 +42,11 @@ public class RegionChunk { */ public static final int SIZE = 8; + /** + * Notified whenever a chunk is flagged, so the rendering pipeline can reset only the chunks that were actually touched. + */ + public static ChunkDirtyListener dirtyListener = chunk -> {}; + /** * The base location of the copied region chunk. */ @@ -345,6 +351,7 @@ public class RegionChunk { */ public void flag(UpdateFlag flag) { updateFlags.add(flag); + dirtyListener.onFlagged(this); } /** diff --git a/Server/src/main/core/game/world/map/RegionManager.kt b/Server/src/main/core/game/world/map/RegionManager.kt index 0407a569f..e60c43296 100644 --- a/Server/src/main/core/game/world/map/RegionManager.kt +++ b/Server/src/main/core/game/world/map/RegionManager.kt @@ -62,22 +62,6 @@ object RegionManager { } } - /** - * Pulses the active regions. - */ - @JvmStatic - fun pulse() { - apply { r -> - for (x in 0 until 8) { - for (y in 0 until 8) { - for (z in 0 until 4) { - r.chunks[x][y][z]?.resetFlags() - } - } - } - } - } - /** * Gets the clipping flag. * @param z The plane. diff --git a/Server/src/main/core/game/world/update/ChunkDirtyListener.kt b/Server/src/main/core/game/world/update/ChunkDirtyListener.kt new file mode 100644 index 000000000..668c73ce7 --- /dev/null +++ b/Server/src/main/core/game/world/update/ChunkDirtyListener.kt @@ -0,0 +1,7 @@ +package core.game.world.update + +import core.game.world.map.RegionChunk + +fun interface ChunkDirtyListener { + fun onFlagged(chunk: RegionChunk) +} diff --git a/Server/src/main/core/game/world/update/ChunkUpdateTracker.kt b/Server/src/main/core/game/world/update/ChunkUpdateTracker.kt new file mode 100644 index 000000000..03a3d9d0d --- /dev/null +++ b/Server/src/main/core/game/world/update/ChunkUpdateTracker.kt @@ -0,0 +1,19 @@ +package core.game.world.update + +import core.game.world.map.RegionChunk +import java.util.Collections +import java.util.IdentityHashMap + +object ChunkUpdateTracker : ChunkDirtyListener { + private val dirty = Collections.newSetFromMap(IdentityHashMap()) + + override fun onFlagged(chunk: RegionChunk) { + dirty.add(chunk) + } + + /** Resets flags on exactly the chunks flagged this tick. Must run after all per-player flushes. */ + fun resetAll() { + dirty.forEach { it.resetFlags() } + dirty.clear() + } +} diff --git a/Server/src/main/core/game/world/update/UpdateSequence.kt b/Server/src/main/core/game/world/update/UpdateSequence.kt index bc17fbd65..775900633 100644 --- a/Server/src/main/core/game/world/update/UpdateSequence.kt +++ b/Server/src/main/core/game/world/update/UpdateSequence.kt @@ -59,7 +59,7 @@ class UpdateSequence playersList!!.forEach(Player::reset) npcList!!.forEach(NPC::reset) renderablePlayers.sync() - RegionManager.pulse() + ChunkUpdateTracker.resetAll() GroundItemManager.pulse() }