From e9c0f8c8e2ba4727de567d58b4cd17cf7015111c Mon Sep 17 00:00:00 2001 From: Chomp Date: Thu, 8 Sep 2022 16:35:55 +0100 Subject: [PATCH] Update types to match 3.2.3 --- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../13AddTrader/types/helpers/BotHelper.d.ts | 31 +++- .../13AddTrader/types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../13AddTrader/types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../1LogToConsole/types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../2EditDatabase/types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../7OnLoadHook/types/helpers/BotHelper.d.ts | 31 +++- .../7OnLoadHook/types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../7OnLoadHook/types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../8OnUpdateHook/types/utils/RandomUtil.d.ts | 2 +- .../types/context/ContextVariable.d.ts | 2 +- .../types/controllers/BotController.d.ts | 10 +- .../types/controllers/MatchController.d.ts | 6 +- .../types/generators/BotGenerator.d.ts | 50 ++++-- .../generators/BotInventoryGenerator.d.ts | 25 ++- .../types/generators/BotWeaponGenerator.d.ts | 2 +- .../types/generators/LootGenerator.d.ts | 4 +- .../generators/RagfairAssortGenerator.d.ts | 27 +++- .../types/helpers/BotGeneratorHelper.d.ts | 48 +++++- .../9RouterHooks/types/helpers/BotHelper.d.ts | 31 +++- .../types/helpers/ItemHelper.d.ts | 7 +- .../models/eft/common/tables/IBotBase.d.ts | 2 + .../eft/common/tables/ITemplateItem.d.ts | 8 +- .../types/models/enums/BaseClasses.d.ts | 2 +- .../types/models/enums/WeaponTypes.d.ts | 151 ++++++++++++++++++ .../types/models/spt/config/IBotConfig.d.ts | 1 + .../types/models/spt/config/IPmcConfig.d.ts | 8 +- .../models/spt/config/IRagfairConfig.d.ts | 1 + .../types/models/spt/services/LootItem.d.ts | 1 + .../services/BotGenerationCacheService.d.ts | 47 ++++++ .../types/services/BotLootCacheService.d.ts | 11 ++ .../types/services/FenceService.d.ts | 11 ++ .../types/services/PmcAiService.d.ts | 27 ++++ .../9RouterHooks/types/utils/RandomUtil.d.ts | 2 +- 336 files changed, 6230 insertions(+), 546 deletions(-) create mode 100644 TypeScript/10ScopesAndTypes/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/10ScopesAndTypes/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/10ScopesAndTypes/types/services/PmcAiService.d.ts create mode 100644 TypeScript/11BundleLoadingSample/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/11BundleLoadingSample/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/11BundleLoadingSample/types/services/PmcAiService.d.ts create mode 100644 TypeScript/12ClassExtensionOverride/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/12ClassExtensionOverride/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/12ClassExtensionOverride/types/services/PmcAiService.d.ts create mode 100644 TypeScript/13AddTrader/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/13AddTrader/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/13AddTrader/types/services/PmcAiService.d.ts create mode 100644 TypeScript/14AfterDBLoadHook/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/14AfterDBLoadHook/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/14AfterDBLoadHook/types/services/PmcAiService.d.ts create mode 100644 TypeScript/1LogToConsole/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/1LogToConsole/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/1LogToConsole/types/services/PmcAiService.d.ts create mode 100644 TypeScript/2EditDatabase/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/2EditDatabase/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/2EditDatabase/types/services/PmcAiService.d.ts create mode 100644 TypeScript/3GetSptConfigFile/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/3GetSptConfigFile/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/3GetSptConfigFile/types/services/PmcAiService.d.ts create mode 100644 TypeScript/4UseACustomConfigFile/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/4UseACustomConfigFile/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/4UseACustomConfigFile/types/services/PmcAiService.d.ts create mode 100644 TypeScript/5ReplaceMethod/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/5ReplaceMethod/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/5ReplaceMethod/types/services/PmcAiService.d.ts create mode 100644 TypeScript/6ReferenceAnotherClass/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/6ReferenceAnotherClass/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/6ReferenceAnotherClass/types/services/PmcAiService.d.ts create mode 100644 TypeScript/7OnLoadHook/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/7OnLoadHook/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/7OnLoadHook/types/services/PmcAiService.d.ts create mode 100644 TypeScript/8OnUpdateHook/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/8OnUpdateHook/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/8OnUpdateHook/types/services/PmcAiService.d.ts create mode 100644 TypeScript/9RouterHooks/types/models/enums/WeaponTypes.d.ts create mode 100644 TypeScript/9RouterHooks/types/services/BotGenerationCacheService.d.ts create mode 100644 TypeScript/9RouterHooks/types/services/PmcAiService.d.ts diff --git a/TypeScript/10ScopesAndTypes/types/context/ContextVariable.d.ts b/TypeScript/10ScopesAndTypes/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/10ScopesAndTypes/types/context/ContextVariable.d.ts +++ b/TypeScript/10ScopesAndTypes/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/10ScopesAndTypes/types/controllers/BotController.d.ts b/TypeScript/10ScopesAndTypes/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/10ScopesAndTypes/types/controllers/BotController.d.ts +++ b/TypeScript/10ScopesAndTypes/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/10ScopesAndTypes/types/controllers/MatchController.d.ts b/TypeScript/10ScopesAndTypes/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/10ScopesAndTypes/types/controllers/MatchController.d.ts +++ b/TypeScript/10ScopesAndTypes/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/10ScopesAndTypes/types/generators/BotGenerator.d.ts b/TypeScript/10ScopesAndTypes/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/10ScopesAndTypes/types/generators/BotGenerator.d.ts +++ b/TypeScript/10ScopesAndTypes/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/10ScopesAndTypes/types/generators/BotInventoryGenerator.d.ts b/TypeScript/10ScopesAndTypes/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/10ScopesAndTypes/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/10ScopesAndTypes/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/10ScopesAndTypes/types/generators/BotWeaponGenerator.d.ts b/TypeScript/10ScopesAndTypes/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/10ScopesAndTypes/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/10ScopesAndTypes/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/10ScopesAndTypes/types/generators/LootGenerator.d.ts b/TypeScript/10ScopesAndTypes/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/10ScopesAndTypes/types/generators/LootGenerator.d.ts +++ b/TypeScript/10ScopesAndTypes/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/10ScopesAndTypes/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/10ScopesAndTypes/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/10ScopesAndTypes/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/10ScopesAndTypes/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/10ScopesAndTypes/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/10ScopesAndTypes/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/10ScopesAndTypes/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/10ScopesAndTypes/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/10ScopesAndTypes/types/helpers/BotHelper.d.ts b/TypeScript/10ScopesAndTypes/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/10ScopesAndTypes/types/helpers/BotHelper.d.ts +++ b/TypeScript/10ScopesAndTypes/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/10ScopesAndTypes/types/helpers/ItemHelper.d.ts b/TypeScript/10ScopesAndTypes/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/10ScopesAndTypes/types/helpers/ItemHelper.d.ts +++ b/TypeScript/10ScopesAndTypes/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/10ScopesAndTypes/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/10ScopesAndTypes/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/10ScopesAndTypes/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/10ScopesAndTypes/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/10ScopesAndTypes/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/10ScopesAndTypes/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/10ScopesAndTypes/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/10ScopesAndTypes/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/10ScopesAndTypes/types/models/enums/BaseClasses.d.ts b/TypeScript/10ScopesAndTypes/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/10ScopesAndTypes/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/10ScopesAndTypes/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/10ScopesAndTypes/types/models/enums/WeaponTypes.d.ts b/TypeScript/10ScopesAndTypes/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/10ScopesAndTypes/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/10ScopesAndTypes/types/models/spt/config/IBotConfig.d.ts b/TypeScript/10ScopesAndTypes/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/10ScopesAndTypes/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/10ScopesAndTypes/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/10ScopesAndTypes/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/10ScopesAndTypes/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/10ScopesAndTypes/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/10ScopesAndTypes/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/10ScopesAndTypes/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/10ScopesAndTypes/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/10ScopesAndTypes/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/10ScopesAndTypes/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/10ScopesAndTypes/types/models/spt/services/LootItem.d.ts b/TypeScript/10ScopesAndTypes/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/10ScopesAndTypes/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/10ScopesAndTypes/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/10ScopesAndTypes/types/services/BotGenerationCacheService.d.ts b/TypeScript/10ScopesAndTypes/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/10ScopesAndTypes/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/10ScopesAndTypes/types/services/BotLootCacheService.d.ts b/TypeScript/10ScopesAndTypes/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/10ScopesAndTypes/types/services/BotLootCacheService.d.ts +++ b/TypeScript/10ScopesAndTypes/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/10ScopesAndTypes/types/services/FenceService.d.ts b/TypeScript/10ScopesAndTypes/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/10ScopesAndTypes/types/services/FenceService.d.ts +++ b/TypeScript/10ScopesAndTypes/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/10ScopesAndTypes/types/services/PmcAiService.d.ts b/TypeScript/10ScopesAndTypes/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/10ScopesAndTypes/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/10ScopesAndTypes/types/utils/RandomUtil.d.ts b/TypeScript/10ScopesAndTypes/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/10ScopesAndTypes/types/utils/RandomUtil.d.ts +++ b/TypeScript/10ScopesAndTypes/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/11BundleLoadingSample/types/context/ContextVariable.d.ts b/TypeScript/11BundleLoadingSample/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/11BundleLoadingSample/types/context/ContextVariable.d.ts +++ b/TypeScript/11BundleLoadingSample/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/11BundleLoadingSample/types/controllers/BotController.d.ts b/TypeScript/11BundleLoadingSample/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/11BundleLoadingSample/types/controllers/BotController.d.ts +++ b/TypeScript/11BundleLoadingSample/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/11BundleLoadingSample/types/controllers/MatchController.d.ts b/TypeScript/11BundleLoadingSample/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/11BundleLoadingSample/types/controllers/MatchController.d.ts +++ b/TypeScript/11BundleLoadingSample/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/11BundleLoadingSample/types/generators/BotGenerator.d.ts b/TypeScript/11BundleLoadingSample/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/11BundleLoadingSample/types/generators/BotGenerator.d.ts +++ b/TypeScript/11BundleLoadingSample/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/11BundleLoadingSample/types/generators/BotInventoryGenerator.d.ts b/TypeScript/11BundleLoadingSample/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/11BundleLoadingSample/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/11BundleLoadingSample/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/11BundleLoadingSample/types/generators/BotWeaponGenerator.d.ts b/TypeScript/11BundleLoadingSample/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/11BundleLoadingSample/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/11BundleLoadingSample/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/11BundleLoadingSample/types/generators/LootGenerator.d.ts b/TypeScript/11BundleLoadingSample/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/11BundleLoadingSample/types/generators/LootGenerator.d.ts +++ b/TypeScript/11BundleLoadingSample/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/11BundleLoadingSample/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/11BundleLoadingSample/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/11BundleLoadingSample/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/11BundleLoadingSample/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/11BundleLoadingSample/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/11BundleLoadingSample/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/11BundleLoadingSample/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/11BundleLoadingSample/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/11BundleLoadingSample/types/helpers/BotHelper.d.ts b/TypeScript/11BundleLoadingSample/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/11BundleLoadingSample/types/helpers/BotHelper.d.ts +++ b/TypeScript/11BundleLoadingSample/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/11BundleLoadingSample/types/helpers/ItemHelper.d.ts b/TypeScript/11BundleLoadingSample/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/11BundleLoadingSample/types/helpers/ItemHelper.d.ts +++ b/TypeScript/11BundleLoadingSample/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/11BundleLoadingSample/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/11BundleLoadingSample/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/11BundleLoadingSample/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/11BundleLoadingSample/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/11BundleLoadingSample/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/11BundleLoadingSample/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/11BundleLoadingSample/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/11BundleLoadingSample/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/11BundleLoadingSample/types/models/enums/BaseClasses.d.ts b/TypeScript/11BundleLoadingSample/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/11BundleLoadingSample/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/11BundleLoadingSample/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/11BundleLoadingSample/types/models/enums/WeaponTypes.d.ts b/TypeScript/11BundleLoadingSample/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/11BundleLoadingSample/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/11BundleLoadingSample/types/models/spt/config/IBotConfig.d.ts b/TypeScript/11BundleLoadingSample/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/11BundleLoadingSample/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/11BundleLoadingSample/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/11BundleLoadingSample/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/11BundleLoadingSample/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/11BundleLoadingSample/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/11BundleLoadingSample/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/11BundleLoadingSample/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/11BundleLoadingSample/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/11BundleLoadingSample/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/11BundleLoadingSample/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/11BundleLoadingSample/types/models/spt/services/LootItem.d.ts b/TypeScript/11BundleLoadingSample/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/11BundleLoadingSample/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/11BundleLoadingSample/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/11BundleLoadingSample/types/services/BotGenerationCacheService.d.ts b/TypeScript/11BundleLoadingSample/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/11BundleLoadingSample/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/11BundleLoadingSample/types/services/BotLootCacheService.d.ts b/TypeScript/11BundleLoadingSample/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/11BundleLoadingSample/types/services/BotLootCacheService.d.ts +++ b/TypeScript/11BundleLoadingSample/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/11BundleLoadingSample/types/services/FenceService.d.ts b/TypeScript/11BundleLoadingSample/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/11BundleLoadingSample/types/services/FenceService.d.ts +++ b/TypeScript/11BundleLoadingSample/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/11BundleLoadingSample/types/services/PmcAiService.d.ts b/TypeScript/11BundleLoadingSample/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/11BundleLoadingSample/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/11BundleLoadingSample/types/utils/RandomUtil.d.ts b/TypeScript/11BundleLoadingSample/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/11BundleLoadingSample/types/utils/RandomUtil.d.ts +++ b/TypeScript/11BundleLoadingSample/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/12ClassExtensionOverride/types/context/ContextVariable.d.ts b/TypeScript/12ClassExtensionOverride/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/12ClassExtensionOverride/types/context/ContextVariable.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/12ClassExtensionOverride/types/controllers/BotController.d.ts b/TypeScript/12ClassExtensionOverride/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/12ClassExtensionOverride/types/controllers/BotController.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/12ClassExtensionOverride/types/controllers/MatchController.d.ts b/TypeScript/12ClassExtensionOverride/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/12ClassExtensionOverride/types/controllers/MatchController.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/12ClassExtensionOverride/types/generators/BotGenerator.d.ts b/TypeScript/12ClassExtensionOverride/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/12ClassExtensionOverride/types/generators/BotGenerator.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/12ClassExtensionOverride/types/generators/BotInventoryGenerator.d.ts b/TypeScript/12ClassExtensionOverride/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/12ClassExtensionOverride/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/12ClassExtensionOverride/types/generators/BotWeaponGenerator.d.ts b/TypeScript/12ClassExtensionOverride/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/12ClassExtensionOverride/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/12ClassExtensionOverride/types/generators/LootGenerator.d.ts b/TypeScript/12ClassExtensionOverride/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/12ClassExtensionOverride/types/generators/LootGenerator.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/12ClassExtensionOverride/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/12ClassExtensionOverride/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/12ClassExtensionOverride/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/12ClassExtensionOverride/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/12ClassExtensionOverride/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/12ClassExtensionOverride/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/12ClassExtensionOverride/types/helpers/BotHelper.d.ts b/TypeScript/12ClassExtensionOverride/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/12ClassExtensionOverride/types/helpers/BotHelper.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/12ClassExtensionOverride/types/helpers/ItemHelper.d.ts b/TypeScript/12ClassExtensionOverride/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/12ClassExtensionOverride/types/helpers/ItemHelper.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/12ClassExtensionOverride/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/12ClassExtensionOverride/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/12ClassExtensionOverride/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/12ClassExtensionOverride/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/12ClassExtensionOverride/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/12ClassExtensionOverride/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/12ClassExtensionOverride/types/models/enums/BaseClasses.d.ts b/TypeScript/12ClassExtensionOverride/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/12ClassExtensionOverride/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/12ClassExtensionOverride/types/models/enums/WeaponTypes.d.ts b/TypeScript/12ClassExtensionOverride/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/12ClassExtensionOverride/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/12ClassExtensionOverride/types/models/spt/config/IBotConfig.d.ts b/TypeScript/12ClassExtensionOverride/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/12ClassExtensionOverride/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/12ClassExtensionOverride/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/12ClassExtensionOverride/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/12ClassExtensionOverride/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/12ClassExtensionOverride/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/12ClassExtensionOverride/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/12ClassExtensionOverride/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/12ClassExtensionOverride/types/models/spt/services/LootItem.d.ts b/TypeScript/12ClassExtensionOverride/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/12ClassExtensionOverride/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/12ClassExtensionOverride/types/services/BotGenerationCacheService.d.ts b/TypeScript/12ClassExtensionOverride/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/12ClassExtensionOverride/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/12ClassExtensionOverride/types/services/BotLootCacheService.d.ts b/TypeScript/12ClassExtensionOverride/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/12ClassExtensionOverride/types/services/BotLootCacheService.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/12ClassExtensionOverride/types/services/FenceService.d.ts b/TypeScript/12ClassExtensionOverride/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/12ClassExtensionOverride/types/services/FenceService.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/12ClassExtensionOverride/types/services/PmcAiService.d.ts b/TypeScript/12ClassExtensionOverride/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/12ClassExtensionOverride/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/12ClassExtensionOverride/types/utils/RandomUtil.d.ts b/TypeScript/12ClassExtensionOverride/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/12ClassExtensionOverride/types/utils/RandomUtil.d.ts +++ b/TypeScript/12ClassExtensionOverride/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/13AddTrader/types/context/ContextVariable.d.ts b/TypeScript/13AddTrader/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/13AddTrader/types/context/ContextVariable.d.ts +++ b/TypeScript/13AddTrader/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/13AddTrader/types/controllers/BotController.d.ts b/TypeScript/13AddTrader/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/13AddTrader/types/controllers/BotController.d.ts +++ b/TypeScript/13AddTrader/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/13AddTrader/types/controllers/MatchController.d.ts b/TypeScript/13AddTrader/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/13AddTrader/types/controllers/MatchController.d.ts +++ b/TypeScript/13AddTrader/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/13AddTrader/types/generators/BotGenerator.d.ts b/TypeScript/13AddTrader/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/13AddTrader/types/generators/BotGenerator.d.ts +++ b/TypeScript/13AddTrader/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/13AddTrader/types/generators/BotInventoryGenerator.d.ts b/TypeScript/13AddTrader/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/13AddTrader/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/13AddTrader/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/13AddTrader/types/generators/BotWeaponGenerator.d.ts b/TypeScript/13AddTrader/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/13AddTrader/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/13AddTrader/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/13AddTrader/types/generators/LootGenerator.d.ts b/TypeScript/13AddTrader/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/13AddTrader/types/generators/LootGenerator.d.ts +++ b/TypeScript/13AddTrader/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/13AddTrader/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/13AddTrader/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/13AddTrader/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/13AddTrader/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/13AddTrader/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/13AddTrader/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/13AddTrader/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/13AddTrader/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/13AddTrader/types/helpers/BotHelper.d.ts b/TypeScript/13AddTrader/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/13AddTrader/types/helpers/BotHelper.d.ts +++ b/TypeScript/13AddTrader/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/13AddTrader/types/helpers/ItemHelper.d.ts b/TypeScript/13AddTrader/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/13AddTrader/types/helpers/ItemHelper.d.ts +++ b/TypeScript/13AddTrader/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/13AddTrader/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/13AddTrader/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/13AddTrader/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/13AddTrader/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/13AddTrader/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/13AddTrader/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/13AddTrader/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/13AddTrader/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/13AddTrader/types/models/enums/BaseClasses.d.ts b/TypeScript/13AddTrader/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/13AddTrader/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/13AddTrader/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/13AddTrader/types/models/enums/WeaponTypes.d.ts b/TypeScript/13AddTrader/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/13AddTrader/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/13AddTrader/types/models/spt/config/IBotConfig.d.ts b/TypeScript/13AddTrader/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/13AddTrader/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/13AddTrader/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/13AddTrader/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/13AddTrader/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/13AddTrader/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/13AddTrader/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/13AddTrader/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/13AddTrader/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/13AddTrader/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/13AddTrader/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/13AddTrader/types/models/spt/services/LootItem.d.ts b/TypeScript/13AddTrader/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/13AddTrader/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/13AddTrader/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/13AddTrader/types/services/BotGenerationCacheService.d.ts b/TypeScript/13AddTrader/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/13AddTrader/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/13AddTrader/types/services/BotLootCacheService.d.ts b/TypeScript/13AddTrader/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/13AddTrader/types/services/BotLootCacheService.d.ts +++ b/TypeScript/13AddTrader/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/13AddTrader/types/services/FenceService.d.ts b/TypeScript/13AddTrader/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/13AddTrader/types/services/FenceService.d.ts +++ b/TypeScript/13AddTrader/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/13AddTrader/types/services/PmcAiService.d.ts b/TypeScript/13AddTrader/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/13AddTrader/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/13AddTrader/types/utils/RandomUtil.d.ts b/TypeScript/13AddTrader/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/13AddTrader/types/utils/RandomUtil.d.ts +++ b/TypeScript/13AddTrader/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/14AfterDBLoadHook/types/context/ContextVariable.d.ts b/TypeScript/14AfterDBLoadHook/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/14AfterDBLoadHook/types/context/ContextVariable.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/14AfterDBLoadHook/types/controllers/BotController.d.ts b/TypeScript/14AfterDBLoadHook/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/14AfterDBLoadHook/types/controllers/BotController.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/14AfterDBLoadHook/types/controllers/MatchController.d.ts b/TypeScript/14AfterDBLoadHook/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/14AfterDBLoadHook/types/controllers/MatchController.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/14AfterDBLoadHook/types/generators/BotGenerator.d.ts b/TypeScript/14AfterDBLoadHook/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/14AfterDBLoadHook/types/generators/BotGenerator.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/14AfterDBLoadHook/types/generators/BotInventoryGenerator.d.ts b/TypeScript/14AfterDBLoadHook/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/14AfterDBLoadHook/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/14AfterDBLoadHook/types/generators/BotWeaponGenerator.d.ts b/TypeScript/14AfterDBLoadHook/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/14AfterDBLoadHook/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/14AfterDBLoadHook/types/generators/LootGenerator.d.ts b/TypeScript/14AfterDBLoadHook/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/14AfterDBLoadHook/types/generators/LootGenerator.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/14AfterDBLoadHook/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/14AfterDBLoadHook/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/14AfterDBLoadHook/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/14AfterDBLoadHook/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/14AfterDBLoadHook/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/14AfterDBLoadHook/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/14AfterDBLoadHook/types/helpers/BotHelper.d.ts b/TypeScript/14AfterDBLoadHook/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/14AfterDBLoadHook/types/helpers/BotHelper.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/14AfterDBLoadHook/types/helpers/ItemHelper.d.ts b/TypeScript/14AfterDBLoadHook/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/14AfterDBLoadHook/types/helpers/ItemHelper.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/14AfterDBLoadHook/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/14AfterDBLoadHook/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/14AfterDBLoadHook/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/14AfterDBLoadHook/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/14AfterDBLoadHook/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/14AfterDBLoadHook/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/14AfterDBLoadHook/types/models/enums/BaseClasses.d.ts b/TypeScript/14AfterDBLoadHook/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/14AfterDBLoadHook/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/14AfterDBLoadHook/types/models/enums/WeaponTypes.d.ts b/TypeScript/14AfterDBLoadHook/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/14AfterDBLoadHook/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/14AfterDBLoadHook/types/models/spt/config/IBotConfig.d.ts b/TypeScript/14AfterDBLoadHook/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/14AfterDBLoadHook/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/14AfterDBLoadHook/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/14AfterDBLoadHook/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/14AfterDBLoadHook/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/14AfterDBLoadHook/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/14AfterDBLoadHook/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/14AfterDBLoadHook/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/14AfterDBLoadHook/types/models/spt/services/LootItem.d.ts b/TypeScript/14AfterDBLoadHook/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/14AfterDBLoadHook/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/14AfterDBLoadHook/types/services/BotGenerationCacheService.d.ts b/TypeScript/14AfterDBLoadHook/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/14AfterDBLoadHook/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/14AfterDBLoadHook/types/services/BotLootCacheService.d.ts b/TypeScript/14AfterDBLoadHook/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/14AfterDBLoadHook/types/services/BotLootCacheService.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/14AfterDBLoadHook/types/services/FenceService.d.ts b/TypeScript/14AfterDBLoadHook/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/14AfterDBLoadHook/types/services/FenceService.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/14AfterDBLoadHook/types/services/PmcAiService.d.ts b/TypeScript/14AfterDBLoadHook/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/14AfterDBLoadHook/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/14AfterDBLoadHook/types/utils/RandomUtil.d.ts b/TypeScript/14AfterDBLoadHook/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/14AfterDBLoadHook/types/utils/RandomUtil.d.ts +++ b/TypeScript/14AfterDBLoadHook/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/1LogToConsole/types/context/ContextVariable.d.ts b/TypeScript/1LogToConsole/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/1LogToConsole/types/context/ContextVariable.d.ts +++ b/TypeScript/1LogToConsole/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/1LogToConsole/types/controllers/BotController.d.ts b/TypeScript/1LogToConsole/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/1LogToConsole/types/controllers/BotController.d.ts +++ b/TypeScript/1LogToConsole/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/1LogToConsole/types/controllers/MatchController.d.ts b/TypeScript/1LogToConsole/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/1LogToConsole/types/controllers/MatchController.d.ts +++ b/TypeScript/1LogToConsole/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/1LogToConsole/types/generators/BotGenerator.d.ts b/TypeScript/1LogToConsole/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/1LogToConsole/types/generators/BotGenerator.d.ts +++ b/TypeScript/1LogToConsole/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/1LogToConsole/types/generators/BotInventoryGenerator.d.ts b/TypeScript/1LogToConsole/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/1LogToConsole/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/1LogToConsole/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/1LogToConsole/types/generators/BotWeaponGenerator.d.ts b/TypeScript/1LogToConsole/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/1LogToConsole/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/1LogToConsole/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/1LogToConsole/types/generators/LootGenerator.d.ts b/TypeScript/1LogToConsole/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/1LogToConsole/types/generators/LootGenerator.d.ts +++ b/TypeScript/1LogToConsole/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/1LogToConsole/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/1LogToConsole/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/1LogToConsole/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/1LogToConsole/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/1LogToConsole/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/1LogToConsole/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/1LogToConsole/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/1LogToConsole/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/1LogToConsole/types/helpers/BotHelper.d.ts b/TypeScript/1LogToConsole/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/1LogToConsole/types/helpers/BotHelper.d.ts +++ b/TypeScript/1LogToConsole/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/1LogToConsole/types/helpers/ItemHelper.d.ts b/TypeScript/1LogToConsole/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/1LogToConsole/types/helpers/ItemHelper.d.ts +++ b/TypeScript/1LogToConsole/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/1LogToConsole/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/1LogToConsole/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/1LogToConsole/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/1LogToConsole/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/1LogToConsole/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/1LogToConsole/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/1LogToConsole/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/1LogToConsole/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/1LogToConsole/types/models/enums/BaseClasses.d.ts b/TypeScript/1LogToConsole/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/1LogToConsole/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/1LogToConsole/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/1LogToConsole/types/models/enums/WeaponTypes.d.ts b/TypeScript/1LogToConsole/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/1LogToConsole/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/1LogToConsole/types/models/spt/config/IBotConfig.d.ts b/TypeScript/1LogToConsole/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/1LogToConsole/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/1LogToConsole/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/1LogToConsole/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/1LogToConsole/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/1LogToConsole/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/1LogToConsole/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/1LogToConsole/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/1LogToConsole/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/1LogToConsole/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/1LogToConsole/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/1LogToConsole/types/models/spt/services/LootItem.d.ts b/TypeScript/1LogToConsole/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/1LogToConsole/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/1LogToConsole/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/1LogToConsole/types/services/BotGenerationCacheService.d.ts b/TypeScript/1LogToConsole/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/1LogToConsole/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/1LogToConsole/types/services/BotLootCacheService.d.ts b/TypeScript/1LogToConsole/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/1LogToConsole/types/services/BotLootCacheService.d.ts +++ b/TypeScript/1LogToConsole/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/1LogToConsole/types/services/FenceService.d.ts b/TypeScript/1LogToConsole/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/1LogToConsole/types/services/FenceService.d.ts +++ b/TypeScript/1LogToConsole/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/1LogToConsole/types/services/PmcAiService.d.ts b/TypeScript/1LogToConsole/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/1LogToConsole/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/1LogToConsole/types/utils/RandomUtil.d.ts b/TypeScript/1LogToConsole/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/1LogToConsole/types/utils/RandomUtil.d.ts +++ b/TypeScript/1LogToConsole/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/2EditDatabase/types/context/ContextVariable.d.ts b/TypeScript/2EditDatabase/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/2EditDatabase/types/context/ContextVariable.d.ts +++ b/TypeScript/2EditDatabase/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/2EditDatabase/types/controllers/BotController.d.ts b/TypeScript/2EditDatabase/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/2EditDatabase/types/controllers/BotController.d.ts +++ b/TypeScript/2EditDatabase/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/2EditDatabase/types/controllers/MatchController.d.ts b/TypeScript/2EditDatabase/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/2EditDatabase/types/controllers/MatchController.d.ts +++ b/TypeScript/2EditDatabase/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/2EditDatabase/types/generators/BotGenerator.d.ts b/TypeScript/2EditDatabase/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/2EditDatabase/types/generators/BotGenerator.d.ts +++ b/TypeScript/2EditDatabase/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/2EditDatabase/types/generators/BotInventoryGenerator.d.ts b/TypeScript/2EditDatabase/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/2EditDatabase/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/2EditDatabase/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/2EditDatabase/types/generators/BotWeaponGenerator.d.ts b/TypeScript/2EditDatabase/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/2EditDatabase/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/2EditDatabase/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/2EditDatabase/types/generators/LootGenerator.d.ts b/TypeScript/2EditDatabase/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/2EditDatabase/types/generators/LootGenerator.d.ts +++ b/TypeScript/2EditDatabase/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/2EditDatabase/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/2EditDatabase/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/2EditDatabase/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/2EditDatabase/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/2EditDatabase/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/2EditDatabase/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/2EditDatabase/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/2EditDatabase/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/2EditDatabase/types/helpers/BotHelper.d.ts b/TypeScript/2EditDatabase/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/2EditDatabase/types/helpers/BotHelper.d.ts +++ b/TypeScript/2EditDatabase/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/2EditDatabase/types/helpers/ItemHelper.d.ts b/TypeScript/2EditDatabase/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/2EditDatabase/types/helpers/ItemHelper.d.ts +++ b/TypeScript/2EditDatabase/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/2EditDatabase/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/2EditDatabase/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/2EditDatabase/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/2EditDatabase/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/2EditDatabase/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/2EditDatabase/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/2EditDatabase/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/2EditDatabase/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/2EditDatabase/types/models/enums/BaseClasses.d.ts b/TypeScript/2EditDatabase/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/2EditDatabase/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/2EditDatabase/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/2EditDatabase/types/models/enums/WeaponTypes.d.ts b/TypeScript/2EditDatabase/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/2EditDatabase/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/2EditDatabase/types/models/spt/config/IBotConfig.d.ts b/TypeScript/2EditDatabase/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/2EditDatabase/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/2EditDatabase/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/2EditDatabase/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/2EditDatabase/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/2EditDatabase/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/2EditDatabase/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/2EditDatabase/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/2EditDatabase/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/2EditDatabase/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/2EditDatabase/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/2EditDatabase/types/models/spt/services/LootItem.d.ts b/TypeScript/2EditDatabase/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/2EditDatabase/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/2EditDatabase/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/2EditDatabase/types/services/BotGenerationCacheService.d.ts b/TypeScript/2EditDatabase/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/2EditDatabase/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/2EditDatabase/types/services/BotLootCacheService.d.ts b/TypeScript/2EditDatabase/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/2EditDatabase/types/services/BotLootCacheService.d.ts +++ b/TypeScript/2EditDatabase/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/2EditDatabase/types/services/FenceService.d.ts b/TypeScript/2EditDatabase/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/2EditDatabase/types/services/FenceService.d.ts +++ b/TypeScript/2EditDatabase/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/2EditDatabase/types/services/PmcAiService.d.ts b/TypeScript/2EditDatabase/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/2EditDatabase/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/2EditDatabase/types/utils/RandomUtil.d.ts b/TypeScript/2EditDatabase/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/2EditDatabase/types/utils/RandomUtil.d.ts +++ b/TypeScript/2EditDatabase/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/3GetSptConfigFile/types/context/ContextVariable.d.ts b/TypeScript/3GetSptConfigFile/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/3GetSptConfigFile/types/context/ContextVariable.d.ts +++ b/TypeScript/3GetSptConfigFile/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/3GetSptConfigFile/types/controllers/BotController.d.ts b/TypeScript/3GetSptConfigFile/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/3GetSptConfigFile/types/controllers/BotController.d.ts +++ b/TypeScript/3GetSptConfigFile/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/3GetSptConfigFile/types/controllers/MatchController.d.ts b/TypeScript/3GetSptConfigFile/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/3GetSptConfigFile/types/controllers/MatchController.d.ts +++ b/TypeScript/3GetSptConfigFile/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/3GetSptConfigFile/types/generators/BotGenerator.d.ts b/TypeScript/3GetSptConfigFile/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/3GetSptConfigFile/types/generators/BotGenerator.d.ts +++ b/TypeScript/3GetSptConfigFile/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/3GetSptConfigFile/types/generators/BotInventoryGenerator.d.ts b/TypeScript/3GetSptConfigFile/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/3GetSptConfigFile/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/3GetSptConfigFile/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/3GetSptConfigFile/types/generators/BotWeaponGenerator.d.ts b/TypeScript/3GetSptConfigFile/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/3GetSptConfigFile/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/3GetSptConfigFile/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/3GetSptConfigFile/types/generators/LootGenerator.d.ts b/TypeScript/3GetSptConfigFile/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/3GetSptConfigFile/types/generators/LootGenerator.d.ts +++ b/TypeScript/3GetSptConfigFile/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/3GetSptConfigFile/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/3GetSptConfigFile/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/3GetSptConfigFile/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/3GetSptConfigFile/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/3GetSptConfigFile/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/3GetSptConfigFile/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/3GetSptConfigFile/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/3GetSptConfigFile/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/3GetSptConfigFile/types/helpers/BotHelper.d.ts b/TypeScript/3GetSptConfigFile/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/3GetSptConfigFile/types/helpers/BotHelper.d.ts +++ b/TypeScript/3GetSptConfigFile/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/3GetSptConfigFile/types/helpers/ItemHelper.d.ts b/TypeScript/3GetSptConfigFile/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/3GetSptConfigFile/types/helpers/ItemHelper.d.ts +++ b/TypeScript/3GetSptConfigFile/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/3GetSptConfigFile/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/3GetSptConfigFile/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/3GetSptConfigFile/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/3GetSptConfigFile/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/3GetSptConfigFile/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/3GetSptConfigFile/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/3GetSptConfigFile/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/3GetSptConfigFile/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/3GetSptConfigFile/types/models/enums/BaseClasses.d.ts b/TypeScript/3GetSptConfigFile/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/3GetSptConfigFile/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/3GetSptConfigFile/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/3GetSptConfigFile/types/models/enums/WeaponTypes.d.ts b/TypeScript/3GetSptConfigFile/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/3GetSptConfigFile/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/3GetSptConfigFile/types/models/spt/config/IBotConfig.d.ts b/TypeScript/3GetSptConfigFile/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/3GetSptConfigFile/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/3GetSptConfigFile/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/3GetSptConfigFile/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/3GetSptConfigFile/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/3GetSptConfigFile/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/3GetSptConfigFile/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/3GetSptConfigFile/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/3GetSptConfigFile/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/3GetSptConfigFile/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/3GetSptConfigFile/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/3GetSptConfigFile/types/models/spt/services/LootItem.d.ts b/TypeScript/3GetSptConfigFile/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/3GetSptConfigFile/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/3GetSptConfigFile/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/3GetSptConfigFile/types/services/BotGenerationCacheService.d.ts b/TypeScript/3GetSptConfigFile/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/3GetSptConfigFile/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/3GetSptConfigFile/types/services/BotLootCacheService.d.ts b/TypeScript/3GetSptConfigFile/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/3GetSptConfigFile/types/services/BotLootCacheService.d.ts +++ b/TypeScript/3GetSptConfigFile/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/3GetSptConfigFile/types/services/FenceService.d.ts b/TypeScript/3GetSptConfigFile/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/3GetSptConfigFile/types/services/FenceService.d.ts +++ b/TypeScript/3GetSptConfigFile/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/3GetSptConfigFile/types/services/PmcAiService.d.ts b/TypeScript/3GetSptConfigFile/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/3GetSptConfigFile/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/3GetSptConfigFile/types/utils/RandomUtil.d.ts b/TypeScript/3GetSptConfigFile/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/3GetSptConfigFile/types/utils/RandomUtil.d.ts +++ b/TypeScript/3GetSptConfigFile/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/4UseACustomConfigFile/types/context/ContextVariable.d.ts b/TypeScript/4UseACustomConfigFile/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/4UseACustomConfigFile/types/context/ContextVariable.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/4UseACustomConfigFile/types/controllers/BotController.d.ts b/TypeScript/4UseACustomConfigFile/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/4UseACustomConfigFile/types/controllers/BotController.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/4UseACustomConfigFile/types/controllers/MatchController.d.ts b/TypeScript/4UseACustomConfigFile/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/4UseACustomConfigFile/types/controllers/MatchController.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/4UseACustomConfigFile/types/generators/BotGenerator.d.ts b/TypeScript/4UseACustomConfigFile/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/4UseACustomConfigFile/types/generators/BotGenerator.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/4UseACustomConfigFile/types/generators/BotInventoryGenerator.d.ts b/TypeScript/4UseACustomConfigFile/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/4UseACustomConfigFile/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/4UseACustomConfigFile/types/generators/BotWeaponGenerator.d.ts b/TypeScript/4UseACustomConfigFile/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/4UseACustomConfigFile/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/4UseACustomConfigFile/types/generators/LootGenerator.d.ts b/TypeScript/4UseACustomConfigFile/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/4UseACustomConfigFile/types/generators/LootGenerator.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/4UseACustomConfigFile/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/4UseACustomConfigFile/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/4UseACustomConfigFile/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/4UseACustomConfigFile/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/4UseACustomConfigFile/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/4UseACustomConfigFile/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/4UseACustomConfigFile/types/helpers/BotHelper.d.ts b/TypeScript/4UseACustomConfigFile/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/4UseACustomConfigFile/types/helpers/BotHelper.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/4UseACustomConfigFile/types/helpers/ItemHelper.d.ts b/TypeScript/4UseACustomConfigFile/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/4UseACustomConfigFile/types/helpers/ItemHelper.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/4UseACustomConfigFile/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/4UseACustomConfigFile/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/4UseACustomConfigFile/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/4UseACustomConfigFile/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/4UseACustomConfigFile/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/4UseACustomConfigFile/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/4UseACustomConfigFile/types/models/enums/BaseClasses.d.ts b/TypeScript/4UseACustomConfigFile/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/4UseACustomConfigFile/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/4UseACustomConfigFile/types/models/enums/WeaponTypes.d.ts b/TypeScript/4UseACustomConfigFile/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/4UseACustomConfigFile/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/4UseACustomConfigFile/types/models/spt/config/IBotConfig.d.ts b/TypeScript/4UseACustomConfigFile/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/4UseACustomConfigFile/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/4UseACustomConfigFile/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/4UseACustomConfigFile/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/4UseACustomConfigFile/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/4UseACustomConfigFile/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/4UseACustomConfigFile/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/4UseACustomConfigFile/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/4UseACustomConfigFile/types/models/spt/services/LootItem.d.ts b/TypeScript/4UseACustomConfigFile/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/4UseACustomConfigFile/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/4UseACustomConfigFile/types/services/BotGenerationCacheService.d.ts b/TypeScript/4UseACustomConfigFile/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/4UseACustomConfigFile/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/4UseACustomConfigFile/types/services/BotLootCacheService.d.ts b/TypeScript/4UseACustomConfigFile/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/4UseACustomConfigFile/types/services/BotLootCacheService.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/4UseACustomConfigFile/types/services/FenceService.d.ts b/TypeScript/4UseACustomConfigFile/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/4UseACustomConfigFile/types/services/FenceService.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/4UseACustomConfigFile/types/services/PmcAiService.d.ts b/TypeScript/4UseACustomConfigFile/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/4UseACustomConfigFile/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/4UseACustomConfigFile/types/utils/RandomUtil.d.ts b/TypeScript/4UseACustomConfigFile/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/4UseACustomConfigFile/types/utils/RandomUtil.d.ts +++ b/TypeScript/4UseACustomConfigFile/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/5ReplaceMethod/types/context/ContextVariable.d.ts b/TypeScript/5ReplaceMethod/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/5ReplaceMethod/types/context/ContextVariable.d.ts +++ b/TypeScript/5ReplaceMethod/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/5ReplaceMethod/types/controllers/BotController.d.ts b/TypeScript/5ReplaceMethod/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/5ReplaceMethod/types/controllers/BotController.d.ts +++ b/TypeScript/5ReplaceMethod/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/5ReplaceMethod/types/controllers/MatchController.d.ts b/TypeScript/5ReplaceMethod/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/5ReplaceMethod/types/controllers/MatchController.d.ts +++ b/TypeScript/5ReplaceMethod/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/5ReplaceMethod/types/generators/BotGenerator.d.ts b/TypeScript/5ReplaceMethod/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/5ReplaceMethod/types/generators/BotGenerator.d.ts +++ b/TypeScript/5ReplaceMethod/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/5ReplaceMethod/types/generators/BotInventoryGenerator.d.ts b/TypeScript/5ReplaceMethod/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/5ReplaceMethod/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/5ReplaceMethod/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/5ReplaceMethod/types/generators/BotWeaponGenerator.d.ts b/TypeScript/5ReplaceMethod/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/5ReplaceMethod/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/5ReplaceMethod/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/5ReplaceMethod/types/generators/LootGenerator.d.ts b/TypeScript/5ReplaceMethod/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/5ReplaceMethod/types/generators/LootGenerator.d.ts +++ b/TypeScript/5ReplaceMethod/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/5ReplaceMethod/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/5ReplaceMethod/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/5ReplaceMethod/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/5ReplaceMethod/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/5ReplaceMethod/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/5ReplaceMethod/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/5ReplaceMethod/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/5ReplaceMethod/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/5ReplaceMethod/types/helpers/BotHelper.d.ts b/TypeScript/5ReplaceMethod/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/5ReplaceMethod/types/helpers/BotHelper.d.ts +++ b/TypeScript/5ReplaceMethod/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/5ReplaceMethod/types/helpers/ItemHelper.d.ts b/TypeScript/5ReplaceMethod/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/5ReplaceMethod/types/helpers/ItemHelper.d.ts +++ b/TypeScript/5ReplaceMethod/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/5ReplaceMethod/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/5ReplaceMethod/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/5ReplaceMethod/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/5ReplaceMethod/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/5ReplaceMethod/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/5ReplaceMethod/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/5ReplaceMethod/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/5ReplaceMethod/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/5ReplaceMethod/types/models/enums/BaseClasses.d.ts b/TypeScript/5ReplaceMethod/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/5ReplaceMethod/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/5ReplaceMethod/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/5ReplaceMethod/types/models/enums/WeaponTypes.d.ts b/TypeScript/5ReplaceMethod/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/5ReplaceMethod/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/5ReplaceMethod/types/models/spt/config/IBotConfig.d.ts b/TypeScript/5ReplaceMethod/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/5ReplaceMethod/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/5ReplaceMethod/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/5ReplaceMethod/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/5ReplaceMethod/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/5ReplaceMethod/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/5ReplaceMethod/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/5ReplaceMethod/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/5ReplaceMethod/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/5ReplaceMethod/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/5ReplaceMethod/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/5ReplaceMethod/types/models/spt/services/LootItem.d.ts b/TypeScript/5ReplaceMethod/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/5ReplaceMethod/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/5ReplaceMethod/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/5ReplaceMethod/types/services/BotGenerationCacheService.d.ts b/TypeScript/5ReplaceMethod/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/5ReplaceMethod/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/5ReplaceMethod/types/services/BotLootCacheService.d.ts b/TypeScript/5ReplaceMethod/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/5ReplaceMethod/types/services/BotLootCacheService.d.ts +++ b/TypeScript/5ReplaceMethod/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/5ReplaceMethod/types/services/FenceService.d.ts b/TypeScript/5ReplaceMethod/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/5ReplaceMethod/types/services/FenceService.d.ts +++ b/TypeScript/5ReplaceMethod/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/5ReplaceMethod/types/services/PmcAiService.d.ts b/TypeScript/5ReplaceMethod/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/5ReplaceMethod/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/5ReplaceMethod/types/utils/RandomUtil.d.ts b/TypeScript/5ReplaceMethod/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/5ReplaceMethod/types/utils/RandomUtil.d.ts +++ b/TypeScript/5ReplaceMethod/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/6ReferenceAnotherClass/types/context/ContextVariable.d.ts b/TypeScript/6ReferenceAnotherClass/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/6ReferenceAnotherClass/types/context/ContextVariable.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/6ReferenceAnotherClass/types/controllers/BotController.d.ts b/TypeScript/6ReferenceAnotherClass/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/6ReferenceAnotherClass/types/controllers/BotController.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/6ReferenceAnotherClass/types/controllers/MatchController.d.ts b/TypeScript/6ReferenceAnotherClass/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/6ReferenceAnotherClass/types/controllers/MatchController.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/6ReferenceAnotherClass/types/generators/BotGenerator.d.ts b/TypeScript/6ReferenceAnotherClass/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/6ReferenceAnotherClass/types/generators/BotGenerator.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/6ReferenceAnotherClass/types/generators/BotInventoryGenerator.d.ts b/TypeScript/6ReferenceAnotherClass/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/6ReferenceAnotherClass/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/6ReferenceAnotherClass/types/generators/BotWeaponGenerator.d.ts b/TypeScript/6ReferenceAnotherClass/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/6ReferenceAnotherClass/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/6ReferenceAnotherClass/types/generators/LootGenerator.d.ts b/TypeScript/6ReferenceAnotherClass/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/6ReferenceAnotherClass/types/generators/LootGenerator.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/6ReferenceAnotherClass/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/6ReferenceAnotherClass/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/6ReferenceAnotherClass/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/6ReferenceAnotherClass/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/6ReferenceAnotherClass/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/6ReferenceAnotherClass/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/6ReferenceAnotherClass/types/helpers/BotHelper.d.ts b/TypeScript/6ReferenceAnotherClass/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/6ReferenceAnotherClass/types/helpers/BotHelper.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/6ReferenceAnotherClass/types/helpers/ItemHelper.d.ts b/TypeScript/6ReferenceAnotherClass/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/6ReferenceAnotherClass/types/helpers/ItemHelper.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/6ReferenceAnotherClass/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/6ReferenceAnotherClass/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/6ReferenceAnotherClass/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/6ReferenceAnotherClass/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/6ReferenceAnotherClass/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/6ReferenceAnotherClass/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/6ReferenceAnotherClass/types/models/enums/BaseClasses.d.ts b/TypeScript/6ReferenceAnotherClass/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/6ReferenceAnotherClass/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/6ReferenceAnotherClass/types/models/enums/WeaponTypes.d.ts b/TypeScript/6ReferenceAnotherClass/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/6ReferenceAnotherClass/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IBotConfig.d.ts b/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/6ReferenceAnotherClass/types/models/spt/services/LootItem.d.ts b/TypeScript/6ReferenceAnotherClass/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/6ReferenceAnotherClass/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/6ReferenceAnotherClass/types/services/BotGenerationCacheService.d.ts b/TypeScript/6ReferenceAnotherClass/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/6ReferenceAnotherClass/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/6ReferenceAnotherClass/types/services/BotLootCacheService.d.ts b/TypeScript/6ReferenceAnotherClass/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/6ReferenceAnotherClass/types/services/BotLootCacheService.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/6ReferenceAnotherClass/types/services/FenceService.d.ts b/TypeScript/6ReferenceAnotherClass/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/6ReferenceAnotherClass/types/services/FenceService.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/6ReferenceAnotherClass/types/services/PmcAiService.d.ts b/TypeScript/6ReferenceAnotherClass/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/6ReferenceAnotherClass/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/6ReferenceAnotherClass/types/utils/RandomUtil.d.ts b/TypeScript/6ReferenceAnotherClass/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/6ReferenceAnotherClass/types/utils/RandomUtil.d.ts +++ b/TypeScript/6ReferenceAnotherClass/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/7OnLoadHook/types/context/ContextVariable.d.ts b/TypeScript/7OnLoadHook/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/7OnLoadHook/types/context/ContextVariable.d.ts +++ b/TypeScript/7OnLoadHook/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/7OnLoadHook/types/controllers/BotController.d.ts b/TypeScript/7OnLoadHook/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/7OnLoadHook/types/controllers/BotController.d.ts +++ b/TypeScript/7OnLoadHook/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/7OnLoadHook/types/controllers/MatchController.d.ts b/TypeScript/7OnLoadHook/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/7OnLoadHook/types/controllers/MatchController.d.ts +++ b/TypeScript/7OnLoadHook/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/7OnLoadHook/types/generators/BotGenerator.d.ts b/TypeScript/7OnLoadHook/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/7OnLoadHook/types/generators/BotGenerator.d.ts +++ b/TypeScript/7OnLoadHook/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/7OnLoadHook/types/generators/BotInventoryGenerator.d.ts b/TypeScript/7OnLoadHook/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/7OnLoadHook/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/7OnLoadHook/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/7OnLoadHook/types/generators/BotWeaponGenerator.d.ts b/TypeScript/7OnLoadHook/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/7OnLoadHook/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/7OnLoadHook/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/7OnLoadHook/types/generators/LootGenerator.d.ts b/TypeScript/7OnLoadHook/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/7OnLoadHook/types/generators/LootGenerator.d.ts +++ b/TypeScript/7OnLoadHook/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/7OnLoadHook/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/7OnLoadHook/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/7OnLoadHook/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/7OnLoadHook/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/7OnLoadHook/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/7OnLoadHook/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/7OnLoadHook/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/7OnLoadHook/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/7OnLoadHook/types/helpers/BotHelper.d.ts b/TypeScript/7OnLoadHook/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/7OnLoadHook/types/helpers/BotHelper.d.ts +++ b/TypeScript/7OnLoadHook/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/7OnLoadHook/types/helpers/ItemHelper.d.ts b/TypeScript/7OnLoadHook/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/7OnLoadHook/types/helpers/ItemHelper.d.ts +++ b/TypeScript/7OnLoadHook/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/7OnLoadHook/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/7OnLoadHook/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/7OnLoadHook/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/7OnLoadHook/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/7OnLoadHook/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/7OnLoadHook/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/7OnLoadHook/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/7OnLoadHook/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/7OnLoadHook/types/models/enums/BaseClasses.d.ts b/TypeScript/7OnLoadHook/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/7OnLoadHook/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/7OnLoadHook/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/7OnLoadHook/types/models/enums/WeaponTypes.d.ts b/TypeScript/7OnLoadHook/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/7OnLoadHook/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/7OnLoadHook/types/models/spt/config/IBotConfig.d.ts b/TypeScript/7OnLoadHook/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/7OnLoadHook/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/7OnLoadHook/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/7OnLoadHook/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/7OnLoadHook/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/7OnLoadHook/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/7OnLoadHook/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/7OnLoadHook/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/7OnLoadHook/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/7OnLoadHook/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/7OnLoadHook/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/7OnLoadHook/types/models/spt/services/LootItem.d.ts b/TypeScript/7OnLoadHook/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/7OnLoadHook/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/7OnLoadHook/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/7OnLoadHook/types/services/BotGenerationCacheService.d.ts b/TypeScript/7OnLoadHook/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/7OnLoadHook/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/7OnLoadHook/types/services/BotLootCacheService.d.ts b/TypeScript/7OnLoadHook/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/7OnLoadHook/types/services/BotLootCacheService.d.ts +++ b/TypeScript/7OnLoadHook/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/7OnLoadHook/types/services/FenceService.d.ts b/TypeScript/7OnLoadHook/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/7OnLoadHook/types/services/FenceService.d.ts +++ b/TypeScript/7OnLoadHook/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/7OnLoadHook/types/services/PmcAiService.d.ts b/TypeScript/7OnLoadHook/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/7OnLoadHook/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/7OnLoadHook/types/utils/RandomUtil.d.ts b/TypeScript/7OnLoadHook/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/7OnLoadHook/types/utils/RandomUtil.d.ts +++ b/TypeScript/7OnLoadHook/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/8OnUpdateHook/types/context/ContextVariable.d.ts b/TypeScript/8OnUpdateHook/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/8OnUpdateHook/types/context/ContextVariable.d.ts +++ b/TypeScript/8OnUpdateHook/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/8OnUpdateHook/types/controllers/BotController.d.ts b/TypeScript/8OnUpdateHook/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/8OnUpdateHook/types/controllers/BotController.d.ts +++ b/TypeScript/8OnUpdateHook/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/8OnUpdateHook/types/controllers/MatchController.d.ts b/TypeScript/8OnUpdateHook/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/8OnUpdateHook/types/controllers/MatchController.d.ts +++ b/TypeScript/8OnUpdateHook/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/8OnUpdateHook/types/generators/BotGenerator.d.ts b/TypeScript/8OnUpdateHook/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/8OnUpdateHook/types/generators/BotGenerator.d.ts +++ b/TypeScript/8OnUpdateHook/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/8OnUpdateHook/types/generators/BotInventoryGenerator.d.ts b/TypeScript/8OnUpdateHook/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/8OnUpdateHook/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/8OnUpdateHook/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/8OnUpdateHook/types/generators/BotWeaponGenerator.d.ts b/TypeScript/8OnUpdateHook/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/8OnUpdateHook/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/8OnUpdateHook/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/8OnUpdateHook/types/generators/LootGenerator.d.ts b/TypeScript/8OnUpdateHook/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/8OnUpdateHook/types/generators/LootGenerator.d.ts +++ b/TypeScript/8OnUpdateHook/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/8OnUpdateHook/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/8OnUpdateHook/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/8OnUpdateHook/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/8OnUpdateHook/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/8OnUpdateHook/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/8OnUpdateHook/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/8OnUpdateHook/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/8OnUpdateHook/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/8OnUpdateHook/types/helpers/BotHelper.d.ts b/TypeScript/8OnUpdateHook/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/8OnUpdateHook/types/helpers/BotHelper.d.ts +++ b/TypeScript/8OnUpdateHook/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/8OnUpdateHook/types/helpers/ItemHelper.d.ts b/TypeScript/8OnUpdateHook/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/8OnUpdateHook/types/helpers/ItemHelper.d.ts +++ b/TypeScript/8OnUpdateHook/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/8OnUpdateHook/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/8OnUpdateHook/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/8OnUpdateHook/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/8OnUpdateHook/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/8OnUpdateHook/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/8OnUpdateHook/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/8OnUpdateHook/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/8OnUpdateHook/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/8OnUpdateHook/types/models/enums/BaseClasses.d.ts b/TypeScript/8OnUpdateHook/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/8OnUpdateHook/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/8OnUpdateHook/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/8OnUpdateHook/types/models/enums/WeaponTypes.d.ts b/TypeScript/8OnUpdateHook/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/8OnUpdateHook/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/8OnUpdateHook/types/models/spt/config/IBotConfig.d.ts b/TypeScript/8OnUpdateHook/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/8OnUpdateHook/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/8OnUpdateHook/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/8OnUpdateHook/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/8OnUpdateHook/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/8OnUpdateHook/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/8OnUpdateHook/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/8OnUpdateHook/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/8OnUpdateHook/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/8OnUpdateHook/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/8OnUpdateHook/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/8OnUpdateHook/types/models/spt/services/LootItem.d.ts b/TypeScript/8OnUpdateHook/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/8OnUpdateHook/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/8OnUpdateHook/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/8OnUpdateHook/types/services/BotGenerationCacheService.d.ts b/TypeScript/8OnUpdateHook/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/8OnUpdateHook/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/8OnUpdateHook/types/services/BotLootCacheService.d.ts b/TypeScript/8OnUpdateHook/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/8OnUpdateHook/types/services/BotLootCacheService.d.ts +++ b/TypeScript/8OnUpdateHook/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/8OnUpdateHook/types/services/FenceService.d.ts b/TypeScript/8OnUpdateHook/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/8OnUpdateHook/types/services/FenceService.d.ts +++ b/TypeScript/8OnUpdateHook/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/8OnUpdateHook/types/services/PmcAiService.d.ts b/TypeScript/8OnUpdateHook/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/8OnUpdateHook/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/8OnUpdateHook/types/utils/RandomUtil.d.ts b/TypeScript/8OnUpdateHook/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/8OnUpdateHook/types/utils/RandomUtil.d.ts +++ b/TypeScript/8OnUpdateHook/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; diff --git a/TypeScript/9RouterHooks/types/context/ContextVariable.d.ts b/TypeScript/9RouterHooks/types/context/ContextVariable.d.ts index e438947..0fe0a63 100644 --- a/TypeScript/9RouterHooks/types/context/ContextVariable.d.ts +++ b/TypeScript/9RouterHooks/types/context/ContextVariable.d.ts @@ -4,7 +4,7 @@ export declare class ContextVariable { private timestamp; private type; constructor(value: any, type: ContextVariableType); - getValue(): any; + getValue(): T; getTimestamp(): Date; getType(): ContextVariableType; } diff --git a/TypeScript/9RouterHooks/types/controllers/BotController.d.ts b/TypeScript/9RouterHooks/types/controllers/BotController.d.ts index 5e6f05d..d6a8ae4 100644 --- a/TypeScript/9RouterHooks/types/controllers/BotController.d.ts +++ b/TypeScript/9RouterHooks/types/controllers/BotController.d.ts @@ -5,15 +5,21 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IBotCore } from "../models/eft/common/tables/IBotCore"; import { Difficulty } from "../models/eft/common/tables/IBotType"; import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; +import { PmcAiService } from "../services/PmcAiService"; export declare class BotController { + protected logger: ILogger; protected databaseServer: DatabaseServer; protected botGenerator: BotGenerator; protected botHelper: BotHelper; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer); /** * Return the number of bot loadout varieties to be generated * @param type bot Type we want the loadout gen count for @@ -29,7 +35,7 @@ export declare class BotController { * @returns Difficulty object */ getBotDifficulty(type: string, difficulty: string): Difficulty; - protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty; generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; getBotCap(): number; } diff --git a/TypeScript/9RouterHooks/types/controllers/MatchController.d.ts b/TypeScript/9RouterHooks/types/controllers/MatchController.d.ts index cb40023..07f6a89 100644 --- a/TypeScript/9RouterHooks/types/controllers/MatchController.d.ts +++ b/TypeScript/9RouterHooks/types/controllers/MatchController.d.ts @@ -15,8 +15,10 @@ import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; +import { BotGenerationCacheService } from "../services/BotGenerationCacheService"; import { BotLootCacheService } from "../services/BotLootCacheService"; import { MatchLocationService } from "../services/MatchLocationService"; +import { PmcAiService } from "../services/PmcAiService"; import { ProfileSnapshotService } from "../services/ProfileSnapshotService"; export declare class MatchController { protected logger: ILogger; @@ -27,11 +29,13 @@ export declare class MatchController { protected botLootCacheService: BotLootCacheService; protected configServer: ConfigServer; protected profileSnapshotService: ProfileSnapshotService; + protected pmcAiService: PmcAiService; + protected botGenerationCacheService: BotGenerationCacheService; protected applicationContext: ApplicationContext; protected matchConfig: IMatchConfig; protected inraidConfig: IInRaidConfig; protected botConfig: IBotConfig; - constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, applicationContext: ApplicationContext); + constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; createGroup(sessionID: string, info: ICreateGroupRequestData): any; diff --git a/TypeScript/9RouterHooks/types/generators/BotGenerator.d.ts b/TypeScript/9RouterHooks/types/generators/BotGenerator.d.ts index 7d58f95..2ac51db 100644 --- a/TypeScript/9RouterHooks/types/generators/BotGenerator.d.ts +++ b/TypeScript/9RouterHooks/types/generators/BotGenerator.d.ts @@ -9,6 +9,7 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService"; +import { PmcAiService } from "../services/PmcAiService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; @@ -30,9 +31,10 @@ export declare class BotGenerator { protected botEquipmentFilterService: BotEquipmentFilterService; protected botHelper: BotHelper; protected gameEventHelper: GameEventHelper; + protected pmcAiService: PmcAiService; protected configServer: ConfigServer; protected botConfig: IBotConfig; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer); /** * Generate a player scav bot object * @param role e.g. assault / pmcbot @@ -41,13 +43,13 @@ export declare class BotGenerator { * @returns */ generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase; - generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** - * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check - * @param botRole the bot role to check if should be a pmc - * @returns true if should be a pmc + * Generate an array of bot objects for populate a raid with + * @param sessionId session id + * @param info request object + * @returns bot array */ - protected shouldBotBePmc(botRole: string): boolean; + generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[]; /** * Get a randomised PMC side based on bot config value 'isUsec' * @returns pmc side as string @@ -58,12 +60,30 @@ export declare class BotGenerator { * @returns IBotBase object */ protected getCloneOfBotBase(): IBotBase; + /** + * Create a IBotBase object with equipment/loot/exp etc + * @param sessionId Session id + * @param bot bots base file + * @param role botRole bot will use + * @param node Bot template from db/bots/x.json + * @param isPmc Is bot to be a PMC + * @param isPlayerScav is bot to be a p scav bot + * @returns IBotBase object + */ protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase; /** * Log the number of PMCs generated to the debug console + * @param output Generated bot array, ready to send to client */ protected logPmcGeneratedCount(output: IBotBase[]): void; - protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** + * Return a randomised bot level and exp value + * @param role botRole being generated for + * @param min Min exp value + * @param max Max exp value + * @returns IRandomisedBotLevelResult object + */ + protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** * Converts health object to the required format * @param healthObj health object from bot json @@ -72,19 +92,23 @@ export declare class BotGenerator { */ protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; protected generateSkills(skillsObj: Skills): Skills; - /** - * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) - * @param pmcSide eft side (usec/bear) - * @returns pmc side as defined in config - */ - protected getPmcRole(pmcSide: string): string; /** * Iterate through bots inventory and loot to find and remove christmas items (as defined in GameEventHelper) * @param nodeInventory Bots inventory to iterate over */ protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + /** + * Generate a random Id for a bot and apply to bots _id and aid value + * @param bot bot to update + * @returns updated IBotBase object + */ protected generateId(bot: IBotBase): IBotBase; protected generateInventoryID(profile: IBotBase): IBotBase; + /** + * Get the difficulty passed in, if its not "asoline", get selected difficulty from config + * @param requestedDifficulty + * @returns + */ protected getPMCDifficulty(requestedDifficulty: string): string; /** * Add a side-specific (usec/bear) dogtag item to a bots inventory diff --git a/TypeScript/9RouterHooks/types/generators/BotInventoryGenerator.d.ts b/TypeScript/9RouterHooks/types/generators/BotInventoryGenerator.d.ts index 73f8ece..c5ed545 100644 --- a/TypeScript/9RouterHooks/types/generators/BotInventoryGenerator.d.ts +++ b/TypeScript/9RouterHooks/types/generators/BotInventoryGenerator.d.ts @@ -1,13 +1,16 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase"; -import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType"; +import { EquipmentSlots } from "../models/enums/EquipmentSlots"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; -import { BotWeaponGenerator } from "./BotWeaponGenerator"; import { BotLootGenerator } from "./BotLootGenerator"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { BotWeaponGenerator } from "./BotWeaponGenerator"; export declare class BotInventoryGenerator { protected logger: ILogger; protected hashUtil: HashUtil; @@ -17,8 +20,14 @@ export declare class BotInventoryGenerator { protected botLootGenerator: BotLootGenerator; protected botGeneratorHelper: BotGeneratorHelper; protected weightedRandomHelper: WeightedRandomHelper; - constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper); - generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer); + generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: { + slot: EquipmentSlots; + shouldSpawn: boolean; + }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void; protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; protected generateInventoryBase(): PmcInventory; } diff --git a/TypeScript/9RouterHooks/types/generators/BotWeaponGenerator.d.ts b/TypeScript/9RouterHooks/types/generators/BotWeaponGenerator.d.ts index 49fa7bf..cba7afa 100644 --- a/TypeScript/9RouterHooks/types/generators/BotWeaponGenerator.d.ts +++ b/TypeScript/9RouterHooks/types/generators/BotWeaponGenerator.d.ts @@ -67,7 +67,7 @@ export declare class BotWeaponGenerator { * @param botRole for durability values * @returns Base weapon item in array */ - constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; + protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[]; /** * Get the mods necessary to kit out a weapon to its preset level * @param weaponTpl weapon to find preset for diff --git a/TypeScript/9RouterHooks/types/generators/LootGenerator.d.ts b/TypeScript/9RouterHooks/types/generators/LootGenerator.d.ts index fdefa6d..bfc605a 100644 --- a/TypeScript/9RouterHooks/types/generators/LootGenerator.d.ts +++ b/TypeScript/9RouterHooks/types/generators/LootGenerator.d.ts @@ -6,14 +6,16 @@ import { LootRequest } from "../models/spt/services/LootRequest"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemFilterService } from "../services/ItemFilterService"; +import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class LootGenerator { protected logger: ILogger; + protected hashUtil: HashUtil; protected databaseServer: DatabaseServer; protected randomUtil: RandomUtil; protected itemHelper: ItemHelper; protected itemFilterService: ItemFilterService; - constructor(logger: ILogger, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, itemHelper: ItemHelper, itemFilterService: ItemFilterService); /** * Generate a list of items based on options passed in * @param options parameters to adjust what loot is generated diff --git a/TypeScript/9RouterHooks/types/generators/RagfairAssortGenerator.d.ts b/TypeScript/9RouterHooks/types/generators/RagfairAssortGenerator.d.ts index cbdd7f2..db4811d 100644 --- a/TypeScript/9RouterHooks/types/generators/RagfairAssortGenerator.d.ts +++ b/TypeScript/9RouterHooks/types/generators/RagfairAssortGenerator.d.ts @@ -1,5 +1,8 @@ import { ItemHelper } from "../helpers/ItemHelper"; +import { Preset } from "../models/eft/common/IGlobals"; import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; @@ -8,18 +11,40 @@ export declare class RagfairAssortGenerator { protected hashUtil: HashUtil; protected itemHelper: ItemHelper; protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; protected generatedAssortItems: Item[]; - constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + protected ragfairConfig: IRagfairConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); /** * Get an array of unique items that can be sold on the flea * @returns array of unique items */ getAssortItems(): Item[]; + /** + * Check internal generatedAssortItems array has objects + * @returns true if array has objects + */ protected assortsAreGenerated(): boolean; /** * Generate an array of items the flea can sell * @returns array of unique items */ protected generateRagfairAssortItems(): Item[]; + /** + * Get presets from globals.json + * @returns Preset object array + */ + protected getPresets(): Preset[]; + /** + * Get default presets from globals.json + * @returns Preset object array + */ + protected getDefaultPresets(): Preset[]; + /** + * Create a base assort item and return it with populated values + 999999 stack count + unlimited count = true + * @param tplId tplid to add to item + * @param id id to add to item + * @returns hydrated Item object + */ protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/TypeScript/9RouterHooks/types/helpers/BotGeneratorHelper.d.ts b/TypeScript/9RouterHooks/types/helpers/BotGeneratorHelper.d.ts index eb0d215..09e5c8f 100644 --- a/TypeScript/9RouterHooks/types/helpers/BotGeneratorHelper.d.ts +++ b/TypeScript/9RouterHooks/types/helpers/BotGeneratorHelper.d.ts @@ -17,6 +17,17 @@ import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; import { ProbabilityHelper } from "./ProbabilityHelper"; import { ProfileHelper } from "./ProfileHelper"; +export declare class BotModLimits { + scope: ItemCount; + scopeMax: number; + scopeBaseTypes: string[]; + flashlightLaser: ItemCount; + flashlightLaserMax: number; + flashlgihtLaserBaseTypes: string[]; +} +export declare class ItemCount { + count: number; +} export declare class BotGeneratorHelper { protected logger: ILogger; protected jsonUtil: JsonUtil; @@ -58,6 +69,27 @@ export declare class BotGeneratorHelper { * @returns Weapon with mods */ generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[]; + /** + * Find mod tpls of a provided type and add to modPool + * @param desiredSlotName slot to look up and add we are adding tpls for (e.g mod_scope) + * @param modTemplate db object for modItem we get compatible mods from + * @param modPool Pool of mods we are adding to + */ + protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void; + /** + * Check if mod item is on limited list + has surpassed the limit set for it + * @param botRole role the bot has e.g. assault + * @param modTpl mods tpl + * @param modLimits limits set for weapon being generated for this bot + * @returns true if over item limit + */ + protected modHasReachedItemLimit(botRole: string, modTpl: string, modLimits: BotModLimits): boolean; + /** + * Initalise mod limits to be used when generating the weapon + * @param botRole "assault", "bossTagilla" or "pmc" + * @returns + */ + protected initModLimits(botRole: string): BotModLimits; /** * Generate a pool of mods for this bots mod type if bot has values inside `randomisedWeaponModSlots` array found in bot.json/equipment[botrole] * @param allowedMods Mods to be added to mod pool @@ -65,7 +97,21 @@ export declare class BotGeneratorHelper { * @param modSlot Slot to generate mods for * @param itemModPool base mod pool to replace values of */ - protected generateDynamicModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + protected generateDynamicWeaponModPool(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string, itemModPool: Record): void; + /** + * Find all compatible mods for equipment item and add to modPool + * @param itemDetails item to find mods for + * @param modPool ModPool to add mods to + */ + generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void; + /** + * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist + * @param allowedMods base mods to filter + * @param botEquipBlacklist equipment blacklist + * @param modSlot slot mods belong to + * @returns Filtered array of mod tpls + */ + protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[]; /** * Check if the specific item type on the weapon has reached the set limit * @param modTpl item to check is limited diff --git a/TypeScript/9RouterHooks/types/helpers/BotHelper.d.ts b/TypeScript/9RouterHooks/types/helpers/BotHelper.d.ts index 9b89481..18738e5 100644 --- a/TypeScript/9RouterHooks/types/helpers/BotHelper.d.ts +++ b/TypeScript/9RouterHooks/types/helpers/BotHelper.d.ts @@ -13,11 +13,34 @@ export declare class BotHelper { protected configServer: ConfigServer; protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + /** + * Get difficulty settings for desired bot type, if not found use assault bot types + * @param type bot type to retreive difficulty of + * @param difficulty difficulty to get settings for (easy/normal etc) + * @returns Difficulty object + */ getBotDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Get a template object for the specified botRole from bots.types db + * @param role botRole to get template for + * @returns IBotType object + */ getBotTemplate(role: string): IBotType; + /** + * Get difficulty settings for a PMC + * @param type "usec" / "bear" + * @param difficulty what difficulty to retrieve + * @returns Difficulty object + */ getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Choose a random difficulty from - easy/normal/hard/impossible + * @returns random difficulty + */ + chooseRandomDifficulty(): string; /** * Randomise the chance the PMC will attack their own side + * Look up value in bot.json/chanceSameSideIsHostilePercent * @param difficultySettings pmc difficulty settings */ randomisePmcHostility(difficultySettings: Difficulty): void; @@ -31,7 +54,7 @@ export declare class BotHelper { */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; /** - * Add a bot to the ENEMY_BOT_TYPES array + * Add a bot to the ENEMY_BOT_TYPES array, do not add itself if its on the enemy list * @param difficultySettings bot settings to alter * @param typesToAdd bot type to add to enemy list */ @@ -42,4 +65,10 @@ export declare class BotHelper { * @param typesToAdd bot type to add to revenge list */ addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check + * @param botRole the bot role to check if should be a pmc + * @returns true if should be a pmc + */ + shouldBotBePmc(botRole: string): boolean; } diff --git a/TypeScript/9RouterHooks/types/helpers/ItemHelper.d.ts b/TypeScript/9RouterHooks/types/helpers/ItemHelper.d.ts index de10892..0effaf2 100644 --- a/TypeScript/9RouterHooks/types/helpers/ItemHelper.d.ts +++ b/TypeScript/9RouterHooks/types/helpers/ItemHelper.d.ts @@ -20,7 +20,7 @@ declare class ItemHelper { protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer); /** - * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash + * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash * @param {string} tpl the template id / tpl * @returns boolean; true for items that may be in player posession and not quest items */ @@ -79,6 +79,11 @@ declare class ItemHelper { * @returns {array} The array of StackSlotItems */ generateItemsFromStackSlot(item: ITemplateItem, parentId: string): Item[]; + /** + * Get cloned copy of all item data from items.json + * @returns array of ITemplateItem objects + */ + getItems(): ITemplateItem[]; /** * Gets item data from items.json * @param tpl items template id to look up diff --git a/TypeScript/9RouterHooks/types/models/eft/common/tables/IBotBase.d.ts b/TypeScript/9RouterHooks/types/models/eft/common/tables/IBotBase.d.ts index 64166f4..25cb861 100644 --- a/TypeScript/9RouterHooks/types/models/eft/common/tables/IBotBase.d.ts +++ b/TypeScript/9RouterHooks/types/models/eft/common/tables/IBotBase.d.ts @@ -28,6 +28,8 @@ export interface IBotBase { CarExtractCounts: CarExtractCounts; SurvivorClass: SurvivorClass; WishList: string[]; + /** SPT specific property used during bot generation in raid */ + sptIsPmc?: boolean; } export interface Info { EntryPoint: string; diff --git a/TypeScript/9RouterHooks/types/models/eft/common/tables/ITemplateItem.d.ts b/TypeScript/9RouterHooks/types/models/eft/common/tables/ITemplateItem.d.ts index 6b2fa8f..8569e61 100644 --- a/TypeScript/9RouterHooks/types/models/eft/common/tables/ITemplateItem.d.ts +++ b/TypeScript/9RouterHooks/types/models/eft/common/tables/ITemplateItem.d.ts @@ -80,7 +80,7 @@ export interface Props { HasShoulderContact?: boolean; SightingRange?: number; DoubleActionAccuracyPenaltyMult?: number; - ModesCount: any; + ModesCount?: any; DurabilityBurnModificator?: number; HeatFactor?: number; CoolFactor?: number; @@ -156,7 +156,7 @@ export interface Props { RigLayoutName?: string; MaxDurability?: number; armorZone?: string[]; - armorClass: any; + armorClass?: any; mousePenalty?: number; weaponErgonomicPenalty?: number; BluntThroughput?: number; @@ -254,8 +254,8 @@ export interface Props { foodUseTime?: number; foodEffectType?: string; StimulatorBuffs?: string; - effects_health: any; - effects_damage: any; + effects_health?: any; + effects_damage?: any; MaximumNumberOfUsage?: number; knifeHitDelay?: number; knifeHitSlashRate?: number; diff --git a/TypeScript/9RouterHooks/types/models/enums/BaseClasses.d.ts b/TypeScript/9RouterHooks/types/models/enums/BaseClasses.d.ts index 37c1398..36ebc71 100644 --- a/TypeScript/9RouterHooks/types/models/enums/BaseClasses.d.ts +++ b/TypeScript/9RouterHooks/types/models/enums/BaseClasses.d.ts @@ -25,6 +25,7 @@ export declare enum BaseClasses { SIGHTS = "5448fe7a4bdc2d6f028b456b", MEDS = "543be5664bdc2dd4348b4569", MONEY = "543be5dd4bdc2deb348b4569", + NIGHTVISION = "5a2c3a9486f774688b05e574", KEY = "543be5e94bdc2df1348b4568", KEY_MECHANICAL = "5c99f98d86f7745c314214b3", KEYCARD = "5c164d2286f774194c5e69fa", @@ -66,7 +67,6 @@ export declare enum BaseClasses { LUBRICANT = "57864e4c24597754843f8723", BATTERY = "57864ee62459775490116fc1", ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", TACTICAL_COMBO = "55818b164bdc2ddc698b456c", FLASHLIGHT = "55818b084bdc2d5b648b4571", MAGAZINE = "5448bc234bdc2d3c308b4569", diff --git a/TypeScript/9RouterHooks/types/models/enums/WeaponTypes.d.ts b/TypeScript/9RouterHooks/types/models/enums/WeaponTypes.d.ts new file mode 100644 index 0000000..867b052 --- /dev/null +++ b/TypeScript/9RouterHooks/types/models/enums/WeaponTypes.d.ts @@ -0,0 +1,151 @@ +export declare enum Weapons127x55 { + ASH_12 = "5cadfbf7ae92152ac412eeef" +} +export declare enum Weapons86x70 { + MK_18 = "5fc22d7c187fea44d52eda44", + AXMC = "627e14b21713922ded6f2c15" +} +export declare enum Weapons9x39 { + AS_VAL = "57c44b372459772d2b39b8ce", + VSS_VINTOREZ = "57838ad32459774a17445cd2" +} +export declare enum Weapons762x54R { + SVDS = "5c46fbd72e2216398b5a8c9c", + MP_18 = "61f7c9e189e6fb1a5e3ea78d", + MOSIN_INFANTRY = "5bfd297f0db834001a669119", + MOSIN_SNIPER = "5ae08f0a5acfc408fb1398a1", + SV_98 = "55801eed4bdc2d89578b4588" +} +export declare enum Weapons762x51 { + VPO_101 = "5c501a4d2e221602b412b540", + DT_MDR_762 = "5dcbd56fdbd3d91b3e5468d5", + SA_58 = "5b0bbe4e5acfc40dc528a72d", + SCARH_BLACK = "6183afd850224f204c1da514", + SCARH_FDE = "6165ac306ef05c2ce828ef74", + HK_G28 = "6176aca650224f204c1da3fb", + M1A = "5aafa857e5b5b00018480968", + RFB = "5f2a9575926fd9352339381f", + RSASS = "5a367e5dc4a282000e49738f", + SR_25 = "5df8ce05b11454561e39243b", + DVL_10 = "588892092459774ac91d4b11", + M700 = "5bfea6e90db834001b7347f3", + T5000M = "5df24cf80dee1b22f862e9bc" +} +export declare enum Weapons366TKM { + VPO_209 = "59e6687d86f77411d949b251", + VPO_215 = "5de652c31b7e3716273428be" +} +export declare enum Weapons762x39 { + OP_SKS = "587e02ff24597743df3deaeb", + SKS = "574d967124597745970e7c94", + AK_103 = "5ac66d2e5acfc43b321d4b53", + AK_104 = "5ac66d725acfc43b321d4b60", + AKM = "59d6088586f774275f37482f", + AKMN = "5a0ec13bfcdbcb00165aa685", + AKMS = "59ff346386f77477562ff5e2", + AKMSN = "5abcbc27d8ce8700182eceeb", + MK47_MUTANT = "606587252535c57a13424cfd", + RD_704 = "628a60ae6b1d481ff772e9c8", + VPO_136 = "59e6152586f77473dc057aa1" +} +export declare enum Weapons762x35 { + MCX = "5fbcc1d9016cce60e8341ab3" +} +export declare enum Weapons556x45 { + ADAR_2_15 = "5c07c60e0db834002330051f", + AK_101 = "5ac66cb05acfc40198510a10", + AK_102 = "5ac66d015acfc400180ae6e4", + DT_MDR_556 = "5c488a752e221602b412af63", + HK_416A5 = "5bb2475ed4351e00853264e3", + HK_G36 = "623063e994fc3f7b302a9696", + M4A1 = "5447a9cd4bdc2dbd208b4567", + SCARL_BLACK = "6184055050224f204c1da540", + SCARL_FDE = "618428466ef05c2ce828f218", + TX15_DML = "5d43021ca4b9362eab4b5e25" +} +export declare enum Weapons545x39 { + AK_105 = "5ac66d9b5acfc4001633997a", + AK_74 = "5bf3e03b0db834001d2c4a9c", + AK_74M = "5ac4cd105acfc40016339859", + AK_74N = "5644bd2b4bdc2d3b4c8b4572", + AKS_74 = "5bf3e0490db83400196199af", + AKS_74N = "5ab8e9fcd8ce870019439434", + AKS_74U = "57dc2fa62459775949412633", + AKS_74UB = "5839a40f24597726f856b511", + AKS_74UN = "583990e32459771419544dd2", + SAG_AK = "628b5638ad252a16da6dd245", + SAG_AK_SHORT = "628b9c37a733087d0d7fe84b", + RPK_16 = "5beed0f50db834001c062b12" +} +export declare enum Weapons57x28FN { + FN_57_BLACK = "5d3eb3b0a4b93615055e84d2", + FN_57_FDE = "5d67abc1a4b93614ec50137f", + FN_P90 = "5cc82d76e24e8d00134b4b83" +} +export declare enum Weapons46x30HK { + MP7A1 = "5ba26383d4351e00334c93d9", + MP7A2 = "5bd70322209c4d00d7167b8f" +} +export declare enum Weapons1143x23 { + M1911A1 = "5e81c3cbac2bb513793cdc75", + M45A1 = "5f36a0e5fbf956000b716b65", + USP45 = "6193a720f8ee7e52e42109ed", + UMP45 = "5fc3e272f8b6a877a729eac5", + VECTOR45 = "5fb64bc92b1b027b1f50bcf2" +} +export declare enum Weapons9x33R { + CR_50DS = "61a4c8884f95bc3b2c5dc96f" +} +export declare enum Weapons9x21 { + SR_1MP = "59f98b4986f7746f546d2cef" +} +export declare enum Weapons9x19 { + GLOCK_17 = "5a7ae0c351dfba0017554310", + GLOCK_18C = "5b1fa9b25acfc40018633c01", + M9A3 = "5cadc190ae921500103bb3b6", + MP_443 = "576a581d2459771e7b1bc4f1", + P226R = "56d59856d2720bd8418b456a", + PL_15 = "602a9740da11d6478d5a06dc", + CR_200DS = "624c2e8614da335f1e034d8c", + MP5 = "5926bb2186f7744b1c6c6e60", + MP5K = "5d2f0d8048f0356c925bc3b0", + MP9 = "5e00903ae9dc277128008b87", + MP9_N = "5de7bd7bfd6b4e6e2276dc25", + MPX = "58948c8e86f77409493f7266", + PP_19_01 = "59984ab886f7743e98271174", + SAIGA_9 = "59f9cabd86f7743a10721f46", + STM_9 = "60339954d62c9b14ed777c06", + VECTOR_9MM = "5fc3f2d5900b1d5091531e57" +} +export declare enum Weapons9x18 { + APB = "5abccb7dd8ce87001773e277", + APS = "5a17f98cfcdbcb0980087290", + PB_SILENCED = "56e0598dd2720bb5668b45a6", + PM = "5448bd6b4bdc2dfc2f8b4569", + PM_T = "579204f224597773d619e051", + PP9_KLIN = "57f4c844245977379d5c14d1", + PP91_KEDR = "57d14d2524597714373db789", + PP91_KEDRB = "57f3c6bd24597738e730fa2f" +} +export declare enum Weapons762x25 { + TT = "571a12c42459771f627b58a0", + TT_GOLD = "5b3b713c5acfc4330140bd8d", + PPSH_41 = "5ea03f7400685063ec28bfa8" +} +export declare enum Weapons12Gauge { + M3_SUPER90 = "6259b864ebedf17603599e88", + M590A1 = "5e870397991fd70db46995c8", + M870 = "5a7828548dc32e5a9c28b516", + MP_133 = "54491c4f4bdc2db1078b4568", + MP_153 = "56dee2bdd2720bc8328b4567", + MP_155 = "606dae0ab0e443224b421bb7", + MP_43_1C = "5580223e4bdc2d1c128b457f", + MTS_255_12 = "60db29ce99594040e04c4a27", + SAIGA_12GA = "576165642459773c7a400233" +} +export declare enum Weapons20Gauge { + TOZ_106 = "5a38e6bac4a2826c6e06d79b" +} +export declare enum Weapons23x75 { + KS_23M = "5e848cc2988a8701445df1e8" +} diff --git a/TypeScript/9RouterHooks/types/models/spt/config/IBotConfig.d.ts b/TypeScript/9RouterHooks/types/models/spt/config/IBotConfig.d.ts index f15fa73..2d495f9 100644 --- a/TypeScript/9RouterHooks/types/models/spt/config/IBotConfig.d.ts +++ b/TypeScript/9RouterHooks/types/models/spt/config/IBotConfig.d.ts @@ -65,6 +65,7 @@ export interface LootNvalue { export interface EquipmentFilters { weaponModLimits: ModLimits; randomisedWeaponModSlots?: string[]; + randomisedArmorSlots?: string[]; blacklist: EquipmentFilterDetails[]; whitelist: EquipmentFilterDetails[]; } diff --git a/TypeScript/9RouterHooks/types/models/spt/config/IPmcConfig.d.ts b/TypeScript/9RouterHooks/types/models/spt/config/IPmcConfig.d.ts index 655b58d..9db2ba1 100644 --- a/TypeScript/9RouterHooks/types/models/spt/config/IPmcConfig.d.ts +++ b/TypeScript/9RouterHooks/types/models/spt/config/IPmcConfig.d.ts @@ -7,14 +7,18 @@ export interface IPmcConfig { looseWeaponInBackpackLootMinMax: MinMax; isUsec: number; chanceSameSideIsHostilePercent: number; - usecType: string; - bearType: string; + /** key: location, value: type for usec/bear */ + pmcType: Record; maxBackpackLootTotalRub: number; maxPocketLootTotalRub: number; maxVestLootTotalRub: number; convertIntoPmcChance: Record; enemyTypes: string[]; } +export interface PmcTypes { + usec: string; + bear: string; +} export interface DynamicLoot { whitelist: string[]; blacklist: string[]; diff --git a/TypeScript/9RouterHooks/types/models/spt/config/IRagfairConfig.d.ts b/TypeScript/9RouterHooks/types/models/spt/config/IRagfairConfig.d.ts index 3088717..c1b8763 100644 --- a/TypeScript/9RouterHooks/types/models/spt/config/IRagfairConfig.d.ts +++ b/TypeScript/9RouterHooks/types/models/spt/config/IRagfairConfig.d.ts @@ -39,6 +39,7 @@ export interface Dynamic { offerItemCount: MinMax; price: MinMax; presetPrice: MinMax; + showDefaultPresetsOnly: boolean; endTimeSeconds: MinMax; condition: Condition; stackablePercent: MinMax; diff --git a/TypeScript/9RouterHooks/types/models/spt/services/LootItem.d.ts b/TypeScript/9RouterHooks/types/models/spt/services/LootItem.d.ts index 2838472..acb7606 100644 --- a/TypeScript/9RouterHooks/types/models/spt/services/LootItem.d.ts +++ b/TypeScript/9RouterHooks/types/models/spt/services/LootItem.d.ts @@ -1,4 +1,5 @@ export declare class LootItem { + id?: string; tpl: string; isPreset: boolean; stackCount: number; diff --git a/TypeScript/9RouterHooks/types/services/BotGenerationCacheService.d.ts b/TypeScript/9RouterHooks/types/services/BotGenerationCacheService.d.ts new file mode 100644 index 0000000..c7dddf5 --- /dev/null +++ b/TypeScript/9RouterHooks/types/services/BotGenerationCacheService.d.ts @@ -0,0 +1,47 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotGenerationCacheService { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected botHelper: BotHelper; + protected storedBots: IBotBase[]; + constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper); + /** + * Store array of bots in cache, shuffle results before storage + * @param botsToStore + */ + storeBots(botsToStore: IBotBase[]): void; + /** + * Find and return a bot based on its role + * Remove bot from internal array so it can't be retreived again + * @param role role to retreive (assault/bossTagilla etc) + * @returns IBotBase object + */ + getBot(role: string): IBotBase[]; + /** + * Find a bot by its index from cache + * @param indexOfBotToReturn index to find bot by + * @returns bot profile + */ + protected getBotFromCache(indexOfBotToReturn: number): IBotBase; + /** + * Remove bot profile by index from cache + * @param indexOfBotToReturn Index of bot profile to remove + */ + protected removeBotFromCache(indexOfBotToReturn: number): void; + /** + * Get index of bot profile that matches criteria + * @param role role of bot we want + * @param getPmc is requested bot a pmc + * @returns index of found bot + */ + protected getIndexOfBotToReturn(role: string, getPmc: boolean): number; + /** + * Remove all cached bot profiles + */ + clearStoredBots(): void; +} diff --git a/TypeScript/9RouterHooks/types/services/BotLootCacheService.d.ts b/TypeScript/9RouterHooks/types/services/BotLootCacheService.d.ts index cc71eee..00ffb9c 100644 --- a/TypeScript/9RouterHooks/types/services/BotLootCacheService.d.ts +++ b/TypeScript/9RouterHooks/types/services/BotLootCacheService.d.ts @@ -34,6 +34,17 @@ export declare class BotLootCacheService { * @param isPmc Is the bot a PMC (alteres what loot is cached) */ protected addLootToCache(botRole: string, isPmc: boolean, lootPool: Items): void; + /** + * Sort a pool of item objects by its flea price + * @param poolToSort pool of items to sort + */ + protected sortPoolByRagfairPrice(poolToSort: ITemplateItem[]): void; + /** + * Add unique items into combined pool + * @param combinedItemPool Pool of items to add to + * @param itemsToAdd items to add to combined pool if unique + */ + protected addUniqueItemsToPool(combinedItemPool: ITemplateItem[], itemsToAdd: ITemplateItem[]): void; /** * Ammo/grenades have this property * @param props diff --git a/TypeScript/9RouterHooks/types/services/FenceService.d.ts b/TypeScript/9RouterHooks/types/services/FenceService.d.ts index c940507..23fbf52 100644 --- a/TypeScript/9RouterHooks/types/services/FenceService.d.ts +++ b/TypeScript/9RouterHooks/types/services/FenceService.d.ts @@ -55,6 +55,17 @@ export declare class FenceService { * Replace a percentage of fence assorts with freshly generated items */ performPartialRefresh(): void; + /** + * Increment fence next refresh timestamp by current timestamp + partialRefreshTimeSeconds from config + */ + protected incrementPartialRefreshTime(): void; + /** + * Compare the current fence offer count to what the config wants it to be, + * If value is lower add extra count to value to generate more items to fill gap + * @param existingItemCountToReplace count of items to generate + * @returns number of items to generate + */ + protected getCountOfItemsToGenerate(existingItemCountToReplace: number): number; /** * Choose an item (not mod) at random and remove from assorts */ diff --git a/TypeScript/9RouterHooks/types/services/PmcAiService.d.ts b/TypeScript/9RouterHooks/types/services/PmcAiService.d.ts new file mode 100644 index 0000000..0690f1f --- /dev/null +++ b/TypeScript/9RouterHooks/types/services/PmcAiService.d.ts @@ -0,0 +1,27 @@ +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */ +export declare class PmcAiService { + protected logger: ILogger; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + protected usecRole: string; + protected bearRole: string; + constructor(logger: ILogger, configServer: ConfigServer); + /** + * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType) + * @param pmcSide eft side (usec/bear) + * @returns pmc side as defined in config + */ + getPmcRole(pmcSide: "usec" | "bear" | string): string; + /** + * Set the roles for pmcs + * @param location map location to look up and use as pmc types + */ + setPmcRolesByLocation(location: string): void; + /** + * Clear the saved role from usec/bear PMCs + */ + clearPmcRoles(): void; +} diff --git a/TypeScript/9RouterHooks/types/utils/RandomUtil.d.ts b/TypeScript/9RouterHooks/types/utils/RandomUtil.d.ts index e35d21f..633e472 100644 --- a/TypeScript/9RouterHooks/types/utils/RandomUtil.d.ts +++ b/TypeScript/9RouterHooks/types/utils/RandomUtil.d.ts @@ -136,7 +136,7 @@ export declare class RandomUtil { * Drawing can be with or without replacement * @param {array} list The array we want to draw randomly from * @param {integer} count The number of times we want to draw - * @param {boolean} replacement Draw with ot without replacement from the input array + * @param {boolean} replacement Draw with or without replacement from the input array * @return {array} Array consisting of N random elements */ drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array;