diff --git a/Server/src/main/core/game/node/entity/player/Player.java b/Server/src/main/core/game/node/entity/player/Player.java index 77d205b01..cb94a83bd 100644 --- a/Server/src/main/core/game/node/entity/player/Player.java +++ b/Server/src/main/core/game/node/entity/player/Player.java @@ -856,7 +856,7 @@ public class Player extends Entity { getZoneMonitor().getZones().clear(); playerFlags.setLastSceneGraph(null); playerFlags.setUpdateSceneGraph(false); - playerFlags.setLastViewport(new LinkedList<>()); + playerFlags.setLastViewport(new RegionChunk[13][13]); renderInfo.getLocalNpcs().clear(); renderInfo.getLocalPlayers().clear(); renderInfo.setLastLocation(null); diff --git a/Server/src/main/core/game/world/update/MapChunkRenderer.kt b/Server/src/main/core/game/world/update/MapChunkRenderer.kt index cf18cc8a3..47e93ff53 100644 --- a/Server/src/main/core/game/world/update/MapChunkRenderer.kt +++ b/Server/src/main/core/game/world/update/MapChunkRenderer.kt @@ -13,8 +13,6 @@ import kotlin.math.abs * @author Emperor */ object MapChunkRenderer { - const val buildAreaDepth = 6 - /** * Sends the map chunk rendering packet. * @param player The player. @@ -23,35 +21,61 @@ object MapChunkRenderer { fun render(player: Player) { val last = player.playerFlags.lastViewport val updated: MutableList = ArrayList() - val current: MutableList = ArrayList() + val current: MutableList> = ArrayList() + val buildAreaDepth = 6 for (dcx in -buildAreaDepth..+buildAreaDepth) { + val addX = ArrayList() for (dcy in -buildAreaDepth..+buildAreaDepth) { val newloc = player.location.chunkBase.transform(dcx*8, dcy*8, 0) - current.add(newloc.chunk) + addX.add(newloc.chunk) } + current.add(addX) } - val removeList = LinkedList() - for (chunk in last) { - if (current.contains(chunk)) { - updated.add(chunk) - } else { - PacketRepository.send(ClearRegionChunk::class.java, ClearChunkContext(player, chunk)) - removeList.add(chunk) + var sizeX = last.size + for (x in 0 until sizeX) { + val sizeY: Int = last[x].size + for (y in 0 until sizeY) { + val previous = last[x][y] ?: continue + if (!containsChunk(current, previous)) { + PacketRepository.send(ClearRegionChunk::class.java, ClearChunkContext(player, previous)) + } else { + updated.add(previous) + } } } - for (chunk in removeList) { - last.remove(chunk) - } - - for (chunk in current) { - if (updated.contains(chunk)) { - chunk.update(player) - } else { - chunk.synchronize(player) + sizeX = current.size + for (x in 0 until sizeX) { + val sizeY: Int = current[x].size + for (y in 0 until sizeY) { + val chunk = current[x][y] + if (!updated.contains(chunk)) { + chunk.synchronize(player) + } else { + chunk.update(player) + } + last[x][y] = current[x][y] } - last.add(chunk) } } + + /** + * Checks if the chunks list contains the specified region chunk. + * @param list The list to search. + * @param c The region chunk. + * @return `True` if so. + */ + private fun containsChunk(list: MutableList>, c: RegionChunk): Boolean { + val sizeList = list.size + for (x in 0 until sizeList) { + val chunkSize: Int = list[x].size + for (y in 0 until chunkSize) { + if (list[x][y] === c) { + return true + } + } + } + return false + } } \ No newline at end of file diff --git a/Server/src/main/core/game/world/update/flag/PlayerFlags.java b/Server/src/main/core/game/world/update/flag/PlayerFlags.java index 4c75ac71f..41d0cb441 100644 --- a/Server/src/main/core/game/world/update/flag/PlayerFlags.java +++ b/Server/src/main/core/game/world/update/flag/PlayerFlags.java @@ -3,8 +3,6 @@ package core.game.world.update.flag; import core.game.world.map.Location; import core.game.world.map.RegionChunk; -import java.util.LinkedList; - /** * A class holding a player's updating flags. * @author Emperor @@ -19,7 +17,7 @@ public final class PlayerFlags { /** * The last viewport. */ - private LinkedList lastViewport = new LinkedList<>(); + private RegionChunk[][] lastViewport = new RegionChunk[13][13]; /** * The location the player was standing on when last scene graph update @@ -72,7 +70,7 @@ public final class PlayerFlags { * Gets the lastViewport. * @return The lastViewport. */ - public LinkedList getLastViewport() { + public RegionChunk[][] getLastViewport() { return lastViewport; } @@ -80,7 +78,7 @@ public final class PlayerFlags { * Sets the lastViewport. * @param lastViewport The lastViewport to set. */ - public void setLastViewport(LinkedList lastViewport) { + public void setLastViewport(RegionChunk[][] lastViewport) { this.lastViewport = lastViewport; }