From 4f06544a00605efcdc67cd092f2b200a60e59861 Mon Sep 17 00:00:00 2001 From: Kaeno Date: Sun, 1 Oct 2023 23:05:30 +0100 Subject: [PATCH] Update LooseLootModifier to handle Container keys --- config/config.json | 9 ++-- src/mod.ts | 110 ++++++++++++++++++++++++++++++++------------- 2 files changed, 84 insertions(+), 35 deletions(-) diff --git a/config/config.json b/config/config.json index 78a7a64..932b338 100644 --- a/config/config.json +++ b/config/config.json @@ -1,9 +1,8 @@ { "relativeProbabilityThreshold": 3, "relativeProbabilitymultiplier": 20, - "LooseKeyPileProbability": 0.10, + "LooseKeyPileProbability": 0.2, "AlterKeyCardProbability": true, - "LooseKeycardProbability": 0.02 -} - - + "LooseKeycardProbability": 0.02, + "staticRelativeProbability": 1658 +} \ No newline at end of file diff --git a/src/mod.ts b/src/mod.ts index 0affd46..799249c 100644 --- a/src/mod.ts +++ b/src/mod.ts @@ -1,57 +1,107 @@ -/* eslint-disable @typescript-eslint/naming-convention */ import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; import { Spawnpoint } from "@spt-aki/models/eft/common/ILooseLoot"; +import { ItemDistribution } from "@spt-aki/models/eft/common/tables/ILootBase"; import { BaseClasses } from "@spt-aki/models/enums/BaseClasses"; import type { IPostDBLoadMod } from "@spt-aki/models/external/IPostDBLoadMod"; -import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; import { DependencyContainer } from "tsyringe"; +import config from "../config/config.json"; -const Config = require("../config/config.json"); - -class Lkm implements IPostDBLoadMod { - public postDBLoad(container: DependencyContainer): void { - const DatabaseServer: DatabaseServer = container.resolve("DatabaseServer"); - const logger = container.resolve("WinstonLogger"); +class Lkm implements IPostDBLoadMod +{ + public postDBLoad(container: DependencyContainer): void + { + const databaseServer: DatabaseServer = container.resolve("DatabaseServer"); const itemHelper = container.resolve("ItemHelper"); - const database = DatabaseServer.getTables(); + const database = databaseServer.getTables(); const locations = database.locations; + const staticLoot = database.loot.staticLoot; + + let count = 0; + let looseCount = 0; + let looseKCount = 0; - for (const mapId in locations) { - const spawnPoints: Spawnpoint[] = locations[mapId]?.looseLoot?.spawnpoints; - if (!spawnPoints) { + + for (const staticName in staticLoot) + { + const staticy: ItemDistribution[] = staticLoot[staticName]?.itemDistribution; + if (!staticy) + { continue; } - for (const spawnPoint of spawnPoints) { - for (const item of spawnPoint.template.Items) { - if (itemHelper.isOfBaseclass(item._tpl, BaseClasses.KEY_MECHANICAL)) { + for (const itemDistribution of staticy) + { + if (itemHelper.isOfBaseclass(itemDistribution.tpl, BaseClasses.KEY_MECHANICAL)) + { + const matchingItem = staticy.find(s => s.tpl === itemDistribution.tpl); + if (matchingItem) + { + if (itemDistribution.relativeProbability < config.staticRelativeProbability) + { + // By Default this is based of the Yotota Key and been divided by 2 + itemDistribution.relativeProbability = config.staticRelativeProbability; + count++; + } + } + } + } + } + console.log(`Finished Altering ${count} Container Keys `); + + for (const mapId in locations) + { + const spawnPoints: Spawnpoint[] = locations[mapId]?.looseLoot?.spawnpoints; + if (!spawnPoints) + { + continue; + } + for (const spawnPoint of spawnPoints) + { + for (const item of spawnPoint.template.Items) + { + if (itemHelper.isOfBaseclass(item._tpl, BaseClasses.KEY_MECHANICAL)) + { const matchingItem = spawnPoint.itemDistribution.find(x => x.composedKey.key === item._id); - if (matchingItem) { - if (spawnPoint.probability < Config.LooseKeyPileProbability) { - spawnPoint.probability = Config.LooseKeyPileProbability; - logger.debug(`Updated Spawnpoint Probability having new probability of ${spawnPoint.probability} on loot pile ${spawnPoint.template.Id} on map ${mapId}`); - + if (matchingItem) + { + if (spawnPoint.probability < config.LooseKeyPileProbability) + { + spawnPoint.probability = config.LooseKeyPileProbability; + } - if (matchingItem.relativeProbability < Config.relativeProbabilityThreshold) { - matchingItem.relativeProbability *= Config.relativeProbabilitymultiplier; - logger.debug(`Updated ${item._tpl} having new relativeProbability of ${matchingItem.relativeProbability} on loot pile ${spawnPoint.template.Id} on map ${mapId}`); + if (matchingItem.relativeProbability < config.relativeProbabilityThreshold) + { + matchingItem.relativeProbability *= config.relativeProbabilitymultiplier; } + looseCount++; } } - if (Config.AlterKeyCardProbability && itemHelper.isOfBaseclass(item._tpl, BaseClasses.KEYCARD)) { - const matchingItem = spawnPoint.itemDistribution.find(x => x.composedKey.key === item._id); - if (matchingItem) { - if (spawnPoint.probability < Config.LooseKeycardProbability) { - spawnPoint.probability = Config.LooseKeycardProbability; - logger.debug(`Updated Spawnpoint Probability having new probability of ${spawnPoint.probability} on loot pile ${spawnPoint.template.Id} on map ${mapId} KEYCARD?`); + else + { + // Any loot changes wont modify items inside of loot.json(Added Keycards from SPT Team) + if (itemHelper.isOfBaseclass(item._tpl, BaseClasses.KEYCARD) && config.AlterKeyCardProbability == true) + { + const matchingItem = spawnPoint.itemDistribution.find(x => x.composedKey.key === item._id); + if (matchingItem) + { + if (spawnPoint.probability < config.LooseKeycardProbability) + { + spawnPoint.probability = config.LooseKeycardProbability; + looseKCount++; + } } } } } } } - logger.debug("Altering Probabilities Complete. Lkm"); + if (looseCount === 0 && looseKCount === 0) + { + console.log("No Items modified. Check config parameters"); + } + else + console.log(`Finished Altering ${looseCount} LooseLoot Keys and ${looseKCount} LooseLoot Keycards. Lkm`); } } module.exports = { mod: new Lkm() }; \ No newline at end of file