diff --git a/Server/src/main/core/game/node/entity/npc/NPC.java b/Server/src/main/core/game/node/entity/npc/NPC.java index b80bfd187..8d8ccf59b 100644 --- a/Server/src/main/core/game/node/entity/npc/NPC.java +++ b/Server/src/main/core/game/node/entity/npc/NPC.java @@ -462,7 +462,8 @@ public class NPC extends Entity { getLocks().lockMovement(100); getImpactHandler().setDisabledTicks(100); setAttribute("return-to-spawn", true); - GameWorld.getPulser().submit(new MovementPulse(this, getProperties().getSpawnLocation(), Pathfinder.SMART) { + + MovementPulse returnPulse = new MovementPulse(this, getProperties().getSpawnLocation(), Pathfinder.SMART) { @Override public boolean pulse() { getProperties().getCombatPulse().stop(); @@ -470,9 +471,13 @@ public class NPC extends Entity { fullRestore(); getImpactHandler().setDisabledTicks(0); removeAttribute("return-to-spawn"); + removeAttribute("return-to-spawn-pulse"); return true; } - }); + }; + + setAttribute("return-to-spawn-pulse", returnPulse); + GameWorld.getPulser().submit(returnPulse); return; } if (dialoguePlayer == null || !dialoguePlayer.isActive() || !dialoguePlayer.getInterfaceManager().hasChatbox()) { @@ -530,7 +535,11 @@ public class NPC extends Entity { getUpdateMasks().reset(); if (getAttribute("return-to-spawn", false)) { this.location = getProperties().getSpawnLocation(); - removeAttribute("return-to-spawn"); + MovementPulse returnPulse = getAttribute("return-to-spawn-pulse"); + if (returnPulse != null) { + returnPulse.pulse(); + returnPulse.stop(); + } } Repository.removeRenderableNPC(this); if (getViewport().getRegion() instanceof DynamicRegion) { diff --git a/Server/src/test/kotlin/core/PathfinderTests.kt b/Server/src/test/kotlin/core/PathfinderTests.kt index 993cb6ece..1b701d133 100644 --- a/Server/src/test/kotlin/core/PathfinderTests.kt +++ b/Server/src/test/kotlin/core/PathfinderTests.kt @@ -241,7 +241,7 @@ class PathfinderTests { @Test fun npcShouldReliablyReturnToSpawnEvenIfRegionUnloaded() { //spawn a player into the area just to make sure it ticks... - TestUtils.getMockPlayer("areatest").use { p -> + TestUtils.getMockPlayer("areaunloadtest").use { p -> val npc = NPC(1, Location.create(3240, 3226, 0)) npc.isWalks = true npc.isNeverWalks = false