From 60ae06d42a94d0e252dcdd2889451c92f4850992 Mon Sep 17 00:00:00 2001 From: Ryan <2804894-ryannathans@users.noreply.gitlab.com> Date: Tue, 18 Jan 2022 09:29:58 +0000 Subject: [PATCH] refactor NPCDropTable, WeightBasedTable to fix bugs --- CHANGELOG | 3 +- .../rs09/game/content/global/NPCDropTable.kt | 38 ++-------- .../game/content/global/WeightBasedTable.kt | 70 ++++++++++--------- .../skill/thieving/ThievingListeners.kt | 2 +- 4 files changed, 46 insertions(+), 67 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index d5f6106cb..9e3c027ef 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -114,4 +114,5 @@ - Waterbirth Dungeon is now cannonable - aweinstock - Spinolyps only drain prayer if they hit, and always target ranged defence (plus null reference fix) - aweinstock - Increase drop rate of Sinister Key to 1/12 - aweinstock -- Strike spells now always max on Salarin, convert Yanille Agility Dungeon to kotlin + listener - aweinstock \ No newline at end of file +- Strike spells now always max on Salarin, convert Yanille Agility Dungeon to kotlin + listener - aweinstock +- Refactor NPCDropTable, WeightBasedTable and fixed bug where special items weren't processed in some cases - ryannathans diff --git a/Server/src/main/kotlin/rs09/game/content/global/NPCDropTable.kt b/Server/src/main/kotlin/rs09/game/content/global/NPCDropTable.kt index 3b2684860..acea8a8cf 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/NPCDropTable.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/NPCDropTable.kt @@ -1,48 +1,20 @@ package rs09.game.content.global -import core.game.content.ttrail.ClueLevel -import core.game.content.ttrail.ClueScrollPlugin -import core.game.node.entity.npc.drop.RareDropTable -import core.game.node.entity.player.Player import core.game.node.item.Item -import core.tools.RandomFunction -import org.rs09.consts.Items class NPCDropTable : WeightBasedTable() { - val charmDrops = WeightBasedTable() + private val charmDrops = WeightBasedTable() fun addToCharms(element: WeightedItem): Boolean { return charmDrops.add(element) } - override fun roll(player: Player?): ArrayList { - val items= ArrayList(3) - items.addAll(guaranteedItems.map { it.getItem() }.toList()) - + override fun roll(): ArrayList { + val items = ArrayList() // Charms table is always rolled, and should contain explicit "Nothing" // entries at the data level to account for the chance to not drop a charm. - items.addAll(charmDrops.roll(null)) - - if(size == 1){ - items.add(get(0).getItem()) - return items - } - if(isNotEmpty()) { - var tempWeight = RandomFunction.randomDouble(totalWeight) - for (item in shuffled()) { - tempWeight -= item.weight - if (tempWeight <= 0) { - when(item.id){ - SLOT_CLUE_EASY -> items.add(ClueScrollPlugin.getClue(ClueLevel.EASY)) - SLOT_CLUE_MEDIUM -> items.add(ClueScrollPlugin.getClue(ClueLevel.MEDIUM)) - SLOT_CLUE_HARD -> items.add(ClueScrollPlugin.getClue(ClueLevel.HARD)) - SLOT_RDT -> items.add(RareDropTable.retrieve()) - else -> items.add(item.getItem()) - } - break - } - } - } + items.addAll(charmDrops.roll()) + items.addAll(super.roll()) return items } diff --git a/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt b/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt index 38c4ba653..9d903a657 100644 --- a/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt +++ b/Server/src/main/kotlin/rs09/game/content/global/WeightBasedTable.kt @@ -10,52 +10,59 @@ import core.tools.RandomFunction import org.rs09.consts.Items open class WeightBasedTable : ArrayList() { - var totalWeight = 0.0 - val guaranteedItems = ArrayList(5) + private var totalWeight = 0.0 + private val guaranteedItems = ArrayList() override fun add(element: WeightedItem): Boolean { - totalWeight += element.weight - return if(element.guaranteed) guaranteedItems.add(element) - else super.add(element) - } - - fun roll(): ArrayList{ - return roll(null) - } - - open fun roll(player: Player?): ArrayList{ - val items= ArrayList(3) - items.addAll(guaranteedItems.map { it.getItem() }.toList()) - - if(player?.inventory?.isFull == true){ - return items + return if (element.guaranteed) { + guaranteedItems.add(element) + } else { + totalWeight += element.weight + super.add(element) } + } - if(isNotEmpty()) { - var tempWeight = RandomFunction.randomDouble(totalWeight) + open fun roll(): ArrayList{ + val items = ArrayList() + items.addAll(guaranteedItems) + + if (size == 1) { + items.add(get(0)) + } + else if (isNotEmpty()) { + var rngWeight = RandomFunction.randomDouble(totalWeight) for (item in shuffled()) { - tempWeight -= item.weight - if (tempWeight <= 0) { - when(item.id){ - SLOT_CLUE_EASY -> items.add(ClueScrollPlugin.getClue(ClueLevel.EASY)) - SLOT_CLUE_MEDIUM -> items.add(ClueScrollPlugin.getClue(ClueLevel.MEDIUM)) - SLOT_CLUE_HARD -> items.add(ClueScrollPlugin.getClue(ClueLevel.HARD)) - SLOT_RDT -> items.add(RareDropTable.retrieve()) - else -> items.add(item.getItem()) - } + rngWeight -= item.weight + if (rngWeight <= 0) { + items.add(item) break } } } - return items + + return convertWeightedItems(items) + } + + private fun convertWeightedItems(weightedItems: ArrayList): ArrayList { + val safeItems = ArrayList(weightedItems.size) + weightedItems.forEach { e -> + val safeItem = when (e.id) { + SLOT_CLUE_EASY -> ClueScrollPlugin.getClue(ClueLevel.EASY) + SLOT_CLUE_MEDIUM -> ClueScrollPlugin.getClue(ClueLevel.MEDIUM) + SLOT_CLUE_HARD -> ClueScrollPlugin.getClue(ClueLevel.HARD) + SLOT_RDT -> RareDropTable.retrieve() + else -> e.getItem() + } + safeItems.add(safeItem) + } + return safeItems } open fun canRoll(player: Player): Boolean{ val guaranteed = guaranteedItems.map { it.getItem() }.toTypedArray() - return (player.inventory.hasSpaceFor(*guaranteed) && guaranteed.isNotEmpty()) || !player.inventory.isFull + return (guaranteed.isNotEmpty() && player.inventory.hasSpaceFor(*guaranteed)) || !player.inventory.isFull } - fun insertEasyClue(weight: Double): WeightBasedTable{ this.add(WeightedItem(SLOT_CLUE_EASY,1,1,weight,false)) return this @@ -76,7 +83,6 @@ open class WeightBasedTable : ArrayList() { return this } - companion object { @JvmStatic fun create(vararg items: WeightedItem): WeightBasedTable{ diff --git a/Server/src/main/kotlin/rs09/game/node/entity/skill/thieving/ThievingListeners.kt b/Server/src/main/kotlin/rs09/game/node/entity/skill/thieving/ThievingListeners.kt index 7550f392f..9a9c25bc9 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/skill/thieving/ThievingListeners.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/skill/thieving/ThievingListeners.kt @@ -65,7 +65,7 @@ class ThievingListeners : InteractionListener() { node.asNpc().face(null) } else { player.lock(2) - pickpocketData.table.roll(player).forEach { player.inventory.add(it) } + pickpocketData.table.roll().forEach { player.inventory.add(it) } player.skills.addExperience(Skills.THIEVING,pickpocketData.experience) }