From 1f6b0e900ff7904d0893bb148bf5f3ca7a399ac3 Mon Sep 17 00:00:00 2001 From: Bonesy Date: Sat, 8 Jun 2024 11:14:03 +0000 Subject: [PATCH] Fixed bug causing loss of xp when interrupted burying bones --- .../global/skill/prayer/BoneBuryListener.kt | 70 ++++++------------- 1 file changed, 23 insertions(+), 47 deletions(-) diff --git a/Server/src/main/content/global/skill/prayer/BoneBuryListener.kt b/Server/src/main/content/global/skill/prayer/BoneBuryListener.kt index e8b93e25c..5b41927aa 100644 --- a/Server/src/main/content/global/skill/prayer/BoneBuryListener.kt +++ b/Server/src/main/content/global/skill/prayer/BoneBuryListener.kt @@ -5,6 +5,7 @@ import core.game.event.BoneBuryEvent import core.game.interaction.Clocks import core.game.interaction.IntType import core.game.interaction.InteractionListener +import core.game.interaction.QueueStrength import core.game.node.entity.player.Player import core.game.node.entity.skill.Skills import core.game.node.item.Item @@ -13,62 +14,37 @@ import org.rs09.consts.Sounds class BoneBuryListener : InteractionListener { override fun defineListeners() { - /** + + /* * Handles the bury options for bones in Bones.kt */ on(Bones.array, IntType.ITEM, "bury") { player, node -> val bones = Bones.forId(node.id) ?: return@on true + if (!clockReady(player, Clocks.SKILLING)) return@on true + if (!inInventory(player, node.id)) return@on true - // Checks if the player is delayed from burying a bone and begins the clock if none exists. - if (!clockReady(player, Clocks.SKILLING)) { - return@on true - } else { - delayClock(player, Clocks.SKILLING, 2) + stopWalk(player) + lock(player, 2) + delayClock(player, Clocks.SKILLING, 2) + sendMessage(player, "You dig a hole in the ground.") + animate(player, Animations.HUMAN_BURYING_BONES_827) + playAudio(player, Sounds.BONES_DOWN_2738) + + // A strong queue is required in the event a player moves immediately after clicking the bones + queueScript(player, 1, QueueStrength.STRONG) { + if (removeBones(player, node.asItem())) { + sendMessage(player, "You bury the bones.") + rewardXP(player, Skills.PRAYER, bones.experience) + player.dispatch(BoneBuryEvent(bones.itemId)) + } + return@queueScript stopExecuting(player) } - - // Verifies the bones are in the player's inventory. - if (!inInventory(player, bones.itemId)) { - return@on true - } - - // Replaces the bones slot in the inventory with nothing and checks that the bones are removed. - if (replaceSlot(player, node.asItem().slot, Item()) != node.asItem()) { - sendMessage(player, "The gods intervene and you keep your bones!") - return@on true - } - - buryBones(player, bones) return@on true } } - /** - * Buries the bones - * @param player the player burying the bones - * @param bones the bones being buried - */ - private fun buryBones(player: Player, bones: Bones): Boolean { - queueScript(player, 0) { stage -> - when (stage) { - 0 -> { - stopWalk(player) - lock(player, 2) - animate(player, Animations.HUMAN_BURYING_BONES_827) - playAudio(player, Sounds.BONES_DOWN_2738) - sendMessage(player, "You dig a hole in the ground.") - return@queueScript delayScript(player, 2) - } - - 1 -> { - sendMessage(player, "You bury the bones.") - rewardXP(player, Skills.PRAYER, bones.experience) - player.dispatch(BoneBuryEvent(bones.itemId)) - return@queueScript stopExecuting(player) - } - - else -> return@queueScript stopExecuting(player) - } - } - return true + private fun removeBones(player: Player, item: Item): Boolean { + val removedBones = replaceSlot(player, item.slot, Item()) + return removedBones == item && removedBones.slot == item.slot } } \ No newline at end of file