mirror of
https://github.com/2006-Scape/apollo.git
synced 2026-07-07 16:49:12 +00:00
Synchronization fix.
This commit is contained in:
@@ -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(),
|
||||||
|
|||||||
Reference in New Issue
Block a user