Skip to content

Commit 6d28850

Browse files
committed
stuck NPC debugging & fix overlooked NPE with badluckmitigation
1 parent 0edcdf6 commit 6d28850

3 files changed

Lines changed: 43 additions & 23 deletions

File tree

server/src/com/openrsc/server/Server.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.google.common.util.concurrent.ListeningExecutorService;
55
import com.google.common.util.concurrent.MoreExecutors;
66
import com.openrsc.server.constants.Constants;
7+
import com.openrsc.server.constants.Skill;
78
import com.openrsc.server.content.achievement.AchievementSystem;
89
import com.openrsc.server.database.GameDatabase;
910
import com.openrsc.server.database.JDBCDatabase;
@@ -681,6 +682,24 @@ public void run() {
681682

682683
incrementLastDoCleanupDuration(getGameUpdater().doCleanup());
683684
getGameEventHandler().cleanupEvents();
685+
686+
// TODO: remove this vacuum service. It is for debugging.
687+
for (final Npc npc : getWorld().getNpcs()) {
688+
if (npc.getCombatEvent() != null) {
689+
if (!npc.getCombatEvent().isRunning() && npc.getOpponent() != null) {
690+
if (config.WANT_DISCORD_GENERAL_LOGGING) {
691+
getDiscordService().playerLog((Player)npc.getOpponent(), "An NPC with ID " + npc.getID() + ":" + npc.getIndex() + " @ " + npc.getX() + "," + npc.getY() + " was stuck, and should be unstuck now. You have some debugging still to do.");
692+
}
693+
694+
if (npc.getSkills().getLevel(Skill.HITS.id()) <= 0) {
695+
npc.killedBy(npc.getOpponent()); // possibly not actually who killed them e.g. ranged/mage kill
696+
}
697+
npc.resetCombatEvent();
698+
}
699+
}
700+
}
701+
// TODO: end remove section
702+
684703
} catch (final Throwable t) {
685704
LOGGER.catching(t);
686705
}

server/src/com/openrsc/server/content/DropTable.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,10 @@ public ArrayList<Item> rollItem(boolean ringOfWealth, Player owner) {
144144
for (Drop drop : rollTable.drops) {
145145
sum += drop.weight;
146146
int threshold = sum;
147-
if (drop.type == dropType.ITEM && owner.getWorld().getNpcDrops().getBadLuckMitigation().shouldMitigateBadLuck(getDropTableId(), drop.id)) {
148-
threshold += owner.getWorld().getNpcDrops().getBadLuckMitigation().getRollModifier(owner, getDropTableId(), drop.id);
147+
if (owner.getConfig().WANT_CUSTOM_QUESTS) { // must check this or else BadLuckMitigation might not be initialized & cause NPE
148+
if (drop.type == dropType.ITEM && owner.getWorld().getNpcDrops().getBadLuckMitigation().shouldMitigateBadLuck(getDropTableId(), drop.id)) {
149+
threshold += owner.getWorld().getNpcDrops().getBadLuckMitigation().getRollModifier(owner, getDropTableId(), drop.id);
150+
}
149151
}
150152
if (threshold > hit) {
151153
// If it's not a reroll, and the user is wearing a ring of wealth,

server/src/com/openrsc/server/event/rsc/impl/combat/CombatEvent.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -323,17 +323,6 @@ public void resetCombat() {
323323
defenderMob.setSprite(4);
324324
defenderMob.setCombatTimer();
325325
defenderMob.face(defenderMob.getX(), defenderMob.getY() - 1);
326-
if(defenderMob.isPlayer()){
327-
Player p1;
328-
p1 = ((Player) defenderMob);
329-
if (p1.getParty() != null){
330-
for (Player player : getWorld().getPlayers()) {
331-
if(p1.getParty() == player.getParty()){
332-
//ActionSender.sendParty(p);
333-
}
334-
}
335-
}
336-
}
337326
}
338327
if (attackerMob != null) {
339328
if (attackerMob.isPlayer()) {
@@ -348,16 +337,26 @@ public void resetCombat() {
348337
attackerMob.setSprite(4);
349338
attackerMob.setCombatTimer();
350339
attackerMob.face(attackerMob.getX(), attackerMob.getY() - 1);
351-
if(attackerMob.isPlayer()){
352-
Player p2;
353-
p2 = ((Player) attackerMob);
354-
if (p2.getParty() != null){
355-
for (Player player : getWorld().getPlayers()) {
356-
if(p2.getParty() == player.getParty()){
357-
//ActionSender.sendParty(p);
358-
}
359-
}
360-
}
340+
}
341+
} else {
342+
// combat event was reset while combat event wasn't running.
343+
// possible race condition; we will want to clean most things up if this happens.
344+
if (defenderMob != null) {
345+
defenderMob.setOpponent(null);
346+
defenderMob.setCombatEvent(null);
347+
defenderMob.setHitsMade(0);
348+
if (defenderMob.getSprite() > 7) {
349+
defenderMob.setSprite(4);
350+
defenderMob.face(defenderMob.getX(), defenderMob.getY() - 1);
351+
}
352+
}
353+
if (attackerMob != null) {
354+
attackerMob.setOpponent(null);
355+
attackerMob.setCombatEvent(null);
356+
attackerMob.setHitsMade(0);
357+
if (attackerMob.getSprite() > 7) {
358+
attackerMob.setSprite(4);
359+
attackerMob.face(attackerMob.getX(), attackerMob.getY() - 1);
361360
}
362361
}
363362
}

0 commit comments

Comments
 (0)