---==================================================================================================================--- --- --- --- Original Author(s) : NLTP_ASHES --- --- Edited : N/A --- --- Date : 19/01/2024 --- --- License : Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) --- --- --- --- This script handles the loot generation (in bodies and traders) for the addon. --- --- --- ---==================================================================================================================--- -- --------------------------------------------------------------------------------------------------------------------- -- Constants, global variables, imported functions and monkey-patches -- --------------------------------------------------------------------------------------------------------------------- -- Constants local trade_lists = { [trader_autoinject.SUPPLIER] = { "food", "drink" }, [trader_autoinject.BARMAN] = { "magazine" }, [trader_autoinject.MECHANIC] = { "tech" } } -- Imported functions local dbg_printf = western_goods_utils.dbg_printf -- --------------------------------------------------------------------------------------------------------------------- -- Traders -- --------------------------------------------------------------------------------------------------------------------- --- Function used to spawn items in a specific npc with the help of trader_autoinject.script. --- @param npc cse_alife_object --- @return nil function spawn_trader_loot(npc) local trader_type = trader_autoinject.get_trader_type(npc) local community = western_goods_utils.get_real_community(npc, "stalker") local supply_level = clamp(trader_autoinject.supply_level(npc, true) or 1, 1, 2) local trade_list = trade_lists[trader_type] or {} local trader_table = this.table_inject_ready(community, trade_list, supply_level) dbg_printf("[WG] Core | NPC trading (%s) - type %s\n%s", community, trader_type, utils_data.print_table(trader_table, false, true)) trader_autoinject.spawn_items(npc, trader_table, true) end -- --------------------------------------------------------------------------------------------------------------------- -- Dead Bodies -- --------------------------------------------------------------------------------------------------------------------- --- Function used to spawn items in a corpse. --- @param npc cse_alife_object --- @param npc_rank string --- @param npc_comm string --- @return nil function spawn_corpse_loot(npc, npc_rank, npc_comm) local loot_to_spawn = this.table_corpse_ready(npc_rank, npc_comm) dbg_printf("[WG] Core | NPC loot (%s)\n%s", npc_comm, utils_data.print_table(loot_to_spawn, false, true)) for sec,qte in pairs(loot_to_spawn) do alife_create_item(sec, npc, {uses = qte}) end end -- --------------------------------------------------------------------------------------------------------------------- -- Utility Functions -- --------------------------------------------------------------------------------------------------------------------- --- Function used to transform western_goods_items into a table ready for trader_autoinject.spawn_items. --- This function takes parameters to filter items to be kept in the final table. --- @param comm string --- @param types table --- @param supply_level number --- @return table function table_inject_ready(comm, types, supply_level) local loot_to_spawn = {} -- Get general params local loot_factor = western_goods_mcm.get_config("trader_loot_factor") or 1.0 -- Function used to get a quantity if item should be added to trader, nil otherwise local function eval_item(section, data) -- Short circuit if no trade params if not data.trader_params[comm] then return end -- Short circuit if trader doesn't sell this type of item if not western_goods_utils.table_contains(types, data.type) then return end -- Short circuit if player doesn't meet supply level if not data.trader_params[comm].sl == supply_level then return end local dice = math.random() local luck = clamp(data.trader_params[comm].prob * loot_factor,0.0,1.0) local qte = data.trader_params[comm].qte -- Short circuit if we miss the spawn rate if dice > luck then dbg_printf("[WG] Core | NPC trading missed '%s' [%s>%s]", section, dice, luck) return end dbg_printf("[WG] Core | NPC trading diced '%s' [%s<=%s] - qte: %s", section, dice, luck, qte) return qte end -- Go through each of the addon's items for section,data in pairs(western_goods_core.western_goods_items) do loot_to_spawn[section] = eval_item(section, data) end return loot_to_spawn end --- Function used to transform western_goods_items into a table ready for trader_autoinject. --- This function takes parameters to filter items to be kept in the final table. --- @param npc_rank string --- @param npc_comm string --- @return table function table_corpse_ready(npc_rank, npc_comm) local loot_to_spawn = {} -- Get general params local max_items = western_goods_mcm.get_config("max_item_per_corpse") or 0 local loot_factor = western_goods_mcm.get_config("corpse_loot_factor") or 1.0 -- Function used to get a quantity if item should be added to corpse, nil otherwise local function eval_item(section, data, iter) if not data.corpse_params[npc_comm] then dbg_printf("[WG] Core | NPC loot (%s of %s) no dice '%s' - comm: %s", iter, max_items, section, npc_comm) return end local dice = math.random() local luck = clamp(data.corpse_params[npc_comm].prob * loot_factor, 0.0, 1.0) local qte = data.corpse_params[npc_comm].qte -- If we hit the drop rate, spawn the item in the corpse if dice > luck then dbg_printf("[WG] Core | NPC loot (%s of %s) missed '%s' [%s>%s]", iter, max_items, section, dice, luck) return end dbg_printf("[WG] Core | NPC loot (%s of %s) diced '%s' [%s<=%s] - qte: %s", iter, max_items, section, dice, luck, qte) return qte end -- For a user-defined number of tries, try adding a random item for i = 1, max_items do local section = western_goods_utils.table_random_key(western_goods_core.western_goods_items) local data = western_goods_core.western_goods_items[section] loot_to_spawn[section] = eval_item(section, data, i) end -- Special if max_items > 1 and npc_comm == "killer" and npc_rank == "legend" then local dice = math.random() local luck = 0.001 if dice < luck then dbg_printf("[WG] Core | NPC loot (special) diced 'wg_money_suitcase' [%s<%s]", dice, luck) loot_to_spawn["wg_money_suitcase"] = 1 else dbg_printf("[WG] Core | NPC loot (special) missed 'wg_money_suitcase' [%s>=%s]", dice, luck) end end return loot_to_spawn end