From 16353eda20e87628a52a2a6fcedcd153e6128538 Mon Sep 17 00:00:00 2001 From: bushtail Date: Sun, 3 Jul 2022 06:32:03 +0000 Subject: [PATCH] Converted EnchantedGemPlugin to Listener Converted EnchantedGemDialogue to DialogueFile --- .../interaction/item/EnchantedGemPlugin.java | 119 -------- .../skill/slayer/EnchantedGemDialogue.java | 267 ------------------ Server/src/main/kotlin/api/ContentAPI.kt | 72 +++++ .../interaction/item/EnchantedGemListener.kt | 66 +++++ 4 files changed, 138 insertions(+), 386 deletions(-) delete mode 100644 Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java delete mode 100644 Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java create mode 100644 Server/src/main/kotlin/rs09/game/interaction/item/EnchantedGemListener.kt diff --git a/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java b/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java deleted file mode 100644 index 6010eb34e..000000000 --- a/Server/src/main/java/core/game/interaction/item/EnchantedGemPlugin.java +++ /dev/null @@ -1,119 +0,0 @@ -package core.game.interaction.item; - -import core.cache.def.impl.ItemDefinition; -import core.cache.def.impl.NPCDefinition; -import core.game.content.dialogue.DialoguePlugin; -import rs09.game.content.global.EnchantedJewellery; -import core.game.interaction.OptionHandler; -import core.game.node.Node; -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. - * @author 'Vexia - * @version 1.0 - */ -@Initializable -public final class EnchantedGemPlugin extends OptionHandler { - - @Override - public Plugin newInstance(Object arg) throws Throwable { - ItemDefinition.forId(4155).getHandlers().put("option:check", this); - return this; - } - - @Override - public boolean handle(Player player, Node node, String option) { - 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; - } - - @Override - public boolean isWalk() { - return false; - } - - /** - * Represents the jewellery dialogue plugin. - * @author 'Vexia - * @version 1.0 - */ - public final class JewelleryDialogue extends DialoguePlugin { - - /** - * Represents the id to use. - */ - public static final int ID = 329128389; - - /** - * Represents the enchanted jewellery. - */ - private EnchantedJewellery jewellery; - - /** - * If the operate option is used. - */ - private boolean operate; - - /** - * Represents the item instance. - */ - private Item item; - - /** - * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. - */ - public JewelleryDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. - * @param player the player. - */ - public JewelleryDialogue(final Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new JewelleryDialogue(player); - } - - @Override - public boolean open(Object... args) { - item = (Item) args[0]; - jewellery = (EnchantedJewellery) args[1]; - operate = args.length > 2 && (Boolean) args[2]; - if (jewellery == EnchantedJewellery.DIGSITE_PENDANT) { - jewellery.use(player, item, 0, operate); - return true; - } - interpreter.sendOptions("Where would you like to go?", jewellery.getOptions()); - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - if (player.getInterfaceManager().isOpened()) { - end(); - return true; - } - end(); - jewellery.use(player, item, (buttonId - 1), operate); - return true; - } - - @Override - public int[] getIds() { - return new int[] { ID }; - } - - } -} 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 deleted file mode 100644 index 10d319762..000000000 --- a/Server/src/main/java/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java +++ /dev/null @@ -1,267 +0,0 @@ -package core.game.node.entity.skill.slayer; - -import core.cache.def.impl.NPCDefinition; -import core.game.content.dialogue.DialoguePlugin; -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. - * @author 'Vexia - * @version 1.0 - */ -@Initializable -public final class EnchantedGemDialogue extends DialoguePlugin { - - /** - * Represents the id associated with this plugin. - */ - public static final int ID = 77777; - - /** - * Constructs a new {@code EnchantedGemDialogue} {@code Object}. - */ - public EnchantedGemDialogue() { - /** - * empty. - */ - } - - /** - * Constructs a new {@code EnchantedGemDialogue} {@code Object}. - * @param player the player. - */ - public EnchantedGemDialogue(Player player) { - super(player); - } - - @Override - public DialoguePlugin newInstance(Player player) { - return new EnchantedGemDialogue(player); - } - - @Override - public boolean open(Object... args) { - player.faceLocation(player.getLocation().transform(1, 0, 0)); - player.setDirection(Direction.EAST); - interpreter.sendDialogues(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, "Hello there " + player.getUsername() + ", what can I help you with?"); - stage = 0; - return true; - } - - @Override - public boolean handle(int interfaceId, int buttonId) { - switch (stage) { - case 0: - interpreter.sendOptions("Select an Option", "How am I doing so far?", "Who are you?", "Where are you?", "Got any tips for me?", "Nothing really."); - stage = 2; - break; - case 2: - switch (buttonId) { - case 1: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How am I doing so far?"); - stage = 10; - break; - case 2: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); - stage = 20; - break; - case 3: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where are you?"); - stage = 30; - break; - case 4: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Got any tips for me?"); - stage = 400; - break; - case 5: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nothing really."); - stage = 99; - break; - - } - break; - case 99: - end(); - break; - case 10: - 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(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: - interpreter.sendOptions("Select an Option", "Who are you?", "Where are you?", "Got any tips for me?", "That's all thanks."); - stage = 12; - break; - case 12: - switch (buttonId) { - case 1: - 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(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 (!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(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip()); - stage = 401; - break; - case 4: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all thanks."); - stage = 99; - break; - case 99: - end(); - break; - } - break; - case 20: - 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: - interpreter.sendOptions("Select an Option", "How am I doing so far?", "Where are you?", "Got any tips for me?", "That's all thanks."); - stage = 25; - break; - case 25: - switch (buttonId) { - case 1: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How am I doing so far?"); - stage = 10; - break; - case 2: - 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 (!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(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip()); - stage = 401; - break; - case 4: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all thanks."); - stage = 99; - break; - - } - break; - case 30: - 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: - interpreter.sendOptions("Select an Option", "How am I doing so far?", "Who are you?", "Got any tips for me?", "That's all thanks."); - stage = 32; - break; - case 32: - switch (buttonId) { - case 1: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How am I doing so far?"); - stage = 10; - break; - case 2: - 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 (!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(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip()); - stage = 401; - break; - case 4: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all thanks."); - stage = 99; - break; - - } - break; - case 400: - 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(SlayerManager.getInstance(player).getMaster().getNpc(), FacialExpression.HALF_GUILTY, SlayerManager.getInstance(player).getTask().getTip()); - stage = 401; - break; - case 401: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Great, thanks!"); - stage = 403; - break; - case 403: - interpreter.sendOptions("Select an Option", "How am I doing so far?", "Who are you?", "Where are you?", "That's all thanks."); - stage = 404; - break; - case 404: - switch (buttonId) { - case 1: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How am I doing so far?"); - stage = 10; - break; - case 2: - 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(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: - interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all thanks."); - stage = 99; - break; - - } - break; - } - return true; - } - - /** - * Method used to get the masters location. - * @return the location. - */ - public String masterLocation() { - if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.MAZCHNA.getNpc()) - return "Canifis"; - else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.TURAEL.getNpc()) - return "Taverley"; - else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.CHAELDAR.getNpc()) - return "Zanaris"; - else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.VANNAKA.getNpc()) - return "Edgeville dungeon"; - else if (SlayerManager.getInstance(player).getMaster().getNpc() == Master.DURADEL.getNpc()) - return "Shilo village"; - else if(SlayerManager.getInstance(player).getMaster() == null) { - return "the Gnome Stronghold"; - } - return null; - } - - @Override - public int[] getIds() { - return new int[] { ID }; - } -} diff --git a/Server/src/main/kotlin/api/ContentAPI.kt b/Server/src/main/kotlin/api/ContentAPI.kt index 871359062..00c566340 100644 --- a/Server/src/main/kotlin/api/ContentAPI.kt +++ b/Server/src/main/kotlin/api/ContentAPI.kt @@ -22,6 +22,7 @@ import core.game.node.entity.player.link.emote.Emotes import core.game.node.entity.player.link.quest.QuestRepository import core.game.node.entity.skill.Skills import core.game.node.entity.skill.gather.SkillingTool +import core.game.node.entity.skill.slayer.Tasks import core.game.node.entity.skill.summoning.familiar.BurdenBeast import core.game.node.item.GroundItem import core.game.node.item.GroundItemManager @@ -41,6 +42,7 @@ import core.game.world.update.flag.chunk.AnimateObjectUpdateFlag import core.game.world.update.flag.context.Animation import core.game.world.update.flag.context.Graphics import org.rs09.consts.Items +import org.rs09.consts.NPCs import rs09.game.content.dialogue.DialogueFile import rs09.game.content.dialogue.SkillDialogueHandler import rs09.game.content.global.GlobalKillCounter @@ -1589,6 +1591,15 @@ fun getPathableRandomLocalCoordinate(target: Entity, radius: Int, center: Locati return target.location } +/** + * Returns the player's active slayer task. + * @author bushtail + * @param player the player whose task we are checking. + * @return the slayer task. + */ +fun getSlayerTask(player : Player) : Tasks? { + return SlayerManager.getInstance(player).task +} /** * Returns the name of the player's active slayer task. @@ -1608,4 +1619,65 @@ fun getSlayerTaskName(player : Player) : String { */ fun getSlayerTaskKillsRemaining(player : Player) : Int { return SlayerManager.getInstance(player).amount +} + +/** + * Returns the player's slayer master as npc. + * @author bushtail + * @param player the player whose master we are checking. + * @return the slayer master as NPC. + */ +fun getSlayerMaster(player : Player) : NPC { + return findNPC(SlayerManager.getInstance(player).master?.npc as Int) as NPC +} + +/** + * Returns the player's slayer master location as string. + * @author bushtail + * @param player the player whose master we are checking. + * @return the slayer master location as String. + */ +fun getSlayerMasterLocation(player : Player) : String { + return when(getSlayerMaster(player).id) { + NPCs.CHAELDAR_1598 -> "Zanaris" + NPCs.DURADEL_8275 -> "Shilo Village" + NPCs.MAZCHNA_8274 -> "Canifis" + NPCs.TURAEL_8273 -> "Taverly" + NPCs.VANNAKA_1597 -> "Edgeville Dungeon" + else -> "The Backrooms" + } +} + +/** + * Returns the player's slayer task tip as String. + * @author bushtail + * @param player the player whose task tip we are checking. + * @return the task tip as String. + */ +fun getSlayerTip(player : Player) : Array { + return if(hasSlayerTask(player)) { + SlayerManager.getInstance(player).task?.tip!! + } else { + arrayOf("You need something new to hunt.") + } +} + +/** + * Returns the player's slayer task flags as Int. + * @author bushtail + * @param player the player whose task flags we are checking. + * @return the task flags as Int. + */ +fun getSlayerTaskFlags(player : Player) : Int { + return SlayerManager.getInstance(player).flags.taskFlags +} + +/** + * Returns whether or not the player has a task. + * @author bushtail + * @param player the player whose task we are checking. + * @return has task as Boolean. + */ +fun hasSlayerTask(player : Player) : Boolean { + return SlayerManager.getInstance(player).hasTask() } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedGemListener.kt b/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedGemListener.kt new file mode 100644 index 000000000..6abdbc5d7 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/interaction/item/EnchantedGemListener.kt @@ -0,0 +1,66 @@ +package rs09.game.interaction.item + +import api.* +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.skill.slayer.Tasks +import org.rs09.consts.Items +import rs09.game.content.dialogue.DialogueFile +import rs09.game.content.dialogue.IfTopic +import rs09.game.content.dialogue.Topic +import rs09.game.interaction.InteractionListener +import rs09.tools.END_DIALOGUE + +class EnchantedGemListener : InteractionListener { + override fun defineListeners() { + on(Items.ENCHANTED_GEM_4155, ITEM, "activate") { player, _ -> + openDialogue(player, EnchantedGemDialogue()) + return@on true + } + } +} + +class EnchantedGemDialogue() : DialogueFile() { + var firstRun = true + override fun handle(interfaceId: Int, buttonId: Int) { + npc = getSlayerMaster(player!!) + when(stage) { + 0 -> npcl(FacialExpression.FRIENDLY, "Hello there ${player!!.username}, what can I help you with?").also { stage++ } + 1 -> showTopics( + Topic(FacialExpression.ASKING, "How am I doing so far?", 100), + Topic(FacialExpression.HALF_ASKING, "Who are you?", 200), + Topic(FacialExpression.HALF_ASKING, "Where are you?", 300), + Topic(FacialExpression.FRIENDLY, "Got any tips for me?", 400), + IfTopic(FacialExpression.FRIENDLY, "Nothing really.", END_DIALOGUE, firstRun), + IfTopic(FacialExpression.HAPPY, "That's all thanks.", END_DIALOGUE, !firstRun) + ) + 100 -> { + firstRun = false + if(!hasSlayerTask(player!!)) { + npcl(FacialExpression.HALF_THINKING, "You need something new to hunt. Come and see me when you can and I'll give you a new task.").also { stage = 1 } + } else { + if(getSlayerTask(player!!) == Tasks.JAD) { + npcl(FacialExpression.FRIENDLY, "You're currently assigned to kill TzTok-Jad!") + } else { + npcl(FacialExpression.FRIENDLY, "You're currently assigned to kill ${getSlayerTaskName(player!!)}s; only ${getSlayerTaskKillsRemaining(player!!)} more to go.") + } + setVarbit(player!!, 2502, 0, getSlayerTaskFlags(player!!)) + stage = 1 + } + } + 200 -> { + firstRun = false + npcl(FacialExpression.HAPPY, "My name's ${getSlayerMaster(player!!).name}, I'm the Slayer Master best able to train you.").also { stage = 1 } + } + 300 -> { + firstRun = false + npcl(FacialExpression.HAPPY, "You'll find me in ${getSlayerMasterLocation(player!!)}, I'll be here when you need a new task.").also { stage = 1 } + } + 400 -> { + firstRun = false + npc(FacialExpression.FRIENDLY, *getSlayerTip(player!!)) + stage++ + } + 401 -> player(FacialExpression.HAPPY, "Great, thanks!").also { stage = 1 } + } + } +} \ No newline at end of file