From 49bf0d6ef511fec28aac626c6bae8693f6f5b82f Mon Sep 17 00:00:00 2001 From: Harris Hackett Date: Wed, 23 Feb 2022 13:08:01 +0000 Subject: [PATCH] Implemented Monk's Friend quest --- Server/data/configs/drop_tables.json | 30 ++- Server/data/configs/ground_spawns.json | 4 + Server/data/configs/npc_spawns.json | 14 +- .../members/monksfriend/BrotherCedricNPC.kt | 119 ++++++++++ .../members/monksfriend/BrotherOmadNPC.kt | 215 ++++++++++++++++++ .../members/monksfriend/MonasteryMonkNPC.kt | 44 ++++ .../quest/members/monksfriend/MonksFriend.kt | 71 ++++++ .../rs09/game/content/zone/StoneCircleZone.kt | 47 ++++ 8 files changed, 540 insertions(+), 4 deletions(-) create mode 100644 Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/BrotherCedricNPC.kt create mode 100644 Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/BrotherOmadNPC.kt create mode 100644 Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/MonasteryMonkNPC.kt create mode 100644 Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/MonksFriend.kt create mode 100644 Server/src/main/kotlin/rs09/game/content/zone/StoneCircleZone.kt diff --git a/Server/data/configs/drop_tables.json b/Server/data/configs/drop_tables.json index 9a4f6245c..33cd196d8 100644 --- a/Server/data/configs/drop_tables.json +++ b/Server/data/configs/drop_tables.json @@ -14302,6 +14302,34 @@ } ] }, + { + "default": [ + { + "minAmount": "1", + "weight": "100.0", + "id": "526", + "maxAmount": "1" + } + ], + "charm": [], + "ids": "281", + "description": "", + "main": [] + }, + { + "default": [ + { + "minAmount": "1", + "weight": "100.0", + "id": "526", + "maxAmount": "1" + } + ], + "charm": [], + "ids": "283", + "description": "", + "main": [] + }, { "default": [ { @@ -63870,4 +63898,4 @@ } ] } -] \ No newline at end of file +] diff --git a/Server/data/configs/ground_spawns.json b/Server/data/configs/ground_spawns.json index 7b8a03a5b..6e0b55b9b 100644 --- a/Server/data/configs/ground_spawns.json +++ b/Server/data/configs/ground_spawns.json @@ -19,6 +19,10 @@ "item_id": "88", "loc_data": "{1,2654,9767,0,4587583}" }, + { + "item_id": "90", + "loc_data": "{1,2570,9604,0,5898270}" + }, { "item_id": "185", "loc_data": "{1,2467,3176,0,7209050}" diff --git a/Server/data/configs/npc_spawns.json b/Server/data/configs/npc_spawns.json index ef7ec053d..878868cd2 100644 --- a/Server/data/configs/npc_spawns.json +++ b/Server/data/configs/npc_spawns.json @@ -745,15 +745,23 @@ }, { "npc_id": "279", - "loc_data": "{2604,3209,0,0,0}" + "loc_data": "{2604,3209,0,1,6}" + }, + { + "npc_id": "280", + "loc_data": "{2615,3258,0,1,6}" }, { "npc_id": "281", - "loc_data": "{2604,3219,0,0,0}-{2609,3207,0,0,0}-{2618,3211,0,0,0}" + "loc_data": "{2604,3219,0,1,6}-{2609,3207,0,1,6}-{2618,3211,0,1,6}" }, { "npc_id": "282", - "loc_data": "{3280,3494,0,1,6}" + "loc_data": "{3280,3494,0,1,6}-{2562,9608,0,1,6}-{2564,9604,0,1,6}" + }, + { + "npc_id": "283", + "loc_data": "{2569,9602,0,1,6}" }, { "npc_id": "284", diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/BrotherCedricNPC.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/BrotherCedricNPC.kt new file mode 100644 index 000000000..73d322a38 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/BrotherCedricNPC.kt @@ -0,0 +1,119 @@ +package rs09.game.content.quest.members.monksfriend + +import api.sendItemDialogue +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.item.Item +import org.rs09.consts.Items +import org.rs09.consts.NPCs +import rs09.game.content.dialogue.DialogueFile +import rs09.game.interaction.InteractionListener +import rs09.tools.END_DIALOGUE + +/** + * Handles BrotherCedricDialogue Dialogue + * @author Kya + */ +class BrotherCedricDialogue : DialogueFile() { + override fun handle(componentID: Int, buttonID: Int) { + val questStage = player!!.questRepository.getStage("Monk's Friend") + when { + questStage < 30 -> { + when(stage) { + 0 -> playerl(FacialExpression.HAPPY, "Hello.").also{stage++} + 1 -> npcl(FacialExpression.DRUNK, "Honey, money, woman and wine!").also{stage++} + 2 -> playerl(FacialExpression.HALF_ASKING, "Are you ok?").also{stage++ } + 3 -> npcl(FacialExpression.DRUNK, "Yesshh...hic up...beautiful!").also{stage++} + 4 -> playerl(FacialExpression.NEUTRAL, "Take care old monk.").also{ stage++ } + 5 -> npcl(FacialExpression.DRUNK, "La..di..da..hic..up!").also{stage = END_DIALOGUE} + } + } + questStage == 30 -> { + when(stage){ + 0 -> playerl(FacialExpression.HAPPY, "Brother Cedric are you okay?").also{stage++} + 1 -> npcl(FacialExpression.DRUNK, "Yeesshhh, I'm very, very drunk..hic..up..").also{stage++} + 2 -> playerl(FacialExpression.NEUTRAL, "Brother Omad needs the wine for the party.").also{stage++} + 3 -> npcl(FacialExpression.SAD, "Oh dear, oh dear, I knew I had to do something!").also{stage = END_DIALOGUE}.also{setQuest(player!!, 40)} + } + } + questStage == 40 -> { + when(stage){ + 0 -> playerl(FacialExpression.HAPPY, "Are you okay?").also{stage++} + 1 -> npcl(FacialExpression.DRUNK, "Hic up! Oh my head! I need a jug of water.").also{stage++} + 2 -> if (player!!.inventory.containItems(Items.JUG_OF_WATER_1937)){ + playerl(FacialExpression.FRIENDLY, "Cedric! Here, drink! I have some water.").also{stage=10} + } else { + playerl(FacialExpression.NEUTRAL, "I'll see if I can get some.").also{stage = 3} + } + 3 -> npcl(FacialExpression.DRUNK, "Thanks! *hic*").also{stage = END_DIALOGUE} + 10 -> npcl(FacialExpression.DRUNK, "Good stuff, my head's spinning!").also {stage++} + 11 -> { + sendItemDialogue(player!!, Items.JUG_OF_WATER_1937, "You hand the monk a jug of water.") + stage=0 + player!!.inventory.remove(Item(Items.JUG_OF_WATER_1937)) + setQuest(player!!, 41) + } + } + } + questStage == 41 -> { + when(stage){ + 0 -> npcl(FacialExpression.HAPPY, "Aah! That's better!").also{stage++} + 1 -> npcl(FacialExpression.HAPPY, "Now I just need to fix this cart and we can go party.").also {stage++} + 2 -> npcl(FacialExpression.NEUTRAL, "Could you help?").also{stage++} + 3 -> options( + "No, I've helped enough monks today!", + "Yes, I'd be happy to!").also{stage++} + 4 -> when(buttonID){ + 1 -> playerl(FacialExpression.ANGRY, "No, I've helped enough monks today!").also{stage++} + 2 -> playerl(FacialExpression.FRIENDLY, "Yes, I'd be happy to!").also{stage=10} + } + 5 -> npcl(FacialExpression.HAPPY, "In that case I'd better drink more wine! It helps me think.").also {stage=END_DIALOGUE} + 10 -> npcl(FacialExpression.HAPPY, "Excellent, I just need some wood.").also{stage++} + 11 -> playerl(FacialExpression.NEUTRAL, "Ok, I'll see what I can find.").also{stage = END_DIALOGUE}.also{setQuest(player!!, 42)} + } + } + questStage == 42 -> { + when(stage){ + 0 -> npcl(FacialExpression.HALF_ASKING, "Did you manage to get some wood?").also{stage++} + 1 -> if (player!!.inventory.containItems(Items.LOGS_1511)){ + sendItemDialogue(player!!, Items.LOGS_1511, "You hand Cedric some logs.") + stage=2 + } else { + playerl(FacialExpression.SAD, "Not yet, I'm afraid.").also{stage = END_DIALOGUE} + } + 2 -> playerl(FacialExpression.HAPPY, "Here you go!").also{stage++} + 3 -> npcl(FacialExpression.HAPPY, "Well done! Now I'll fix this cart. You head back to Brother Omad and tell him I'll be there soon.").also{stage++} + 4 -> playerl(FacialExpression.HAPPY, "Ok! I'll see you later!").also{ + stage=END_DIALOGUE + player!!.inventory.remove(Item(Items.LOGS_1511)) + setQuest(player!!, 50) + } + } + } + questStage == 50 -> { + when(stage){ + 0 -> playerl(FacialExpression.HAPPY, "Hello Cedric.").also{stage++} + 1 -> npcl(FacialExpression.NEUTRAL, "Hi, I'm almost done here. Could you tell Omad that I'll be back soon?").also{stage = END_DIALOGUE } + } + } + questStage == 100 -> { + when(stage){ + 0 -> npcl(FacialExpression.NEUTRAL, "Brother Omad sends you his thanks! He won't be in a fit state to thank you in person.").also{stage = END_DIALOGUE} + } + } + } + } +} + +/** + * Handles BrotherCedricListener to launch the dialogue + * @author Kya + */ +class BrotherCedricListener : InteractionListener() { + override fun defineListeners() { + on(NPCs.BROTHER_CEDRIC_280, NPC, "talk-to"){ player, _ -> + player.dialogueInterpreter.open(BrotherCedricDialogue(), NPC(NPCs.BROTHER_CEDRIC_280)) + return@on true + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/BrotherOmadNPC.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/BrotherOmadNPC.kt new file mode 100644 index 000000000..ac1856615 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/BrotherOmadNPC.kt @@ -0,0 +1,215 @@ +package rs09.game.content.quest.members.monksfriend + +import api.* +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.update.flag.context.Animation +import org.rs09.consts.Items +import org.rs09.consts.NPCs +import rs09.game.content.dialogue.DialogueFile +import rs09.game.interaction.InteractionListener +import rs09.game.world.GameWorld.Pulser +import rs09.tools.END_DIALOGUE + + +/** +* Handles BrotherOmadDialogue Dialogue +* @author Kya +*/ +class BrotherOmadDialogue : DialogueFile() { + override fun handle(componentID: Int, buttonID: Int) { + val questStage = player!!.questRepository.getStage("Monk's Friend") + when (questStage) { + 0 -> { + when(stage) { + 0 -> playerl(FacialExpression.HAPPY, "Hello there. What's wrong?").also { stage++ } + 1 -> npcl(FacialExpression.SAD, "*yawn*...oh, hello...*yawn* I'm sorry! I'm just so tired! I haven't slept in a week!").also { stage++ } + 2 -> options( + "Why can't you sleep, what's wrong?", + "Sorry! I'm too busy to hear your problems!").also { stage++ } + 3 -> when (buttonID) { + 1 -> playerl(FacialExpression.HALF_ASKING, "Why can't you sleep, what's wrong?").also { stage++ } + 2 -> playerl(FacialExpression.FRIENDLY, "Sorry! I'm too busy to hear your problems!").also { stage = END_DIALOGUE } + } + 4 -> npcl(FacialExpression.SAD, "It's brother Androe's son! With his constant: Waaaaaah! Waaaaaaaaah! Androe said it's natural, but it's so annoying!").also { stage++ } + + 5 -> playerl(FacialExpression.NEUTRAL, "I suppose that's what kids do.").also { stage++ } + 6 -> npcl(FacialExpression.SAD, "He was fine, up until last week! Thieves broke in! They stole his favourite sleeping blanket!").also { stage++ } + 7 -> npcl(FacialExpression.SAD, "Now he won't rest until it's returned... ...and that, means neither can I!").also { stage++ } + 8 -> options( + "Can I help at all?", + "I'm sorry to hear that! I hope you find his blanket.").also { stage++ } + 9 -> when (buttonID) { + 1 -> playerl(FacialExpression.HALF_ASKING, "Can I help at all?").also { stage++ } + 2 -> playerl(FacialExpression.FRIENDLY, "I'm sorry to hear that! I hope you find his blanket.").also { stage = END_DIALOGUE } + } + 10 -> npcl(FacialExpression.HALF_WORRIED, "Please do. We won't be able to help you as we are peaceful men but we would be grateful for your help!").also { stage++ } + 11 -> playerl(FacialExpression.HALF_ASKING, "Where are they?").also { stage++ } + 12 -> npcl(FacialExpression.SAD, "They hide in a secret cave in the forest. It's hidden under a ring of stones. Please, bring back the blanket!").also { stage = END_DIALOGUE }.also { player!!.questRepository.getQuest("Monk's Friend").start(player) }.also { player!!.questRepository.syncronizeTab(player) } + } + } + 10 -> { + when(stage) { + 0 -> playerl(FacialExpression.HAPPY, "Hello.").also{stage = 20 } + 20 -> npcl(FacialExpression.SAD, "*yawn*...oh, hello again...*yawn*").also{stage++ } + 21 -> npcl(FacialExpression.SAD, "Please tell me you have the blanket.").also{stage++} + 22 -> if(player!!.inventory.containItems(Items.CHILDS_BLANKET_90)){ + playerl(FacialExpression.HAPPY, "Yes! I've recovered it from the clutches of the evil thieves!").also{stage = 30} + } else { + playerl(FacialExpression.SAD, "I'm afraid not.").also{stage++} + } + 23 -> npcl(FacialExpression.SAD, "I need some sleep!").also{stage = END_DIALOGUE} + 30 -> { + sendItemDialogue(player!!, Items.CHILDS_BLANKET_90, "You hand the monk the childs blanket.") + stage=31 + } + 31 -> npcl(FacialExpression.HAPPY, "Really, that's excellent, well done! Maybe now I will be able to get some rest.").also{stage++} + 32 -> npcl(FacialExpression.SAD, "*yawn*..I'm off to bed! Farewell brave traveller!").also{player!!.inventory.remove(Item(Items.CHILDS_BLANKET_90)) + setQuest(player!!, 20); stage = END_DIALOGUE} + } + } + 20 -> { + when(stage) { + 0 -> playerl(FacialExpression.HAPPY, "Hello, how are you?").also{stage = 30 } + 30 -> npcl(FacialExpression.HAPPY, "Much better now I'm sleeping well! Now I can organise the party.").also{stage++} + 31 -> playerl(FacialExpression.HAPPY, "Ooh! What party?").also{stage++} + 32 -> npcl(FacialExpression.HAPPY, "The son of Brother Androe's birthday party. He's going to be one year old!").also {stage++} + 33 -> playerl(FacialExpression.HAPPY, "That's sweet!").also{stage++ } + 34 -> npcl(FacialExpression.HAPPY, "It's also a great excuse for a drink!").also{stage++} + 35 -> npcl(FacialExpression.NEUTRAL, "We just need Brother Cedric to return with the wine.").also{stage++} + 36 -> options( + "Who's Brother Cedric?", + "Enjoy it! I'll see you soon!").also { stage++} + 37 -> when(buttonID){ + 1 -> playerl(FacialExpression.HALF_ASKING, "Who's Brother Cedric?").also{stage++} + 2 -> playerl(FacialExpression.FRIENDLY, "Enjoy it! I'll see you soon!").also{stage = 998} + } + 998 -> npcl(FacialExpression.NEUTRAL, "Take care traveller.").also{stage = END_DIALOGUE} + 38 -> npcl(FacialExpression.FRIENDLY, "Cedric is a member of the order too. We sent him out three days ago to collect wine. But he didn't return!").also{stage++} + 39 -> npcl(FacialExpression.NEUTRAL, "He most probably got drunk and lost in the forest!").also{stage++} + 40 -> options( + "I've no time for that, sorry.", + "Where should I look?", + "Can I come to the party?").also { stage++} + 41 -> when(buttonID){ + 1 -> playerl(FacialExpression.NEUTRAL, "I've no time for that, sorry.").also {stage = 996} + 2 -> playerl(FacialExpression.HALF_ASKING, "Where should I look?").also {stage++} + 3 -> playerl(FacialExpression.HALF_ASKING, "Can I come to the party?").also{stage = 997} + } + 996 -> npcl(FacialExpression.NEUTRAL, "Okay traveller, take care.").also{stage = END_DIALOGUE} + 997 -> npcl(FacialExpression.NEUTRAL, "Of course, but we need the wine first.").also{stage = END_DIALOGUE} + 42 -> npcl(FacialExpression.FRIENDLY, "Oh, he won't be far. Probably out in the forest.").also{stage++} + 43 -> playerl(FacialExpression.FRIENDLY, "Ok, I'll go and find him.").also { stage = END_DIALOGUE}.also{ setQuest(player!!, 30);} + } + } + 30 -> { + when(stage) { + 0 -> playerl(FacialExpression.HAPPY, "Hello brother Omad.").also{stage = 50} + 50 -> npcl(FacialExpression.NEUTRAL, "Hello adventurer, have you found Brother Cedric?").also{stage++} + 51 -> playerl(FacialExpression.SAD, "Not yet.").also{stage++} + 52 -> npcl(FacialExpression.FRIENDLY, "Well, keep looking, we need that wine!").also{stage = END_DIALOGUE} + } + } + 40 -> { + when(stage) { + 0 -> npcl(FacialExpression.HAPPY, "Hello adventurer, have you found Brother Cedric?").also{stage = 60} + 60 -> playerl(FacialExpression.NEUTRAL, "Yes I've seen him, he's a bit drunk!").also{stage++} + 61 -> npcl(FacialExpression.FRIENDLY, "Well, try your best to get him back here!").also{stage = END_DIALOGUE} + } + } + 41, 42 -> { + when(stage) { + 0 -> playerl(FacialExpression.HAPPY, "Hello again brother Omad.").also{stage = 70} + 70 -> npcl(FacialExpression.NEUTRAL, "Hello adventurer, where's Brother Cedric?").also{stage++} + 71 -> npcl(FacialExpression.NEUTRAL, "He's having a bit of trouble with his cart.").also{stage++} + 72 -> npcl(FacialExpression.NEUTRAL, "Hmmm! Maybe you could help?").also{stage = END_DIALOGUE} + } + } + 50 -> { + when(stage) { + 0 -> playerl(FacialExpression.HAPPY, "Hi Omad, Brother Cedric is on his way!").also{stage = 80} + 80 -> npcl(FacialExpression.HAPPY, "Good! Good! Now we can party!").also{stage++} + 81 -> npcl(FacialExpression.HAPPY, "I have little to repay you with, but I'd like to offer you some rune stones. But first, let's party!").also{stage++} + 82 -> sendDialogue(player!!, "Brother Omad gives you 8 Law Runes").also{stage++} + 83 -> playerl(FacialExpression.HAPPY, "Thanks Brother Omad!").also{stage++} + 84 -> { + commenceMonkParty(true) + end() + } + } + } + 100 -> { + commenceMonkParty(false) + } + } + } + + private fun commenceMonkParty(questComplete : Boolean) { + val brotherOmad: NPC? = RegionManager.getNpc(Location(2604, 3209, 0), 279, 6) + val monk: NPC? = RegionManager.getNpc(Location(2609, 3207, 0), 281, 6) + + // Spawn balloons when PartyRoom code is fixed. + + Pulser.submit(object : Pulse(1) { + var count = 0 + override fun pulse(): Boolean { + when (count) { + 1 -> { + brotherOmad!!.sendChat("Party!") + brotherOmad.animator.animate(Animation(866)) // Dance + + } + 3 -> { + player!!.sendChat("Woop!") + player!!.animator.animate(Animation(866)) // Dance + } + 5 -> { + monk!!.sendChat("Yeah!") + monk.animator.animate(Animation(2106)) // Jig + } + 7 -> brotherOmad!!.sendChat("Let's boogie!") + 9 -> player!!.sendChat("Oh, baby!") + 11 -> monk!!.sendChat("GO!") + 13 -> { + brotherOmad!!.sendChat("Get down!") + brotherOmad.animator.animate(Animation(2108)) // Headbang + } + 15 -> player!!.sendChat("Feel the rhythm!") + 17 -> monk!!.sendChat("Dance!") + 19 -> brotherOmad!!.sendChat("Oh my!") + 21 -> { + player!!.sendChat("Watch me go!") + player!!.animator.animate(Animation(861)) // Laugh + } + 23 -> { + monk!!.sendChat("You go!") + monk.animator.animate(Animation(2109)) // Jump for joy + } + 25 -> if (questComplete) { + player!!.questRepository.getQuest("Monk's Friend").finish(player) + player!!.questRepository.getQuest("Monk's Friend").setStage(player, 100) + } + } + count++ + return false + } + }) + } +} + +/** + * Handles BrotherCedricListener to launch the dialogue + * @author Kya + */ +class BrotherOmadListener : InteractionListener() { + override fun defineListeners() { + on(NPCs.BROTHER_OMAD_279, NPC, "talk-to"){ player, _ -> + player.dialogueInterpreter.open(BrotherOmadDialogue(), NPC(NPCs.BROTHER_OMAD_279)) + return@on true + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/MonasteryMonkNPC.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/MonasteryMonkNPC.kt new file mode 100644 index 000000000..ce26756b6 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/MonasteryMonkNPC.kt @@ -0,0 +1,44 @@ +package rs09.game.content.quest.members.monksfriend + +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import org.rs09.consts.NPCs +import rs09.game.content.dialogue.DialogueFile +import rs09.game.interaction.InteractionListener +import rs09.tools.END_DIALOGUE + +/** +* Handles MonasteryMonkDialogue Dialogue +* @author Kya +*/ +class MonasteryMonkDialogue : DialogueFile() { + override fun handle(interfaceId: Int, buttonId: Int) { + var questStage = player!!.questRepository.getStage("Monk's Friend") + if (questStage == 0){ + when(stage) { + 0 -> npcl(FacialExpression.NEUTRAL,"Peace brother.").also { stage = END_DIALOGUE } + } + } else if (questStage < 100) { + when(stage) { + 0 -> npcl(FacialExpression.FRIENDLY,"*yawn*").also{stage = END_DIALOGUE} + } + } else { + when(stage) { + 0 -> npcl(FacialExpression.HAPPY,"Can't wait for the party!").also{stage = END_DIALOGUE} + } + } + } +} + +/** + * Handles BrotherCedricListener to launch the dialogue + * @author Kya + */ +class MonasteryMonkListener : InteractionListener() { + override fun defineListeners() { + on(NPCs.MONK_281, NPC, "talk-to"){ player, _ -> + player.dialogueInterpreter.open(MonasteryMonkDialogue(), NPC(NPCs.MONK_281)) + return@on true + } + } +} diff --git a/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/MonksFriend.kt b/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/MonksFriend.kt new file mode 100644 index 000000000..506aafef8 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/quest/members/monksfriend/MonksFriend.kt @@ -0,0 +1,71 @@ +package rs09.game.content.quest.members.monksfriend + + +import api.* +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.quest.Quest +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import core.plugin.Initializable +import org.rs09.consts.Items + +/** +* Represents the "Monk's Friend" quest. +* @author Kya +*/ + +@Initializable +class MonksFriend: Quest("Monk's Friend", 89, 88, 1, 30, 0, 1, 80) { + + override fun newInstance(`object`: Any?): Quest { + return this + } + + override fun drawJournal(player: Player?, stage: Int) { + super.drawJournal(player, stage) + var line = 11 + player?: return + if(stage == 0){ + line(player, "I can start this quest by speaking to !!Brother Omad?? in the", line++) + line(player, "!!Monastery?? south of !!Ardougne??.", line++) + line++ + } + if(stage == 10){ + line(player, "Brother Omad asked me to recover a child's blanket.", line++) + } + if(stage >= 20){ + line(player, "Brother Omad asked me to recover a child's blanket, I ", line++, true) + line(player, "found the secret cave and gave back the blanket.", line++, true) + + } + if(stage ==30){ + line(player, "I agreed to find !!Brother Cedric.?? he is somewhere in the", line++) + line(player, "!!forest?? south of !!Ardougne??", line++) + } + if(stage >= 50){ + line(player, "I found Brother Cedric in the forest south of Ardougne.", line++, true) + line(player, "I sobered him up and I helped him fix his cart.", line++, true) + } + if(stage == 100){ + line(player, "I had a party with the Monks. There were party balloons and we danced the night away!", line++, true) + } + } + + override fun finish(player: Player?) { + super.finish(player) + player ?: return + var ln = 10 + player.packetDispatch.sendItemZoomOnInterface(Items.LAW_RUNE_563, 230, 277, 5) + drawReward(player,"1 Quest Point", ln++) + drawReward(player,"8 Law Runes", ln++) + drawReward(player,"2000 Woodcutting XP", ln++) + + rewardXP(player, Skills.WOODCUTTING, 2000.0) + player.inventory.add(Item(563, 8)) + } +} + +fun setQuest(player: Player, stage: Int){ + player.questRepository.getQuest("Monk's Friend").setStage(player, stage) +} + diff --git a/Server/src/main/kotlin/rs09/game/content/zone/StoneCircleZone.kt b/Server/src/main/kotlin/rs09/game/content/zone/StoneCircleZone.kt new file mode 100644 index 000000000..a7267e77e --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/zone/StoneCircleZone.kt @@ -0,0 +1,47 @@ +package rs09.game.content.zone + +import core.game.node.entity.Entity +import core.game.node.entity.player.Player +import core.game.world.map.zone.MapZone +import core.game.world.map.zone.ZoneBorders +import core.game.world.map.zone.ZoneBuilder +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * Handles the stone circle zone south of Ardougne. + * @author Kya + */ +@Initializable +class StoneCircleZone : MapZone("stone circle", true), Plugin { + /** + * Constructs a new `StoneCircleZone` `Object`. + */ + override fun configure() { + register(ZoneBorders(2558, 3219, 2559, 3225)) + register(ZoneBorders(2560, 3219, 2564, 3225)) + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any? { + return null + } + + override fun newInstance(arg: Any?): Plugin { + ZoneBuilder.configure(this) + return this + } + + override fun enter(e: Entity): Boolean { + if (e is Player) { + e.varpManager.get(1184).setVarbit(28, 1).send(e) + } + return super.enter(e) + } + + override fun leave(e: Entity, logout: Boolean): Boolean { + if (!logout && e is Player) { + e.varpManager.get(1184).setVarbit(28, 0).send(e) + } + return super.leave(e, logout) + } +} \ No newline at end of file