diff --git a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerInteractionHandler.kt b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerInteractionHandler.kt index eff8b243c..85e5793f0 100644 --- a/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerInteractionHandler.kt +++ b/Server/src/main/content/minigame/fishingtrawler/FishingTrawlerInteractionHandler.kt @@ -172,14 +172,9 @@ class NetLootDialogue(player: Player? = null): core.game.dialogue.DialoguePlugin override fun handle(interfaceId: Int, buttonId: Int): Boolean { val level = player.skills.getLevel(Skills.FISHING) when(buttonId){ - 1 -> TrawlerLoot.getLoot(level, rolls, true).forEach { - if(!player.bank.add(it)) GroundItemManager.create(it,player) - } - 2 -> TrawlerLoot.getLoot(level, rolls, false).forEach { - if(!player.bank.add(it)) GroundItemManager.create(it,player) - } + 1 -> TrawlerLoot.addLootAndMessage(player, level, rolls, true) + 2 -> TrawlerLoot.addLootAndMessage(player, level, rolls, false) } - player.sendMessage(colorize("%RYour reward has been sent to your bank.")) player.skills.addExperience(Skills.FISHING,(((0.015 * player.skills.getLevel(Skills.FISHING))) * player.skills.getLevel(Skills.FISHING)) * rolls) player.removeAttribute("ft-session") end() diff --git a/Server/src/main/content/minigame/fishingtrawler/TrawlerLoot.kt b/Server/src/main/content/minigame/fishingtrawler/TrawlerLoot.kt index 0f9058f58..48dd0493c 100644 --- a/Server/src/main/content/minigame/fishingtrawler/TrawlerLoot.kt +++ b/Server/src/main/content/minigame/fishingtrawler/TrawlerLoot.kt @@ -1,20 +1,26 @@ package content.minigame.fishingtrawler import content.global.skill.fishing.Fish +import core.api.splitLines +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager import core.game.node.item.Item import core.game.node.item.WeightedChanceItem import core.tools.RandomFunction +import core.tools.colorize import org.rs09.consts.Items /** * Rolls/stores the loot table for fishing trawler - * @author Ceikry + * @author Ceikry, RiL */ object TrawlerLoot { - val junkItems = arrayOf(Items.BROKEN_ARMOUR_698, Items.BROKEN_ARROW_687, Items.OLD_BOOT_685, Items.BROKEN_GLASS_1469, Items.BROKEN_STAFF_689, Items.BUTTONS_688,Items.DAMAGED_ARMOUR_697, Items.RUSTY_SWORD_686, Items.EMPTY_POT_1931, Items.OYSTER_407) - val trawlerFish = arrayOf(Fish.MANTA_RAY, Fish.SEA_TURTLE, Fish.SHARK, Fish.SWORDFISH, Fish.LOBSTER, Fish.TUNA, Fish.ANCHOVIE, Fish.SARDINE, Fish.SHRIMP) + private val junkItems = arrayOf(Items.BROKEN_ARMOUR_698, Items.BROKEN_ARROW_687, Items.OLD_BOOT_685, Items.BROKEN_GLASS_1469, Items.BROKEN_STAFF_689, Items.BUTTONS_688,Items.DAMAGED_ARMOUR_697, Items.RUSTY_SWORD_686, Items.EMPTY_POT_1931, Items.OYSTER_407) + private val trawlerFish = arrayOf(Fish.MANTA_RAY, Fish.SEA_TURTLE, Fish.SHARK, Fish.SWORDFISH, Fish.LOBSTER, Fish.TUNA, Fish.ANCHOVIE, Fish.SARDINE, Fish.SHRIMP) + private val trawlerFishIds = arrayOf(Items.RAW_MANTA_RAY_389, Items.RAW_SEA_TURTLE_395, Items.RAW_SHARK_383, Items.RAW_SWORDFISH_371, Items.RAW_LOBSTER_377, Items.RAW_TUNA_359, Items.RAW_ANCHOVIES_321, Items.RAW_SARDINE_327, Items.RAW_SHRIMPS_317) + private val trawlerMisc = arrayOf(Items.LOOP_HALF_OF_A_KEY_987, Items.TOOTH_HALF_OF_A_KEY_985, Items.CASKET_405, Items.PIRATES_HAT_2651, Items.LUCKY_CUTLASS_7140) - fun rollTrawlerFish(fishLevel: Int): Item { + private fun rollTrawlerFish(fishLevel: Int): Item { while(true) { for(f in trawlerFish) { if(f.level > fishLevel) { @@ -37,23 +43,41 @@ object TrawlerLoot { for(i in 0 until rolls){ val item = RandomFunction.rollWeightedChanceTable(listOf(*lootTable)) if(item.id == 0) { - val item = rollTrawlerFish(fishLevel) - loot.add(item) - } else { + loot.add(rollTrawlerFish(fishLevel)) + } else if (!skipJunk || item.id !in junkItems) { loot.add(item) } } - if(skipJunk){ - val removeList = ArrayList() - for(item in loot){ - if(junkItems.contains(item.id)) removeList.add(item) - } - loot.removeAll(removeList) - } return loot } - val lootTable = arrayOf( + /** + * Add Fishing trawler loot to [player] bank. Send message with summary of the loot + */ + @JvmStatic + fun addLootAndMessage(player: Player, fishLevel: Int, rolls: Int, skipJunk: Boolean) { + val frequencyList = listOf>(HashMap(), HashMap(), HashMap()) + getLoot(fishLevel, rolls, skipJunk).forEach { + if (!player.bank.add(it)) GroundItemManager.create(it, player) + when (it.id) { + in trawlerFishIds -> frequencyList[0].merge(it.name, 1, Int::plus) + in trawlerMisc -> frequencyList[1].merge(it.name, 1, Int::plus) + in junkItems -> frequencyList[2].merge(it.name, 1, Int::plus) + } + } + player.sendMessage(colorize("%RYour reward has been sent to your bank:")) + // Extract and join each frequency maps entries as string. Split based on length, then send each line as message. + frequencyList.forEachIndexed { idx, fMap -> + if (fMap.isNotEmpty()) { + splitLines( + fMap.entries.joinToString(prefix = if (idx == 0) "Fish: " else if (idx == 1) "Misc: " else "Junk: ", postfix = ".") { "${it.key}: ${it.value}" }, + 85 + ).forEach { player.sendMessage(it) } + } + } + } + + private val lootTable = arrayOf( WeightedChanceItem(0,1,1430), WeightedChanceItem(Items.BROKEN_ARROW_687,1,70), WeightedChanceItem(Items.BROKEN_GLASS_1469,1,70), diff --git a/Server/src/main/core/game/system/command/sets/MiscCommandSet.kt b/Server/src/main/core/game/system/command/sets/MiscCommandSet.kt index b0c0a3d83..c7f2b7f6c 100644 --- a/Server/src/main/core/game/system/command/sets/MiscCommandSet.kt +++ b/Server/src/main/core/game/system/command/sets/MiscCommandSet.kt @@ -422,7 +422,7 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){ } else { args[1].toString().toInt() } - player.bank.add(*TrawlerLoot.getLoot(player.skills.getLevel(Skills.FISHING), rolls, false).toTypedArray()) + TrawlerLoot.addLootAndMessage(player, player.skills.getLevel(Skills.FISHING), rolls, false) } define("fillbank", Privilege.ADMIN, "", "Right as it says on the tin."){player,_ ->