From 33f84c5f9d4ab21bcfe07ec29da7705386e204df Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 14 Feb 2026 13:45:26 -0500 Subject: [PATCH 01/27] Void recovery added to ActivityPlugin. Hard coded POH to recovery. --- .../skill/construction/HouseManager.java | 1 + .../global/skill/construction/HouseZone.java | 5 ++- .../fishingtrawler/FishingTrawlerActivity.kt | 7 +++- .../fishingtrawler/FishingTrawlerSession.kt | 1 + .../PestControlActivityPlugin.java | 13 ++++++++ .../draynor/handlers/DBRCutscenePlugin.java | 3 +- .../quest/whatliesbelow/WLBelowCutscene.java | 2 +- .../region/wilderness/handlers/BorkNPC.java | 2 +- .../core/game/activity/ActivityManager.java | 33 ++++++++++++++++++- .../core/game/activity/ActivityPlugin.java | 19 +++++++++++ .../core/game/activity/CutscenePlugin.java | 1 + .../core/game/node/entity/player/Player.java | 2 ++ 12 files changed, 83 insertions(+), 6 deletions(-) diff --git a/Server/src/main/content/global/skill/construction/HouseManager.java b/Server/src/main/content/global/skill/construction/HouseManager.java index 4db8e8191..be150fb6e 100644 --- a/Server/src/main/content/global/skill/construction/HouseManager.java +++ b/Server/src/main/content/global/skill/construction/HouseManager.java @@ -215,6 +215,7 @@ public final class HouseManager { if (house.isInHouse(player)) { player.animate(Animation.RESET); player.getProperties().setTeleportLocation(house.location.getExitLocation()); + player.removeAttribute("lastActivity"); } } diff --git a/Server/src/main/content/global/skill/construction/HouseZone.java b/Server/src/main/content/global/skill/construction/HouseZone.java index 31a57f6f8..a67de9791 100644 --- a/Server/src/main/content/global/skill/construction/HouseZone.java +++ b/Server/src/main/content/global/skill/construction/HouseZone.java @@ -67,6 +67,7 @@ public final class HouseZone extends MapZone { public boolean enter(Entity e) { if (e instanceof Player) { Player pl = (Player) e; + pl.setAttribute("/save:lastActivity","POH-Activity"); if (house == pl.getHouseManager()) { previousRegion = house.getHouseRegion().getId(); if (house.getDungeonRegion() != null) @@ -74,6 +75,7 @@ public final class HouseZone extends MapZone { } registerLogoutListener(pl, "houselogout", (p) -> { p.setLocation(house.getLocation().getExitLocation()); + p.removeAttribute("lastActivity"); return kotlin.Unit.INSTANCE; }); } @@ -142,13 +144,14 @@ public final class HouseZone extends MapZone { clearLogoutListener(p, "houselogout"); if (!getAttribute(p, "kidnapped-by-random", false)) { removeAttribute(p, "/save:original-loc"); + removeAttribute(p,"lastActivity"); } return true; } return true; } - private void remove_items(Player p) { + public static void remove_items(Player p) { for (int item = Items.KETTLE_7688; item <= Items.CHEFS_DELIGHT_7755; item++) {//Removes all PoH versions of tea and beer barrel-related items removeAll(p, item, Container.INVENTORY); removeAll(p, item, Container.BoB); diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt index 1522316c6..92aef5977 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt @@ -1,6 +1,7 @@ package content.minigame.fishingtrawler import core.api.MapArea +import core.api.sendMessage import core.game.node.entity.player.Player import core.game.system.task.Pulse import core.game.world.GameWorld @@ -66,6 +67,7 @@ class FishingTrawlerActivity : ActivityPlugin("fishing trawler",false,false,true override fun start(player: Player?, login: Boolean, vararg args: Any?): Boolean { player ?: return false waitingPlayers.add(player) + super.start(player, login, *args) return true } @@ -74,11 +76,14 @@ class FishingTrawlerActivity : ActivityPlugin("fishing trawler",false,false,true nextStart = GameWorld.ticks + WAIT_TIME player.dialogueInterpreter.sendDialogue("Trawler will leave in 2 minutes.","If you have a team get them on board now!") } - waitingPlayers.add(player) + //waitingPlayers.add(player) + start(player,true) } + fun removePlayer(player: Player){ waitingPlayers.remove(player) + player.removeAttribute("lastActivity") } override fun newInstance(p: Player?): ActivityPlugin { diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt index 3cabb8d72..a66243842 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt @@ -158,6 +158,7 @@ class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : MapA player.removeAttribute("ft-session") player.setAttribute("/save:ft-rolls", rolls) clearLogoutListener(player, "ft-logout") + player.removeAttribute("lastActivity") } session.zone.unregister(getRegionBorders(session.region.id)) } diff --git a/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java b/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java index f1fb680a0..f372a6567 100644 --- a/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java +++ b/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java @@ -252,9 +252,22 @@ public final class PestControlActivityPlugin extends ActivityPlugin { } waitingPlayers.add(p); openLanderInterface(p); + super.start(p, login, args); return true; } + /** + * Recovers the player from void should they get left there. + * Is called during login. + * @param player The player. + */ + @Override + public void recover(Player player) { + player.setLocation(getLeaveLocation()); + //player.setLocation(getSpawnLocation()); + player.removeAttribute("lastActivity"); + } + /** * Updates the lander interface. * @param p The player. diff --git a/Server/src/main/content/region/misthalin/draynor/handlers/DBRCutscenePlugin.java b/Server/src/main/content/region/misthalin/draynor/handlers/DBRCutscenePlugin.java index 78c30fa3e..ddd7e2116 100644 --- a/Server/src/main/content/region/misthalin/draynor/handlers/DBRCutscenePlugin.java +++ b/Server/src/main/content/region/misthalin/draynor/handlers/DBRCutscenePlugin.java @@ -1,5 +1,6 @@ package content.region.misthalin.draynor.handlers; +import core.ServerConstants; import core.game.component.Component; import core.game.activity.ActivityPlugin; import core.game.activity.CutscenePlugin; @@ -233,7 +234,7 @@ public final class DBRCutscenePlugin extends CutscenePlugin { @Override public Location getSpawnLocation() { - return null; + return Location.create(3087, 3248, 0); } @Override diff --git a/Server/src/main/content/region/misthalin/varrock/quest/whatliesbelow/WLBelowCutscene.java b/Server/src/main/content/region/misthalin/varrock/quest/whatliesbelow/WLBelowCutscene.java index d1c154c5d..940eceedc 100644 --- a/Server/src/main/content/region/misthalin/varrock/quest/whatliesbelow/WLBelowCutscene.java +++ b/Server/src/main/content/region/misthalin/varrock/quest/whatliesbelow/WLBelowCutscene.java @@ -291,7 +291,7 @@ public class WLBelowCutscene extends CutscenePlugin { @Override public Location getSpawnLocation() { - return null; + return Location.create(3209, 3495, 0); } @Override diff --git a/Server/src/main/content/region/wilderness/handlers/BorkNPC.java b/Server/src/main/content/region/wilderness/handlers/BorkNPC.java index 53bd862e5..06fd507b3 100644 --- a/Server/src/main/content/region/wilderness/handlers/BorkNPC.java +++ b/Server/src/main/content/region/wilderness/handlers/BorkNPC.java @@ -525,7 +525,7 @@ public class BorkNPC extends AbstractNPC { @Override public Location getSpawnLocation() { - return null; + return Location.create(3143, 5545, 0); } @Override diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index 15ab8ff39..66858ea56 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -1,5 +1,7 @@ package core.game.activity; +import content.global.skill.construction.HouseZone; +import core.ServerConstants; import core.game.node.entity.player.Player; import core.tools.Log; import core.tools.SystemLogger; @@ -8,7 +10,7 @@ import core.game.world.GameWorld; import java.util.HashMap; import java.util.Map; -import static core.api.ContentAPIKt.log; +import static core.api.ContentAPIKt.*; /** * Manages the activities. @@ -79,4 +81,33 @@ public final class ActivityManager { public static ActivityPlugin getActivity(String name) { return ACTIVITIES.get(name); } + + public static void ActivityRecover(Player player) { + String activityName = player.getAttribute("lastActivity", null); + if (activityName == null) return; + //sendMessage(player,player.getUsername() + " recovering from " + activityName); + if (activityName.equals("POH-Activity")) { + HouseZone.remove_items(player); + player.setLocation(player.getHouseManager().getLocation().getExitLocation()); + player.removeAttribute("/save:original-loc"); + player.removeAttribute("lastActivity"); + return; + } + try { + ActivityPlugin plugin = ACTIVITIES.get(activityName); + if (plugin != null) { + if (plugin.isInstanced()) { + plugin = plugin.newInstance(player); + } + plugin.recover(player); + } else { + player.setLocation(ServerConstants.HOME_LOCATION); + } + } catch (Throwable t) { + t.printStackTrace(); + player.setLocation(ServerConstants.HOME_LOCATION); + } + + player.removeAttribute("lastActivity"); + } } \ No newline at end of file diff --git a/Server/src/main/core/game/activity/ActivityPlugin.java b/Server/src/main/core/game/activity/ActivityPlugin.java index 50ea847f5..17986e9b0 100644 --- a/Server/src/main/core/game/activity/ActivityPlugin.java +++ b/Server/src/main/core/game/activity/ActivityPlugin.java @@ -11,6 +11,10 @@ import core.game.world.map.zone.impl.MultiwayCombatZone; import core.plugin.Plugin; import core.plugin.PluginManifest; import core.plugin.PluginType; +import core.tools.Log; + +import static core.api.ContentAPIKt.log; +import static core.api.ContentAPIKt.sendMessage; /** * A plugin implementation used for activity plugins. @@ -130,6 +134,8 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { */ public boolean start(Player player, boolean login, Object... args) { this.player = player; + player.setAttribute("/save:lastActivity", this.getName()); + player.sendMessage(this.getName()); return true; } @@ -157,6 +163,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { e.getProperties().setSafeZone(false); e.getProperties().safeRespawn = ServerConstants.HOME_LOCATION; e.removeAttribute("activity"); + e.removeAttribute("lastActivity"); return super.leave(e, logout); } @@ -166,6 +173,18 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { public void register() { } + public void recover(Player player) { + Location spawn = getSpawnLocation(); + if (spawn == null) { + String lastActivity = player.getAttribute("lastActivity", null); + sendMessage(player, "You were safely removed from an invalid location."); + sendMessage(player, "Activity: " + lastActivity + ", please report this!"); + spawn = ServerConstants.HOME_LOCATION; + } + player.setLocation(spawn); + player.removeAttribute("lastActivity"); + } + @Override public Object fireEvent(String identifier, Object... args) { return null; diff --git a/Server/src/main/core/game/activity/CutscenePlugin.java b/Server/src/main/core/game/activity/CutscenePlugin.java index 043b7c179..49df8e2a3 100644 --- a/Server/src/main/core/game/activity/CutscenePlugin.java +++ b/Server/src/main/core/game/activity/CutscenePlugin.java @@ -142,6 +142,7 @@ public abstract class CutscenePlugin extends ActivityPlugin { player.getInterfaceManager().restoreTabs(); player.unlock();// incase he was locked. player.getWalkingQueue().reset(); + player.removeAttribute("lastActivity"); } /** diff --git a/Server/src/main/core/game/node/entity/player/Player.java b/Server/src/main/core/game/node/entity/player/Player.java index d21c591fc..8d399c864 100644 --- a/Server/src/main/core/game/node/entity/player/Player.java +++ b/Server/src/main/core/game/node/entity/player/Player.java @@ -7,6 +7,7 @@ import content.global.skill.construction.decoration.pohstorage.StorageState; import content.global.skill.runecrafting.PouchManager; import content.global.skill.slayer.SlayerEquipmentFlags; import core.api.ContentAPIKt; +import core.game.activity.ActivityManager; import core.game.component.Component; import core.game.container.Container; import core.game.container.impl.BankContainer; @@ -345,6 +346,7 @@ public class Player extends Entity { if (!artificial) { log(this.getClass(), Log.INFO, getUsername() + " initialising..."); getDetails().getSession().setObject(this); + ActivityManager.ActivityRecover(this); } super.init(); LoginConfiguration.configureLobby(this); From be0aa7a86893878b102ccb27c3b6770dd4d819fc Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 14 Feb 2026 15:19:27 -0500 Subject: [PATCH 02/27] Lumby Organ cutscene getSpawnLocation set to perfered location Draynor Telescope cutscene getSpawnLocation set to perfered location --- .../region/misthalin/draynor/handlers/DraynorNodePlugin.java | 2 +- .../region/misthalin/lumbridge/handlers/OrganCutScene.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java b/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java index 474822f01..19cc97f56 100644 --- a/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java +++ b/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java @@ -159,7 +159,7 @@ public final class DraynorNodePlugin extends OptionHandler { @Override public Location getSpawnLocation() { - return null; + return Location.create(3089, 3252, 1); } @Override diff --git a/Server/src/main/content/region/misthalin/lumbridge/handlers/OrganCutScene.java b/Server/src/main/content/region/misthalin/lumbridge/handlers/OrganCutScene.java index 26ab44f6b..f5e9d4f39 100644 --- a/Server/src/main/content/region/misthalin/lumbridge/handlers/OrganCutScene.java +++ b/Server/src/main/content/region/misthalin/lumbridge/handlers/OrganCutScene.java @@ -78,7 +78,7 @@ public final class OrganCutScene extends CutscenePlugin { @Override public Location getSpawnLocation() { - return null; + return Location.create(3242, 3214, 0); } @Override From 5274dd1888351f9049f839e394663138f85bc533 Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 14 Feb 2026 15:36:42 -0500 Subject: [PATCH 03/27] start() return to super.start() so we set lastactivity. --- .../region/karamja/tzhaar/handlers/TzhaarFightPitsPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/region/karamja/tzhaar/handlers/TzhaarFightPitsPlugin.java b/Server/src/main/content/region/karamja/tzhaar/handlers/TzhaarFightPitsPlugin.java index 5070b76ef..f32a18605 100644 --- a/Server/src/main/content/region/karamja/tzhaar/handlers/TzhaarFightPitsPlugin.java +++ b/Server/src/main/content/region/karamja/tzhaar/handlers/TzhaarFightPitsPlugin.java @@ -209,7 +209,7 @@ public final class TzhaarFightPitsPlugin extends ActivityPlugin { if (!login) { player.setAttribute("fight_pits", true); ForceMovement.run(player, Location.create(2399, 5177, 0), Location.create(2399, 5175, 0)); - return true; + return super.start(player, login, args); } if (WAR_ZONE.insideBorder(player.getLocation().getX(), player.getLocation().getY())) { player.getProperties().setTeleportLocation(Location.create(2399, 5177, 0)); From 0fe0da5f1c032379cdb152bac022f686db814e2b Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 14 Feb 2026 15:52:29 -0500 Subject: [PATCH 04/27] FishingContestCutscene void return location set --- .../kandarin/quest/fishingcontest/FishingContestCutscene.java | 2 +- Server/src/main/core/game/activity/ActivityPlugin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/main/content/region/kandarin/quest/fishingcontest/FishingContestCutscene.java b/Server/src/main/content/region/kandarin/quest/fishingcontest/FishingContestCutscene.java index b5ea21118..9a4dc98f2 100644 --- a/Server/src/main/content/region/kandarin/quest/fishingcontest/FishingContestCutscene.java +++ b/Server/src/main/content/region/kandarin/quest/fishingcontest/FishingContestCutscene.java @@ -178,7 +178,7 @@ public class FishingContestCutscene extends CutscenePlugin { @Override public Location getSpawnLocation() { - return null; + return Location.create(2639, 3437, 0); } @Override diff --git a/Server/src/main/core/game/activity/ActivityPlugin.java b/Server/src/main/core/game/activity/ActivityPlugin.java index 17986e9b0..7f38832aa 100644 --- a/Server/src/main/core/game/activity/ActivityPlugin.java +++ b/Server/src/main/core/game/activity/ActivityPlugin.java @@ -135,7 +135,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { public boolean start(Player player, boolean login, Object... args) { this.player = player; player.setAttribute("/save:lastActivity", this.getName()); - player.sendMessage(this.getName()); + //player.sendMessage(this.getName()); return true; } From 44d57f6a4b60faf1821320c8b0b71041326e4305 Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 14 Feb 2026 16:12:16 -0500 Subject: [PATCH 05/27] Activity trollheim-warning recover to no aciton. --- .../region/asgarnia/trollheim/handlers/TrollheimPlugin.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Server/src/main/content/region/asgarnia/trollheim/handlers/TrollheimPlugin.java b/Server/src/main/content/region/asgarnia/trollheim/handlers/TrollheimPlugin.java index d6a2c1fc6..3588ec798 100644 --- a/Server/src/main/content/region/asgarnia/trollheim/handlers/TrollheimPlugin.java +++ b/Server/src/main/content/region/asgarnia/trollheim/handlers/TrollheimPlugin.java @@ -578,7 +578,10 @@ public final class TrollheimPlugin extends OptionHandler { * Represents the troll location. */ private static final Location TROLL_LOCATION = new Location(2851, 3598, 0); - + @Override + public void recover(Player p){ + //no recovery action needed. + } /** * Constructs a new {@code WarningCutscene} {@code Object}. */ From 19d87ee5a2066489ba63705c852018a52069ccc9 Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 14 Feb 2026 16:22:06 -0500 Subject: [PATCH 06/27] GoblinDiplomacy Cutscene getSpawnLocation() set --- .../goblinvillage/quest/goblindiplomacy/GDiplomacyCutscene.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/region/asgarnia/goblinvillage/quest/goblindiplomacy/GDiplomacyCutscene.java b/Server/src/main/content/region/asgarnia/goblinvillage/quest/goblindiplomacy/GDiplomacyCutscene.java index 3743a5c2c..02a04d1ba 100644 --- a/Server/src/main/content/region/asgarnia/goblinvillage/quest/goblindiplomacy/GDiplomacyCutscene.java +++ b/Server/src/main/content/region/asgarnia/goblinvillage/quest/goblindiplomacy/GDiplomacyCutscene.java @@ -77,7 +77,7 @@ public final class GDiplomacyCutscene extends CutscenePlugin { @Override public Location getSpawnLocation() { - return null; + return Location.create(2958, 3513, 0); } @Override From 60b3720c81bff8671aabd1abeaa6736e4a78f7ad Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 14 Feb 2026 16:31:37 -0500 Subject: [PATCH 07/27] Fluffy Cutscene getSpawnLocation() set --- .../content/global/skill/summoning/SummoningTrainingRoom.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/summoning/SummoningTrainingRoom.java b/Server/src/main/content/global/skill/summoning/SummoningTrainingRoom.java index 6296daef4..e72f1da97 100644 --- a/Server/src/main/content/global/skill/summoning/SummoningTrainingRoom.java +++ b/Server/src/main/content/global/skill/summoning/SummoningTrainingRoom.java @@ -221,7 +221,7 @@ public final class SummoningTrainingRoom extends OptionHandler { @Override public Location getSpawnLocation() { - return null; + return Location.create(2924, 3442, 0); } @Override From c9fc2a26f0e045274c007b47898e25b9b9b5f6e9 Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 14 Feb 2026 16:48:16 -0500 Subject: [PATCH 08/27] Fight Caves recover to do notihng as we have wave save already. --- .../karamja/tzhaar/handlers/TzhaarFightCavesPlugin.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Server/src/main/content/region/karamja/tzhaar/handlers/TzhaarFightCavesPlugin.java b/Server/src/main/content/region/karamja/tzhaar/handlers/TzhaarFightCavesPlugin.java index 5a4cdfd11..63ad17f5e 100644 --- a/Server/src/main/content/region/karamja/tzhaar/handlers/TzhaarFightCavesPlugin.java +++ b/Server/src/main/content/region/karamja/tzhaar/handlers/TzhaarFightCavesPlugin.java @@ -72,6 +72,10 @@ public final class TzhaarFightCavesPlugin extends ActivityPlugin { e.printStackTrace(); } } + @Override + public void recover(Player player){ + //no recovery needed? + } @Override public boolean canLogout(Player p) { From 2a3fa3a7bdb6968d36bf9fdce831d5098e20443f Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 14 Feb 2026 16:53:16 -0500 Subject: [PATCH 09/27] SurokCutscene getSpawnLocation set to varrock libary. may not be right --- .../misthalin/varrock/dialogue/surok/SurokMagisDialogue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/region/misthalin/varrock/dialogue/surok/SurokMagisDialogue.java b/Server/src/main/content/region/misthalin/varrock/dialogue/surok/SurokMagisDialogue.java index 85b9fa6af..edaa61ec9 100644 --- a/Server/src/main/content/region/misthalin/varrock/dialogue/surok/SurokMagisDialogue.java +++ b/Server/src/main/content/region/misthalin/varrock/dialogue/surok/SurokMagisDialogue.java @@ -128,7 +128,7 @@ public class SurokMagisDialogue extends DialoguePlugin { @Override public Location getSpawnLocation() { - return null; + return Location.create(3209, 3495, 0); } @Override From 377922eb110f483b1da5c387072009be33bce4ae Mon Sep 17 00:00:00 2001 From: Tooze Date: Sun, 15 Feb 2026 01:58:38 -0500 Subject: [PATCH 10/27] GE cutscene recover overide to do nothing. --- .../region/misthalin/varrock/handlers/GECutscenePlugin.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/src/main/content/region/misthalin/varrock/handlers/GECutscenePlugin.java b/Server/src/main/content/region/misthalin/varrock/handlers/GECutscenePlugin.java index 4630d1f57..bae7c0089 100644 --- a/Server/src/main/content/region/misthalin/varrock/handlers/GECutscenePlugin.java +++ b/Server/src/main/content/region/misthalin/varrock/handlers/GECutscenePlugin.java @@ -87,6 +87,8 @@ public final class GECutscenePlugin extends CutscenePlugin { e.printStackTrace(); } } + @Override + public void recover(Player player) {} @Override public Location getSpawnLocation() { From 32995db64cbef2cb4a733e5dd9db5b7b74288a32 Mon Sep 17 00:00:00 2001 From: Tooze Date: Sun, 15 Feb 2026 01:59:13 -0500 Subject: [PATCH 11/27] DemonSlayerCutscene getSpawnLocation set --- .../varrock/quest/demonslayer/DemonSlayerCutscene.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/region/misthalin/varrock/quest/demonslayer/DemonSlayerCutscene.java b/Server/src/main/content/region/misthalin/varrock/quest/demonslayer/DemonSlayerCutscene.java index 7c46309f0..8e78929f6 100644 --- a/Server/src/main/content/region/misthalin/varrock/quest/demonslayer/DemonSlayerCutscene.java +++ b/Server/src/main/content/region/misthalin/varrock/quest/demonslayer/DemonSlayerCutscene.java @@ -167,7 +167,7 @@ public final class DemonSlayerCutscene extends CutscenePlugin { @Override public Location getSpawnLocation() { - return null; + return Location.create(3221, 3373, 0); } @Override From a47f77edf72b2c2cbcf3e56f687cac1e501633c7 Mon Sep 17 00:00:00 2001 From: Tooze Date: Sun, 15 Feb 2026 09:55:17 -0500 Subject: [PATCH 12/27] Fall back if in void for some unknown reason. credits to PlayerName --- Server/src/main/core/game/activity/ActivityManager.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index 66858ea56..76d626d60 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -2,6 +2,7 @@ package core.game.activity; import content.global.skill.construction.HouseZone; import core.ServerConstants; +import core.api.ContentAPIKt; import core.game.node.entity.player.Player; import core.tools.Log; import core.tools.SystemLogger; @@ -84,7 +85,13 @@ public final class ActivityManager { public static void ActivityRecover(Player player) { String activityName = player.getAttribute("lastActivity", null); - if (activityName == null) return; + if (activityName == null) { + if (player.getLocation().getY() < 2000) { //credits to PlayerName + sendMessage(player, "You were stuck inside an instance, which should never happen. Please file a bug report, and include the following information: $loc. To prevent your client from crashing, you have been teleported back home. We apologise for the inconvenience."); + player.setLocation(ServerConstants.HOME_LOCATION); + } + return; + } //sendMessage(player,player.getUsername() + " recovering from " + activityName); if (activityName.equals("POH-Activity")) { HouseZone.remove_items(player); From 48405c616acf3bb747be1d95b91b5caad14bf013 Mon Sep 17 00:00:00 2001 From: Tooze Date: Mon, 16 Feb 2026 16:39:56 -0500 Subject: [PATCH 13/27] concatenated the string --- Server/src/main/core/game/activity/ActivityManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index 76d626d60..b351a469a 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -4,6 +4,7 @@ import content.global.skill.construction.HouseZone; import core.ServerConstants; import core.api.ContentAPIKt; import core.game.node.entity.player.Player; +import core.game.world.map.Location; import core.tools.Log; import core.tools.SystemLogger; import core.game.world.GameWorld; @@ -86,8 +87,9 @@ public final class ActivityManager { public static void ActivityRecover(Player player) { String activityName = player.getAttribute("lastActivity", null); if (activityName == null) { - if (player.getLocation().getY() < 2000) { //credits to PlayerName - sendMessage(player, "You were stuck inside an instance, which should never happen. Please file a bug report, and include the following information: $loc. To prevent your client from crashing, you have been teleported back home. We apologise for the inconvenience."); + int yLoc = player.getLocation().getY(); + if (yLoc < 2000) { //credits to PlayerName + sendMessage(player, "You were stuck inside an instance, which should never happen. Please file a bug report, and include the following information: "+yLoc +". To prevent your client from crashing, you have been teleported back home. We apologise for the inconvenience."); player.setLocation(ServerConstants.HOME_LOCATION); } return; From d7796c230d5480d71759ae0a1aeb0023193db0a2 Mon Sep 17 00:00:00 2001 From: Tooze Date: Mon, 16 Feb 2026 17:29:01 -0500 Subject: [PATCH 14/27] Always give a message when things go unexpectedly wrong. --- Server/src/main/core/game/activity/ActivityManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index b351a469a..bf89c7c4d 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -110,13 +110,16 @@ public final class ActivityManager { } plugin.recover(player); } else { + sendMessage(player, "You were safely removed from an invalid location."); + sendMessage(player, "Activity: NULL, please report this!"); player.setLocation(ServerConstants.HOME_LOCATION); } } catch (Throwable t) { t.printStackTrace(); + sendMessage(player, "You were safely removed from an invalid location."); + sendMessage(player, "Activity: THROWABLE, please report this!"); player.setLocation(ServerConstants.HOME_LOCATION); } - player.removeAttribute("lastActivity"); } } \ No newline at end of file From 461cd79dfaa5f5a2d864d00a73d6fa4e6242bef9 Mon Sep 17 00:00:00 2001 From: Player Name Date: Tue, 11 Nov 2025 17:52:49 +0100 Subject: [PATCH 15/27] ryan fixes --- .../core/game/node/entity/player/Player.java | 3 ++ .../entity/player/info/login/LoginParser.kt | 45 +++++++++---------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/Server/src/main/core/game/node/entity/player/Player.java b/Server/src/main/core/game/node/entity/player/Player.java index 8d399c864..30a162c64 100644 --- a/Server/src/main/core/game/node/entity/player/Player.java +++ b/Server/src/main/core/game/node/entity/player/Player.java @@ -4,10 +4,13 @@ import content.global.handlers.item.equipment.BarrowsEquipment; import content.global.handlers.item.equipment.special.SalamanderSwingHandler; import content.global.skill.construction.decoration.pohstorage.POHStorageProxyContainer; import content.global.skill.construction.decoration.pohstorage.StorageState; +import content.global.skill.construction.decoration.pohstorage.StorageState; import content.global.skill.runecrafting.PouchManager; import content.global.skill.slayer.SlayerEquipmentFlags; +import content.global.skill.slayer.SlayerEquipmentFlags; import core.api.ContentAPIKt; import core.game.activity.ActivityManager; +import core.game.activity.ActivityManager; import core.game.component.Component; import core.game.container.Container; import core.game.container.impl.BankContainer; diff --git a/Server/src/main/core/game/node/entity/player/info/login/LoginParser.kt b/Server/src/main/core/game/node/entity/player/info/login/LoginParser.kt index 649db34a5..36de9bdba 100644 --- a/Server/src/main/core/game/node/entity/player/info/login/LoginParser.kt +++ b/Server/src/main/core/game/node/entity/player/info/login/LoginParser.kt @@ -33,33 +33,28 @@ class LoginParser(val details: PlayerDetails) { Repository.removePlayer(player) flag(AuthResponse.ErrorLoadingProfile) } - GameWorld.Pulser.submit(object : Pulse(1) { - override fun pulse(): Boolean { - try { - if (details.session.isActive) { - player.properties.spawnLocation = getAttribute(player, "/save:spawnLocation", ServerConstants.HOME_LOCATION) - loginListeners.forEach(Consumer { listener: LoginListener -> listener.login(player) }) //Run our login hooks - parser.runContentHooks() //Run our saved-content-parsing hooks - player.details.session.setObject(player) - player.getDetails().accountInfo.lastUsedIp = player.getDetails().getIpAddress() - if (reconnect) { - reconnect(player) - } else { - flag(AuthResponse.Success) - player.init() - reinitVarps(player) - } - } else { - Repository.removePlayer(player) - } - } catch (t: Throwable) { - t.printStackTrace() - Repository.removePlayer(player) - flag(AuthResponse.ErrorLoadingProfile) + try { + if (details.session.isActive) { + player.properties.spawnLocation = getAttribute(player, "/save:spawnLocation", ServerConstants.HOME_LOCATION) + loginListeners.forEach(Consumer { listener: LoginListener -> listener.login(player) }) //Run our login hooks + parser.runContentHooks() //Run our saved-content-parsing hooks + player.details.session.setObject(player) + player.details.accountInfo.lastUsedIp = player.details.ipAddress + if (reconnect) { + reconnect(player) + } else { + flag(AuthResponse.Success) + player.init() + reinitVarps(player) } - return true + } else { + Repository.removePlayer(player) } - }) + } catch (t: Throwable) { + t.printStackTrace() + Repository.removePlayer(player) + flag(AuthResponse.ErrorLoadingProfile) + } } /** From 8d9a4513ccac89fdf1c371d60b9658545d0e11c1 Mon Sep 17 00:00:00 2001 From: Tooze Date: Wed, 29 Apr 2026 20:17:13 -0400 Subject: [PATCH 16/27] removed Duplicate imports. --- Server/src/main/core/game/node/entity/player/Player.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/Server/src/main/core/game/node/entity/player/Player.java b/Server/src/main/core/game/node/entity/player/Player.java index 30a162c64..8d399c864 100644 --- a/Server/src/main/core/game/node/entity/player/Player.java +++ b/Server/src/main/core/game/node/entity/player/Player.java @@ -4,13 +4,10 @@ import content.global.handlers.item.equipment.BarrowsEquipment; import content.global.handlers.item.equipment.special.SalamanderSwingHandler; import content.global.skill.construction.decoration.pohstorage.POHStorageProxyContainer; import content.global.skill.construction.decoration.pohstorage.StorageState; -import content.global.skill.construction.decoration.pohstorage.StorageState; import content.global.skill.runecrafting.PouchManager; import content.global.skill.slayer.SlayerEquipmentFlags; -import content.global.skill.slayer.SlayerEquipmentFlags; import core.api.ContentAPIKt; import core.game.activity.ActivityManager; -import core.game.activity.ActivityManager; import core.game.component.Component; import core.game.container.Container; import core.game.container.impl.BankContainer; From 9cd38d6ef1cc1289c43edb9a501db5b84013a048 Mon Sep 17 00:00:00 2001 From: Tooze Date: Wed, 27 May 2026 16:54:58 -0400 Subject: [PATCH 17/27] revert DraynorNodePlugin.java make sure to set ``override fun getSpawnLocation() = Location.create(3089, 3252, 1) //telescope return location`` --- .../region/misthalin/draynor/handlers/DraynorNodePlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java b/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java index 19cc97f56..474822f01 100644 --- a/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java +++ b/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java @@ -159,7 +159,7 @@ public final class DraynorNodePlugin extends OptionHandler { @Override public Location getSpawnLocation() { - return Location.create(3089, 3252, 1); + return null; } @Override From 0d0582e9cf30d9d08e6b4de454ffc3d0d8145872 Mon Sep 17 00:00:00 2001 From: Tooze Date: Thu, 28 May 2026 09:31:55 -0400 Subject: [PATCH 18/27] Revert "revert DraynorNodePlugin.java" This reverts commit f05e612d7e10355dfb687285caa7289dd47ae75a. --- .../region/misthalin/draynor/handlers/DraynorNodePlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java b/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java index 474822f01..19cc97f56 100644 --- a/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java +++ b/Server/src/main/content/region/misthalin/draynor/handlers/DraynorNodePlugin.java @@ -159,7 +159,7 @@ public final class DraynorNodePlugin extends OptionHandler { @Override public Location getSpawnLocation() { - return null; + return Location.create(3089, 3252, 1); } @Override From e9f39b5217654e3a20a47f37aa71424a68f1e40f Mon Sep 17 00:00:00 2001 From: Tooze Date: Thu, 28 May 2026 09:33:56 -0400 Subject: [PATCH 19/27] revert DBR --- .../region/misthalin/draynor/handlers/DBRCutscenePlugin.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Server/src/main/content/region/misthalin/draynor/handlers/DBRCutscenePlugin.java b/Server/src/main/content/region/misthalin/draynor/handlers/DBRCutscenePlugin.java index ddd7e2116..78c30fa3e 100644 --- a/Server/src/main/content/region/misthalin/draynor/handlers/DBRCutscenePlugin.java +++ b/Server/src/main/content/region/misthalin/draynor/handlers/DBRCutscenePlugin.java @@ -1,6 +1,5 @@ package content.region.misthalin.draynor.handlers; -import core.ServerConstants; import core.game.component.Component; import core.game.activity.ActivityPlugin; import core.game.activity.CutscenePlugin; @@ -234,7 +233,7 @@ public final class DBRCutscenePlugin extends CutscenePlugin { @Override public Location getSpawnLocation() { - return Location.create(3087, 3248, 0); + return null; } @Override From e100cfc276e0073e97f3f611995a7d71282cae8f Mon Sep 17 00:00:00 2001 From: Tooze Date: Fri, 19 Jun 2026 19:41:32 -0400 Subject: [PATCH 20/27] "lastActivity" to static String "POH_Activity" to static String added Debug message when Recovery happens. --- .../global/skill/construction/HouseManager.java | 4 +++- .../global/skill/construction/HouseZone.java | 8 +++++--- .../fishingtrawler/FishingTrawlerActivity.kt | 3 ++- .../fishingtrawler/FishingTrawlerSession.kt | 3 ++- .../pestcontrol/PestControlActivityPlugin.java | 4 ++-- .../core/game/activity/ActivityManager.java | 17 ++++++++++------- .../main/core/game/activity/ActivityPlugin.java | 9 +++++---- .../main/core/game/activity/CutscenePlugin.java | 4 +++- 8 files changed, 32 insertions(+), 20 deletions(-) diff --git a/Server/src/main/content/global/skill/construction/HouseManager.java b/Server/src/main/content/global/skill/construction/HouseManager.java index be150fb6e..e4bbace52 100644 --- a/Server/src/main/content/global/skill/construction/HouseManager.java +++ b/Server/src/main/content/global/skill/construction/HouseManager.java @@ -24,6 +24,7 @@ import java.awt.*; import static core.api.ContentAPIKt.*; import static core.api.regionspec.RegionSpecificationKt.fillWith; import static core.api.regionspec.RegionSpecificationKt.using; +import static core.game.activity.ActivityManager.lastActivity; /** @@ -33,6 +34,7 @@ import static core.api.regionspec.RegionSpecificationKt.using; */ public final class HouseManager { + public static String POH_Activity = "POH-Activity"; /** * The current region. */ @@ -215,7 +217,7 @@ public final class HouseManager { if (house.isInHouse(player)) { player.animate(Animation.RESET); player.getProperties().setTeleportLocation(house.location.getExitLocation()); - player.removeAttribute("lastActivity"); + player.removeAttribute(lastActivity); } } diff --git a/Server/src/main/content/global/skill/construction/HouseZone.java b/Server/src/main/content/global/skill/construction/HouseZone.java index a67de9791..0e448898b 100644 --- a/Server/src/main/content/global/skill/construction/HouseZone.java +++ b/Server/src/main/content/global/skill/construction/HouseZone.java @@ -12,7 +12,9 @@ import core.game.world.map.Region; import core.game.system.task.Pulse; import core.game.world.map.zone.ZoneType; +import static content.global.skill.construction.HouseManager.POH_Activity; import static core.api.ContentAPIKt.*; +import static core.game.activity.ActivityManager.lastActivity; /** * Handles the player owned house zone. @@ -67,7 +69,7 @@ public final class HouseZone extends MapZone { public boolean enter(Entity e) { if (e instanceof Player) { Player pl = (Player) e; - pl.setAttribute("/save:lastActivity","POH-Activity"); + pl.setAttribute("/save:"+lastActivity,POH_Activity); if (house == pl.getHouseManager()) { previousRegion = house.getHouseRegion().getId(); if (house.getDungeonRegion() != null) @@ -75,7 +77,7 @@ public final class HouseZone extends MapZone { } registerLogoutListener(pl, "houselogout", (p) -> { p.setLocation(house.getLocation().getExitLocation()); - p.removeAttribute("lastActivity"); + p.removeAttribute(lastActivity); return kotlin.Unit.INSTANCE; }); } @@ -144,7 +146,7 @@ public final class HouseZone extends MapZone { clearLogoutListener(p, "houselogout"); if (!getAttribute(p, "kidnapped-by-random", false)) { removeAttribute(p, "/save:original-loc"); - removeAttribute(p,"lastActivity"); + removeAttribute(p,lastActivity); } return true; } diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt index 92aef5977..47f8d1af7 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt @@ -11,6 +11,7 @@ import core.game.world.map.zone.ZoneRestriction import core.plugin.Initializable import core.tools.ticksToSeconds import core.game.activity.ActivityManager +import core.game.activity.ActivityManager.lastActivity import core.game.activity.ActivityPlugin import core.game.world.map.zone.ZoneBorders import core.tools.colorize @@ -83,7 +84,7 @@ class FishingTrawlerActivity : ActivityPlugin("fishing trawler",false,false,true fun removePlayer(player: Player){ waitingPlayers.remove(player) - player.removeAttribute("lastActivity") + player.removeAttribute(lastActivity) } override fun newInstance(p: Player?): ActivityPlugin { diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt index a66243842..224fb924e 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt @@ -3,6 +3,7 @@ package content.minigame.fishingtrawler import core.api.MapArea import core.api.getRegionBorders import core.api.* +import core.game.activity.ActivityManager.lastActivity import core.game.component.Component import core.game.node.entity.Entity import core.game.node.scenery.Scenery @@ -158,7 +159,7 @@ class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : MapA player.removeAttribute("ft-session") player.setAttribute("/save:ft-rolls", rolls) clearLogoutListener(player, "ft-logout") - player.removeAttribute("lastActivity") + player.removeAttribute(lastActivity) } session.zone.unregister(getRegionBorders(session.region.id)) } diff --git a/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java b/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java index f372a6567..556ff17ca 100644 --- a/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java +++ b/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java @@ -30,6 +30,7 @@ import core.tools.RandomFunction; import core.tools.StringUtils; import static core.api.ContentAPIKt.*; +import static core.game.activity.ActivityManager.lastActivity; /** @@ -264,8 +265,7 @@ public final class PestControlActivityPlugin extends ActivityPlugin { @Override public void recover(Player player) { player.setLocation(getLeaveLocation()); - //player.setLocation(getSpawnLocation()); - player.removeAttribute("lastActivity"); + player.removeAttribute(lastActivity); } /** diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index bf89c7c4d..1121fb25a 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -12,6 +12,7 @@ import core.game.world.GameWorld; import java.util.HashMap; import java.util.Map; +import static content.global.skill.construction.HouseManager.POH_Activity; import static core.api.ContentAPIKt.*; /** @@ -25,6 +26,8 @@ public final class ActivityManager { */ private static final Map ACTIVITIES = new HashMap<>(); + public static String lastActivity = "lastActivity"; + /** * Constructs a new {@code ActivityManager} {@code Object}. */ @@ -85,7 +88,7 @@ public final class ActivityManager { } public static void ActivityRecover(Player player) { - String activityName = player.getAttribute("lastActivity", null); + String activityName = player.getAttribute(lastActivity, null); if (activityName == null) { int yLoc = player.getLocation().getY(); if (yLoc < 2000) { //credits to PlayerName @@ -94,12 +97,12 @@ public final class ActivityManager { } return; } - //sendMessage(player,player.getUsername() + " recovering from " + activityName); - if (activityName.equals("POH-Activity")) { + player.debug("[ActivityManager] Recovering from " + activityName); + if (activityName.equals(POH_Activity)) { HouseZone.remove_items(player); player.setLocation(player.getHouseManager().getLocation().getExitLocation()); - player.removeAttribute("/save:original-loc"); - player.removeAttribute("lastActivity"); + player.removeAttribute("original-loc"); + player.removeAttribute(lastActivity); return; } try { @@ -120,6 +123,6 @@ public final class ActivityManager { sendMessage(player, "Activity: THROWABLE, please report this!"); player.setLocation(ServerConstants.HOME_LOCATION); } - player.removeAttribute("lastActivity"); + player.removeAttribute(lastActivity); } -} \ No newline at end of file +} diff --git a/Server/src/main/core/game/activity/ActivityPlugin.java b/Server/src/main/core/game/activity/ActivityPlugin.java index 7f38832aa..951ba13d4 100644 --- a/Server/src/main/core/game/activity/ActivityPlugin.java +++ b/Server/src/main/core/game/activity/ActivityPlugin.java @@ -15,6 +15,7 @@ import core.tools.Log; import static core.api.ContentAPIKt.log; import static core.api.ContentAPIKt.sendMessage; +import static core.game.activity.ActivityManager.lastActivity; /** * A plugin implementation used for activity plugins. @@ -134,7 +135,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { */ public boolean start(Player player, boolean login, Object... args) { this.player = player; - player.setAttribute("/save:lastActivity", this.getName()); + player.setAttribute("/save:"+lastActivity, this.getName()); //player.sendMessage(this.getName()); return true; } @@ -163,7 +164,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { e.getProperties().setSafeZone(false); e.getProperties().safeRespawn = ServerConstants.HOME_LOCATION; e.removeAttribute("activity"); - e.removeAttribute("lastActivity"); + e.removeAttribute(lastActivity); return super.leave(e, logout); } @@ -176,13 +177,13 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { public void recover(Player player) { Location spawn = getSpawnLocation(); if (spawn == null) { - String lastActivity = player.getAttribute("lastActivity", null); + String lastActivity = player.getAttribute(core.game.activity.ActivityManager.lastActivity, null); sendMessage(player, "You were safely removed from an invalid location."); sendMessage(player, "Activity: " + lastActivity + ", please report this!"); spawn = ServerConstants.HOME_LOCATION; } player.setLocation(spawn); - player.removeAttribute("lastActivity"); + player.removeAttribute(lastActivity); } @Override diff --git a/Server/src/main/core/game/activity/CutscenePlugin.java b/Server/src/main/core/game/activity/CutscenePlugin.java index 49df8e2a3..aea3a72b2 100644 --- a/Server/src/main/core/game/activity/CutscenePlugin.java +++ b/Server/src/main/core/game/activity/CutscenePlugin.java @@ -17,6 +17,8 @@ import core.plugin.PluginType; import java.util.ArrayList; import java.util.List; +import static core.game.activity.ActivityManager.lastActivity; + /** * Represents the plugin used to handle a cutscene. * @author Vexia @@ -142,7 +144,7 @@ public abstract class CutscenePlugin extends ActivityPlugin { player.getInterfaceManager().restoreTabs(); player.unlock();// incase he was locked. player.getWalkingQueue().reset(); - player.removeAttribute("lastActivity"); + player.removeAttribute(lastActivity); } /** From 002b2541b2dca8655948c6655b9187f89201c7c1 Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 27 Jun 2026 02:16:59 +0000 Subject: [PATCH 21/27] static String saveLastActivity --- Server/src/main/core/game/activity/ActivityManager.java | 1 + Server/src/main/core/game/activity/ActivityPlugin.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index 1121fb25a..e6999db41 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -27,6 +27,7 @@ public final class ActivityManager { private static final Map ACTIVITIES = new HashMap<>(); public static String lastActivity = "lastActivity"; + public static String saveLastActivity = "/save:"+lastActivity; /** * Constructs a new {@code ActivityManager} {@code Object}. diff --git a/Server/src/main/core/game/activity/ActivityPlugin.java b/Server/src/main/core/game/activity/ActivityPlugin.java index 951ba13d4..502ed6409 100644 --- a/Server/src/main/core/game/activity/ActivityPlugin.java +++ b/Server/src/main/core/game/activity/ActivityPlugin.java @@ -16,6 +16,7 @@ import core.tools.Log; import static core.api.ContentAPIKt.log; import static core.api.ContentAPIKt.sendMessage; import static core.game.activity.ActivityManager.lastActivity; +import static core.game.activity.ActivityManager.saveLastActivity; /** * A plugin implementation used for activity plugins. @@ -135,7 +136,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { */ public boolean start(Player player, boolean login, Object... args) { this.player = player; - player.setAttribute("/save:"+lastActivity, this.getName()); + player.setAttribute(saveLastActivity, this.getName()); //player.sendMessage(this.getName()); return true; } From 4c031132bb585b1ac7a39a8eec9fdede5bdad7bc Mon Sep 17 00:00:00 2001 From: Tooze Date: Wed, 22 Jul 2026 23:53:22 -0400 Subject: [PATCH 22/27] applying changes --- .../global/skill/construction/HouseManager.java | 2 +- .../global/skill/construction/HouseZone.java | 2 +- .../fishingtrawler/FishingTrawlerActivity.kt | 1 - .../fishingtrawler/FishingTrawlerSession.kt | 4 ++-- .../main/core/game/activity/ActivityManager.java | 5 ++--- .../main/core/game/activity/ActivityPlugin.java | 16 +++++++--------- .../main/core/game/activity/CutscenePlugin.java | 10 ++++++---- 7 files changed, 19 insertions(+), 21 deletions(-) diff --git a/Server/src/main/content/global/skill/construction/HouseManager.java b/Server/src/main/content/global/skill/construction/HouseManager.java index e4bbace52..7aec4afe1 100644 --- a/Server/src/main/content/global/skill/construction/HouseManager.java +++ b/Server/src/main/content/global/skill/construction/HouseManager.java @@ -217,7 +217,7 @@ public final class HouseManager { if (house.isInHouse(player)) { player.animate(Animation.RESET); player.getProperties().setTeleportLocation(house.location.getExitLocation()); - player.removeAttribute(lastActivity); + removeAttribute(player,lastActivity); } } diff --git a/Server/src/main/content/global/skill/construction/HouseZone.java b/Server/src/main/content/global/skill/construction/HouseZone.java index 0e448898b..ca979521d 100644 --- a/Server/src/main/content/global/skill/construction/HouseZone.java +++ b/Server/src/main/content/global/skill/construction/HouseZone.java @@ -77,7 +77,7 @@ public final class HouseZone extends MapZone { } registerLogoutListener(pl, "houselogout", (p) -> { p.setLocation(house.getLocation().getExitLocation()); - p.removeAttribute(lastActivity); + removeAttribute(p,lastActivity); return kotlin.Unit.INSTANCE; }); } diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt index 47f8d1af7..ea4d7fa79 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt @@ -77,7 +77,6 @@ class FishingTrawlerActivity : ActivityPlugin("fishing trawler",false,false,true nextStart = GameWorld.ticks + WAIT_TIME player.dialogueInterpreter.sendDialogue("Trawler will leave in 2 minutes.","If you have a team get them on board now!") } - //waitingPlayers.add(player) start(player,true) } diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt index 224fb924e..089a3ea1a 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt @@ -156,8 +156,8 @@ class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : MapA player.properties.teleportLocation = Location.create(2666, 3162, 0) player.incrementAttribute("/save:$STATS_BASE:$FISHING_TRAWLER_GAMES_WON") val rolls = ceil(session.fishAmount / session.players.size.toDouble()).toInt() - player.removeAttribute("ft-session") - player.setAttribute("/save:ft-rolls", rolls) + removeAttribute(player,"ft-session") + setAttribute(player, "/save:ft-rolls", rolls) clearLogoutListener(player, "ft-logout") player.removeAttribute(lastActivity) } diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index e6999db41..cdad04ecb 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -98,12 +98,11 @@ public final class ActivityManager { } return; } - player.debug("[ActivityManager] Recovering from " + activityName); if (activityName.equals(POH_Activity)) { HouseZone.remove_items(player); player.setLocation(player.getHouseManager().getLocation().getExitLocation()); - player.removeAttribute("original-loc"); - player.removeAttribute(lastActivity); + removeAttribute(player,"original-loc"); + removeAttribute(player,lastActivity); return; } try { diff --git a/Server/src/main/core/game/activity/ActivityPlugin.java b/Server/src/main/core/game/activity/ActivityPlugin.java index 502ed6409..6410e29c8 100644 --- a/Server/src/main/core/game/activity/ActivityPlugin.java +++ b/Server/src/main/core/game/activity/ActivityPlugin.java @@ -13,8 +13,7 @@ import core.plugin.PluginManifest; import core.plugin.PluginType; import core.tools.Log; -import static core.api.ContentAPIKt.log; -import static core.api.ContentAPIKt.sendMessage; +import static core.api.ContentAPIKt.*; import static core.game.activity.ActivityManager.lastActivity; import static core.game.activity.ActivityManager.saveLastActivity; @@ -136,8 +135,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { */ public boolean start(Player player, boolean login, Object... args) { this.player = player; - player.setAttribute(saveLastActivity, this.getName()); - //player.sendMessage(this.getName()); + setAttribute(player,saveLastActivity, this.getName()); return true; } @@ -149,7 +147,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { } e.getProperties().setSafeZone(safe); e.getProperties().safeRespawn = this.safeRespawn; - e.setAttribute("activity", this); + setAttribute(e,"activity", this); return super.enter(e); } @@ -164,8 +162,8 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { } e.getProperties().setSafeZone(false); e.getProperties().safeRespawn = ServerConstants.HOME_LOCATION; - e.removeAttribute("activity"); - e.removeAttribute(lastActivity); + removeAttribute(e,"activity"); + removeAttribute(e,lastActivity); return super.leave(e, logout); } @@ -178,13 +176,13 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { public void recover(Player player) { Location spawn = getSpawnLocation(); if (spawn == null) { - String lastActivity = player.getAttribute(core.game.activity.ActivityManager.lastActivity, null); + String lastActivity = getAttribute(player,core.game.activity.ActivityManager.lastActivity, null); sendMessage(player, "You were safely removed from an invalid location."); sendMessage(player, "Activity: " + lastActivity + ", please report this!"); spawn = ServerConstants.HOME_LOCATION; } player.setLocation(spawn); - player.removeAttribute(lastActivity); + removeAttribute(player,lastActivity); } @Override diff --git a/Server/src/main/core/game/activity/CutscenePlugin.java b/Server/src/main/core/game/activity/CutscenePlugin.java index aea3a72b2..78eb0946d 100644 --- a/Server/src/main/core/game/activity/CutscenePlugin.java +++ b/Server/src/main/core/game/activity/CutscenePlugin.java @@ -17,6 +17,8 @@ import core.plugin.PluginType; import java.util.ArrayList; import java.util.List; +import static core.api.ContentAPIKt.removeAttribute; +import static core.api.ContentAPIKt.setAttribute; import static core.game.activity.ActivityManager.lastActivity; /** @@ -72,9 +74,9 @@ public abstract class CutscenePlugin extends ActivityPlugin { @Override public boolean start(final Player player, boolean login, Object... args) { - player.setAttribute("cutscene:original-loc", player.getLocation()); - player.removeAttribute("real-end"); - player.setAttribute("real-end", player.getLocation()); + setAttribute(player,"cutscene:original-loc", player.getLocation()); + removeAttribute(player,"real-end"); + setAttribute(player,"real-end", player.getLocation()); if (isFade()) { GameWorld.getPulser().submit(getStartPulse()); } else { @@ -144,7 +146,7 @@ public abstract class CutscenePlugin extends ActivityPlugin { player.getInterfaceManager().restoreTabs(); player.unlock();// incase he was locked. player.getWalkingQueue().reset(); - player.removeAttribute(lastActivity); + removeAttribute(player,lastActivity); } /** From e6eda4db9d3b0178a95214b4f1b359f8090e2f9e Mon Sep 17 00:00:00 2001 From: Tooze Date: Wed, 22 Jul 2026 23:59:49 -0400 Subject: [PATCH 23/27] applying more changes --- .../content/minigame/fishingtrawler/FishingTrawlerActivity.kt | 1 - Server/src/main/core/game/activity/ActivityManager.java | 4 +--- Server/src/main/core/game/activity/ActivityPlugin.java | 4 +--- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt index ea4d7fa79..4b04ed009 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt @@ -1,7 +1,6 @@ package content.minigame.fishingtrawler import core.api.MapArea -import core.api.sendMessage import core.game.node.entity.player.Player import core.game.system.task.Pulse import core.game.world.GameWorld diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index cdad04ecb..6540390f8 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -2,11 +2,8 @@ package core.game.activity; import content.global.skill.construction.HouseZone; import core.ServerConstants; -import core.api.ContentAPIKt; import core.game.node.entity.player.Player; -import core.game.world.map.Location; import core.tools.Log; -import core.tools.SystemLogger; import core.game.world.GameWorld; import java.util.HashMap; @@ -88,6 +85,7 @@ public final class ActivityManager { return ACTIVITIES.get(name); } + @SuppressWarnings("deprecation") public static void ActivityRecover(Player player) { String activityName = player.getAttribute(lastActivity, null); if (activityName == null) { diff --git a/Server/src/main/core/game/activity/ActivityPlugin.java b/Server/src/main/core/game/activity/ActivityPlugin.java index 6410e29c8..e1a3d7401 100644 --- a/Server/src/main/core/game/activity/ActivityPlugin.java +++ b/Server/src/main/core/game/activity/ActivityPlugin.java @@ -11,8 +11,6 @@ import core.game.world.map.zone.impl.MultiwayCombatZone; import core.plugin.Plugin; import core.plugin.PluginManifest; import core.plugin.PluginType; -import core.tools.Log; - import static core.api.ContentAPIKt.*; import static core.game.activity.ActivityManager.lastActivity; import static core.game.activity.ActivityManager.saveLastActivity; @@ -172,7 +170,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { */ public void register() { } - + @SuppressWarnings("deprecation") public void recover(Player player) { Location spawn = getSpawnLocation(); if (spawn == null) { From d567b6102461f125b21b4676388320bbdddded71 Mon Sep 17 00:00:00 2001 From: Tooze Date: Thu, 23 Jul 2026 03:12:17 +0000 Subject: [PATCH 24/27] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: GregF --- .../core/game/activity/ActivityPlugin.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Server/src/main/core/game/activity/ActivityPlugin.java b/Server/src/main/core/game/activity/ActivityPlugin.java index e1a3d7401..69498dfc8 100644 --- a/Server/src/main/core/game/activity/ActivityPlugin.java +++ b/Server/src/main/core/game/activity/ActivityPlugin.java @@ -11,7 +11,10 @@ import core.game.world.map.zone.impl.MultiwayCombatZone; import core.plugin.Plugin; import core.plugin.PluginManifest; import core.plugin.PluginType; -import static core.api.ContentAPIKt.*; +import core.tools.Log; + +import static core.api.ContentAPIKt.log; +import static core.api.ContentAPIKt.sendMessage; import static core.game.activity.ActivityManager.lastActivity; import static core.game.activity.ActivityManager.saveLastActivity; @@ -133,7 +136,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { */ public boolean start(Player player, boolean login, Object... args) { this.player = player; - setAttribute(player,saveLastActivity, this.getName()); + player.setAttribute(saveLastActivity, this.getName()); return true; } @@ -145,7 +148,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { } e.getProperties().setSafeZone(safe); e.getProperties().safeRespawn = this.safeRespawn; - setAttribute(e,"activity", this); + e.setAttribute("activity", this); return super.enter(e); } @@ -160,8 +163,8 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { } e.getProperties().setSafeZone(false); e.getProperties().safeRespawn = ServerConstants.HOME_LOCATION; - removeAttribute(e,"activity"); - removeAttribute(e,lastActivity); + e.removeAttribute("activity"); + e.removeAttribute(lastActivity); return super.leave(e, logout); } @@ -170,17 +173,17 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { */ public void register() { } - @SuppressWarnings("deprecation") + public void recover(Player player) { Location spawn = getSpawnLocation(); if (spawn == null) { - String lastActivity = getAttribute(player,core.game.activity.ActivityManager.lastActivity, null); + String lastActivity = player.getAttribute(core.game.activity.ActivityManager.lastActivity, null); sendMessage(player, "You were safely removed from an invalid location."); sendMessage(player, "Activity: " + lastActivity + ", please report this!"); spawn = ServerConstants.HOME_LOCATION; } player.setLocation(spawn); - removeAttribute(player,lastActivity); + player.removeAttribute(lastActivity); } @Override From e41e107c74c57ba6acc17cf7ca0c1ef6164922da Mon Sep 17 00:00:00 2001 From: Tooze Date: Fri, 24 Jul 2026 20:43:52 +0000 Subject: [PATCH 25/27] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Player Name --- Server/src/main/core/game/activity/ActivityManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index 6540390f8..671249706 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -91,7 +91,7 @@ public final class ActivityManager { if (activityName == null) { int yLoc = player.getLocation().getY(); if (yLoc < 2000) { //credits to PlayerName - sendMessage(player, "You were stuck inside an instance, which should never happen. Please file a bug report, and include the following information: "+yLoc +". To prevent your client from crashing, you have been teleported back home. We apologise for the inconvenience."); + sendMessage(player, "You were stuck inside an instance, which should never happen. Please file a bug report, and include the following information: " + player.getLocation() + ". To prevent your client from crashing, you have been teleported back home. We apologise for the inconvenience."); player.setLocation(ServerConstants.HOME_LOCATION); } return; From c66a9f77fa35ff21cdc1753e98f171aa93fa0d0a Mon Sep 17 00:00:00 2001 From: Tooze Date: Sat, 25 Jul 2026 00:04:39 -0400 Subject: [PATCH 26/27] setAttribute(pl,saveLastActivity,POH_Activity); --- .../src/main/content/global/skill/construction/HouseZone.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Server/src/main/content/global/skill/construction/HouseZone.java b/Server/src/main/content/global/skill/construction/HouseZone.java index ca979521d..fd4539a40 100644 --- a/Server/src/main/content/global/skill/construction/HouseZone.java +++ b/Server/src/main/content/global/skill/construction/HouseZone.java @@ -15,6 +15,7 @@ import core.game.world.map.zone.ZoneType; import static content.global.skill.construction.HouseManager.POH_Activity; import static core.api.ContentAPIKt.*; import static core.game.activity.ActivityManager.lastActivity; +import static core.game.activity.ActivityManager.saveLastActivity; /** * Handles the player owned house zone. @@ -69,7 +70,7 @@ public final class HouseZone extends MapZone { public boolean enter(Entity e) { if (e instanceof Player) { Player pl = (Player) e; - pl.setAttribute("/save:"+lastActivity,POH_Activity); + setAttribute(pl,saveLastActivity,POH_Activity); if (house == pl.getHouseManager()) { previousRegion = house.getHouseRegion().getId(); if (house.getDungeonRegion() != null) From b829ebbea13e00111eb1af9f747e48470fccb9ac Mon Sep 17 00:00:00 2001 From: Tooze Date: Wed, 29 Jul 2026 03:50:26 -0400 Subject: [PATCH 27/27] CointentAPI ~ @SuppressWarnings("deprecation") //Description --- .../fishingtrawler/FishingTrawlerActivity.kt | 3 +- .../fishingtrawler/FishingTrawlerSession.kt | 2 +- .../PestControlActivityPlugin.java | 2 +- Server/src/main/core/api/ContentAPI.kt | 35 +++++++++++++++++++ .../core/game/activity/ActivityManager.java | 13 ++++--- .../core/game/activity/ActivityPlugin.java | 18 +++++----- 6 files changed, 56 insertions(+), 17 deletions(-) diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt index 4b04ed009..b290c5b59 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerActivity.kt @@ -1,6 +1,7 @@ package content.minigame.fishingtrawler import core.api.MapArea +import core.api.removeAttribute import core.game.node.entity.player.Player import core.game.system.task.Pulse import core.game.world.GameWorld @@ -82,7 +83,7 @@ class FishingTrawlerActivity : ActivityPlugin("fishing trawler",false,false,true fun removePlayer(player: Player){ waitingPlayers.remove(player) - player.removeAttribute(lastActivity) + removeAttribute(player,lastActivity) } override fun newInstance(p: Player?): ActivityPlugin { diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt index 089a3ea1a..75868b1b5 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerSession.kt @@ -159,7 +159,7 @@ class FishingTrawlerSession(val activity: FishingTrawlerActivity? = null) : MapA removeAttribute(player,"ft-session") setAttribute(player, "/save:ft-rolls", rolls) clearLogoutListener(player, "ft-logout") - player.removeAttribute(lastActivity) + removeAttribute(player,lastActivity) } session.zone.unregister(getRegionBorders(session.region.id)) } diff --git a/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java b/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java index 556ff17ca..8f4b3fcfa 100644 --- a/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java +++ b/Server/src/main/content/minigame/pestcontrol/PestControlActivityPlugin.java @@ -265,7 +265,7 @@ public final class PestControlActivityPlugin extends ActivityPlugin { @Override public void recover(Player player) { player.setLocation(getLeaveLocation()); - player.removeAttribute(lastActivity); + removeAttribute(player,lastActivity); } /** diff --git a/Server/src/main/core/api/ContentAPI.kt b/Server/src/main/core/api/ContentAPI.kt index 7423518a7..0c4fb1cef 100644 --- a/Server/src/main/core/api/ContentAPI.kt +++ b/Server/src/main/core/api/ContentAPI.kt @@ -1660,6 +1660,41 @@ fun runWorldTask(task: () -> Unit): Pulse { return pulse } +/** + * Attribute key containing the player's location before entering an instanced activity. + */ +const val ORIGINAL_LOC = "original-loc" + +/** + * Persistent save key for the player's original location. + */ +const val SAVE_ORIGINAL_LOC = "/save:$ORIGINAL_LOC" + +/** + * Gets the player's original location before they entered an instanced activity / cutscene / AME + * + * @param player The player. + * @return The stored location, or {@code null} if none exists. + */ +fun getOriginalLocation(player: Player): Location? = getAttribute(player, ORIGINAL_LOC, null) + +/** + * Sets player's original location before entering an instanced activity / cutscene / AME + * + * @param player The player. + * @param location The location to store. + */ +fun setOriginalLocation(player: Player, location: Location) = setAttribute(player, SAVE_ORIGINAL_LOC, location) + +/** + * Removes the player's stored original location. + * + * This should be called once the player has safely left the activity / cutscene / AME + * + * @param player The player. + */ +fun removeOriginalLocation(player: Player) = removeAttribute(player, ORIGINAL_LOC) + /** * Teleports or "instantly moves" an entity to a given Location object. * @param entity the entity to move diff --git a/Server/src/main/core/game/activity/ActivityManager.java b/Server/src/main/core/game/activity/ActivityManager.java index 671249706..6b540ed5f 100644 --- a/Server/src/main/core/game/activity/ActivityManager.java +++ b/Server/src/main/core/game/activity/ActivityManager.java @@ -86,8 +86,9 @@ public final class ActivityManager { } @SuppressWarnings("deprecation") + // Intentionally uses the deprecated setLocation: the player must be moved before rendering to prevent client crashes public static void ActivityRecover(Player player) { - String activityName = player.getAttribute(lastActivity, null); + String activityName = getAttribute(player,lastActivity, null); if (activityName == null) { int yLoc = player.getLocation().getY(); if (yLoc < 2000) { //credits to PlayerName @@ -99,10 +100,11 @@ public final class ActivityManager { if (activityName.equals(POH_Activity)) { HouseZone.remove_items(player); player.setLocation(player.getHouseManager().getLocation().getExitLocation()); - removeAttribute(player,"original-loc"); + removeOriginalLocation(player); removeAttribute(player,lastActivity); return; } + // Fail-safe: don't let a broken activity trap the player. try { ActivityPlugin plugin = ACTIVITIES.get(activityName); if (plugin != null) { @@ -112,15 +114,16 @@ public final class ActivityManager { plugin.recover(player); } else { sendMessage(player, "You were safely removed from an invalid location."); - sendMessage(player, "Activity: NULL, please report this!"); + sendMessage(player, "Activity: " +activityName+ ", please report this!"); player.setLocation(ServerConstants.HOME_LOCATION); } } catch (Throwable t) { t.printStackTrace(); sendMessage(player, "You were safely removed from an invalid location."); - sendMessage(player, "Activity: THROWABLE, please report this!"); + sendMessage(player, "This activity has something bad or broken!!"); + sendMessage(player, "Activity: " +activityName+ ", please report this!"); player.setLocation(ServerConstants.HOME_LOCATION); } - player.removeAttribute(lastActivity); + removeAttribute(player,lastActivity); } } diff --git a/Server/src/main/core/game/activity/ActivityPlugin.java b/Server/src/main/core/game/activity/ActivityPlugin.java index 69498dfc8..8969701bc 100644 --- a/Server/src/main/core/game/activity/ActivityPlugin.java +++ b/Server/src/main/core/game/activity/ActivityPlugin.java @@ -13,8 +13,7 @@ import core.plugin.PluginManifest; import core.plugin.PluginType; import core.tools.Log; -import static core.api.ContentAPIKt.log; -import static core.api.ContentAPIKt.sendMessage; +import static core.api.ContentAPIKt.*; import static core.game.activity.ActivityManager.lastActivity; import static core.game.activity.ActivityManager.saveLastActivity; @@ -136,7 +135,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { */ public boolean start(Player player, boolean login, Object... args) { this.player = player; - player.setAttribute(saveLastActivity, this.getName()); + setAttribute(player,saveLastActivity, this.getName()); return true; } @@ -148,7 +147,7 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { } e.getProperties().setSafeZone(safe); e.getProperties().safeRespawn = this.safeRespawn; - e.setAttribute("activity", this); + setAttribute(e,"activity", this); return super.enter(e); } @@ -163,8 +162,8 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { } e.getProperties().setSafeZone(false); e.getProperties().safeRespawn = ServerConstants.HOME_LOCATION; - e.removeAttribute("activity"); - e.removeAttribute(lastActivity); + removeAttribute(e,"activity"); + removeAttribute(e,lastActivity); return super.leave(e, logout); } @@ -173,17 +172,18 @@ public abstract class ActivityPlugin extends MapZone implements Plugin { */ public void register() { } - + // Intentionally uses the deprecated setLocation: the player must be moved before rendering to prevent client crashes + @SuppressWarnings("deprecation") public void recover(Player player) { Location spawn = getSpawnLocation(); if (spawn == null) { - String lastActivity = player.getAttribute(core.game.activity.ActivityManager.lastActivity, null); + String lastActivity = getAttribute(player,core.game.activity.ActivityManager.lastActivity, null); sendMessage(player, "You were safely removed from an invalid location."); sendMessage(player, "Activity: " + lastActivity + ", please report this!"); spawn = ServerConstants.HOME_LOCATION; } player.setLocation(spawn); - player.removeAttribute(lastActivity); + removeAttribute(player,lastActivity); } @Override