diff --git a/game/src/main/org/apollo/game/sync/task/NpcSynchronizationTask.java b/game/src/main/org/apollo/game/sync/task/NpcSynchronizationTask.java index 7876936d..af06040c 100644 --- a/game/src/main/org/apollo/game/sync/task/NpcSynchronizationTask.java +++ b/game/src/main/org/apollo/game/sync/task/NpcSynchronizationTask.java @@ -3,9 +3,15 @@ package org.apollo.game.sync.task; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Set; +import java.util.stream.Stream; import org.apollo.game.message.impl.NpcSynchronizationMessage; import org.apollo.game.model.Position; +import org.apollo.game.model.area.Region; +import org.apollo.game.model.area.RegionCoordinates; +import org.apollo.game.model.area.RegionRepository; +import org.apollo.game.model.entity.EntityType; import org.apollo.game.model.entity.Npc; import org.apollo.game.model.entity.Player; import org.apollo.game.sync.seg.AddNpcSegment; @@ -70,7 +76,18 @@ public final class NpcSynchronizationTask extends SynchronizationTask { int added = 0, count = locals.size(); - for (Npc npc : player.getWorld().getNpcRepository()) { + RegionRepository repository = player.getWorld().getRegionRepository(); + Region current = repository.fromPosition(playerPosition); + + Set regions = current.getSurrounding(); + regions.add(current.getCoordinates()); + + Stream npcs = regions.stream().map(repository::get) + .flatMap(region -> region.getEntities(EntityType.NPC)); + + Iterator iterator = npcs.iterator(); + + while (iterator.hasNext()) { if (count >= MAXIMUM_LOCAL_NPCS) { player.flagExcessiveNpcs(); break; @@ -78,6 +95,7 @@ public final class NpcSynchronizationTask extends SynchronizationTask { break; } + Npc npc = iterator.next(); Position position = npc.getPosition(); if (position.isWithinDistance(playerPosition, distance) && !locals.contains(npc)) { locals.add(npc); diff --git a/game/src/main/org/apollo/game/sync/task/PlayerSynchronizationTask.java b/game/src/main/org/apollo/game/sync/task/PlayerSynchronizationTask.java index be7f30d1..123f3e6d 100644 --- a/game/src/main/org/apollo/game/sync/task/PlayerSynchronizationTask.java +++ b/game/src/main/org/apollo/game/sync/task/PlayerSynchronizationTask.java @@ -3,9 +3,15 @@ package org.apollo.game.sync.task; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Set; +import java.util.stream.Stream; import org.apollo.game.message.impl.PlayerSynchronizationMessage; import org.apollo.game.model.Position; +import org.apollo.game.model.area.Region; +import org.apollo.game.model.area.RegionCoordinates; +import org.apollo.game.model.area.RegionRepository; +import org.apollo.game.model.entity.EntityType; import org.apollo.game.model.entity.Player; import org.apollo.game.sync.block.AppearanceBlock; import org.apollo.game.sync.block.ChatBlock; @@ -86,7 +92,18 @@ public final class PlayerSynchronizationTask extends SynchronizationTask { int added = 0, count = localPlayers.size(); - for (Player other : player.getWorld().getPlayerRepository()) { + RegionRepository repository = player.getWorld().getRegionRepository(); + Region current = repository.fromPosition(position); + + Set regions = current.getSurrounding(); + regions.add(current.getCoordinates()); + + Stream players = regions.stream().map(repository::get) + .flatMap(region -> region.getEntities(EntityType.PLAYER)); + + Iterator iterator = players.iterator(); + + while (iterator.hasNext()) { if (count >= MAXIMUM_LOCAL_PLAYERS) { player.flagExcessivePlayers(); break; @@ -94,6 +111,7 @@ public final class PlayerSynchronizationTask extends SynchronizationTask { break; } + Player other = iterator.next(); Position local = other.getPosition(); if (other != player && local.isWithinDistance(position, distance) && !localPlayers.contains(other)) {