From 7ac5b630a37155feaf56283548ca825159bf240d Mon Sep 17 00:00:00 2001 From: ceikry Date: Thu, 31 Mar 2022 09:22:48 -0500 Subject: [PATCH] Followup improvements to !500 --- .../tzhaar/TzhaarFightCavesPlugin.java | 6 +- .../core/game/content/consumable/Potion.java | 3 +- .../dialogue/ActivateEnchantedGem.java | 3 +- .../content/dialogue/GrandExchangeClerk.java | 5 +- .../miniquest/barcrawl/BarcrawlDialogue.java | 2 +- .../miniquest/barcrawl/BarcrawlManager.java | 42 +++- .../core/game/content/ttrail/ClueLevel.java | 10 +- .../game/content/ttrail/ClueScrollPlugin.java | 12 +- .../content/ttrail/TreasureTrailManager.java | 56 ++++- .../content/ttrail/TreasureTrailPlugin.java | 2 +- .../inter/GrandExchangeInterface.java | 3 +- .../interaction/inter/JewelleryInterface.java | 3 +- .../interaction/item/EnchantedGemPlugin.java | 3 +- .../interaction/item/KeldagrimVotingBond.java | 6 +- .../BrawlingGlovesManager.java | 57 ++++- .../interaction/object/BankingPlugin.java | 9 +- .../object/GrandExchangePlugin.java | 8 +- .../core/game/node/entity/player/Player.java | 97 +------- .../player/info/login/LoginConfiguration.java | 7 - .../player/info/login/PlayerParser.java | 19 +- .../player/info/portal/PlayerSQLManager.java | 3 +- .../entity/player/link/BankPinManager.java | 3 +- .../core/game/node/entity/skill/Skills.java | 8 +- .../fletching/items/arrow/ArrowHeadPulse.java | 3 +- .../fletching/items/bolts/BoltPulse.java | 3 +- .../entity/skill/hunter/DeadfallSetting.java | 2 +- .../entity/skill/hunter/HunterManager.java | 57 +++-- .../entity/skill/hunter/HunterPlugin.java | 4 +- .../entity/skill/hunter/TrapCreatePulse.java | 10 +- .../skill/hunter/TrapDismantlePulse.java | 7 +- .../node/entity/skill/hunter/TrapNode.java | 3 +- .../node/entity/skill/hunter/TrapSetting.java | 11 +- .../node/entity/skill/hunter/TrapWrapper.java | 10 +- .../game/node/entity/skill/hunter/Traps.java | 8 +- .../skill/slayer/EnchantedGemDialogue.java | 63 ++--- .../game/node/entity/skill/slayer/Master.java | 3 +- .../skill/slayer/SlayerMasterDialogue.java | 31 +-- .../skill/slayer/SlayerRewardPlugin.java | 57 ++--- .../slayer/dungeon/StrongholdSlayerCave.java | 8 +- Server/src/main/kotlin/Cutscene.kt | 5 +- Server/src/main/kotlin/api/events/Events.kt | 3 +- Server/src/main/kotlin/rs09/game/Event.kt | 17 +- .../game/content/ame/RandomEventManager.kt | 66 +++--- .../rs09/game/content/ame/RandomEventNPC.kt | 2 +- .../ame/events/MysteriousOldManDialogue.kt | 5 +- .../ame/events/certer/CerterDialogue.kt | 7 +- .../ame/events/certer/CerterEventInterface.kt | 3 +- .../drilldemon/SeargentDamienDialogue.kt | 9 +- .../content/ame/events/genie/GenieDialogue.kt | 3 +- .../sandwichlady/SandwichLadyDialogue.kt | 5 +- .../sandwichlady/SandwichLadyInterface.kt | 3 +- .../region/lunarisle/SirsalBankerDialogue.kt | 3 +- .../content/global/action/EquipHandler.kt | 3 +- .../content/tutorial/TutorialLoginCheck.kt | 2 +- .../main/kotlin/rs09/game/ge/GrandExchange.kt | 6 +- .../rs09/game/ge/GrandExchangeRecords.kt | 76 ++++-- .../rs09/game/interaction/QCRepository.kt | 5 +- .../game/interaction/inter/ge/StockMarket.kt | 18 +- .../game/interaction/npc/NPCTalkListener.kt | 10 +- .../combat/handlers/MeleeSwingHandler.kt | 5 +- .../entity/player/info/login/LoginParser.kt | 18 +- .../player/info/login/PlayerSaveParser.kt | 120 ++++------ .../entity/player/info/login/PlayerSaver.kt | 221 +++--------------- .../player/info/stats/StatsCommandSet.kt | 10 +- .../skill/agility/BarbarianOutpostCourse.kt | 20 +- .../skill/hunter/pitfall/HunterPitfall.kt | 5 +- .../skill/slayer/SlayerEquipmentFlags.kt | 18 +- .../node/entity/skill/slayer/SlayerFlags.kt | 3 +- .../entity/skill/slayer/SlayerKillHook.kt | 47 ---- .../node/entity/skill/slayer/SlayerManager.kt | 91 +++++++- .../node/entity/skill/slayer/SlayerUtils.kt | 10 +- .../system/command/oldsys/AIPCommandPlugin.kt | 7 +- .../system/command/sets/MiscCommandSet.kt | 7 +- .../system/command/sets/SlayerCommandSet.kt | 7 +- .../main/kotlin/rs09/plugin/ClassScanner.kt | 12 + 75 files changed, 746 insertions(+), 753 deletions(-) delete mode 100644 Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerKillHook.kt diff --git a/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java b/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java index 15ca50acd..7403e5f8f 100644 --- a/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java +++ b/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java @@ -19,6 +19,7 @@ import core.game.world.map.build.DynamicRegion; import core.game.world.map.zone.ZoneRestriction; import core.plugin.Initializable; import core.tools.RandomFunction; +import rs09.game.node.entity.skill.slayer.SlayerManager; import rs09.game.world.GameWorld; import rs09.game.world.repository.Repository; @@ -160,12 +161,11 @@ public final class TzhaarFightCavesPlugin extends ActivityPlugin { } } player.getPacketDispatch().sendMessage("You were victorious!"); - if (!practice) { BossKillCounter.addtoKillcount(player, 2745); - if (player.getSlayer().getTask() == Tasks.JAD) { + if (SlayerManager.getInstance(player).getTask() == Tasks.JAD) { player.getSkills().addExperience(Skills.SLAYER, 25000); - player.getSlayer().clear(); + SlayerManager.getInstance(player).clear(); player.sendMessage("You receive 25,000 slayer experience for defeating TzTok-Jad."); } player.getDialogueInterpreter().sendDialogues(2617, null, "You even defeated TzTok-Jad, I am most impressed!", "Please accept this gift as a reward."); diff --git a/Server/src/main/java/core/game/content/consumable/Potion.java b/Server/src/main/java/core/game/content/consumable/Potion.java index 48dc02c81..472d92555 100644 --- a/Server/src/main/java/core/game/content/consumable/Potion.java +++ b/Server/src/main/java/core/game/content/consumable/Potion.java @@ -1,5 +1,6 @@ package core.game.content.consumable; +import core.game.content.quest.miniquest.barcrawl.BarcrawlManager; import core.game.node.entity.player.Player; import core.game.node.entity.player.link.audio.Audio; import core.game.node.item.Item; @@ -21,7 +22,7 @@ public class Potion extends Drink { if (nextItemId != -1) { player.getInventory().replace(new Item(nextItemId), item.getSlot()); } else { - if (player.getBarcrawlManager().isFinished()) { + if (BarcrawlManager.getInstance(player).isFinished()) { player.getInventory().remove(item); } else { player.getInventory().replace(new Item(VIAL), item.getSlot()); diff --git a/Server/src/main/java/core/game/content/dialogue/ActivateEnchantedGem.java b/Server/src/main/java/core/game/content/dialogue/ActivateEnchantedGem.java index a3858653d..1b0e58c32 100644 --- a/Server/src/main/java/core/game/content/dialogue/ActivateEnchantedGem.java +++ b/Server/src/main/java/core/game/content/dialogue/ActivateEnchantedGem.java @@ -6,6 +6,7 @@ import core.game.node.Node; import core.game.node.entity.player.Player; import core.plugin.Initializable; import core.plugin.Plugin; +import rs09.game.node.entity.skill.slayer.SlayerManager; /** * Represents the plugin used to handle the enchanted gem related to slayer. @@ -26,7 +27,7 @@ public final class ActivateEnchantedGem extends OptionHandler { @Override public boolean handle(Player player, Node node, String option) { - if (!player.getSlayer().hasStarted()) { + if (!SlayerManager.getInstance(player).hasStarted()) { player.getPacketDispatch().sendMessage("You try to activate the gem..."); return true; } diff --git a/Server/src/main/java/core/game/content/dialogue/GrandExchangeClerk.java b/Server/src/main/java/core/game/content/dialogue/GrandExchangeClerk.java index b4ef68f31..e0e11028f 100644 --- a/Server/src/main/java/core/game/content/dialogue/GrandExchangeClerk.java +++ b/Server/src/main/java/core/game/content/dialogue/GrandExchangeClerk.java @@ -4,6 +4,7 @@ import core.game.ge.GrandExchangeDatabase; import core.game.node.entity.npc.NPC; import core.plugin.Initializable; import core.game.node.entity.player.Player; +import rs09.game.ge.GrandExchangeRecords; import rs09.game.interaction.inter.ge.ExchangeItemSets; import rs09.game.interaction.inter.ge.StockMarket; @@ -102,7 +103,7 @@ public final class GrandExchangeClerk extends DialoguePlugin { break; case 21: end(); - player.getExchangeRecords().openCollectionBox(); + GrandExchangeRecords.getInstance(player).openCollectionBox(); break; case 30: npc("If that is your wish."); @@ -110,7 +111,7 @@ public final class GrandExchangeClerk extends DialoguePlugin { break; case 31: end(); - player.getExchangeRecords().openHistoryLog(player); + GrandExchangeRecords.getInstance(player).openHistoryLog(player); break; case 40: npc("It would be my pleasure, sir."); diff --git a/Server/src/main/java/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.java b/Server/src/main/java/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.java index 891d7e2e8..be4045762 100644 --- a/Server/src/main/java/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.java +++ b/Server/src/main/java/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.java @@ -73,7 +73,7 @@ public final class BarcrawlDialogue extends DialoguePlugin { } type.message(player, true); player.getInventory().remove(type.getCoins()); - player.getBarcrawlManager().complete(type.ordinal()); + BarcrawlManager.getInstance(player).complete(type.ordinal()); player.lock(6); GameWorld.getPulser().submit(new Pulse(6, player) { @Override diff --git a/Server/src/main/java/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.java b/Server/src/main/java/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.java index c1948dff4..492388009 100644 --- a/Server/src/main/java/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.java +++ b/Server/src/main/java/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.java @@ -1,9 +1,12 @@ package core.game.content.quest.miniquest.barcrawl; +import api.LoginListener; +import api.PersistPlayer; import core.game.component.Component; import core.game.node.entity.player.Player; import core.game.node.item.Item; +import org.jetbrains.annotations.NotNull; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -13,7 +16,7 @@ import java.nio.ByteBuffer; * Manages the players barcrawl quest. * @author 'Vexia */ -public final class BarcrawlManager { +public final class BarcrawlManager implements LoginListener, PersistPlayer { /** * The barcrawl card. @@ -53,14 +56,38 @@ public final class BarcrawlManager { this.player = player; } - public void parse(JSONObject data){ - started = (boolean) data.get("started"); - JSONArray barsVisisted = (JSONArray) data.get("bars"); + public BarcrawlManager() {this.player = null;} + + @Override + public void login(@NotNull Player player) { + BarcrawlManager instance = new BarcrawlManager(player); + player.setAttribute("barcrawl-inst", instance); + } + + @Override + public void parsePlayer(@NotNull Player player, @NotNull JSONObject data) { + JSONObject bcData = (JSONObject) data.get("barCrawl"); + if(bcData == null) return; + JSONArray barsVisisted = (JSONArray) bcData.get("bars"); + BarcrawlManager instance = getInstance(player); + instance.started = (boolean) bcData.get("started"); for(int i = 0; i < barsVisisted.size(); i++){ - bars[i] = (boolean) barsVisisted.get(i); + instance.bars[i] = (boolean) barsVisisted.get(i); } } + @Override + public void savePlayer(@NotNull Player player, @NotNull JSONObject save) { + BarcrawlManager instance = getInstance(player); + JSONObject barCrawl = new JSONObject(); + barCrawl.put("started", instance.started); + JSONArray barsVisited = new JSONArray(); + for(boolean visited : instance.bars) + barsVisited.add(visited); + barCrawl.put("bars",barsVisited); + save.put("barCrawl",barCrawl); + } + /** * Method used to read the card. */ @@ -153,4 +180,9 @@ public final class BarcrawlManager { public boolean[] getBars() { return bars; } + + public static BarcrawlManager getInstance(Player player) + { + return player.getAttribute("barcrawl-inst", new BarcrawlManager()); + } } diff --git a/Server/src/main/java/core/game/content/ttrail/ClueLevel.java b/Server/src/main/java/core/game/content/ttrail/ClueLevel.java index 85a8a76b9..05d21c73b 100644 --- a/Server/src/main/java/core/game/content/ttrail/ClueLevel.java +++ b/Server/src/main/java/core/game/content/ttrail/ClueLevel.java @@ -496,7 +496,7 @@ public enum ClueLevel { return; } } - if (player.getTreasureTrailManager().isCompleted() || GameWorld.getSettings().isDevMode()) { + if (TreasureTrailManager.getInstance(player).isCompleted() || GameWorld.getSettings().isDevMode()) { final List rewards = getLoot(player); player.getInterfaceManager().open(new Component(364).setCloseEvent(new CloseEvent() { private boolean given; @@ -515,10 +515,10 @@ public enum ClueLevel { if (casket != null) { player.getInventory().remove(casket); } - player.getTreasureTrailManager().incrementClues(this); - player.getTreasureTrailManager().clearTrail(); + TreasureTrailManager.getInstance(player).incrementClues(this); + TreasureTrailManager.getInstance(player).clearTrail(); player.sendMessage("Well done, you've completed the Treasure Trail!"); - player.sendMessage(getChatColor(this) + "You have completed " + player.getTreasureTrailManager().getCompletedClues(this) + " " + this.getName().toLowerCase() + " Treasure Trails."); + player.sendMessage(getChatColor(this) + "You have completed " + TreasureTrailManager.getInstance(player).getCompletedClues(this) + " " + this.getName().toLowerCase() + " Treasure Trails."); long value = 0; for (Item item : rewards) { value += item.getValue(); @@ -538,7 +538,7 @@ public enum ClueLevel { } else { player.getInventory().add(clue); } - player.getTreasureTrailManager().setClueId(clue.getId()); + TreasureTrailManager.getInstance(player).setClueId(clue.getId()); player.getDialogueInterpreter().sendItemMessage(clue, "You've found another clue!"); } diff --git a/Server/src/main/java/core/game/content/ttrail/ClueScrollPlugin.java b/Server/src/main/java/core/game/content/ttrail/ClueScrollPlugin.java index 4fe1d3a11..b256be061 100644 --- a/Server/src/main/java/core/game/content/ttrail/ClueScrollPlugin.java +++ b/Server/src/main/java/core/game/content/ttrail/ClueScrollPlugin.java @@ -107,14 +107,14 @@ public abstract class ClueScrollPlugin extends MapZone implements Plugin * @param clue the clue. */ public void nextStage(Player player, Item clue) { - if (!player.getTreasureTrailManager().hasTrail() || player.getTreasureTrailManager().hasTrail() && clue.getId() != player.getTreasureTrailManager().getClueId()) { - player.getTreasureTrailManager().startTrail(this); + if (!TreasureTrailManager.getInstance(player).hasTrail() || TreasureTrailManager.getInstance(player).hasTrail() && clue.getId() != TreasureTrailManager.getInstance(player).getClueId()) { + TreasureTrailManager.getInstance(player).startTrail(this); } - int currentStage = player.getTreasureTrailManager().getTrailStage(); - if (currentStage >= player.getTreasureTrailManager().getTrailLength()) { - player.getTreasureTrailManager().clearTrail(); + int currentStage = TreasureTrailManager.getInstance(player).getTrailStage(); + if (currentStage >= TreasureTrailManager.getInstance(player).getTrailLength()) { + TreasureTrailManager.getInstance(player).clearTrail(); } else { - player.getTreasureTrailManager().incrementStage(); + TreasureTrailManager.getInstance(player).incrementStage(); } } diff --git a/Server/src/main/java/core/game/content/ttrail/TreasureTrailManager.java b/Server/src/main/java/core/game/content/ttrail/TreasureTrailManager.java index fb34cc829..4a7083b7a 100644 --- a/Server/src/main/java/core/game/content/ttrail/TreasureTrailManager.java +++ b/Server/src/main/java/core/game/content/ttrail/TreasureTrailManager.java @@ -1,8 +1,11 @@ package core.game.content.ttrail; +import api.LoginListener; +import api.PersistPlayer; import core.game.node.entity.player.Player; import core.tools.RandomFunction; +import org.jetbrains.annotations.NotNull; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -12,7 +15,7 @@ import java.nio.ByteBuffer; * Handles the treasure trail of a player. * @author Vexia */ -public final class TreasureTrailManager { +public final class TreasureTrailManager implements LoginListener, PersistPlayer { /** * The ids of the clues. @@ -58,6 +61,53 @@ public final class TreasureTrailManager { this.player = player; } + public TreasureTrailManager() {this.player = null;} + + @Override + public void login(@NotNull Player player) { + TreasureTrailManager instance = new TreasureTrailManager(player); + player.setAttribute("tt-manager", instance); + } + + @Override + public void parsePlayer(@NotNull Player player, @NotNull JSONObject data) { + TreasureTrailManager instance = getInstance(player); + JSONObject ttData = (JSONObject) data.get("treasureTrails"); + if(ttData == null) return; + JSONArray cc = (JSONArray) ttData.get("completedClues"); + for(int i = 0; i < cc.size(); i++) + { + instance.completedClues[i] = Integer.parseInt(cc.get(i).toString()); + } + if(ttData.containsKey("trail")) + { + JSONObject trail = (JSONObject) ttData.get("trail"); + instance.clueId = Integer.parseInt(trail.get("clueId").toString()); + instance.trailLength = Integer.parseInt(trail.get("length").toString()); + instance.trailStage = Integer.parseInt(trail.get("stage").toString()); + } + } + + @Override + public void savePlayer(@NotNull Player player, @NotNull JSONObject save) { + TreasureTrailManager instance = getInstance(player); + JSONObject treasureTrailManager = new JSONObject(); + if(instance.hasTrail()){ + JSONObject trail = new JSONObject(); + trail.put("clueId", Integer.toString(instance.clueId)); + trail.put("length", Integer.toString(instance.trailLength)); + trail.put("stage", Integer.toString(instance.trailStage)); + treasureTrailManager.put("trail",trail); + } + JSONArray completedClues = new JSONArray(); + for(int clue : instance.completedClues) + { + completedClues.add(Integer.toString(clue)); + } + treasureTrailManager.put("completedClues",completedClues); + save.put("treasureTrails",treasureTrailManager); + } + public void parse(JSONObject data){ JSONArray cc = (JSONArray) data.get("completedClues"); for(int i = 0; i < cc.size(); i++){ @@ -239,4 +289,8 @@ public final class TreasureTrailManager { this.trailStage = trailStage; } + public static TreasureTrailManager getInstance(Player player) + { + return player.getAttribute("tt-manager", new TreasureTrailManager()); + } } diff --git a/Server/src/main/java/core/game/content/ttrail/TreasureTrailPlugin.java b/Server/src/main/java/core/game/content/ttrail/TreasureTrailPlugin.java index 592eeb9c4..7ebe56b16 100644 --- a/Server/src/main/java/core/game/content/ttrail/TreasureTrailPlugin.java +++ b/Server/src/main/java/core/game/content/ttrail/TreasureTrailPlugin.java @@ -145,7 +145,7 @@ public final class TreasureTrailPlugin extends OptionHandler { * @return {@code True} if so. */ private boolean hasClue(Player player) { - return player.getTreasureTrailManager().hasClue(); + return TreasureTrailManager.getInstance(player).hasClue(); } } diff --git a/Server/src/main/java/core/game/interaction/inter/GrandExchangeInterface.java b/Server/src/main/java/core/game/interaction/inter/GrandExchangeInterface.java index 64260ca90..2c526e361 100644 --- a/Server/src/main/java/core/game/interaction/inter/GrandExchangeInterface.java +++ b/Server/src/main/java/core/game/interaction/inter/GrandExchangeInterface.java @@ -114,7 +114,8 @@ public class GrandExchangeInterface extends ComponentPlugin { break; } GrandExchangeOffer offer; - if (index > -1 && (offer = player.getExchangeRecords().getOffer(player.getExchangeRecords().getOfferRecords()[index])) != null) { + GrandExchangeRecords records = GrandExchangeRecords.getInstance(player); + if (index > -1 && (offer = records.getOffer(records.getOfferRecords()[index])) != null) { StockMarket.withdraw(player, offer, slot >> 1); } return true; diff --git a/Server/src/main/java/core/game/interaction/inter/JewelleryInterface.java b/Server/src/main/java/core/game/interaction/inter/JewelleryInterface.java index f5ed32ce1..1e65fb72f 100644 --- a/Server/src/main/java/core/game/interaction/inter/JewelleryInterface.java +++ b/Server/src/main/java/core/game/interaction/inter/JewelleryInterface.java @@ -15,6 +15,7 @@ import core.plugin.Plugin; import core.plugin.Initializable; import core.tools.StringUtils; import kotlin.Unit; +import rs09.game.node.entity.skill.slayer.SlayerManager; /** * Represents the interface plugin used for jewellery crafting. @@ -186,7 +187,7 @@ public final class JewelleryInterface extends ComponentPlugin { }); return true; } - if(!player.getSlayer().flags.isRingUnlocked() && data.equals(JewelleryItem.SLAYER_RING)){ + if(!SlayerManager.getInstance(player).flags.isRingUnlocked() && data.equals(JewelleryItem.SLAYER_RING)){ player.sendMessages("You don't know how to make this. Talk to any Slayer master in order to learn the", "ability that creates Slayer rings."); return true; } diff --git a/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java b/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java index 8f24cc0b5..d6dc2890e 100644 --- a/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java +++ b/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java @@ -10,6 +10,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Initializable; import core.plugin.Plugin; +import rs09.game.node.entity.skill.slayer.SlayerManager; /** * Represents the plugin used to handle enchanted jewellery transportation. @@ -27,7 +28,7 @@ public final class EnchantedGemPlugin extends OptionHandler { @Override public boolean handle(Player player, Node node, String option) { - player.sendMessage("You're assigned to kill " + NPCDefinition.forId((player.getSlayer().getTask().getNpcs()[0])).getName().toLowerCase() + "s; only " + player.getSlayer().getAmount() + " more to go."); + player.sendMessage("You're assigned to kill " + NPCDefinition.forId((SlayerManager.getInstance(player).getTask().getNpcs()[0])).getName().toLowerCase() + "s; only " + SlayerManager.getInstance(player).getAmount() + " more to go."); return true; } diff --git a/Server/src/main/java/core/game/interaction/item/KeldagrimVotingBond.java b/Server/src/main/java/core/game/interaction/item/KeldagrimVotingBond.java index cc36c8fa1..7771a5f7a 100644 --- a/Server/src/main/java/core/game/interaction/item/KeldagrimVotingBond.java +++ b/Server/src/main/java/core/game/interaction/item/KeldagrimVotingBond.java @@ -155,12 +155,12 @@ // interpreter.sendItemMessage(14807, "Sorry, you don't have enough inventory space."); // return true; // } -// if (player.getTreasureTrailManager().hasClue()) { +// if (TreasureTrailManager.getInstance(player).hasClue()) { // interpreter.sendItemMessage(14807, "Sorry, you already have a clue scroll."); // break; // } -// if (player.getTreasureTrailManager().hasTrail()) { -// player.getTreasureTrailManager().clearTrail(); +// if (TreasureTrailManager.getInstance(player).hasTrail()) { +// TreasureTrailManager.getInstance(player).clearTrail(); // } // Item clue = ClueScrollPlugin.getClue(RandomFunction.getRandomElement(ClueLevel.values())); // if (player.getInventory().remove(BOND)) { diff --git a/Server/src/main/java/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.java b/Server/src/main/java/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.java index 3e4c9ec0d..095e3c8f1 100644 --- a/Server/src/main/java/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.java +++ b/Server/src/main/java/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.java @@ -1,11 +1,15 @@ package core.game.interaction.item.brawling_gloves; +import api.LoginListener; +import api.PersistPlayer; import core.cache.def.impl.ItemDefinition; import core.game.node.entity.player.Player; import core.game.node.item.Item; +import org.jetbrains.annotations.NotNull; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; -import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Objects; @@ -13,10 +17,46 @@ import java.util.Objects; * Manages brawling gloves for a player * @author ceik */ -public class BrawlingGlovesManager { - +public class BrawlingGlovesManager implements LoginListener, PersistPlayer { final Player player; public HashMap GloveCharges = new HashMap(); + + public BrawlingGlovesManager(Player player){this.player = player;} + public BrawlingGlovesManager(){this.player = null;} + + @Override + public void login(@NotNull Player player) { + BrawlingGlovesManager instance = new BrawlingGlovesManager(player); + player.setAttribute("bg-manager", instance); + } + + @Override + public void parsePlayer(@NotNull Player player, @NotNull JSONObject data) { + BrawlingGlovesManager instance = getInstance(player); + if(data.containsKey("brawlingGloves")) + { + JSONArray bgData = (JSONArray) data.get("brawlingGloves"); + for (Object bg : bgData) { + JSONObject glove = (JSONObject) bg; + instance.registerGlove(BrawlingGloves.forIndicator(Integer.parseInt(glove.get("gloveId").toString())).getId(), Integer.parseInt(glove.get("charges").toString())); + } + } + } + + @Override + public void savePlayer(@NotNull Player player, @NotNull JSONObject save) { + if(getInstance(player).GloveCharges.size() > 0){ + JSONArray brawlingGloves = new JSONArray(); + getInstance(player).GloveCharges.entrySet().forEach(glove -> { + JSONObject bGlove = new JSONObject(); + bGlove.put("gloveId", Integer.toString(BrawlingGloves.forId(glove.getKey()).getIndicator())); + bGlove.put("charges", Integer.toString(glove.getValue())); + brawlingGloves.add(bGlove); + }); + save.put("brawlingGloves", brawlingGloves); + } + } + public void registerGlove(int id) { try { registerGlove(id, Objects.requireNonNull(BrawlingGloves.forId(id)).getCharges()); @@ -26,15 +66,14 @@ public class BrawlingGlovesManager { } public void registerGlove(int id, int charges) {GloveCharges.putIfAbsent(id,charges);} - public BrawlingGlovesManager(Player player){this.player = player;} - public boolean updateCharges(int glove, int charges){ + public void updateCharges(int glove, int charges){ if(GloveCharges.get(glove) != null){ if(GloveCharges.get(glove) - charges <= 0) { GloveCharges.remove(glove); player.getEquipment().remove(new Item(glove)); player.getPacketDispatch().sendMessage("You use the last charge of your " + ItemDefinition.forId(glove).getName() + " and they vanish."); - return false; + return; } int currentCharges = GloveCharges.get(glove); GloveCharges.replace(glove,currentCharges - charges); @@ -43,7 +82,6 @@ public class BrawlingGlovesManager { player.getPacketDispatch().sendMessage("Your " + ItemDefinition.forId(glove).getName() + " have " + GloveCharges.get(glove) + " charges left."); } } - return true; } public double getExperienceBonus(){ @@ -56,4 +94,9 @@ public class BrawlingGlovesManager { } return bonus; } + + public static BrawlingGlovesManager getInstance(Player player) + { + return player.getAttribute("bg-manager", new BrawlingGlovesManager()); + } } diff --git a/Server/src/main/java/core/game/interaction/object/BankingPlugin.java b/Server/src/main/java/core/game/interaction/object/BankingPlugin.java index 84f96ccfb..9cb77338a 100644 --- a/Server/src/main/java/core/game/interaction/object/BankingPlugin.java +++ b/Server/src/main/java/core/game/interaction/object/BankingPlugin.java @@ -92,7 +92,7 @@ public final class BankingPlugin extends OptionHandler { checkAchievements(player); return true; case "collect": - player.getExchangeRecords().openCollectionBox(); + GrandExchangeRecords.getInstance(player).openCollectionBox(); return true; case "deposit": openDepositBox(player); @@ -169,8 +169,9 @@ public final class BankingPlugin extends OptionHandler { setId((int) args[0]); } interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "Good day, How may I help you?"); - for (GrandExchangeRecords.OfferRecord r : player.getExchangeRecords().getOfferRecords()) { - GrandExchangeOffer o = player.getExchangeRecords().getOffer(r); + GrandExchangeRecords records = GrandExchangeRecords.getInstance(player); + for (GrandExchangeRecords.OfferRecord r : records.getOfferRecords()) { + GrandExchangeOffer o = records.getOffer(r); if (o != null && (o.getWithdraw()[0] != null || o.getWithdraw()[1] != null)) { stage = -1; break; @@ -663,7 +664,7 @@ public final class BankingPlugin extends OptionHandler { player.getBank().open(); checkAchievements(player); } else { - player.getExchangeRecords().openCollectionBox(); + GrandExchangeRecords.getInstance(player).openCollectionBox(); } return true; } diff --git a/Server/src/main/java/core/game/interaction/object/GrandExchangePlugin.java b/Server/src/main/java/core/game/interaction/object/GrandExchangePlugin.java index 5ac8f57de..930b964c4 100644 --- a/Server/src/main/java/core/game/interaction/object/GrandExchangePlugin.java +++ b/Server/src/main/java/core/game/interaction/object/GrandExchangePlugin.java @@ -12,6 +12,7 @@ import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; import core.game.world.map.Location; import core.plugin.Plugin; +import rs09.game.ge.GrandExchangeRecords; import rs09.game.interaction.inter.ge.ExchangeItemSets; import rs09.game.interaction.inter.ge.StockMarket; @@ -46,6 +47,7 @@ public final class GrandExchangePlugin extends OptionHandler { @Override public boolean handle(Player player, Node node, String option) { + GrandExchangeRecords records = GrandExchangeRecords.getInstance(player); if (player.getIronmanManager().checkRestriction() && !option.equals("sets")) { return true; } @@ -61,14 +63,14 @@ public final class GrandExchangePlugin extends OptionHandler { StockMarket.openFor(player); break; case "history": - player.getExchangeRecords().openHistoryLog(player); + records.openHistoryLog(player); break; case "collect": if (!GrandExchangeDatabase.hasInitialized()) { player.getDialogueInterpreter().sendDialogue("The Grand Exchange desk seems to be closed..."); break; } - player.getExchangeRecords().openCollectionBox(); + records.openCollectionBox(); break; case "info-logs": GEGuidePrice.open(player, GuideType.LOGS); @@ -139,7 +141,7 @@ public final class GrandExchangePlugin extends OptionHandler { player.getBank().open(); break; case "collect": - player.getExchangeRecords().openCollectionBox(); + GrandExchangeRecords.getInstance(player).openCollectionBox(); break; } return true; diff --git a/Server/src/main/java/core/game/node/entity/player/Player.java b/Server/src/main/java/core/game/node/entity/player/Player.java index 75dbf765b..12233149b 100644 --- a/Server/src/main/java/core/game/node/entity/player/Player.java +++ b/Server/src/main/java/core/game/node/entity/player/Player.java @@ -8,10 +8,8 @@ import core.game.container.impl.EquipmentContainer; import core.game.container.impl.InventoryListener; import core.game.content.activity.pyramidplunder.PlunderObjectManager; import core.game.content.dialogue.DialogueInterpreter; -import core.game.content.quest.miniquest.barcrawl.BarcrawlManager; import core.game.content.ttrail.TreasureTrailManager; import core.game.interaction.Interaction; -import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager; import core.game.node.entity.Entity; import core.game.node.entity.combat.BattleState; import core.game.node.entity.combat.CombatStyle; @@ -24,6 +22,7 @@ import core.game.node.entity.player.info.RenderInfo; import core.game.node.entity.player.info.Rights; import core.game.node.entity.player.info.UIDInfo; import core.game.node.entity.player.info.login.LoginConfiguration; +import core.game.node.entity.player.info.login.PlayerParser; import core.game.node.entity.player.link.*; import core.game.node.entity.player.link.appearance.Appearance; import core.game.node.entity.player.link.audio.AudioManager; @@ -38,8 +37,6 @@ import core.game.node.entity.player.link.request.RequestManager; import core.game.node.entity.player.link.skillertasks.SkillerTasks; import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.construction.HouseManager; -import core.game.node.entity.skill.hunter.HunterManager; -import rs09.game.node.entity.skill.slayer.SlayerManager; import core.game.node.entity.skill.summoning.familiar.FamiliarManager; import core.game.node.item.GroundItem; import core.game.node.item.GroundItemManager; @@ -69,14 +66,15 @@ import core.tools.RandomFunction; import core.tools.StringUtils; import kotlin.Unit; import kotlin.jvm.functions.Function1; +import org.json.simple.JSONObject; import org.rs09.consts.Items; import rs09.GlobalStats; import rs09.ServerConstants; import rs09.game.VarpManager; -import rs09.game.content.ame.RandomEventManager; import rs09.game.ge.GrandExchangeRecords; import rs09.game.node.entity.combat.CombatSwingHandler; import rs09.game.node.entity.combat.equipment.EquipmentDegrader; +import rs09.game.node.entity.player.info.login.PlayerSaveParser; import rs09.game.node.entity.player.info.login.PlayerSaver; import rs09.game.node.entity.skill.runecrafting.PouchManager; import rs09.game.node.entity.state.newsys.State; @@ -219,11 +217,6 @@ public class Player extends Entity { */ private final HintIconManager hintIconManager = new HintIconManager(); - /** - * The slayer manager. - */ - private final SlayerManager slayer = new SlayerManager(this); - /** * The quest repository. */ @@ -244,11 +237,6 @@ public class Player extends Entity { */ private final GraveManager graveManager = new GraveManager(this); - /** - * The new grand exchange interface manager. - */ - public final GrandExchangeRecords exchangeRecords = new GrandExchangeRecords(this); - /** * The familiar manager. */ @@ -298,26 +286,6 @@ public class Player extends Entity { */ private final HouseManager houseManager = new HouseManager(); - /** - * The barcrawl miniquest manager. - */ - private final BarcrawlManager barcrawlManager = new BarcrawlManager(this); - - /** - * The anti macro handler. - */ - private final RandomEventManager antiMacroHandler = new RandomEventManager(this); - - /** - * The hunter manager. - */ - private final HunterManager hunterManager = new HunterManager(this); - - /** - * The treasure trail manager. - */ - private final TreasureTrailManager treasureTrailManager = new TreasureTrailManager(this); - /** * The audio manager. */ @@ -338,12 +306,6 @@ public class Player extends Entity { */ private final IronmanManager ironmanManager = new IronmanManager(this); - - /** - * Brawling Gloves manager - */ - private final BrawlingGlovesManager brawlingGlovesManager = new BrawlingGlovesManager(this); - /** * The boolean for the player playing. */ @@ -411,16 +373,12 @@ public class Player extends Entity { * @param force If we should force removal, a player engaged in combat will otherwise remain active until out of combat. */ public void clear(boolean force) { - /*if (!force && allowRemoval()) { - Repository.getDisconnectionQueue().add(this, true); - return; - }*/ if (force) { Repository.getDisconnectionQueue().remove(getName()); } - GameWorld.getLogoutListeners().forEach((it) -> it.logout(this)); setPlaying(false); getWalkingQueue().reset(); + GameWorld.getLogoutListeners().forEach((it) -> it.logout(this)); if(!logoutListeners.isEmpty()){ logoutListeners.forEach((key,method) -> method.invoke(this)); } @@ -432,7 +390,6 @@ public class Player extends Entity { super.clear(); getZoneMonitor().clear(); CommunicationInfo.notifyPlayers(this, false, false); - hunterManager.logout(); HouseManager.leave(this); UpdateSequence.getRenderablePlayers().remove(this); Repository.getDisconnectionQueue().add(this); @@ -480,8 +437,6 @@ public class Player extends Entity { @Override public void tick() { super.tick(); - antiMacroHandler.tick(); - hunterManager.pulse(); musicPlayer.tick(); if(getAttribute("fire:immune",0) > 0){ int time = getAttribute("fire:immune",0) - GameWorld.getTicks(); @@ -1142,14 +1097,6 @@ public class Player extends Entity { return hintIconManager; } - /** - * Gets the slayer. - * @return The slayer. - */ - public SlayerManager getSlayer() { - return slayer; - } - /** * Checks if the player is artifical (AIPlayer). * @return {@code True} if so. @@ -1263,38 +1210,6 @@ public class Player extends Entity { return houseManager; } - /** - * Gets the barcrawlManager. - * @return The barcrawlManager. - */ - public BarcrawlManager getBarcrawlManager() { - return barcrawlManager; - } - - /** - * Gets the antiMacroHandler. - * @return The antiMacroHandler. - */ - public RandomEventManager getAntiMacroHandler() { - return antiMacroHandler; - } - - /** - * Gets the hunterManager. - * @return The hunterManager. - */ - public HunterManager getHunterManager() { - return hunterManager; - } - - /** - * Gets the btreasureTrailManager. - * @return the treasureTrailManager - */ - public TreasureTrailManager getTreasureTrailManager() { - return treasureTrailManager; - } - /** * Gets the graveManager. * @return the graveManager @@ -1405,10 +1320,6 @@ public class Player extends Entity { this.archeryTotal = archeryTotal; } - public BrawlingGlovesManager getBrawlingGlovesManager() { return brawlingGlovesManager;} - - public GrandExchangeRecords getExchangeRecords() { return exchangeRecords; } - public boolean hasActiveState(String key){ State state = states.get(key); if(state != null && state.getPulse() != null){ diff --git a/Server/src/main/java/core/game/node/entity/player/info/login/LoginConfiguration.java b/Server/src/main/java/core/game/node/entity/player/info/login/LoginConfiguration.java index fd0ec114f..33eb9b3d3 100644 --- a/Server/src/main/java/core/game/node/entity/player/info/login/LoginConfiguration.java +++ b/Server/src/main/java/core/game/node/entity/player/info/login/LoginConfiguration.java @@ -81,11 +81,6 @@ public final class LoginConfiguration { } else { configureGameWorld(player); } - - if(!player.isArtificial()) - { - GameWorld.getLoginListeners().forEach((listener) -> listener.login(player)); - } } /** @@ -220,10 +215,8 @@ public final class LoginConfiguration { player.getPacketDispatch().sendRunEnergy(); player.getFamiliarManager().login(); player.getInterfaceManager().openDefaultTabs(); - player.getExchangeRecords().init(); player.getPacketDispatch().sendString("Friends List - World " + GameWorld.getSettings().getWorldId(), 550, 3); player.getConfigManager().init(); - player.getAntiMacroHandler().init(); player.getQuestRepository().syncronizeTab(player); player.getGraveManager().update(); player.getInterfaceManager().close(); diff --git a/Server/src/main/java/core/game/node/entity/player/info/login/PlayerParser.java b/Server/src/main/java/core/game/node/entity/player/info/login/PlayerParser.java index e8c0dad3d..adf4c770c 100644 --- a/Server/src/main/java/core/game/node/entity/player/info/login/PlayerParser.java +++ b/Server/src/main/java/core/game/node/entity/player/info/login/PlayerParser.java @@ -1,6 +1,7 @@ package core.game.node.entity.player.info.login; import core.game.node.entity.player.Player; +import org.json.simple.JSONObject; import rs09.ServerConstants; import rs09.game.node.entity.player.info.login.PlayerSaveParser; import rs09.game.node.entity.player.info.login.PlayerSaver; @@ -17,23 +18,15 @@ public final class PlayerParser { * Parses or creates the player's save file depending on whether or not it exists. * @param player The player. */ - public static boolean parse(Player player) { - File JSON = new File(ServerConstants.PLAYER_SAVE_PATH + player.getName() + ".json"); + public static PlayerSaveParser parse(Player player) { + PlayerSaveParser parser = new PlayerSaveParser(player); try { - if (JSON.exists()) { //parse the new JSON type. - new PlayerSaveParser(player).parse(); - } else { //Create new save - if(!(new File(ServerConstants.PLAYER_SAVE_PATH + "template/template.json")).exists()){ - return true; - } - makeFromTemplate(player); - new PlayerSaveParser(player).parse(); - } - return true; + parser.parse(); + return parser; } catch (Exception e){ e.printStackTrace(); - return false; + return null; } } /** diff --git a/Server/src/main/java/core/game/node/entity/player/info/portal/PlayerSQLManager.java b/Server/src/main/java/core/game/node/entity/player/info/portal/PlayerSQLManager.java index a038aacf6..41de6532b 100644 --- a/Server/src/main/java/core/game/node/entity/player/info/portal/PlayerSQLManager.java +++ b/Server/src/main/java/core/game/node/entity/player/info/portal/PlayerSQLManager.java @@ -11,6 +11,7 @@ import core.game.system.mysql.SQLManager; import core.game.system.mysql.SQLTable; import core.game.system.mysql.impl.PlayerSQLHandler; import core.net.amsc.WorldCommunicator; +import rs09.game.ge.GrandExchangeRecords; import java.math.BigInteger; import java.sql.Connection; @@ -108,7 +109,7 @@ public final class PlayerSQLManager { table.getColumn("credits").updateValue(player.getDetails().credits); table.getColumn("bank").updateValue(player.getBank().format()); table.getColumn("lastLogin").updateValue(player.getDetails().getLastLogin()); - table.getColumn("ge").updateValue(player.getExchangeRecords().format()); + table.getColumn("ge").updateValue(GrandExchangeRecords.getInstance(player).format()); table.getColumn("inventory").updateValue(player.getInventory().format()); table.getColumn("equipment").updateValue(player.getEquipment().format()); table.getColumn("netWorth").updateValue(player.getMonitor().getNetworth()); diff --git a/Server/src/main/java/core/game/node/entity/player/link/BankPinManager.java b/Server/src/main/java/core/game/node/entity/player/link/BankPinManager.java index d7a3b9853..eff2af40a 100644 --- a/Server/src/main/java/core/game/node/entity/player/link/BankPinManager.java +++ b/Server/src/main/java/core/game/node/entity/player/link/BankPinManager.java @@ -4,6 +4,7 @@ import core.game.component.CloseEvent; import core.game.component.Component; import core.game.node.entity.player.Player; +import rs09.game.ge.GrandExchangeRecords; import rs09.game.interaction.inter.ge.StockMarket; import rs09.game.world.GameWorld; import core.net.packet.PacketRepository; @@ -202,7 +203,7 @@ public class BankPinManager { player.getBank().open(); } } else if (buttonId == 3) { - player.getExchangeRecords().openCollectionBox(); + GrandExchangeRecords.getInstance(player).openCollectionBox(); } else if (buttonId == 4) { StockMarket.openFor(player); } diff --git a/Server/src/main/java/core/game/node/entity/skill/Skills.java b/Server/src/main/java/core/game/node/entity/skill/Skills.java index 3427ac8c8..1443a46e4 100644 --- a/Server/src/main/java/core/game/node/entity/skill/Skills.java +++ b/Server/src/main/java/core/game/node/entity/skill/Skills.java @@ -1,6 +1,7 @@ package core.game.node.entity.skill; import core.game.interaction.item.brawling_gloves.BrawlingGloves; +import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager; import core.game.node.entity.Entity; import core.game.node.entity.combat.ImpactHandler; import core.game.node.entity.npc.NPC; @@ -218,14 +219,15 @@ public final class Skills { boolean already200m = this.experience[slot] == 200000000; double experienceAdd = (experience * mod); //check if a player has brawling gloves and, if equipped, modify xp - if(!player.getBrawlingGlovesManager().GloveCharges.isEmpty()){ + BrawlingGlovesManager bgManager = BrawlingGlovesManager.getInstance(player); + if(!bgManager.GloveCharges.isEmpty()){ Item gloves = BrawlingGloves.forSkill(slot) == null ? null : new Item(BrawlingGloves.forSkill(slot).getId()); if(gloves == null && (slot == Skills.STRENGTH || slot == Skills.DEFENCE)){ gloves = new Item (BrawlingGloves.forSkill(Skills.ATTACK).getId()); } if(gloves != null && player.getEquipment().containsItem(gloves)){ - experienceAdd += experienceAdd * player.getBrawlingGlovesManager().getExperienceBonus(); - player.getBrawlingGlovesManager().updateCharges(gloves.getId(),1); + experienceAdd += experienceAdd * bgManager.getExperienceBonus(); + bgManager.updateCharges(gloves.getId(),1); } } //Check for Flame Gloves and Ring of Fire diff --git a/Server/src/main/java/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java b/Server/src/main/java/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java index 2d3dd0870..2dc149c11 100644 --- a/Server/src/main/java/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java +++ b/Server/src/main/java/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java @@ -5,6 +5,7 @@ import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.fletching.Fletching; import core.game.node.entity.player.Player; import core.game.node.item.Item; +import rs09.game.node.entity.skill.slayer.SlayerManager; /** * Represents the arrow head pulse to complete the headless arrow. @@ -43,7 +44,7 @@ public class ArrowHeadPulse extends SkillPulse { @Override public boolean checkRequirements() { if (arrow.unfinished == 4160) { - if (!player.getSlayer().flags.isBroadsUnlocked()) { + if (!SlayerManager.getInstance(player).flags.isBroadsUnlocked()) { player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad arrows."); return false; } diff --git a/Server/src/main/java/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java b/Server/src/main/java/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java index f8ec05101..2928f16f5 100644 --- a/Server/src/main/java/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java +++ b/Server/src/main/java/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java @@ -6,6 +6,7 @@ import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.fletching.Fletching; import core.game.node.entity.player.Player; import core.game.node.item.Item; +import rs09.game.node.entity.skill.slayer.SlayerManager; /** * Represents the bolt pulse class to make bolts. @@ -60,7 +61,7 @@ public final class BoltPulse extends SkillPulse { @Override public boolean checkRequirements() { if (bolt.getUnfinished().getId() == 13279) { - if (!player.getSlayer().flags.isBroadsUnlocked()) { + if (!SlayerManager.getInstance(player).flags.isBroadsUnlocked()) { player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad bolts."); return false; } diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/DeadfallSetting.java b/Server/src/main/java/core/game/node/entity/skill/hunter/DeadfallSetting.java index 97867a60a..c2d0a97a1 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/DeadfallSetting.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/DeadfallSetting.java @@ -129,7 +129,7 @@ public final class DeadfallSetting extends TrapSetting { @Override public boolean exceedsLimit(Player player) { - return player.getHunterManager().getTrapAmount() > 0 ? true : false; + return HunterManager.getInstance(player).getTrapAmount() > 0; } /** diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/HunterManager.java b/Server/src/main/java/core/game/node/entity/skill/hunter/HunterManager.java index 9b343f988..a30f87f3c 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/HunterManager.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/HunterManager.java @@ -1,9 +1,16 @@ package core.game.node.entity.skill.hunter; +import api.LoginListener; +import api.LogoutListener; +import api.events.EventHook; +import api.events.TickEvent; +import core.game.node.entity.Entity; import core.game.node.entity.skill.Skills; import core.game.node.Node; import core.game.node.entity.player.Player; import core.game.node.scenery.Scenery; +import org.jetbrains.annotations.NotNull; +import rs09.game.Event; import java.util.ArrayList; import java.util.Iterator; @@ -13,7 +20,7 @@ import java.util.List; * Manages the players hunter state. * @author Vexia */ -public final class HunterManager { +public final class HunterManager implements LoginListener, LogoutListener, EventHook { /** * The list of active traps. @@ -33,10 +40,32 @@ public final class HunterManager { this.player = player; } - /** - * Calles every game pulse. - */ - public void pulse() { + public HunterManager() { + this.player = null; + } + + @Override + public void login(@NotNull Player player) { + HunterManager instance = new HunterManager(player); + player.hook(Event.getTick(), instance); + player.setAttribute("hunter-manager", instance); + } + + @Override + public void logout(@NotNull Player player) { + HunterManager instance = getInstance(player); + Iterator iterator = instance.traps.iterator(); + TrapWrapper wrapper = null; + while (iterator.hasNext()) { + wrapper = iterator.next(); + if (wrapper.getType().getSettings().clear(wrapper, 0)) { + iterator.remove(); + } + } + } + + @Override + public void process(@NotNull Entity entity, @NotNull TickEvent event) { if (traps.size() == 0) { return; } @@ -50,20 +79,6 @@ public final class HunterManager { } } - /** - * Called when the player logs out. - */ - public void logout() { - Iterator iterator = traps.iterator(); - TrapWrapper wrapper = null; - while (iterator.hasNext()) { - wrapper = iterator.next(); - if (wrapper.getType().getSettings().clear(wrapper, 0)) { - iterator.remove(); - } - } - } - /** * Register a hunting trap. * @param trap the trap. @@ -179,4 +194,8 @@ public final class HunterManager { return traps; } + public static HunterManager getInstance(Player player) + { + return player.getAttribute("hunter-manager"); + } } diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/HunterPlugin.java b/Server/src/main/java/core/game/node/entity/skill/hunter/HunterPlugin.java index 861f3c83c..713bdd321 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/HunterPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/HunterPlugin.java @@ -148,11 +148,11 @@ public final class HunterPlugin extends OptionHandler { final Player player = event.getPlayer(); final Scenery object = event.getUsedWith() instanceof Scenery ? (Scenery) event.getUsedWith() : (Scenery) event.getUsed(); final Item item = event.getUsedItem(); - if (!player.getHunterManager().isOwner(object)) { + if (HunterManager.getInstance(player).isOwner(object)) { player.sendMessage("This isn't your trap!"); return true; } - final TrapWrapper wrapper = player.getHunterManager().getWrapper(object); + final TrapWrapper wrapper = HunterManager.getInstance(player).getWrapper(object); if (item.getId() == 594) { wrapper.smoke(); } else { diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapCreatePulse.java b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapCreatePulse.java index 6d308f379..e913fed07 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapCreatePulse.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapCreatePulse.java @@ -3,6 +3,7 @@ package core.game.node.entity.skill.hunter; import core.game.node.entity.skill.SkillPulse; import core.game.node.Node; import core.game.node.entity.player.Player; +import core.game.node.entity.skill.Skills; import core.game.node.item.GroundItem; import core.game.node.item.GroundItemManager; import core.game.node.item.Item; @@ -37,6 +38,8 @@ public final class TrapCreatePulse extends SkillPulse { */ private int ticks; + private final HunterManager instance; + /** * Constructs a new {@code TrapCreatePulse} {@code Object}. * @param player the player. @@ -47,15 +50,16 @@ public final class TrapCreatePulse extends SkillPulse { super(player, node); this.trap = trap; this.startLocation = node instanceof GroundItem ? node.getLocation() : player.getLocation(); + this.instance = HunterManager.getInstance(player); } @Override public boolean checkRequirements() { - if (player.getHunterManager().getStaticLevel() < trap.getSettings().getLevel()) { + if (player.skills.getStaticLevel(Skills.HUNTER) < trap.getSettings().getLevel()) { player.sendMessage("You need a Hunter level of at least " + trap.getSettings().getLevel() + " in order to setup a " + node.getName().toLowerCase() + "."); return false; } - if (player.getHunterManager().exceedsTrapLimit(trap)) { + if (instance.exceedsTrapLimit(trap)) { player.sendMessage(trap.getSettings().getLimitMessage(player)); return false; } @@ -94,7 +98,7 @@ public final class TrapCreatePulse extends SkillPulse { SceneryBuilder.remove(node.asScenery()); } object = SceneryBuilder.add(object); - player.getHunterManager().register(trap, node, object); + instance.register(trap, node, object); return true; } diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapDismantlePulse.java b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapDismantlePulse.java index 1773e3e0b..c33158578 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapDismantlePulse.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapDismantlePulse.java @@ -27,6 +27,8 @@ public final class TrapDismantlePulse extends SkillPulse { */ private int ticks; + private final HunterManager instance; + /** * Constructs a new {@code TrapDismantlePulse} {@code Object}. * @param player the player. @@ -36,11 +38,12 @@ public final class TrapDismantlePulse extends SkillPulse { super(player, node); this.trap = wrapper.getType(); this.wrapper = wrapper; + this.instance = HunterManager.getInstance(player); } @Override public boolean checkRequirements() { - if (wrapper == null || !player.getHunterManager().isOwner(node)) { + if (wrapper == null || !instance.isOwner(node)) { player.sendMessage("This isn't your trap!"); return false; } @@ -66,7 +69,7 @@ public final class TrapDismantlePulse extends SkillPulse { return false; } if (wrapper.getType().getSettings().clear(wrapper, 1)) { - player.getHunterManager().deregister(wrapper); + instance.deregister(wrapper); if (wrapper.isCaught()) { if (wrapper.getType().equals(Traps.BOX_TRAP)) { for (int i : wrapper.getReward().getNpcIds()) { diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapNode.java b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapNode.java index 2ed3e6fb9..f0484f7ad 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapNode.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapNode.java @@ -3,6 +3,7 @@ package core.game.node.entity.skill.hunter; import core.game.content.global.SkillingPets; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; +import core.game.node.entity.skill.Skills; import core.game.node.item.Item; /** @@ -63,7 +64,7 @@ public class TrapNode { if (wrapper.isCaught() || wrapper.isBusy() || wrapper.isFailed()) { return false; } - return player.getHunterManager().getStaticLevel() >= level && !npc.isInvisible(); + return player.skills.getStaticLevel(Skills.HUNTER) >= level && !npc.isInvisible(); } /** diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapSetting.java b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapSetting.java index c21cf0fda..750bc0cd8 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapSetting.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapSetting.java @@ -5,6 +5,7 @@ import core.cache.def.impl.SceneryDefinition; import core.game.node.Node; import core.game.node.entity.npc.NPC; import core.game.node.entity.player.Player; +import core.game.node.entity.skill.Skills; import core.game.node.item.GroundItem; import core.game.node.item.GroundItemManager; import core.game.node.item.Item; @@ -232,11 +233,12 @@ public class TrapSetting { * @param object the object. */ public void investigate(Player player, Scenery object) { - if (!player.getHunterManager().isOwner(object)) { + HunterManager instance = HunterManager.getInstance(player); + if (!instance.isOwner(object)) { player.sendMessage("This isn't your trap."); return; } - TrapWrapper wrapper = player.getHunterManager().getWrapper(object); + TrapWrapper wrapper = instance.getWrapper(object); player.sendMessage("This trap " + (wrapper.isSmoked() ? "has" : "hasn't") + " been smoked."); } @@ -322,7 +324,7 @@ public class TrapSetting { * @return {@code True} if so. */ public boolean isSuccess(Player player, final TrapNode node) { - double level = player.getHunterManager().getStaticLevel(); + double level = player.skills.getStaticLevel(Skills.HUNTER); double req = node.getLevel(); double successChance = Math.ceil((level * 50 - req * 17) / req / 3 * 4); int roll = RandomFunction.random(99); @@ -474,7 +476,8 @@ public class TrapSetting { * @return the message. */ public String getLimitMessage(Player player) { - return "You don't have a high enough Hunter level to set up more than " + player.getHunterManager().getMaximumTraps() + " trap" + (player.getHunterManager().getMaximumTraps() == 1 ? "." : "s."); + HunterManager instance = HunterManager.getInstance(player); + return "You don't have a high enough Hunter level to set up more than " + instance.getMaximumTraps() + " trap" + (instance.getMaximumTraps() == 1 ? "." : "s."); } /** diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapWrapper.java b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapWrapper.java index ccc0a930f..ed539af70 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/TrapWrapper.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/TrapWrapper.java @@ -1,5 +1,6 @@ package core.game.node.entity.skill.hunter; +import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.hunter.NetTrapSetting.NetTrap; import core.game.node.entity.player.Player; import core.game.node.item.Item; @@ -88,6 +89,8 @@ public final class TrapWrapper { */ private int ticks; + private HunterManager instance; + /** * Constructs a new {@code TrapWrapper} {@code Object}. * @param player the player. @@ -100,7 +103,8 @@ public final class TrapWrapper { this.object = object; this.originalId = object.getId(); this.ticks = GameWorld.getTicks() + (100); - this.object.getAttributes().setAttribute("trap-uid", player.getHunterManager().getUid()); + this.instance = HunterManager.getInstance(player); + this.object.getAttributes().setAttribute("trap-uid", instance.getUid()); } /** @@ -125,7 +129,7 @@ public final class TrapWrapper { Scenery newObject = object.transform(id); SceneryBuilder.remove(object); this.object = SceneryBuilder.add(newObject); - this.object.getAttributes().setAttribute("trap-uid", player.getHunterManager().getUid()); + this.object.getAttributes().setAttribute("trap-uid", instance.getUid()); } /** @@ -136,7 +140,7 @@ public final class TrapWrapper { player.sendMessage("This trap has already been smoked."); return; } - if (player.getHunterManager().getStaticLevel() < 39) { + if (player.skills.getStaticLevel(Skills.HUNTER) < 39) { player.sendMessage("You need a Hunter level of at least 39 to be able to smoke traps."); return; } diff --git a/Server/src/main/java/core/game/node/entity/skill/hunter/Traps.java b/Server/src/main/java/core/game/node/entity/skill/hunter/Traps.java index daf56d261..4824de5ed 100644 --- a/Server/src/main/java/core/game/node/entity/skill/hunter/Traps.java +++ b/Server/src/main/java/core/game/node/entity/skill/hunter/Traps.java @@ -94,16 +94,18 @@ public enum Traps { * @param object the object. */ public void dismantle(Player player, Scenery object) { - if (!player.getHunterManager().isOwner(object)) { + HunterManager instance = HunterManager.getInstance(player); + + if (!instance.isOwner(object)) { player.sendMessage("This isn't your trap!"); return; } - if (player.getHunterManager().getWrapper(object) == null) { + if (instance.getWrapper(object) == null) { SystemLogger.logErr("NO WRAPPER (HUNTER DISMANTLE)"); return; } player.faceLocation(object.getLocation()); - player.getPulseManager().run(new TrapDismantlePulse(player, object, player.getHunterManager().getWrapper(object))); + player.getPulseManager().run(new TrapDismantlePulse(player, object, instance.getWrapper(object))); } /** diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java b/Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java index f56ed151b..10d319762 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java @@ -6,6 +6,7 @@ import core.game.content.dialogue.FacialExpression; import core.game.node.entity.player.Player; import core.game.world.map.Direction; import core.plugin.Initializable; +import rs09.game.node.entity.skill.slayer.SlayerManager; /** * Rerpresents the enchanted gem dialogue. @@ -46,7 +47,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin { public boolean open(Object... args) { player.faceLocation(player.getLocation().transform(1, 0, 0)); player.setDirection(Direction.EAST); - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "Hello there " + player.getUsername() + ", what can I help you with?"); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "Hello there " + player.getUsername() + ", what can I help you with?"); stage = 0; return true; } @@ -87,13 +88,13 @@ public final class EnchantedGemDialogue extends DialoguePlugin { end(); break; case 10: - if (!player.getSlayer().hasTask()) { - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt. Come and see me", "When you can and I'll give you a new task."); + if (!SlayerManager.getInstance(player).hasTask()) { + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt. Come and see me", "When you can and I'll give you a new task."); stage = 11; break; } - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You're currently assigned to kill " + (player.getSlayer().getTask() == Tasks.JAD ? " TzTok-Jad!" : NPCDefinition.forId((player.getSlayer().getTask().getNpcs()[0])).getName().toLowerCase() + "'s;"), "only " + player.getSlayer().getAmount() + " more to go."); - player.varpManager.get(2502).setVarbit(0,player.getSlayer().flags.getTaskFlags() >> 4).send(player); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You're currently assigned to kill " + (SlayerManager.getInstance(player).getTask() == Tasks.JAD ? " TzTok-Jad!" : NPCDefinition.forId((SlayerManager.getInstance(player).getTask().getNpcs()[0])).getName().toLowerCase() + "'s;"), "only " + SlayerManager.getInstance(player).getAmount() + " more to go."); + player.varpManager.get(2502).setVarbit(0,SlayerManager.getInstance(player).flags.getTaskFlags() >> 4).send(player); stage = 11; break; case 11: @@ -103,20 +104,20 @@ public final class EnchantedGemDialogue extends DialoguePlugin { case 12: switch (buttonId) { case 1: - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(SlayerManager.getInstance(player).getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); stage = 21; break; case 2: - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); stage = 31; break; case 3: - if (!player.getSlayer().hasTask()) { - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); + if (!SlayerManager.getInstance(player).hasTask()) { + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); stage = 99; break; } - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip()); stage = 401; break; case 4: @@ -129,7 +130,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin { } break; case 20: - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(SlayerManager.getInstance(player).getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); stage = 21; break; case 21: @@ -143,16 +144,16 @@ public final class EnchantedGemDialogue extends DialoguePlugin { stage = 10; break; case 2: - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); stage = 31; break; case 3: - if (!player.getSlayer().hasTask()) { - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); + if (!SlayerManager.getInstance(player).hasTask()) { + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); stage = 99; break; } - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip()); stage = 401; break; case 4: @@ -163,7 +164,7 @@ public final class EnchantedGemDialogue extends DialoguePlugin { } break; case 30: - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); stage = 31; break; case 31: @@ -177,16 +178,16 @@ public final class EnchantedGemDialogue extends DialoguePlugin { stage = 10; break; case 2: - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(SlayerManager.getInstance(player).getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); stage = 21; break; case 3: - if (!player.getSlayer().hasTask()) { - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); + if (!SlayerManager.getInstance(player).hasTask()) { + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); stage = 0; break; } - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip()); stage = 401; break; case 4: @@ -197,12 +198,12 @@ public final class EnchantedGemDialogue extends DialoguePlugin { } break; case 400: - if (!player.getSlayer().hasTask()) { - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); + if (!SlayerManager.getInstance(player).hasTask()) { + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); stage = 0; break; } - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip()); stage = 401; break; case 401: @@ -220,11 +221,11 @@ public final class EnchantedGemDialogue extends DialoguePlugin { stage = 10; break; case 2: - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(SlayerManager.getInstance(player).getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); stage = 21; break; case 3: - interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); + interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); stage = 31; break; case 4: @@ -243,17 +244,17 @@ public final class EnchantedGemDialogue extends DialoguePlugin { * @return the location. */ public String masterLocation() { - if (player.getSlayer().getMaster().getNpc() == Master.MAZCHNA.getNpc()) + if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.MAZCHNA.getNpc()) return "Canifis"; - else if (player.getSlayer().getMaster().getNpc() == Master.TURAEL.getNpc()) + else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.TURAEL.getNpc()) return "Taverley"; - else if (player.getSlayer().getMaster().getNpc() == Master.CHAELDAR.getNpc()) + else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.CHAELDAR.getNpc()) return "Zanaris"; - else if (player.getSlayer().getMaster().getNpc() == Master.VANNAKA.getNpc()) + else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.VANNAKA.getNpc()) return "Edgeville dungeon"; - else if (player.getSlayer().getMaster().getNpc() == Master.DURADEL.getNpc()) + else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.DURADEL.getNpc()) return "Shilo village"; - else if(player.getSlayer().getMaster() == null) { + else if(SlayerManager.getInstance(player).getMaster() == null) { return "the Gnome Stronghold"; } return null; diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/Master.java b/Server/src/main/java/core/game/node/entity/skill/slayer/Master.java index 83ee6be4d..9d1ee2c12 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/Master.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/Master.java @@ -2,6 +2,7 @@ package core.game.node.entity.skill.slayer; import core.game.node.entity.skill.Skills; import core.game.node.entity.player.Player; +import rs09.game.node.entity.skill.slayer.SlayerManager; import java.util.ArrayList; import java.util.Arrays; @@ -247,7 +248,7 @@ public enum Master { } public static boolean hasSameTask(Master master, Player player){ - return master.tasks.stream().filter(task -> task.task == player.getSlayer().getTask()).count() != 0; + return master.tasks.stream().filter(task -> task.task == SlayerManager.getInstance(player).getTask()).count() != 0; } public static class Task{ diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java index fe45afcb5..265913b22 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java @@ -2,6 +2,7 @@ package core.game.node.entity.skill.slayer; import org.json.simple.JSONObject; import rs09.ServerStore; +import rs09.game.node.entity.skill.slayer.SlayerManager; import rs09.game.world.GameWorld; import core.game.content.dialogue.DialoguePlugin; import core.game.content.dialogue.FacialExpression; @@ -224,7 +225,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin { end(); break; case -1: // vannaka - has options for achievement diary - if (!player.getSlayer().hasStarted()) { + if (!SlayerManager.getInstance(player).hasStarted()) { options("Who are you?", "Do you have anything for trade?", "Er...nothing...", "I have a question about my Achievement Diary."); stage = 1; } else { @@ -244,7 +245,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin { break; } } - if (!player.getSlayer().hasStarted()) { + if (!SlayerManager.getInstance(player).hasStarted()) { options("Who are you?", "Do you have anything for trade?", "Er...nothing..."); stage = 1; } else { @@ -359,8 +360,8 @@ public final class SlayerMasterDialogue extends DialoguePlugin { case 504: if (player.getInventory().freeSlots() != 0) { player.getInventory().add(GEM); - player.getSlayer().generate(master); - interpreter.sendDialogues(master.getNpc(), getExpression(master), "We'll start you off hunting " + player.getSlayer().getTaskName() + "'s, you'll need to", "kill " + player.getSlayer().getAmount() + " of them."); + SlayerManager.getInstance(player).generate(master); + interpreter.sendDialogues(master.getNpc(), getExpression(master), "We'll start you off hunting " + SlayerManager.getInstance(player).getTaskName() + "'s, you'll need to", "kill " + SlayerManager.getInstance(player).getAmount() + " of them."); stage = 510; } else if (player.getInventory().freeSlots() == 0) { player("Sorry, I don't have enough inventory space."); @@ -491,12 +492,12 @@ public final class SlayerMasterDialogue extends DialoguePlugin { stage = 99; break; } - if (!player.getSlayer().hasTask()) { - player.getSlayer().generate(master); - if (player.getSlayer().getTask() == Tasks.JAD) { + if (!SlayerManager.getInstance(player).hasTask()) { + SlayerManager.getInstance(player).generate(master); + if (SlayerManager.getInstance(player).getTask() == Tasks.JAD) { interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to", "defeat the almighty TzTok-Jad."); } else { - interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + player.getSlayer().getAmount() + " " + player.getSlayer().getTaskName() + "s."); + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + SlayerManager.getInstance(player).getAmount() + " " + SlayerManager.getInstance(player).getTaskName() + "s."); } stage = 844; break; @@ -505,12 +506,12 @@ public final class SlayerMasterDialogue extends DialoguePlugin { interpreter.sendDialogues(master.getNpc(), getExpression(master), "You're still hunting something. But let me check something..."); stage = 847; } else { - player.getSlayer().flags.setTaskStreak(0); - player.getSlayer().generate(master); - if (player.getSlayer().getTask() == Tasks.JAD) { + SlayerManager.getInstance(player).flags.setTaskStreak(0); + SlayerManager.getInstance(player).generate(master); + if (SlayerManager.getInstance(player).getTask() == Tasks.JAD) { interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to", "defeat the almighty TzTok-Jad."); } else { - interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + player.getSlayer().getAmount() + " " + player.getSlayer().getTaskName() + "'s."); + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + SlayerManager.getInstance(player).getAmount() + " " + SlayerManager.getInstance(player).getTaskName() + "'s."); } stage = 844; } @@ -526,7 +527,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin { case 845: switch (buttonId) { case 1: - interpreter.sendDialogues(master.getNpc(), getExpression(master), player.getSlayer().getTask().getTip()); + interpreter.sendDialogues(master.getNpc(), getExpression(master), SlayerManager.getInstance(player).getTask().getTip()); stage = 860; break; case 2: @@ -538,7 +539,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin { if(rerolls == 10){ stage++; } else { - player.getSlayer().clear(); + SlayerManager.getInstance(player).clear(); getStoreFile().put(player.getUsername().toLowerCase(), rerolls + 1); stage = 701; } @@ -566,7 +567,7 @@ public final class SlayerMasterDialogue extends DialoguePlugin { switch(buttonId){ case 1: playerl(FacialExpression.FRIENDLY, "Yes, please."); - player.getSlayer().clear(); + SlayerManager.getInstance(player).clear(); getStoreFile().put(player.getUsername().toLowerCase(), rerolls + 1); stage = 701; break; diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java index f8f1f52e3..cbdf4a710 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java @@ -14,6 +14,7 @@ import core.game.node.entity.player.Player; import core.game.node.item.Item; import core.plugin.Initializable; import core.plugin.Plugin; +import rs09.game.node.entity.skill.slayer.SlayerManager; import rs09.plugin.ClassScanner; /** @@ -60,27 +61,27 @@ public class SlayerRewardPlugin extends ComponentPlugin { switch (button) { case 23://reassign case 26: - if (!player.getSlayer().hasTask()) { + if (!SlayerManager.getInstance(player).hasTask()) { player.sendMessage("You don't have an active task right now."); break; } if (purchase(player, 30)) { - player.getSlayer().clear(); + SlayerManager.getInstance(player).clear(); player.sendMessage("You have canceled your current task."); } break; case 24: case 27: - if (player.getSlayer().getTask() == null) { + if (SlayerManager.getInstance(player).getTask() == null) { player.sendMessage("You don't have a slayer task."); break; } - if (player.getSlayer().getRemoved().size() >= 4) { + if (SlayerManager.getInstance(player).getRemoved().size() >= 4) { player.sendMessage("You can't remove anymore tasks."); break; } - if (player.getSlayer().getSlayerPoints() >= 30 && !player.isAdmin()) { - int size = player.getSlayer().getRemoved().size(); + if (SlayerManager.getInstance(player).getSlayerPoints() >= 30 && !player.isAdmin()) { + int size = SlayerManager.getInstance(player).getRemoved().size(); int qp = player.getQuestRepository().getAvailablePoints(); if (size == 0 && qp < 50) { player.sendMessage("You need 50 quest points as a requirement in order to block one task."); @@ -97,8 +98,8 @@ public class SlayerRewardPlugin extends ComponentPlugin { } } if (purchase(player, 100)) { - player.getSlayer().getRemoved().add(player.getSlayer().getTask()); - player.getSlayer().clear(); + SlayerManager.getInstance(player).getRemoved().add(SlayerManager.getInstance(player).getTask()); + SlayerManager.getInstance(player).clear(); updateInterface(player, player.getInterfaceManager().getOpened()); } break; @@ -107,10 +108,10 @@ public class SlayerRewardPlugin extends ComponentPlugin { case 38: case 39: int index = 3 - (39 - button); - if (player.getSlayer().getRemoved().isEmpty() || index > player.getSlayer().getRemoved().size() - 1 || player.getSlayer().getRemoved().get(index) == null) { + if (SlayerManager.getInstance(player).getRemoved().isEmpty() || index > SlayerManager.getInstance(player).getRemoved().size() - 1 || SlayerManager.getInstance(player).getRemoved().get(index) == null) { break; } - player.getSlayer().getRemoved().remove(index); + SlayerManager.getInstance(player).getRemoved().remove(index); updateInterface(player, player.getInterfaceManager().getOpened()); break; case 15: @@ -131,34 +132,34 @@ public class SlayerRewardPlugin extends ComponentPlugin { break; case 22://Broad arrows case 29: - if (player.getSlayer().flags.isBroadsUnlocked()) { + if (SlayerManager.getInstance(player).flags.isBroadsUnlocked()) { player.sendMessage("You don't need to learn this ability again."); break; } if (purchase(player, 300)) { - player.getSlayer().flags.unlockBroads(); + SlayerManager.getInstance(player).flags.unlockBroads(); updateInterface(player, component); } break; case 23://Slayer ring case 30: - if (player.getSlayer().flags.isRingUnlocked()) { + if (SlayerManager.getInstance(player).flags.isRingUnlocked()) { player.sendMessage("You don't need to learn this ability again."); break; } if (purchase(player, 300)) { - player.getSlayer().flags.unlockRing(); + SlayerManager.getInstance(player).flags.unlockRing(); updateInterface(player, component); } break; case 24://Slayer helm case 31: - if (player.getSlayer().flags.isHelmUnlocked()) { + if (SlayerManager.getInstance(player).flags.isHelmUnlocked()) { player.sendMessage("You don't need to learn this ability again."); break; } if (purchase(player, 400)) { - player.getSlayer().flags.unlockHelm(); + SlayerManager.getInstance(player).flags.unlockHelm(); updateInterface(player, component); } break; @@ -180,7 +181,7 @@ public class SlayerRewardPlugin extends ComponentPlugin { break; case 26://ring of slaying case 33: - if (player.getInventory().freeSlots() < 1 && player.getSlayer().getSlayerPoints() >= 75) { + if (player.getInventory().freeSlots() < 1 && SlayerManager.getInstance(player).getSlayerPoints() >= 75) { player.sendMessage("You don't have enough inventory space."); break; } @@ -220,11 +221,11 @@ public class SlayerRewardPlugin extends ComponentPlugin { * @return {@code True} if purchased. */ private boolean purchase(Player player, int amount) { - if (player.getSlayer().getSlayerPoints() < amount) { + if (SlayerManager.getInstance(player).getSlayerPoints() < amount) { player.sendMessage("You need " + amount + " slayer points in order to purchase this reward."); return false; } - player.getSlayer().setSlayerPoints(player.getSlayer().getSlayerPoints() - amount); + SlayerManager.getInstance(player).setSlayerPoints(SlayerManager.getInstance(player).getSlayerPoints() - amount); updateInterface(player, player.getInterfaceManager().getOpened()); return true; } @@ -249,7 +250,7 @@ public class SlayerRewardPlugin extends ComponentPlugin { return; } String space = ""; - String num = String.valueOf(player.getSlayer().getSlayerPoints()); + String num = String.valueOf(SlayerManager.getInstance(player).getSlayerPoints()); if (num != "0") { for (int i = 0; i < num.length(); i++) { space += " "; @@ -261,31 +262,31 @@ public class SlayerRewardPlugin extends ComponentPlugin { String[] letters = new String[] {"A", "B", "C", "D"}; Tasks task = null; for (int i = 0; i < 4; i++) { - task = i > player.getSlayer().getRemoved().size() - 1 ? null : player.getSlayer().getRemoved().get(i); + task = i > SlayerManager.getInstance(player).getRemoved().size() - 1 ? null : SlayerManager.getInstance(player).getRemoved().get(i); player.getPacketDispatch().sendString(task == null ? letters[i] : task.getName(), open.getId(), childs[i]); } - player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 19); + player.getPacketDispatch().sendString(space + SlayerManager.getInstance(player).getSlayerPoints(), open.getId(), 19); break; case 163://learn for (int i = 0; i < 3; i++) { switch(i){ case 0: - player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().flags.isBroadsUnlocked()); + player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !SlayerManager.getInstance(player).flags.isBroadsUnlocked()); break; case 1: - player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().flags.isRingUnlocked()); + player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !SlayerManager.getInstance(player).flags.isRingUnlocked()); break; case 2: - player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().flags.isHelmUnlocked()); + player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !SlayerManager.getInstance(player).flags.isHelmUnlocked()); break; default: break; } } - player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 18); + player.getPacketDispatch().sendString(space + SlayerManager.getInstance(player).getSlayerPoints(), open.getId(), 18); break; case 164://buy - player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 20); + player.getPacketDispatch().sendString(space + SlayerManager.getInstance(player).getSlayerPoints(), open.getId(), 20); break; } } @@ -381,7 +382,7 @@ public class SlayerRewardPlugin extends ComponentPlugin { player.sendMessage("You need a Crafting level of at least 55 in order to do this."); return true; } - if (!player.getSlayer().flags.isHelmUnlocked()) { + if (!SlayerManager.getInstance(player).flags.isHelmUnlocked()) { player.sendMessage("You need to unlock the ability to do that first."); return true; } diff --git a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/StrongholdSlayerCave.java b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/StrongholdSlayerCave.java index 018171acf..43434f394 100644 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/StrongholdSlayerCave.java +++ b/Server/src/main/java/core/game/node/entity/skill/slayer/dungeon/StrongholdSlayerCave.java @@ -74,8 +74,8 @@ public class StrongholdSlayerCave extends MapZone implements Plugin { return true; } attack: { - if (player.getSlayer().getMaster() == Master.NIEVE) { - for (int i : player.getSlayer().getTask().getNpcs()) { + if (SlayerManager.getInstance(player).getMaster() == Master.NIEVE) { + for (int i : SlayerManager.getInstance(player).getTask().getNpcs()) { if (i != id) { continue; } @@ -206,8 +206,8 @@ public class StrongholdSlayerCave extends MapZone implements Plugin { return super.continueAttack(player, target, style, message); } int id = target.getId(); - if (player.getSlayer().getMaster() == Master.NIEVE) { - for (int i : player.getSlayer().getTask().getNpcs()) { + if (SlayerManager.getInstance(player).getMaster() == Master.NIEVE) { + for (int i : SlayerManager.getInstance(player).getTask().getNpcs()) { if (i != id) { continue; } diff --git a/Server/src/main/kotlin/Cutscene.kt b/Server/src/main/kotlin/Cutscene.kt index cd8d7d75f..b5880086e 100644 --- a/Server/src/main/kotlin/Cutscene.kt +++ b/Server/src/main/kotlin/Cutscene.kt @@ -18,6 +18,7 @@ import org.rs09.consts.Components import rs09.ServerConstants import rs09.game.Event import rs09.game.camerautils.PlayerCamera +import rs09.game.content.ame.RandomEventManager import rs09.game.system.SystemLogger import rs09.game.world.GameWorld @@ -231,7 +232,7 @@ abstract class Cutscene(val player: Player) { player.lock() player.hook(Event.SelfDeath, CUTSCENE_DEATH_HOOK) player.logoutListeners["cutscene"] = {player -> player.location = exitLocation; player.getCutscene()?.end() } - player.antiMacroHandler.enabled = false + RandomEventManager.getInstance(player)!!.enabled = false } /** @@ -260,7 +261,7 @@ abstract class Cutscene(val player: Player) { clearNPCs() player.unhook(CUTSCENE_DEATH_HOOK) player.logoutListeners.remove("cutscene") - player.antiMacroHandler.enabled = true + RandomEventManager.getInstance(player)!!.enabled = false return true } } diff --git a/Server/src/main/kotlin/api/events/Events.kt b/Server/src/main/kotlin/api/events/Events.kt index 9c5b6e2a3..faf15dedf 100644 --- a/Server/src/main/kotlin/api/events/Events.kt +++ b/Server/src/main/kotlin/api/events/Events.kt @@ -12,4 +12,5 @@ data class LitFireEvent(val logId: Int) : Event data class InteractionEvent(val target: Node, val option: String) : Event data class ButtonClickedEvent(val iface: Int, val buttonId: Int) : Event data class UsedWithEvent(val used: Int, val with: Int) : Event -data class SelfDeath(val killer: Entity) : Event \ No newline at end of file +data class SelfDeath(val killer: Entity) : Event +data class TickEvent(val source: Entity) : Event \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/Event.kt b/Server/src/main/kotlin/rs09/game/Event.kt index ef5273556..98cd2d58c 100644 --- a/Server/src/main/kotlin/rs09/game/Event.kt +++ b/Server/src/main/kotlin/rs09/game/Event.kt @@ -3,12 +3,13 @@ package rs09.game import api.events.* object Event { - val ResourceProduced = ResourceProducedEvent::class.java - val NPCKilled = NPCKillEvent::class.java - val Teleport = TeleportEvent::class.java - val FireLit = LitFireEvent::class.java - val Interaction = InteractionEvent::class.java - val ButtonClicked = ButtonClickedEvent::class.java - val UsedWith = UsedWithEvent::class.java - val SelfDeath = SelfDeath::class.java + @JvmStatic val ResourceProduced = ResourceProducedEvent::class.java + @JvmStatic val NPCKilled = NPCKillEvent::class.java + @JvmStatic val Teleport = TeleportEvent::class.java + @JvmStatic val FireLit = LitFireEvent::class.java + @JvmStatic val Interaction = InteractionEvent::class.java + @JvmStatic val ButtonClicked = ButtonClickedEvent::class.java + @JvmStatic val UsedWith = UsedWithEvent::class.java + @JvmStatic val SelfDeath = SelfDeath::class.java + @JvmStatic val Tick = TickEvent::class.java } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt index 9215236d7..8815ddf7c 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventManager.kt @@ -1,9 +1,15 @@ package rs09.game.content.ame +import api.LoginListener +import api.events.EventHook +import api.events.TickEvent import api.getAttribute +import api.setAttribute +import core.game.node.entity.Entity import core.game.node.entity.player.Player import core.game.world.map.zone.ZoneRestriction import core.tools.RandomFunction +import rs09.game.Event import rs09.game.system.SystemLogger import rs09.game.world.GameWorld import kotlin.random.Random @@ -11,15 +17,23 @@ import kotlin.random.Random private const val AVG_DELAY_TICKS = 6000 // 60 minutes private const val MIN_DELAY_TICKS = AVG_DELAY_TICKS / 2 private const val MAX_DELAY_TICKS = MIN_DELAY_TICKS + AVG_DELAY_TICKS // window of 60 min centered on 60 min (30 to 90 min) -class RandomEventManager(val player: Player) { +class RandomEventManager(val player: Player? = null) : LoginListener, EventHook { var event: RandomEventNPC? = null var enabled: Boolean = false var nextSpawn = 0 val skills = arrayOf("WoodcuttingSkillPulse","FishingPulse","MiningSkillPulse","BoneBuryingOptionPlugin") - fun tick() { - if (player.isArtificial) return - if (GameWorld.ticks > nextSpawn && getAttribute(player, "tutorial:complete", false)) fireEvent() + override fun login(player: Player) { + if(player.isArtificial) return + val instance = RandomEventManager(player) + player.hook(Event.Tick, instance) + setAttribute(player, "random-manager", instance) + instance.rollNextSpawn() + SystemLogger.logRE("Initialized REManager for ${player.username}.") + } + + override fun process(entity: Entity, event: TickEvent) { + if (GameWorld.ticks > nextSpawn && getAttribute(player!!, "tutorial:complete", false)) fireEvent() } fun fireEvent() { @@ -27,29 +41,21 @@ class RandomEventManager(val player: Player) { rollNextSpawn() return } - if (player.zoneMonitor.isRestricted(ZoneRestriction.RANDOM_EVENTS)) { + if (player!!.zoneMonitor.isRestricted(ZoneRestriction.RANDOM_EVENTS)) { nextSpawn = GameWorld.ticks + 3000 return } val currentAction = player.pulseManager.current.toString() - var ame = RandomEvents.values().random() - if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){ - ame = RandomEvents.TREE_SPIRIT - } - else if(currentAction.contains("FishingPulse") && Random.nextBoolean()){ - ame = RandomEvents.RIVER_TROLL - } - else if(currentAction.contains("MiningSkillPulse") && Random.nextBoolean()){ - ame = RandomEvents.ROCK_GOLEM - } - else if(currentAction.contains("BoneBuryingOptionPlugin") && Random.nextBoolean()){ - ame = RandomEvents.SHADE - } - else { - ame = RandomEvents.values().random() - while(ame.type == "skill"){ - ame = RandomEvents.values().random() - } + val ame: RandomEvents = if(currentAction.contains("WoodcuttingSkillPulse") && Random.nextBoolean()){ + RandomEvents.TREE_SPIRIT + } else if(currentAction.contains("FishingPulse") && Random.nextBoolean()){ + RandomEvents.RIVER_TROLL + } else if(currentAction.contains("MiningSkillPulse") && Random.nextBoolean()){ + RandomEvents.ROCK_GOLEM + } else if(currentAction.contains("BoneBuryingOptionPlugin") && Random.nextBoolean()){ + RandomEvents.SHADE + } else { + RandomEvents.values().filter { it.type != "skill" }.random() } event = ame.npc.create(player,ame.loot,ame.type) if (event!!.spawnLocation == null) { @@ -61,14 +67,14 @@ class RandomEventManager(val player: Player) { SystemLogger.logRE("Fired ${event!!.name} for ${player.username}") } - fun init() { - if (player.isArtificial) return - rollNextSpawn() - SystemLogger.logRE("Initialized REManager for ${player.username}") - enabled = true - } - private fun rollNextSpawn() { nextSpawn = GameWorld.ticks + RandomFunction.random(MIN_DELAY_TICKS, MAX_DELAY_TICKS) } + + companion object { + @JvmStatic fun getInstance(player: Player): RandomEventManager? + { + return getAttribute(player, "random-manager", null) + } + } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt index 6e6b084dc..192abefe6 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/RandomEventNPC.kt @@ -37,7 +37,7 @@ abstract class RandomEventNPC(id: Int) : NPC(id) { open fun terminate() { finalized = true pulseManager.clear("amemovement") - player.antiMacroHandler.event = null + RandomEventManager.getInstance(player)!!.event = null if (initialized) { poofClear(this) } diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/MysteriousOldManDialogue.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/MysteriousOldManDialogue.kt index 0518b4852..5a1591a8b 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/MysteriousOldManDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/MysteriousOldManDialogue.kt @@ -1,6 +1,7 @@ package rs09.game.content.ame.events import core.game.node.entity.player.Player +import rs09.game.content.ame.RandomEventManager import rs09.game.content.ame.events.supriseexam.SurpriseExamUtils import rs09.game.content.dialogue.DialogueFile @@ -22,11 +23,11 @@ class MysteriousOldManDialogue(val type: String) : DialogueFile() { 1 -> { end() teleport(player!!,type) - player!!.antiMacroHandler.event?.terminate() + RandomEventManager.getInstance(player!!)?.event?.terminate() } 2 -> { end() - player!!.antiMacroHandler.event?.terminate() + RandomEventManager.getInstance(player!!)?.event?.terminate() } } } diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt index 90f5091ec..98010fc66 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterDialogue.kt @@ -3,6 +3,7 @@ package rs09.game.content.ame.events.certer import api.addItemOrDrop import core.game.component.Component import core.game.node.entity.player.link.emote.Emotes +import rs09.game.content.ame.RandomEventManager import rs09.game.content.dialogue.DialogueFile import rs09.tools.END_DIALOGUE @@ -29,13 +30,13 @@ class CerterDialogue(val initial: Boolean) : DialogueFile() { npc("Sorry, I don't think so.").also { player!!.setAttribute("certer:reward", true) stage = END_DIALOGUE - player!!.antiMacroHandler.event?.terminate() + RandomEventManager.getInstance(player!!)?.event?.terminate() } } else { npc("Thank you, I hope you like your present. I must be", "leaving now though.").also { player!!.setAttribute("certer:reward", true) stage = END_DIALOGUE - player!!.antiMacroHandler.event?.loot!!.roll().forEach { addItemOrDrop(player!!, it.id, it.amount) } + RandomEventManager.getInstance(player!!)!!.event!!.loot!!.roll().forEach { addItemOrDrop(player!!, it.id, it.amount) } } } } @@ -50,7 +51,7 @@ class CerterDialogue(val initial: Boolean) : DialogueFile() { // Wave goodbye npc!!.animate(Emotes.WAVE.animation) // Terminate the event - player!!.antiMacroHandler.event?.terminate() + RandomEventManager.getInstance(player!!)?.event?.terminate() } else { player!!.setAttribute("random:pause", false) } diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterEventInterface.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterEventInterface.kt index 40f20da83..10d5725b4 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterEventInterface.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/certer/CerterEventInterface.kt @@ -3,6 +3,7 @@ package rs09.game.content.ame.events.certer import core.game.node.entity.player.Player import core.game.node.item.Item import org.rs09.consts.Items +import rs09.game.content.ame.RandomEventManager import rs09.game.interaction.InterfaceListener class CerterEventInterface : InterfaceListener() { @@ -36,7 +37,7 @@ class CerterEventInterface : InterfaceListener() { val correctAnswer = player.getAttribute("certer:correctIndex", 0) player.setAttribute("certer:correct", correctAnswer == answer) player.interfaceManager.close() - player.dialogueInterpreter.open(CerterDialogue(false), player.antiMacroHandler.event?.asNpc()) + player.dialogueInterpreter.open(CerterDialogue(false), RandomEventManager.getInstance(player)!!.event?.asNpc()) return@on true } diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/drilldemon/SeargentDamienDialogue.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/drilldemon/SeargentDamienDialogue.kt index 67d9fe549..477b7c2cf 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/drilldemon/SeargentDamienDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/drilldemon/SeargentDamienDialogue.kt @@ -2,6 +2,7 @@ package rs09.game.content.ame.events.drilldemon import core.game.content.dialogue.FacialExpression import core.game.system.task.Pulse +import rs09.game.content.ame.RandomEventManager import rs09.game.content.dialogue.DialogueFile import rs09.tools.END_DIALOGUE import rs09.tools.START_DIALOGUE @@ -9,7 +10,7 @@ import rs09.tools.START_DIALOGUE class SeargentDamienDialogue(val isCorrect: Boolean = false) : DialogueFile() { override fun handle(componentID: Int, buttonID: Int) { var correctAmt = player!!.getAttribute(DrillDemonUtils.DD_CORRECT_COUNTER,0) - if(correctAmt == 4 && player!!.antiMacroHandler.event == null) { + if(correctAmt == 4 && RandomEventManager.getInstance(player!!)!!.event == null) { when(stage){ 0 -> npc(FacialExpression.OLD_NORMAL,"My god you actually did it, you limp","wristed worm-bodied MAGGOT! Take this","and get out of my sight.").also { stage++ } 1 -> { @@ -24,7 +25,7 @@ class SeargentDamienDialogue(val isCorrect: Boolean = false) : DialogueFile() { }) } } - } else if(player!!.antiMacroHandler.event == null){ + } else if(RandomEventManager.getInstance(player!!)!!.event == null){ when(stage){ START_DIALOGUE -> if(isCorrect) npc(FacialExpression.OLD_NORMAL,"Good! Now...").also { stage++ } else npc(FacialExpression.OLD_ANGRY1,"WRONG, MAGGOT!").also { stage++ } 1 -> { @@ -40,12 +41,12 @@ class SeargentDamienDialogue(val isCorrect: Boolean = false) : DialogueFile() { 1 -> { end() DrillDemonUtils.teleport(player!!) - player!!.antiMacroHandler.event?.terminate() + RandomEventManager.getInstance(player!!)!!.event?.terminate() stage = END_DIALOGUE } 2 -> { end() - player!!.antiMacroHandler.event?.terminate() + RandomEventManager.getInstance(player!!)!!.event?.terminate() stage = END_DIALOGUE } } diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/genie/GenieDialogue.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/genie/GenieDialogue.kt index 60e6a1d30..0b391510c 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/genie/GenieDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/genie/GenieDialogue.kt @@ -7,6 +7,7 @@ import core.game.component.Component import core.game.node.entity.combat.ImpactHandler import core.game.node.item.GroundItemManager import core.game.node.item.Item +import rs09.game.content.ame.RandomEventManager import rs09.game.content.dialogue.DialogueFile import rs09.tools.END_DIALOGUE @@ -15,7 +16,7 @@ class GenieDialogue : DialogueFile() { val assigned = player!!.getAttribute("genie:item",0) npcl(FacialExpression.NEUTRAL, "Ah, so you are there, ${player!!.name.capitalize()}. I'm so glad you summoned me. Please take this lamp and make your wish.") addItemOrDrop(player!!, assigned) - player!!.antiMacroHandler.event?.terminate() + RandomEventManager.getInstance(player!!)!!.event?.terminate() stage = END_DIALOGUE } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/sandwichlady/SandwichLadyDialogue.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/sandwichlady/SandwichLadyDialogue.kt index 289c77de4..96e1a76e1 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/sandwichlady/SandwichLadyDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/sandwichlady/SandwichLadyDialogue.kt @@ -5,6 +5,7 @@ import core.game.component.Component import core.game.node.entity.combat.ImpactHandler import core.game.node.item.GroundItemManager import core.game.node.item.Item +import rs09.game.content.ame.RandomEventManager import rs09.game.content.dialogue.DialogueFile import rs09.tools.END_DIALOGUE @@ -26,13 +27,13 @@ class SandwichLadyDialogue(val isChoice: Boolean) : DialogueFile() { 0 -> if(choice != assigned){ npc!!.sendChat("That's not what I said you could have!") player!!.impactHandler.manualHit(npc,3,ImpactHandler.HitsplatType.NORMAL) - player!!.antiMacroHandler.event?.terminate() + RandomEventManager.getInstance(player!!)!!.event?.terminate() } else { npc("Here you are, dear. I hope you enjoy it!") if(!player!!.inventory.add(Item(assigned))){ GroundItemManager.create(Item(assigned),player) } - player!!.antiMacroHandler.event?.terminate() + RandomEventManager.getInstance(player!!)!!.event?.terminate() stage = END_DIALOGUE } } diff --git a/Server/src/main/kotlin/rs09/game/content/ame/events/sandwichlady/SandwichLadyInterface.kt b/Server/src/main/kotlin/rs09/game/content/ame/events/sandwichlady/SandwichLadyInterface.kt index 231eaefa0..0abce4b1c 100644 --- a/Server/src/main/kotlin/rs09/game/content/ame/events/sandwichlady/SandwichLadyInterface.kt +++ b/Server/src/main/kotlin/rs09/game/content/ame/events/sandwichlady/SandwichLadyInterface.kt @@ -2,6 +2,7 @@ package rs09.game.content.ame.events.sandwichlady import core.game.node.item.Item import org.rs09.consts.Items +import rs09.game.content.ame.RandomEventManager import rs09.game.interaction.InterfaceListener class SandwichLadyInterface : InterfaceListener(){ @@ -31,7 +32,7 @@ class SandwichLadyInterface : InterfaceListener(){ player.setAttribute("sandwich-lady:choice",item.id) player.interfaceManager.close() - player.dialogueInterpreter.open(SandwichLadyDialogue(true),player.antiMacroHandler.event) + player.dialogueInterpreter.open(SandwichLadyDialogue(true), RandomEventManager.getInstance(player)!!.event) return@on true } } diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SirsalBankerDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SirsalBankerDialogue.kt index 68b49d0a0..2c5c15d13 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SirsalBankerDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/lunarisle/SirsalBankerDialogue.kt @@ -7,6 +7,7 @@ import core.game.node.entity.player.Player import core.plugin.Initializable import org.rs09.consts.Items import org.rs09.consts.NPCs +import rs09.game.ge.GrandExchangeRecords /** * @author qmqz @@ -37,7 +38,7 @@ class SirsalBankerDialogue(player: Player? = null) : DialoguePlugin(player){ 1 -> when (buttonId) { 1 -> end().also { player.bank.open() } 2 -> end().also { player.bankPinManager.openSettings() } - 3 -> end().also { player.exchangeRecords.openCollectionBox() } + 3 -> end().also { GrandExchangeRecords.getInstance(player).openCollectionBox() } 4 -> player(FacialExpression.HALF_ASKING, "What is this place?").also { stage = 5 } } diff --git a/Server/src/main/kotlin/rs09/game/content/global/action/EquipHandler.kt b/Server/src/main/kotlin/rs09/game/content/global/action/EquipHandler.kt index df3f3ec32..ac25bf1bd 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/action/EquipHandler.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/action/EquipHandler.kt @@ -1,6 +1,7 @@ package rs09.game.content.global.action import core.game.container.impl.EquipmentContainer +import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager import core.game.node.Node import core.game.node.entity.combat.equipment.WeaponInterface import core.game.node.entity.player.Player @@ -62,7 +63,7 @@ class EquipHandler : InteractionListener() { //check if a brawling glove is being equipped and register it if (item.id in 13845..13857) { player.debug("Registering gloves... ID: " + item.id) - player.brawlingGlovesManager.registerGlove(item.id) + BrawlingGlovesManager.getInstance(player).registerGlove(item.id) } if (item.id == Items.BLACK_CHAINBODY_1107 && player.getAttribute("diary:falador:black-chain-bought", false) && ZoneBorders(2969, 3310, 2975, 3314, 0).insideBorder(player) diff --git a/Server/src/main/kotlin/rs09/game/content/tutorial/TutorialLoginCheck.kt b/Server/src/main/kotlin/rs09/game/content/tutorial/TutorialLoginCheck.kt index c602c4940..9950d5e2b 100644 --- a/Server/src/main/kotlin/rs09/game/content/tutorial/TutorialLoginCheck.kt +++ b/Server/src/main/kotlin/rs09/game/content/tutorial/TutorialLoginCheck.kt @@ -17,7 +17,7 @@ class TutorialLoginCheck : LoginListener { setAttribute(player, "/save:tutorial:complete", true) return } - GameWorld.Pulser.submit(object : Pulse() { + GameWorld.Pulser.submit(object : Pulse(2) { override fun pulse(): Boolean { TutorialStage.load(player, getAttribute(player, "tutorial:stage", 0), true) return true diff --git a/Server/src/main/kotlin/rs09/game/ge/GrandExchange.kt b/Server/src/main/kotlin/rs09/game/ge/GrandExchange.kt index bd9667eaa..3a364e54f 100644 --- a/Server/src/main/kotlin/rs09/game/ge/GrandExchange.kt +++ b/Server/src/main/kotlin/rs09/game/ge/GrandExchange.kt @@ -214,7 +214,7 @@ class GrandExchange : StartupListener { offer.playerUID = player.details.uid offer.offerState = OfferState.REGISTERED - //player.exchangeRecords.update(offer) + //GrandExchangeRecords.getInstance(player).update(offer) if (offer.sell) { Repository.sendNews(player.username + " just offered " + offer.amount + " " + getItemName(offer.itemID) + " on the GE.") @@ -257,10 +257,10 @@ class GrandExchange : StartupListener { seller.update() val sellerPlayer = Repository.uid_map[seller.playerUID] - sellerPlayer?.exchangeRecords?.visualizeRecords() + GrandExchangeRecords.getInstance(sellerPlayer).visualizeRecords() buyer.update() val buyerPlayer = Repository.uid_map[buyer.playerUID] - buyerPlayer?.exchangeRecords?.visualizeRecords() + GrandExchangeRecords.getInstance(buyerPlayer).visualizeRecords() } fun getValidOffers(): List diff --git a/Server/src/main/kotlin/rs09/game/ge/GrandExchangeRecords.kt b/Server/src/main/kotlin/rs09/game/ge/GrandExchangeRecords.kt index afe2e6c6e..261f9dd13 100644 --- a/Server/src/main/kotlin/rs09/game/ge/GrandExchangeRecords.kt +++ b/Server/src/main/kotlin/rs09/game/ge/GrandExchangeRecords.kt @@ -41,15 +41,59 @@ import java.util.* * @author Angle */ -class GrandExchangeRecords(private val player: Player) { +class GrandExchangeRecords(private val player: Player? = null) : PersistPlayer, LoginListener { var history = arrayOfNulls(5) val offerRecords = arrayOfNulls(6) + override fun login(player: Player) { + val instance = GrandExchangeRecords(player) + instance.init() + player.setAttribute("ge-records", instance) + } + + override fun parsePlayer(player: Player, data: JSONObject) { + /** + * Parse history from JSON + */ + val historyRaw = data["ge-history"] + if(historyRaw != null){ + val history = historyRaw as JSONArray + for (i in history.indices) { + val offer = history[i] as JSONObject + val o = GrandExchangeOffer() + o.itemID = offer["itemId"].toString().toInt() + o.sell = offer["isSell"] as Boolean + o.totalCoinExchange = (offer["totalCoinExchange"].toString().toInt()) + o.completedAmount = (offer["completedAmount"].toString().toInt()) + getInstance(player).history[i] = o + } + } + } + + override fun savePlayer(player: Player, save: JSONObject) { + /** + * Save history to JSON + */ + val history = JSONArray() + getInstance(player).history.map { + if(it != null){ + val historyEntry = JSONObject() + historyEntry["isSell"] = it.sell + historyEntry["itemId"] = it.itemID.toString() + historyEntry["totalCoinExchange"] = it.totalCoinExchange.toString() + historyEntry["completedAmount"] = it.completedAmount.toString() + history.add(historyEntry) + SystemLogger.logInfo("Adding history entry for ${it.itemID}") + } + } + save["ge-history"] = history + } + /** * Opens the collection box. */ fun openCollectionBox() { - if (!player.bankPinManager.isUnlocked) { + if (!player!!.bankPinManager.isUnlocked) { player.bankPinManager.openType(3) return } @@ -143,7 +187,7 @@ class GrandExchangeRecords(private val player: Player) { */ val conn = GEDB.connect() val stmt = conn.createStatement() - val offer_records = stmt.executeQuery("SELECT * from player_offers where player_uid = ${player.details.uid} AND offer_state < 6") + val offer_records = stmt.executeQuery("SELECT * from player_offers where player_uid = ${player!!.details.uid} AND offer_state < 6") val needsIndex = ArrayDeque() @@ -175,23 +219,6 @@ class GrandExchangeRecords(private val player: Player) { } visualizeRecords() - - /** - * Parse history from JSON - */ - val historyRaw = geData["history"] - if(historyRaw != null){ - val history = historyRaw as JSONArray - for (i in history.indices) { - val offer = history[i] as JSONObject - var o = GrandExchangeOffer() - o.itemID = offer["itemId"].toString().toInt() - o.sell = offer["isSell"] as Boolean - o.totalCoinExchange = (offer["totalCoinExchange"].toString().toInt()) - o.completedAmount = (offer["completedAmount"].toString().toInt()) - history[i] = o - } - } } /** @@ -210,7 +237,7 @@ class GrandExchangeRecords(private val player: Player) { } } if (updated) { - sendMessage(player, "You have items from the Grand Exchange waiting in your collection box.") + sendMessage(player!!, "You have items from the Grand Exchange waiting in your collection box.") } } @@ -242,4 +269,11 @@ class GrandExchangeRecords(private val player: Player) { } data class OfferRecord(val uid: Long, val slot: Int) + + companion object { + @JvmStatic fun getInstance(player: Player? = null): GrandExchangeRecords + { + return player?.getAttribute("ge-records", GrandExchangeRecords()) ?: GrandExchangeRecords() + } + } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/QCRepository.kt b/Server/src/main/kotlin/rs09/game/interaction/QCRepository.kt index 6bc7547d2..25e19c175 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/QCRepository.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/QCRepository.kt @@ -11,6 +11,7 @@ import core.game.world.update.flag.context.ChatMessage import core.game.world.update.flag.player.ChatFlag import core.net.amsc.MSPacketRepository import core.net.amsc.WorldCommunicator +import rs09.game.node.entity.skill.slayer.SlayerManager import rs09.game.world.GameWorld.Pulser import rs09.net.packet.`in`.QCPacketType import java.nio.ByteBuffer @@ -114,8 +115,8 @@ object QCRepository { //My current slayer assignment is else if(qcString.contains("My current Slayer assignment is")){ - val amount = player?.slayer?.amount - val taskName = NPCDefinition.forId(player?.slayer?.task?.ids?.get(0) ?: 0).name.toLowerCase() + val amount = SlayerManager.getInstance(player!!).amount + val taskName = NPCDefinition.forId(SlayerManager.getInstance(player!!).task?.ids?.get(0) ?: 0).name.toLowerCase() if(amount ?: 0 > 0){ qcString = qcString.replace("complete", "$amount $taskName") } diff --git a/Server/src/main/kotlin/rs09/game/interaction/inter/ge/StockMarket.kt b/Server/src/main/kotlin/rs09/game/interaction/inter/ge/StockMarket.kt index eeecedd03..c5be8baf6 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/inter/ge/StockMarket.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/inter/ge/StockMarket.kt @@ -92,7 +92,7 @@ class StockMarket : InterfaceListener() { on(Components.STOCKMARKET_105){player, _, op, button, _, _ -> val tempOffer = getAttribute(player, "ge-temp", GrandExchangeOffer()) var openedIndex = getAttribute(player, "ge-index", -1) - var openedOffer = player.exchangeRecords.getOffer(openedIndex) + var openedOffer = GrandExchangeRecords.getInstance(player).getOffer(openedIndex) when(button) { @@ -105,19 +105,19 @@ class StockMarket : InterfaceListener() { 203 -> abortOffer(player, openedOffer) 18,34,50,69,88,107 -> { openedIndex = (button - 18) shr 4 - openedOffer = player.exchangeRecords.getOffer(openedIndex) + openedOffer = GrandExchangeRecords.getInstance(player).getOffer(openedIndex) if(op == 205) abortOffer(player, openedOffer) else updateVarbits(player, openedOffer, openedIndex) } 30,46,62,81,100,119 -> { openedIndex = (button - 30) shr 4 - openedOffer = player.exchangeRecords.getOffer(openedIndex) + openedOffer = GrandExchangeRecords.getInstance(player).getOffer(openedIndex) updateVarbits(player, openedOffer, openedIndex) player.interfaceManager.openChatbox(Components.OBJDIALOG_389) } 31,47,63,82,101,120 -> { openedIndex = (button - 31) shr 4 - openedOffer = player.exchangeRecords.getOffer(openedIndex) + openedOffer = GrandExchangeRecords.getInstance(player).getOffer(openedIndex) updateVarbits(player, openedOffer, openedIndex, true) player.interfaceManager.openSingleTab(Component(Components.STOCKSIDE_107)).open(player) player.packetDispatch.sendRunScript( @@ -257,7 +257,7 @@ class StockMarket : InterfaceListener() { } if(GrandExchange.dispatch(player, offer)) { - player.exchangeRecords.offerRecords[offer.index] = GrandExchangeRecords.OfferRecord(offer.uid,offer.index) + GrandExchangeRecords.getInstance(player).offerRecords[offer.index] = GrandExchangeRecords.OfferRecord(offer.uid,offer.index) player.removeAttribute("ge-temp") } else @@ -276,7 +276,7 @@ class StockMarket : InterfaceListener() { } if(GrandExchange.dispatch(player, offer) && removeItem(player, Item(995, total))) { - player.exchangeRecords.offerRecords[offer.index] = GrandExchangeRecords.OfferRecord(offer.uid, offer.index) + GrandExchangeRecords.getInstance(player).offerRecords[offer.index] = GrandExchangeRecords.OfferRecord(offer.uid, offer.index) player.removeAttribute("ge-temp") } } @@ -371,10 +371,10 @@ class StockMarket : InterfaceListener() { { val newHistory = arrayOfNulls(5) newHistory[0] = offer - System.arraycopy(player.exchangeRecords.history, 0, newHistory, 1, 4) - player.exchangeRecords.history = newHistory + System.arraycopy(GrandExchangeRecords.getInstance(player).history, 0, newHistory, 1, 4) + GrandExchangeRecords.getInstance(player).history = newHistory } - player.exchangeRecords.offerRecords[offer.index] = null + GrandExchangeRecords.getInstance(player).offerRecords[offer.index] = null toMainInterface(player) } offer.update() diff --git a/Server/src/main/kotlin/rs09/game/interaction/npc/NPCTalkListener.kt b/Server/src/main/kotlin/rs09/game/interaction/npc/NPCTalkListener.kt index fd97dae38..f57baf216 100644 --- a/Server/src/main/kotlin/rs09/game/interaction/npc/NPCTalkListener.kt +++ b/Server/src/main/kotlin/rs09/game/interaction/npc/NPCTalkListener.kt @@ -1,8 +1,10 @@ package rs09.game.interaction.npc +import core.game.content.quest.miniquest.barcrawl.BarcrawlManager import core.game.content.quest.miniquest.barcrawl.BarcrawlType import core.game.node.entity.npc.NPC import rs09.game.content.activity.gnomecooking.* +import rs09.game.content.ame.RandomEventManager import rs09.game.content.ame.RandomEvents import rs09.game.interaction.InteractionListener import rs09.game.system.SystemLogger @@ -19,8 +21,8 @@ class NPCTalkListener : InteractionListener() { on(barCrawlNPCs, NPC, "talk-to", "talk"){player, node -> val type = BarcrawlType.forId(node.id) - - if (player.barcrawlManager.isFinished || !player.barcrawlManager.isStarted || player.barcrawlManager.isCompleted(type!!.ordinal)) { + val instance = BarcrawlManager.getInstance(player) + if (instance.isFinished || !instance.isStarted || instance.isCompleted(type!!.ordinal)) { player.dialogueInterpreter.open(node.id, node) } else { player.dialogueInterpreter.open("barcrawl dialogue", node.id, type) @@ -31,10 +33,10 @@ class NPCTalkListener : InteractionListener() { on(NPC,"talk-to","talk","talk to"){player,node -> val npc = node.asNpc() if(RandomEvents.randomIDs.contains(node.id)){ - if(player.antiMacroHandler.event == null || player.antiMacroHandler.event!!.id != node.id){ + if(RandomEventManager.getInstance(player)!!.event == null || RandomEventManager.getInstance(player)!!.event!!.id != node.id){ player.sendMessage("They aren't interested in talking to you.") } else { - player.antiMacroHandler.event!!.talkTo(node.asNpc()) + RandomEventManager.getInstance(player)!!.event!!.talkTo(node.asNpc()) } return@on true } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MeleeSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MeleeSwingHandler.kt index 87131ed2a..4e7624777 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MeleeSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MeleeSwingHandler.kt @@ -19,6 +19,7 @@ import core.game.world.map.path.Pathfinder import core.tools.RandomFunction import rs09.game.node.entity.combat.CombatSwingHandler import rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks +import rs09.game.node.entity.skill.slayer.SlayerManager import kotlin.math.ceil import kotlin.math.floor @@ -146,7 +147,7 @@ open class MeleeSwingHandler val amuletName = (if(entity is Player) getItemFromEquipment(entity, EquipmentSlot.AMULET)?.name ?: "null" else "null").toLowerCase() val victimName = entity.properties.combatPulse.getVictim()?.name ?: "none" - if(entity is Player && entity.slayer.task?.ids?.contains((entity.properties.combatPulse?.getVictim()?.id ?: 0)) == true) + if(entity is Player && SlayerManager.getInstance(entity).task?.ids?.contains((entity.properties.combatPulse?.getVictim()?.id ?: 0)) == true) effectiveAttackLevel *= SlayerEquipmentFlags.getDamAccBonus(entity) //Slayer Helm/ Black Mask/ Slayer cape else if (entity is Player //Salve amulet @@ -179,7 +180,7 @@ open class MeleeSwingHandler cumulativeStr *= getSetMultiplier(entity, Skills.STRENGTH) - if(entity is Player && entity.slayer.task?.ids?.contains((entity.properties.combatPulse?.getVictim()?.id ?: 0)) == true) + if(entity is Player && SlayerManager.getInstance(entity).task?.ids?.contains((entity.properties.combatPulse?.getVictim()?.id ?: 0)) == true) cumulativeStr *= SlayerEquipmentFlags.getDamAccBonus(entity) //Slayer helm/black mask/skillcape /*val hit = (16 + cumulativeStr + bonus / 8 + cumulativeStr * bonus * 0.016865) * modifier diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/LoginParser.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/LoginParser.kt index 881d369bd..c048c16ce 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/LoginParser.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/LoginParser.kt @@ -1,5 +1,6 @@ package rs09.game.node.entity.player.info.login +import api.LoginListener import core.game.node.entity.player.Player import core.game.node.entity.player.info.PlayerDetails import core.game.node.entity.player.info.login.LoginConfiguration @@ -14,10 +15,12 @@ import core.net.amsc.ManagementServerState import core.net.amsc.WorldCommunicator import rs09.game.system.SystemLogger import rs09.game.world.GameWorld +import rs09.game.world.GameWorld.loginListeners import rs09.game.world.repository.Repository import java.util.concurrent.TimeUnit import java.util.concurrent.locks.Lock import java.util.concurrent.locks.ReentrantLock +import java.util.function.Consumer /** * Parses the login of a player. @@ -105,14 +108,21 @@ class LoginParser( reconnect(player, type) return } - if(!PlayerParser.parse(player)){ + try { + val parser = PlayerParser.parse(player) + ?: throw IllegalStateException("Failed parsing save for: " + player.username) //Parse core + loginListeners.forEach(Consumer { listener: LoginListener -> listener.login(player) }) //Run our login hooks + parser.runContentHooks() //Run our saved-content-parsing hooks + } + catch (e: Exception) + { + e.printStackTrace() Repository.removePlayer(player) Repository.LOGGED_IN_PLAYERS.remove(player.username) Repository.lobbyPlayers.remove(player) Repository.playerNames.remove(player.name) MSPacketRepository.sendPlayerRemoval(player.name) flag(Response.ERROR_LOADING_PROFILE) - return } //Repository.getPlayerNames().put(player.getName(), player); GameWorld.Pulser.submit(object : Pulse(1) { @@ -141,8 +151,12 @@ class LoginParser( } } catch (t: Throwable) { t.printStackTrace() + Repository.removePlayer(player) + Repository.LOGGED_IN_PLAYERS.remove(player.username) + Repository.lobbyPlayers.remove(player) Repository.playerNames.remove(player.name) MSPacketRepository.sendPlayerRemoval(player.name) + flag(Response.ERROR_LOADING_PROFILE) } return true } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt index f8fa06402..89bf80c19 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaveParser.kt @@ -1,5 +1,6 @@ package rs09.game.node.entity.player.info.login +import api.PersistPlayer import core.game.interaction.item.brawling_gloves.BrawlingGloves import core.game.node.entity.combat.CombatSpell import core.game.node.entity.player.Player @@ -18,6 +19,7 @@ import rs09.game.node.entity.skill.farming.CompostBins import rs09.game.node.entity.skill.farming.FarmingPatch import rs09.game.system.SystemLogger import rs09.game.world.GameWorld +import java.io.File import java.io.FileReader import java.util.* @@ -27,8 +29,11 @@ import java.util.* * @param player: The player we are parsing. */ class PlayerSaveParser(val player: Player) { + companion object { + val contentHooks = ArrayList() + } var parser = JSONParser() - var reader: FileReader? = FileReader(ServerConstants.PLAYER_SAVE_PATH + player.name + ".json") + var reader: FileReader? = null var saveFile: JSONObject? = null var read = true @@ -36,8 +41,12 @@ class PlayerSaveParser(val player: Player) { val bin_varps = CompostBins.values().map { it.varpIndex }.toIntArray() init { - reader - ?: SystemLogger.logWarn("Couldn't find save file for ${player.name}, or save is corrupted.").also { read = false } + val JSON = File(ServerConstants.PLAYER_SAVE_PATH + player.name + ".json") + if(JSON.exists()) + { + reader = FileReader(JSON) + } + reader ?: SystemLogger.logWarn("Couldn't find save file for ${player.name}, or save is corrupted.").also { read = false } if (read) { saveFile = parser.parse(reader) as JSONObject } @@ -45,48 +54,40 @@ class PlayerSaveParser(val player: Player) { fun parse() = GlobalScope.launch { if (read) { - launch { - parseCore() - parseAttributes() - parseSkills() - parseSettings() - parseSlayer() - parseQuests() - parseAppearance() - parseGrave() - parseVarps() - parseStates() - } - launch { - parseSpellbook() - parseGrandExchange() - parseSavedData() - parseAutocastSpell() - parseFarming() - parseConfigs() - parseMonitor() - } - launch { - parseMusic() - parseFamiliars() - parseBarCrawl() - parseAntiMacro() - parseTT() - parseBankPin() - } - launch { - parseHouse() - parseIronman() - parseEmoteManager() - parseStatistics() - parseBrawlingGloves() - parseAchievements() - parsePouches() - } + parseCore() + parseAttributes() + parseSkills() + parseSettings() + parseQuests() + parseAppearance() + parseGrave() + parseVarps() + parseStates() + parseSpellbook() + parseSavedData() + parseAutocastSpell() + parseFarming() + parseConfigs() + parseMonitor() + parseMusic() + parseFamiliars() + parseBankPin() + parseHouse() + parseIronman() + parseEmoteManager() + parseStatistics() + parseAchievements() + parsePouches() parsePouches() } } + fun runContentHooks() + { + if(read) + contentHooks.forEach{it.parsePlayer(player, saveFile!!)} + } + fun parseVarps(){ if(saveFile!!.containsKey("varps")) player.varpManager.parse(saveFile!!["varps"] as JSONArray) @@ -127,16 +128,6 @@ class PlayerSaveParser(val player: Player) { } } - fun parseBrawlingGloves() { - if (saveFile!!.containsKey("brawlingGloves")) { - val bgData: JSONArray = saveFile!!["brawlingGloves"] as JSONArray - for (bg in bgData) { - val glove = bg as JSONObject - player.brawlingGlovesManager.registerGlove(BrawlingGloves.forIndicator(glove.get("gloveId").toString().toInt()).id, glove.get("charges").toString().toInt()) - } - } - } - fun parseStatistics() { if (saveFile!!.containsKey("statistics")) { val stats: JSONArray = saveFile!!["statistics"] as JSONArray @@ -186,14 +177,6 @@ class PlayerSaveParser(val player: Player) { player.bankPinManager.parse(bpData) } - fun parseTT() { - val ttData = saveFile!!["treasureTrails"] as JSONObject - player.treasureTrailManager.parse(ttData) - } - - fun parseAntiMacro() { - } - fun parseStates() { player.states.clear() SystemLogger.logErr("Parsing states") @@ -211,11 +194,6 @@ class PlayerSaveParser(val player: Player) { } } - fun parseBarCrawl() { - val barCrawlData = saveFile!!["barCrawl"] as JSONObject - player.barcrawlManager.parse(barCrawlData) - } - fun parseFamiliars() { val familiarData = saveFile!!["familiarManager"] as JSONObject player.familiarManager.parse(familiarData) @@ -301,14 +279,6 @@ class PlayerSaveParser(val player: Player) { player.savedData.globalData.parse(globalData) } - fun parseGrandExchange() { - val geData: Any? = saveFile!!["grand_exchange"] - if (geData != null) { - player.exchangeRecords.parse(geData as JSONObject) - } - - } - fun parseSpellbook() { val spellbookData = (saveFile!!["spellbook"] as String).toInt() player.spellBookManager.setSpellBook(SpellBookManager.SpellBook.forInterface(spellbookData)) @@ -332,12 +302,6 @@ class PlayerSaveParser(val player: Player) { player.questRepository.parse(questData) } - fun parseSlayer() { - saveFile ?: return - val slayerData = saveFile!!["slayer"] as JSONObject - player.slayer.parse(slayerData) - } - fun parseCore() { saveFile ?: return val coreData = saveFile!!["core_data"] as JSONObject diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaver.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaver.kt index c297f0573..cd75513c6 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaver.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/info/login/PlayerSaver.kt @@ -1,5 +1,6 @@ package rs09.game.node.entity.player.info.login +import api.PersistPlayer import core.game.container.Container import core.game.interaction.item.brawling_gloves.BrawlingGloves import core.game.node.entity.player.Player @@ -28,51 +29,36 @@ import javax.script.ScriptEngineManager * @author Ceikry */ class PlayerSaver (val player: Player){ - private fun populate(): JSONObject = runBlocking{ + companion object { + val contentHooks = ArrayList() + } + private fun populate(): JSONObject { val saveFile = JSONObject() - val a = launch { - saveCoreData(saveFile) - saveSkills(saveFile) - saveSettings(saveFile) - saveSlayer(saveFile) - saveQuests(saveFile) - saveAppearance(saveFile) - saveSpellbook(saveFile) - saveVarps(saveFile) - } - val b = launch { - saveGraveType(saveFile) - saveGrandExchangeData(saveFile) - saveSavedData(saveFile) - saveAutocast(saveFile) - saveFarming(saveFile) - saveConfigs(saveFile) - savePlayerMonitor(saveFile) - } - val c = launch { - saveMusicPlayer(saveFile) - saveFamiliarManager(saveFile) - saveBarCrawl(saveFile) - saveStateManager(saveFile) - saveAntiMacroHandler(saveFile) - saveTreasureTrails(saveFile) - saveBankPinData(saveFile) - } - val d = launch { - saveHouseData(saveFile) - saveAchievementData(saveFile) - saveIronManData(saveFile) - saveEmoteData(saveFile) - saveStatManager(saveFile) - saveBrawlingGloves(saveFile) - saveAttributes(saveFile) - } - a.join() - b.join() - c.join() - d.join() + saveCoreData(saveFile) + saveSkills(saveFile) + saveSettings(saveFile) + saveQuests(saveFile) + saveAppearance(saveFile) + saveSpellbook(saveFile) + saveVarps(saveFile) + saveGraveType(saveFile) + saveSavedData(saveFile) + saveAutocast(saveFile) + saveConfigs(saveFile) + savePlayerMonitor(saveFile) + saveMusicPlayer(saveFile) + saveFamiliarManager(saveFile) + saveStateManager(saveFile) + saveBankPinData(saveFile) + saveHouseData(saveFile) + saveAchievementData(saveFile) + saveIronManData(saveFile) + saveEmoteData(saveFile) + saveStatManager(saveFile) + saveAttributes(saveFile) savePouches(saveFile) - saveFile + contentHooks.forEach { it.savePlayer(player, saveFile) } + return saveFile } fun save() = runBlocking { val manager = ScriptEngineManager() @@ -138,19 +124,6 @@ class PlayerSaver (val player: Player){ } } - fun saveBrawlingGloves(root: JSONObject){ - if(player.brawlingGlovesManager.GloveCharges.isNotEmpty()){ - val brawlingGloves = JSONArray() - player.brawlingGlovesManager.GloveCharges.map { - val brawlingGlove = JSONObject() - brawlingGlove.put("gloveId",BrawlingGloves.forId(it.key).indicator.toString()) - brawlingGlove.put("charges",it.value.toString()) - brawlingGloves.add(brawlingGlove) - } - root.put("brawlingGloves",brawlingGloves) - } - } - fun saveStatManager(root: JSONObject){ val statistics = JSONArray() var index = 0 @@ -277,33 +250,6 @@ class PlayerSaver (val player: Player){ root.put("bankPinManager",bankPinManager) } - fun saveTreasureTrails(root: JSONObject){ - val treasureTrailManager = JSONObject() - if(player.treasureTrailManager.hasTrail()){ - val trail = JSONObject() - trail.put("clueId",player.treasureTrailManager.clueId.toString()) - trail.put("length",player.treasureTrailManager.trailLength.toString()) - trail.put("stage",player.treasureTrailManager.trailStage.toString()) - treasureTrailManager.put("trail",trail) - } - val completedClues = JSONArray() - player.treasureTrailManager.completedClues.map { - completedClues.add(it.toString()) - } - treasureTrailManager.put("completedClues",completedClues) - root.put("treasureTrails",treasureTrailManager) - } - - fun saveAntiMacroHandler(root: JSONObject){ - /*if(player.antiMacroHandler.isSaveRequired){ - val antiMacroEvent = JSONObject() - if(player.antiMacroHandler.hasEvent()){ - antiMacroEvent.put("eventName",player.antiMacroHandler.event.name) - root.put("antiMacroEvent",antiMacroEvent) - } - }*/ - } - fun saveStateManager(root: JSONObject){ val states = JSONArray() player.states.forEach{key,clazz -> @@ -317,17 +263,6 @@ class PlayerSaver (val player: Player){ root.put("states",states) } - fun saveBarCrawl(root: JSONObject){ - val barCrawl = JSONObject() - barCrawl.put("started",player.barcrawlManager.isStarted) - val barsVisited = JSONArray() - player.barcrawlManager.bars.map { - barsVisited.add(it) - } - barCrawl.put("bars",barsVisited) - root.put("barCrawl",barCrawl) - } - fun saveFamiliarManager(root: JSONObject){ val familiarManager = JSONObject() val petDetails = JSONArray() @@ -395,56 +330,6 @@ class PlayerSaver (val player: Player){ root.put("configs",configs) } - fun saveFarming(root: JSONObject){ - /*val farming = JSONObject() - if(player.farmingManager.equipment.container.itemCount() != 0) { - val equipment = saveContainer(player.farmingManager.equipment.container) - farming.put("equipment",equipment) - } - if(player.farmingManager.compostManager.bins.size != 0){ - val bins = JSONArray() - player.farmingManager.compostManager.bins.map { compostBin -> - val bin = JSONObject() - bin.put("wrapperId",compostBin.wrapperId.toString()) - if(compostBin.timeStamp != 0L){ - bin.put("timeStamp",compostBin.timeStamp.toString()) - } - if(compostBin.compostLevel > 0) { - bin.put("compostLevel",compostBin.compostLevel.toString()) - } - if(compostBin.container.itemCount() > 0) { - val compostContainer = saveContainer(compostBin.container) - bin.put("compostContainer", compostContainer) - } - bins.add(bin) - } - farming.put("bins",bins) - player.farmingManager.seedlingManager.save(farming) - } - - if(player.farmingManager.patches.size != 0){ - val wrappers = JSONArray() - player.farmingManager.patches.map { - val wrapper = JSONObject() - wrapper.put("wrapperId",it.wrapperId.toString()) - if(player.farmingManager.amuletBoundWrapper == player.farmingManager.getPatchWrapper(it.wrapperId)) - farming.put("farmingAmuletWrapperID",it.wrapperId) - val cycle = JSONObject() - cycle.put("compostThreshold",it.cycle.compostThreshold.toString()) - cycle.put("growthTime",it.cycle.growthTime.toString()) - cycle.put("harvestAmount",it.cycle.harvestAmount.toString()) - cycle.put("protection",it.cycle.isProtected) - wrapper.put("cycle",cycle) - if(it.node != null){ - wrapper.put("nodeId",it.patch.getNodePosition(it.node).toString()) - } - wrappers.add(wrapper) - } - farming.put("wrappers",wrappers) - } - root.put("farming",farming)*/ - } - fun saveAutocast(root: JSONObject){ player.properties.autocastSpell ?: return val spell = JSONObject() @@ -631,36 +516,6 @@ class PlayerSaver (val player: Player){ root.put("activityData",activityData) } - - fun saveGrandExchangeData(root: JSONObject){ - val grandExchange = JSONObject() - if(player.exchangeRecords.hasActiveOffer()){ - val offers = JSONArray() - player.exchangeRecords.offerRecords.map { - if(it != null){ - val offer = JSONObject() - offer["index"] = it.slot.toString() - offer["uid"] = it.uid.toString() - offers.add(offer) - } - } - grandExchange["offers"] = offers - } - val history = JSONArray() - player.exchangeRecords.history.map { - if(it != null){ - val historyEntry = JSONObject() - historyEntry["isSell"] = it.sell - historyEntry["itemId"] = it.itemID.toString() - historyEntry["totalCoinExchange"] = it.totalCoinExchange.toString() - historyEntry["completedAmount"] = it.completedAmount.toString() - history.add(historyEntry) - } - } - grandExchange["history"] = history - root["grand_exchange"] = grandExchange - } - fun saveGraveType(root: JSONObject){ root.put("grave_type",player.graveManager.type.ordinal.toString()) } @@ -697,24 +552,6 @@ class PlayerSaver (val player: Player){ root.put("quests",quests) } - fun saveSlayer(root: JSONObject){ - val slayer = JSONObject() - val slayerManager = player.slayer - if(slayerManager.removed.isNotEmpty()) { - val removedTasks = JSONArray() - slayerManager.removed.map { - removedTasks.add(it.ordinal.toString()) - } - slayer.put("removedTasks",removedTasks) - } - slayer.put("taskStreak",slayerManager.flags.taskStreak.toString()) - slayer.put("totalTasks",slayerManager.flags.completedTasks.toString()) - slayer.put("equipmentFlags",slayerManager.flags.equipmentFlags) - slayer.put("taskFlags", slayerManager.flags.taskFlags) - slayer.put("rewardFlags", slayerManager.flags.rewardFlags) - root.put("slayer",slayer) - } - fun saveSettings(root: JSONObject){ val settings = JSONObject() settings.put("brightness",player.settings.brightness.toString()) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/info/stats/StatsCommandSet.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/info/stats/StatsCommandSet.kt index ebf1e8cd6..7ab9afc06 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/info/stats/StatsCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/info/stats/StatsCommandSet.kt @@ -2,12 +2,14 @@ package rs09.game.node.entity.player.info.stats import core.game.component.Component import core.game.content.global.BossKillCounter +import core.game.content.ttrail.TreasureTrailManager import core.game.node.entity.player.Player import core.plugin.Initializable import org.rs09.consts.Items; import org.rs09.consts.NPCs; import rs09.game.content.global.GlobalKillCounter; import rs09.game.interaction.InterfaceListener +import rs09.game.node.entity.skill.slayer.SlayerManager import rs09.game.system.command.Command import rs09.game.system.command.Privilege import rs09.game.system.command.sets.CommandSet @@ -38,11 +40,11 @@ fun sendStats(player: Player, other: Player, page: Int){ 0 -> { when(i) { //Various stats - 97 -> sendLine(player,"Easy Clues: ${other.treasureTrailManager.completedClues[0]}",i) - 68 -> sendLine(player,"Medium Clues: ${other.treasureTrailManager.completedClues[1]}",i) - 69 -> sendLine(player,"Hard Clues: ${other.treasureTrailManager.completedClues[2]}",i) + 97 -> sendLine(player,"Easy Clues: ${TreasureTrailManager.getInstance(other).completedClues[0]}",i) + 68 -> sendLine(player,"Medium Clues: ${TreasureTrailManager.getInstance(other).completedClues[1]}",i) + 69 -> sendLine(player,"Hard Clues: ${TreasureTrailManager.getInstance(other).completedClues[2]}",i) 70 -> sendLine(player,SPACER,i) - 71 -> sendLine(player,"Slayer Tasks: ${other.slayer.flags.completedTasks}",i) + 71 -> sendLine(player,"Slayer Tasks: ${SlayerManager.getInstance(other).flags.completedTasks}",i) 72 -> sendLine(player,"Quest Points: ${other.questRepository.points}",i) 73 -> sendLine(player,"Ironman Mode: ${other.ironmanManager.mode.name.toLowerCase()}",i) 74 -> sendLine(player,"Deaths: ${other.getAttribute("$STATS_BASE:$STATS_DEATHS",0)}",i) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/BarbarianOutpostCourse.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/BarbarianOutpostCourse.kt index 265801475..8fb5ab814 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/BarbarianOutpostCourse.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/agility/BarbarianOutpostCourse.kt @@ -43,7 +43,7 @@ class BarbarianOutpostCourse val id = node.id getCourse(player) when (id) { - 2115, 2116 -> if (!player.barcrawlManager.isFinished || player.barcrawlManager.isStarted) { + 2115, 2116 -> if (!BarcrawlManager.getInstance(player).isFinished || BarcrawlManager.getInstance(player).isStarted) { player.dialogueInterpreter.open(384) } else { DoorActionHandler.handleAutowalkDoor(player, node as Scenery) @@ -65,7 +65,7 @@ class BarbarianOutpostCourse sendMessage(player, "You climb the low wall...") AgilityHandler.forceWalk(player, flag, node.location.transform(-1, 0, 0), node.location.transform(1, 0, 0), Animation.create(839), 10, 13.5, null) } - 455 -> player.barcrawlManager.read() + 455 -> BarcrawlManager.getInstance(player).read() 385 -> { sendMessage(player, "The scorpion stings you!") player.impactHandler.manualHit(player, 3, HitsplatType.NORMAL) @@ -217,9 +217,9 @@ class BarbarianOutpostCourse } override fun open(vararg args: Any): Boolean { - if (!player.barcrawlManager.isStarted) { + if (!BarcrawlManager.getInstance(player).isStarted) { npc("O, waddya want?") - } else if (player.barcrawlManager.isFinished && !player.barcrawlManager.isStarted) { + } else if (BarcrawlManager.getInstance(player).isFinished && !BarcrawlManager.getInstance(player).isStarted) { npc("'Ello friend.") stage = 50 } else { @@ -250,7 +250,7 @@ class BarbarianOutpostCourse stage++ } 4 -> end() - 5 -> if (player.barcrawlManager.isFinished) { + 5 -> if (BarcrawlManager.getInstance(player).isFinished) { npc("You may pass if you like. You are a true", "barbarian now.") stage = 4 } else { @@ -280,8 +280,8 @@ class BarbarianOutpostCourse stage++ } 10 -> { - player.barcrawlManager.reset() - player.barcrawlManager.isStarted = true + BarcrawlManager.getInstance(player).reset() + BarcrawlManager.getInstance(player).isStarted = true player.inventory.add(BarcrawlManager.BARCRAWL_CARD, player) interpreter.sendDialogue("The guard hands you a Barcrawl card.") stage++ @@ -295,10 +295,10 @@ class BarbarianOutpostCourse stage++ } 13 -> end() - 20 -> if (!player.barcrawlManager.hasCard()) { + 20 -> if (!BarcrawlManager.getInstance(player).hasCard()) { player("I've lost my barcrawl card...") stage = 23 - } else if (player.barcrawlManager.isFinished) { + } else if (BarcrawlManager.getInstance(player).isFinished) { player("I tink I jusht 'bout done dem all... but I losht count...") stage = 24 } else { @@ -318,7 +318,7 @@ class BarbarianOutpostCourse if (!player.inventory.containsItem(BarcrawlManager.BARCRAWL_CARD)) { end() } - player.barcrawlManager.isStarted = false + BarcrawlManager.getInstance(player).isStarted = false player.bank.remove(BarcrawlManager.BARCRAWL_CARD) player.inventory.remove(BarcrawlManager.BARCRAWL_CARD) interpreter.sendDialogue("You give the card to the barbarian.") diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/hunter/pitfall/HunterPitfall.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/hunter/pitfall/HunterPitfall.kt index 84aafe92f..d9a0c7de7 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/hunter/pitfall/HunterPitfall.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/hunter/pitfall/HunterPitfall.kt @@ -12,6 +12,7 @@ import core.game.node.entity.impl.ForceMovement import core.game.node.entity.npc.AbstractNPC import core.game.node.entity.player.Player import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.hunter.HunterManager import core.game.node.item.Item import core.game.node.scenery.Scenery import core.game.system.task.Pulse @@ -176,9 +177,9 @@ class PitfallListeners : InteractionListener() { return@on true } - val maxTraps = player.hunterManager.maximumTraps + val maxTraps = HunterManager.getInstance(player).maximumTraps if(player.getAttribute("pitfall:count", 0) >= maxTraps) { - player.sendMessage("You can't set up more than ${maxTraps} pitfall traps at your hunter level.") + player.sendMessage("You can't set up more than $maxTraps pitfall traps at your hunter level.") return@on true } player.incrementAttribute("pitfall:count", 1) diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerEquipmentFlags.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerEquipmentFlags.kt index 8d7c25ae9..db06af8a2 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerEquipmentFlags.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerEquipmentFlags.kt @@ -29,47 +29,47 @@ object SlayerEquipmentFlags { if((getItemFromEquipment(player, EquipmentSlot.AMULET)?.id ?: 0) == Items.WITCHWOOD_ICON_8923) flags = flags or (1 shl 7) if((getItemFromEquipment(player, EquipmentSlot.SHIELD)?.id ?: 0) == Items.MIRROR_SHIELD_4156) flags = flags or (1 shl 8) - player.slayer.flags.equipmentFlags = flags + SlayerManager.getInstance(player).flags.equipmentFlags = flags } @JvmStatic fun hasNosePeg(player: Player): Boolean{ - return player.slayer.flags.equipmentFlags and 1 == 1 + return SlayerManager.getInstance(player).flags.equipmentFlags and 1 == 1 } @JvmStatic fun hasEarmuffs(player: Player): Boolean { - return (player.slayer.flags.equipmentFlags shr 1) and 1 == 1 + return (SlayerManager.getInstance(player).flags.equipmentFlags shr 1) and 1 == 1 } @JvmStatic fun hasFaceMask(player: Player): Boolean { - return (player.slayer.flags.equipmentFlags shr 2) and 1 == 1 + return (SlayerManager.getInstance(player).flags.equipmentFlags shr 2) and 1 == 1 } @JvmStatic fun hasBlackMask(player: Player): Boolean { - return (player.slayer.flags.equipmentFlags shr 3) and 1 == 1 + return (SlayerManager.getInstance(player).flags.equipmentFlags shr 3) and 1 == 1 } @JvmStatic fun hasSpinyHelmet(player: Player): Boolean { - return (player.slayer.flags.equipmentFlags shr 4) and 1 == 1 + return (SlayerManager.getInstance(player).flags.equipmentFlags shr 4) and 1 == 1 } @JvmStatic fun hasWitchwoodIcon(player: Player): Boolean { - return (player.slayer.flags.equipmentFlags shr 7) and 1 == 1 + return (SlayerManager.getInstance(player).flags.equipmentFlags shr 7) and 1 == 1 } @JvmStatic fun hasMirrorShield(player: Player): Boolean { - return (player.slayer.flags.equipmentFlags shr 8) and 1 == 1 + return (SlayerManager.getInstance(player).flags.equipmentFlags shr 8) and 1 == 1 } @JvmStatic fun getDamAccBonus(player: Player): Double { - val isCape = player.slayer.flags.equipmentFlags == 0x3F + val isCape = SlayerManager.getInstance(player).flags.equipmentFlags == 0x3F val hasMask = hasBlackMask(player) return if(isCape) 1.075 diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerFlags.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerFlags.kt index 23b22005b..f727573fb 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerFlags.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerFlags.kt @@ -1,6 +1,5 @@ package rs09.game.node.entity.skill.slayer -import core.game.node.entity.player.Player import core.game.node.entity.skill.slayer.Master import core.game.node.entity.skill.slayer.Tasks @@ -8,7 +7,7 @@ import core.game.node.entity.skill.slayer.Tasks * Bitflag-based system for storing slayer-related data for a player and various helper functions. * @author Ceikry */ -class SlayerFlags(val player: Player) { +class SlayerFlags { var taskFlags = 0 var rewardFlags = 0 var equipmentFlags = 0 diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerKillHook.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerKillHook.kt deleted file mode 100644 index 03aefe464..000000000 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerKillHook.kt +++ /dev/null @@ -1,47 +0,0 @@ -package rs09.game.node.entity.skill.slayer - -import api.events.EventHook -import api.events.NPCKillEvent -import api.rewardXP -import core.game.node.entity.Entity -import core.game.node.entity.player.Player -import core.game.node.entity.skill.Skills -import core.game.node.entity.skill.slayer.Master - -object SlayerKillHook : EventHook -{ - override fun process(entity: Entity, event: NPCKillEvent) { - val npc = event.npc - val player = entity as? Player ?: return - val slayer = player.slayer - val flags = slayer.flags - - if (slayer.hasTask()) { - rewardXP(player, Skills.SLAYER, npc.skills.maximumLifepoints.toDouble()) - slayer.decrementAmount(1) - if(slayer.hasTask()) return - flags.taskStreak = flags.taskStreak + 1 - flags.completedTasks = flags.completedTasks + 1 - if ((flags.completedTasks > 4 || flags.canEarnPoints()) && flags.getMaster() != Master.TURAEL && flags.getPoints() < 64000) { - var points = flags.getMaster().taskPoints[0] - if (flags.taskStreak % 50 == 0) { - points = flags.getMaster().taskPoints[2] - } else if (flags.taskStreak % 10 == 0) { - points = flags.getMaster().taskPoints[1] - } - flags.incrementPoints(points) - if (flags.getPoints() > 64000) { - flags.setPoints(64000) - } - player.sendMessages("You've completed " + flags.taskStreak + " tasks in a row and received " + points + " points, with a total of " + flags.getPoints(), "You have completed " + flags.completedTasks + " tasks in total. Return to a Slayer master.") - } else if (flags.completedTasks == 4) { - player.sendMessage("You've completed your task; you will start gaining points on your next task!") - flags.flagCanEarnPoints() - } else if (flags.getMaster() == Master.TURAEL) { - player.sendMessages("You've completed your task; Tasks from Turael do not award points.", "Return to a Slayer master.") - } else { - player.sendMessages("You've completed your task; Complete " + (4 - flags.completedTasks) + " more task(s) to start gaining points.", "Return to a Slayer master.") - } - } - } -} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerManager.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerManager.kt index 21cdca8ed..2897476f5 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerManager.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerManager.kt @@ -1,7 +1,15 @@ package rs09.game.node.entity.skill.slayer +import api.LoginListener +import api.PersistPlayer +import api.events.EventHook +import api.events.NPCKillEvent +import api.getAttribute +import api.rewardXP import core.cache.def.impl.NPCDefinition +import core.game.node.entity.Entity import core.game.node.entity.player.Player +import core.game.node.entity.skill.Skills import core.game.node.entity.skill.slayer.Master import core.game.node.entity.skill.slayer.Tasks import org.json.simple.JSONArray @@ -10,23 +18,44 @@ import rs09.game.Event import java.util.* /** - * Manages the players slayer task. + * Manages the players slayer data. * @author Ceikry */ -class SlayerManager(val player: Player) { - - init { - player.hook(Event.NPCKilled, SlayerKillHook) +class SlayerManager(val player: Player? = null) : LoginListener, PersistPlayer, EventHook { + override fun login(player: Player) { + val instance = SlayerManager(player) + player.hook(Event.NPCKilled, instance) + player.setAttribute("slayer-manager", instance) } /** * The player's slayer flags */ @JvmField - val flags: SlayerFlags = SlayerFlags(player) + val flags: SlayerFlags = SlayerFlags() - fun parse(slayerData: JSONObject) { + override fun savePlayer(player: Player, save: JSONObject) { + val slayer = JSONObject() + val slayerManager = getInstance(player) + if(slayerManager.removed.isNotEmpty()) { + val removedTasks = JSONArray() + slayerManager.removed.map { + removedTasks.add(it.ordinal.toString()) + } + slayer["removedTasks"] = removedTasks + } + slayer["taskStreak"] = slayerManager.flags.taskStreak.toString() + slayer["totalTasks"] = slayerManager.flags.completedTasks.toString() + slayer["equipmentFlags"] = slayerManager.flags.equipmentFlags + slayer["taskFlags"] = slayerManager.flags.taskFlags + slayer["rewardFlags"] = slayerManager.flags.rewardFlags + save["slayer"] = slayer + } + + override fun parsePlayer(player: Player, data: JSONObject) { + val slayerData = data["slayer"] as JSONObject val m = slayerData["master"] + val flags = getInstance(player).flags if (m != null) { flags.setMaster(Master.forId(m.toString().toInt())) } @@ -71,13 +100,48 @@ class SlayerManager(val player: Player) { if (slayerData.containsKey("rewardFlags")) flags.rewardFlags = slayerData["rewardFlags"].toString().toInt() } + override fun process(entity: Entity, event: NPCKillEvent) { + val npc = event.npc + val player = entity as? Player ?: return + val slayer = getInstance(player) + val flags = slayer.flags + + if (slayer.hasTask() && npc.id in slayer.task!!.npcs) { + rewardXP(player, Skills.SLAYER, npc.skills.maximumLifepoints.toDouble()) + slayer.decrementAmount(1) + if(slayer.hasTask()) return + flags.taskStreak = flags.taskStreak + 1 + flags.completedTasks = flags.completedTasks + 1 + if ((flags.completedTasks > 4 || flags.canEarnPoints()) && flags.getMaster() != Master.TURAEL && flags.getPoints() < 64000) { + var points = flags.getMaster().taskPoints[0] + if (flags.taskStreak % 50 == 0) { + points = flags.getMaster().taskPoints[2] + } else if (flags.taskStreak % 10 == 0) { + points = flags.getMaster().taskPoints[1] + } + flags.incrementPoints(points) + if (flags.getPoints() > 64000) { + flags.setPoints(64000) + } + player.sendMessages("You've completed " + flags.taskStreak + " tasks in a row and received " + points + " points, with a total of " + flags.getPoints(), "You have completed " + flags.completedTasks + " tasks in total. Return to a Slayer master.") + } else if (flags.completedTasks == 4) { + player.sendMessage("You've completed your task; you will start gaining points on your next task!") + flags.flagCanEarnPoints() + } else if (flags.getMaster() == Master.TURAEL) { + player.sendMessages("You've completed your task; Tasks from Turael do not award points.", "Return to a Slayer master.") + } else { + player.sendMessages("You've completed your task; Complete " + (4 - flags.completedTasks) + " more task(s) to start gaining points.", "Return to a Slayer master.") + } + } + } + /** * Method used to assign a new task for a player. * @param master the master to give the task. */ fun generate(master: Master) { - val task = SlayerUtils.generate(player, master) ?: return - SlayerUtils.assign(player, task, master) + val task = SlayerUtils.generate(player!!, master) ?: return + SlayerUtils.assign(player!!, task, master) } /** @@ -137,7 +201,7 @@ class SlayerManager(val player: Player) { fun decrementAmount(amount: Int) { flags.decrementTaskAmount(amount) - player.varpManager.get(2502).setVarbit(0, flags.taskFlags shr 4).send(player) + player!!.varpManager.get(2502).setVarbit(0, flags.taskFlags shr 4).send(player) } /** @@ -169,4 +233,11 @@ class SlayerManager(val player: Player) { get() = flags.removed val isCanEarnPoints: Boolean get() = flags.canEarnPoints() + + companion object { + @JvmStatic fun getInstance(player: Player) : SlayerManager + { + return getAttribute(player, "slayer-manager", SlayerManager()) + } + } } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerUtils.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerUtils.kt index f2a57eebd..dba8282ba 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerUtils.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/slayer/SlayerUtils.kt @@ -31,20 +31,20 @@ object SlayerUtils { fun canBeAssigned(player: Player, task: Tasks): Boolean { - return player.getSkills().getLevel(Skills.SLAYER) >= task.levelReq && !player.slayer.flags.removed.contains(task) + return player.getSkills().getLevel(Skills.SLAYER) >= task.levelReq && !SlayerManager.getInstance(player).flags.removed.contains(task) } fun assign(player: Player, task: Tasks, master: Master) { - player.slayer.master = master - player.slayer.task = task - player.slayer.amount = RandomFunction.random(master.assignment_range[0], master.assignment_range[1]) + SlayerManager.getInstance(player).master = master + SlayerManager.getInstance(player).task = task + SlayerManager.getInstance(player).amount = RandomFunction.random(master.assignment_range[0], master.assignment_range[1]) if (master == Master.DURADEL) { player.achievementDiaryManager.finishTask(player, DiaryType.KARAMJA, 2, 8) } else if (master == Master.VANNAKA) { player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 1, 14) } - player.varpManager.get(2502).setVarbit(0, player.slayer.flags.taskFlags shr 4).send(player) + player.varpManager.get(2502).setVarbit(0, SlayerManager.getInstance(player).flags.taskFlags shr 4).send(player) } @JvmStatic diff --git a/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt b/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt index 3f1ed9516..18fb362d0 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt @@ -28,6 +28,7 @@ import rs09.game.ai.pvp.PVPAIPBuilderUtils import rs09.game.ai.resource.ResourceAIPActions import rs09.game.ai.skillingbot.SkillingBotsBuilder import rs09.game.ai.wilderness.PvPBotsBuilder +import rs09.game.node.entity.skill.slayer.SlayerManager import java.util.* /** @@ -195,7 +196,7 @@ class AIPCommandPlugin : CommandPlugin() { return true } "slayerpoints" -> { - player.slayer.slayerPoints = 50000 + SlayerManager.getInstance(player).slayerPoints = 50000 return true } "dragonbot" -> { @@ -265,11 +266,11 @@ class AIPCommandPlugin : CommandPlugin() { } "ranger" -> { } - "removetask" -> return if (!player.slayer.hasTask()) { + "removetask" -> return if (!SlayerManager.getInstance(player).hasTask()) { player.sendMessage("You don't have an active task right now.") true } else { - player.slayer.clear() + SlayerManager.getInstance(player).clear() player.sendMessage("You have canceled your current task.") true } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt index f8e196194..00367137c 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/MiscCommandSet.kt @@ -22,6 +22,7 @@ import kotlinx.coroutines.launch import org.rs09.consts.Components import rs09.ServerConstants import rs09.game.content.activity.fishingtrawler.TrawlerLoot +import rs09.game.content.ame.RandomEventManager import rs09.game.content.ame.RandomEvents import rs09.game.ge.GrandExchange import rs09.game.node.entity.state.newsys.states.FarmingState @@ -461,13 +462,13 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ } define("testlady", Privilege.ADMIN){ player, _ -> - player.antiMacroHandler.event = RandomEvents.RIVER_TROLL.npc.create(player) - player.antiMacroHandler.event!!.init() + RandomEventManager.getInstance(player)!!.event = RandomEvents.RIVER_TROLL.npc.create(player) + RandomEventManager.getInstance(player)!!.event!!.init() } define("revent", Privilege.ADMIN){ player, _ -> println(player.pulseManager.current) - player.antiMacroHandler.fireEvent() + RandomEventManager.getInstance(player)!!.fireEvent() } define("addcredits", Privilege.ADMIN){ player, _ -> diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/SlayerCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/SlayerCommandSet.kt index 0f0ff2b0a..d6c83cbe6 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/sets/SlayerCommandSet.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/SlayerCommandSet.kt @@ -2,6 +2,7 @@ package rs09.game.system.command.sets import core.game.node.entity.npc.NPC import core.plugin.Initializable +import rs09.game.node.entity.skill.slayer.SlayerManager import rs09.game.system.command.Command import rs09.game.system.command.Privilege @@ -13,8 +14,8 @@ class SlayerCommandSet : CommandSet(Privilege.ADMIN){ */ define("finishtask"){player,_ -> notify(player, "Kill the npc that spawned to finish your task.") - player.slayer.amount = 1 - val finisher = NPC(player.slayer.task?.npcs?.get(0) ?: 0, player.location) + SlayerManager.getInstance(player).amount = 1 + val finisher = NPC(SlayerManager.getInstance(player).task?.npcs?.get(0) ?: 0, player.location) finisher.isRespawn = false finisher.init() } @@ -32,7 +33,7 @@ class SlayerCommandSet : CommandSet(Privilege.ADMIN){ reject(player,"Amount needs to be a valid integer!") } - player.slayer.slayerPoints = amount!! + SlayerManager.getInstance(player).slayerPoints = amount!! notify(player, "Set slayer points to $amount.") } } diff --git a/Server/src/main/kotlin/rs09/plugin/ClassScanner.kt b/Server/src/main/kotlin/rs09/plugin/ClassScanner.kt index b7377fa70..69db21b83 100644 --- a/Server/src/main/kotlin/rs09/plugin/ClassScanner.kt +++ b/Server/src/main/kotlin/rs09/plugin/ClassScanner.kt @@ -15,8 +15,11 @@ import io.github.classgraph.ClassInfo import rs09.game.ai.general.scriptrepository.PlayerScripts import rs09.game.interaction.InteractionListener import rs09.game.interaction.InterfaceListener +import rs09.game.node.entity.player.info.login.PlayerSaveParser +import rs09.game.node.entity.player.info.login.PlayerSaver import rs09.game.node.entity.skill.magic.SpellListener import rs09.game.system.SystemLogger +import rs09.game.system.command.Command import rs09.game.world.GameWorld import java.util.* import java.util.function.Consumer @@ -106,6 +109,15 @@ object ClassScanner { val clazz = it.loadClass().newInstance() as TickListener GameWorld.tickListeners.add(clazz) } + result.getClassesImplementing("api.PersistPlayer").filter { !it.isAbstract }.forEach { + val clazz = it.loadClass().newInstance() as PersistPlayer + PlayerSaver.contentHooks.add(clazz) + PlayerSaveParser.contentHooks.add(clazz) + } + result.getClassesImplementing("api.PersistWorld").filter { !it.isAbstract }.forEach { + val clazz = it.loadClass().newInstance() as PersistPlayer + PlayerSaver.contentHooks.add(clazz) + } } /**