NPC drop tables -> NPCDropTable.kt

Corrections to HAM members
This commit is contained in:
Ceikry 2021-03-19 23:32:12 -05:00
parent 398ea3b411
commit c59f66f7c5
7 changed files with 107 additions and 60 deletions

View file

@ -1,22 +1,26 @@
package core.game.node.entity.npc.drop; package core.game.node.entity.npc.drop;
import core.cache.def.impl.NPCDefinition; import core.cache.def.impl.NPCDefinition;
import core.game.node.item.*;
import rs09.game.system.config.ItemConfigParser;
import rs09.game.ai.AIPlayer;
import rs09.game.ai.AIRepository;
import rs09.game.ai.general.GeneralBotCreator;
import core.game.ge.GrandExchangeDatabase;
import core.game.content.global.Bones; import core.game.content.global.Bones;
import core.game.node.entity.skill.Skills; import core.game.ge.GrandExchangeDatabase;
import core.game.node.entity.Entity; import core.game.node.entity.Entity;
import core.game.node.entity.npc.NPC; import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.skill.Skills;
import core.game.node.item.GroundItem;
import core.game.node.item.GroundItemManager;
import core.game.node.item.Item;
import core.game.node.item.WeightedChanceItem;
import core.game.world.map.Location; import core.game.world.map.Location;
import core.game.world.map.RegionManager; import core.game.world.map.RegionManager;
import rs09.game.world.repository.Repository;
import core.tools.RandomFunction; import core.tools.RandomFunction;
import core.tools.StringUtils; import core.tools.StringUtils;
import rs09.game.ai.AIPlayer;
import rs09.game.ai.AIRepository;
import rs09.game.ai.general.GeneralBotCreator;
import rs09.game.content.global.NPCDropTable;
import rs09.game.system.config.ItemConfigParser;
import rs09.game.world.repository.Repository;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -52,6 +56,8 @@ public final class NPCDropTables {
*/ */
private final List<WeightedChanceItem> mainTable = new ArrayList<>(20); private final List<WeightedChanceItem> mainTable = new ArrayList<>(20);
public final NPCDropTable table = new NPCDropTable();
/** /**
* The NPC definitions. * The NPC definitions.
*/ */
@ -82,26 +88,7 @@ public final class NPCDropTables {
*/ */
public void drop(NPC npc, Entity looter) { public void drop(NPC npc, Entity looter) {
Player p = looter instanceof Player ? (Player) looter : null; Player p = looter instanceof Player ? (Player) looter : null;
if (!charmTable.isEmpty()) { table.roll().forEach(item -> createDrop(item,p,npc,npc.getDropLocation()));
boolean rollCharms = RandomFunction.random(5) == 3;
if(rollCharms) {
createDrop(RandomFunction.rollWeightedChanceTable(charmTable),p,npc,npc.getDropLocation());
}
}
defaultTable.forEach(drop -> {
createDrop(drop.getItem(),p,npc,npc.getDropLocation());
});
Item item = RandomFunction.rollWeightedChanceTable(mainTable);
//boolean hasWealthRing = p != null && p.getEquipment().getNew(EquipmentContainer.SLOT_RING).getId() == 2572;
if(item != null) {
boolean isRDTSlot = item.getId() == RareDropTable.SLOT_ITEM_ID;
if (isRDTSlot) {
item = RareDropTable.retrieve();
}
if (item != null && p != null && npc != null) {
createDrop(item, p, npc, npc.getDropLocation());
}
}
} }
/** /**

View file

@ -1,5 +1,8 @@
package rs09.game.content.global 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.entity.player.Player
import core.game.node.item.Item import core.game.node.item.Item
import core.tools.RandomFunction import core.tools.RandomFunction
@ -14,13 +17,14 @@ class NPCDropTable : WeightBasedTable() {
else super.add(element) else super.add(element)
} }
override fun roll(player: Player): ArrayList<Item> { override fun roll(player: Player?): ArrayList<Item> {
if(size == 0) return ArrayList()
val items= ArrayList<Item>(3) val items= ArrayList<Item>(3)
var tempWeight = RandomFunction.randomDouble(totalWeight) var tempWeight = RandomFunction.randomDouble(totalWeight)
items.addAll(guaranteedItems.map { it.getItem() }.toList()) items.addAll(guaranteedItems.map { it.getItem() }.toList())
if(RandomFunction.random(1,15) == 5){ if(RandomFunction.random(1,15) == 5){
items.addAll(charmDrops.roll(player)) items.addAll(charmDrops.roll(null))
} }
if(size == 1){ if(size == 1){
items.add(get(0).getItem()) items.add(get(0).getItem())
@ -30,7 +34,13 @@ class NPCDropTable : WeightBasedTable() {
for (item in shuffled()) { for (item in shuffled()) {
tempWeight -= item.weight tempWeight -= item.weight
if (tempWeight <= 0) { if (tempWeight <= 0) {
items.add(item.getItem()) 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 break
} }
} }

View file

@ -1,8 +1,13 @@
package rs09.game.content.global package rs09.game.content.global
import core.cache.def.impl.ItemDefinition
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.entity.player.Player
import core.game.node.item.Item import core.game.node.item.Item
import core.tools.RandomFunction import core.tools.RandomFunction
import org.rs09.consts.Items
open class WeightBasedTable : ArrayList<WeightedItem>() { open class WeightBasedTable : ArrayList<WeightedItem>() {
var totalWeight = 0.0 var totalWeight = 0.0
@ -14,12 +19,17 @@ open class WeightBasedTable : ArrayList<WeightedItem>() {
else super.add(element) else super.add(element)
} }
open fun roll(player: Player): ArrayList<Item>{ fun roll(): ArrayList<Item>{
return roll(null)
}
open fun roll(player: Player?): ArrayList<Item>{
if(size == 0) return ArrayList()
val items= ArrayList<Item>(3) val items= ArrayList<Item>(3)
var tempWeight = RandomFunction.randomDouble(totalWeight) var tempWeight = RandomFunction.randomDouble(totalWeight)
items.addAll(guaranteedItems.map { it.getItem() }.toList()) items.addAll(guaranteedItems.map { it.getItem() }.toList())
if(player.inventory.isFull){ if(player?.inventory?.isFull == true){
return items return items
} }
@ -27,7 +37,13 @@ open class WeightBasedTable : ArrayList<WeightedItem>() {
for (item in shuffled()) { for (item in shuffled()) {
tempWeight -= item.weight tempWeight -= item.weight
if (tempWeight <= 0) { if (tempWeight <= 0) {
items.add(item.getItem()) 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 break
} }
} }
@ -40,6 +56,28 @@ open class WeightBasedTable : ArrayList<WeightedItem>() {
return (player.inventory.hasSpaceFor(*guaranteed) && guaranteed.isNotEmpty()) || !player.inventory.isFull return (player.inventory.hasSpaceFor(*guaranteed) && guaranteed.isNotEmpty()) || !player.inventory.isFull
} }
fun insertEasyClue(weight: Double): WeightBasedTable{
this.add(WeightedItem(SLOT_CLUE_EASY,1,1,weight,false))
return this
}
fun insertMediumClue(weight: Double): WeightBasedTable{
this.add(WeightedItem(SLOT_CLUE_MEDIUM,1,1,weight,false))
return this
}
fun insertHardClue(weight: Double): WeightBasedTable{
this.add(WeightedItem(SLOT_CLUE_HARD,1,1,weight,false))
return this
}
fun insertRDTRoll(weight: Double): WeightBasedTable{
this.add(WeightedItem(SLOT_RDT,1,1,weight,false))
return this
}
companion object { companion object {
@JvmStatic @JvmStatic
fun create(vararg items: WeightedItem): WeightBasedTable{ fun create(vararg items: WeightedItem): WeightBasedTable{
@ -49,5 +87,20 @@ open class WeightBasedTable : ArrayList<WeightedItem>() {
} }
return table return table
} }
@JvmField
val SLOT_RDT = Items.TINDERBOX_31
val SLOT_CLUE_EASY = Items.TOOLKIT_1
val SLOT_CLUE_MEDIUM = Items.ROTTEN_POTATO_5733
val SLOT_CLUE_HARD = Items.GRANITE_LOBSTER_POUCH_12070
}
override fun toString(): String {
val builder = StringBuilder()
for(item in this){
builder.append("${ItemDefinition.forId(item.id).name} || Weight: ${item.weight} || MinAmt: ${item.minAmt} || maxAmt: ${item.maxAmt}")
builder.appendLine()
}
return builder.toString()
} }
} }

View file

@ -23,7 +23,6 @@ class ShootingStarEvent : WorldEvent("shooting-stars") {
override fun initialize() { override fun initialize() {
plugins = PluginSet( plugins = PluginSet(
ScoreboardHandler(), ScoreboardHandler(),
ShootingStarOptionHandler(),
ShootingStarScoreboard(), ShootingStarScoreboard(),
StarChartPlugin(), StarChartPlugin(),
ShootingStarCommands(), ShootingStarCommands(),

View file

@ -25,10 +25,10 @@ enum class Pickpockets(val ids: IntArray, val requiredLevel: Int, val low: Doubl
WeightedItem(Items.UNCUT_OPAL_1625,1,1,2.5), WeightedItem(Items.UNCUT_OPAL_1625,1,1,2.5),
WeightedItem(Items.RAW_ANCHOVIES_321,1,1,7.0), WeightedItem(Items.RAW_ANCHOVIES_321,1,1,7.0),
WeightedItem(Items.RAW_CHICKEN_2138,1,1,3.5), WeightedItem(Items.RAW_CHICKEN_2138,1,1,3.5),
WeightedItem(Items.HAM_CLOAK_4304,1,1,1.0), WeightedItem(Items.HAM_CLOAK_4304,1,1,0.25),
WeightedItem(Items.HAM_HOOD_4302,1,1,1.0), WeightedItem(Items.HAM_HOOD_4302,1,1,0.25),
WeightedItem(Items.HAM_LOGO_4306,1,1,1.0), WeightedItem(Items.HAM_LOGO_4306,1,1,0.25),
WeightedItem(Items.HAM_ROBE_4300,1,1,1.0), WeightedItem(Items.HAM_ROBE_4300,1,1,0.25),
WeightedItem(Items.BOOTS_4310,1,1,1.0), WeightedItem(Items.BOOTS_4310,1,1,1.0),
WeightedItem(Items.GLOVES_4308,1,1,1.0), WeightedItem(Items.GLOVES_4308,1,1,1.0),
WeightedItem(Items.BRONZE_PICKAXE_1265,1,1,5.0), WeightedItem(Items.BRONZE_PICKAXE_1265,1,1,5.0),
@ -42,7 +42,7 @@ enum class Pickpockets(val ids: IntArray, val requiredLevel: Int, val low: Doubl
WeightedItem(Items.BROKEN_ARMOUR_698,1,1,3.5), WeightedItem(Items.BROKEN_ARMOUR_698,1,1,3.5),
WeightedItem(Items.BROKEN_STAFF_689,1,1,3.2), WeightedItem(Items.BROKEN_STAFF_689,1,1,3.2),
WeightedItem(Items.BROKEN_ARROW_687,1,1,3.1) WeightedItem(Items.BROKEN_ARROW_687,1,1,3.1)
)), ).insertEasyClue(1.0)),
FEMALE_HAM_MEMBER(intArrayOf(1715), 15, 135.0, 240.0, 18.5, 1,3,4, WeightBasedTable.create( FEMALE_HAM_MEMBER(intArrayOf(1715), 15, 135.0, 240.0, 18.5, 1,3,4, WeightBasedTable.create(
WeightedItem(Items.COINS_995,1,21,5.5), WeightedItem(Items.COINS_995,1,21,5.5),
WeightedItem(Items.TINDERBOX_590,1,1,5.0), WeightedItem(Items.TINDERBOX_590,1,1,5.0),
@ -51,10 +51,10 @@ enum class Pickpockets(val ids: IntArray, val requiredLevel: Int, val low: Doubl
WeightedItem(Items.UNCUT_OPAL_1625,1,1,2.5), WeightedItem(Items.UNCUT_OPAL_1625,1,1,2.5),
WeightedItem(Items.RAW_ANCHOVIES_321,1,1,7.0), WeightedItem(Items.RAW_ANCHOVIES_321,1,1,7.0),
WeightedItem(Items.RAW_CHICKEN_2138,1,1,3.5), WeightedItem(Items.RAW_CHICKEN_2138,1,1,3.5),
WeightedItem(Items.HAM_CLOAK_4304,1,1,1.0), WeightedItem(Items.HAM_CLOAK_4304,1,1,0.25),
WeightedItem(Items.HAM_HOOD_4302,1,1,1.0), WeightedItem(Items.HAM_HOOD_4302,1,1,0.25),
WeightedItem(Items.HAM_LOGO_4306,1,1,1.0), WeightedItem(Items.HAM_LOGO_4306,1,1,0.25),
WeightedItem(Items.HAM_ROBE_4300,1,1,1.0), WeightedItem(Items.HAM_ROBE_4300,1,1,0.25),
WeightedItem(Items.BOOTS_4310,1,1,1.0), WeightedItem(Items.BOOTS_4310,1,1,1.0),
WeightedItem(Items.GLOVES_4308,1,1,1.0), WeightedItem(Items.GLOVES_4308,1,1,1.0),
WeightedItem(Items.BRONZE_PICKAXE_1265,1,1,5.0), WeightedItem(Items.BRONZE_PICKAXE_1265,1,1,5.0),
@ -68,7 +68,7 @@ enum class Pickpockets(val ids: IntArray, val requiredLevel: Int, val low: Doubl
WeightedItem(Items.BROKEN_ARMOUR_698,1,1,3.5), WeightedItem(Items.BROKEN_ARMOUR_698,1,1,3.5),
WeightedItem(Items.BROKEN_STAFF_689,1,1,3.2), WeightedItem(Items.BROKEN_STAFF_689,1,1,3.2),
WeightedItem(Items.BROKEN_ARROW_687,1,1,3.1) WeightedItem(Items.BROKEN_ARROW_687,1,1,3.1)
)), ).insertEasyClue(1.0)),
WARRIOR(intArrayOf(15, 18), 25, 84.0, 240.0, 26.0, 2, 2, 5, WeightBasedTable.create( WARRIOR(intArrayOf(15, 18), 25, 84.0, 240.0, 26.0, 2, 2, 5, WeightBasedTable.create(
WeightedItem(Items.COINS_995,18,18,1.0,true) WeightedItem(Items.COINS_995,18,18,1.0,true)
)), )),

View file

@ -10,6 +10,7 @@ import core.game.world.update.flag.context.Animation
import core.tools.RandomFunction import core.tools.RandomFunction
import org.rs09.consts.Items import org.rs09.consts.Items
import rs09.game.interaction.InteractionListener import rs09.game.interaction.InteractionListener
import rs09.game.system.SystemLogger
import rs09.tools.secondsToTicks import rs09.tools.secondsToTicks
class ThievingListeners : InteractionListener() { class ThievingListeners : InteractionListener() {
@ -24,6 +25,7 @@ class ThievingListeners : InteractionListener() {
on(NPC,"pickpocket","pick-pocket"){player, node -> on(NPC,"pickpocket","pick-pocket"){player, node ->
val pickpocketData = Pickpockets.forID(node.id) ?: return@on false val pickpocketData = Pickpockets.forID(node.id) ?: return@on false
var successMod = 0 var successMod = 0
SystemLogger.logInfo(pickpocketData.table.toString())
if(player.inCombat()){ if(player.inCombat()){
player.sendMessage("You can't pickpocket while in combat.") player.sendMessage("You can't pickpocket while in combat.")

View file

@ -1,14 +1,14 @@
package rs09.game.system.config package rs09.game.system.config
import rs09.ServerConstants
import core.cache.def.impl.NPCDefinition import core.cache.def.impl.NPCDefinition
import core.game.node.item.WeightedChanceItem
import rs09.game.system.SystemLogger
import org.json.simple.JSONArray import org.json.simple.JSONArray
import org.json.simple.JSONObject import org.json.simple.JSONObject
import org.json.simple.parser.JSONParser import org.json.simple.parser.JSONParser
import rs09.ServerConstants
import rs09.game.content.global.WeightBasedTable
import rs09.game.content.global.WeightedItem
import rs09.game.system.SystemLogger
import java.io.FileReader import java.io.FileReader
import java.util.*
class DropTableParser { class DropTableParser {
val parser = JSONParser() val parser = JSONParser()
@ -23,28 +23,24 @@ class DropTableParser {
for(n in ids){ for(n in ids){
val def = NPCDefinition.forId(n.toInt()).dropTables val def = NPCDefinition.forId(n.toInt()).dropTables
def ?: continue def ?: continue
val mainTable: List<WeightedChanceItem> = parseTable(tab["main"] as JSONArray) parseTable(tab["main"] as JSONArray, def.table, false)
val charmTable: List<WeightedChanceItem> = parseTable(tab["charm"] as JSONArray) parseTable(tab["charm"] as JSONArray, def.table, false)
val defaultTable: List<WeightedChanceItem> = parseTable(tab["default"] as JSONArray) parseTable(tab["default"] as JSONArray,def.table,true)
def.mainTable.addAll(mainTable) count++
def.charmTable.addAll(charmTable)
def.defaultTable.addAll(defaultTable)
} }
} }
SystemLogger.logInfo("Parsed $count drop tables.") SystemLogger.logInfo("Parsed $count drop tables.")
} }
private fun parseTable(data: JSONArray): List<WeightedChanceItem> { private fun parseTable(data: JSONArray, destTable: WeightBasedTable, isAlways: Boolean) {
val table: MutableList<WeightedChanceItem> = ArrayList()
for(it in data){ for(it in data){
val item = it as JSONObject val item = it as JSONObject
val id = item["id"].toString().toInt() val id = item["id"].toString().toInt()
val minAmount = item["minAmount"].toString().toInt() val minAmount = item["minAmount"].toString().toInt()
val maxAmount = item["maxAmount"].toString().toInt() val maxAmount = item["maxAmount"].toString().toInt()
val weight = item["weight"].toString().toInt() val weight = item["weight"].toString().toInt()
val newItem = WeightedChanceItem(id,minAmount,maxAmount,weight) val newItem = WeightedItem(id,minAmount,maxAmount,weight.toDouble(),isAlways)
table.add(newItem) destTable.add(newItem)
} }
return table
} }
} }