Synchronization fix.

This commit is contained in:
Major-
2013-12-04 18:08:50 +00:00
parent ff25a4fe15
commit 349b004ec2
2 changed files with 39 additions and 38 deletions
@@ -48,9 +48,9 @@ public final class NpcSynchronizationTask extends SynchronizationTask {
List<Npc> localNpcs = player.getLocalNpcList(); List<Npc> localNpcs = player.getLocalNpcList();
int oldLocalNpcs = localNpcs.size(); int oldLocalNpcs = localNpcs.size();
List<SynchronizationSegment> segments = new ArrayList<SynchronizationSegment>(); 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() if (!npc.isActive() || npc.isTeleporting()
|| npc.getPosition().getLongestDelta(player.getPosition()) > player.getViewingDistance()) { || npc.getPosition().getLongestDelta(player.getPosition()) > player.getViewingDistance()) {
it.remove(); it.remove();
@@ -66,19 +66,21 @@ public final class NpcSynchronizationTask extends SynchronizationTask {
for (Npc npc : repository) { for (Npc npc : repository) {
if (localNpcs.size() >= 255) { if (localNpcs.size() >= 255) {
player.flagExcessiveNpcs(); player.flagExcessiveNpcs();
} else if (added < NEW_NPCS_PER_CYCLE) { break;
if (!localNpcs.contains(npc) } else if (added >= NEW_NPCS_PER_CYCLE) {
&& npc.getPosition().isWithinDistance(player.getPosition(), player.getViewingDistance())) { break;
}
if (npc.getPosition().isWithinDistance(player.getPosition(), player.getViewingDistance())
&& !localNpcs.contains(npc)) {
localNpcs.add(npc); localNpcs.add(npc);
added++; added++;
blockSet = npc.getBlockSet(); blockSet = npc.getBlockSet();
segments.add(new AddNpcSegment(blockSet, npc.getIndex(), npc.getPosition(), npc.getId())); segments.add(new AddNpcSegment(blockSet, npc.getIndex(), npc.getPosition(), npc.getNpcDefinition()
.getId()));
} }
continue;
} }
break;
}
NpcSynchronizationEvent event = new NpcSynchronizationEvent(player.getPosition(), segments, oldLocalNpcs); NpcSynchronizationEvent event = new NpcSynchronizationEvent(player.getPosition(), segments, oldLocalNpcs);
player.send(event); player.send(event);
} }
@@ -67,45 +67,44 @@ public final class PlayerSynchronizationTask extends SynchronizationTask {
List<Player> localPlayers = player.getLocalPlayerList(); List<Player> localPlayers = player.getLocalPlayerList();
int oldLocalPlayers = localPlayers.size(); int oldLocalPlayers = localPlayers.size();
List<SynchronizationSegment> segments = new ArrayList<SynchronizationSegment>(); List<SynchronizationSegment> segments = new ArrayList<SynchronizationSegment>();
Iterator<Player> it = localPlayers.iterator();
for (Player local = null; it.hasNext(); local = it.next()) { for (Iterator<Player> it = localPlayers.iterator(); it.hasNext();) {
if (!local.isActive() || local.isTeleporting() Player p = it.next();
|| local.getPosition().getLongestDelta(player.getPosition()) > player.getViewingDistance()) { if (!p.isActive() || p.isTeleporting()
|| p.getPosition().getLongestDelta(player.getPosition()) > player.getViewingDistance()) {
it.remove(); it.remove();
segments.add(new RemoveMobSegment()); segments.add(new RemoveMobSegment());
} else { } else {
segments.add(new MovementSegment(local.getBlockSet(), local.getDirections())); segments.add(new MovementSegment(p.getBlockSet(), p.getDirections()));
} }
} }
int added = 0; int added = 0;
MobRepository<Player> repository = World.getWorld().getPlayerRepository(); 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) { if (localPlayers.size() >= 255) {
player.flagExcessivePlayers(); player.flagExcessivePlayers();
} else if (added < NEW_PLAYERS_PER_CYCLE) { break;
// we do not check p.isActive() here, since if they are active they } else if (added >= NEW_PLAYERS_PER_CYCLE) {
// must be in the repository break;
if (global != player }
&& global.getPosition().isWithinDistance(player.getPosition(), player.getViewingDistance())
&& !localPlayers.contains(global)) { if (p != player && p.getPosition().isWithinDistance(player.getPosition(), player.getViewingDistance())
localPlayers.add(global); && !localPlayers.contains(p)) {
localPlayers.add(p);
added++; added++;
blockSet = global.getBlockSet(); blockSet = p.getBlockSet();
if (!blockSet.contains(AppearanceBlock.class)) { if (!blockSet.contains(AppearanceBlock.class)) {
// TODO check if client has cached appearance // TODO check if client has cached appearance
blockSet = blockSet.clone(); blockSet = blockSet.clone();
blockSet.add(SynchronizationBlock.createAppearanceBlock(global)); blockSet.add(SynchronizationBlock.createAppearanceBlock(p));
} }
segments.add(new AddPlayerSegment(blockSet, global.getIndex(), global.getPosition())); segments.add(new AddPlayerSegment(blockSet, p.getIndex(), p.getPosition()));
} }
continue;
}
break;
} }
PlayerSynchronizationEvent event = new PlayerSynchronizationEvent(lastKnownRegion, player.getPosition(), PlayerSynchronizationEvent event = new PlayerSynchronizationEvent(lastKnownRegion, player.getPosition(),