From 6a8ce2b606b79e207c5a03b6338e20f9663611a9 Mon Sep 17 00:00:00 2001 From: GetParanoid Date: Fri, 18 Jul 2025 15:53:14 -0500 Subject: [PATCH] feat(looting bots) --- BepInEx/plugins/skwizzy.LootingBots.dll | Bin 0 -> 97792 bytes .../Skwizzy-LootingBots-ServerMod/README.md | 16 +++ .../config/config.json | 4 + .../package.json | 23 ++++ .../src/enums.ts | 122 ++++++++++++++++++ .../Skwizzy-LootingBots-ServerMod/src/mod.ts | 95 ++++++++++++++ 6 files changed, 260 insertions(+) create mode 100644 BepInEx/plugins/skwizzy.LootingBots.dll create mode 100644 user/mods/Skwizzy-LootingBots-ServerMod/README.md create mode 100644 user/mods/Skwizzy-LootingBots-ServerMod/config/config.json create mode 100644 user/mods/Skwizzy-LootingBots-ServerMod/package.json create mode 100644 user/mods/Skwizzy-LootingBots-ServerMod/src/enums.ts create mode 100644 user/mods/Skwizzy-LootingBots-ServerMod/src/mod.ts diff --git a/BepInEx/plugins/skwizzy.LootingBots.dll b/BepInEx/plugins/skwizzy.LootingBots.dll new file mode 100644 index 0000000000000000000000000000000000000000..2a419a8ac7b47092953b73bb3eb08cbbd835862e GIT binary patch literal 97792 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 DWG#Af literal 0 HcmV?d00001 diff --git a/user/mods/Skwizzy-LootingBots-ServerMod/README.md b/user/mods/Skwizzy-LootingBots-ServerMod/README.md new file mode 100644 index 0000000..2aee9e1 --- /dev/null +++ b/user/mods/Skwizzy-LootingBots-ServerMod/README.md @@ -0,0 +1,16 @@ +## Description ## +A server side mod that serves two main purposes for LootingBots. + +1. Marks all items with DiscardLimits as InsuranceDisabled. It then disables the DiscardLimit settings for the server via the EnableDiscardLimits option in Server/database/globals.json. SPT PMC bots by default spawn with loot already in their backpacks, this loot is not marked Found In Raid and thus is subject to BSG's RMT protection logic. With discard limits enabled, when a bot drops their backback to swap to a new one any loot with discard limits in their bag will be deleted immediately when the bag is dropped. To avoid this we set the EnableDiscardLimits to false, and also make sure to flag all items with a DiscardLimit >= 0 as InsuranceDisabled to prevent items suchs as keys and cases to be insured. + +2. Provide the option to clear out the loot that PMC/Scav bots start with in their backpacks. This does not include meds, ammo, grenades ect. These options can be found in the `LootingBots-ServerMod/config/config.json`. + - `pmcSpawnWithLoot` - When set to `true`, PMCs will spawn with loot in their bags/pockets (default SPT behavior) + - `scavSpawnWithLoot` - When set to `true`, Scavs will spawn with loot in the bags/pockets (default SPT behavior) + + Default config: + ``` + { + "pmcSpawnWithLoot": false, + "scavSpawnWithLoot": true + } + ``` \ No newline at end of file diff --git a/user/mods/Skwizzy-LootingBots-ServerMod/config/config.json b/user/mods/Skwizzy-LootingBots-ServerMod/config/config.json new file mode 100644 index 0000000..7080069 --- /dev/null +++ b/user/mods/Skwizzy-LootingBots-ServerMod/config/config.json @@ -0,0 +1,4 @@ +{ + "pmcSpawnWithLoot": true, + "scavSpawnWithLoot": true +} \ No newline at end of file diff --git a/user/mods/Skwizzy-LootingBots-ServerMod/package.json b/user/mods/Skwizzy-LootingBots-ServerMod/package.json new file mode 100644 index 0000000..1868737 --- /dev/null +++ b/user/mods/Skwizzy-LootingBots-ServerMod/package.json @@ -0,0 +1,23 @@ +{ + "name": "LootingBots-ServerMod", + "version": "1.5.2", + "main": "src/mod.js", + "license": "MIT", + "author": "Skwizzy", + "sptVersion": "~3.11", + "scripts": { + "setup": "npm i", + "build": "node ./packageBuild.ts" + }, + "devDependencies": { + "@types/node": "^16.18.18", + "@typescript-eslint/eslint-plugin": "5.46.1", + "@typescript-eslint/parser": "5.46.1", + "bestzip": "2.2.1", + "eslint": "8.30.0", + "fs-extra": "11.1.0", + "glob": "8.0.3", + "tsyringe": "4.7.0", + "typescript": "4.9.4" + } +} \ No newline at end of file diff --git a/user/mods/Skwizzy-LootingBots-ServerMod/src/enums.ts b/user/mods/Skwizzy-LootingBots-ServerMod/src/enums.ts new file mode 100644 index 0000000..1670f4e --- /dev/null +++ b/user/mods/Skwizzy-LootingBots-ServerMod/src/enums.ts @@ -0,0 +1,122 @@ +export const enum ParentClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMORVEST = "5448e54d4bdc2dcc718b4568", + ARMOREDEQUIPMENT = "57bef4c42459772e8d35a53b", + HEADWEAR = "5a341c4086f77401f2541505", + FACECOVER = "5a341c4686f77469e155819e", + CHESTRIG = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", + THEMALVISION = "5d21f59b6dbe99052b54ef83", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + FLASHLIGHT = "55818b084bdc2d5b648b4571", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25", + MAP = "567849dd4bdc2d150f8b456e", + REPAIRKITS = "616eb7aea207f41933308f46", + COMPASS = "5f4fbaaca5573a5ac31db429", + HEADSET = "5645bcb74bdc2ded0b8b4578", + GASBLOCK = "56ea9461d2720b67698b456f" +} + +export const enum Calibers { + _9x19mm = "Caliber9x19PARA", + _9x18mm = "Caliber9x18PM", + _9x21mm = "Caliber9x21", + _9x39mm = "Caliber9x39", + _45ACP = "Caliber1143x23ACP", + _46x30mm = "Caliber46x30", + _57x28mm = "Caliber57x28", + _762x25mm = "Caliber762x25TT", + _366TKM = "Caliber366TKM", + _762x39mm = "Caliber762x39", + _762x51mm = "Caliber762x51", + _762x54rmm = "Caliber762x54R", + _300BLK = "Caliber762x35", + _556x45mm = "Caliber556x45NATO", + _545x39mm = "Caliber545x39", + _127x55mm = "Caliber127x55", + _338mag = "Caliber86x70", + _357mag = "Caliber9x33R", + _127x108mm = "Caliber127x108", + _40x46mm = "Caliber40x46", + _40x53mm = "Caliber40mmRU", + _26x75mm = "Caliber26x75", + _12ga = "Caliber12g", + _20ga = "Caliber20g", + _23x75mm = "Caliber23x75" +} diff --git a/user/mods/Skwizzy-LootingBots-ServerMod/src/mod.ts b/user/mods/Skwizzy-LootingBots-ServerMod/src/mod.ts new file mode 100644 index 0000000..f1e25e1 --- /dev/null +++ b/user/mods/Skwizzy-LootingBots-ServerMod/src/mod.ts @@ -0,0 +1,95 @@ +import { DependencyContainer } from "tsyringe"; + +import { IPostDBLoadMod } from "@spt/models/external/IPostDBLoadMod"; +import { DatabaseServer } from "@spt/servers/DatabaseServer"; +import { ILogger } from "@spt/models/spt/utils/ILogger"; +import { ConfigServer } from "@spt/servers/ConfigServer"; +import { ConfigTypes } from "@spt/models/enums/ConfigTypes"; +import { IPmcConfig } from "@spt/models/spt/config/IPmcConfig"; +import { IBotConfig } from "@spt/models/spt/config/IBotConfig"; + + +import config from "../config/config.json"; + +class DisableDiscardLimits implements IPostDBLoadMod { + public postDBLoad(container: DependencyContainer): void { + const databaseServer = container.resolve("DatabaseServer"); + const configServer = container.resolve("ConfigServer"); + const pmcConfig = configServer.getConfig(ConfigTypes.PMC); + const botConfig = configServer.getConfig(ConfigTypes.BOT); + + const { logInfo } = useLogger(container); + + const tables = databaseServer.getTables(); + + /** + * Set the item generation weights for backpackLoot, vestLoot, and pocketLoot to zero to prevent extra loot items from spawning on the specified bot type + * @param botTypes + */ + const emptyInventory = (botTypes: string[]) => { + botTypes.forEach((type) => { + logInfo(`Removing loot from ${type}`); + const backpackWeights = tables.bots.types[type].generation.items.backpackLoot.weights; + const vestWeights = tables.bots.types[type].generation.items.vestLoot.weights; + const pocketWeights = tables.bots.types[type].generation.items.pocketLoot.weights; + + clearWeights(backpackWeights); + clearWeights(vestWeights); + clearWeights(pocketWeights); + }); + }; + + if (!config.pmcSpawnWithLoot) { + emptyInventory(["usec", "bear"]); + // Do not allow weapons to spawn in PMC bags + pmcConfig.looseWeaponInBackpackLootMinMax.max = 0; + + // Clear weights in pmc randomisation + botConfig.equipment?.pmc?.randomisation?.forEach(details => { + const generation = details?.generation; + clearWeights(generation?.backpackLoot?.weights); + clearWeights(generation?.pocketLoot?.weights); + clearWeights(generation?.vestLoot?.weights); + }); + } + + if (!config.scavSpawnWithLoot) { + emptyInventory(["assault"]); + } + + logInfo("Marking items with DiscardLimits as InsuranceDisabled"); + for (let itemId in tables.templates.items) { + const template = tables.templates.items[itemId]; + /** + * When we set DiscardLimitsEnabled to false further down, this will cause some items to be able to be insured when they normally should not be. + * The DiscardLimit property is used by BSG for RMT protections and their code internally treats things with discard limits as not insurable. + * For items that have a DiscardLimit >= 0, we need to manually flag them as InsuranceDisabled to make sure they still cannot be insured by the player. + * Do not disable insurance if the item is marked as always available for insurance. + */ + if ( + template._props.DiscardLimit >= 0 && + !template._props.IsAlwaysAvailableForInsurance + ) { + template._props.InsuranceDisabled = true; + } + } + + tables.globals.config.DiscardLimitsEnabled = false; + logInfo("Global config DiscardLimitsEnabled set to false"); + } +} + +function clearWeights(weights: Record = {}) { + Object.keys(weights).forEach(weight => weights[weight] = 0); +} + +function useLogger(container: DependencyContainer) { + const logger = container.resolve("WinstonLogger"); + return { + logInfo: (message: string) => { + logger.info(`[LootingBots-ServerMod] ${message}`); + }, + }; +} + +module.exports = { mod: new DisableDiscardLimits() };