83public final class World {
85 private static final Logger logger = LogManager.getLogger(World.class);
94 private final Queue<Player> logins =
new ConcurrentLinkedQueue<>();
97 private final Queue<Player> logouts =
new ConcurrentLinkedQueue<>();
105 private final Thread taskDeadlockWatcherThread;
109 public static final AtomicBoolean update =
new AtomicBoolean(
false);
111 public static int addition = 0;
117 private static final World WORLD =
new World();
123 taskDeadlockWatcherThread =
new Thread(taskDeadlockWatcher);
124 taskDeadlockWatcherThread.setName(
"TaskDeadlockWatcher");
125 taskDeadlockWatcherThread.start();
135 System.out.println(
"Saving Tarnish...");
136 get().players.forEach(PlayerSerializer::save);
137 logger.info(
"All players were successfully saved.");
141 logger.info(
"All clans were successfully saved.");
144 logger.info(
"All trading post history was successfully saved");
146 logger.info(
"All game data were successfully saved.");
154 get().players.stream().forEach(it -> it.send(
new SendGameMessage(0, time / 100,
"System update" +
" in:")));
160 System.out.println(
"shutting down...");
161 get().taskDeadlockWatcher.requestExit();
168 get().logins.add(player);
170 player.getSession().ifPresent(it -> World.get().logins.add(player));
176 if (player ==
null ||
get().logouts.contains(player)) {
180 get().logouts.add(player);
184 public static Optional<Player>
search(String name) {
185 for (
Player player :
get().players) {
186 if (player ==
null) {
190 if (player.getUsername().equalsIgnoreCase(name)) {
191 return Optional.of(player);
194 return Optional.empty();
197 public static Optional<Player> searchAll(String name) {
198 for (
Player player :
get().players) {
199 if (player ==
null) {
203 if (player.getUsername().equalsIgnoreCase(name)) {
204 return Optional.of(player);
209 if (player ==
null) {
213 if (player.getUsername().equalsIgnoreCase(name)) {
214 return Optional.of(player);
217 return Optional.empty();
220 public static Optional<Player> getPlayerByHash(
long usernameHash) {
221 for (Player player : World.getPlayers()) {
222 if (Objects.equals(player.usernameLong, usernameHash))
223 return Optional.of(player);
225 return Optional.empty();
228 public static Optional<Player> getPlayerByName(String username) {
229 for (Player player : World.getPlayers()) {
230 if (Objects.equals(player.getUsername(), username))
231 return Optional.of(player);
233 return Optional.empty();
238 for (
Player player : World.getPlayers()) {
239 if (player.getIndex() == index)
240 return Optional.of(player);
242 return Optional.empty();
247 for (
Npc npc : World.getNpcs()) {
248 if (npc.getIndex() == index)
249 return Optional.of(npc);
251 return Optional.empty();
254 public static void kickPlayer(
Player other) {
259 public static void kickPlayer(Predicate<Player> condition) {
260 for (
Player player :
get().players) {
263 if (!condition.test(player))
270 public void process() {
273 }
catch (Exception ex) {
274 logger.error(
"Error sequencing task manager", ex);
277 PestControlLobby.sequence();
278 }
catch (Exception ex) {
279 logger.error(
"Error sequencing pest control.", ex);
285 get().taskManager.schedule(task);
289 public static void schedule(
int delay, Runnable runnable) {
292 public void execute() {
306 for (
Player player : getPlayers()) {
307 if (player.instance != instance)
309 if (!
Utility.withinDistance(player, position,
Region.VIEW_DISTANCE))
315 get().players.stream().filter(player ->
Utility.withinDistance(player, position,
Region.VIEW_DISTANCE))
322 for (
Player player : getPlayers()) {
323 if (player.instance !=
object.getInstancedHeight())
325 if (!
Utility.withinDistance(player,
object.getPosition(),
Region.VIEW_DISTANCE))
333 for (
Player player : getPlayers()) {
334 if (player.instance != instance)
336 if (!
Utility.withinDistance(player, position,
Region.VIEW_DISTANCE))
338 player.send(
new SendProjectile(projectile, position, lock, offsetX, offsetY));
345 int lockon = target.
isNpc() ? target.getIndex() + 1 : -target.getIndex() - 1;
346 int sourceX = source.
getX() + source.
width() / 2, sourceY = source.
getY() + source.
length() / 2;
347 int targetX = target.
getX() + target.
width() / 2, targetY = target.
getY() + target.
length() / 2;
348 byte offsetX = (byte) (targetX - sourceX);
349 byte offsetY = (byte) (targetY - sourceY);
352 for (
Player player : getPlayers()) {
353 if (source.instance != player.instance)
355 if (!
Utility.withinDistance(target, player,
Region.VIEW_DISTANCE))
357 player.send(
new SendProjectile(projectile, center, lockon, offsetX, offsetY));
362 int lockon = target.
isNpc() ? target.getIndex() + 1 : -target.getIndex() - 1;
363 int sourceX = source.
getX(), sourceY = source.
getY();
364 int targetX = target.
getX() + target.
width() / 2, targetY = target.
getY() + target.
length() / 2;
365 byte offsetX = (byte) (targetX - sourceX);
366 byte offsetY = (byte) (targetY - sourceY);
369 for (
Player player : getPlayers()) {
370 if (!
Utility.withinDistance(target, player,
Region.VIEW_DISTANCE))
372 player.send(
new SendProjectile(projectile, center, lockon, offsetX, offsetY));
378 int sourceX = source.
getX() + source.
width() / 2, sourceY = source.
getY() + source.
length() / 2;
380 byte offsetX = (byte) (target.
getX() - sourceX);
381 byte offsetY = (byte) (target.
getY() - sourceY);
382 for (
Player player : getPlayers()) {
383 if (source.instance != player.instance)
385 if (!
Utility.withinDistance(player, target,
Region.VIEW_DISTANCE))
387 player.send(
new SendProjectile(projectile, center, -1, offsetX, offsetY));
392 int sourceX = source.
getX(), sourceY = source.
getY();
394 byte offsetX = (byte) (target.
getX() - sourceX);
395 byte offsetY = (byte) (target.
getY() - sourceY);
396 for (
Player player : getPlayers()) {
397 if (!
Utility.withinDistance(player, target,
Region.VIEW_DISTANCE))
399 player.send(
new SendProjectile(projectile, center, -1, offsetX, offsetY));
403 public static int executeProjectile(
Mob entity, ProjectileTest projectile) {
404 if (projectile ==
null) {
407 Position source = projectile.getStart();
408 Position target = projectile.getTarget();
409 if (source ==
null || target ==
null) {
412 Position delta = projectile.getTarget().getDelta(source, target);
414 int distance = entity.
getPosition().getChevDistance(target);
416 if (distance <= 60) {
417 int creatorSize = projectile.getCreatorSize() == -1 ? 1 : projectile.getCreatorSize();
419 for (
Player player : getPlayers()) {
420 if (player ==
null) {
424 if (source.isViewableFrom(player.getPosition())) {
425 player.send(
new SendProjectileTestPacket(source, delta, projectile.getSlope(), projectile.getSpeed(), projectile.getProjectileId(), projectile.getStartHeight(), projectile.getEndHeight(), projectile.getLockon(), projectile.getDelay(), creatorSize, projectile.getStartDistanceOffset()));
429 return projectile.getHitDelay(distance);
434 for (
Player player : getPlayers()) {
436 player.message(messages);
441 public static void sendMessage(String message, Predicate<Player> filter) {
442 for (
Player player : getPlayers()) {
443 if (player !=
null && filter.test(player))
444 player.message(message);
448 public static void sendStaffMessage(String... messages) {
450 player.message(messages);
455 public static void sendBroadcast(
int time, String message,
boolean countdown) {
456 get().players.stream().forEach($it -> {
462 public void dequeLogins() {
463 if (logins.isEmpty()) {
468 Player player = logins.poll();
470 if (player ==
null) {
476 }
catch (Exception ex) {
477 logger.error(String.format(
"error registering %s", player), ex);
483 public void dequeLogouts() {
484 if (logouts.isEmpty()) {
488 for (
int index = 0; index < Config.LOGOUT_THESHOLD; index++) {
489 Player player = logouts.poll();
491 if (player ==
null) {
495 World.schedule(
new PlayerRemovalTask(player,
false));
499 public int getWildernessResourcePlayers() {
501 for (Player player : getPlayers()) {
502 if (player !=
null && Area.inWildernessResource(player))
510 if (victim.
isNpc()) {
511 if (
Area.inWilderness(victim)) {
514 if (!victim.getNpc().npcAssistant.isBoss()) {
519 for (
final Player player : getPlayers()) {
526 return Math.toIntExact(getPlayers().size() + addition);
529 public static int getBotCount() {
533 public static int getStaffCount() {
536 for (
Player player : getPlayers()) {
544 public static int getWildernessCount() {
547 for (
Player player : getPlayers()) {
548 if (player !=
null && !player.isBot && Area.inWilderness(player))
557 List<Player> staff =
new ArrayList<>();
559 for (
Player player : getPlayers()) {
567 public static World get() {
571 public static void cancelTask(Object attachment) {
572 cancelTask(attachment,
false);
575 public static void cancelTask(Object attachment,
boolean logout) {
576 get().taskManager.
cancel(attachment, logout);
579 public static MobList<Player> getPlayers() {
580 return get().players;
583 public static MobList<Npc> getNpcs() {
587 public static RegionManager getRegions() {
588 return get().regionManager;
591 public TaskManager getTaskManager() {
595 public Queue<Player> getLogins() {
599 public Queue<Player> getLogouts() {
603 public static DataBus getDataBus() {