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();
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(),