mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2026-08-27 21:35:13 -06:00
Fixed an issue in npc return-to-spawn behavior that would cause infinite movement recalculations while the region is unloaded
This commit is contained in:
parent
105f7d5b86
commit
61f3dd1ffc
2 changed files with 40 additions and 0 deletions
|
|
@ -528,6 +528,10 @@ public class NPC extends Entity {
|
|||
getWalkingQueue().reset();
|
||||
getPulseManager().clear();
|
||||
getUpdateMasks().reset();
|
||||
if (getAttribute("return-to-spawn", false)) {
|
||||
this.location = getProperties().getSpawnLocation();
|
||||
removeAttribute("return-to-spawn");
|
||||
}
|
||||
Repository.removeRenderableNPC(this);
|
||||
if (getViewport().getRegion() instanceof DynamicRegion) {
|
||||
clear();
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ import core.game.node.entity.impl.PulseType
|
|||
import core.game.node.entity.npc.NPC
|
||||
import core.game.node.entity.player.Player
|
||||
import core.game.world.GameWorld
|
||||
import core.game.world.map.Region
|
||||
import core.net.packet.PacketProcessor
|
||||
import core.plugin.ClassScanner
|
||||
import core.plugin.Plugin
|
||||
|
|
@ -221,4 +222,39 @@ class PathfinderTests {
|
|||
Assertions.assertEquals(1.0, p.location.getDistance(npc.location))
|
||||
}
|
||||
}
|
||||
|
||||
@Test fun npcShouldReliablyReturnToSpawnLocationIfTooFar() {
|
||||
//spawn a player into the area just to make sure it ticks...
|
||||
TestUtils.getMockPlayer("areatest").use { p ->
|
||||
val npc = NPC(1, Location.create(3240, 3226, 0))
|
||||
npc.isWalks = true
|
||||
npc.isNeverWalks = false
|
||||
npc.walkRadius = 5
|
||||
npc.init()
|
||||
npc.properties.spawnLocation = ServerConstants.HOME_LOCATION
|
||||
TestUtils.advanceTicks(5, false)
|
||||
Assertions.assertEquals(true, npc.getAttribute("return-to-spawn", false))
|
||||
TestUtils.advanceTicks(50, false)
|
||||
Assertions.assertEquals(true, npc.location.getDistance(ServerConstants.HOME_LOCATION) <= 9)
|
||||
}
|
||||
}
|
||||
|
||||
@Test fun npcShouldReliablyReturnToSpawnEvenIfRegionUnloaded() {
|
||||
//spawn a player into the area just to make sure it ticks...
|
||||
TestUtils.getMockPlayer("areatest").use { p ->
|
||||
val npc = NPC(1, Location.create(3240, 3226, 0))
|
||||
npc.isWalks = true
|
||||
npc.isNeverWalks = false
|
||||
npc.walkRadius = 5
|
||||
npc.init()
|
||||
npc.properties.spawnLocation = ServerConstants.HOME_LOCATION
|
||||
TestUtils.advanceTicks(3, false)
|
||||
Assertions.assertEquals(true, npc.getAttribute("return-to-spawn", false))
|
||||
p.clear()
|
||||
RegionManager.forId(npc.location.regionId).flagInactive(true)
|
||||
TestUtils.advanceTicks(50, false)
|
||||
Assertions.assertEquals(false, npc.getAttribute("return-to-spawn", false))
|
||||
Assertions.assertEquals(true, npc.location.getDistance(ServerConstants.HOME_LOCATION) <= 5)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue