use of org.apollo.game.model.area.RegionCoordinates in project apollo by apollo-rsps.
the class PrePlayerSynchronizationTask method run.
@Override
public void run() {
Position old = player.getPosition();
player.getWalkingQueue().pulse();
boolean local = true;
if (player.isTeleporting()) {
player.resetViewingDistance();
local = false;
}
Position position = player.getPosition();
if (!player.hasLastKnownRegion() || isRegionUpdateRequired()) {
player.setRegionChanged(true);
local = false;
player.setLastKnownRegion(position);
player.send(new RegionChangeMessage(position));
}
RegionRepository repository = player.getWorld().getRegionRepository();
Set<RegionCoordinates> oldViewable = repository.fromPosition(old).getSurrounding();
Set<RegionCoordinates> newViewable = repository.fromPosition(position).getSurrounding();
Set<RegionCoordinates> differences = new HashSet<>(newViewable);
differences.retainAll(oldViewable);
Set<RegionCoordinates> full = new HashSet<>(newViewable);
if (local) {
full.removeAll(oldViewable);
}
sendUpdates(player.getLastKnownRegion(), differences, full);
}
use of org.apollo.game.model.area.RegionCoordinates in project apollo by apollo-rsps.
the class SequentialClientSynchronizer method synchronize.
@Override
public void synchronize(MobRepository<Player> players, MobRepository<Npc> npcs) {
Map<RegionCoordinates, Set<RegionUpdateMessage>> encodes = new HashMap<>(), updates = new HashMap<>();
for (Player player : players) {
SynchronizationTask task = new PrePlayerSynchronizationTask(player, encodes, updates);
task.run();
}
for (Npc npc : npcs) {
SynchronizationTask task = new PreNpcSynchronizationTask(npc);
task.run();
}
for (Player player : players) {
SynchronizationTask task = new PlayerSynchronizationTask(player);
task.run();
task = new NpcSynchronizationTask(player);
task.run();
}
for (Player player : players) {
SynchronizationTask task = new PostPlayerSynchronizationTask(player);
task.run();
}
for (Npc npc : npcs) {
SynchronizationTask task = new PostNpcSynchronizationTask(npc);
task.run();
}
}
use of org.apollo.game.model.area.RegionCoordinates in project apollo by apollo-rsps.
the class PlayerSynchronizationTask method run.
@Override
public void run() {
Position lastKnownRegion = player.getLastKnownRegion();
boolean regionChanged = player.hasRegionChanged();
int[] appearanceTickets = player.getAppearanceTickets();
SynchronizationBlockSet blockSet = player.getBlockSet();
if (blockSet.contains(ChatBlock.class)) {
blockSet = blockSet.clone();
blockSet.remove(ChatBlock.class);
}
Position position = player.getPosition();
SynchronizationSegment segment = (player.isTeleporting() || player.hasRegionChanged()) ? new TeleportSegment(blockSet, position) : new MovementSegment(blockSet, player.getDirections());
List<Player> localPlayers = player.getLocalPlayerList();
int oldCount = localPlayers.size();
List<SynchronizationSegment> segments = new ArrayList<>();
int distance = player.getViewingDistance();
for (Iterator<Player> iterator = localPlayers.iterator(); iterator.hasNext(); ) {
Player other = iterator.next();
if (removeable(position, distance, other)) {
iterator.remove();
segments.add(new RemoveMobSegment());
} else {
segments.add(new MovementSegment(other.getBlockSet(), other.getDirections()));
}
}
int added = 0, count = localPlayers.size();
RegionRepository repository = player.getWorld().getRegionRepository();
Region current = repository.fromPosition(position);
Set<RegionCoordinates> regions = current.getSurrounding();
regions.add(current.getCoordinates());
Stream<Player> players = regions.stream().map(repository::get).flatMap(region -> region.getEntities(EntityType.PLAYER));
Iterator<Player> iterator = players.iterator();
while (iterator.hasNext()) {
if (count >= MAXIMUM_LOCAL_PLAYERS) {
player.flagExcessivePlayers();
break;
} else if (added >= NEW_PLAYERS_PER_CYCLE) {
break;
}
Player other = iterator.next();
Position local = other.getPosition();
if (other != player && local.isWithinDistance(position, distance) && !localPlayers.contains(other)) {
localPlayers.add(other);
count++;
added++;
blockSet = other.getBlockSet();
int index = other.getIndex();
if (!blockSet.contains(AppearanceBlock.class) && !hasCachedAppearance(appearanceTickets, index - 1, other.getAppearanceTicket())) {
blockSet = blockSet.clone();
blockSet.add(SynchronizationBlock.createAppearanceBlock(other));
}
segments.add(new AddPlayerSegment(blockSet, index, local));
}
}
PlayerSynchronizationMessage message = new PlayerSynchronizationMessage(lastKnownRegion, position, regionChanged, segment, oldCount, segments);
player.send(message);
}
use of org.apollo.game.model.area.RegionCoordinates in project apollo by apollo-rsps.
the class StaticGameObject method viewableBy.
@Override
public boolean viewableBy(Player player, World world) {
RegionRepository repository = world.getRegionRepository();
RegionCoordinates coordinates = position.getRegionCoordinates();
return repository.get(coordinates).contains(this);
}
use of org.apollo.game.model.area.RegionCoordinates in project apollo by apollo-rsps.
the class UpdateOperation method getPositionOffset.
/**
* Gets the position offset for the specified {@link Position}.
*
* @param position The Position.
* @return The position offset.
*/
private final int getPositionOffset(Position position) {
RegionCoordinates coordinates = region.getCoordinates();
int dx = position.getX() - coordinates.getAbsoluteX();
int dy = position.getY() - coordinates.getAbsoluteY();
Preconditions.checkArgument(dx >= 0 && dx < Region.SIZE, position + " not in expected Region of " + region + ".");
Preconditions.checkArgument(dy >= 0 && dy < Region.SIZE, position + " not in expected Region of " + region + ".");
return dx << 4 | dy;
}
Aggregations