diff --git a/Server/src/main/java/core/game/content/dialogue/HuntingExpert.java b/Server/src/main/java/core/game/content/dialogue/HuntingExpert.java index 94cafcbf0..d96b35b74 100644 --- a/Server/src/main/java/core/game/content/dialogue/HuntingExpert.java +++ b/Server/src/main/java/core/game/content/dialogue/HuntingExpert.java @@ -270,6 +270,6 @@ public final class HuntingExpert extends DialoguePlugin { @Override public int[] getIds() { - return new int[] { 5112, 5113 }; + return new int[] { 5113 }; } } diff --git a/Server/src/main/java/core/game/node/entity/player/link/diary/DiaryType.java b/Server/src/main/java/core/game/node/entity/player/link/diary/DiaryType.java index c2afe5d9a..a91f4b5bc 100644 --- a/Server/src/main/java/core/game/node/entity/player/link/diary/DiaryType.java +++ b/Server/src/main/java/core/game/node/entity/player/link/diary/DiaryType.java @@ -344,16 +344,16 @@ public enum DiaryType { new String[]{"Easy", "Medium", "Hard"}, new String[][]{ { - "Kill a cave crawler in the Fremennik Slayer Dungeon", // TODO - "Kill five rock crabs on the shore near Rellekka or on

Waterbirth Island", // TODO - "Find the highest tree on the Fremennik mainland", // TODO - "View the rewards in the Barbarian Assault tutorial", // TODO - "Speak to Otto Godblessed about barbarian training", // TODO - "Collect three seaweed from the shore north-east of Rellekka", // TODO - "Find the Hunting Expert on the northern ice plains", // TODO - "Catch a fish off one of Rellekka's piers", // TODO - "Recharge your Summoning points near Rellekka's gate", // TODO - "Kill an adult black unicorn" // TODO + "Kill a cave crawler in the Fremennik Slayer Dungeon", + "Kill five rock crabs on the shore near Rellekka or on

Waterbirth Island", + "Find the highest tree on the Fremennik mainland", + "View the rewards in the Barbarian Assault tutorial", // TODO: Move this to appropriate dialogue once Barbarian Assault is implemented + "Speak to Otto Godblessed about barbarian training", // TODO: Move this to an appropriate point once the entirety of Barbarian training is implemented + "Collect three seaweed from the shore north-east of Rellekka", + "Find the Hunting Expert on the northern ice plains", // TODO: Transcribe the appropriate authentic dialogue for this NPC. Mockup dialogue implemented as a bandaid. + "Catch a fish off one of Rellekka's piers", // TODO: Make this check for any Fishing Spots within the Rellekkan region ID list. Currently only checks the "Cage/Harpoon" Fishing spots at the northeastern most pier. + "Recharge your Summoning points near Rellekka's gate", + "Kill an adult black unicorn" }, { "Learn of the history of the Fremennik and the Outerlanders

from Chieftain Brundt", // TODO diff --git a/Server/src/main/kotlin/api/events/Events.kt b/Server/src/main/kotlin/api/events/Events.kt index 3d8d90c1e..2e76c9bd2 100644 --- a/Server/src/main/kotlin/api/events/Events.kt +++ b/Server/src/main/kotlin/api/events/Events.kt @@ -15,5 +15,6 @@ 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 data class TickEvent(val worldTicks: Int) : Event +data class PickUpEvent(val itemId: Int) : Event data class InterfaceOpenEvent(val component: Component) : Event data class InterfaceCloseEvent(val component: Component) : 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 00fedfc41..62e1b3408 100644 --- a/Server/src/main/kotlin/rs09/game/Event.kt +++ b/Server/src/main/kotlin/rs09/game/Event.kt @@ -12,6 +12,7 @@ object Event { @JvmStatic val UsedWith = UsedWithEvent::class.java @JvmStatic val SelfDeath = SelfDeath::class.java @JvmStatic val Tick = TickEvent::class.java + @JvmStatic val PickedUp = PickUpEvent::class.java @JvmStatic val InterfaceOpened = InterfaceOpenEvent::class.java @JvmStatic val InterfaceClosed = InterfaceCloseEvent::class.java } \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/barbarianassault/CaptainCainDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/barbarianassault/CaptainCainDialogue.kt index 469e9a2d5..f3810c146 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/region/barbarianassault/CaptainCainDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/barbarianassault/CaptainCainDialogue.kt @@ -4,6 +4,7 @@ import api.* import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType import core.game.node.item.Item import core.plugin.Initializable import org.rs09.consts.Items @@ -22,6 +23,7 @@ class CaptainCainDialogue(player: Player? = null) : DialoguePlugin(player) { override fun open(vararg args: Any?): Boolean { npcl(FacialExpression.FRIENDLY, "Hello, there, adventurer. Say, you wouldn't happen to be interested in purchasing a Fighter Torso would you?") + player.achievementDiaryManager.finishTask(player,DiaryType.FREMENNIK,0,3) stage = 0 return true } diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/ottosgrotto/OttoGodblessedDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ottosgrotto/OttoGodblessedDialogue.kt index 6b01e2701..0eebcb296 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/region/ottosgrotto/OttoGodblessedDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/ottosgrotto/OttoGodblessedDialogue.kt @@ -4,6 +4,7 @@ import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType import core.plugin.Initializable import rs09.tools.END_DIALOGUE @@ -49,7 +50,7 @@ class OttoGodblessedDialogue(player: Player? = null) : DialoguePlugin(player) { 25 -> npc("Look, just... grab the pole under my bed","and go click on that fishing spot.").also { stage++ } 26 -> player(FacialExpression.ASKING,"...click?").also { stage++ } 27 -> npc(FacialExpression.FURIOUS, "JUST GO DO IT!").also { stage++; player.setAttribute("/save:barbtraining:fishing",true) } - 28 -> end() + 28 -> end().also { player.achievementDiaryManager.finishTask(player, DiaryType.FREMENNIK,0,4) } } return true } diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDialogue.kt index 47d8bfcc7..5cfc3e13c 100644 --- a/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDialogue.kt +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDialogue.kt @@ -1,12 +1,18 @@ package rs09.game.content.dialogue.region.rellekka +import api.addItem import api.questStage +import api.sendItemDialogue import core.game.content.dialogue.DialoguePlugin import core.game.content.dialogue.FacialExpression import core.game.node.entity.npc.NPC import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.AchievementDiary +import core.game.node.entity.player.link.diary.DiaryType import core.plugin.Initializable +import org.rs09.consts.Items; import rs09.game.content.quest.members.thefremenniktrials.CouncilWorkerFTDialogue +import rs09.game.content.dialogue.region.rellekka.CouncilWorkerDiaryDialogue @Initializable class CouncilWorkerDialogue(player: Player? = null) : DialoguePlugin(player){ @@ -14,8 +20,13 @@ class CouncilWorkerDialogue(player: Player? = null) : DialoguePlugin(player){ npc = args[0] as NPC if(questStage(player, "Fremennik Trials") in 1..99){ player.dialogueInterpreter.open((CouncilWorkerFTDialogue(1))) - } else { - npc(FacialExpression.FRIENDLY,"'Ello there.").also { stage = 0 } + } + else if(player.achievementDiaryManager.getDiary(DiaryType.FREMENNIK).isComplete(0, true)){ + player.dialogueInterpreter.open((CouncilWorkerDiaryDialogue())) + } + else{ + player(FacialExpression.FRIENDLY,"Hello.") + npc(FacialExpression.FRIENDLY,"How do. You planning on crossing this here bridge and heading up to Rellekka then?").also { stage = 0 } } return true } diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDiaryDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDiaryDialogue.kt new file mode 100644 index 000000000..68e9f87fe --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/CouncilWorkerDiaryDialogue.kt @@ -0,0 +1,42 @@ +package rs09.game.content.dialogue.region.rellekka + +import api.* +import core.game.content.dialogue.FacialExpression +import org.rs09.consts.Items +import rs09.game.content.dialogue.DialogueFile +import rs09.tools.END_DIALOGUE +import rs09.tools.START_DIALOGUE + +const val COUNCIL_WORKER = 1287 + +class CouncilWorkerDiaryDialogue() : DialogueFile() { + + override fun handle(componentID: Int, buttonID: Int) { + + when (stage) { + START_DIALOGUE -> { + player(FacialExpression.FRIENDLY, "About my achievement diary...");stage++ + } + 1 -> { + npc(COUNCIL_WORKER, "You have completed the Fremennik Easy Diary!");stage++ + //player.achievementDiaryManager.getDiary(DiaryType.FREMENNIK).setLevelRewarded(0) + } + 2 -> { + player?.let { addItem(it, Items.FREMENNIK_SEA_BOOTS_1_14571) } + player?.let { + sendItemDialogue( + it, + Items.FREMENNIK_SEA_BOOTS_1_14571, + "The worker hands you some old sea boots." + );stage++ + } + } + 3 -> { + npc( + COUNCIL_WORKER, + "You can now use Peer the Seer to deposit your items!" + ).also { stage = END_DIALOGUE } + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/HuntingExpertRellekkaDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/HuntingExpertRellekkaDialogue.kt new file mode 100644 index 000000000..2939d407d --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/region/rellekka/HuntingExpertRellekkaDialogue.kt @@ -0,0 +1,61 @@ +package rs09.game.content.dialogue.region.rellekka + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.plugin.Initializable +import rs09.tools.END_DIALOGUE + +/** + * Represents the dialogue plugin used for the Hunting Expert in the Rellekkan Hunter area + * @author Crash + * @version 1.0 + */ +@Initializable +class HuntingExpertRellekkaDialogue(player: Player? = null) : DialoguePlugin(player) { + + override fun newInstance(player: Player): DialoguePlugin { + return HuntingExpertRellekkaDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc("Good day, you seem to have a keen eye. Maybe even", "some hunter's blood in that body of yours?") + stage = -1 + return true + } + + override fun init() { + super.init() + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + -1 -> options("Ask about polar hunting", "Nevermind.").also { stage++ } + 0 -> when(buttonId){ + 1 -> player("Is there anything you can teach me?").also { stage = 20 } + 2 -> stage++ + } + + 1 -> stage = END_DIALOGUE + + + 20 -> npc("I can teach you how to hunt.").also { stage++ } + 21 -> player("What kind of creatures can I hunt?").also { stage++ } + 22 -> npc("Many creatures in many ways.","You need to make some traps","and catch birds!").also { stage++ } + 23 -> player("Birds?").also { stage++ } + 24 -> npc(FacialExpression.ANGRY, "Yes, birds! Like these ones here!").also { stage++ } + 25 -> npc("Look, just... get some Hunting gear","and go set up some traps.").also { stage++ } + 26 -> player(FacialExpression.ASKING,"Is that it?").also { stage++ } + 27 -> npc(FacialExpression.FURIOUS, "JUST GO DO IT!").also { stage++ } + 28 -> end().also { player.achievementDiaryManager.finishTask(player, DiaryType.FREMENNIK,0,6) } + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(5112) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/content/global/action/PickupHandler.kt b/Server/src/main/kotlin/rs09/game/content/global/action/PickupHandler.kt index 8315db680..406e23752 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/action/PickupHandler.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/action/PickupHandler.kt @@ -1,5 +1,6 @@ package rs09.game.content.global.action +import api.events.PickUpEvent import core.game.content.dialogue.FacialExpression import core.game.content.global.GodType import core.game.node.entity.player.Player @@ -57,27 +58,14 @@ object PickupHandler { if (!RegionManager.isTeleportPermitted(item.location)) { player.animate(Animation.create(535)) } - - if (item is GroundSpawnLoader.GroundSpawn && item.getId() == Items.SEAWEED_401 - && player.zoneMonitor.isInZone("karamja") - && !player.achievementDiaryManager.hasCompletedTask(DiaryType.KARAMJA, 0, 7)) { - var seaweed = player.getAttribute("seaweed", 0) - seaweed++ - player.setAttribute("seaweed", seaweed) - player.achievementDiaryManager.updateTask(player, DiaryType.KARAMJA, 0, 7, seaweed >= 5) - } - // Collect five palm leaves - if (item.getId() == Items.PALM_LEAF_2339 && player.zoneMonitor.isInZone("karamja") && !player.achievementDiaryManager.hasCompletedTask(DiaryType.KARAMJA, 2, 7)) { - var palms = player.getAttribute("palms", 0) - palms++ - player.setAttribute("palms", palms) - player.achievementDiaryManager.updateTask(player, DiaryType.KARAMJA, 2, 7, palms >= 5) - } GroundItemManager.destroy(item) /* if (item.dropper?.isArtificial == true) { getItems(item.dropper)?.remove(item) - }*/ + } + */ + player.audioManager.send(Audio(2582, 10, 1)) + player.dispatch(PickUpEvent(item.id)) } return true } diff --git a/Server/src/main/kotlin/rs09/game/content/zone/WindsweptTreeZone.kt b/Server/src/main/kotlin/rs09/game/content/zone/WindsweptTreeZone.kt new file mode 100644 index 000000000..f08c91225 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/zone/WindsweptTreeZone.kt @@ -0,0 +1,52 @@ +package rs09.game.node.entity.player.diary.seers + +import core.game.node.entity.Entity +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.world.map.zone.MapZone +import core.game.node.entity.player.link.diary.DiaryType +import core.game.world.map.Location +import core.game.world.map.zone.ZoneBorders +import core.game.world.map.zone.ZoneBuilder +import core.plugin.Plugin + +@Initializable +class WindsweptTreeZone : MapZone("windswept-tree", true), Plugin { + + + override fun newInstance(arg: Any?): WindsweptTreeZone { + ZoneBuilder.configure(this) + return this + } + + override fun configure() { + super.register(ZoneBorders(2746, 3733, 2746, 3735)) + super.register(ZoneBorders(2570, 3732, 2570, 3736)) + } + + override fun enter(e: Entity?): Boolean { + return super.enter(e) + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun locationUpdate(e: Entity?, last: Location?) { + if (e is Player && !e.isArtificial) { + val player = e.asPlayer() + if (!player.achievementDiaryManager.hasCompletedTask(DiaryType.FREMENNIK, 0, 2)) { + player.achievementDiaryManager.finishTask(player, DiaryType.FREMENNIK, 0, 2) + println("Fremennik Easy Diary Task 2 Completed!") + } else { + player.achievementDiaryManager.finishTask(player, DiaryType.FREMENNIK, 0, 2) + } + } + } +} + + // override fun leave(e: Entity?, logout: Boolean) { + // if (e is Player) { + // super.leave(e, logout) + //} + //}} diff --git a/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/DiaryEventHook.kt b/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/DiaryEventHook.kt index e44fc94f1..368c22449 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/DiaryEventHook.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/player/link/diary/DiaryEventHook.kt @@ -26,12 +26,16 @@ class DiaryEventHook : LoginListener, Commands { player.hook(Event.Interaction, DiaryInteractionEvents) player.hook(Event.InterfaceOpened, DiaryInterfaceOpenEvents) player.hook(Event.InterfaceClosed, DiaryInterfaceCloseEvents) + player.hook(Event.PickedUp, DiaryPickupEvents) } companion object { private fun finishTask(entity: Player, diary: DiaryType, index: Int, task: Int) { entity.achievementDiaryManager.finishTask(entity, diary, index, task) } + private fun taskCompleted(entity: Player, diary: DiaryType,index: Int,task: Int): Boolean { + return entity.achievementDiaryManager.hasCompletedTask(diary,index,task) + } } private object DiaryInterfaceCloseEvents : EventHook { @@ -78,6 +82,8 @@ class DiaryEventHook : LoginListener, Commands { 24350, 24361 -> if (regionId == 12854) finishTask(entity, DiaryType.VARROCK, 0, 18) in 115..122 -> if (event.option == "burst") finishTask(entity, DiaryType.FALADOR, 0, 12) 16149 -> finishTask(entity, DiaryType.VARROCK, 0, 4) + 29944 -> if(regionId == 10552 && event.option == "renew-points") finishTask(entity, DiaryType.FREMENNIK,0,8) + //18137 -> if(regionId == 10810 && event.option == "examine") finishTask(entity, DiaryType.FREMENNIK,0,2) //2112 -> if() } } @@ -101,11 +107,63 @@ class DiaryEventHook : LoginListener, Commands { } } + private object DiaryPickupEvents : EventHook + { + override fun process(entity: Entity, event: PickUpEvent) { + if(entity !is Player) return + val regionId = entity.viewport.region.id + + val Karamja = intArrayOf(10801,10802,11053,11054,11055,11056,11057,11058,11309, + 11310,11311,11312,11313,11314,11565,11566,11567,11568,11569,11821,11822,11823) + + when(event.itemId){ + + Items.SEAWEED_401 -> { + if(regionId == 10810 && !taskCompleted(entity,DiaryType.FREMENNIK,0,5)){ + when(entity.getAttribute("RellekaSeaweed",0)){ + 0 -> entity.setAttribute("/save:RellekaSeaweed",1) + 1 -> entity.incrementAttribute("RellekaSeaweed") + 2 -> { + finishTask(entity, DiaryType.FREMENNIK,0,5) + entity.removeAttribute("RellekkaSeaweed") + } + } + } + if(regionId in Karamja && !taskCompleted(entity,DiaryType.KARAMJA, 0, 7)){ + when(entity.getAttribute("KaramjaSeaweed", 0)){ + 0 -> entity.setAttribute("/save:KaramjaSeaweed",1) + in 1..3 -> entity.incrementAttribute("KaramjaSeaweed") + 4 -> { + finishTask(entity,DiaryType.KARAMJA,0,7) + entity.removeAttribute("KaramjaSeaweed") + } + } + } + } + + Items.PALM_LEAF_2339 -> { + if(regionId in Karamja && !taskCompleted(entity,DiaryType.KARAMJA,2,7)){ + when(entity.getAttribute("KaramjaPalms",0)){ + 0 -> entity.setAttribute("/save:KaramjaPalms",1) + in 1..3 -> entity.incrementAttribute("KaramjaPalms") + 4 -> { + finishTask(entity,DiaryType.KARAMJA,2,7) + entity.removeAttribute("KaramjaPalms") + } + } + } + } + } + } + } + private object DiaryGatherHooks : EventHook { override fun process(entity: Entity, event: ResourceProducedEvent) { if (entity !is Player) return val regionId = entity.viewport.region.id - when (event.itemId) { + val RellekkaFishingSpots = intArrayOf(NPCs.FISHING_SPOT_324, NPCs.FISHING_SPOT_334, NPCs.FISHING_SPOT_322, NPCs.FISHING_SPOT_309) + when(event.itemId) + { //Cut a log from a teak tree Items.TEAK_LOGS_6333 -> finishTask(entity, DiaryType.KARAMJA, 1, 7) //Cut a log from a mahogany tree @@ -227,6 +285,15 @@ class DiaryEventHook : LoginListener, Commands { if (event.source.id == Scenery.COOKING_RANGE_114 && regionId == 12850) finishTask(entity, DiaryType.LUMBRIDGE, 0, 7) + + if(event.source.id == NPCs.FISHING_SPOT_324 && regionId == 10553) + finishTask(entity, DiaryType.FREMENNIK, 0, 7) + + //Fish off of any of Rellekka's piers + //in RellekkaFishingSpots -> { + // if(entity.viewport.region.id == 10553) + //finishTask(entity, DiaryType.FREMENNIK, 0, 7) + //} } } @@ -244,6 +311,8 @@ class DiaryEventHook : LoginListener, Commands { val metalDragons = intArrayOf(NPCs.BRONZE_DRAGON_1590, NPCs.IRON_DRAGON_1591, NPCs.STEEL_DRAGON_1592, NPCs.STEEL_DRAGON_3590) val lumZombies = intArrayOf(NPCs.ZOMBIE_73, NPCs.ZOMBIE_74) + val fremCrabs = intArrayOf(NPCs.ROCK_CRAB_1265,NPCs.ROCK_CRAB_1267,NPCs.GIANT_ROCK_CRAB_2452,NPCs.GIANT_ROCK_CRAB_2885) + val fremCrawlers = intArrayOf(NPCs.CAVE_CRAWLER_1600,NPCs.CAVE_CRAWLER_1601,NPCs.CAVE_CRAWLER_1602,NPCs.CAVE_CRAWLER_1603,NPCs.CAVE_CRAWLER_7787,NPCs.CAVE_CRAWLER_7812) override fun process(entity: Entity, event: NPCKillEvent) { if (entity !is Player) return @@ -261,6 +330,28 @@ class DiaryEventHook : LoginListener, Commands { } } + in fremCrawlers ->{ + if(entity.viewport.region.id == 11164){ + finishTask(entity,DiaryType.FREMENNIK,0,0) + } + } + + in fremCrabs -> { + if (entity.viewport.region.id == 10810 || entity.viewport.region.id == 10042) { + when(entity.getAttribute("FremCrabs",0)){ + 0 -> entity.setAttribute("/save:FremCrabs",1) + in 1..3 -> entity.incrementAttribute("FremCrabs") + 4 -> finishTask(entity,DiaryType.FREMENNIK, 0, 1) + } + } + } + + NPCs.BLACK_UNICORN_133 -> { + if (entity.viewport.region.id in 10808..10809){ + finishTask(entity,DiaryType.FREMENNIK,0,9) + } + } + NPCs.JOGRE_113 -> { if (entity.viewport.region.id == 11412) finishTask(entity, DiaryType.KARAMJA, 0, 9)