mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-03 00:38:21 +00:00
Synchronization fix.
This commit is contained in:
@@ -48,9 +48,9 @@ public final class NpcSynchronizationTask extends SynchronizationTask {
|
||||
List<Npc> localNpcs = player.getLocalNpcList();
|
||||
int oldLocalNpcs = localNpcs.size();
|
||||
List<SynchronizationSegment> segments = new ArrayList<SynchronizationSegment>();
|
||||
Iterator<Npc> it = localNpcs.iterator();
|
||||
|
||||
for (Npc npc = null; it.hasNext(); npc = it.next()) {
|
||||
for (Iterator<Npc> it = localNpcs.iterator(); it.hasNext();) {
|
||||
Npc npc = it.next();
|
||||
if (!npc.isActive() || npc.isTeleporting()
|
||||
|| npc.getPosition().getLongestDelta(player.getPosition()) > player.getViewingDistance()) {
|
||||
it.remove();
|
||||
@@ -66,19 +66,21 @@ public final class NpcSynchronizationTask extends SynchronizationTask {
|
||||
for (Npc npc : repository) {
|
||||
if (localNpcs.size() >= 255) {
|
||||
player.flagExcessiveNpcs();
|
||||
} else if (added < NEW_NPCS_PER_CYCLE) {
|
||||
if (!localNpcs.contains(npc)
|
||||
&& npc.getPosition().isWithinDistance(player.getPosition(), player.getViewingDistance())) {
|
||||
localNpcs.add(npc);
|
||||
added++;
|
||||
blockSet = npc.getBlockSet();
|
||||
segments.add(new AddNpcSegment(blockSet, npc.getIndex(), npc.getPosition(), npc.getId()));
|
||||
}
|
||||
continue;
|
||||
break;
|
||||
} else if (added >= NEW_NPCS_PER_CYCLE) {
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
if (npc.getPosition().isWithinDistance(player.getPosition(), player.getViewingDistance())
|
||||
&& !localNpcs.contains(npc)) {
|
||||
localNpcs.add(npc);
|
||||
added++;
|
||||
blockSet = npc.getBlockSet();
|
||||
segments.add(new AddNpcSegment(blockSet, npc.getIndex(), npc.getPosition(), npc.getNpcDefinition()
|
||||
.getId()));
|
||||
}
|
||||
}
|
||||
|
||||
NpcSynchronizationEvent event = new NpcSynchronizationEvent(player.getPosition(), segments, oldLocalNpcs);
|
||||
player.send(event);
|
||||
}
|
||||
|
||||
@@ -67,45 +67,44 @@ public final class PlayerSynchronizationTask extends SynchronizationTask {
|
||||
List<Player> localPlayers = player.getLocalPlayerList();
|
||||
int oldLocalPlayers = localPlayers.size();
|
||||
List<SynchronizationSegment> segments = new ArrayList<SynchronizationSegment>();
|
||||
Iterator<Player> it = localPlayers.iterator();
|
||||
|
||||
for (Player local = null; it.hasNext(); local = it.next()) {
|
||||
if (!local.isActive() || local.isTeleporting()
|
||||
|| local.getPosition().getLongestDelta(player.getPosition()) > player.getViewingDistance()) {
|
||||
for (Iterator<Player> it = localPlayers.iterator(); it.hasNext();) {
|
||||
Player p = it.next();
|
||||
if (!p.isActive() || p.isTeleporting()
|
||||
|| p.getPosition().getLongestDelta(player.getPosition()) > player.getViewingDistance()) {
|
||||
it.remove();
|
||||
segments.add(new RemoveMobSegment());
|
||||
} else {
|
||||
segments.add(new MovementSegment(local.getBlockSet(), local.getDirections()));
|
||||
segments.add(new MovementSegment(p.getBlockSet(), p.getDirections()));
|
||||
}
|
||||
}
|
||||
|
||||
int added = 0;
|
||||
|
||||
MobRepository<Player> repository = World.getWorld().getPlayerRepository();
|
||||
for (Player global : repository) {
|
||||
for (Iterator<Player> it = repository.iterator(); it.hasNext();) {
|
||||
Player p = it.next();
|
||||
if (localPlayers.size() >= 255) {
|
||||
player.flagExcessivePlayers();
|
||||
} else if (added < NEW_PLAYERS_PER_CYCLE) {
|
||||
// we do not check p.isActive() here, since if they are active they
|
||||
// must be in the repository
|
||||
if (global != player
|
||||
&& global.getPosition().isWithinDistance(player.getPosition(), player.getViewingDistance())
|
||||
&& !localPlayers.contains(global)) {
|
||||
localPlayers.add(global);
|
||||
added++;
|
||||
|
||||
blockSet = global.getBlockSet();
|
||||
if (!blockSet.contains(AppearanceBlock.class)) {
|
||||
// TODO check if client has cached appearance
|
||||
blockSet = blockSet.clone();
|
||||
blockSet.add(SynchronizationBlock.createAppearanceBlock(global));
|
||||
}
|
||||
|
||||
segments.add(new AddPlayerSegment(blockSet, global.getIndex(), global.getPosition()));
|
||||
}
|
||||
continue;
|
||||
break;
|
||||
} else if (added >= NEW_PLAYERS_PER_CYCLE) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (p != player && p.getPosition().isWithinDistance(player.getPosition(), player.getViewingDistance())
|
||||
&& !localPlayers.contains(p)) {
|
||||
localPlayers.add(p);
|
||||
added++;
|
||||
|
||||
blockSet = p.getBlockSet();
|
||||
if (!blockSet.contains(AppearanceBlock.class)) {
|
||||
// TODO check if client has cached appearance
|
||||
blockSet = blockSet.clone();
|
||||
blockSet.add(SynchronizationBlock.createAppearanceBlock(p));
|
||||
}
|
||||
|
||||
segments.add(new AddPlayerSegment(blockSet, p.getIndex(), p.getPosition()));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
PlayerSynchronizationEvent event = new PlayerSynchronizationEvent(lastKnownRegion, player.getPosition(),
|
||||
|
||||
Reference in New Issue
Block a user