This happens after server has been on awhile:
Code:
java.lang.NullPointerException
at game.npc.NPCHandler.getCloseRandomPlayer(NPCHandler.java:2107)
at game.npc.NPCHandler.process(NPCHandler.java:3650)
at game.Server$2.execute(Server.java:165)
at engine.event.Task.tick(Task.java:103)
at engine.event.TaskScheduler.run(TaskScheduler.java:98)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(Unknown Source)
at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.
access$301(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.
run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Line that messes up
Code:
if (p.heightLevel == NPCHandler.npcs[i].heightLevel) {
the method:
Code:
public int getCloseRandomPlayer(final int i) {
final ArrayList < Integer > players = new ArrayList < Integer > ();
for (int j = 0; j < PlayerHandler.players.length; j++) {
if (PlayerHandler.players[j] != null) {
if (goodDistance(PlayerHandler.players[j].absX, PlayerHandler.players[j].absY, NPCHandler.npcs[i].absX, NPCHandler.npcs[i].absY, 2 + distanceRequired(i) + followDistance(i)) || isFightCaveNpc(i)) {
if (PlayerHandler.players[j].underAttackBy <= 0 && PlayerHandler.players[j].underAttackBy2 <= 0 || PlayerHandler.players[j].inMulti()) {
for (final Player p : PlayerHandler.players){
if (p.heightLevel == NPCHandler.npcs[i].heightLevel) {
players.add(j);
}
}
}
}
}
}
if (players.size() > 0) {
return players.get(Misc.random(players.size() - 1));
} else {
return 0;
}
}
and the npchandler line 3650:
Code:
if (isAggressive(i) && !npcs[i].underAttack && !npcs[i].isDead && !switchesAttackers(i)) {
npcs[i].killerId = getCloseRandomPlayer(i);
} else if (isAggressive(i) && !npcs[i].underAttack && !npcs[i].isDead && switchesAttackers(i)) {
npcs[i].killerId = getCloseRandomPlayer(i);
}
This also happens with getClosePlayer