From d26c1b7987ce6f2673efea9394639541585515c7 Mon Sep 17 00:00:00 2001 From: CWX Date: Wed, 8 Jun 2022 22:09:11 +0100 Subject: [PATCH] bump --- .../bepInEx/plugins/HideoutArchitect.dll | Bin 21504 -> 21504 bytes .../user/mods/HideoutArchitect/package.json | 26 +- .../HideoutArchitect/src/hideoutarchitect.ts | 41 +- .../types/callbacks/BotCallbacks.d.ts | 4 +- .../types/callbacks/BundleCallbacks.d.ts | 13 +- .../callbacks/CustomizationCallbacks.d.ts | 6 +- .../types/callbacks/DataCallbacks.d.ts | 4 +- .../types/callbacks/DialogueCallbacks.d.ts | 8 +- .../types/callbacks/GameCallbacks.d.ts | 6 +- .../types/callbacks/HandbookCallbacks.d.ts | 2 +- .../types/callbacks/HealthCallbacks.d.ts | 6 +- .../types/callbacks/HideoutCallbacks.d.ts | 7 +- .../types/callbacks/HttpCallbacks.d.ts | 2 +- .../types/callbacks/InraidCallbacks.d.ts | 12 +- .../types/callbacks/InsuranceCallbacks.d.ts | 11 +- .../types/callbacks/InventoryCallbacks.d.ts | 2 +- .../types/callbacks/ItemEventCallbacks.d.ts | 4 +- .../types/callbacks/LauncherCallbacks.d.ts | 8 +- .../types/callbacks/LocationCallbacks.d.ts | 4 +- .../types/callbacks/MatchCallbacks.d.ts | 8 +- .../types/callbacks/ModCallbacks.d.ts | 13 +- .../types/callbacks/NoteCallbacks.d.ts | 2 +- .../types/callbacks/NotifierCallbacks.d.ts | 8 +- .../types/callbacks/PresetBuildCallbacks.d.ts | 4 +- .../types/callbacks/PresetCallbacks.d.ts | 2 +- .../types/callbacks/ProfileCallbacks.d.ts | 6 +- .../types/callbacks/QuestCallbacks.d.ts | 6 +- .../types/callbacks/RagfairCallbacks.d.ts | 17 +- .../types/callbacks/RepairCallbacks.d.ts | 2 +- .../types/callbacks/SaveCallbacks.d.ts | 2 +- .../types/callbacks/TradeCallbacks.d.ts | 2 +- .../types/callbacks/TraderCallbacks.d.ts | 4 +- .../types/callbacks/WeatherCallbacks.d.ts | 4 +- .../types/callbacks/WishlistCallbacks.d.ts | 2 +- .../types/controllers/BotController.d.ts | 37 +- .../controllers/CustomizationController.d.ts | 22 +- .../types/controllers/DialogueController.d.ts | 17 +- .../types/controllers/GameController.d.ts | 28 +- .../types/controllers/HandbookController.d.ts | 6 +- .../types/controllers/HealthController.d.ts | 12 +- .../types/controllers/HideoutController.d.ts | 71 +- .../types/controllers/InraidController.d.ts | 41 +- .../controllers/InsuranceController.d.ts | 45 +- .../controllers/InventoryController.d.ts | 18 +- .../types/controllers/LauncherController.d.ts | 29 +- .../types/controllers/LocationController.d.ts | 14 +- .../types/controllers/MatchController.d.ts | 18 +- .../types/controllers/NoteController.d.ts | 4 +- .../types/controllers/NotifierController.d.ts | 10 +- .../controllers/PresetBuildController.d.ts | 14 +- .../types/controllers/PresetController.d.ts | 4 +- .../types/controllers/ProfileController.d.ts | 24 +- .../types/controllers/QuestController.d.ts | 41 +- .../types/controllers/RagfairController.d.ts | 49 +- .../types/controllers/RepairController.d.ts | 37 +- .../RepeatableQuestController.d.ts | 35 +- .../types/controllers/TradeController.d.ts | 10 +- .../types/controllers/TraderController.d.ts | 16 +- .../types/controllers/WeatherController.d.ts | 9 +- .../types/controllers/WishlistController.d.ts | 2 +- .../types/generators/BotGenerator.d.ts | 70 +- .../generators/BotInventoryGenerator.d.ts | 22 +- .../types/generators/BotLootGenerator.d.ts | 34 +- .../types/generators/BotWeaponGenerator.d.ts | 26 +- .../types/generators/LocationGenerator.d.ts | 58 +- .../types/generators/PMCLootGenerator.d.ts | 13 +- .../generators/RagfairAssortGenerator.d.ts | 26 +- .../generators/RagfairOfferGenerator.d.ts | 75 +- .../types/generators/WeatherGenerator.d.ts | 19 +- .../types/helpers/AssortHelper.d.ts | 32 +- .../types/helpers/BotGeneratorHelper.d.ts | 94 +- .../types/helpers/BotHelper.d.ts | 38 +- .../types/helpers/ContainerHelper.d.ts | 2 +- .../types/helpers/DialogueHelper.d.ts | 19 +- .../types/helpers/DurabilityLimitsHelper.d.ts | 31 +- .../types/helpers/ExtendedProfileHelper.d.ts | 18 +- .../types/helpers/GameEventHelper.d.ts | 2 +- .../types/helpers/HandbookHelper.d.ts | 2 +- .../types/helpers/HealthHelper.d.ts | 30 +- .../types/helpers/HideoutHelper.d.ts | 58 +- .../types/helpers/HttpServerHelper.d.ts | 17 +- .../types/helpers/InRaidHelper.d.ts | 16 +- .../types/helpers/InventoryHelper.d.ts | 48 +- .../types/helpers/ItemHelper.d.ts | 103 +- .../types/helpers/NotificationSendHelper.d.ts | 4 +- .../types/helpers/NotifierHelper.d.ts | 4 +- .../types/helpers/PresetHelper.d.ts | 4 +- .../types/helpers/ProfileHelper.d.ts | 4 +- .../types/helpers/QuestConditionHelper.d.ts | 2 +- .../types/helpers/QuestHelper.d.ts | 33 +- .../types/helpers/RagfairHelper.d.ts | 23 +- .../types/helpers/RagfairOfferHelper.d.ts | 47 +- .../types/helpers/RagfairSellHelper.d.ts | 11 +- .../types/helpers/RagfairServerHelper.d.ts | 35 +- .../types/helpers/RagfairSortHelper.d.ts | 12 +- .../types/helpers/RagfairTaxHelper.d.ts | 11 +- .../types/helpers/RepairHelper.d.ts | 22 +- .../types/helpers/SecureContainerHelper.d.ts | 2 +- .../types/helpers/TradeHelper.d.ts | 37 +- .../types/helpers/TraderAssortHelper.d.ts | 41 +- .../types/helpers/TraderHelper.d.ts | 54 +- .../types/ide/BleedingEdgeEntry.d.ts | 1 + .../types/loaders/BundleLoader.d.ts | 12 +- .../types/loaders/DelayedModLoader.d.ts | 17 +- .../types/loaders/InitialModLoader.d.ts | 71 +- .../models/eft/common/ILocationBase.d.ts | 9 + .../types/models/eft/common/IPmcData.d.ts | 6 +- .../models/eft/common/tables/IBotType.d.ts | 2 + .../models/eft/common/tables/IQuest.d.ts | 36 +- .../dialog/IGetFriendListDataResponse.d.ts | 2 +- .../dialog/IGetMailDialogViewRequestData.d.ts | 2 +- .../eft/dialog/ISendMessageRequest.d.ts | 2 +- .../types/models/eft/profile/IAkiProfile.d.ts | 21 +- .../models/eft/ragfair/IRagfairOffer.d.ts | 2 +- .../types/models/enums/BaseClasses.d.ts | 84 ++ .../types/models/enums/ConfigTypes.d.ts | 18 + .../types/models/enums/ELocationName.d.ts | 11 + .../types/models/enums/EquipmentSlots.d.ts | 16 + .../types/models/enums/HideoutAreas.d.ts | 25 + .../types/models/enums/MemberCategory.d.ts | 13 + .../types/models/enums/MessageType.d.ts | 16 + .../types/models/enums/Money.d.ts | 5 + .../types/models/enums/Traders.d.ts | 10 + .../types/models/spt/config/IBotConfig.d.ts | 2 + .../types/models/spt/config/IQuestConfig.d.ts | 12 +- .../types/models/spt/helpers/Traders.d.ts | 2 +- .../types/models/spt/mod/IMod.d.ts | 2 +- .../types/models/spt/mod/IModLoader.d.ts | 1 - .../types/models/spt/server/IHttpServer.d.ts | 1 + .../types/models/spt/server/ILocaleBase.d.ts | 2 +- .../types/routers/HttpRouter.d.ts | 15 +- .../types/routers/ImageRouter.d.ts | 9 +- .../types/routers/ItemEventRouter.d.ts | 12 +- .../routers/dynamic/BotDynamicRouter.d.ts | 2 +- .../routers/dynamic/BundleDynamicRouter.d.ts | 2 +- .../dynamic/CustomizationDynamicRouter.d.ts | 2 +- .../routers/dynamic/DataDynamicRouter.d.ts | 2 +- .../routers/dynamic/HttpDynamicRouter.d.ts | 2 +- .../routers/dynamic/InraidDynamicRouter.d.ts | 2 +- .../dynamic/LocationDynamicRouter.d.ts | 2 +- .../dynamic/NotifierDynamicRouter.d.ts | 2 +- .../routers/dynamic/TraderDynamicRouter.d.ts | 2 +- .../CustomizationItemEventRouter.d.ts | 2 +- .../item_events/HealthItemEventRouter.d.ts | 2 +- .../item_events/HideoutItemEventRouter.d.ts | 2 +- .../item_events/InsuranceItemEventRouter.d.ts | 2 +- .../item_events/InventoryItemEventRouter.d.ts | 2 +- .../item_events/NoteItemEventRouter.d.ts | 2 +- .../PresetBuildItemEventRouter.d.ts | 2 +- .../item_events/QuestItemEventRouter.d.ts | 2 +- .../item_events/RagfairItemEventRouter.d.ts | 2 +- .../item_events/RepairItemEventRouter.d.ts | 2 +- .../item_events/TradeItemEventRouter.d.ts | 2 +- .../item_events/WishlistItemEventRouter.d.ts | 2 +- .../routers/serializers/BundleSerializer.d.ts | 8 +- .../routers/serializers/ImageSerializer.d.ts | 2 +- .../routers/serializers/NotifySerializer.d.ts | 6 +- .../types/routers/static/BotStaticRouter.d.ts | 2 +- .../routers/static/BundleStaticRouter.d.ts | 2 +- .../static/CustomizationStaticRouter.d.ts | 2 +- .../routers/static/DataStaticRouter.d.ts | 2 +- .../routers/static/DialogStaticRouter.d.ts | 2 +- .../routers/static/GameStaticRouter.d.ts | 2 +- .../routers/static/HealthStaticRouter.d.ts | 2 +- .../routers/static/InraidStaticRouter.d.ts | 2 +- .../routers/static/InsuranceStaticRouter.d.ts | 2 +- .../routers/static/ItemEventStaticRouter.d.ts | 2 +- .../routers/static/LauncherStaticRouter.d.ts | 2 +- .../routers/static/LocationStaticRouter.d.ts | 2 +- .../routers/static/MatchStaticRouter.d.ts | 2 +- .../routers/static/NotifierStaticRouter.d.ts | 2 +- .../routers/static/PresetStaticRouter.d.ts | 2 +- .../routers/static/ProfileStaticRouter.d.ts | 2 +- .../routers/static/QuestStaticRouter.d.ts | 2 +- .../routers/static/RagfairStaticRouter.d.ts | 2 +- .../routers/static/TraderStaticRouter.d.ts | 2 +- .../routers/static/WeatherStaticRouter.d.ts | 2 +- .../types/servers/ConfigServer.d.ts | 28 +- .../types/servers/DatabaseServer.d.ts | 2 +- .../types/servers/HttpServer.d.ts | 36 +- .../types/servers/RagfairServer.d.ts | 43 +- .../types/servers/SaveServer.d.ts | 18 +- .../types/services/FenceService.d.ts | 29 +- .../types/services/HashCacheService.d.ts | 14 +- .../types/services/InsuranceService.d.ts | 27 +- .../types/services/MatchLocationService.d.ts | 4 +- .../types/services/ModCompilerService.d.ts | 21 +- .../types/services/NotificationService.d.ts | 2 +- .../types/services/PaymentService.d.ts | 19 +- .../types/services/PlayerService.d.ts | 4 +- .../services/RagfairCategoriesService.d.ts | 2 +- .../services/RagfairLinkedItemService.d.ts | 9 +- .../types/services/RagfairOfferService.d.ts | 54 +- .../types/services/RagfairPriceService.d.ts | 26 +- .../services/RagfairRequiredItemsService.d.ts | 8 +- .../types/services/TraderAssortService.d.ts | 2 +- .../services/mod/image/imageRouteService.d.ts | 6 + .../services/mod/onLoad/OnLoadModService.d.ts | 2 +- .../mod/onUpdate/OnUpdateModService.d.ts | 2 +- .../staticRouter/StaticRouterModService.d.ts | 2 +- .../HideoutArchitect/types/utils/App.d.ts | 12 +- .../types/utils/AyncQueue.d.ts | 2 +- .../types/utils/DatabaseImporter.d.ts | 10 +- .../types/utils/HashUtil.d.ts | 2 +- .../types/utils/HttpResponseUtil.d.ts | 4 +- .../types/utils/JsonUtil.d.ts | 8 +- .../HideoutArchitect/types/utils/Logger.d.ts | 42 +- .../types/utils/ObjectId.d.ts | 12 +- .../types/utils/RandomUtil.d.ts | 4 +- .../HideoutArchitect/types/utils/VFS.d.ts | 7 +- .../types/utils/Watermark.d.ts | 31 +- Faupi-HideoutMod/Project/src/client/Main.cs | 4 +- .../Project/src/server/.eslintignore | 9 + .../Project/src/server/.eslintrc.json | 75 ++ .../HideoutArchitect => src/server}/LICENSE | 0 .../Project/src/server/config.jsonc | 9 + .../Project/src/server/dist/config.jsonc | 9 + .../Project/src/server/dist/package.json | 26 + .../dist/res/icon_neededforhideout_small.png | Bin 0 -> 553 bytes .../src/server/dist/res/translations.json | 47 + .../src/server/dist/src/hideoutarchitect.ts | 94 ++ .../src/server/dist/types/Program.d.ts | 4 + .../Project/src/server/dist/types/TYPES.d.ts | 3 + .../Project/src/server/dist/types/Utils.d.ts | 0 .../dist/types/callbacks/BotCallbacks.d.ts | 15 + .../dist/types/callbacks/BundleCallbacks.d.ts | 18 + .../callbacks/CustomizationCallbacks.d.ts | 23 + .../dist/types/callbacks/DataCallbacks.d.ts | 32 + .../types/callbacks/DialogueCallbacks.d.ts | 45 + .../dist/types/callbacks/GameCallbacks.d.ts | 24 + .../types/callbacks/HandbookCallbacks.d.ts | 8 + .../dist/types/callbacks/HealthCallbacks.d.ts | 20 + .../types/callbacks/HideoutCallbacks.d.ts | 33 + .../dist/types/callbacks/HttpCallbacks.d.ts | 9 + .../dist/types/callbacks/InraidCallbacks.d.ts | 23 + .../types/callbacks/InsuranceCallbacks.d.ts | 24 + .../types/callbacks/InventoryCallbacks.d.ts | 39 + .../types/callbacks/ItemEventCallbacks.d.ts | 11 + .../types/callbacks/LauncherCallbacks.d.ts | 28 + .../types/callbacks/LocationCallbacks.d.ts | 14 + .../dist/types/callbacks/MatchCallbacks.d.ts | 35 + .../dist/types/callbacks/ModCallbacks.d.ts | 22 + .../dist/types/callbacks/NoteCallbacks.d.ts | 11 + .../types/callbacks/NotifierCallbacks.d.ts | 24 + .../types/callbacks/PresetBuildCallbacks.d.ts | 15 + .../dist/types/callbacks/PresetCallbacks.d.ts | 8 + .../types/callbacks/ProfileCallbacks.d.ts | 30 + .../dist/types/callbacks/QuestCallbacks.d.ts | 26 + .../types/callbacks/RagfairCallbacks.d.ts | 39 + .../dist/types/callbacks/RepairCallbacks.d.ts | 11 + .../dist/types/callbacks/SaveCallbacks.d.ts | 9 + .../dist/types/callbacks/TradeCallbacks.d.ts | 11 + .../dist/types/callbacks/TraderCallbacks.d.ts | 18 + .../types/callbacks/WeatherCallbacks.d.ts | 10 + .../types/callbacks/WishlistCallbacks.d.ts | 10 + .../dist/types/controllers/BotController.d.ts | 35 + .../controllers/CustomizationController.d.ts | 22 + .../types/controllers/DialogueController.d.ts | 25 + .../types/controllers/GameController.d.ts | 32 + .../types/controllers/HandbookController.d.ts | 8 + .../types/controllers/HealthController.d.ts | 25 + .../types/controllers/HideoutController.d.ts | 57 + .../types/controllers/InraidController.d.ts | 31 + .../controllers/InsuranceController.d.ts | 38 + .../controllers/InventoryController.d.ts | 107 ++ .../types/controllers/LauncherController.d.ts | 28 + .../types/controllers/LocationController.d.ts | 18 + .../types/controllers/MatchController.d.ts | 30 + .../types/controllers/NoteController.d.ts | 12 + .../types/controllers/NotifierController.d.ts | 22 + .../controllers/PresetBuildController.d.ts | 18 + .../types/controllers/PresetController.d.ts | 8 + .../types/controllers/ProfileController.d.ts | 34 + .../types/controllers/QuestController.d.ts | 38 + .../types/controllers/RagfairController.d.ts | 70 + .../types/controllers/RepairController.d.ts | 41 + .../RepeatableQuestController.d.ts | 217 +++ .../types/controllers/TradeController.d.ts | 21 + .../types/controllers/TraderController.d.ts | 26 + .../types/controllers/WeatherController.d.ts | 11 + .../types/controllers/WishlistController.d.ts | 10 + .../src/server/dist/types/di/Container.d.ts | 14 + .../src/server/dist/types/di/OnLoad.d.ts | 4 + .../server/dist/types/di/OnLoadOnUpdate.d.ts | 7 + .../src/server/dist/types/di/OnUpdate.d.ts | 4 + .../src/server/dist/types/di/Router.d.ts | 40 + .../src/server/dist/types/di/Serializer.d.ts | 5 + .../dist/types/generators/BotGenerator.d.ts | 46 + .../generators/BotInventoryGenerator.d.ts | 24 + .../types/generators/BotLootGenerator.d.ts | 29 + .../types/generators/BotWeaponGenerator.d.ts | 46 + .../types/generators/LocationGenerator.d.ts | 46 + .../types/generators/PMCLootGenerator.d.ts | 15 + .../generators/RagfairAssortGenerator.d.ts | 25 + .../generators/RagfairOfferGenerator.d.ts | 60 + .../types/generators/WeatherGenerator.d.ts | 20 + .../dist/types/helpers/AssortHelper.d.ts | 36 + .../types/helpers/BotGeneratorHelper.d.ts | 95 ++ .../server/dist/types/helpers/BotHelper.d.ts | 44 + .../dist/types/helpers/ContainerHelper.d.ts | 12 + .../dist/types/helpers/DialogueHelper.d.ts | 21 + .../types/helpers/DurabilityLimitsHelper.d.ts | 26 + .../types/helpers/ExtendedProfileHelper.d.ts | 22 + .../dist/types/helpers/GameEventHelper.d.ts | 9 + .../dist/types/helpers/HandbookHelper.d.ts | 33 + .../dist/types/helpers/HealthHelper.d.ts | 27 + .../dist/types/helpers/HideoutHelper.d.ts | 68 + .../dist/types/helpers/HttpServerHelper.d.ts | 23 + .../dist/types/helpers/InRaidHelper.d.ts | 33 + .../dist/types/helpers/InventoryHelper.d.ts | 85 ++ .../server/dist/types/helpers/ItemHelper.d.ts | 147 +++ .../types/helpers/NotificationSendHelper.d.ts | 12 + .../dist/types/helpers/NotifierHelper.d.ts | 17 + .../dist/types/helpers/PaymentHelper.d.ts | 14 + .../dist/types/helpers/PresetHelper.d.ts | 14 + .../dist/types/helpers/ProfileHelper.d.ts | 33 + .../types/helpers/QuestConditionHelper.d.ts | 7 + .../dist/types/helpers/QuestHelper.d.ts | 69 + .../dist/types/helpers/RagfairHelper.d.ts | 44 + .../types/helpers/RagfairOfferHelper.d.ts | 52 + .../dist/types/helpers/RagfairSellHelper.d.ts | 16 + .../types/helpers/RagfairServerHelper.d.ts | 46 + .../dist/types/helpers/RagfairSortHelper.d.ts | 12 + .../dist/types/helpers/RagfairTaxHelper.d.ts | 16 + .../dist/types/helpers/RepairHelper.d.ts | 22 + .../types/helpers/SecureContainerHelper.d.ts | 13 + .../dist/types/helpers/TradeHelper.d.ts | 44 + .../types/helpers/TraderAssortHelper.d.ts | 42 + .../dist/types/helpers/TraderHelper.d.ts | 53 + .../dist/types/helpers/UtilityHelper.d.ts | 3 + .../types/helpers/WeightedRandomHelper.d.ts | 28 + .../dist/types/ide/BleedingEdgeEntry.d.ts | 1 + .../src/server/dist/types/ide/Compiler.d.ts | 1 + .../src/server/dist/types/ide/DebugEntry.d.ts | 1 + .../server/dist/types/ide/ReleaseEntry.d.ts | 1 + .../src/server/dist/types/ide/TestEntry.d.ts | 1 + .../dist/types/loaders/BundleLoader.d.ts | 22 + .../dist/types/loaders/DelayedModLoader.d.ts | 21 + .../dist/types/loaders/InitialModLoader.d.ts | 64 + .../eft/bot/IGenerateBotsRequestData.d.ts | 8 + .../models/eft/common/IEmptyRequestData.d.ts | 2 + .../types/models/eft/common/IGlobals.d.ts | 1176 +++++++++++++++++ .../types/models/eft/common/ILocation.d.ts | 6 + .../models/eft/common/ILocationBase.d.ts | 198 +++ .../ILocationsSourceDestinationBase.d.ts | 9 + .../types/models/eft/common/ILooseLoot.d.ts | 45 + .../models/eft/common/IMetricsTableData.d.ts | 7 + .../types/models/eft/common/IPmcData.d.ts | 341 +++++ .../models/eft/common/MemberCategory.d.ts | 13 + .../request/IBaseInteractionRequestData.d.ts | 9 + .../models/eft/common/tables/IBotBase.d.ts | 101 ++ .../models/eft/common/tables/IBotCore.d.ts | 133 ++ .../models/eft/common/tables/IBotType.d.ts | 176 +++ .../eft/common/tables/ICustomizationItem.d.ts | 33 + .../eft/common/tables/IHandbookBase.d.ts | 16 + .../types/models/eft/common/tables/IItem.d.ts | 108 ++ .../eft/common/tables/ILocationsBase.d.ts | 10 + .../models/eft/common/tables/ILootBase.d.ts | 64 + .../models/eft/common/tables/IQuest.d.ts | 110 ++ .../eft/common/tables/IRepeatableQuests.d.ts | 219 +++ .../eft/common/tables/ITemplateItem.d.ts | 401 ++++++ .../models/eft/common/tables/ITrader.d.ts | 90 ++ .../IBuyClothingRequestData.d.ts | 10 + .../IWearClothingRequestData.d.ts | 4 + .../models/eft/dialog/IFriendRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsResponse.d.ts | 6 + .../dialog/IGetChatServerListRequestData.d.ts | 3 + .../dialog/IGetFriendListDataResponse.d.ts | 16 + .../dialog/IGetMailDialogInfoRequestData.d.ts | 3 + .../dialog/IGetMailDialogListRequestData.d.ts | 4 + .../dialog/IGetMailDialogViewRequestData.d.ts | 7 + .../IGetMailDialogViewResponseData.d.ts | 7 + .../eft/dialog/IPinDialogRequestData.d.ts | 3 + .../eft/dialog/IRemoveDialogRequestData.d.ts | 3 + .../eft/dialog/ISendMessageRequest.d.ts | 7 + .../eft/dialog/ISetDialogReadRequestData.d.ts | 3 + .../models/eft/game/IGameConfigResponse.d.ts | 19 + .../eft/game/IGameEmptyCrcRequestData.d.ts | 3 + .../eft/game/IVersionValidateRequestData.d.ts | 11 + .../health/IHealthTreatmentRequestData.d.ts | 29 + .../eft/health/IOffraidEatRequestData.d.ts | 7 + .../eft/health/IOffraidHealRequestData.d.ts | 18 + .../eft/health/ISyncHealthRequestData.d.ts | 21 + .../models/eft/hideout/HideoutAreasEnum.d.ts | 25 + .../HideoutUpgradeCompleteRequestData.d.ts | 5 + .../models/eft/hideout/IHideoutArea.d.ts | 40 + ...utContinousProductionStartRequestData.d.ts | 5 + .../eft/hideout/IHideoutProduction.d.ts | 20 + .../hideout/IHideoutPutItemInRequestData.d.ts | 10 + .../models/eft/hideout/IHideoutScavCase.d.ts | 21 + .../IHideoutScavCaseStartRequestData.d.ts | 15 + .../eft/hideout/IHideoutSettingsBase.d.ts | 6 + ...deoutSingleProductionStartRequestData.d.ts | 10 + .../IHideoutTakeItemOutRequestData.d.ts | 6 + .../IHideoutTakeProductionRequestData.d.ts | 5 + .../IHideoutToggleAreaRequestData.d.ts | 6 + .../IHideoutUpgradeCompleteRequestData.d.ts | 5 + .../hideout/IHideoutUpgradeRequestData.d.ts | 10 + .../httpResponse/IGetBodyResponseData.d.ts | 5 + .../eft/httpResponse/INullResponseData.d.ts | 5 + .../inRaid/IRegisterPlayerRequestData.d.ts | 5 + .../eft/inRaid/ISaveProgressRequestData.d.ts | 8 + .../IGetInsuranceCostRequestData.d.ts | 4 + .../eft/insurance/IInsureRequestData.d.ts | 6 + .../eft/inventory/IAddItemRequestData.d.ts | 4 + .../inventory/IInventoryAddRequestData.d.ts | 6 + .../IInventoryBaseActionRequestData.d.ts | 27 + .../inventory/IInventoryBindRequestData.d.ts | 6 + .../IInventoryCreateMarkerRequestData.d.ts | 12 + .../IInventoryDeleteMarkerRequestData.d.ts | 7 + .../IInventoryEditMarkerRequestData.d.ts | 14 + .../IInventoryExamineRequestData.d.ts | 10 + .../inventory/IInventoryFoldRequestData.d.ts | 6 + .../inventory/IInventoryMergeRequestData.d.ts | 6 + .../inventory/IInventoryMoveRequestData.d.ts | 6 + ...IInventoryReadEncyclopediaRequestData.d.ts | 5 + .../IInventoryRemoveRequestData.d.ts | 5 + .../inventory/IInventorySortRequestData.d.ts | 20 + .../inventory/IInventorySplitRequestData.d.ts | 7 + .../inventory/IInventorySwapRequestData.d.ts | 11 + .../inventory/IInventoryTagRequestData.d.ts | 7 + .../IInventoryToggleRequestData.d.ts | 6 + .../IInventoryTransferRequestData.d.ts | 7 + .../IEmptyItemEventRouterResponse.d.ts | 4 + .../eft/itemEvent/IItemEventRouterBase.d.ts | 67 + .../itemEvent/IItemEventRouterRequest.d.ts | 21 + .../itemEvent/IItemEventRouterResponse.d.ts | 3 + .../eft/launcher/IChangeRequestData.d.ts | 4 + .../launcher/IGetMiniProfileRequestData.d.ts | 4 + .../eft/launcher/ILoginRequestData.d.ts | 4 + .../models/eft/launcher/IMiniProfile.d.ts | 14 + .../models/eft/launcher/IRegisterData.d.ts | 4 + .../eft/launcher/IRemoveProfileData.d.ts | 2 + .../eft/location/IGetLocationRequestData.d.ts | 5 + .../eft/match/IEndOfflineRaidRequestData.d.ts | 6 + .../eft/match/IGetProfileRequestData.d.ts | 3 + .../match/IStartOffineRaidRequestData.d.ts | 27 + .../models/eft/notes/INoteActionData.d.ts | 10 + .../types/models/eft/notifier/INotifier.d.ts | 14 + .../notifier/ISelectProfileRequestData.d.ts | 3 + ...IPlayerIncrementSkillLevelRequestData.d.ts | 21 + .../IPresetBuildActionRequestData.d.ts | 25 + .../types/models/eft/profile/IAkiProfile.d.ts | 167 +++ .../IProfileChangeNicknameRequestData.d.ts | 3 + .../IProfileChangeVoiceRequestData.d.ts | 3 + .../profile/IProfileCreateRequestData.d.ts | 6 + .../eft/profile/ISearchFriendRequestData.d.ts | 3 + .../eft/profile/ISearchFriendResponse.d.ts | 9 + .../profile/IValidateNicknameRequestData.d.ts | 3 + .../eft/quests/IAcceptQuestRequestData.d.ts | 5 + .../eft/quests/ICompleteQuestRequestData.d.ts | 5 + .../eft/quests/IHandoverQuestRequestData.d.ts | 10 + .../eft/quests/IListQuestsRequestData.d.ts | 3 + .../quests/IRepeatableQuestChangeRequest.d.ts | 4 + .../eft/ragfair/IAddOfferRequestData.d.ts | 13 + .../eft/ragfair/IExtendOfferRequestData.d.ts | 4 + .../eft/ragfair/IGetItemPriceResult.d.ts | 5 + .../ragfair/IGetMarketPriceRequestData.d.ts | 3 + .../models/eft/ragfair/IGetOffersResult.d.ts | 7 + .../models/eft/ragfair/IRagfairOffer.d.ts | 42 + .../eft/ragfair/IRemoveOfferRequestData.d.ts | 4 + .../eft/ragfair/ISearchRequestData.d.ts | 32 + .../repair/IBaseRepairActionDataRequest.d.ts | 3 + .../eft/repair/IRepairActionDataRequest.d.ts | 10 + .../ITraderRepairActionDataRequest.d.ts | 10 + .../trade/IProcessBaseTradeRequestData.d.ts | 5 + .../trade/IProcessBuyTradeRequestData.d.ts | 14 + .../IProcessRagfairTradeRequestData.d.ts | 13 + .../trade/IProcessSellTradeRequestData.d.ts | 12 + .../models/eft/weather/IWeatherData.d.ts | 20 + .../eft/wishlist/IWishlistActionData.d.ts | 4 + .../dist/types/models/enums/BaseClasses.d.ts | 84 ++ .../dist/types/models/enums/ConfigTypes.d.ts | 18 + .../types/models/enums/ELocationName.d.ts | 11 + .../types/models/enums/EquipmentSlots.d.ts | 16 + .../dist/types/models/enums/HideoutAreas.d.ts | 25 + .../types/models/enums/MemberCategory.d.ts | 13 + .../dist/types/models/enums/MessageType.d.ts | 16 + .../server/dist/types/models/enums/Money.d.ts | 5 + .../dist/types/models/enums/Traders.d.ts | 10 + .../dist/types/models/external/mod.d.ts | 5 + .../dist/types/models/external/tsyringe.d.ts | 2 + .../dist/types/models/spt/bindings/Route.d.ts | 3 + .../models/spt/callbacks/IBotCallbacks.d.ts | 10 + .../spt/callbacks/IBundleCallbacks.d.ts | 5 + .../callbacks/ICustomizationCallbacks.d.ts | 12 + .../models/spt/callbacks/IDataCallbacks.d.ts | 26 + .../spt/callbacks/IDialogueCallbacks.d.ts | 34 + .../models/spt/callbacks/IGameCallbacks.d.ts | 16 + .../spt/callbacks/IHandbookCallbacks.d.ts | 3 + .../spt/callbacks/IHealthCallbacks.d.ts | 13 + .../spt/callbacks/IHideoutCallbacks.d.ts | 23 + .../models/spt/callbacks/IHttpCallbacks.d.ts | 5 + .../spt/callbacks/IInraidCallbacks.d.ts | 14 + .../spt/callbacks/IInsuranceCallbacks.d.ts | 10 + .../spt/callbacks/IInventoryCallbacks.d.ts | 36 + .../spt/callbacks/IItemEventCallbacks.d.ts | 6 + .../spt/callbacks/ILauncherCallbacks.d.ts | 20 + .../spt/callbacks/ILocationCallbacks.d.ts | 8 + .../models/spt/callbacks/IMatchCallbacks.d.ts | 25 + .../models/spt/callbacks/IModCallbacks.d.ts | 6 + .../models/spt/callbacks/INoteCallbacks.d.ts | 8 + .../spt/callbacks/INotifierCallbacks.d.ts | 17 + .../spt/callbacks/IPresetBuildCallbacks.d.ts | 10 + .../spt/callbacks/IPresetCallbacks.d.ts | 3 + .../spt/callbacks/IProfileCallbacks.d.ts | 21 + .../models/spt/callbacks/IQuestCallbacks.d.ts | 19 + .../spt/callbacks/IRagfairCallbacks.d.ts | 21 + .../spt/callbacks/IRepairCallbacks.d.ts | 8 + .../models/spt/callbacks/ISaveCallbacks.d.ts | 4 + .../models/spt/callbacks/ITradeCallbacks.d.ts | 8 + .../spt/callbacks/ITraderCallbacks.d.ts | 11 + .../spt/callbacks/IWeatherCallbacks.d.ts | 5 + .../spt/callbacks/IWishlistCallbacks.d.ts | 7 + .../models/spt/config/IAirdropConfig.d.ts | 20 + .../types/models/spt/config/IBaseConfig.d.ts | 3 + .../types/models/spt/config/IBotConfig.d.ts | 114 ++ .../types/models/spt/config/ICoreConfig.d.ts | 7 + .../models/spt/config/IHealthConfig.d.ts | 14 + .../models/spt/config/IHideoutConfig.d.ts | 27 + .../types/models/spt/config/IHttpConfig.d.ts | 6 + .../models/spt/config/IInRaidConfig.d.ts | 21 + .../models/spt/config/IInsuranceConfig.d.ts | 7 + .../models/spt/config/IInventoryConfig.d.ts | 5 + .../models/spt/config/ILocationConfig.d.ts | 24 + .../types/models/spt/config/IMatchConfig.d.ts | 5 + .../types/models/spt/config/IQuestConfig.d.ts | 77 ++ .../models/spt/config/IRagfairConfig.d.ts | 59 + .../models/spt/config/IRepairConfig.d.ts | 5 + .../models/spt/config/ITraderConfig.d.ts | 15 + .../models/spt/config/IWeatherConfig.d.ts | 21 + .../spt/controllers/IBotController.d.ts | 13 + .../models/spt/generators/IBotGenerator.d.ts | 10 + .../spt/generators/ILocationGenerator.d.ts | 6 + .../spt/generators/IPMCLootGenerator.d.ts | 4 + .../generators/IRagfairAssortGenerator.d.ts | 4 + .../generators/IRagfairOfferGenerator.d.ts | 6 + .../types/models/spt/helpers/Traders.d.ts | 10 + .../dist/types/models/spt/mod/IMod.d.ts | 10 + .../dist/types/models/spt/mod/IModLoader.d.ts | 7 + .../models/spt/mod/IPackageJsonData.d.ts | 11 + .../spt/ragfair/IRagfairServerPrices.d.ts | 4 + .../models/spt/server/IDatabaseTables.d.ts | 51 + .../types/models/spt/server/IHttpServer.d.ts | 12 + .../types/models/spt/server/ILocaleBase.d.ts | 61 + .../types/models/spt/server/ILocations.d.ts | 26 + .../types/models/spt/server/IServerBase.d.ts | 4 + .../models/spt/server/ISettingsBase.d.ts | 43 + .../types/models/spt/utils/IAsyncQueue.d.ts | 4 + .../dist/types/models/spt/utils/ICommand.d.ts | 4 + .../dist/types/models/spt/utils/ILogger.d.ts | 10 + .../models/spt/utils/IUuidGenerator.d.ts | 3 + .../server/dist/types/routers/HttpRouter.d.ts | 16 + .../dist/types/routers/ImageRouter.d.ts | 13 + .../dist/types/routers/ItemEventRouter.d.ts | 17 + .../routers/dynamic/BotDynamicRouter.d.ts | 6 + .../routers/dynamic/BundleDynamicRouter.d.ts | 6 + .../dynamic/CustomizationDynamicRouter.d.ts | 6 + .../routers/dynamic/DataDynamicRouter.d.ts | 6 + .../routers/dynamic/HttpDynamicRouter.d.ts | 6 + .../routers/dynamic/InraidDynamicRouter.d.ts | 7 + .../dynamic/LocationDynamicRouter.d.ts | 7 + .../dynamic/NotifierDynamicRouter.d.ts | 6 + .../routers/dynamic/TraderDynamicRouter.d.ts | 6 + .../CustomizationItemEventRouter.d.ts | 10 + .../item_events/HealthItemEventRouter.d.ts | 10 + .../item_events/HideoutItemEventRouter.d.ts | 10 + .../item_events/InsuranceItemEventRouter.d.ts | 10 + .../item_events/InventoryItemEventRouter.d.ts | 10 + .../item_events/NoteItemEventRouter.d.ts | 10 + .../PresetBuildItemEventRouter.d.ts | 10 + .../item_events/QuestItemEventRouter.d.ts | 10 + .../item_events/RagfairItemEventRouter.d.ts | 10 + .../item_events/RepairItemEventRouter.d.ts | 10 + .../item_events/TradeItemEventRouter.d.ts | 10 + .../item_events/WishlistItemEventRouter.d.ts | 10 + .../save_load/HealthSaveLoadRouter.d.ts | 7 + .../save_load/InraidSaveLoadRouter.d.ts | 7 + .../save_load/InsuranceSaveLoadRouter.d.ts | 7 + .../save_load/ProfileSaveLoadRouter.d.ts | 7 + .../routers/serializers/BundleSerializer.d.ts | 11 + .../routers/serializers/ImageSerializer.d.ts | 9 + .../routers/serializers/NotifySerializer.d.ts | 11 + .../types/routers/static/BotStaticRouter.d.ts | 6 + .../routers/static/BundleStaticRouter.d.ts | 6 + .../static/CustomizationStaticRouter.d.ts | 6 + .../routers/static/DataStaticRouter.d.ts | 6 + .../routers/static/DialogStaticRouter.d.ts | 6 + .../routers/static/GameStaticRouter.d.ts | 6 + .../routers/static/HealthStaticRouter.d.ts | 6 + .../routers/static/InraidStaticRouter.d.ts | 6 + .../routers/static/InsuranceStaticRouter.d.ts | 6 + .../routers/static/ItemEventStaticRouter.d.ts | 6 + .../routers/static/LauncherStaticRouter.d.ts | 6 + .../routers/static/LocationStaticRouter.d.ts | 6 + .../routers/static/MatchStaticRouter.d.ts | 6 + .../routers/static/NotifierStaticRouter.d.ts | 6 + .../routers/static/PresetStaticRouter.d.ts | 6 + .../routers/static/ProfileStaticRouter.d.ts | 6 + .../routers/static/QuestStaticRouter.d.ts | 6 + .../routers/static/RagfairStaticRouter.d.ts | 6 + .../routers/static/TraderStaticRouter.d.ts | 6 + .../routers/static/WeatherStaticRouter.d.ts | 6 + .../dist/types/servers/ConfigServer.d.ts | 14 + .../dist/types/servers/DatabaseServer.d.ts | 6 + .../server/dist/types/servers/HttpServer.d.ts | 49 + .../dist/types/servers/RagfairServer.d.ts | 31 + .../server/dist/types/servers/SaveServer.d.ts | 28 + .../dist/types/services/FenceService.d.ts | 39 + .../dist/types/services/HashCacheService.d.ts | 19 + .../dist/types/services/InsuranceService.d.ts | 42 + .../types/services/MatchLocationService.d.ts | 8 + .../types/services/ModCompilerService.d.ts | 20 + .../types/services/NotificationService.d.ts | 21 + .../dist/types/services/PaymentService.d.ts | 49 + .../dist/types/services/PlayerService.d.ts | 22 + .../services/RagfairCategoriesService.d.ts | 10 + .../services/RagfairLinkedItemService.d.ts | 10 + .../types/services/RagfairOfferService.d.ts | 66 + .../types/services/RagfairPriceService.d.ts | 32 + .../services/RagfairRequiredItemsService.d.ts | 12 + .../types/services/TraderAssortService.d.ts | 6 + .../mod/dynamicRouter/DynamicRouterMod.d.ts | 6 + .../DynamicRouterModService.d.ts | 7 + .../services/mod/image/imageRouteService.d.ts | 6 + .../types/services/mod/onLoad/OnLoadMod.d.ts | 8 + .../services/mod/onLoad/OnLoadModService.d.ts | 6 + .../services/mod/onUpdate/OnUpdateMod.d.ts | 8 + .../mod/onUpdate/OnUpdateModService.d.ts | 6 + .../mod/staticRouter/StaticRouterMod.d.ts | 6 + .../staticRouter/StaticRouterModService.d.ts | 7 + .../src/server/dist/types/utils/App.d.ts | 14 + .../server/dist/types/utils/AyncQueue.d.ts | 7 + .../dist/types/utils/DatabaseImporter.d.ts | 18 + .../src/server/dist/types/utils/HashUtil.d.ts | 11 + .../dist/types/utils/HttpResponseUtil.d.ts | 16 + .../src/server/dist/types/utils/JsonUtil.d.ts | 25 + .../src/server/dist/types/utils/Logger.d.ts | 51 + .../src/server/dist/types/utils/MathUtil.d.ts | 53 + .../src/server/dist/types/utils/ObjectId.d.ts | 14 + .../server/dist/types/utils/RandomUtil.d.ts | 153 +++ .../src/server/dist/types/utils/TimeUtil.d.ts | 8 + .../dist/types/utils/UUidGenerator.d.ts | 4 + .../src/server/dist/types/utils/VFS.d.ts | 55 + .../server/dist/types/utils/Watermark.d.ts | 41 + .../types/utils/decorators/Singleton.d.ts | 4 + .../types/utils/decorators/constructor.d.ts | 4 + .../Project/src/server/hideoutarchitect.js | 68 - .../Project/src/server/mod.code-workspace | 12 + .../Project/src/server/package.json | 26 + .../res/icon_neededforhideout_small.png | Bin 0 -> 553 bytes .../Project/src/server/res/translations.json | 47 + .../src/server/src/hideoutarchitect.ts | 94 ++ .../server}/tsconfig.json | 8 +- .../Project/src/server/types/Program.d.ts | 4 + .../Project/src/server/types/TYPES.d.ts | 3 + .../Project/src/server/types/Utils.d.ts | 0 .../server/types/callbacks/BotCallbacks.d.ts | 15 + .../types/callbacks/BundleCallbacks.d.ts | 18 + .../callbacks/CustomizationCallbacks.d.ts | 23 + .../server/types/callbacks/DataCallbacks.d.ts | 32 + .../types/callbacks/DialogueCallbacks.d.ts | 45 + .../server/types/callbacks/GameCallbacks.d.ts | 24 + .../types/callbacks/HandbookCallbacks.d.ts | 8 + .../types/callbacks/HealthCallbacks.d.ts | 20 + .../types/callbacks/HideoutCallbacks.d.ts | 33 + .../server/types/callbacks/HttpCallbacks.d.ts | 9 + .../types/callbacks/InraidCallbacks.d.ts | 23 + .../types/callbacks/InsuranceCallbacks.d.ts | 24 + .../types/callbacks/InventoryCallbacks.d.ts | 39 + .../types/callbacks/ItemEventCallbacks.d.ts | 11 + .../types/callbacks/LauncherCallbacks.d.ts | 28 + .../types/callbacks/LocationCallbacks.d.ts | 14 + .../types/callbacks/MatchCallbacks.d.ts | 35 + .../server/types/callbacks/ModCallbacks.d.ts | 22 + .../server/types/callbacks/NoteCallbacks.d.ts | 11 + .../types/callbacks/NotifierCallbacks.d.ts | 24 + .../types/callbacks/PresetBuildCallbacks.d.ts | 15 + .../types/callbacks/PresetCallbacks.d.ts | 8 + .../types/callbacks/ProfileCallbacks.d.ts | 30 + .../types/callbacks/QuestCallbacks.d.ts | 26 + .../types/callbacks/RagfairCallbacks.d.ts | 39 + .../types/callbacks/RepairCallbacks.d.ts | 11 + .../server/types/callbacks/SaveCallbacks.d.ts | 9 + .../types/callbacks/TradeCallbacks.d.ts | 11 + .../types/callbacks/TraderCallbacks.d.ts | 18 + .../types/callbacks/WeatherCallbacks.d.ts | 10 + .../types/callbacks/WishlistCallbacks.d.ts | 10 + .../types/controllers/BotController.d.ts | 35 + .../controllers/CustomizationController.d.ts | 22 + .../types/controllers/DialogueController.d.ts | 25 + .../types/controllers/GameController.d.ts | 32 + .../types/controllers/HandbookController.d.ts | 8 + .../types/controllers/HealthController.d.ts | 25 + .../types/controllers/HideoutController.d.ts | 57 + .../types/controllers/InraidController.d.ts | 31 + .../controllers/InsuranceController.d.ts | 38 + .../controllers/InventoryController.d.ts | 107 ++ .../types/controllers/LauncherController.d.ts | 28 + .../types/controllers/LocationController.d.ts | 18 + .../types/controllers/MatchController.d.ts | 30 + .../types/controllers/NoteController.d.ts | 12 + .../types/controllers/NotifierController.d.ts | 22 + .../controllers/PresetBuildController.d.ts | 18 + .../types/controllers/PresetController.d.ts | 8 + .../types/controllers/ProfileController.d.ts | 34 + .../types/controllers/QuestController.d.ts | 38 + .../types/controllers/RagfairController.d.ts | 70 + .../types/controllers/RepairController.d.ts | 41 + .../RepeatableQuestController.d.ts | 217 +++ .../types/controllers/TradeController.d.ts | 21 + .../types/controllers/TraderController.d.ts | 26 + .../types/controllers/WeatherController.d.ts | 11 + .../types/controllers/WishlistController.d.ts | 10 + .../src/server/types/di/Container.d.ts | 14 + .../Project/src/server/types/di/OnLoad.d.ts | 4 + .../src/server/types/di/OnLoadOnUpdate.d.ts | 7 + .../Project/src/server/types/di/OnUpdate.d.ts | 4 + .../Project/src/server/types/di/Router.d.ts | 40 + .../src/server/types/di/Serializer.d.ts | 5 + .../server/types/generators/BotGenerator.d.ts | 46 + .../generators/BotInventoryGenerator.d.ts | 24 + .../types/generators/BotLootGenerator.d.ts | 29 + .../types/generators/BotWeaponGenerator.d.ts | 46 + .../types/generators/LocationGenerator.d.ts | 46 + .../types/generators/PMCLootGenerator.d.ts | 15 + .../generators/RagfairAssortGenerator.d.ts | 25 + .../generators/RagfairOfferGenerator.d.ts | 60 + .../types/generators/WeatherGenerator.d.ts | 20 + .../server/types/helpers/AssortHelper.d.ts | 36 + .../types/helpers/BotGeneratorHelper.d.ts | 95 ++ .../src/server/types/helpers/BotHelper.d.ts | 44 + .../server/types/helpers/ContainerHelper.d.ts | 12 + .../server/types/helpers/DialogueHelper.d.ts | 21 + .../types/helpers/DurabilityLimitsHelper.d.ts | 26 + .../types/helpers/ExtendedProfileHelper.d.ts | 22 + .../server/types/helpers/GameEventHelper.d.ts | 9 + .../server/types/helpers/HandbookHelper.d.ts | 33 + .../server/types/helpers/HealthHelper.d.ts | 27 + .../server/types/helpers/HideoutHelper.d.ts | 68 + .../types/helpers/HttpServerHelper.d.ts | 23 + .../server/types/helpers/InRaidHelper.d.ts | 33 + .../server/types/helpers/InventoryHelper.d.ts | 85 ++ .../src/server/types/helpers/ItemHelper.d.ts | 147 +++ .../types/helpers/NotificationSendHelper.d.ts | 12 + .../server/types/helpers/NotifierHelper.d.ts | 17 + .../server/types/helpers/PaymentHelper.d.ts | 14 + .../server/types/helpers/PresetHelper.d.ts | 14 + .../server/types/helpers/ProfileHelper.d.ts | 33 + .../types/helpers/QuestConditionHelper.d.ts | 7 + .../src/server/types/helpers/QuestHelper.d.ts | 69 + .../server/types/helpers/RagfairHelper.d.ts | 44 + .../types/helpers/RagfairOfferHelper.d.ts | 52 + .../types/helpers/RagfairSellHelper.d.ts | 16 + .../types/helpers/RagfairServerHelper.d.ts | 46 + .../types/helpers/RagfairSortHelper.d.ts | 12 + .../types/helpers/RagfairTaxHelper.d.ts | 16 + .../server/types/helpers/RepairHelper.d.ts | 22 + .../types/helpers/SecureContainerHelper.d.ts | 13 + .../src/server/types/helpers/TradeHelper.d.ts | 44 + .../types/helpers/TraderAssortHelper.d.ts | 42 + .../server/types/helpers/TraderHelper.d.ts | 53 + .../server/types/helpers/UtilityHelper.d.ts | 3 + .../types/helpers/WeightedRandomHelper.d.ts | 28 + .../server/types/ide/BleedingEdgeEntry.d.ts | 1 + .../src/server/types/ide/Compiler.d.ts | 1 + .../src/server/types/ide/DebugEntry.d.ts | 1 + .../src/server/types/ide/ReleaseEntry.d.ts | 1 + .../src/server/types/ide/TestEntry.d.ts | 1 + .../server/types/loaders/BundleLoader.d.ts | 22 + .../types/loaders/DelayedModLoader.d.ts | 21 + .../types/loaders/InitialModLoader.d.ts | 64 + .../eft/bot/IGenerateBotsRequestData.d.ts | 8 + .../models/eft/common/IEmptyRequestData.d.ts | 2 + .../types/models/eft/common/IGlobals.d.ts | 1176 +++++++++++++++++ .../types/models/eft/common/ILocation.d.ts | 6 + .../models/eft/common/ILocationBase.d.ts | 198 +++ .../ILocationsSourceDestinationBase.d.ts | 9 + .../types/models/eft/common/ILooseLoot.d.ts | 45 + .../models/eft/common/IMetricsTableData.d.ts | 7 + .../types/models/eft/common/IPmcData.d.ts | 341 +++++ .../models/eft/common/MemberCategory.d.ts | 13 + .../request/IBaseInteractionRequestData.d.ts | 9 + .../models/eft/common/tables/IBotBase.d.ts | 101 ++ .../models/eft/common/tables/IBotCore.d.ts | 133 ++ .../models/eft/common/tables/IBotType.d.ts | 176 +++ .../eft/common/tables/ICustomizationItem.d.ts | 33 + .../eft/common/tables/IHandbookBase.d.ts | 16 + .../types/models/eft/common/tables/IItem.d.ts | 108 ++ .../eft/common/tables/ILocationsBase.d.ts | 10 + .../models/eft/common/tables/ILootBase.d.ts | 64 + .../models/eft/common/tables/IQuest.d.ts | 110 ++ .../eft/common/tables/IRepeatableQuests.d.ts | 219 +++ .../eft/common/tables/ITemplateItem.d.ts | 401 ++++++ .../models/eft/common/tables/ITrader.d.ts | 90 ++ .../IBuyClothingRequestData.d.ts | 10 + .../IWearClothingRequestData.d.ts | 4 + .../models/eft/dialog/IFriendRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsResponse.d.ts | 6 + .../dialog/IGetChatServerListRequestData.d.ts | 3 + .../dialog/IGetFriendListDataResponse.d.ts | 16 + .../dialog/IGetMailDialogInfoRequestData.d.ts | 3 + .../dialog/IGetMailDialogListRequestData.d.ts | 4 + .../dialog/IGetMailDialogViewRequestData.d.ts | 7 + .../IGetMailDialogViewResponseData.d.ts | 7 + .../eft/dialog/IPinDialogRequestData.d.ts | 3 + .../eft/dialog/IRemoveDialogRequestData.d.ts | 3 + .../eft/dialog/ISendMessageRequest.d.ts | 7 + .../eft/dialog/ISetDialogReadRequestData.d.ts | 3 + .../models/eft/game/IGameConfigResponse.d.ts | 19 + .../eft/game/IGameEmptyCrcRequestData.d.ts | 3 + .../eft/game/IVersionValidateRequestData.d.ts | 11 + .../health/IHealthTreatmentRequestData.d.ts | 29 + .../eft/health/IOffraidEatRequestData.d.ts | 7 + .../eft/health/IOffraidHealRequestData.d.ts | 18 + .../eft/health/ISyncHealthRequestData.d.ts | 21 + .../models/eft/hideout/HideoutAreasEnum.d.ts | 25 + .../HideoutUpgradeCompleteRequestData.d.ts | 5 + .../models/eft/hideout/IHideoutArea.d.ts | 40 + ...utContinousProductionStartRequestData.d.ts | 5 + .../eft/hideout/IHideoutProduction.d.ts | 20 + .../hideout/IHideoutPutItemInRequestData.d.ts | 10 + .../models/eft/hideout/IHideoutScavCase.d.ts | 21 + .../IHideoutScavCaseStartRequestData.d.ts | 15 + .../eft/hideout/IHideoutSettingsBase.d.ts | 6 + ...deoutSingleProductionStartRequestData.d.ts | 10 + .../IHideoutTakeItemOutRequestData.d.ts | 6 + .../IHideoutTakeProductionRequestData.d.ts | 5 + .../IHideoutToggleAreaRequestData.d.ts | 6 + .../IHideoutUpgradeCompleteRequestData.d.ts | 5 + .../hideout/IHideoutUpgradeRequestData.d.ts | 10 + .../httpResponse/IGetBodyResponseData.d.ts | 5 + .../eft/httpResponse/INullResponseData.d.ts | 5 + .../inRaid/IRegisterPlayerRequestData.d.ts | 5 + .../eft/inRaid/ISaveProgressRequestData.d.ts | 8 + .../IGetInsuranceCostRequestData.d.ts | 4 + .../eft/insurance/IInsureRequestData.d.ts | 6 + .../eft/inventory/IAddItemRequestData.d.ts | 4 + .../inventory/IInventoryAddRequestData.d.ts | 6 + .../IInventoryBaseActionRequestData.d.ts | 27 + .../inventory/IInventoryBindRequestData.d.ts | 6 + .../IInventoryCreateMarkerRequestData.d.ts | 12 + .../IInventoryDeleteMarkerRequestData.d.ts | 7 + .../IInventoryEditMarkerRequestData.d.ts | 14 + .../IInventoryExamineRequestData.d.ts | 10 + .../inventory/IInventoryFoldRequestData.d.ts | 6 + .../inventory/IInventoryMergeRequestData.d.ts | 6 + .../inventory/IInventoryMoveRequestData.d.ts | 6 + ...IInventoryReadEncyclopediaRequestData.d.ts | 5 + .../IInventoryRemoveRequestData.d.ts | 5 + .../inventory/IInventorySortRequestData.d.ts | 20 + .../inventory/IInventorySplitRequestData.d.ts | 7 + .../inventory/IInventorySwapRequestData.d.ts | 11 + .../inventory/IInventoryTagRequestData.d.ts | 7 + .../IInventoryToggleRequestData.d.ts | 6 + .../IInventoryTransferRequestData.d.ts | 7 + .../IEmptyItemEventRouterResponse.d.ts | 4 + .../eft/itemEvent/IItemEventRouterBase.d.ts | 67 + .../itemEvent/IItemEventRouterRequest.d.ts | 21 + .../itemEvent/IItemEventRouterResponse.d.ts | 3 + .../eft/launcher/IChangeRequestData.d.ts | 4 + .../launcher/IGetMiniProfileRequestData.d.ts | 4 + .../eft/launcher/ILoginRequestData.d.ts | 4 + .../models/eft/launcher/IMiniProfile.d.ts | 14 + .../models/eft/launcher/IRegisterData.d.ts | 4 + .../eft/launcher/IRemoveProfileData.d.ts | 2 + .../eft/location/IGetLocationRequestData.d.ts | 5 + .../eft/match/IEndOfflineRaidRequestData.d.ts | 6 + .../eft/match/IGetProfileRequestData.d.ts | 3 + .../match/IStartOffineRaidRequestData.d.ts | 27 + .../models/eft/notes/INoteActionData.d.ts | 10 + .../types/models/eft/notifier/INotifier.d.ts | 14 + .../notifier/ISelectProfileRequestData.d.ts | 3 + ...IPlayerIncrementSkillLevelRequestData.d.ts | 21 + .../IPresetBuildActionRequestData.d.ts | 25 + .../types/models/eft/profile/IAkiProfile.d.ts | 167 +++ .../IProfileChangeNicknameRequestData.d.ts | 3 + .../IProfileChangeVoiceRequestData.d.ts | 3 + .../profile/IProfileCreateRequestData.d.ts | 6 + .../eft/profile/ISearchFriendRequestData.d.ts | 3 + .../eft/profile/ISearchFriendResponse.d.ts | 9 + .../profile/IValidateNicknameRequestData.d.ts | 3 + .../eft/quests/IAcceptQuestRequestData.d.ts | 5 + .../eft/quests/ICompleteQuestRequestData.d.ts | 5 + .../eft/quests/IHandoverQuestRequestData.d.ts | 10 + .../eft/quests/IListQuestsRequestData.d.ts | 3 + .../quests/IRepeatableQuestChangeRequest.d.ts | 4 + .../eft/ragfair/IAddOfferRequestData.d.ts | 13 + .../eft/ragfair/IExtendOfferRequestData.d.ts | 4 + .../eft/ragfair/IGetItemPriceResult.d.ts | 5 + .../ragfair/IGetMarketPriceRequestData.d.ts | 3 + .../models/eft/ragfair/IGetOffersResult.d.ts | 7 + .../models/eft/ragfair/IRagfairOffer.d.ts | 42 + .../eft/ragfair/IRemoveOfferRequestData.d.ts | 4 + .../eft/ragfair/ISearchRequestData.d.ts | 32 + .../repair/IBaseRepairActionDataRequest.d.ts | 3 + .../eft/repair/IRepairActionDataRequest.d.ts | 10 + .../ITraderRepairActionDataRequest.d.ts | 10 + .../trade/IProcessBaseTradeRequestData.d.ts | 5 + .../trade/IProcessBuyTradeRequestData.d.ts | 14 + .../IProcessRagfairTradeRequestData.d.ts | 13 + .../trade/IProcessSellTradeRequestData.d.ts | 12 + .../models/eft/weather/IWeatherData.d.ts | 20 + .../eft/wishlist/IWishlistActionData.d.ts | 4 + .../types/models/enums/BaseClasses.d.ts | 84 ++ .../types/models/enums/ConfigTypes.d.ts | 18 + .../types/models/enums/ELocationName.d.ts | 11 + .../types/models/enums/EquipmentSlots.d.ts | 16 + .../types/models/enums/HideoutAreas.d.ts | 25 + .../types/models/enums/MemberCategory.d.ts | 13 + .../types/models/enums/MessageType.d.ts | 16 + .../src/server/types/models/enums/Money.d.ts | 5 + .../server/types/models/enums/Traders.d.ts | 10 + .../src/server/types/models/external/mod.d.ts | 5 + .../types/models/external/tsyringe.d.ts | 2 + .../types/models/spt/bindings/Route.d.ts | 3 + .../models/spt/callbacks/IBotCallbacks.d.ts | 10 + .../spt/callbacks/IBundleCallbacks.d.ts | 5 + .../callbacks/ICustomizationCallbacks.d.ts | 12 + .../models/spt/callbacks/IDataCallbacks.d.ts | 26 + .../spt/callbacks/IDialogueCallbacks.d.ts | 34 + .../models/spt/callbacks/IGameCallbacks.d.ts | 16 + .../spt/callbacks/IHandbookCallbacks.d.ts | 3 + .../spt/callbacks/IHealthCallbacks.d.ts | 13 + .../spt/callbacks/IHideoutCallbacks.d.ts | 23 + .../models/spt/callbacks/IHttpCallbacks.d.ts | 5 + .../spt/callbacks/IInraidCallbacks.d.ts | 14 + .../spt/callbacks/IInsuranceCallbacks.d.ts | 10 + .../spt/callbacks/IInventoryCallbacks.d.ts | 36 + .../spt/callbacks/IItemEventCallbacks.d.ts | 6 + .../spt/callbacks/ILauncherCallbacks.d.ts | 20 + .../spt/callbacks/ILocationCallbacks.d.ts | 8 + .../models/spt/callbacks/IMatchCallbacks.d.ts | 25 + .../models/spt/callbacks/IModCallbacks.d.ts | 6 + .../models/spt/callbacks/INoteCallbacks.d.ts | 8 + .../spt/callbacks/INotifierCallbacks.d.ts | 17 + .../spt/callbacks/IPresetBuildCallbacks.d.ts | 10 + .../spt/callbacks/IPresetCallbacks.d.ts | 3 + .../spt/callbacks/IProfileCallbacks.d.ts | 21 + .../models/spt/callbacks/IQuestCallbacks.d.ts | 19 + .../spt/callbacks/IRagfairCallbacks.d.ts | 21 + .../spt/callbacks/IRepairCallbacks.d.ts | 8 + .../models/spt/callbacks/ISaveCallbacks.d.ts | 4 + .../models/spt/callbacks/ITradeCallbacks.d.ts | 8 + .../spt/callbacks/ITraderCallbacks.d.ts | 11 + .../spt/callbacks/IWeatherCallbacks.d.ts | 5 + .../spt/callbacks/IWishlistCallbacks.d.ts | 7 + .../models/spt/config/IAirdropConfig.d.ts | 20 + .../types/models/spt/config/IBaseConfig.d.ts | 3 + .../types/models/spt/config/IBotConfig.d.ts | 114 ++ .../types/models/spt/config/ICoreConfig.d.ts | 7 + .../models/spt/config/IHealthConfig.d.ts | 14 + .../models/spt/config/IHideoutConfig.d.ts | 27 + .../types/models/spt/config/IHttpConfig.d.ts | 6 + .../models/spt/config/IInRaidConfig.d.ts | 21 + .../models/spt/config/IInsuranceConfig.d.ts | 7 + .../models/spt/config/IInventoryConfig.d.ts | 5 + .../models/spt/config/ILocationConfig.d.ts | 24 + .../types/models/spt/config/IMatchConfig.d.ts | 5 + .../types/models/spt/config/IQuestConfig.d.ts | 77 ++ .../models/spt/config/IRagfairConfig.d.ts | 59 + .../models/spt/config/IRepairConfig.d.ts | 5 + .../models/spt/config/ITraderConfig.d.ts | 15 + .../models/spt/config/IWeatherConfig.d.ts | 21 + .../spt/controllers/IBotController.d.ts | 13 + .../models/spt/generators/IBotGenerator.d.ts | 10 + .../spt/generators/ILocationGenerator.d.ts | 6 + .../spt/generators/IPMCLootGenerator.d.ts | 4 + .../generators/IRagfairAssortGenerator.d.ts | 4 + .../generators/IRagfairOfferGenerator.d.ts | 6 + .../types/models/spt/helpers/Traders.d.ts | 10 + .../src/server/types/models/spt/mod/IMod.d.ts | 10 + .../types/models/spt/mod/IModLoader.d.ts | 7 + .../models/spt/mod/IPackageJsonData.d.ts | 11 + .../spt/ragfair/IRagfairServerPrices.d.ts | 4 + .../models/spt/server/IDatabaseTables.d.ts | 51 + .../types/models/spt/server/IHttpServer.d.ts | 12 + .../types/models/spt/server/ILocaleBase.d.ts | 61 + .../types/models/spt/server/ILocations.d.ts | 26 + .../types/models/spt/server/IServerBase.d.ts | 4 + .../models/spt/server/ISettingsBase.d.ts | 43 + .../types/models/spt/utils/IAsyncQueue.d.ts | 4 + .../types/models/spt/utils/ICommand.d.ts | 4 + .../types/models/spt/utils/ILogger.d.ts | 10 + .../models/spt/utils/IUuidGenerator.d.ts | 3 + .../src/server/types/routers/HttpRouter.d.ts | 16 + .../src/server/types/routers/ImageRouter.d.ts | 13 + .../server/types/routers/ItemEventRouter.d.ts | 17 + .../routers/dynamic/BotDynamicRouter.d.ts | 6 + .../routers/dynamic/BundleDynamicRouter.d.ts | 6 + .../dynamic/CustomizationDynamicRouter.d.ts | 6 + .../routers/dynamic/DataDynamicRouter.d.ts | 6 + .../routers/dynamic/HttpDynamicRouter.d.ts | 6 + .../routers/dynamic/InraidDynamicRouter.d.ts | 7 + .../dynamic/LocationDynamicRouter.d.ts | 7 + .../dynamic/NotifierDynamicRouter.d.ts | 6 + .../routers/dynamic/TraderDynamicRouter.d.ts | 6 + .../CustomizationItemEventRouter.d.ts | 10 + .../item_events/HealthItemEventRouter.d.ts | 10 + .../item_events/HideoutItemEventRouter.d.ts | 10 + .../item_events/InsuranceItemEventRouter.d.ts | 10 + .../item_events/InventoryItemEventRouter.d.ts | 10 + .../item_events/NoteItemEventRouter.d.ts | 10 + .../PresetBuildItemEventRouter.d.ts | 10 + .../item_events/QuestItemEventRouter.d.ts | 10 + .../item_events/RagfairItemEventRouter.d.ts | 10 + .../item_events/RepairItemEventRouter.d.ts | 10 + .../item_events/TradeItemEventRouter.d.ts | 10 + .../item_events/WishlistItemEventRouter.d.ts | 10 + .../save_load/HealthSaveLoadRouter.d.ts | 7 + .../save_load/InraidSaveLoadRouter.d.ts | 7 + .../save_load/InsuranceSaveLoadRouter.d.ts | 7 + .../save_load/ProfileSaveLoadRouter.d.ts | 7 + .../routers/serializers/BundleSerializer.d.ts | 11 + .../routers/serializers/ImageSerializer.d.ts | 9 + .../routers/serializers/NotifySerializer.d.ts | 11 + .../types/routers/static/BotStaticRouter.d.ts | 6 + .../routers/static/BundleStaticRouter.d.ts | 6 + .../static/CustomizationStaticRouter.d.ts | 6 + .../routers/static/DataStaticRouter.d.ts | 6 + .../routers/static/DialogStaticRouter.d.ts | 6 + .../routers/static/GameStaticRouter.d.ts | 6 + .../routers/static/HealthStaticRouter.d.ts | 6 + .../routers/static/InraidStaticRouter.d.ts | 6 + .../routers/static/InsuranceStaticRouter.d.ts | 6 + .../routers/static/ItemEventStaticRouter.d.ts | 6 + .../routers/static/LauncherStaticRouter.d.ts | 6 + .../routers/static/LocationStaticRouter.d.ts | 6 + .../routers/static/MatchStaticRouter.d.ts | 6 + .../routers/static/NotifierStaticRouter.d.ts | 6 + .../routers/static/PresetStaticRouter.d.ts | 6 + .../routers/static/ProfileStaticRouter.d.ts | 6 + .../routers/static/QuestStaticRouter.d.ts | 6 + .../routers/static/RagfairStaticRouter.d.ts | 6 + .../routers/static/TraderStaticRouter.d.ts | 6 + .../routers/static/WeatherStaticRouter.d.ts | 6 + .../server/types/servers/ConfigServer.d.ts | 14 + .../server/types/servers/DatabaseServer.d.ts | 6 + .../src/server/types/servers/HttpServer.d.ts | 49 + .../server/types/servers/RagfairServer.d.ts | 31 + .../src/server/types/servers/SaveServer.d.ts | 28 + .../server/types/services/FenceService.d.ts | 39 + .../types/services/HashCacheService.d.ts | 19 + .../types/services/InsuranceService.d.ts | 42 + .../types/services/MatchLocationService.d.ts | 8 + .../types/services/ModCompilerService.d.ts | 20 + .../types/services/NotificationService.d.ts | 21 + .../server/types/services/PaymentService.d.ts | 49 + .../server/types/services/PlayerService.d.ts | 22 + .../services/RagfairCategoriesService.d.ts | 10 + .../services/RagfairLinkedItemService.d.ts | 10 + .../types/services/RagfairOfferService.d.ts | 66 + .../types/services/RagfairPriceService.d.ts | 32 + .../services/RagfairRequiredItemsService.d.ts | 12 + .../types/services/TraderAssortService.d.ts | 6 + .../mod/dynamicRouter/DynamicRouterMod.d.ts | 6 + .../DynamicRouterModService.d.ts | 7 + .../services/mod/image/imageRouteService.d.ts | 6 + .../types/services/mod/onLoad/OnLoadMod.d.ts | 8 + .../services/mod/onLoad/OnLoadModService.d.ts | 6 + .../services/mod/onUpdate/OnUpdateMod.d.ts | 8 + .../mod/onUpdate/OnUpdateModService.d.ts | 6 + .../mod/staticRouter/StaticRouterMod.d.ts | 6 + .../staticRouter/StaticRouterModService.d.ts | 7 + .../Project/src/server/types/utils/App.d.ts | 14 + .../src/server/types/utils/AyncQueue.d.ts | 7 + .../server/types/utils/DatabaseImporter.d.ts | 18 + .../src/server/types/utils/HashUtil.d.ts | 11 + .../server/types/utils/HttpResponseUtil.d.ts | 16 + .../src/server/types/utils/JsonUtil.d.ts | 25 + .../src/server/types/utils/Logger.d.ts | 51 + .../src/server/types/utils/MathUtil.d.ts | 53 + .../src/server/types/utils/ObjectId.d.ts | 14 + .../src/server/types/utils/RandomUtil.d.ts | 153 +++ .../src/server/types/utils/TimeUtil.d.ts | 8 + .../src/server/types/utils/UUidGenerator.d.ts | 4 + .../Project/src/server/types/utils/VFS.d.ts | 55 + .../src/server/types/utils/Watermark.d.ts | 41 + .../types/utils/decorators/Singleton.d.ts | 4 + .../types/utils/decorators/constructor.d.ts | 4 + .../bepInEx/plugins/Faupi-MunitionsExpert.dll | Bin 14336 -> 14336 bytes .../Faupi-MunitionsExpert 1.4.1/package.json | 23 +- .../src/MunitionsExpert.ts | 62 +- .../types/callbacks/BotCallbacks.d.ts | 4 +- .../types/callbacks/BundleCallbacks.d.ts | 13 +- .../callbacks/CustomizationCallbacks.d.ts | 6 +- .../types/callbacks/DataCallbacks.d.ts | 4 +- .../types/callbacks/DialogueCallbacks.d.ts | 8 +- .../types/callbacks/GameCallbacks.d.ts | 6 +- .../types/callbacks/HandbookCallbacks.d.ts | 2 +- .../types/callbacks/HealthCallbacks.d.ts | 6 +- .../types/callbacks/HideoutCallbacks.d.ts | 7 +- .../types/callbacks/HttpCallbacks.d.ts | 2 +- .../types/callbacks/InraidCallbacks.d.ts | 12 +- .../types/callbacks/InsuranceCallbacks.d.ts | 11 +- .../types/callbacks/InventoryCallbacks.d.ts | 2 +- .../types/callbacks/ItemEventCallbacks.d.ts | 4 +- .../types/callbacks/LauncherCallbacks.d.ts | 8 +- .../types/callbacks/LocationCallbacks.d.ts | 4 +- .../types/callbacks/MatchCallbacks.d.ts | 8 +- .../types/callbacks/ModCallbacks.d.ts | 13 +- .../types/callbacks/NoteCallbacks.d.ts | 2 +- .../types/callbacks/NotifierCallbacks.d.ts | 8 +- .../types/callbacks/PresetBuildCallbacks.d.ts | 4 +- .../types/callbacks/PresetCallbacks.d.ts | 2 +- .../types/callbacks/ProfileCallbacks.d.ts | 6 +- .../types/callbacks/QuestCallbacks.d.ts | 6 +- .../types/callbacks/RagfairCallbacks.d.ts | 17 +- .../types/callbacks/RepairCallbacks.d.ts | 2 +- .../types/callbacks/SaveCallbacks.d.ts | 2 +- .../types/callbacks/TradeCallbacks.d.ts | 2 +- .../types/callbacks/TraderCallbacks.d.ts | 4 +- .../types/callbacks/WeatherCallbacks.d.ts | 4 +- .../types/callbacks/WishlistCallbacks.d.ts | 2 +- .../types/controllers/BotController.d.ts | 37 +- .../controllers/CustomizationController.d.ts | 22 +- .../types/controllers/DialogueController.d.ts | 17 +- .../types/controllers/GameController.d.ts | 28 +- .../types/controllers/HandbookController.d.ts | 6 +- .../types/controllers/HealthController.d.ts | 12 +- .../types/controllers/HideoutController.d.ts | 71 +- .../types/controllers/InraidController.d.ts | 41 +- .../controllers/InsuranceController.d.ts | 45 +- .../controllers/InventoryController.d.ts | 18 +- .../types/controllers/LauncherController.d.ts | 29 +- .../types/controllers/LocationController.d.ts | 14 +- .../types/controllers/MatchController.d.ts | 18 +- .../types/controllers/NoteController.d.ts | 4 +- .../types/controllers/NotifierController.d.ts | 10 +- .../controllers/PresetBuildController.d.ts | 14 +- .../types/controllers/PresetController.d.ts | 4 +- .../types/controllers/ProfileController.d.ts | 24 +- .../types/controllers/QuestController.d.ts | 41 +- .../types/controllers/RagfairController.d.ts | 49 +- .../types/controllers/RepairController.d.ts | 37 +- .../RepeatableQuestController.d.ts | 35 +- .../types/controllers/TradeController.d.ts | 10 +- .../types/controllers/TraderController.d.ts | 16 +- .../types/controllers/WeatherController.d.ts | 9 +- .../types/controllers/WishlistController.d.ts | 2 +- .../types/generators/BotGenerator.d.ts | 70 +- .../generators/BotInventoryGenerator.d.ts | 22 +- .../types/generators/BotLootGenerator.d.ts | 34 +- .../types/generators/BotWeaponGenerator.d.ts | 26 +- .../types/generators/LocationGenerator.d.ts | 58 +- .../types/generators/PMCLootGenerator.d.ts | 13 +- .../generators/RagfairAssortGenerator.d.ts | 26 +- .../generators/RagfairOfferGenerator.d.ts | 75 +- .../types/generators/WeatherGenerator.d.ts | 19 +- .../types/helpers/AssortHelper.d.ts | 32 +- .../types/helpers/BotGeneratorHelper.d.ts | 94 +- .../types/helpers/BotHelper.d.ts | 38 +- .../types/helpers/ContainerHelper.d.ts | 2 +- .../types/helpers/DialogueHelper.d.ts | 19 +- .../types/helpers/DurabilityLimitsHelper.d.ts | 31 +- .../types/helpers/ExtendedProfileHelper.d.ts | 18 +- .../types/helpers/GameEventHelper.d.ts | 2 +- .../types/helpers/HandbookHelper.d.ts | 2 +- .../types/helpers/HealthHelper.d.ts | 30 +- .../types/helpers/HideoutHelper.d.ts | 58 +- .../types/helpers/HttpServerHelper.d.ts | 17 +- .../types/helpers/InRaidHelper.d.ts | 16 +- .../types/helpers/InventoryHelper.d.ts | 48 +- .../types/helpers/ItemHelper.d.ts | 103 +- .../types/helpers/NotificationSendHelper.d.ts | 4 +- .../types/helpers/NotifierHelper.d.ts | 4 +- .../types/helpers/PresetHelper.d.ts | 4 +- .../types/helpers/ProfileHelper.d.ts | 4 +- .../types/helpers/QuestConditionHelper.d.ts | 2 +- .../types/helpers/QuestHelper.d.ts | 33 +- .../types/helpers/RagfairHelper.d.ts | 23 +- .../types/helpers/RagfairOfferHelper.d.ts | 47 +- .../types/helpers/RagfairSellHelper.d.ts | 11 +- .../types/helpers/RagfairServerHelper.d.ts | 35 +- .../types/helpers/RagfairSortHelper.d.ts | 12 +- .../types/helpers/RagfairTaxHelper.d.ts | 11 +- .../types/helpers/RepairHelper.d.ts | 22 +- .../types/helpers/SecureContainerHelper.d.ts | 2 +- .../types/helpers/TradeHelper.d.ts | 37 +- .../types/helpers/TraderAssortHelper.d.ts | 41 +- .../types/helpers/TraderHelper.d.ts | 54 +- .../types/ide/BleedingEdgeEntry.d.ts | 1 + .../types/loaders/BundleLoader.d.ts | 12 +- .../types/loaders/DelayedModLoader.d.ts | 17 +- .../types/loaders/InitialModLoader.d.ts | 71 +- .../models/eft/common/ILocationBase.d.ts | 9 + .../types/models/eft/common/IPmcData.d.ts | 6 +- .../models/eft/common/tables/IBotType.d.ts | 2 + .../models/eft/common/tables/IQuest.d.ts | 36 +- .../dialog/IGetFriendListDataResponse.d.ts | 2 +- .../dialog/IGetMailDialogViewRequestData.d.ts | 2 +- .../eft/dialog/ISendMessageRequest.d.ts | 2 +- .../types/models/eft/profile/IAkiProfile.d.ts | 21 +- .../models/eft/ragfair/IRagfairOffer.d.ts | 2 +- .../types/models/enums/BaseClasses.d.ts | 84 ++ .../types/models/enums/ConfigTypes.d.ts | 18 + .../types/models/enums/ELocationName.d.ts | 11 + .../types/models/enums/EquipmentSlots.d.ts | 16 + .../types/models/enums/HideoutAreas.d.ts | 25 + .../types/models/enums/MemberCategory.d.ts | 13 + .../types/models/enums/MessageType.d.ts | 16 + .../types/models/enums/Money.d.ts | 5 + .../types/models/enums/Traders.d.ts | 10 + .../types/models/spt/config/IBotConfig.d.ts | 2 + .../types/models/spt/config/IQuestConfig.d.ts | 12 +- .../types/models/spt/helpers/Traders.d.ts | 2 +- .../types/models/spt/mod/IMod.d.ts | 2 +- .../types/models/spt/mod/IModLoader.d.ts | 1 - .../types/models/spt/server/IHttpServer.d.ts | 1 + .../types/models/spt/server/ILocaleBase.d.ts | 2 +- .../types/routers/HttpRouter.d.ts | 15 +- .../types/routers/ImageRouter.d.ts | 9 +- .../types/routers/ItemEventRouter.d.ts | 12 +- .../routers/dynamic/BotDynamicRouter.d.ts | 2 +- .../routers/dynamic/BundleDynamicRouter.d.ts | 2 +- .../dynamic/CustomizationDynamicRouter.d.ts | 2 +- .../routers/dynamic/DataDynamicRouter.d.ts | 2 +- .../routers/dynamic/HttpDynamicRouter.d.ts | 2 +- .../routers/dynamic/InraidDynamicRouter.d.ts | 2 +- .../dynamic/LocationDynamicRouter.d.ts | 2 +- .../dynamic/NotifierDynamicRouter.d.ts | 2 +- .../routers/dynamic/TraderDynamicRouter.d.ts | 2 +- .../CustomizationItemEventRouter.d.ts | 2 +- .../item_events/HealthItemEventRouter.d.ts | 2 +- .../item_events/HideoutItemEventRouter.d.ts | 2 +- .../item_events/InsuranceItemEventRouter.d.ts | 2 +- .../item_events/InventoryItemEventRouter.d.ts | 2 +- .../item_events/NoteItemEventRouter.d.ts | 2 +- .../PresetBuildItemEventRouter.d.ts | 2 +- .../item_events/QuestItemEventRouter.d.ts | 2 +- .../item_events/RagfairItemEventRouter.d.ts | 2 +- .../item_events/RepairItemEventRouter.d.ts | 2 +- .../item_events/TradeItemEventRouter.d.ts | 2 +- .../item_events/WishlistItemEventRouter.d.ts | 2 +- .../routers/serializers/BundleSerializer.d.ts | 8 +- .../routers/serializers/ImageSerializer.d.ts | 2 +- .../routers/serializers/NotifySerializer.d.ts | 6 +- .../types/routers/static/BotStaticRouter.d.ts | 2 +- .../routers/static/BundleStaticRouter.d.ts | 2 +- .../static/CustomizationStaticRouter.d.ts | 2 +- .../routers/static/DataStaticRouter.d.ts | 2 +- .../routers/static/DialogStaticRouter.d.ts | 2 +- .../routers/static/GameStaticRouter.d.ts | 2 +- .../routers/static/HealthStaticRouter.d.ts | 2 +- .../routers/static/InraidStaticRouter.d.ts | 2 +- .../routers/static/InsuranceStaticRouter.d.ts | 2 +- .../routers/static/ItemEventStaticRouter.d.ts | 2 +- .../routers/static/LauncherStaticRouter.d.ts | 2 +- .../routers/static/LocationStaticRouter.d.ts | 2 +- .../routers/static/MatchStaticRouter.d.ts | 2 +- .../routers/static/NotifierStaticRouter.d.ts | 2 +- .../routers/static/PresetStaticRouter.d.ts | 2 +- .../routers/static/ProfileStaticRouter.d.ts | 2 +- .../routers/static/QuestStaticRouter.d.ts | 2 +- .../routers/static/RagfairStaticRouter.d.ts | 2 +- .../routers/static/TraderStaticRouter.d.ts | 2 +- .../routers/static/WeatherStaticRouter.d.ts | 2 +- .../types/servers/ConfigServer.d.ts | 28 +- .../types/servers/DatabaseServer.d.ts | 2 +- .../types/servers/HttpServer.d.ts | 36 +- .../types/servers/RagfairServer.d.ts | 43 +- .../types/servers/SaveServer.d.ts | 18 +- .../types/services/FenceService.d.ts | 29 +- .../types/services/HashCacheService.d.ts | 14 +- .../types/services/InsuranceService.d.ts | 27 +- .../types/services/MatchLocationService.d.ts | 4 +- .../types/services/ModCompilerService.d.ts | 21 +- .../types/services/NotificationService.d.ts | 2 +- .../types/services/PaymentService.d.ts | 19 +- .../types/services/PlayerService.d.ts | 4 +- .../services/RagfairCategoriesService.d.ts | 2 +- .../services/RagfairLinkedItemService.d.ts | 9 +- .../types/services/RagfairOfferService.d.ts | 54 +- .../types/services/RagfairPriceService.d.ts | 26 +- .../services/RagfairRequiredItemsService.d.ts | 8 +- .../types/services/TraderAssortService.d.ts | 2 +- .../services/mod/image/imageRouteService.d.ts | 6 + .../services/mod/onLoad/OnLoadModService.d.ts | 2 +- .../mod/onUpdate/OnUpdateModService.d.ts | 2 +- .../staticRouter/StaticRouterModService.d.ts | 2 +- .../types/utils/App.d.ts | 12 +- .../types/utils/AyncQueue.d.ts | 2 +- .../types/utils/DatabaseImporter.d.ts | 10 +- .../types/utils/HashUtil.d.ts | 2 +- .../types/utils/HttpResponseUtil.d.ts | 4 +- .../types/utils/JsonUtil.d.ts | 8 +- .../types/utils/Logger.d.ts | 42 +- .../types/utils/ObjectId.d.ts | 12 +- .../types/utils/RandomUtil.d.ts | 4 +- .../types/utils/VFS.d.ts | 7 +- .../types/utils/Watermark.d.ts | 31 +- .../src/client/CachedAttributesPatch.cs | 2 +- .../src/client/MunitionsExpert.cs | 7 +- .../MunitionsExpert/src/server/.eslintignore | 9 + .../MunitionsExpert/src/server/.eslintrc.json | 75 ++ .../MunitionsExpert/src/server/LICENSE | 32 + .../MunitionsExpert/src/server/ammostats.js | 64 - .../src/server/dist/package.json | 26 + .../src/server/dist/res/armorDamage.png | Bin 0 -> 701 bytes .../src/server/dist/res/ricochet.png | Bin 0 -> 732 bytes .../src/server/dist/res/translations.json | 137 ++ .../src/server/dist/src/MunitionsExpert.ts | 125 ++ .../src/server/dist/src/config.json | 3 + .../src/server/dist/types/Program.d.ts | 4 + .../src/server/dist/types/TYPES.d.ts | 3 + .../src/server/dist/types/Utils.d.ts | 0 .../dist/types/callbacks/BotCallbacks.d.ts | 15 + .../dist/types/callbacks/BundleCallbacks.d.ts | 18 + .../callbacks/CustomizationCallbacks.d.ts | 23 + .../dist/types/callbacks/DataCallbacks.d.ts | 32 + .../types/callbacks/DialogueCallbacks.d.ts | 45 + .../dist/types/callbacks/GameCallbacks.d.ts | 24 + .../types/callbacks/HandbookCallbacks.d.ts | 8 + .../dist/types/callbacks/HealthCallbacks.d.ts | 20 + .../types/callbacks/HideoutCallbacks.d.ts | 33 + .../dist/types/callbacks/HttpCallbacks.d.ts | 9 + .../dist/types/callbacks/InraidCallbacks.d.ts | 23 + .../types/callbacks/InsuranceCallbacks.d.ts | 24 + .../types/callbacks/InventoryCallbacks.d.ts | 39 + .../types/callbacks/ItemEventCallbacks.d.ts | 11 + .../types/callbacks/LauncherCallbacks.d.ts | 28 + .../types/callbacks/LocationCallbacks.d.ts | 14 + .../dist/types/callbacks/MatchCallbacks.d.ts | 35 + .../dist/types/callbacks/ModCallbacks.d.ts | 22 + .../dist/types/callbacks/NoteCallbacks.d.ts | 11 + .../types/callbacks/NotifierCallbacks.d.ts | 24 + .../types/callbacks/PresetBuildCallbacks.d.ts | 15 + .../dist/types/callbacks/PresetCallbacks.d.ts | 8 + .../types/callbacks/ProfileCallbacks.d.ts | 30 + .../dist/types/callbacks/QuestCallbacks.d.ts | 26 + .../types/callbacks/RagfairCallbacks.d.ts | 39 + .../dist/types/callbacks/RepairCallbacks.d.ts | 11 + .../dist/types/callbacks/SaveCallbacks.d.ts | 9 + .../dist/types/callbacks/TradeCallbacks.d.ts | 11 + .../dist/types/callbacks/TraderCallbacks.d.ts | 18 + .../types/callbacks/WeatherCallbacks.d.ts | 10 + .../types/callbacks/WishlistCallbacks.d.ts | 10 + .../dist/types/controllers/BotController.d.ts | 35 + .../controllers/CustomizationController.d.ts | 22 + .../types/controllers/DialogueController.d.ts | 25 + .../types/controllers/GameController.d.ts | 32 + .../types/controllers/HandbookController.d.ts | 8 + .../types/controllers/HealthController.d.ts | 25 + .../types/controllers/HideoutController.d.ts | 57 + .../types/controllers/InraidController.d.ts | 31 + .../controllers/InsuranceController.d.ts | 38 + .../controllers/InventoryController.d.ts | 107 ++ .../types/controllers/LauncherController.d.ts | 28 + .../types/controllers/LocationController.d.ts | 18 + .../types/controllers/MatchController.d.ts | 30 + .../types/controllers/NoteController.d.ts | 12 + .../types/controllers/NotifierController.d.ts | 22 + .../controllers/PresetBuildController.d.ts | 18 + .../types/controllers/PresetController.d.ts | 8 + .../types/controllers/ProfileController.d.ts | 34 + .../types/controllers/QuestController.d.ts | 38 + .../types/controllers/RagfairController.d.ts | 70 + .../types/controllers/RepairController.d.ts | 41 + .../RepeatableQuestController.d.ts | 217 +++ .../types/controllers/TradeController.d.ts | 21 + .../types/controllers/TraderController.d.ts | 26 + .../types/controllers/WeatherController.d.ts | 11 + .../types/controllers/WishlistController.d.ts | 10 + .../src/server/dist/types/di/Container.d.ts | 14 + .../src/server/dist/types/di/OnLoad.d.ts | 4 + .../server/dist/types/di/OnLoadOnUpdate.d.ts | 7 + .../src/server/dist/types/di/OnUpdate.d.ts | 4 + .../src/server/dist/types/di/Router.d.ts | 40 + .../src/server/dist/types/di/Serializer.d.ts | 5 + .../dist/types/generators/BotGenerator.d.ts | 46 + .../generators/BotInventoryGenerator.d.ts | 24 + .../types/generators/BotLootGenerator.d.ts | 29 + .../types/generators/BotWeaponGenerator.d.ts | 46 + .../types/generators/LocationGenerator.d.ts | 46 + .../types/generators/PMCLootGenerator.d.ts | 15 + .../generators/RagfairAssortGenerator.d.ts | 25 + .../generators/RagfairOfferGenerator.d.ts | 60 + .../types/generators/WeatherGenerator.d.ts | 20 + .../dist/types/helpers/AssortHelper.d.ts | 36 + .../types/helpers/BotGeneratorHelper.d.ts | 95 ++ .../server/dist/types/helpers/BotHelper.d.ts | 44 + .../dist/types/helpers/ContainerHelper.d.ts | 12 + .../dist/types/helpers/DialogueHelper.d.ts | 21 + .../types/helpers/DurabilityLimitsHelper.d.ts | 26 + .../types/helpers/ExtendedProfileHelper.d.ts | 22 + .../dist/types/helpers/GameEventHelper.d.ts | 9 + .../dist/types/helpers/HandbookHelper.d.ts | 33 + .../dist/types/helpers/HealthHelper.d.ts | 27 + .../dist/types/helpers/HideoutHelper.d.ts | 68 + .../dist/types/helpers/HttpServerHelper.d.ts | 23 + .../dist/types/helpers/InRaidHelper.d.ts | 33 + .../dist/types/helpers/InventoryHelper.d.ts | 85 ++ .../server/dist/types/helpers/ItemHelper.d.ts | 147 +++ .../types/helpers/NotificationSendHelper.d.ts | 12 + .../dist/types/helpers/NotifierHelper.d.ts | 17 + .../dist/types/helpers/PaymentHelper.d.ts | 14 + .../dist/types/helpers/PresetHelper.d.ts | 14 + .../dist/types/helpers/ProfileHelper.d.ts | 33 + .../types/helpers/QuestConditionHelper.d.ts | 7 + .../dist/types/helpers/QuestHelper.d.ts | 69 + .../dist/types/helpers/RagfairHelper.d.ts | 44 + .../types/helpers/RagfairOfferHelper.d.ts | 52 + .../dist/types/helpers/RagfairSellHelper.d.ts | 16 + .../types/helpers/RagfairServerHelper.d.ts | 46 + .../dist/types/helpers/RagfairSortHelper.d.ts | 12 + .../dist/types/helpers/RagfairTaxHelper.d.ts | 16 + .../dist/types/helpers/RepairHelper.d.ts | 22 + .../types/helpers/SecureContainerHelper.d.ts | 13 + .../dist/types/helpers/TradeHelper.d.ts | 44 + .../types/helpers/TraderAssortHelper.d.ts | 42 + .../dist/types/helpers/TraderHelper.d.ts | 53 + .../dist/types/helpers/UtilityHelper.d.ts | 3 + .../types/helpers/WeightedRandomHelper.d.ts | 28 + .../dist/types/ide/BleedingEdgeEntry.d.ts | 1 + .../src/server/dist/types/ide/Compiler.d.ts | 1 + .../src/server/dist/types/ide/DebugEntry.d.ts | 1 + .../server/dist/types/ide/ReleaseEntry.d.ts | 1 + .../src/server/dist/types/ide/TestEntry.d.ts | 1 + .../dist/types/loaders/BundleLoader.d.ts | 22 + .../dist/types/loaders/DelayedModLoader.d.ts | 21 + .../dist/types/loaders/InitialModLoader.d.ts | 64 + .../eft/bot/IGenerateBotsRequestData.d.ts | 8 + .../models/eft/common/IEmptyRequestData.d.ts | 2 + .../types/models/eft/common/IGlobals.d.ts | 1176 +++++++++++++++++ .../types/models/eft/common/ILocation.d.ts | 6 + .../models/eft/common/ILocationBase.d.ts | 198 +++ .../ILocationsSourceDestinationBase.d.ts | 9 + .../types/models/eft/common/ILooseLoot.d.ts | 45 + .../models/eft/common/IMetricsTableData.d.ts | 7 + .../types/models/eft/common/IPmcData.d.ts | 341 +++++ .../models/eft/common/MemberCategory.d.ts | 13 + .../request/IBaseInteractionRequestData.d.ts | 9 + .../models/eft/common/tables/IBotBase.d.ts | 101 ++ .../models/eft/common/tables/IBotCore.d.ts | 133 ++ .../models/eft/common/tables/IBotType.d.ts | 176 +++ .../eft/common/tables/ICustomizationItem.d.ts | 33 + .../eft/common/tables/IHandbookBase.d.ts | 16 + .../types/models/eft/common/tables/IItem.d.ts | 108 ++ .../eft/common/tables/ILocationsBase.d.ts | 10 + .../models/eft/common/tables/ILootBase.d.ts | 64 + .../models/eft/common/tables/IQuest.d.ts | 110 ++ .../eft/common/tables/IRepeatableQuests.d.ts | 219 +++ .../eft/common/tables/ITemplateItem.d.ts | 401 ++++++ .../models/eft/common/tables/ITrader.d.ts | 90 ++ .../IBuyClothingRequestData.d.ts | 10 + .../IWearClothingRequestData.d.ts | 4 + .../models/eft/dialog/IFriendRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsResponse.d.ts | 6 + .../dialog/IGetChatServerListRequestData.d.ts | 3 + .../dialog/IGetFriendListDataResponse.d.ts | 16 + .../dialog/IGetMailDialogInfoRequestData.d.ts | 3 + .../dialog/IGetMailDialogListRequestData.d.ts | 4 + .../dialog/IGetMailDialogViewRequestData.d.ts | 7 + .../IGetMailDialogViewResponseData.d.ts | 7 + .../eft/dialog/IPinDialogRequestData.d.ts | 3 + .../eft/dialog/IRemoveDialogRequestData.d.ts | 3 + .../eft/dialog/ISendMessageRequest.d.ts | 7 + .../eft/dialog/ISetDialogReadRequestData.d.ts | 3 + .../models/eft/game/IGameConfigResponse.d.ts | 19 + .../eft/game/IGameEmptyCrcRequestData.d.ts | 3 + .../eft/game/IVersionValidateRequestData.d.ts | 11 + .../health/IHealthTreatmentRequestData.d.ts | 29 + .../eft/health/IOffraidEatRequestData.d.ts | 7 + .../eft/health/IOffraidHealRequestData.d.ts | 18 + .../eft/health/ISyncHealthRequestData.d.ts | 21 + .../models/eft/hideout/HideoutAreasEnum.d.ts | 25 + .../HideoutUpgradeCompleteRequestData.d.ts | 5 + .../models/eft/hideout/IHideoutArea.d.ts | 40 + ...utContinousProductionStartRequestData.d.ts | 5 + .../eft/hideout/IHideoutProduction.d.ts | 20 + .../hideout/IHideoutPutItemInRequestData.d.ts | 10 + .../models/eft/hideout/IHideoutScavCase.d.ts | 21 + .../IHideoutScavCaseStartRequestData.d.ts | 15 + .../eft/hideout/IHideoutSettingsBase.d.ts | 6 + ...deoutSingleProductionStartRequestData.d.ts | 10 + .../IHideoutTakeItemOutRequestData.d.ts | 6 + .../IHideoutTakeProductionRequestData.d.ts | 5 + .../IHideoutToggleAreaRequestData.d.ts | 6 + .../IHideoutUpgradeCompleteRequestData.d.ts | 5 + .../hideout/IHideoutUpgradeRequestData.d.ts | 10 + .../httpResponse/IGetBodyResponseData.d.ts | 5 + .../eft/httpResponse/INullResponseData.d.ts | 5 + .../inRaid/IRegisterPlayerRequestData.d.ts | 5 + .../eft/inRaid/ISaveProgressRequestData.d.ts | 8 + .../IGetInsuranceCostRequestData.d.ts | 4 + .../eft/insurance/IInsureRequestData.d.ts | 6 + .../eft/inventory/IAddItemRequestData.d.ts | 4 + .../inventory/IInventoryAddRequestData.d.ts | 6 + .../IInventoryBaseActionRequestData.d.ts | 27 + .../inventory/IInventoryBindRequestData.d.ts | 6 + .../IInventoryCreateMarkerRequestData.d.ts | 12 + .../IInventoryDeleteMarkerRequestData.d.ts | 7 + .../IInventoryEditMarkerRequestData.d.ts | 14 + .../IInventoryExamineRequestData.d.ts | 10 + .../inventory/IInventoryFoldRequestData.d.ts | 6 + .../inventory/IInventoryMergeRequestData.d.ts | 6 + .../inventory/IInventoryMoveRequestData.d.ts | 6 + ...IInventoryReadEncyclopediaRequestData.d.ts | 5 + .../IInventoryRemoveRequestData.d.ts | 5 + .../inventory/IInventorySortRequestData.d.ts | 20 + .../inventory/IInventorySplitRequestData.d.ts | 7 + .../inventory/IInventorySwapRequestData.d.ts | 11 + .../inventory/IInventoryTagRequestData.d.ts | 7 + .../IInventoryToggleRequestData.d.ts | 6 + .../IInventoryTransferRequestData.d.ts | 7 + .../IEmptyItemEventRouterResponse.d.ts | 4 + .../eft/itemEvent/IItemEventRouterBase.d.ts | 67 + .../itemEvent/IItemEventRouterRequest.d.ts | 21 + .../itemEvent/IItemEventRouterResponse.d.ts | 3 + .../eft/launcher/IChangeRequestData.d.ts | 4 + .../launcher/IGetMiniProfileRequestData.d.ts | 4 + .../eft/launcher/ILoginRequestData.d.ts | 4 + .../models/eft/launcher/IMiniProfile.d.ts | 14 + .../models/eft/launcher/IRegisterData.d.ts | 4 + .../eft/launcher/IRemoveProfileData.d.ts | 2 + .../eft/location/IGetLocationRequestData.d.ts | 5 + .../eft/match/IEndOfflineRaidRequestData.d.ts | 6 + .../eft/match/IGetProfileRequestData.d.ts | 3 + .../match/IStartOffineRaidRequestData.d.ts | 27 + .../models/eft/notes/INoteActionData.d.ts | 10 + .../types/models/eft/notifier/INotifier.d.ts | 14 + .../notifier/ISelectProfileRequestData.d.ts | 3 + ...IPlayerIncrementSkillLevelRequestData.d.ts | 21 + .../IPresetBuildActionRequestData.d.ts | 25 + .../types/models/eft/profile/IAkiProfile.d.ts | 167 +++ .../IProfileChangeNicknameRequestData.d.ts | 3 + .../IProfileChangeVoiceRequestData.d.ts | 3 + .../profile/IProfileCreateRequestData.d.ts | 6 + .../eft/profile/ISearchFriendRequestData.d.ts | 3 + .../eft/profile/ISearchFriendResponse.d.ts | 9 + .../profile/IValidateNicknameRequestData.d.ts | 3 + .../eft/quests/IAcceptQuestRequestData.d.ts | 5 + .../eft/quests/ICompleteQuestRequestData.d.ts | 5 + .../eft/quests/IHandoverQuestRequestData.d.ts | 10 + .../eft/quests/IListQuestsRequestData.d.ts | 3 + .../quests/IRepeatableQuestChangeRequest.d.ts | 4 + .../eft/ragfair/IAddOfferRequestData.d.ts | 13 + .../eft/ragfair/IExtendOfferRequestData.d.ts | 4 + .../eft/ragfair/IGetItemPriceResult.d.ts | 5 + .../ragfair/IGetMarketPriceRequestData.d.ts | 3 + .../models/eft/ragfair/IGetOffersResult.d.ts | 7 + .../models/eft/ragfair/IRagfairOffer.d.ts | 42 + .../eft/ragfair/IRemoveOfferRequestData.d.ts | 4 + .../eft/ragfair/ISearchRequestData.d.ts | 32 + .../repair/IBaseRepairActionDataRequest.d.ts | 3 + .../eft/repair/IRepairActionDataRequest.d.ts | 10 + .../ITraderRepairActionDataRequest.d.ts | 10 + .../trade/IProcessBaseTradeRequestData.d.ts | 5 + .../trade/IProcessBuyTradeRequestData.d.ts | 14 + .../IProcessRagfairTradeRequestData.d.ts | 13 + .../trade/IProcessSellTradeRequestData.d.ts | 12 + .../models/eft/weather/IWeatherData.d.ts | 20 + .../eft/wishlist/IWishlistActionData.d.ts | 4 + .../dist/types/models/enums/BaseClasses.d.ts | 84 ++ .../dist/types/models/enums/ConfigTypes.d.ts | 18 + .../types/models/enums/ELocationName.d.ts | 11 + .../types/models/enums/EquipmentSlots.d.ts | 16 + .../dist/types/models/enums/HideoutAreas.d.ts | 25 + .../types/models/enums/MemberCategory.d.ts | 13 + .../dist/types/models/enums/MessageType.d.ts | 16 + .../server/dist/types/models/enums/Money.d.ts | 5 + .../dist/types/models/enums/Traders.d.ts | 10 + .../dist/types/models/external/mod.d.ts | 5 + .../dist/types/models/external/tsyringe.d.ts | 2 + .../dist/types/models/spt/bindings/Route.d.ts | 3 + .../models/spt/callbacks/IBotCallbacks.d.ts | 10 + .../spt/callbacks/IBundleCallbacks.d.ts | 5 + .../callbacks/ICustomizationCallbacks.d.ts | 12 + .../models/spt/callbacks/IDataCallbacks.d.ts | 26 + .../spt/callbacks/IDialogueCallbacks.d.ts | 34 + .../models/spt/callbacks/IGameCallbacks.d.ts | 16 + .../spt/callbacks/IHandbookCallbacks.d.ts | 3 + .../spt/callbacks/IHealthCallbacks.d.ts | 13 + .../spt/callbacks/IHideoutCallbacks.d.ts | 23 + .../models/spt/callbacks/IHttpCallbacks.d.ts | 5 + .../spt/callbacks/IInraidCallbacks.d.ts | 14 + .../spt/callbacks/IInsuranceCallbacks.d.ts | 10 + .../spt/callbacks/IInventoryCallbacks.d.ts | 36 + .../spt/callbacks/IItemEventCallbacks.d.ts | 6 + .../spt/callbacks/ILauncherCallbacks.d.ts | 20 + .../spt/callbacks/ILocationCallbacks.d.ts | 8 + .../models/spt/callbacks/IMatchCallbacks.d.ts | 25 + .../models/spt/callbacks/IModCallbacks.d.ts | 6 + .../models/spt/callbacks/INoteCallbacks.d.ts | 8 + .../spt/callbacks/INotifierCallbacks.d.ts | 17 + .../spt/callbacks/IPresetBuildCallbacks.d.ts | 10 + .../spt/callbacks/IPresetCallbacks.d.ts | 3 + .../spt/callbacks/IProfileCallbacks.d.ts | 21 + .../models/spt/callbacks/IQuestCallbacks.d.ts | 19 + .../spt/callbacks/IRagfairCallbacks.d.ts | 21 + .../spt/callbacks/IRepairCallbacks.d.ts | 8 + .../models/spt/callbacks/ISaveCallbacks.d.ts | 4 + .../models/spt/callbacks/ITradeCallbacks.d.ts | 8 + .../spt/callbacks/ITraderCallbacks.d.ts | 11 + .../spt/callbacks/IWeatherCallbacks.d.ts | 5 + .../spt/callbacks/IWishlistCallbacks.d.ts | 7 + .../models/spt/config/IAirdropConfig.d.ts | 20 + .../types/models/spt/config/IBaseConfig.d.ts | 3 + .../types/models/spt/config/IBotConfig.d.ts | 114 ++ .../types/models/spt/config/ICoreConfig.d.ts | 7 + .../models/spt/config/IHealthConfig.d.ts | 14 + .../models/spt/config/IHideoutConfig.d.ts | 27 + .../types/models/spt/config/IHttpConfig.d.ts | 6 + .../models/spt/config/IInRaidConfig.d.ts | 21 + .../models/spt/config/IInsuranceConfig.d.ts | 7 + .../models/spt/config/IInventoryConfig.d.ts | 5 + .../models/spt/config/ILocationConfig.d.ts | 24 + .../types/models/spt/config/IMatchConfig.d.ts | 5 + .../types/models/spt/config/IQuestConfig.d.ts | 77 ++ .../models/spt/config/IRagfairConfig.d.ts | 59 + .../models/spt/config/IRepairConfig.d.ts | 5 + .../models/spt/config/ITraderConfig.d.ts | 15 + .../models/spt/config/IWeatherConfig.d.ts | 21 + .../spt/controllers/IBotController.d.ts | 13 + .../models/spt/generators/IBotGenerator.d.ts | 10 + .../spt/generators/ILocationGenerator.d.ts | 6 + .../spt/generators/IPMCLootGenerator.d.ts | 4 + .../generators/IRagfairAssortGenerator.d.ts | 4 + .../generators/IRagfairOfferGenerator.d.ts | 6 + .../types/models/spt/helpers/Traders.d.ts | 10 + .../dist/types/models/spt/mod/IMod.d.ts | 10 + .../dist/types/models/spt/mod/IModLoader.d.ts | 7 + .../models/spt/mod/IPackageJsonData.d.ts | 11 + .../spt/ragfair/IRagfairServerPrices.d.ts | 4 + .../models/spt/server/IDatabaseTables.d.ts | 51 + .../types/models/spt/server/IHttpServer.d.ts | 12 + .../types/models/spt/server/ILocaleBase.d.ts | 61 + .../types/models/spt/server/ILocations.d.ts | 26 + .../types/models/spt/server/IServerBase.d.ts | 4 + .../models/spt/server/ISettingsBase.d.ts | 43 + .../types/models/spt/utils/IAsyncQueue.d.ts | 4 + .../dist/types/models/spt/utils/ICommand.d.ts | 4 + .../dist/types/models/spt/utils/ILogger.d.ts | 10 + .../models/spt/utils/IUuidGenerator.d.ts | 3 + .../server/dist/types/routers/HttpRouter.d.ts | 16 + .../dist/types/routers/ImageRouter.d.ts | 13 + .../dist/types/routers/ItemEventRouter.d.ts | 17 + .../routers/dynamic/BotDynamicRouter.d.ts | 6 + .../routers/dynamic/BundleDynamicRouter.d.ts | 6 + .../dynamic/CustomizationDynamicRouter.d.ts | 6 + .../routers/dynamic/DataDynamicRouter.d.ts | 6 + .../routers/dynamic/HttpDynamicRouter.d.ts | 6 + .../routers/dynamic/InraidDynamicRouter.d.ts | 7 + .../dynamic/LocationDynamicRouter.d.ts | 7 + .../dynamic/NotifierDynamicRouter.d.ts | 6 + .../routers/dynamic/TraderDynamicRouter.d.ts | 6 + .../CustomizationItemEventRouter.d.ts | 10 + .../item_events/HealthItemEventRouter.d.ts | 10 + .../item_events/HideoutItemEventRouter.d.ts | 10 + .../item_events/InsuranceItemEventRouter.d.ts | 10 + .../item_events/InventoryItemEventRouter.d.ts | 10 + .../item_events/NoteItemEventRouter.d.ts | 10 + .../PresetBuildItemEventRouter.d.ts | 10 + .../item_events/QuestItemEventRouter.d.ts | 10 + .../item_events/RagfairItemEventRouter.d.ts | 10 + .../item_events/RepairItemEventRouter.d.ts | 10 + .../item_events/TradeItemEventRouter.d.ts | 10 + .../item_events/WishlistItemEventRouter.d.ts | 10 + .../save_load/HealthSaveLoadRouter.d.ts | 7 + .../save_load/InraidSaveLoadRouter.d.ts | 7 + .../save_load/InsuranceSaveLoadRouter.d.ts | 7 + .../save_load/ProfileSaveLoadRouter.d.ts | 7 + .../routers/serializers/BundleSerializer.d.ts | 11 + .../routers/serializers/ImageSerializer.d.ts | 9 + .../routers/serializers/NotifySerializer.d.ts | 11 + .../types/routers/static/BotStaticRouter.d.ts | 6 + .../routers/static/BundleStaticRouter.d.ts | 6 + .../static/CustomizationStaticRouter.d.ts | 6 + .../routers/static/DataStaticRouter.d.ts | 6 + .../routers/static/DialogStaticRouter.d.ts | 6 + .../routers/static/GameStaticRouter.d.ts | 6 + .../routers/static/HealthStaticRouter.d.ts | 6 + .../routers/static/InraidStaticRouter.d.ts | 6 + .../routers/static/InsuranceStaticRouter.d.ts | 6 + .../routers/static/ItemEventStaticRouter.d.ts | 6 + .../routers/static/LauncherStaticRouter.d.ts | 6 + .../routers/static/LocationStaticRouter.d.ts | 6 + .../routers/static/MatchStaticRouter.d.ts | 6 + .../routers/static/NotifierStaticRouter.d.ts | 6 + .../routers/static/PresetStaticRouter.d.ts | 6 + .../routers/static/ProfileStaticRouter.d.ts | 6 + .../routers/static/QuestStaticRouter.d.ts | 6 + .../routers/static/RagfairStaticRouter.d.ts | 6 + .../routers/static/TraderStaticRouter.d.ts | 6 + .../routers/static/WeatherStaticRouter.d.ts | 6 + .../dist/types/servers/ConfigServer.d.ts | 14 + .../dist/types/servers/DatabaseServer.d.ts | 6 + .../server/dist/types/servers/HttpServer.d.ts | 49 + .../dist/types/servers/RagfairServer.d.ts | 31 + .../server/dist/types/servers/SaveServer.d.ts | 28 + .../dist/types/services/FenceService.d.ts | 39 + .../dist/types/services/HashCacheService.d.ts | 19 + .../dist/types/services/InsuranceService.d.ts | 42 + .../types/services/MatchLocationService.d.ts | 8 + .../types/services/ModCompilerService.d.ts | 20 + .../types/services/NotificationService.d.ts | 21 + .../dist/types/services/PaymentService.d.ts | 49 + .../dist/types/services/PlayerService.d.ts | 22 + .../services/RagfairCategoriesService.d.ts | 10 + .../services/RagfairLinkedItemService.d.ts | 10 + .../types/services/RagfairOfferService.d.ts | 66 + .../types/services/RagfairPriceService.d.ts | 32 + .../services/RagfairRequiredItemsService.d.ts | 12 + .../types/services/TraderAssortService.d.ts | 6 + .../mod/dynamicRouter/DynamicRouterMod.d.ts | 6 + .../DynamicRouterModService.d.ts | 7 + .../services/mod/image/imageRouteService.d.ts | 6 + .../types/services/mod/onLoad/OnLoadMod.d.ts | 8 + .../services/mod/onLoad/OnLoadModService.d.ts | 6 + .../services/mod/onUpdate/OnUpdateMod.d.ts | 8 + .../mod/onUpdate/OnUpdateModService.d.ts | 6 + .../mod/staticRouter/StaticRouterMod.d.ts | 6 + .../staticRouter/StaticRouterModService.d.ts | 7 + .../src/server/dist/types/utils/App.d.ts | 14 + .../server/dist/types/utils/AyncQueue.d.ts | 7 + .../dist/types/utils/DatabaseImporter.d.ts | 18 + .../src/server/dist/types/utils/HashUtil.d.ts | 11 + .../dist/types/utils/HttpResponseUtil.d.ts | 16 + .../src/server/dist/types/utils/JsonUtil.d.ts | 25 + .../src/server/dist/types/utils/Logger.d.ts | 51 + .../src/server/dist/types/utils/MathUtil.d.ts | 53 + .../src/server/dist/types/utils/ObjectId.d.ts | 14 + .../server/dist/types/utils/RandomUtil.d.ts | 153 +++ .../src/server/dist/types/utils/TimeUtil.d.ts | 8 + .../dist/types/utils/UUidGenerator.d.ts | 4 + .../src/server/dist/types/utils/VFS.d.ts | 55 + .../server/dist/types/utils/Watermark.d.ts | 41 + .../types/utils/decorators/Singleton.d.ts | 4 + .../types/utils/decorators/constructor.d.ts | 4 + .../src/server/mod.code-workspace | 12 + .../MunitionsExpert/src/server/package.json | 26 + .../src/server/res/armorDamage.png | Bin 0 -> 701 bytes .../src/server/res/ricochet.png | Bin 0 -> 732 bytes .../src/server/res/translations.json | 137 ++ .../src/server/src/MunitionsExpert.ts | 125 ++ .../src/server/src/config.json | 3 + .../MunitionsExpert/src/server}/tsconfig.json | 8 +- .../src/server/types/Program.d.ts | 4 + .../src/server/types/TYPES.d.ts | 3 + .../src/server/types/Utils.d.ts | 0 .../server/types/callbacks/BotCallbacks.d.ts | 15 + .../types/callbacks/BundleCallbacks.d.ts | 18 + .../callbacks/CustomizationCallbacks.d.ts | 23 + .../server/types/callbacks/DataCallbacks.d.ts | 32 + .../types/callbacks/DialogueCallbacks.d.ts | 45 + .../server/types/callbacks/GameCallbacks.d.ts | 24 + .../types/callbacks/HandbookCallbacks.d.ts | 8 + .../types/callbacks/HealthCallbacks.d.ts | 20 + .../types/callbacks/HideoutCallbacks.d.ts | 33 + .../server/types/callbacks/HttpCallbacks.d.ts | 9 + .../types/callbacks/InraidCallbacks.d.ts | 23 + .../types/callbacks/InsuranceCallbacks.d.ts | 24 + .../types/callbacks/InventoryCallbacks.d.ts | 39 + .../types/callbacks/ItemEventCallbacks.d.ts | 11 + .../types/callbacks/LauncherCallbacks.d.ts | 28 + .../types/callbacks/LocationCallbacks.d.ts | 14 + .../types/callbacks/MatchCallbacks.d.ts | 35 + .../server/types/callbacks/ModCallbacks.d.ts | 22 + .../server/types/callbacks/NoteCallbacks.d.ts | 11 + .../types/callbacks/NotifierCallbacks.d.ts | 24 + .../types/callbacks/PresetBuildCallbacks.d.ts | 15 + .../types/callbacks/PresetCallbacks.d.ts | 8 + .../types/callbacks/ProfileCallbacks.d.ts | 30 + .../types/callbacks/QuestCallbacks.d.ts | 26 + .../types/callbacks/RagfairCallbacks.d.ts | 39 + .../types/callbacks/RepairCallbacks.d.ts | 11 + .../server/types/callbacks/SaveCallbacks.d.ts | 9 + .../types/callbacks/TradeCallbacks.d.ts | 11 + .../types/callbacks/TraderCallbacks.d.ts | 18 + .../types/callbacks/WeatherCallbacks.d.ts | 10 + .../types/callbacks/WishlistCallbacks.d.ts | 10 + .../types/controllers/BotController.d.ts | 35 + .../controllers/CustomizationController.d.ts | 22 + .../types/controllers/DialogueController.d.ts | 25 + .../types/controllers/GameController.d.ts | 32 + .../types/controllers/HandbookController.d.ts | 8 + .../types/controllers/HealthController.d.ts | 25 + .../types/controllers/HideoutController.d.ts | 57 + .../types/controllers/InraidController.d.ts | 31 + .../controllers/InsuranceController.d.ts | 38 + .../controllers/InventoryController.d.ts | 107 ++ .../types/controllers/LauncherController.d.ts | 28 + .../types/controllers/LocationController.d.ts | 18 + .../types/controllers/MatchController.d.ts | 30 + .../types/controllers/NoteController.d.ts | 12 + .../types/controllers/NotifierController.d.ts | 22 + .../controllers/PresetBuildController.d.ts | 18 + .../types/controllers/PresetController.d.ts | 8 + .../types/controllers/ProfileController.d.ts | 34 + .../types/controllers/QuestController.d.ts | 38 + .../types/controllers/RagfairController.d.ts | 70 + .../types/controllers/RepairController.d.ts | 41 + .../RepeatableQuestController.d.ts | 217 +++ .../types/controllers/TradeController.d.ts | 21 + .../types/controllers/TraderController.d.ts | 26 + .../types/controllers/WeatherController.d.ts | 11 + .../types/controllers/WishlistController.d.ts | 10 + .../src/server/types/di/Container.d.ts | 14 + .../src/server/types/di/OnLoad.d.ts | 4 + .../src/server/types/di/OnLoadOnUpdate.d.ts | 7 + .../src/server/types/di/OnUpdate.d.ts | 4 + .../src/server/types/di/Router.d.ts | 40 + .../src/server/types/di/Serializer.d.ts | 5 + .../server/types/generators/BotGenerator.d.ts | 46 + .../generators/BotInventoryGenerator.d.ts | 24 + .../types/generators/BotLootGenerator.d.ts | 29 + .../types/generators/BotWeaponGenerator.d.ts | 46 + .../types/generators/LocationGenerator.d.ts | 46 + .../types/generators/PMCLootGenerator.d.ts | 15 + .../generators/RagfairAssortGenerator.d.ts | 25 + .../generators/RagfairOfferGenerator.d.ts | 60 + .../types/generators/WeatherGenerator.d.ts | 20 + .../server/types/helpers/AssortHelper.d.ts | 36 + .../types/helpers/BotGeneratorHelper.d.ts | 95 ++ .../src/server/types/helpers/BotHelper.d.ts | 44 + .../server/types/helpers/ContainerHelper.d.ts | 12 + .../server/types/helpers/DialogueHelper.d.ts | 21 + .../types/helpers/DurabilityLimitsHelper.d.ts | 26 + .../types/helpers/ExtendedProfileHelper.d.ts | 22 + .../server/types/helpers/GameEventHelper.d.ts | 9 + .../server/types/helpers/HandbookHelper.d.ts | 33 + .../server/types/helpers/HealthHelper.d.ts | 27 + .../server/types/helpers/HideoutHelper.d.ts | 68 + .../types/helpers/HttpServerHelper.d.ts | 23 + .../server/types/helpers/InRaidHelper.d.ts | 33 + .../server/types/helpers/InventoryHelper.d.ts | 85 ++ .../src/server/types/helpers/ItemHelper.d.ts | 147 +++ .../types/helpers/NotificationSendHelper.d.ts | 12 + .../server/types/helpers/NotifierHelper.d.ts | 17 + .../server/types/helpers/PaymentHelper.d.ts | 14 + .../server/types/helpers/PresetHelper.d.ts | 14 + .../server/types/helpers/ProfileHelper.d.ts | 33 + .../types/helpers/QuestConditionHelper.d.ts | 7 + .../src/server/types/helpers/QuestHelper.d.ts | 69 + .../server/types/helpers/RagfairHelper.d.ts | 44 + .../types/helpers/RagfairOfferHelper.d.ts | 52 + .../types/helpers/RagfairSellHelper.d.ts | 16 + .../types/helpers/RagfairServerHelper.d.ts | 46 + .../types/helpers/RagfairSortHelper.d.ts | 12 + .../types/helpers/RagfairTaxHelper.d.ts | 16 + .../server/types/helpers/RepairHelper.d.ts | 22 + .../types/helpers/SecureContainerHelper.d.ts | 13 + .../src/server/types/helpers/TradeHelper.d.ts | 44 + .../types/helpers/TraderAssortHelper.d.ts | 42 + .../server/types/helpers/TraderHelper.d.ts | 53 + .../server/types/helpers/UtilityHelper.d.ts | 3 + .../types/helpers/WeightedRandomHelper.d.ts | 28 + .../server/types/ide/BleedingEdgeEntry.d.ts | 1 + .../src/server/types/ide/Compiler.d.ts | 1 + .../src/server/types/ide/DebugEntry.d.ts | 1 + .../src/server/types/ide/ReleaseEntry.d.ts | 1 + .../src/server/types/ide/TestEntry.d.ts | 1 + .../server/types/loaders/BundleLoader.d.ts | 22 + .../types/loaders/DelayedModLoader.d.ts | 21 + .../types/loaders/InitialModLoader.d.ts | 64 + .../eft/bot/IGenerateBotsRequestData.d.ts | 8 + .../models/eft/common/IEmptyRequestData.d.ts | 2 + .../types/models/eft/common/IGlobals.d.ts | 1176 +++++++++++++++++ .../types/models/eft/common/ILocation.d.ts | 6 + .../models/eft/common/ILocationBase.d.ts | 198 +++ .../ILocationsSourceDestinationBase.d.ts | 9 + .../types/models/eft/common/ILooseLoot.d.ts | 45 + .../models/eft/common/IMetricsTableData.d.ts | 7 + .../types/models/eft/common/IPmcData.d.ts | 341 +++++ .../models/eft/common/MemberCategory.d.ts | 13 + .../request/IBaseInteractionRequestData.d.ts | 9 + .../models/eft/common/tables/IBotBase.d.ts | 101 ++ .../models/eft/common/tables/IBotCore.d.ts | 133 ++ .../models/eft/common/tables/IBotType.d.ts | 176 +++ .../eft/common/tables/ICustomizationItem.d.ts | 33 + .../eft/common/tables/IHandbookBase.d.ts | 16 + .../types/models/eft/common/tables/IItem.d.ts | 108 ++ .../eft/common/tables/ILocationsBase.d.ts | 10 + .../models/eft/common/tables/ILootBase.d.ts | 64 + .../models/eft/common/tables/IQuest.d.ts | 110 ++ .../eft/common/tables/IRepeatableQuests.d.ts | 219 +++ .../eft/common/tables/ITemplateItem.d.ts | 401 ++++++ .../models/eft/common/tables/ITrader.d.ts | 90 ++ .../IBuyClothingRequestData.d.ts | 10 + .../IWearClothingRequestData.d.ts | 4 + .../models/eft/dialog/IFriendRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsResponse.d.ts | 6 + .../dialog/IGetChatServerListRequestData.d.ts | 3 + .../dialog/IGetFriendListDataResponse.d.ts | 16 + .../dialog/IGetMailDialogInfoRequestData.d.ts | 3 + .../dialog/IGetMailDialogListRequestData.d.ts | 4 + .../dialog/IGetMailDialogViewRequestData.d.ts | 7 + .../IGetMailDialogViewResponseData.d.ts | 7 + .../eft/dialog/IPinDialogRequestData.d.ts | 3 + .../eft/dialog/IRemoveDialogRequestData.d.ts | 3 + .../eft/dialog/ISendMessageRequest.d.ts | 7 + .../eft/dialog/ISetDialogReadRequestData.d.ts | 3 + .../models/eft/game/IGameConfigResponse.d.ts | 19 + .../eft/game/IGameEmptyCrcRequestData.d.ts | 3 + .../eft/game/IVersionValidateRequestData.d.ts | 11 + .../health/IHealthTreatmentRequestData.d.ts | 29 + .../eft/health/IOffraidEatRequestData.d.ts | 7 + .../eft/health/IOffraidHealRequestData.d.ts | 18 + .../eft/health/ISyncHealthRequestData.d.ts | 21 + .../models/eft/hideout/HideoutAreasEnum.d.ts | 25 + .../HideoutUpgradeCompleteRequestData.d.ts | 5 + .../models/eft/hideout/IHideoutArea.d.ts | 40 + ...utContinousProductionStartRequestData.d.ts | 5 + .../eft/hideout/IHideoutProduction.d.ts | 20 + .../hideout/IHideoutPutItemInRequestData.d.ts | 10 + .../models/eft/hideout/IHideoutScavCase.d.ts | 21 + .../IHideoutScavCaseStartRequestData.d.ts | 15 + .../eft/hideout/IHideoutSettingsBase.d.ts | 6 + ...deoutSingleProductionStartRequestData.d.ts | 10 + .../IHideoutTakeItemOutRequestData.d.ts | 6 + .../IHideoutTakeProductionRequestData.d.ts | 5 + .../IHideoutToggleAreaRequestData.d.ts | 6 + .../IHideoutUpgradeCompleteRequestData.d.ts | 5 + .../hideout/IHideoutUpgradeRequestData.d.ts | 10 + .../httpResponse/IGetBodyResponseData.d.ts | 5 + .../eft/httpResponse/INullResponseData.d.ts | 5 + .../inRaid/IRegisterPlayerRequestData.d.ts | 5 + .../eft/inRaid/ISaveProgressRequestData.d.ts | 8 + .../IGetInsuranceCostRequestData.d.ts | 4 + .../eft/insurance/IInsureRequestData.d.ts | 6 + .../eft/inventory/IAddItemRequestData.d.ts | 4 + .../inventory/IInventoryAddRequestData.d.ts | 6 + .../IInventoryBaseActionRequestData.d.ts | 27 + .../inventory/IInventoryBindRequestData.d.ts | 6 + .../IInventoryCreateMarkerRequestData.d.ts | 12 + .../IInventoryDeleteMarkerRequestData.d.ts | 7 + .../IInventoryEditMarkerRequestData.d.ts | 14 + .../IInventoryExamineRequestData.d.ts | 10 + .../inventory/IInventoryFoldRequestData.d.ts | 6 + .../inventory/IInventoryMergeRequestData.d.ts | 6 + .../inventory/IInventoryMoveRequestData.d.ts | 6 + ...IInventoryReadEncyclopediaRequestData.d.ts | 5 + .../IInventoryRemoveRequestData.d.ts | 5 + .../inventory/IInventorySortRequestData.d.ts | 20 + .../inventory/IInventorySplitRequestData.d.ts | 7 + .../inventory/IInventorySwapRequestData.d.ts | 11 + .../inventory/IInventoryTagRequestData.d.ts | 7 + .../IInventoryToggleRequestData.d.ts | 6 + .../IInventoryTransferRequestData.d.ts | 7 + .../IEmptyItemEventRouterResponse.d.ts | 4 + .../eft/itemEvent/IItemEventRouterBase.d.ts | 67 + .../itemEvent/IItemEventRouterRequest.d.ts | 21 + .../itemEvent/IItemEventRouterResponse.d.ts | 3 + .../eft/launcher/IChangeRequestData.d.ts | 4 + .../launcher/IGetMiniProfileRequestData.d.ts | 4 + .../eft/launcher/ILoginRequestData.d.ts | 4 + .../models/eft/launcher/IMiniProfile.d.ts | 14 + .../models/eft/launcher/IRegisterData.d.ts | 4 + .../eft/launcher/IRemoveProfileData.d.ts | 2 + .../eft/location/IGetLocationRequestData.d.ts | 5 + .../eft/match/IEndOfflineRaidRequestData.d.ts | 6 + .../eft/match/IGetProfileRequestData.d.ts | 3 + .../match/IStartOffineRaidRequestData.d.ts | 27 + .../models/eft/notes/INoteActionData.d.ts | 10 + .../types/models/eft/notifier/INotifier.d.ts | 14 + .../notifier/ISelectProfileRequestData.d.ts | 3 + ...IPlayerIncrementSkillLevelRequestData.d.ts | 21 + .../IPresetBuildActionRequestData.d.ts | 25 + .../types/models/eft/profile/IAkiProfile.d.ts | 167 +++ .../IProfileChangeNicknameRequestData.d.ts | 3 + .../IProfileChangeVoiceRequestData.d.ts | 3 + .../profile/IProfileCreateRequestData.d.ts | 6 + .../eft/profile/ISearchFriendRequestData.d.ts | 3 + .../eft/profile/ISearchFriendResponse.d.ts | 9 + .../profile/IValidateNicknameRequestData.d.ts | 3 + .../eft/quests/IAcceptQuestRequestData.d.ts | 5 + .../eft/quests/ICompleteQuestRequestData.d.ts | 5 + .../eft/quests/IHandoverQuestRequestData.d.ts | 10 + .../eft/quests/IListQuestsRequestData.d.ts | 3 + .../quests/IRepeatableQuestChangeRequest.d.ts | 4 + .../eft/ragfair/IAddOfferRequestData.d.ts | 13 + .../eft/ragfair/IExtendOfferRequestData.d.ts | 4 + .../eft/ragfair/IGetItemPriceResult.d.ts | 5 + .../ragfair/IGetMarketPriceRequestData.d.ts | 3 + .../models/eft/ragfair/IGetOffersResult.d.ts | 7 + .../models/eft/ragfair/IRagfairOffer.d.ts | 42 + .../eft/ragfair/IRemoveOfferRequestData.d.ts | 4 + .../eft/ragfair/ISearchRequestData.d.ts | 32 + .../repair/IBaseRepairActionDataRequest.d.ts | 3 + .../eft/repair/IRepairActionDataRequest.d.ts | 10 + .../ITraderRepairActionDataRequest.d.ts | 10 + .../trade/IProcessBaseTradeRequestData.d.ts | 5 + .../trade/IProcessBuyTradeRequestData.d.ts | 14 + .../IProcessRagfairTradeRequestData.d.ts | 13 + .../trade/IProcessSellTradeRequestData.d.ts | 12 + .../models/eft/weather/IWeatherData.d.ts | 20 + .../eft/wishlist/IWishlistActionData.d.ts | 4 + .../types/models/enums/BaseClasses.d.ts | 84 ++ .../types/models/enums/ConfigTypes.d.ts | 18 + .../types/models/enums/ELocationName.d.ts | 11 + .../types/models/enums/EquipmentSlots.d.ts | 16 + .../types/models/enums/HideoutAreas.d.ts | 25 + .../types/models/enums/MemberCategory.d.ts | 13 + .../types/models/enums/MessageType.d.ts | 16 + .../src/server/types/models/enums/Money.d.ts | 5 + .../server/types/models/enums/Traders.d.ts | 10 + .../src/server/types/models/external/mod.d.ts | 5 + .../types/models/external/tsyringe.d.ts | 2 + .../types/models/spt/bindings/Route.d.ts | 3 + .../models/spt/callbacks/IBotCallbacks.d.ts | 10 + .../spt/callbacks/IBundleCallbacks.d.ts | 5 + .../callbacks/ICustomizationCallbacks.d.ts | 12 + .../models/spt/callbacks/IDataCallbacks.d.ts | 26 + .../spt/callbacks/IDialogueCallbacks.d.ts | 34 + .../models/spt/callbacks/IGameCallbacks.d.ts | 16 + .../spt/callbacks/IHandbookCallbacks.d.ts | 3 + .../spt/callbacks/IHealthCallbacks.d.ts | 13 + .../spt/callbacks/IHideoutCallbacks.d.ts | 23 + .../models/spt/callbacks/IHttpCallbacks.d.ts | 5 + .../spt/callbacks/IInraidCallbacks.d.ts | 14 + .../spt/callbacks/IInsuranceCallbacks.d.ts | 10 + .../spt/callbacks/IInventoryCallbacks.d.ts | 36 + .../spt/callbacks/IItemEventCallbacks.d.ts | 6 + .../spt/callbacks/ILauncherCallbacks.d.ts | 20 + .../spt/callbacks/ILocationCallbacks.d.ts | 8 + .../models/spt/callbacks/IMatchCallbacks.d.ts | 25 + .../models/spt/callbacks/IModCallbacks.d.ts | 6 + .../models/spt/callbacks/INoteCallbacks.d.ts | 8 + .../spt/callbacks/INotifierCallbacks.d.ts | 17 + .../spt/callbacks/IPresetBuildCallbacks.d.ts | 10 + .../spt/callbacks/IPresetCallbacks.d.ts | 3 + .../spt/callbacks/IProfileCallbacks.d.ts | 21 + .../models/spt/callbacks/IQuestCallbacks.d.ts | 19 + .../spt/callbacks/IRagfairCallbacks.d.ts | 21 + .../spt/callbacks/IRepairCallbacks.d.ts | 8 + .../models/spt/callbacks/ISaveCallbacks.d.ts | 4 + .../models/spt/callbacks/ITradeCallbacks.d.ts | 8 + .../spt/callbacks/ITraderCallbacks.d.ts | 11 + .../spt/callbacks/IWeatherCallbacks.d.ts | 5 + .../spt/callbacks/IWishlistCallbacks.d.ts | 7 + .../models/spt/config/IAirdropConfig.d.ts | 20 + .../types/models/spt/config/IBaseConfig.d.ts | 3 + .../types/models/spt/config/IBotConfig.d.ts | 114 ++ .../types/models/spt/config/ICoreConfig.d.ts | 7 + .../models/spt/config/IHealthConfig.d.ts | 14 + .../models/spt/config/IHideoutConfig.d.ts | 27 + .../types/models/spt/config/IHttpConfig.d.ts | 6 + .../models/spt/config/IInRaidConfig.d.ts | 21 + .../models/spt/config/IInsuranceConfig.d.ts | 7 + .../models/spt/config/IInventoryConfig.d.ts | 5 + .../models/spt/config/ILocationConfig.d.ts | 24 + .../types/models/spt/config/IMatchConfig.d.ts | 5 + .../types/models/spt/config/IQuestConfig.d.ts | 77 ++ .../models/spt/config/IRagfairConfig.d.ts | 59 + .../models/spt/config/IRepairConfig.d.ts | 5 + .../models/spt/config/ITraderConfig.d.ts | 15 + .../models/spt/config/IWeatherConfig.d.ts | 21 + .../spt/controllers/IBotController.d.ts | 13 + .../models/spt/generators/IBotGenerator.d.ts | 10 + .../spt/generators/ILocationGenerator.d.ts | 6 + .../spt/generators/IPMCLootGenerator.d.ts | 4 + .../generators/IRagfairAssortGenerator.d.ts | 4 + .../generators/IRagfairOfferGenerator.d.ts | 6 + .../types/models/spt/helpers/Traders.d.ts | 10 + .../src/server/types/models/spt/mod/IMod.d.ts | 10 + .../types/models/spt/mod/IModLoader.d.ts | 7 + .../models/spt/mod/IPackageJsonData.d.ts | 11 + .../spt/ragfair/IRagfairServerPrices.d.ts | 4 + .../models/spt/server/IDatabaseTables.d.ts | 51 + .../types/models/spt/server/IHttpServer.d.ts | 12 + .../types/models/spt/server/ILocaleBase.d.ts | 61 + .../types/models/spt/server/ILocations.d.ts | 26 + .../types/models/spt/server/IServerBase.d.ts | 4 + .../models/spt/server/ISettingsBase.d.ts | 43 + .../types/models/spt/utils/IAsyncQueue.d.ts | 4 + .../types/models/spt/utils/ICommand.d.ts | 4 + .../types/models/spt/utils/ILogger.d.ts | 10 + .../models/spt/utils/IUuidGenerator.d.ts | 3 + .../src/server/types/routers/HttpRouter.d.ts | 16 + .../src/server/types/routers/ImageRouter.d.ts | 13 + .../server/types/routers/ItemEventRouter.d.ts | 17 + .../routers/dynamic/BotDynamicRouter.d.ts | 6 + .../routers/dynamic/BundleDynamicRouter.d.ts | 6 + .../dynamic/CustomizationDynamicRouter.d.ts | 6 + .../routers/dynamic/DataDynamicRouter.d.ts | 6 + .../routers/dynamic/HttpDynamicRouter.d.ts | 6 + .../routers/dynamic/InraidDynamicRouter.d.ts | 7 + .../dynamic/LocationDynamicRouter.d.ts | 7 + .../dynamic/NotifierDynamicRouter.d.ts | 6 + .../routers/dynamic/TraderDynamicRouter.d.ts | 6 + .../CustomizationItemEventRouter.d.ts | 10 + .../item_events/HealthItemEventRouter.d.ts | 10 + .../item_events/HideoutItemEventRouter.d.ts | 10 + .../item_events/InsuranceItemEventRouter.d.ts | 10 + .../item_events/InventoryItemEventRouter.d.ts | 10 + .../item_events/NoteItemEventRouter.d.ts | 10 + .../PresetBuildItemEventRouter.d.ts | 10 + .../item_events/QuestItemEventRouter.d.ts | 10 + .../item_events/RagfairItemEventRouter.d.ts | 10 + .../item_events/RepairItemEventRouter.d.ts | 10 + .../item_events/TradeItemEventRouter.d.ts | 10 + .../item_events/WishlistItemEventRouter.d.ts | 10 + .../save_load/HealthSaveLoadRouter.d.ts | 7 + .../save_load/InraidSaveLoadRouter.d.ts | 7 + .../save_load/InsuranceSaveLoadRouter.d.ts | 7 + .../save_load/ProfileSaveLoadRouter.d.ts | 7 + .../routers/serializers/BundleSerializer.d.ts | 11 + .../routers/serializers/ImageSerializer.d.ts | 9 + .../routers/serializers/NotifySerializer.d.ts | 11 + .../types/routers/static/BotStaticRouter.d.ts | 6 + .../routers/static/BundleStaticRouter.d.ts | 6 + .../static/CustomizationStaticRouter.d.ts | 6 + .../routers/static/DataStaticRouter.d.ts | 6 + .../routers/static/DialogStaticRouter.d.ts | 6 + .../routers/static/GameStaticRouter.d.ts | 6 + .../routers/static/HealthStaticRouter.d.ts | 6 + .../routers/static/InraidStaticRouter.d.ts | 6 + .../routers/static/InsuranceStaticRouter.d.ts | 6 + .../routers/static/ItemEventStaticRouter.d.ts | 6 + .../routers/static/LauncherStaticRouter.d.ts | 6 + .../routers/static/LocationStaticRouter.d.ts | 6 + .../routers/static/MatchStaticRouter.d.ts | 6 + .../routers/static/NotifierStaticRouter.d.ts | 6 + .../routers/static/PresetStaticRouter.d.ts | 6 + .../routers/static/ProfileStaticRouter.d.ts | 6 + .../routers/static/QuestStaticRouter.d.ts | 6 + .../routers/static/RagfairStaticRouter.d.ts | 6 + .../routers/static/TraderStaticRouter.d.ts | 6 + .../routers/static/WeatherStaticRouter.d.ts | 6 + .../server/types/servers/ConfigServer.d.ts | 14 + .../server/types/servers/DatabaseServer.d.ts | 6 + .../src/server/types/servers/HttpServer.d.ts | 49 + .../server/types/servers/RagfairServer.d.ts | 31 + .../src/server/types/servers/SaveServer.d.ts | 28 + .../server/types/services/FenceService.d.ts | 39 + .../types/services/HashCacheService.d.ts | 19 + .../types/services/InsuranceService.d.ts | 42 + .../types/services/MatchLocationService.d.ts | 8 + .../types/services/ModCompilerService.d.ts | 20 + .../types/services/NotificationService.d.ts | 21 + .../server/types/services/PaymentService.d.ts | 49 + .../server/types/services/PlayerService.d.ts | 22 + .../services/RagfairCategoriesService.d.ts | 10 + .../services/RagfairLinkedItemService.d.ts | 10 + .../types/services/RagfairOfferService.d.ts | 66 + .../types/services/RagfairPriceService.d.ts | 32 + .../services/RagfairRequiredItemsService.d.ts | 12 + .../types/services/TraderAssortService.d.ts | 6 + .../mod/dynamicRouter/DynamicRouterMod.d.ts | 6 + .../DynamicRouterModService.d.ts | 7 + .../services/mod/image/imageRouteService.d.ts | 6 + .../types/services/mod/onLoad/OnLoadMod.d.ts | 8 + .../services/mod/onLoad/OnLoadModService.d.ts | 6 + .../services/mod/onUpdate/OnUpdateMod.d.ts | 8 + .../mod/onUpdate/OnUpdateModService.d.ts | 6 + .../mod/staticRouter/StaticRouterMod.d.ts | 6 + .../staticRouter/StaticRouterModService.d.ts | 7 + .../src/server/types/utils/App.d.ts | 14 + .../src/server/types/utils/AyncQueue.d.ts | 7 + .../server/types/utils/DatabaseImporter.d.ts | 18 + .../src/server/types/utils/HashUtil.d.ts | 11 + .../server/types/utils/HttpResponseUtil.d.ts | 16 + .../src/server/types/utils/JsonUtil.d.ts | 25 + .../src/server/types/utils/Logger.d.ts | 51 + .../src/server/types/utils/MathUtil.d.ts | 53 + .../src/server/types/utils/ObjectId.d.ts | 14 + .../src/server/types/utils/RandomUtil.d.ts | 153 +++ .../src/server/types/utils/TimeUtil.d.ts | 8 + .../src/server/types/utils/UUidGenerator.d.ts | 4 + .../src/server/types/utils/VFS.d.ts | 55 + .../src/server/types/utils/Watermark.d.ts | 41 + .../types/utils/decorators/Singleton.d.ts | 4 + .../types/utils/decorators/constructor.d.ts | 4 + .../mods/KcY-SeeItemValue 1.2.1/package.json | 20 +- .../mods/KcY-SeeItemValue 1.2.1/src/mod.ts | 38 +- .../types/callbacks/BotCallbacks.d.ts | 4 +- .../types/callbacks/BundleCallbacks.d.ts | 13 +- .../callbacks/CustomizationCallbacks.d.ts | 6 +- .../types/callbacks/DataCallbacks.d.ts | 4 +- .../types/callbacks/DialogueCallbacks.d.ts | 8 +- .../types/callbacks/GameCallbacks.d.ts | 6 +- .../types/callbacks/HandbookCallbacks.d.ts | 2 +- .../types/callbacks/HealthCallbacks.d.ts | 6 +- .../types/callbacks/HideoutCallbacks.d.ts | 7 +- .../types/callbacks/HttpCallbacks.d.ts | 2 +- .../types/callbacks/InraidCallbacks.d.ts | 12 +- .../types/callbacks/InsuranceCallbacks.d.ts | 11 +- .../types/callbacks/InventoryCallbacks.d.ts | 2 +- .../types/callbacks/ItemEventCallbacks.d.ts | 4 +- .../types/callbacks/LauncherCallbacks.d.ts | 8 +- .../types/callbacks/LocationCallbacks.d.ts | 4 +- .../types/callbacks/MatchCallbacks.d.ts | 8 +- .../types/callbacks/ModCallbacks.d.ts | 13 +- .../types/callbacks/NoteCallbacks.d.ts | 2 +- .../types/callbacks/NotifierCallbacks.d.ts | 8 +- .../types/callbacks/PresetBuildCallbacks.d.ts | 4 +- .../types/callbacks/PresetCallbacks.d.ts | 2 +- .../types/callbacks/ProfileCallbacks.d.ts | 6 +- .../types/callbacks/QuestCallbacks.d.ts | 6 +- .../types/callbacks/RagfairCallbacks.d.ts | 17 +- .../types/callbacks/RepairCallbacks.d.ts | 2 +- .../types/callbacks/SaveCallbacks.d.ts | 2 +- .../types/callbacks/TradeCallbacks.d.ts | 2 +- .../types/callbacks/TraderCallbacks.d.ts | 4 +- .../types/callbacks/WeatherCallbacks.d.ts | 4 +- .../types/callbacks/WishlistCallbacks.d.ts | 2 +- .../types/controllers/BotController.d.ts | 37 +- .../controllers/CustomizationController.d.ts | 22 +- .../types/controllers/DialogueController.d.ts | 17 +- .../types/controllers/GameController.d.ts | 28 +- .../types/controllers/HandbookController.d.ts | 6 +- .../types/controllers/HealthController.d.ts | 12 +- .../types/controllers/HideoutController.d.ts | 71 +- .../types/controllers/InraidController.d.ts | 41 +- .../controllers/InsuranceController.d.ts | 45 +- .../controllers/InventoryController.d.ts | 18 +- .../types/controllers/LauncherController.d.ts | 29 +- .../types/controllers/LocationController.d.ts | 14 +- .../types/controllers/MatchController.d.ts | 18 +- .../types/controllers/NoteController.d.ts | 4 +- .../types/controllers/NotifierController.d.ts | 10 +- .../controllers/PresetBuildController.d.ts | 14 +- .../types/controllers/PresetController.d.ts | 4 +- .../types/controllers/ProfileController.d.ts | 24 +- .../types/controllers/QuestController.d.ts | 41 +- .../types/controllers/RagfairController.d.ts | 49 +- .../types/controllers/RepairController.d.ts | 37 +- .../RepeatableQuestController.d.ts | 35 +- .../types/controllers/TradeController.d.ts | 10 +- .../types/controllers/TraderController.d.ts | 16 +- .../types/controllers/WeatherController.d.ts | 9 +- .../types/controllers/WishlistController.d.ts | 2 +- .../types/generators/BotGenerator.d.ts | 70 +- .../generators/BotInventoryGenerator.d.ts | 22 +- .../types/generators/BotLootGenerator.d.ts | 34 +- .../types/generators/BotWeaponGenerator.d.ts | 26 +- .../types/generators/LocationGenerator.d.ts | 58 +- .../types/generators/PMCLootGenerator.d.ts | 13 +- .../generators/RagfairAssortGenerator.d.ts | 26 +- .../generators/RagfairOfferGenerator.d.ts | 75 +- .../types/generators/WeatherGenerator.d.ts | 19 +- .../types/helpers/AssortHelper.d.ts | 32 +- .../types/helpers/BotGeneratorHelper.d.ts | 94 +- .../types/helpers/BotHelper.d.ts | 38 +- .../types/helpers/ContainerHelper.d.ts | 2 +- .../types/helpers/DialogueHelper.d.ts | 19 +- .../types/helpers/DurabilityLimitsHelper.d.ts | 31 +- .../types/helpers/ExtendedProfileHelper.d.ts | 18 +- .../types/helpers/GameEventHelper.d.ts | 2 +- .../types/helpers/HandbookHelper.d.ts | 2 +- .../types/helpers/HealthHelper.d.ts | 30 +- .../types/helpers/HideoutHelper.d.ts | 58 +- .../types/helpers/HttpServerHelper.d.ts | 17 +- .../types/helpers/InRaidHelper.d.ts | 16 +- .../types/helpers/InventoryHelper.d.ts | 48 +- .../types/helpers/ItemHelper.d.ts | 103 +- .../types/helpers/NotificationSendHelper.d.ts | 4 +- .../types/helpers/NotifierHelper.d.ts | 4 +- .../types/helpers/PresetHelper.d.ts | 4 +- .../types/helpers/ProfileHelper.d.ts | 4 +- .../types/helpers/QuestConditionHelper.d.ts | 2 +- .../types/helpers/QuestHelper.d.ts | 33 +- .../types/helpers/RagfairHelper.d.ts | 23 +- .../types/helpers/RagfairOfferHelper.d.ts | 47 +- .../types/helpers/RagfairSellHelper.d.ts | 11 +- .../types/helpers/RagfairServerHelper.d.ts | 35 +- .../types/helpers/RagfairSortHelper.d.ts | 12 +- .../types/helpers/RagfairTaxHelper.d.ts | 11 +- .../types/helpers/RepairHelper.d.ts | 22 +- .../types/helpers/SecureContainerHelper.d.ts | 2 +- .../types/helpers/TradeHelper.d.ts | 37 +- .../types/helpers/TraderAssortHelper.d.ts | 41 +- .../types/helpers/TraderHelper.d.ts | 54 +- .../types/ide/BleedingEdgeEntry.d.ts | 1 + .../types/loaders/BundleLoader.d.ts | 12 +- .../types/loaders/DelayedModLoader.d.ts | 17 +- .../types/loaders/InitialModLoader.d.ts | 71 +- .../models/eft/common/ILocationBase.d.ts | 9 + .../types/models/eft/common/IPmcData.d.ts | 6 +- .../models/eft/common/tables/IBotType.d.ts | 2 + .../models/eft/common/tables/IQuest.d.ts | 36 +- .../dialog/IGetFriendListDataResponse.d.ts | 2 +- .../dialog/IGetMailDialogViewRequestData.d.ts | 2 +- .../eft/dialog/ISendMessageRequest.d.ts | 2 +- .../types/models/eft/profile/IAkiProfile.d.ts | 21 +- .../models/eft/ragfair/IRagfairOffer.d.ts | 2 +- .../types/models/enums/BaseClasses.d.ts | 84 ++ .../types/models/enums/ConfigTypes.d.ts | 18 + .../types/models/enums/ELocationName.d.ts | 11 + .../types/models/enums/EquipmentSlots.d.ts | 16 + .../types/models/enums/HideoutAreas.d.ts | 25 + .../types/models/enums/MemberCategory.d.ts | 13 + .../types/models/enums/MessageType.d.ts | 16 + .../types/models/enums/Money.d.ts | 5 + .../types/models/enums/Traders.d.ts | 10 + .../types/models/spt/config/IBotConfig.d.ts | 2 + .../types/models/spt/config/IQuestConfig.d.ts | 12 +- .../types/models/spt/helpers/Traders.d.ts | 2 +- .../types/models/spt/mod/IMod.d.ts | 2 +- .../types/models/spt/mod/IModLoader.d.ts | 1 - .../types/models/spt/server/IHttpServer.d.ts | 1 + .../types/models/spt/server/ILocaleBase.d.ts | 2 +- .../types/routers/HttpRouter.d.ts | 15 +- .../types/routers/ImageRouter.d.ts | 9 +- .../types/routers/ItemEventRouter.d.ts | 12 +- .../routers/dynamic/BotDynamicRouter.d.ts | 2 +- .../routers/dynamic/BundleDynamicRouter.d.ts | 2 +- .../dynamic/CustomizationDynamicRouter.d.ts | 2 +- .../routers/dynamic/DataDynamicRouter.d.ts | 2 +- .../routers/dynamic/HttpDynamicRouter.d.ts | 2 +- .../routers/dynamic/InraidDynamicRouter.d.ts | 2 +- .../dynamic/LocationDynamicRouter.d.ts | 2 +- .../dynamic/NotifierDynamicRouter.d.ts | 2 +- .../routers/dynamic/TraderDynamicRouter.d.ts | 2 +- .../CustomizationItemEventRouter.d.ts | 2 +- .../item_events/HealthItemEventRouter.d.ts | 2 +- .../item_events/HideoutItemEventRouter.d.ts | 2 +- .../item_events/InsuranceItemEventRouter.d.ts | 2 +- .../item_events/InventoryItemEventRouter.d.ts | 2 +- .../item_events/NoteItemEventRouter.d.ts | 2 +- .../PresetBuildItemEventRouter.d.ts | 2 +- .../item_events/QuestItemEventRouter.d.ts | 2 +- .../item_events/RagfairItemEventRouter.d.ts | 2 +- .../item_events/RepairItemEventRouter.d.ts | 2 +- .../item_events/TradeItemEventRouter.d.ts | 2 +- .../item_events/WishlistItemEventRouter.d.ts | 2 +- .../routers/serializers/BundleSerializer.d.ts | 8 +- .../routers/serializers/ImageSerializer.d.ts | 2 +- .../routers/serializers/NotifySerializer.d.ts | 6 +- .../types/routers/static/BotStaticRouter.d.ts | 2 +- .../routers/static/BundleStaticRouter.d.ts | 2 +- .../static/CustomizationStaticRouter.d.ts | 2 +- .../routers/static/DataStaticRouter.d.ts | 2 +- .../routers/static/DialogStaticRouter.d.ts | 2 +- .../routers/static/GameStaticRouter.d.ts | 2 +- .../routers/static/HealthStaticRouter.d.ts | 2 +- .../routers/static/InraidStaticRouter.d.ts | 2 +- .../routers/static/InsuranceStaticRouter.d.ts | 2 +- .../routers/static/ItemEventStaticRouter.d.ts | 2 +- .../routers/static/LauncherStaticRouter.d.ts | 2 +- .../routers/static/LocationStaticRouter.d.ts | 2 +- .../routers/static/MatchStaticRouter.d.ts | 2 +- .../routers/static/NotifierStaticRouter.d.ts | 2 +- .../routers/static/PresetStaticRouter.d.ts | 2 +- .../routers/static/ProfileStaticRouter.d.ts | 2 +- .../routers/static/QuestStaticRouter.d.ts | 2 +- .../routers/static/RagfairStaticRouter.d.ts | 2 +- .../routers/static/TraderStaticRouter.d.ts | 2 +- .../routers/static/WeatherStaticRouter.d.ts | 2 +- .../types/servers/ConfigServer.d.ts | 28 +- .../types/servers/DatabaseServer.d.ts | 2 +- .../types/servers/HttpServer.d.ts | 36 +- .../types/servers/RagfairServer.d.ts | 43 +- .../types/servers/SaveServer.d.ts | 18 +- .../types/services/FenceService.d.ts | 29 +- .../types/services/HashCacheService.d.ts | 14 +- .../types/services/InsuranceService.d.ts | 27 +- .../types/services/MatchLocationService.d.ts | 4 +- .../types/services/ModCompilerService.d.ts | 21 +- .../types/services/NotificationService.d.ts | 2 +- .../types/services/PaymentService.d.ts | 19 +- .../types/services/PlayerService.d.ts | 4 +- .../services/RagfairCategoriesService.d.ts | 2 +- .../services/RagfairLinkedItemService.d.ts | 9 +- .../types/services/RagfairOfferService.d.ts | 54 +- .../types/services/RagfairPriceService.d.ts | 26 +- .../services/RagfairRequiredItemsService.d.ts | 8 +- .../types/services/TraderAssortService.d.ts | 2 +- .../services/mod/image/imageRouteService.d.ts | 6 + .../services/mod/onLoad/OnLoadModService.d.ts | 2 +- .../mod/onUpdate/OnUpdateModService.d.ts | 2 +- .../staticRouter/StaticRouterModService.d.ts | 2 +- .../types/utils/App.d.ts | 12 +- .../types/utils/AyncQueue.d.ts | 2 +- .../types/utils/DatabaseImporter.d.ts | 10 +- .../types/utils/HashUtil.d.ts | 2 +- .../types/utils/HttpResponseUtil.d.ts | 4 +- .../types/utils/JsonUtil.d.ts | 8 +- .../types/utils/Logger.d.ts | 42 +- .../types/utils/ObjectId.d.ts | 12 +- .../types/utils/RandomUtil.d.ts | 4 +- .../types/utils/VFS.d.ts | 7 +- .../types/utils/Watermark.d.ts | 31 +- KcY-SeeItemValue/itemValue/Patches.cs | 11 +- KcY-SeeItemValue/itemValue/itemValueMod.cs | 2 +- .../itemValue/server/.eslintignore | 9 + .../itemValue/server/.eslintrc.json | 75 ++ KcY-SeeItemValue/itemValue/server/LICENSE | 34 + .../itemValue/server/dist/package.json | 26 + .../itemValue/server/dist/src/config.json | 4 + .../itemValue/server/dist/src/mod.ts | 155 +++ .../itemValue/server/dist/types/Program.d.ts | 4 + .../itemValue/server/dist/types/TYPES.d.ts | 3 + .../itemValue/server/dist/types/Utils.d.ts | 0 .../dist/types/callbacks/BotCallbacks.d.ts | 15 + .../dist/types/callbacks/BundleCallbacks.d.ts | 18 + .../callbacks/CustomizationCallbacks.d.ts | 23 + .../dist/types/callbacks/DataCallbacks.d.ts | 32 + .../types/callbacks/DialogueCallbacks.d.ts | 45 + .../dist/types/callbacks/GameCallbacks.d.ts | 24 + .../types/callbacks/HandbookCallbacks.d.ts | 8 + .../dist/types/callbacks/HealthCallbacks.d.ts | 20 + .../types/callbacks/HideoutCallbacks.d.ts | 33 + .../dist/types/callbacks/HttpCallbacks.d.ts | 9 + .../dist/types/callbacks/InraidCallbacks.d.ts | 23 + .../types/callbacks/InsuranceCallbacks.d.ts | 24 + .../types/callbacks/InventoryCallbacks.d.ts | 39 + .../types/callbacks/ItemEventCallbacks.d.ts | 11 + .../types/callbacks/LauncherCallbacks.d.ts | 28 + .../types/callbacks/LocationCallbacks.d.ts | 14 + .../dist/types/callbacks/MatchCallbacks.d.ts | 35 + .../dist/types/callbacks/ModCallbacks.d.ts | 22 + .../dist/types/callbacks/NoteCallbacks.d.ts | 11 + .../types/callbacks/NotifierCallbacks.d.ts | 24 + .../types/callbacks/PresetBuildCallbacks.d.ts | 15 + .../dist/types/callbacks/PresetCallbacks.d.ts | 8 + .../types/callbacks/ProfileCallbacks.d.ts | 30 + .../dist/types/callbacks/QuestCallbacks.d.ts | 26 + .../types/callbacks/RagfairCallbacks.d.ts | 39 + .../dist/types/callbacks/RepairCallbacks.d.ts | 11 + .../dist/types/callbacks/SaveCallbacks.d.ts | 9 + .../dist/types/callbacks/TradeCallbacks.d.ts | 11 + .../dist/types/callbacks/TraderCallbacks.d.ts | 18 + .../types/callbacks/WeatherCallbacks.d.ts | 10 + .../types/callbacks/WishlistCallbacks.d.ts | 10 + .../dist/types/controllers/BotController.d.ts | 35 + .../controllers/CustomizationController.d.ts | 22 + .../types/controllers/DialogueController.d.ts | 25 + .../types/controllers/GameController.d.ts | 32 + .../types/controllers/HandbookController.d.ts | 8 + .../types/controllers/HealthController.d.ts | 25 + .../types/controllers/HideoutController.d.ts | 57 + .../types/controllers/InraidController.d.ts | 31 + .../controllers/InsuranceController.d.ts | 38 + .../controllers/InventoryController.d.ts | 107 ++ .../types/controllers/LauncherController.d.ts | 28 + .../types/controllers/LocationController.d.ts | 18 + .../types/controllers/MatchController.d.ts | 30 + .../types/controllers/NoteController.d.ts | 12 + .../types/controllers/NotifierController.d.ts | 22 + .../controllers/PresetBuildController.d.ts | 18 + .../types/controllers/PresetController.d.ts | 8 + .../types/controllers/ProfileController.d.ts | 34 + .../types/controllers/QuestController.d.ts | 38 + .../types/controllers/RagfairController.d.ts | 70 + .../types/controllers/RepairController.d.ts | 41 + .../RepeatableQuestController.d.ts | 217 +++ .../types/controllers/TradeController.d.ts | 21 + .../types/controllers/TraderController.d.ts | 26 + .../types/controllers/WeatherController.d.ts | 11 + .../types/controllers/WishlistController.d.ts | 10 + .../server/dist/types/di/Container.d.ts | 14 + .../server/dist/types/di/OnLoad.d.ts | 4 + .../server/dist/types/di/OnLoadOnUpdate.d.ts | 7 + .../server/dist/types/di/OnUpdate.d.ts | 4 + .../server/dist/types/di/Router.d.ts | 40 + .../server/dist/types/di/Serializer.d.ts | 5 + .../dist/types/generators/BotGenerator.d.ts | 46 + .../generators/BotInventoryGenerator.d.ts | 24 + .../types/generators/BotLootGenerator.d.ts | 29 + .../types/generators/BotWeaponGenerator.d.ts | 46 + .../types/generators/LocationGenerator.d.ts | 46 + .../types/generators/PMCLootGenerator.d.ts | 15 + .../generators/RagfairAssortGenerator.d.ts | 25 + .../generators/RagfairOfferGenerator.d.ts | 60 + .../types/generators/WeatherGenerator.d.ts | 20 + .../dist/types/helpers/AssortHelper.d.ts | 36 + .../types/helpers/BotGeneratorHelper.d.ts | 95 ++ .../server/dist/types/helpers/BotHelper.d.ts | 44 + .../dist/types/helpers/ContainerHelper.d.ts | 12 + .../dist/types/helpers/DialogueHelper.d.ts | 21 + .../types/helpers/DurabilityLimitsHelper.d.ts | 26 + .../types/helpers/ExtendedProfileHelper.d.ts | 22 + .../dist/types/helpers/GameEventHelper.d.ts | 9 + .../dist/types/helpers/HandbookHelper.d.ts | 33 + .../dist/types/helpers/HealthHelper.d.ts | 27 + .../dist/types/helpers/HideoutHelper.d.ts | 68 + .../dist/types/helpers/HttpServerHelper.d.ts | 23 + .../dist/types/helpers/InRaidHelper.d.ts | 33 + .../dist/types/helpers/InventoryHelper.d.ts | 85 ++ .../server/dist/types/helpers/ItemHelper.d.ts | 147 +++ .../types/helpers/NotificationSendHelper.d.ts | 12 + .../dist/types/helpers/NotifierHelper.d.ts | 17 + .../dist/types/helpers/PaymentHelper.d.ts | 14 + .../dist/types/helpers/PresetHelper.d.ts | 14 + .../dist/types/helpers/ProfileHelper.d.ts | 33 + .../types/helpers/QuestConditionHelper.d.ts | 7 + .../dist/types/helpers/QuestHelper.d.ts | 69 + .../dist/types/helpers/RagfairHelper.d.ts | 44 + .../types/helpers/RagfairOfferHelper.d.ts | 52 + .../dist/types/helpers/RagfairSellHelper.d.ts | 16 + .../types/helpers/RagfairServerHelper.d.ts | 46 + .../dist/types/helpers/RagfairSortHelper.d.ts | 12 + .../dist/types/helpers/RagfairTaxHelper.d.ts | 16 + .../dist/types/helpers/RepairHelper.d.ts | 22 + .../types/helpers/SecureContainerHelper.d.ts | 13 + .../dist/types/helpers/TradeHelper.d.ts | 44 + .../types/helpers/TraderAssortHelper.d.ts | 42 + .../dist/types/helpers/TraderHelper.d.ts | 53 + .../dist/types/helpers/UtilityHelper.d.ts | 3 + .../types/helpers/WeightedRandomHelper.d.ts | 28 + .../dist/types/ide/BleedingEdgeEntry.d.ts | 1 + .../server/dist/types/ide/Compiler.d.ts | 1 + .../server/dist/types/ide/DebugEntry.d.ts | 1 + .../server/dist/types/ide/ReleaseEntry.d.ts | 1 + .../server/dist/types/ide/TestEntry.d.ts | 1 + .../dist/types/loaders/BundleLoader.d.ts | 22 + .../dist/types/loaders/DelayedModLoader.d.ts | 21 + .../dist/types/loaders/InitialModLoader.d.ts | 64 + .../eft/bot/IGenerateBotsRequestData.d.ts | 8 + .../models/eft/common/IEmptyRequestData.d.ts | 2 + .../types/models/eft/common/IGlobals.d.ts | 1176 +++++++++++++++++ .../types/models/eft/common/ILocation.d.ts | 6 + .../models/eft/common/ILocationBase.d.ts | 198 +++ .../ILocationsSourceDestinationBase.d.ts | 9 + .../types/models/eft/common/ILooseLoot.d.ts | 45 + .../models/eft/common/IMetricsTableData.d.ts | 7 + .../types/models/eft/common/IPmcData.d.ts | 341 +++++ .../models/eft/common/MemberCategory.d.ts | 13 + .../request/IBaseInteractionRequestData.d.ts | 9 + .../models/eft/common/tables/IBotBase.d.ts | 101 ++ .../models/eft/common/tables/IBotCore.d.ts | 133 ++ .../models/eft/common/tables/IBotType.d.ts | 176 +++ .../eft/common/tables/ICustomizationItem.d.ts | 33 + .../eft/common/tables/IHandbookBase.d.ts | 16 + .../types/models/eft/common/tables/IItem.d.ts | 108 ++ .../eft/common/tables/ILocationsBase.d.ts | 10 + .../models/eft/common/tables/ILootBase.d.ts | 64 + .../models/eft/common/tables/IQuest.d.ts | 110 ++ .../eft/common/tables/IRepeatableQuests.d.ts | 219 +++ .../eft/common/tables/ITemplateItem.d.ts | 401 ++++++ .../models/eft/common/tables/ITrader.d.ts | 90 ++ .../IBuyClothingRequestData.d.ts | 10 + .../IWearClothingRequestData.d.ts | 4 + .../models/eft/dialog/IFriendRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsResponse.d.ts | 6 + .../dialog/IGetChatServerListRequestData.d.ts | 3 + .../dialog/IGetFriendListDataResponse.d.ts | 16 + .../dialog/IGetMailDialogInfoRequestData.d.ts | 3 + .../dialog/IGetMailDialogListRequestData.d.ts | 4 + .../dialog/IGetMailDialogViewRequestData.d.ts | 7 + .../IGetMailDialogViewResponseData.d.ts | 7 + .../eft/dialog/IPinDialogRequestData.d.ts | 3 + .../eft/dialog/IRemoveDialogRequestData.d.ts | 3 + .../eft/dialog/ISendMessageRequest.d.ts | 7 + .../eft/dialog/ISetDialogReadRequestData.d.ts | 3 + .../models/eft/game/IGameConfigResponse.d.ts | 19 + .../eft/game/IGameEmptyCrcRequestData.d.ts | 3 + .../eft/game/IVersionValidateRequestData.d.ts | 11 + .../health/IHealthTreatmentRequestData.d.ts | 29 + .../eft/health/IOffraidEatRequestData.d.ts | 7 + .../eft/health/IOffraidHealRequestData.d.ts | 18 + .../eft/health/ISyncHealthRequestData.d.ts | 21 + .../models/eft/hideout/HideoutAreasEnum.d.ts | 25 + .../HideoutUpgradeCompleteRequestData.d.ts | 5 + .../models/eft/hideout/IHideoutArea.d.ts | 40 + ...utContinousProductionStartRequestData.d.ts | 5 + .../eft/hideout/IHideoutProduction.d.ts | 20 + .../hideout/IHideoutPutItemInRequestData.d.ts | 10 + .../models/eft/hideout/IHideoutScavCase.d.ts | 21 + .../IHideoutScavCaseStartRequestData.d.ts | 15 + .../eft/hideout/IHideoutSettingsBase.d.ts | 6 + ...deoutSingleProductionStartRequestData.d.ts | 10 + .../IHideoutTakeItemOutRequestData.d.ts | 6 + .../IHideoutTakeProductionRequestData.d.ts | 5 + .../IHideoutToggleAreaRequestData.d.ts | 6 + .../IHideoutUpgradeCompleteRequestData.d.ts | 5 + .../hideout/IHideoutUpgradeRequestData.d.ts | 10 + .../httpResponse/IGetBodyResponseData.d.ts | 5 + .../eft/httpResponse/INullResponseData.d.ts | 5 + .../inRaid/IRegisterPlayerRequestData.d.ts | 5 + .../eft/inRaid/ISaveProgressRequestData.d.ts | 8 + .../IGetInsuranceCostRequestData.d.ts | 4 + .../eft/insurance/IInsureRequestData.d.ts | 6 + .../eft/inventory/IAddItemRequestData.d.ts | 4 + .../inventory/IInventoryAddRequestData.d.ts | 6 + .../IInventoryBaseActionRequestData.d.ts | 27 + .../inventory/IInventoryBindRequestData.d.ts | 6 + .../IInventoryCreateMarkerRequestData.d.ts | 12 + .../IInventoryDeleteMarkerRequestData.d.ts | 7 + .../IInventoryEditMarkerRequestData.d.ts | 14 + .../IInventoryExamineRequestData.d.ts | 10 + .../inventory/IInventoryFoldRequestData.d.ts | 6 + .../inventory/IInventoryMergeRequestData.d.ts | 6 + .../inventory/IInventoryMoveRequestData.d.ts | 6 + ...IInventoryReadEncyclopediaRequestData.d.ts | 5 + .../IInventoryRemoveRequestData.d.ts | 5 + .../inventory/IInventorySortRequestData.d.ts | 20 + .../inventory/IInventorySplitRequestData.d.ts | 7 + .../inventory/IInventorySwapRequestData.d.ts | 11 + .../inventory/IInventoryTagRequestData.d.ts | 7 + .../IInventoryToggleRequestData.d.ts | 6 + .../IInventoryTransferRequestData.d.ts | 7 + .../IEmptyItemEventRouterResponse.d.ts | 4 + .../eft/itemEvent/IItemEventRouterBase.d.ts | 67 + .../itemEvent/IItemEventRouterRequest.d.ts | 21 + .../itemEvent/IItemEventRouterResponse.d.ts | 3 + .../eft/launcher/IChangeRequestData.d.ts | 4 + .../launcher/IGetMiniProfileRequestData.d.ts | 4 + .../eft/launcher/ILoginRequestData.d.ts | 4 + .../models/eft/launcher/IMiniProfile.d.ts | 14 + .../models/eft/launcher/IRegisterData.d.ts | 4 + .../eft/launcher/IRemoveProfileData.d.ts | 2 + .../eft/location/IGetLocationRequestData.d.ts | 5 + .../eft/match/IEndOfflineRaidRequestData.d.ts | 6 + .../eft/match/IGetProfileRequestData.d.ts | 3 + .../match/IStartOffineRaidRequestData.d.ts | 27 + .../models/eft/notes/INoteActionData.d.ts | 10 + .../types/models/eft/notifier/INotifier.d.ts | 14 + .../notifier/ISelectProfileRequestData.d.ts | 3 + ...IPlayerIncrementSkillLevelRequestData.d.ts | 21 + .../IPresetBuildActionRequestData.d.ts | 25 + .../types/models/eft/profile/IAkiProfile.d.ts | 167 +++ .../IProfileChangeNicknameRequestData.d.ts | 3 + .../IProfileChangeVoiceRequestData.d.ts | 3 + .../profile/IProfileCreateRequestData.d.ts | 6 + .../eft/profile/ISearchFriendRequestData.d.ts | 3 + .../eft/profile/ISearchFriendResponse.d.ts | 9 + .../profile/IValidateNicknameRequestData.d.ts | 3 + .../eft/quests/IAcceptQuestRequestData.d.ts | 5 + .../eft/quests/ICompleteQuestRequestData.d.ts | 5 + .../eft/quests/IHandoverQuestRequestData.d.ts | 10 + .../eft/quests/IListQuestsRequestData.d.ts | 3 + .../quests/IRepeatableQuestChangeRequest.d.ts | 4 + .../eft/ragfair/IAddOfferRequestData.d.ts | 13 + .../eft/ragfair/IExtendOfferRequestData.d.ts | 4 + .../eft/ragfair/IGetItemPriceResult.d.ts | 5 + .../ragfair/IGetMarketPriceRequestData.d.ts | 3 + .../models/eft/ragfair/IGetOffersResult.d.ts | 7 + .../models/eft/ragfair/IRagfairOffer.d.ts | 42 + .../eft/ragfair/IRemoveOfferRequestData.d.ts | 4 + .../eft/ragfair/ISearchRequestData.d.ts | 32 + .../repair/IBaseRepairActionDataRequest.d.ts | 3 + .../eft/repair/IRepairActionDataRequest.d.ts | 10 + .../ITraderRepairActionDataRequest.d.ts | 10 + .../trade/IProcessBaseTradeRequestData.d.ts | 5 + .../trade/IProcessBuyTradeRequestData.d.ts | 14 + .../IProcessRagfairTradeRequestData.d.ts | 13 + .../trade/IProcessSellTradeRequestData.d.ts | 12 + .../models/eft/weather/IWeatherData.d.ts | 20 + .../eft/wishlist/IWishlistActionData.d.ts | 4 + .../dist/types/models/enums/BaseClasses.d.ts | 84 ++ .../dist/types/models/enums/ConfigTypes.d.ts | 18 + .../types/models/enums/ELocationName.d.ts | 11 + .../types/models/enums/EquipmentSlots.d.ts | 16 + .../dist/types/models/enums/HideoutAreas.d.ts | 25 + .../types/models/enums/MemberCategory.d.ts | 13 + .../dist/types/models/enums/MessageType.d.ts | 16 + .../server/dist/types/models/enums/Money.d.ts | 5 + .../dist/types/models/enums/Traders.d.ts | 10 + .../dist/types/models/external/mod.d.ts | 5 + .../dist/types/models/external/tsyringe.d.ts | 2 + .../dist/types/models/spt/bindings/Route.d.ts | 3 + .../models/spt/callbacks/IBotCallbacks.d.ts | 10 + .../spt/callbacks/IBundleCallbacks.d.ts | 5 + .../callbacks/ICustomizationCallbacks.d.ts | 12 + .../models/spt/callbacks/IDataCallbacks.d.ts | 26 + .../spt/callbacks/IDialogueCallbacks.d.ts | 34 + .../models/spt/callbacks/IGameCallbacks.d.ts | 16 + .../spt/callbacks/IHandbookCallbacks.d.ts | 3 + .../spt/callbacks/IHealthCallbacks.d.ts | 13 + .../spt/callbacks/IHideoutCallbacks.d.ts | 23 + .../models/spt/callbacks/IHttpCallbacks.d.ts | 5 + .../spt/callbacks/IInraidCallbacks.d.ts | 14 + .../spt/callbacks/IInsuranceCallbacks.d.ts | 10 + .../spt/callbacks/IInventoryCallbacks.d.ts | 36 + .../spt/callbacks/IItemEventCallbacks.d.ts | 6 + .../spt/callbacks/ILauncherCallbacks.d.ts | 20 + .../spt/callbacks/ILocationCallbacks.d.ts | 8 + .../models/spt/callbacks/IMatchCallbacks.d.ts | 25 + .../models/spt/callbacks/IModCallbacks.d.ts | 6 + .../models/spt/callbacks/INoteCallbacks.d.ts | 8 + .../spt/callbacks/INotifierCallbacks.d.ts | 17 + .../spt/callbacks/IPresetBuildCallbacks.d.ts | 10 + .../spt/callbacks/IPresetCallbacks.d.ts | 3 + .../spt/callbacks/IProfileCallbacks.d.ts | 21 + .../models/spt/callbacks/IQuestCallbacks.d.ts | 19 + .../spt/callbacks/IRagfairCallbacks.d.ts | 21 + .../spt/callbacks/IRepairCallbacks.d.ts | 8 + .../models/spt/callbacks/ISaveCallbacks.d.ts | 4 + .../models/spt/callbacks/ITradeCallbacks.d.ts | 8 + .../spt/callbacks/ITraderCallbacks.d.ts | 11 + .../spt/callbacks/IWeatherCallbacks.d.ts | 5 + .../spt/callbacks/IWishlistCallbacks.d.ts | 7 + .../models/spt/config/IAirdropConfig.d.ts | 20 + .../types/models/spt/config/IBaseConfig.d.ts | 3 + .../types/models/spt/config/IBotConfig.d.ts | 114 ++ .../types/models/spt/config/ICoreConfig.d.ts | 7 + .../models/spt/config/IHealthConfig.d.ts | 14 + .../models/spt/config/IHideoutConfig.d.ts | 27 + .../types/models/spt/config/IHttpConfig.d.ts | 6 + .../models/spt/config/IInRaidConfig.d.ts | 21 + .../models/spt/config/IInsuranceConfig.d.ts | 7 + .../models/spt/config/IInventoryConfig.d.ts | 5 + .../models/spt/config/ILocationConfig.d.ts | 24 + .../types/models/spt/config/IMatchConfig.d.ts | 5 + .../types/models/spt/config/IQuestConfig.d.ts | 77 ++ .../models/spt/config/IRagfairConfig.d.ts | 59 + .../models/spt/config/IRepairConfig.d.ts | 5 + .../models/spt/config/ITraderConfig.d.ts | 15 + .../models/spt/config/IWeatherConfig.d.ts | 21 + .../spt/controllers/IBotController.d.ts | 13 + .../models/spt/generators/IBotGenerator.d.ts | 10 + .../spt/generators/ILocationGenerator.d.ts | 6 + .../spt/generators/IPMCLootGenerator.d.ts | 4 + .../generators/IRagfairAssortGenerator.d.ts | 4 + .../generators/IRagfairOfferGenerator.d.ts | 6 + .../types/models/spt/helpers/Traders.d.ts | 10 + .../dist/types/models/spt/mod/IMod.d.ts | 10 + .../dist/types/models/spt/mod/IModLoader.d.ts | 7 + .../models/spt/mod/IPackageJsonData.d.ts | 11 + .../spt/ragfair/IRagfairServerPrices.d.ts | 4 + .../models/spt/server/IDatabaseTables.d.ts | 51 + .../types/models/spt/server/IHttpServer.d.ts | 12 + .../types/models/spt/server/ILocaleBase.d.ts | 61 + .../types/models/spt/server/ILocations.d.ts | 26 + .../types/models/spt/server/IServerBase.d.ts | 4 + .../models/spt/server/ISettingsBase.d.ts | 43 + .../types/models/spt/utils/IAsyncQueue.d.ts | 4 + .../dist/types/models/spt/utils/ICommand.d.ts | 4 + .../dist/types/models/spt/utils/ILogger.d.ts | 10 + .../models/spt/utils/IUuidGenerator.d.ts | 3 + .../server/dist/types/routers/HttpRouter.d.ts | 16 + .../dist/types/routers/ImageRouter.d.ts | 13 + .../dist/types/routers/ItemEventRouter.d.ts | 17 + .../routers/dynamic/BotDynamicRouter.d.ts | 6 + .../routers/dynamic/BundleDynamicRouter.d.ts | 6 + .../dynamic/CustomizationDynamicRouter.d.ts | 6 + .../routers/dynamic/DataDynamicRouter.d.ts | 6 + .../routers/dynamic/HttpDynamicRouter.d.ts | 6 + .../routers/dynamic/InraidDynamicRouter.d.ts | 7 + .../dynamic/LocationDynamicRouter.d.ts | 7 + .../dynamic/NotifierDynamicRouter.d.ts | 6 + .../routers/dynamic/TraderDynamicRouter.d.ts | 6 + .../CustomizationItemEventRouter.d.ts | 10 + .../item_events/HealthItemEventRouter.d.ts | 10 + .../item_events/HideoutItemEventRouter.d.ts | 10 + .../item_events/InsuranceItemEventRouter.d.ts | 10 + .../item_events/InventoryItemEventRouter.d.ts | 10 + .../item_events/NoteItemEventRouter.d.ts | 10 + .../PresetBuildItemEventRouter.d.ts | 10 + .../item_events/QuestItemEventRouter.d.ts | 10 + .../item_events/RagfairItemEventRouter.d.ts | 10 + .../item_events/RepairItemEventRouter.d.ts | 10 + .../item_events/TradeItemEventRouter.d.ts | 10 + .../item_events/WishlistItemEventRouter.d.ts | 10 + .../save_load/HealthSaveLoadRouter.d.ts | 7 + .../save_load/InraidSaveLoadRouter.d.ts | 7 + .../save_load/InsuranceSaveLoadRouter.d.ts | 7 + .../save_load/ProfileSaveLoadRouter.d.ts | 7 + .../routers/serializers/BundleSerializer.d.ts | 11 + .../routers/serializers/ImageSerializer.d.ts | 9 + .../routers/serializers/NotifySerializer.d.ts | 11 + .../types/routers/static/BotStaticRouter.d.ts | 6 + .../routers/static/BundleStaticRouter.d.ts | 6 + .../static/CustomizationStaticRouter.d.ts | 6 + .../routers/static/DataStaticRouter.d.ts | 6 + .../routers/static/DialogStaticRouter.d.ts | 6 + .../routers/static/GameStaticRouter.d.ts | 6 + .../routers/static/HealthStaticRouter.d.ts | 6 + .../routers/static/InraidStaticRouter.d.ts | 6 + .../routers/static/InsuranceStaticRouter.d.ts | 6 + .../routers/static/ItemEventStaticRouter.d.ts | 6 + .../routers/static/LauncherStaticRouter.d.ts | 6 + .../routers/static/LocationStaticRouter.d.ts | 6 + .../routers/static/MatchStaticRouter.d.ts | 6 + .../routers/static/NotifierStaticRouter.d.ts | 6 + .../routers/static/PresetStaticRouter.d.ts | 6 + .../routers/static/ProfileStaticRouter.d.ts | 6 + .../routers/static/QuestStaticRouter.d.ts | 6 + .../routers/static/RagfairStaticRouter.d.ts | 6 + .../routers/static/TraderStaticRouter.d.ts | 6 + .../routers/static/WeatherStaticRouter.d.ts | 6 + .../dist/types/servers/ConfigServer.d.ts | 14 + .../dist/types/servers/DatabaseServer.d.ts | 6 + .../server/dist/types/servers/HttpServer.d.ts | 49 + .../dist/types/servers/RagfairServer.d.ts | 31 + .../server/dist/types/servers/SaveServer.d.ts | 28 + .../dist/types/services/FenceService.d.ts | 39 + .../dist/types/services/HashCacheService.d.ts | 19 + .../dist/types/services/InsuranceService.d.ts | 42 + .../types/services/MatchLocationService.d.ts | 8 + .../types/services/ModCompilerService.d.ts | 20 + .../types/services/NotificationService.d.ts | 21 + .../dist/types/services/PaymentService.d.ts | 49 + .../dist/types/services/PlayerService.d.ts | 22 + .../services/RagfairCategoriesService.d.ts | 10 + .../services/RagfairLinkedItemService.d.ts | 10 + .../types/services/RagfairOfferService.d.ts | 66 + .../types/services/RagfairPriceService.d.ts | 32 + .../services/RagfairRequiredItemsService.d.ts | 12 + .../types/services/TraderAssortService.d.ts | 6 + .../mod/dynamicRouter/DynamicRouterMod.d.ts | 6 + .../DynamicRouterModService.d.ts | 7 + .../services/mod/image/imageRouteService.d.ts | 6 + .../types/services/mod/onLoad/OnLoadMod.d.ts | 8 + .../services/mod/onLoad/OnLoadModService.d.ts | 6 + .../services/mod/onUpdate/OnUpdateMod.d.ts | 8 + .../mod/onUpdate/OnUpdateModService.d.ts | 6 + .../mod/staticRouter/StaticRouterMod.d.ts | 6 + .../staticRouter/StaticRouterModService.d.ts | 7 + .../server/dist/types/utils/App.d.ts | 14 + .../server/dist/types/utils/AyncQueue.d.ts | 7 + .../dist/types/utils/DatabaseImporter.d.ts | 18 + .../server/dist/types/utils/HashUtil.d.ts | 11 + .../dist/types/utils/HttpResponseUtil.d.ts | 16 + .../server/dist/types/utils/JsonUtil.d.ts | 25 + .../server/dist/types/utils/Logger.d.ts | 51 + .../server/dist/types/utils/MathUtil.d.ts | 53 + .../server/dist/types/utils/ObjectId.d.ts | 14 + .../server/dist/types/utils/RandomUtil.d.ts | 153 +++ .../server/dist/types/utils/TimeUtil.d.ts | 8 + .../dist/types/utils/UUidGenerator.d.ts | 4 + .../server/dist/types/utils/VFS.d.ts | 55 + .../server/dist/types/utils/Watermark.d.ts | 41 + .../types/utils/decorators/Singleton.d.ts | 4 + .../types/utils/decorators/constructor.d.ts | 4 + .../itemValue/server/mod.code-workspace | 12 + .../itemValue/server/package.json | 26 + .../itemValue/server/src/config.json | 4 + KcY-SeeItemValue/itemValue/server/src/mod.ts | 155 +++ .../itemValue/server}/tsconfig.json | 8 +- .../itemValue/server/types/Program.d.ts | 4 + .../itemValue/server/types/TYPES.d.ts | 3 + .../itemValue/server/types/Utils.d.ts | 0 .../server/types/callbacks/BotCallbacks.d.ts | 15 + .../types/callbacks/BundleCallbacks.d.ts | 18 + .../callbacks/CustomizationCallbacks.d.ts | 23 + .../server/types/callbacks/DataCallbacks.d.ts | 32 + .../types/callbacks/DialogueCallbacks.d.ts | 45 + .../server/types/callbacks/GameCallbacks.d.ts | 24 + .../types/callbacks/HandbookCallbacks.d.ts | 8 + .../types/callbacks/HealthCallbacks.d.ts | 20 + .../types/callbacks/HideoutCallbacks.d.ts | 33 + .../server/types/callbacks/HttpCallbacks.d.ts | 9 + .../types/callbacks/InraidCallbacks.d.ts | 23 + .../types/callbacks/InsuranceCallbacks.d.ts | 24 + .../types/callbacks/InventoryCallbacks.d.ts | 39 + .../types/callbacks/ItemEventCallbacks.d.ts | 11 + .../types/callbacks/LauncherCallbacks.d.ts | 28 + .../types/callbacks/LocationCallbacks.d.ts | 14 + .../types/callbacks/MatchCallbacks.d.ts | 35 + .../server/types/callbacks/ModCallbacks.d.ts | 22 + .../server/types/callbacks/NoteCallbacks.d.ts | 11 + .../types/callbacks/NotifierCallbacks.d.ts | 24 + .../types/callbacks/PresetBuildCallbacks.d.ts | 15 + .../types/callbacks/PresetCallbacks.d.ts | 8 + .../types/callbacks/ProfileCallbacks.d.ts | 30 + .../types/callbacks/QuestCallbacks.d.ts | 26 + .../types/callbacks/RagfairCallbacks.d.ts | 39 + .../types/callbacks/RepairCallbacks.d.ts | 11 + .../server/types/callbacks/SaveCallbacks.d.ts | 9 + .../types/callbacks/TradeCallbacks.d.ts | 11 + .../types/callbacks/TraderCallbacks.d.ts | 18 + .../types/callbacks/WeatherCallbacks.d.ts | 10 + .../types/callbacks/WishlistCallbacks.d.ts | 10 + .../types/controllers/BotController.d.ts | 35 + .../controllers/CustomizationController.d.ts | 22 + .../types/controllers/DialogueController.d.ts | 25 + .../types/controllers/GameController.d.ts | 32 + .../types/controllers/HandbookController.d.ts | 8 + .../types/controllers/HealthController.d.ts | 25 + .../types/controllers/HideoutController.d.ts | 57 + .../types/controllers/InraidController.d.ts | 31 + .../controllers/InsuranceController.d.ts | 38 + .../controllers/InventoryController.d.ts | 107 ++ .../types/controllers/LauncherController.d.ts | 28 + .../types/controllers/LocationController.d.ts | 18 + .../types/controllers/MatchController.d.ts | 30 + .../types/controllers/NoteController.d.ts | 12 + .../types/controllers/NotifierController.d.ts | 22 + .../controllers/PresetBuildController.d.ts | 18 + .../types/controllers/PresetController.d.ts | 8 + .../types/controllers/ProfileController.d.ts | 34 + .../types/controllers/QuestController.d.ts | 38 + .../types/controllers/RagfairController.d.ts | 70 + .../types/controllers/RepairController.d.ts | 41 + .../RepeatableQuestController.d.ts | 217 +++ .../types/controllers/TradeController.d.ts | 21 + .../types/controllers/TraderController.d.ts | 26 + .../types/controllers/WeatherController.d.ts | 11 + .../types/controllers/WishlistController.d.ts | 10 + .../itemValue/server/types/di/Container.d.ts | 14 + .../itemValue/server/types/di/OnLoad.d.ts | 4 + .../server/types/di/OnLoadOnUpdate.d.ts | 7 + .../itemValue/server/types/di/OnUpdate.d.ts | 4 + .../itemValue/server/types/di/Router.d.ts | 40 + .../itemValue/server/types/di/Serializer.d.ts | 5 + .../server/types/generators/BotGenerator.d.ts | 46 + .../generators/BotInventoryGenerator.d.ts | 24 + .../types/generators/BotLootGenerator.d.ts | 29 + .../types/generators/BotWeaponGenerator.d.ts | 46 + .../types/generators/LocationGenerator.d.ts | 46 + .../types/generators/PMCLootGenerator.d.ts | 15 + .../generators/RagfairAssortGenerator.d.ts | 25 + .../generators/RagfairOfferGenerator.d.ts | 60 + .../types/generators/WeatherGenerator.d.ts | 20 + .../server/types/helpers/AssortHelper.d.ts | 36 + .../types/helpers/BotGeneratorHelper.d.ts | 95 ++ .../server/types/helpers/BotHelper.d.ts | 44 + .../server/types/helpers/ContainerHelper.d.ts | 12 + .../server/types/helpers/DialogueHelper.d.ts | 21 + .../types/helpers/DurabilityLimitsHelper.d.ts | 26 + .../types/helpers/ExtendedProfileHelper.d.ts | 22 + .../server/types/helpers/GameEventHelper.d.ts | 9 + .../server/types/helpers/HandbookHelper.d.ts | 33 + .../server/types/helpers/HealthHelper.d.ts | 27 + .../server/types/helpers/HideoutHelper.d.ts | 68 + .../types/helpers/HttpServerHelper.d.ts | 23 + .../server/types/helpers/InRaidHelper.d.ts | 33 + .../server/types/helpers/InventoryHelper.d.ts | 85 ++ .../server/types/helpers/ItemHelper.d.ts | 147 +++ .../types/helpers/NotificationSendHelper.d.ts | 12 + .../server/types/helpers/NotifierHelper.d.ts | 17 + .../server/types/helpers/PaymentHelper.d.ts | 14 + .../server/types/helpers/PresetHelper.d.ts | 14 + .../server/types/helpers/ProfileHelper.d.ts | 33 + .../types/helpers/QuestConditionHelper.d.ts | 7 + .../server/types/helpers/QuestHelper.d.ts | 69 + .../server/types/helpers/RagfairHelper.d.ts | 44 + .../types/helpers/RagfairOfferHelper.d.ts | 52 + .../types/helpers/RagfairSellHelper.d.ts | 16 + .../types/helpers/RagfairServerHelper.d.ts | 46 + .../types/helpers/RagfairSortHelper.d.ts | 12 + .../types/helpers/RagfairTaxHelper.d.ts | 16 + .../server/types/helpers/RepairHelper.d.ts | 22 + .../types/helpers/SecureContainerHelper.d.ts | 13 + .../server/types/helpers/TradeHelper.d.ts | 44 + .../types/helpers/TraderAssortHelper.d.ts | 42 + .../server/types/helpers/TraderHelper.d.ts | 53 + .../server/types/helpers/UtilityHelper.d.ts | 3 + .../types/helpers/WeightedRandomHelper.d.ts | 28 + .../server/types/ide/BleedingEdgeEntry.d.ts | 1 + .../itemValue/server/types/ide/Compiler.d.ts | 1 + .../server/types/ide/DebugEntry.d.ts | 1 + .../server/types/ide/ReleaseEntry.d.ts | 1 + .../itemValue/server/types/ide/TestEntry.d.ts | 1 + .../server/types/loaders/BundleLoader.d.ts | 22 + .../types/loaders/DelayedModLoader.d.ts | 21 + .../types/loaders/InitialModLoader.d.ts | 64 + .../eft/bot/IGenerateBotsRequestData.d.ts | 8 + .../models/eft/common/IEmptyRequestData.d.ts | 2 + .../types/models/eft/common/IGlobals.d.ts | 1176 +++++++++++++++++ .../types/models/eft/common/ILocation.d.ts | 6 + .../models/eft/common/ILocationBase.d.ts | 198 +++ .../ILocationsSourceDestinationBase.d.ts | 9 + .../types/models/eft/common/ILooseLoot.d.ts | 45 + .../models/eft/common/IMetricsTableData.d.ts | 7 + .../types/models/eft/common/IPmcData.d.ts | 341 +++++ .../models/eft/common/MemberCategory.d.ts | 13 + .../request/IBaseInteractionRequestData.d.ts | 9 + .../models/eft/common/tables/IBotBase.d.ts | 101 ++ .../models/eft/common/tables/IBotCore.d.ts | 133 ++ .../models/eft/common/tables/IBotType.d.ts | 176 +++ .../eft/common/tables/ICustomizationItem.d.ts | 33 + .../eft/common/tables/IHandbookBase.d.ts | 16 + .../types/models/eft/common/tables/IItem.d.ts | 108 ++ .../eft/common/tables/ILocationsBase.d.ts | 10 + .../models/eft/common/tables/ILootBase.d.ts | 64 + .../models/eft/common/tables/IQuest.d.ts | 110 ++ .../eft/common/tables/IRepeatableQuests.d.ts | 219 +++ .../eft/common/tables/ITemplateItem.d.ts | 401 ++++++ .../models/eft/common/tables/ITrader.d.ts | 90 ++ .../IBuyClothingRequestData.d.ts | 10 + .../IWearClothingRequestData.d.ts | 4 + .../models/eft/dialog/IFriendRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsRequestData.d.ts | 3 + .../dialog/IGetAllAttachmentsResponse.d.ts | 6 + .../dialog/IGetChatServerListRequestData.d.ts | 3 + .../dialog/IGetFriendListDataResponse.d.ts | 16 + .../dialog/IGetMailDialogInfoRequestData.d.ts | 3 + .../dialog/IGetMailDialogListRequestData.d.ts | 4 + .../dialog/IGetMailDialogViewRequestData.d.ts | 7 + .../IGetMailDialogViewResponseData.d.ts | 7 + .../eft/dialog/IPinDialogRequestData.d.ts | 3 + .../eft/dialog/IRemoveDialogRequestData.d.ts | 3 + .../eft/dialog/ISendMessageRequest.d.ts | 7 + .../eft/dialog/ISetDialogReadRequestData.d.ts | 3 + .../models/eft/game/IGameConfigResponse.d.ts | 19 + .../eft/game/IGameEmptyCrcRequestData.d.ts | 3 + .../eft/game/IVersionValidateRequestData.d.ts | 11 + .../health/IHealthTreatmentRequestData.d.ts | 29 + .../eft/health/IOffraidEatRequestData.d.ts | 7 + .../eft/health/IOffraidHealRequestData.d.ts | 18 + .../eft/health/ISyncHealthRequestData.d.ts | 21 + .../models/eft/hideout/HideoutAreasEnum.d.ts | 25 + .../HideoutUpgradeCompleteRequestData.d.ts | 5 + .../models/eft/hideout/IHideoutArea.d.ts | 40 + ...utContinousProductionStartRequestData.d.ts | 5 + .../eft/hideout/IHideoutProduction.d.ts | 20 + .../hideout/IHideoutPutItemInRequestData.d.ts | 10 + .../models/eft/hideout/IHideoutScavCase.d.ts | 21 + .../IHideoutScavCaseStartRequestData.d.ts | 15 + .../eft/hideout/IHideoutSettingsBase.d.ts | 6 + ...deoutSingleProductionStartRequestData.d.ts | 10 + .../IHideoutTakeItemOutRequestData.d.ts | 6 + .../IHideoutTakeProductionRequestData.d.ts | 5 + .../IHideoutToggleAreaRequestData.d.ts | 6 + .../IHideoutUpgradeCompleteRequestData.d.ts | 5 + .../hideout/IHideoutUpgradeRequestData.d.ts | 10 + .../httpResponse/IGetBodyResponseData.d.ts | 5 + .../eft/httpResponse/INullResponseData.d.ts | 5 + .../inRaid/IRegisterPlayerRequestData.d.ts | 5 + .../eft/inRaid/ISaveProgressRequestData.d.ts | 8 + .../IGetInsuranceCostRequestData.d.ts | 4 + .../eft/insurance/IInsureRequestData.d.ts | 6 + .../eft/inventory/IAddItemRequestData.d.ts | 4 + .../inventory/IInventoryAddRequestData.d.ts | 6 + .../IInventoryBaseActionRequestData.d.ts | 27 + .../inventory/IInventoryBindRequestData.d.ts | 6 + .../IInventoryCreateMarkerRequestData.d.ts | 12 + .../IInventoryDeleteMarkerRequestData.d.ts | 7 + .../IInventoryEditMarkerRequestData.d.ts | 14 + .../IInventoryExamineRequestData.d.ts | 10 + .../inventory/IInventoryFoldRequestData.d.ts | 6 + .../inventory/IInventoryMergeRequestData.d.ts | 6 + .../inventory/IInventoryMoveRequestData.d.ts | 6 + ...IInventoryReadEncyclopediaRequestData.d.ts | 5 + .../IInventoryRemoveRequestData.d.ts | 5 + .../inventory/IInventorySortRequestData.d.ts | 20 + .../inventory/IInventorySplitRequestData.d.ts | 7 + .../inventory/IInventorySwapRequestData.d.ts | 11 + .../inventory/IInventoryTagRequestData.d.ts | 7 + .../IInventoryToggleRequestData.d.ts | 6 + .../IInventoryTransferRequestData.d.ts | 7 + .../IEmptyItemEventRouterResponse.d.ts | 4 + .../eft/itemEvent/IItemEventRouterBase.d.ts | 67 + .../itemEvent/IItemEventRouterRequest.d.ts | 21 + .../itemEvent/IItemEventRouterResponse.d.ts | 3 + .../eft/launcher/IChangeRequestData.d.ts | 4 + .../launcher/IGetMiniProfileRequestData.d.ts | 4 + .../eft/launcher/ILoginRequestData.d.ts | 4 + .../models/eft/launcher/IMiniProfile.d.ts | 14 + .../models/eft/launcher/IRegisterData.d.ts | 4 + .../eft/launcher/IRemoveProfileData.d.ts | 2 + .../eft/location/IGetLocationRequestData.d.ts | 5 + .../eft/match/IEndOfflineRaidRequestData.d.ts | 6 + .../eft/match/IGetProfileRequestData.d.ts | 3 + .../match/IStartOffineRaidRequestData.d.ts | 27 + .../models/eft/notes/INoteActionData.d.ts | 10 + .../types/models/eft/notifier/INotifier.d.ts | 14 + .../notifier/ISelectProfileRequestData.d.ts | 3 + ...IPlayerIncrementSkillLevelRequestData.d.ts | 21 + .../IPresetBuildActionRequestData.d.ts | 25 + .../types/models/eft/profile/IAkiProfile.d.ts | 167 +++ .../IProfileChangeNicknameRequestData.d.ts | 3 + .../IProfileChangeVoiceRequestData.d.ts | 3 + .../profile/IProfileCreateRequestData.d.ts | 6 + .../eft/profile/ISearchFriendRequestData.d.ts | 3 + .../eft/profile/ISearchFriendResponse.d.ts | 9 + .../profile/IValidateNicknameRequestData.d.ts | 3 + .../eft/quests/IAcceptQuestRequestData.d.ts | 5 + .../eft/quests/ICompleteQuestRequestData.d.ts | 5 + .../eft/quests/IHandoverQuestRequestData.d.ts | 10 + .../eft/quests/IListQuestsRequestData.d.ts | 3 + .../quests/IRepeatableQuestChangeRequest.d.ts | 4 + .../eft/ragfair/IAddOfferRequestData.d.ts | 13 + .../eft/ragfair/IExtendOfferRequestData.d.ts | 4 + .../eft/ragfair/IGetItemPriceResult.d.ts | 5 + .../ragfair/IGetMarketPriceRequestData.d.ts | 3 + .../models/eft/ragfair/IGetOffersResult.d.ts | 7 + .../models/eft/ragfair/IRagfairOffer.d.ts | 42 + .../eft/ragfair/IRemoveOfferRequestData.d.ts | 4 + .../eft/ragfair/ISearchRequestData.d.ts | 32 + .../repair/IBaseRepairActionDataRequest.d.ts | 3 + .../eft/repair/IRepairActionDataRequest.d.ts | 10 + .../ITraderRepairActionDataRequest.d.ts | 10 + .../trade/IProcessBaseTradeRequestData.d.ts | 5 + .../trade/IProcessBuyTradeRequestData.d.ts | 14 + .../IProcessRagfairTradeRequestData.d.ts | 13 + .../trade/IProcessSellTradeRequestData.d.ts | 12 + .../models/eft/weather/IWeatherData.d.ts | 20 + .../eft/wishlist/IWishlistActionData.d.ts | 4 + .../types/models/enums/BaseClasses.d.ts | 84 ++ .../types/models/enums/ConfigTypes.d.ts | 18 + .../types/models/enums/ELocationName.d.ts | 11 + .../types/models/enums/EquipmentSlots.d.ts | 16 + .../types/models/enums/HideoutAreas.d.ts | 25 + .../types/models/enums/MemberCategory.d.ts | 13 + .../types/models/enums/MessageType.d.ts | 16 + .../server/types/models/enums/Money.d.ts | 5 + .../server/types/models/enums/Traders.d.ts | 10 + .../server/types/models/external/mod.d.ts | 5 + .../types/models/external/tsyringe.d.ts | 2 + .../types/models/spt/bindings/Route.d.ts | 3 + .../models/spt/callbacks/IBotCallbacks.d.ts | 10 + .../spt/callbacks/IBundleCallbacks.d.ts | 5 + .../callbacks/ICustomizationCallbacks.d.ts | 12 + .../models/spt/callbacks/IDataCallbacks.d.ts | 26 + .../spt/callbacks/IDialogueCallbacks.d.ts | 34 + .../models/spt/callbacks/IGameCallbacks.d.ts | 16 + .../spt/callbacks/IHandbookCallbacks.d.ts | 3 + .../spt/callbacks/IHealthCallbacks.d.ts | 13 + .../spt/callbacks/IHideoutCallbacks.d.ts | 23 + .../models/spt/callbacks/IHttpCallbacks.d.ts | 5 + .../spt/callbacks/IInraidCallbacks.d.ts | 14 + .../spt/callbacks/IInsuranceCallbacks.d.ts | 10 + .../spt/callbacks/IInventoryCallbacks.d.ts | 36 + .../spt/callbacks/IItemEventCallbacks.d.ts | 6 + .../spt/callbacks/ILauncherCallbacks.d.ts | 20 + .../spt/callbacks/ILocationCallbacks.d.ts | 8 + .../models/spt/callbacks/IMatchCallbacks.d.ts | 25 + .../models/spt/callbacks/IModCallbacks.d.ts | 6 + .../models/spt/callbacks/INoteCallbacks.d.ts | 8 + .../spt/callbacks/INotifierCallbacks.d.ts | 17 + .../spt/callbacks/IPresetBuildCallbacks.d.ts | 10 + .../spt/callbacks/IPresetCallbacks.d.ts | 3 + .../spt/callbacks/IProfileCallbacks.d.ts | 21 + .../models/spt/callbacks/IQuestCallbacks.d.ts | 19 + .../spt/callbacks/IRagfairCallbacks.d.ts | 21 + .../spt/callbacks/IRepairCallbacks.d.ts | 8 + .../models/spt/callbacks/ISaveCallbacks.d.ts | 4 + .../models/spt/callbacks/ITradeCallbacks.d.ts | 8 + .../spt/callbacks/ITraderCallbacks.d.ts | 11 + .../spt/callbacks/IWeatherCallbacks.d.ts | 5 + .../spt/callbacks/IWishlistCallbacks.d.ts | 7 + .../models/spt/config/IAirdropConfig.d.ts | 20 + .../types/models/spt/config/IBaseConfig.d.ts | 3 + .../types/models/spt/config/IBotConfig.d.ts | 114 ++ .../types/models/spt/config/ICoreConfig.d.ts | 7 + .../models/spt/config/IHealthConfig.d.ts | 14 + .../models/spt/config/IHideoutConfig.d.ts | 27 + .../types/models/spt/config/IHttpConfig.d.ts | 6 + .../models/spt/config/IInRaidConfig.d.ts | 21 + .../models/spt/config/IInsuranceConfig.d.ts | 7 + .../models/spt/config/IInventoryConfig.d.ts | 5 + .../models/spt/config/ILocationConfig.d.ts | 24 + .../types/models/spt/config/IMatchConfig.d.ts | 5 + .../types/models/spt/config/IQuestConfig.d.ts | 77 ++ .../models/spt/config/IRagfairConfig.d.ts | 59 + .../models/spt/config/IRepairConfig.d.ts | 5 + .../models/spt/config/ITraderConfig.d.ts | 15 + .../models/spt/config/IWeatherConfig.d.ts | 21 + .../spt/controllers/IBotController.d.ts | 13 + .../models/spt/generators/IBotGenerator.d.ts | 10 + .../spt/generators/ILocationGenerator.d.ts | 6 + .../spt/generators/IPMCLootGenerator.d.ts | 4 + .../generators/IRagfairAssortGenerator.d.ts | 4 + .../generators/IRagfairOfferGenerator.d.ts | 6 + .../types/models/spt/helpers/Traders.d.ts | 10 + .../server/types/models/spt/mod/IMod.d.ts | 10 + .../types/models/spt/mod/IModLoader.d.ts | 7 + .../models/spt/mod/IPackageJsonData.d.ts | 11 + .../spt/ragfair/IRagfairServerPrices.d.ts | 4 + .../models/spt/server/IDatabaseTables.d.ts | 51 + .../types/models/spt/server/IHttpServer.d.ts | 12 + .../types/models/spt/server/ILocaleBase.d.ts | 61 + .../types/models/spt/server/ILocations.d.ts | 26 + .../types/models/spt/server/IServerBase.d.ts | 4 + .../models/spt/server/ISettingsBase.d.ts | 43 + .../types/models/spt/utils/IAsyncQueue.d.ts | 4 + .../types/models/spt/utils/ICommand.d.ts | 4 + .../types/models/spt/utils/ILogger.d.ts | 10 + .../models/spt/utils/IUuidGenerator.d.ts | 3 + .../server/types/routers/HttpRouter.d.ts | 16 + .../server/types/routers/ImageRouter.d.ts | 13 + .../server/types/routers/ItemEventRouter.d.ts | 17 + .../routers/dynamic/BotDynamicRouter.d.ts | 6 + .../routers/dynamic/BundleDynamicRouter.d.ts | 6 + .../dynamic/CustomizationDynamicRouter.d.ts | 6 + .../routers/dynamic/DataDynamicRouter.d.ts | 6 + .../routers/dynamic/HttpDynamicRouter.d.ts | 6 + .../routers/dynamic/InraidDynamicRouter.d.ts | 7 + .../dynamic/LocationDynamicRouter.d.ts | 7 + .../dynamic/NotifierDynamicRouter.d.ts | 6 + .../routers/dynamic/TraderDynamicRouter.d.ts | 6 + .../CustomizationItemEventRouter.d.ts | 10 + .../item_events/HealthItemEventRouter.d.ts | 10 + .../item_events/HideoutItemEventRouter.d.ts | 10 + .../item_events/InsuranceItemEventRouter.d.ts | 10 + .../item_events/InventoryItemEventRouter.d.ts | 10 + .../item_events/NoteItemEventRouter.d.ts | 10 + .../PresetBuildItemEventRouter.d.ts | 10 + .../item_events/QuestItemEventRouter.d.ts | 10 + .../item_events/RagfairItemEventRouter.d.ts | 10 + .../item_events/RepairItemEventRouter.d.ts | 10 + .../item_events/TradeItemEventRouter.d.ts | 10 + .../item_events/WishlistItemEventRouter.d.ts | 10 + .../save_load/HealthSaveLoadRouter.d.ts | 7 + .../save_load/InraidSaveLoadRouter.d.ts | 7 + .../save_load/InsuranceSaveLoadRouter.d.ts | 7 + .../save_load/ProfileSaveLoadRouter.d.ts | 7 + .../routers/serializers/BundleSerializer.d.ts | 11 + .../routers/serializers/ImageSerializer.d.ts | 9 + .../routers/serializers/NotifySerializer.d.ts | 11 + .../types/routers/static/BotStaticRouter.d.ts | 6 + .../routers/static/BundleStaticRouter.d.ts | 6 + .../static/CustomizationStaticRouter.d.ts | 6 + .../routers/static/DataStaticRouter.d.ts | 6 + .../routers/static/DialogStaticRouter.d.ts | 6 + .../routers/static/GameStaticRouter.d.ts | 6 + .../routers/static/HealthStaticRouter.d.ts | 6 + .../routers/static/InraidStaticRouter.d.ts | 6 + .../routers/static/InsuranceStaticRouter.d.ts | 6 + .../routers/static/ItemEventStaticRouter.d.ts | 6 + .../routers/static/LauncherStaticRouter.d.ts | 6 + .../routers/static/LocationStaticRouter.d.ts | 6 + .../routers/static/MatchStaticRouter.d.ts | 6 + .../routers/static/NotifierStaticRouter.d.ts | 6 + .../routers/static/PresetStaticRouter.d.ts | 6 + .../routers/static/ProfileStaticRouter.d.ts | 6 + .../routers/static/QuestStaticRouter.d.ts | 6 + .../routers/static/RagfairStaticRouter.d.ts | 6 + .../routers/static/TraderStaticRouter.d.ts | 6 + .../routers/static/WeatherStaticRouter.d.ts | 6 + .../server/types/servers/ConfigServer.d.ts | 14 + .../server/types/servers/DatabaseServer.d.ts | 6 + .../server/types/servers/HttpServer.d.ts | 49 + .../server/types/servers/RagfairServer.d.ts | 31 + .../server/types/servers/SaveServer.d.ts | 28 + .../server/types/services/FenceService.d.ts | 39 + .../types/services/HashCacheService.d.ts | 19 + .../types/services/InsuranceService.d.ts | 42 + .../types/services/MatchLocationService.d.ts | 8 + .../types/services/ModCompilerService.d.ts | 20 + .../types/services/NotificationService.d.ts | 21 + .../server/types/services/PaymentService.d.ts | 49 + .../server/types/services/PlayerService.d.ts | 22 + .../services/RagfairCategoriesService.d.ts | 10 + .../services/RagfairLinkedItemService.d.ts | 10 + .../types/services/RagfairOfferService.d.ts | 66 + .../types/services/RagfairPriceService.d.ts | 32 + .../services/RagfairRequiredItemsService.d.ts | 12 + .../types/services/TraderAssortService.d.ts | 6 + .../mod/dynamicRouter/DynamicRouterMod.d.ts | 6 + .../DynamicRouterModService.d.ts | 7 + .../services/mod/image/imageRouteService.d.ts | 6 + .../types/services/mod/onLoad/OnLoadMod.d.ts | 8 + .../services/mod/onLoad/OnLoadModService.d.ts | 6 + .../services/mod/onUpdate/OnUpdateMod.d.ts | 8 + .../mod/onUpdate/OnUpdateModService.d.ts | 6 + .../mod/staticRouter/StaticRouterMod.d.ts | 6 + .../staticRouter/StaticRouterModService.d.ts | 7 + .../itemValue/server/types/utils/App.d.ts | 14 + .../server/types/utils/AyncQueue.d.ts | 7 + .../server/types/utils/DatabaseImporter.d.ts | 18 + .../server/types/utils/HashUtil.d.ts | 11 + .../server/types/utils/HttpResponseUtil.d.ts | 16 + .../server/types/utils/JsonUtil.d.ts | 25 + .../itemValue/server/types/utils/Logger.d.ts | 51 + .../server/types/utils/MathUtil.d.ts | 53 + .../server/types/utils/ObjectId.d.ts | 14 + .../server/types/utils/RandomUtil.d.ts | 153 +++ .../server/types/utils/TimeUtil.d.ts | 8 + .../server/types/utils/UUidGenerator.d.ts | 4 + .../itemValue/server/types/utils/VFS.d.ts | 55 + .../server/types/utils/Watermark.d.ts | 41 + .../types/utils/decorators/Singleton.d.ts | 4 + .../types/utils/decorators/constructor.d.ts | 4 + Shared/EFT/Assembly-CSharp.dll | Bin 9389568 -> 9394176 bytes 3245 files changed, 71062 insertions(+), 4086 deletions(-) create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/ide/BleedingEdgeEntry.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/BaseClasses.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/ConfigTypes.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/ELocationName.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/EquipmentSlots.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/HideoutAreas.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/MemberCategory.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/MessageType.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/Money.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/Traders.d.ts create mode 100644 Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/image/imageRouteService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/.eslintignore create mode 100644 Faupi-HideoutMod/Project/src/server/.eslintrc.json rename Faupi-HideoutMod/Project/{Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect => src/server}/LICENSE (100%) create mode 100644 Faupi-HideoutMod/Project/src/server/config.jsonc create mode 100644 Faupi-HideoutMod/Project/src/server/dist/config.jsonc create mode 100644 Faupi-HideoutMod/Project/src/server/dist/package.json create mode 100644 Faupi-HideoutMod/Project/src/server/dist/res/icon_neededforhideout_small.png create mode 100644 Faupi-HideoutMod/Project/src/server/dist/res/translations.json create mode 100644 Faupi-HideoutMod/Project/src/server/dist/src/hideoutarchitect.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/Program.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/TYPES.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/Utils.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/BotCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/BundleCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/CustomizationCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/DataCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/DialogueCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/GameCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HandbookCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HealthCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HideoutCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HttpCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InraidCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InsuranceCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InventoryCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ItemEventCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/LauncherCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/LocationCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/MatchCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ModCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/NoteCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/NotifierCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/PresetBuildCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/PresetCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ProfileCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/QuestCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/RagfairCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/RepairCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/SaveCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/TradeCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/TraderCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/WeatherCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/callbacks/WishlistCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/BotController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/CustomizationController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/DialogueController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/GameController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/HandbookController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/HealthController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/HideoutController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/InraidController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/InsuranceController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/InventoryController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/LauncherController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/LocationController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/MatchController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/NoteController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/NotifierController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/PresetBuildController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/PresetController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/ProfileController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/QuestController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/RagfairController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/RepairController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/RepeatableQuestController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/TradeController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/TraderController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/WeatherController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/controllers/WishlistController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/di/Container.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/di/OnLoad.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/di/OnLoadOnUpdate.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/di/OnUpdate.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/di/Router.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/di/Serializer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/generators/BotGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/generators/BotInventoryGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/generators/BotLootGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/generators/BotWeaponGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/generators/LocationGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/generators/PMCLootGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/generators/RagfairAssortGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/generators/RagfairOfferGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/generators/WeatherGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/AssortHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/BotGeneratorHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/BotHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/ContainerHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/DialogueHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/DurabilityLimitsHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/ExtendedProfileHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/GameEventHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/HandbookHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/HealthHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/HideoutHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/HttpServerHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/InRaidHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/InventoryHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/ItemHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/NotificationSendHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/NotifierHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/PaymentHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/PresetHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/ProfileHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/QuestConditionHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/QuestHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairOfferHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairSellHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairServerHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairSortHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairTaxHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/RepairHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/SecureContainerHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/TradeHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/TraderAssortHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/TraderHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/UtilityHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/helpers/WeightedRandomHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/ide/BleedingEdgeEntry.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/ide/Compiler.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/ide/DebugEntry.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/ide/ReleaseEntry.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/ide/TestEntry.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/loaders/BundleLoader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/loaders/DelayedModLoader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/loaders/InitialModLoader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IEmptyRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IGlobals.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocation.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocationBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILooseLoot.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IMetricsTableData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IPmcData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/MemberCategory.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotCore.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotType.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IItem.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ILootBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IQuest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ITrader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IGameConfigResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutArea.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IMiniProfile.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IRegisterData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notes/INoteActionData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notifier/INotifier.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IAkiProfile.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/weather/IWeatherData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/enums/BaseClasses.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/enums/ConfigTypes.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/enums/ELocationName.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/enums/EquipmentSlots.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/enums/HideoutAreas.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/enums/MemberCategory.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/enums/MessageType.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/enums/Money.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/enums/Traders.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/external/mod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/external/tsyringe.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/bindings/Route.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IAirdropConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IBaseConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IBotConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ICoreConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHealthConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHideoutConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHttpConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInRaidConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInsuranceConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInventoryConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ILocationConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IMatchConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IQuestConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IRagfairConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IRepairConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ITraderConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IWeatherConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/controllers/IBotController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IBotGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/ILocationGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/helpers/Traders.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IModLoader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IPackageJsonData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IDatabaseTables.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IHttpServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ILocaleBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ILocations.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IServerBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ISettingsBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/IAsyncQueue.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/ICommand.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/ILogger.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/IUuidGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/HttpRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/ImageRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/ItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/BundleSerializer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/ImageSerializer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/NotifySerializer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/BotStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/BundleStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/CustomizationStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/DataStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/DialogStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/GameStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/HealthStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/InraidStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/InsuranceStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/ItemEventStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/LauncherStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/LocationStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/MatchStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/NotifierStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/PresetStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/ProfileStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/QuestStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/RagfairStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/TraderStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/routers/static/WeatherStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/servers/ConfigServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/servers/DatabaseServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/servers/HttpServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/servers/RagfairServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/servers/SaveServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/FenceService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/HashCacheService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/InsuranceService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/MatchLocationService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/ModCompilerService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/NotificationService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/PaymentService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/PlayerService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairCategoriesService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairLinkedItemService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairOfferService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairPriceService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairRequiredItemsService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/TraderAssortService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/mod/image/imageRouteService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/App.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/AyncQueue.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/DatabaseImporter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/HashUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/HttpResponseUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/JsonUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/Logger.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/MathUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/ObjectId.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/RandomUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/TimeUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/UUidGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/VFS.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/Watermark.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/decorators/Singleton.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/dist/types/utils/decorators/constructor.d.ts delete mode 100644 Faupi-HideoutMod/Project/src/server/hideoutarchitect.js create mode 100644 Faupi-HideoutMod/Project/src/server/mod.code-workspace create mode 100644 Faupi-HideoutMod/Project/src/server/package.json create mode 100644 Faupi-HideoutMod/Project/src/server/res/icon_neededforhideout_small.png create mode 100644 Faupi-HideoutMod/Project/src/server/res/translations.json create mode 100644 Faupi-HideoutMod/Project/src/server/src/hideoutarchitect.ts rename Faupi-HideoutMod/Project/{Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect => src/server}/tsconfig.json (72%) create mode 100644 Faupi-HideoutMod/Project/src/server/types/Program.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/TYPES.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/Utils.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/BotCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/BundleCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/CustomizationCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/DataCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/DialogueCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/GameCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/HandbookCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/HealthCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/HideoutCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/HttpCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/InraidCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/InsuranceCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/InventoryCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/ItemEventCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/LauncherCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/LocationCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/MatchCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/ModCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/NoteCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/NotifierCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/PresetBuildCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/PresetCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/ProfileCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/QuestCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/RagfairCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/RepairCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/SaveCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/TradeCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/TraderCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/WeatherCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/callbacks/WishlistCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/BotController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/CustomizationController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/DialogueController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/GameController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/HandbookController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/HealthController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/HideoutController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/InraidController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/InsuranceController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/InventoryController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/LauncherController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/LocationController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/MatchController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/NoteController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/NotifierController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/PresetBuildController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/PresetController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/ProfileController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/QuestController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/RagfairController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/RepairController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/RepeatableQuestController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/TradeController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/TraderController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/WeatherController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/controllers/WishlistController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/di/Container.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/di/OnLoad.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/di/OnLoadOnUpdate.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/di/OnUpdate.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/di/Router.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/di/Serializer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/generators/BotGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/generators/BotInventoryGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/generators/BotLootGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/generators/BotWeaponGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/generators/LocationGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/generators/PMCLootGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/generators/RagfairAssortGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/generators/RagfairOfferGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/generators/WeatherGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/AssortHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/BotGeneratorHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/BotHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/ContainerHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/DialogueHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/DurabilityLimitsHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/ExtendedProfileHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/GameEventHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/HandbookHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/HealthHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/HideoutHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/HttpServerHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/InRaidHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/InventoryHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/ItemHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/NotificationSendHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/NotifierHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/PaymentHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/PresetHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/ProfileHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/QuestConditionHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/QuestHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/RagfairHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/RagfairOfferHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/RagfairSellHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/RagfairServerHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/RagfairSortHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/RagfairTaxHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/RepairHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/SecureContainerHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/TradeHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/TraderAssortHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/TraderHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/UtilityHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/helpers/WeightedRandomHelper.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/ide/BleedingEdgeEntry.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/ide/Compiler.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/ide/DebugEntry.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/ide/ReleaseEntry.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/ide/TestEntry.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/loaders/BundleLoader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/loaders/DelayedModLoader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/loaders/InitialModLoader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/IEmptyRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/IGlobals.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocation.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocationBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILooseLoot.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/IMetricsTableData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/IPmcData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/MemberCategory.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotCore.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotType.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ICustomizationItem.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IHandbookBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IItem.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ILocationsBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ILootBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IQuest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IRepeatableQuests.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ITemplateItem.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ITrader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/customization/IBuyClothingRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/customization/IWearClothingRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IFriendRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IPinDialogRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/ISendMessageRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/game/IGameConfigResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/game/IVersionValidateRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/health/IOffraidEatRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/health/IOffraidHealRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/health/ISyncHealthRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/HideoutAreasEnum.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutArea.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutProduction.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutScavCase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/httpResponse/INullResponseData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/insurance/IInsureRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IAddItemRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySortRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IChangeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/ILoginRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IMiniProfile.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IRegisterData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IRemoveProfileData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/location/IGetLocationRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/match/IGetProfileRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/notes/INoteActionData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/notifier/INotifier.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IAkiProfile.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileCreateRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/profile/ISearchFriendRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/profile/ISearchFriendResponse.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IListQuestsRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetOffersResult.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IRagfairOffer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/ISearchRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/repair/IRepairActionDataRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/weather/IWeatherData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/eft/wishlist/IWishlistActionData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/enums/BaseClasses.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/enums/ConfigTypes.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/enums/ELocationName.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/enums/EquipmentSlots.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/enums/HideoutAreas.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/enums/MemberCategory.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/enums/MessageType.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/enums/Money.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/enums/Traders.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/external/mod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/external/tsyringe.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/bindings/Route.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IBotCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IBundleCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IDataCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IGameCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHealthCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHttpCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInraidCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ILocationCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IMatchCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IModCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/INoteCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/INotifierCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IPresetCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IProfileCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IQuestCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IRepairCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ISaveCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ITradeCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ITraderCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IAirdropConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IBaseConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IBotConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/ICoreConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHealthConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHideoutConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHttpConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInRaidConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInsuranceConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInventoryConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/ILocationConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IMatchConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IQuestConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IRagfairConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IRepairConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/ITraderConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/config/IWeatherConfig.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/controllers/IBotController.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IBotGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/generators/ILocationGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IPMCLootGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/helpers/Traders.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IModLoader.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IPackageJsonData.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/server/IDatabaseTables.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/server/IHttpServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/server/ILocaleBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/server/ILocations.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/server/IServerBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/server/ISettingsBase.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/utils/IAsyncQueue.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/utils/ICommand.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/utils/ILogger.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/models/spt/utils/IUuidGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/HttpRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/ImageRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/ItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/dynamic/BotDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/dynamic/BundleDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/dynamic/DataDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/dynamic/HttpDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/dynamic/InraidDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/dynamic/LocationDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/dynamic/NotifierDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/dynamic/TraderDynamicRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/CustomizationItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/HealthItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/HideoutItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/InsuranceItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/InventoryItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/NoteItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/QuestItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/RagfairItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/RepairItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/TradeItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/item_events/WishlistItemEventRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/save_load/HealthSaveLoadRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/save_load/InraidSaveLoadRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/serializers/BundleSerializer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/serializers/ImageSerializer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/serializers/NotifySerializer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/BotStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/BundleStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/CustomizationStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/DataStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/DialogStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/GameStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/HealthStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/InraidStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/InsuranceStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/ItemEventStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/LauncherStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/LocationStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/MatchStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/NotifierStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/PresetStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/ProfileStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/QuestStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/RagfairStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/TraderStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/routers/static/WeatherStaticRouter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/servers/ConfigServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/servers/DatabaseServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/servers/HttpServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/servers/RagfairServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/servers/SaveServer.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/FenceService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/HashCacheService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/InsuranceService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/MatchLocationService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/ModCompilerService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/NotificationService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/PaymentService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/PlayerService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/RagfairCategoriesService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/RagfairLinkedItemService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/RagfairOfferService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/RagfairPriceService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/RagfairRequiredItemsService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/TraderAssortService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/mod/image/imageRouteService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/mod/onLoad/OnLoadMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/mod/onLoad/OnLoadModService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/mod/onUpdate/OnUpdateMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/mod/onUpdate/OnUpdateModService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/mod/staticRouter/StaticRouterMod.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/services/mod/staticRouter/StaticRouterModService.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/App.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/AyncQueue.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/DatabaseImporter.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/HashUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/HttpResponseUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/JsonUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/Logger.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/MathUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/ObjectId.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/RandomUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/TimeUtil.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/UUidGenerator.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/VFS.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/Watermark.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/decorators/Singleton.d.ts create mode 100644 Faupi-HideoutMod/Project/src/server/types/utils/decorators/constructor.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/ide/BleedingEdgeEntry.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/BaseClasses.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/ConfigTypes.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/ELocationName.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/EquipmentSlots.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/HideoutAreas.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/MemberCategory.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/MessageType.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/Money.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/Traders.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/image/imageRouteService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/.eslintignore create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/.eslintrc.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/LICENSE delete mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/ammostats.js create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/package.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/res/armorDamage.png create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/res/ricochet.png create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/res/translations.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/src/MunitionsExpert.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/src/config.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/Program.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/TYPES.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/Utils.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/BotCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/BundleCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/CustomizationCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/DataCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/DialogueCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/GameCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HandbookCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HealthCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HideoutCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HttpCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InraidCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InsuranceCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InventoryCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ItemEventCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/LauncherCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/LocationCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/MatchCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ModCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/NoteCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/NotifierCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/PresetBuildCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/PresetCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ProfileCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/QuestCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/RagfairCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/RepairCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/SaveCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/TradeCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/TraderCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/WeatherCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/WishlistCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/BotController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/CustomizationController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/DialogueController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/GameController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HandbookController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HealthController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HideoutController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InraidController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InsuranceController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InventoryController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/LauncherController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/LocationController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/MatchController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/NoteController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/NotifierController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/PresetBuildController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/PresetController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/ProfileController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/QuestController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RagfairController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RepairController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RepeatableQuestController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/TradeController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/TraderController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/WeatherController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/WishlistController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Container.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnLoad.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnLoadOnUpdate.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnUpdate.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Router.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Serializer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotInventoryGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotLootGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotWeaponGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/LocationGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/PMCLootGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/RagfairAssortGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/RagfairOfferGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/WeatherGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/AssortHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/BotGeneratorHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/BotHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ContainerHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/DialogueHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/DurabilityLimitsHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ExtendedProfileHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/GameEventHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HandbookHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HealthHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HideoutHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HttpServerHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/InRaidHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/InventoryHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ItemHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/NotificationSendHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/NotifierHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/PaymentHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/PresetHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ProfileHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/QuestConditionHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/QuestHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairOfferHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairSellHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairServerHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairSortHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairTaxHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RepairHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/SecureContainerHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TradeHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TraderAssortHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TraderHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/UtilityHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/WeightedRandomHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/BleedingEdgeEntry.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/Compiler.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/DebugEntry.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/ReleaseEntry.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/TestEntry.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/BundleLoader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/DelayedModLoader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/InitialModLoader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IEmptyRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IGlobals.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocation.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocationBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILooseLoot.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IMetricsTableData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IPmcData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/MemberCategory.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotCore.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotType.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IItem.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ILootBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IQuest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ITrader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IGameConfigResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutArea.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IMiniProfile.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IRegisterData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notes/INoteActionData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notifier/INotifier.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IAkiProfile.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/weather/IWeatherData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/BaseClasses.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/ConfigTypes.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/ELocationName.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/EquipmentSlots.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/HideoutAreas.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/MemberCategory.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/MessageType.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/Money.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/Traders.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/external/mod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/external/tsyringe.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/bindings/Route.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IAirdropConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IBaseConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IBotConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ICoreConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHealthConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHideoutConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHttpConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInRaidConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInsuranceConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInventoryConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ILocationConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IMatchConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IQuestConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IRagfairConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IRepairConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ITraderConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IWeatherConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/controllers/IBotController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IBotGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/ILocationGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/helpers/Traders.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IModLoader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IPackageJsonData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IDatabaseTables.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IHttpServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ILocaleBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ILocations.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IServerBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ISettingsBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/IAsyncQueue.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/ICommand.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/ILogger.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/IUuidGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/HttpRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/ImageRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/ItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/BundleSerializer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/ImageSerializer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/NotifySerializer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/BotStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/BundleStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/CustomizationStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/DataStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/DialogStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/GameStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/HealthStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/InraidStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/InsuranceStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/ItemEventStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/LauncherStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/LocationStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/MatchStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/NotifierStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/PresetStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/ProfileStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/QuestStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/RagfairStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/TraderStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/WeatherStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/ConfigServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/DatabaseServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/HttpServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/RagfairServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/SaveServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/FenceService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/HashCacheService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/InsuranceService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/MatchLocationService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/ModCompilerService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/NotificationService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/PaymentService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/PlayerService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairCategoriesService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairLinkedItemService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairOfferService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairPriceService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairRequiredItemsService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/TraderAssortService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/image/imageRouteService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/App.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/AyncQueue.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/DatabaseImporter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/HashUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/HttpResponseUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/JsonUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/Logger.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/MathUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/ObjectId.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/RandomUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/TimeUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/UUidGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/VFS.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/Watermark.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/decorators/Singleton.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/decorators/constructor.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/mod.code-workspace create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/package.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/res/armorDamage.png create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/res/ricochet.png create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/res/translations.json create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/src/MunitionsExpert.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/src/config.json rename {KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1 => Faupi-MunitionsExpert/MunitionsExpert/src/server}/tsconfig.json (72%) create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/Program.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/TYPES.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/Utils.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/BotCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/BundleCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/CustomizationCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/DataCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/DialogueCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/GameCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HandbookCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HealthCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HideoutCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HttpCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InraidCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InsuranceCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InventoryCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ItemEventCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/LauncherCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/LocationCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/MatchCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ModCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/NoteCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/NotifierCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/PresetBuildCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/PresetCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ProfileCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/QuestCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/RagfairCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/RepairCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/SaveCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/TradeCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/TraderCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/WeatherCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/WishlistCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/BotController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/CustomizationController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/DialogueController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/GameController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HandbookController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HealthController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HideoutController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InraidController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InsuranceController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InventoryController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/LauncherController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/LocationController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/MatchController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/NoteController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/NotifierController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/PresetBuildController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/PresetController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/ProfileController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/QuestController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RagfairController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RepairController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RepeatableQuestController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/TradeController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/TraderController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/WeatherController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/WishlistController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Container.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnLoad.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnLoadOnUpdate.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnUpdate.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Router.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Serializer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotInventoryGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotLootGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotWeaponGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/LocationGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/PMCLootGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/RagfairAssortGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/RagfairOfferGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/WeatherGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/AssortHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/BotGeneratorHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/BotHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ContainerHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/DialogueHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/DurabilityLimitsHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ExtendedProfileHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/GameEventHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HandbookHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HealthHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HideoutHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HttpServerHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/InRaidHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/InventoryHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ItemHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/NotificationSendHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/NotifierHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/PaymentHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/PresetHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ProfileHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/QuestConditionHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/QuestHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairOfferHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairSellHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairServerHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairSortHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairTaxHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RepairHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/SecureContainerHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TradeHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TraderAssortHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TraderHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/UtilityHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/WeightedRandomHelper.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/BleedingEdgeEntry.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/Compiler.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/DebugEntry.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/ReleaseEntry.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/TestEntry.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/BundleLoader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/DelayedModLoader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/InitialModLoader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IEmptyRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IGlobals.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocation.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocationBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILooseLoot.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IMetricsTableData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IPmcData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/MemberCategory.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotCore.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotType.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ICustomizationItem.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IHandbookBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IItem.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ILocationsBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ILootBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IQuest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IRepeatableQuests.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ITemplateItem.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ITrader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/customization/IBuyClothingRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/customization/IWearClothingRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IFriendRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IPinDialogRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/ISendMessageRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IGameConfigResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IVersionValidateRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IOffraidEatRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IOffraidHealRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/ISyncHealthRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/HideoutAreasEnum.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutArea.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutProduction.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutScavCase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/httpResponse/INullResponseData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/insurance/IInsureRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IAddItemRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySortRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IChangeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/ILoginRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IMiniProfile.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IRegisterData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IRemoveProfileData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/location/IGetLocationRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IGetProfileRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notes/INoteActionData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notifier/INotifier.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IAkiProfile.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileCreateRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/ISearchFriendRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/ISearchFriendResponse.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IListQuestsRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetOffersResult.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IRagfairOffer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/ISearchRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/IRepairActionDataRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/weather/IWeatherData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/wishlist/IWishlistActionData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/BaseClasses.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/ConfigTypes.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/ELocationName.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/EquipmentSlots.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/HideoutAreas.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/MemberCategory.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/MessageType.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/Money.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/Traders.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/external/mod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/external/tsyringe.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/bindings/Route.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IBotCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IBundleCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IDataCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IGameCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHealthCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHttpCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInraidCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ILocationCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IMatchCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IModCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/INoteCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/INotifierCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IPresetCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IProfileCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IQuestCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IRepairCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ISaveCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ITradeCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ITraderCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IAirdropConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IBaseConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IBotConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ICoreConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHealthConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHideoutConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHttpConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInRaidConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInsuranceConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInventoryConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ILocationConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IMatchConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IQuestConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IRagfairConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IRepairConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ITraderConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IWeatherConfig.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/controllers/IBotController.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IBotGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/ILocationGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IPMCLootGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/helpers/Traders.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IModLoader.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IPackageJsonData.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IDatabaseTables.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IHttpServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ILocaleBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ILocations.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IServerBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ISettingsBase.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/IAsyncQueue.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/ICommand.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/ILogger.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/IUuidGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/HttpRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/ImageRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/ItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/BotDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/BundleDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/DataDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/HttpDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/InraidDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/LocationDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/NotifierDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/TraderDynamicRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/CustomizationItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/HealthItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/HideoutItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/InsuranceItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/InventoryItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/NoteItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/QuestItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/RagfairItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/RepairItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/TradeItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/WishlistItemEventRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/HealthSaveLoadRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/InraidSaveLoadRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/BundleSerializer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/ImageSerializer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/NotifySerializer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/BotStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/BundleStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/CustomizationStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/DataStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/DialogStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/GameStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/HealthStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/InraidStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/InsuranceStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/ItemEventStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/LauncherStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/LocationStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/MatchStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/NotifierStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/PresetStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/ProfileStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/QuestStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/RagfairStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/TraderStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/WeatherStaticRouter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/ConfigServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/DatabaseServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/HttpServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/RagfairServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/SaveServer.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/FenceService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/HashCacheService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/InsuranceService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/MatchLocationService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/ModCompilerService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/NotificationService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/PaymentService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/PlayerService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairCategoriesService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairLinkedItemService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairOfferService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairPriceService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairRequiredItemsService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/TraderAssortService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/image/imageRouteService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onLoad/OnLoadMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onLoad/OnLoadModService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onUpdate/OnUpdateMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onUpdate/OnUpdateModService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/staticRouter/StaticRouterMod.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/staticRouter/StaticRouterModService.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/App.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/AyncQueue.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/DatabaseImporter.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/HashUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/HttpResponseUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/JsonUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/Logger.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/MathUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/ObjectId.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/RandomUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/TimeUtil.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/UUidGenerator.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/VFS.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/Watermark.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/decorators/Singleton.d.ts create mode 100644 Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/decorators/constructor.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/ide/BleedingEdgeEntry.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/BaseClasses.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/ConfigTypes.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/ELocationName.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/EquipmentSlots.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/HideoutAreas.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/MemberCategory.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/MessageType.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/Money.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/Traders.d.ts create mode 100644 KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/image/imageRouteService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/.eslintignore create mode 100644 KcY-SeeItemValue/itemValue/server/.eslintrc.json create mode 100644 KcY-SeeItemValue/itemValue/server/LICENSE create mode 100644 KcY-SeeItemValue/itemValue/server/dist/package.json create mode 100644 KcY-SeeItemValue/itemValue/server/dist/src/config.json create mode 100644 KcY-SeeItemValue/itemValue/server/dist/src/mod.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/Program.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/TYPES.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/Utils.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/BotCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/BundleCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/CustomizationCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/DataCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/DialogueCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/GameCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HandbookCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HealthCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HideoutCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HttpCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InraidCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InsuranceCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InventoryCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ItemEventCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/LauncherCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/LocationCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/MatchCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ModCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/NoteCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/NotifierCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/PresetBuildCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/PresetCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ProfileCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/QuestCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/RagfairCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/RepairCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/SaveCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/TradeCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/TraderCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/WeatherCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/callbacks/WishlistCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/BotController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/CustomizationController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/DialogueController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/GameController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/HandbookController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/HealthController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/HideoutController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/InraidController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/InsuranceController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/InventoryController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/LauncherController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/LocationController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/MatchController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/NoteController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/NotifierController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/PresetBuildController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/PresetController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/ProfileController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/QuestController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/RagfairController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/RepairController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/RepeatableQuestController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/TradeController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/TraderController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/WeatherController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/controllers/WishlistController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/di/Container.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/di/OnLoad.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/di/OnLoadOnUpdate.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/di/OnUpdate.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/di/Router.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/di/Serializer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/generators/BotGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/generators/BotInventoryGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/generators/BotLootGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/generators/BotWeaponGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/generators/LocationGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/generators/PMCLootGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/generators/RagfairAssortGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/generators/RagfairOfferGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/generators/WeatherGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/AssortHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/BotGeneratorHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/BotHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/ContainerHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/DialogueHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/DurabilityLimitsHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/ExtendedProfileHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/GameEventHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/HandbookHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/HealthHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/HideoutHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/HttpServerHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/InRaidHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/InventoryHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/ItemHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/NotificationSendHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/NotifierHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/PaymentHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/PresetHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/ProfileHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/QuestConditionHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/QuestHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairOfferHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairSellHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairServerHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairSortHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairTaxHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/RepairHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/SecureContainerHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/TradeHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/TraderAssortHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/TraderHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/UtilityHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/helpers/WeightedRandomHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/ide/BleedingEdgeEntry.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/ide/Compiler.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/ide/DebugEntry.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/ide/ReleaseEntry.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/ide/TestEntry.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/loaders/BundleLoader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/loaders/DelayedModLoader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/loaders/InitialModLoader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IEmptyRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IGlobals.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocation.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocationBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILooseLoot.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IMetricsTableData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IPmcData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/MemberCategory.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotCore.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotType.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IItem.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ILootBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IQuest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ITrader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IGameConfigResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutArea.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IMiniProfile.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IRegisterData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notes/INoteActionData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notifier/INotifier.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IAkiProfile.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/weather/IWeatherData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/enums/BaseClasses.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/enums/ConfigTypes.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/enums/ELocationName.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/enums/EquipmentSlots.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/enums/HideoutAreas.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/enums/MemberCategory.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/enums/MessageType.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/enums/Money.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/enums/Traders.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/external/mod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/external/tsyringe.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/bindings/Route.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IAirdropConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IBaseConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IBotConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ICoreConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHealthConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHideoutConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHttpConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInRaidConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInsuranceConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInventoryConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ILocationConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IMatchConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IQuestConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IRagfairConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IRepairConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ITraderConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IWeatherConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/controllers/IBotController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IBotGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/ILocationGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/helpers/Traders.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IModLoader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IPackageJsonData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IDatabaseTables.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IHttpServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ILocaleBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ILocations.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IServerBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ISettingsBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/IAsyncQueue.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/ICommand.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/ILogger.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/IUuidGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/HttpRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/ImageRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/ItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/BundleSerializer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/ImageSerializer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/NotifySerializer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/BotStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/BundleStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/CustomizationStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/DataStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/DialogStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/GameStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/HealthStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/InraidStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/InsuranceStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/ItemEventStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/LauncherStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/LocationStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/MatchStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/NotifierStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/PresetStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/ProfileStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/QuestStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/RagfairStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/TraderStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/routers/static/WeatherStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/servers/ConfigServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/servers/DatabaseServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/servers/HttpServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/servers/RagfairServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/servers/SaveServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/FenceService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/HashCacheService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/InsuranceService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/MatchLocationService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/ModCompilerService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/NotificationService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/PaymentService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/PlayerService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairCategoriesService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairLinkedItemService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairOfferService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairPriceService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairRequiredItemsService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/TraderAssortService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/mod/image/imageRouteService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/App.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/AyncQueue.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/DatabaseImporter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/HashUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/HttpResponseUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/JsonUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/Logger.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/MathUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/ObjectId.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/RandomUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/TimeUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/UUidGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/VFS.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/Watermark.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/decorators/Singleton.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/dist/types/utils/decorators/constructor.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/mod.code-workspace create mode 100644 KcY-SeeItemValue/itemValue/server/package.json create mode 100644 KcY-SeeItemValue/itemValue/server/src/config.json create mode 100644 KcY-SeeItemValue/itemValue/server/src/mod.ts rename {Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1 => KcY-SeeItemValue/itemValue/server}/tsconfig.json (72%) create mode 100644 KcY-SeeItemValue/itemValue/server/types/Program.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/TYPES.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/Utils.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/BotCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/BundleCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/CustomizationCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/DataCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/DialogueCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/GameCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/HandbookCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/HealthCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/HideoutCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/HttpCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/InraidCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/InsuranceCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/InventoryCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/ItemEventCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/LauncherCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/LocationCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/MatchCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/ModCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/NoteCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/NotifierCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/PresetBuildCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/PresetCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/ProfileCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/QuestCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/RagfairCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/RepairCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/SaveCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/TradeCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/TraderCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/WeatherCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/callbacks/WishlistCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/BotController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/CustomizationController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/DialogueController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/GameController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/HandbookController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/HealthController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/HideoutController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/InraidController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/InsuranceController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/InventoryController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/LauncherController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/LocationController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/MatchController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/NoteController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/NotifierController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/PresetBuildController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/PresetController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/ProfileController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/QuestController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/RagfairController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/RepairController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/RepeatableQuestController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/TradeController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/TraderController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/WeatherController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/controllers/WishlistController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/di/Container.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/di/OnLoad.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/di/OnLoadOnUpdate.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/di/OnUpdate.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/di/Router.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/di/Serializer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/generators/BotGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/generators/BotInventoryGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/generators/BotLootGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/generators/BotWeaponGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/generators/LocationGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/generators/PMCLootGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/generators/RagfairAssortGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/generators/RagfairOfferGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/generators/WeatherGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/AssortHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/BotGeneratorHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/BotHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/ContainerHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/DialogueHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/DurabilityLimitsHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/ExtendedProfileHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/GameEventHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/HandbookHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/HealthHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/HideoutHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/HttpServerHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/InRaidHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/InventoryHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/ItemHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/NotificationSendHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/NotifierHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/PaymentHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/PresetHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/ProfileHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/QuestConditionHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/QuestHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/RagfairHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/RagfairOfferHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/RagfairSellHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/RagfairServerHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/RagfairSortHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/RagfairTaxHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/RepairHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/SecureContainerHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/TradeHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/TraderAssortHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/TraderHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/UtilityHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/helpers/WeightedRandomHelper.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/ide/BleedingEdgeEntry.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/ide/Compiler.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/ide/DebugEntry.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/ide/ReleaseEntry.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/ide/TestEntry.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/loaders/BundleLoader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/loaders/DelayedModLoader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/loaders/InitialModLoader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/IEmptyRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/IGlobals.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocation.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocationBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILooseLoot.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/IMetricsTableData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/IPmcData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/MemberCategory.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotCore.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotType.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ICustomizationItem.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IHandbookBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IItem.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ILocationsBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ILootBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IQuest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IRepeatableQuests.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ITemplateItem.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ITrader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/customization/IBuyClothingRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/customization/IWearClothingRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IFriendRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IPinDialogRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/ISendMessageRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/game/IGameConfigResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/game/IVersionValidateRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/health/IOffraidEatRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/health/IOffraidHealRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/health/ISyncHealthRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/HideoutAreasEnum.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutArea.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutProduction.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutScavCase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/httpResponse/INullResponseData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/insurance/IInsureRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IAddItemRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySortRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IChangeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/ILoginRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IMiniProfile.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IRegisterData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IRemoveProfileData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/location/IGetLocationRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/match/IGetProfileRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/notes/INoteActionData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/notifier/INotifier.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IAkiProfile.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileCreateRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/profile/ISearchFriendRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/profile/ISearchFriendResponse.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IListQuestsRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetOffersResult.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IRagfairOffer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/ISearchRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/repair/IRepairActionDataRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/weather/IWeatherData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/eft/wishlist/IWishlistActionData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/enums/BaseClasses.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/enums/ConfigTypes.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/enums/ELocationName.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/enums/EquipmentSlots.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/enums/HideoutAreas.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/enums/MemberCategory.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/enums/MessageType.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/enums/Money.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/enums/Traders.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/external/mod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/external/tsyringe.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/bindings/Route.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IBotCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IBundleCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IDataCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IGameCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHealthCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHttpCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInraidCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ILocationCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IMatchCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IModCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/INoteCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/INotifierCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IPresetCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IProfileCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IQuestCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IRepairCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ISaveCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ITradeCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ITraderCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IAirdropConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IBaseConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IBotConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/ICoreConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHealthConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHideoutConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHttpConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInRaidConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInsuranceConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInventoryConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/ILocationConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IMatchConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IQuestConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IRagfairConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IRepairConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/ITraderConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/config/IWeatherConfig.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/controllers/IBotController.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IBotGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/generators/ILocationGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IPMCLootGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/helpers/Traders.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IModLoader.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IPackageJsonData.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/server/IDatabaseTables.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/server/IHttpServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/server/ILocaleBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/server/ILocations.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/server/IServerBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/server/ISettingsBase.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/utils/IAsyncQueue.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/utils/ICommand.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/utils/ILogger.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/models/spt/utils/IUuidGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/HttpRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/ImageRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/ItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/dynamic/BotDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/dynamic/BundleDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/dynamic/DataDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/dynamic/HttpDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/dynamic/InraidDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/dynamic/LocationDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/dynamic/NotifierDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/dynamic/TraderDynamicRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/CustomizationItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/HealthItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/HideoutItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/InsuranceItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/InventoryItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/NoteItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/QuestItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/RagfairItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/RepairItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/TradeItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/item_events/WishlistItemEventRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/save_load/HealthSaveLoadRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/save_load/InraidSaveLoadRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/serializers/BundleSerializer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/serializers/ImageSerializer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/serializers/NotifySerializer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/BotStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/BundleStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/CustomizationStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/DataStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/DialogStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/GameStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/HealthStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/InraidStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/InsuranceStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/ItemEventStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/LauncherStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/LocationStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/MatchStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/NotifierStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/PresetStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/ProfileStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/QuestStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/RagfairStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/TraderStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/routers/static/WeatherStaticRouter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/servers/ConfigServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/servers/DatabaseServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/servers/HttpServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/servers/RagfairServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/servers/SaveServer.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/FenceService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/HashCacheService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/InsuranceService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/MatchLocationService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/ModCompilerService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/NotificationService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/PaymentService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/PlayerService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/RagfairCategoriesService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/RagfairLinkedItemService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/RagfairOfferService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/RagfairPriceService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/RagfairRequiredItemsService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/TraderAssortService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/mod/image/imageRouteService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/mod/onLoad/OnLoadMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/mod/onLoad/OnLoadModService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/mod/onUpdate/OnUpdateMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/mod/onUpdate/OnUpdateModService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/mod/staticRouter/StaticRouterMod.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/services/mod/staticRouter/StaticRouterModService.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/App.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/AyncQueue.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/DatabaseImporter.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/HashUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/HttpResponseUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/JsonUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/Logger.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/MathUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/ObjectId.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/RandomUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/TimeUtil.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/UUidGenerator.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/VFS.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/Watermark.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/decorators/Singleton.d.ts create mode 100644 KcY-SeeItemValue/itemValue/server/types/utils/decorators/constructor.d.ts diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/bepInEx/plugins/HideoutArchitect.dll b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/bepInEx/plugins/HideoutArchitect.dll index 5d8d91e13e5c234b4865af67a02fc5da113d9b3c..0abc5104c2d869ac989f4ea0a515dcd9a56cc0e1 100644 GIT binary patch delta 207 zcmZoz!Pu~ZaY6@+%GRylHugk`3QuBu&ceo!&Q{LP#xPOv3l|$h-Q=I5vW&APi;I~u zwodjH+swFqGNZUSR_@L@iN(c+ zrWPg)Ha_`@DIuv9C8b5Fb}8}kCJYcsQz&g{YHSW;ni*JZZqeY85@^W$D!iIwg3FYZ wJc<8uI$m#H;53DcMe)(%hm$RQO$2NsnskquOL%U}di|?q$F?7vYkXVS02d!g`~Uy| delta 206 zcmZoz!Pu~ZaY6^nnwIMI8+)Qeh37IpXJKPVXDjDtW0)xTg^P`$bMjA7Sw_dn;$o(Z z6DIqLZDu?)nNeJvarkkpEj(xOzml=yfP2AI6DDU=DL4b2S9Hn(W-NC{+Ky>p`BONztpG<$x} t3un4EFL0W|#WH1s^~A{*z9s@SduIyexCnU6GMo`0wPW`A%{9I)Yyh-nNF@LO diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/package.json b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/package.json index 97ccd69..86e779c 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/package.json +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/package.json @@ -1,8 +1,26 @@ { "name": "HideoutArchitect", - "author": "Faupi", "version": "1.5.0", - "license": "NCSA Open Source", "main": "./src/hideoutarchitect.js", - "akiVersion": "3.0.0" -} \ No newline at end of file + "license": "NCSA Open Source", + "author": "Faupi", + "akiVersion": "3.0.0", + "updated by": "CWX", + "scripts": { + "setup:environment": "npm i", + "build:unzipped": "copyfiles -e \"./node_modules/**/*.*\" -e \"./dist/**/*.*\" -e \"./package-lock.json\" -e \"./tsconfig.json\" -e \"./README.txt\" -e \"./mod.code-workspace\" ./**/*.* ./dist", + "zip:files": "cd dist/ && bestzip ../mod.zip *", + "build:zip": "npm run clean:environment && npm run build:unzipped && npm run zip:files", + "clean:environment": "node -e \"require('fs').rm('mod.zip', ()=>{})\" && node -e \"require('fs').rmdir('./dist/',{recursive:true},()=>{})\"" + }, + "devDependencies": { + "@types/node": "^14.15.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "copyfiles": "2.4.1", + "eslint": "7.26.0", + "tsyringe": "4.6.0", + "typescript": "4.6.4", + "bestzip": "2.2.1" + } +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/src/hideoutarchitect.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/src/hideoutarchitect.ts index 0c00ed9..948483c 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/src/hideoutarchitect.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/src/hideoutarchitect.ts @@ -1,15 +1,14 @@ import type { DependencyContainer } from "tsyringe"; -import { IMod } from "../types/models/external/mod"; -import { ILogger } from "../types/models/spt/utils/ILogger"; -import { DynamicRouterModService } from "../types/services/mod/dynamicRouter/DynamicRouterModService" -import { DatabaseServer } from "../types/servers/DatabaseServer" -import { JsonUtil } from "../types/utils/JsonUtil" -import { InitialModLoader } from "../types/loaders/InitialModLoader" -const path = require('path'); - +import { IMod } from "@spt-aki/models/external/mod"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; +import { DynamicRouterModService } from "@spt-aki/services/mod/dynamicRouter/DynamicRouterModService" +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer" +import { JsonUtil } from "@spt-aki/utils/JsonUtil" +import { InitialModLoader } from "@spt-aki/loaders/InitialModLoader" class HideoutArchitect implements IMod { + private path; private logger: ILogger; private database: DatabaseServer; private router: DynamicRouterModService; @@ -24,12 +23,13 @@ class HideoutArchitect implements IMod { this.logger = container.resolve("WinstonLogger"); this.router = container.resolve("DynamicRouterModService"); - + this.path = require("path"); this.json = container.resolve("JsonUtil"); this.mod = require("../package.json"); this.translations = require("../res/translations.json"); this.logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); this.hookRoutes(); + } public delayedLoad(container: DependencyContainer) @@ -43,12 +43,17 @@ class HideoutArchitect implements IMod private loadLocalization() { - for(let language in this.translations){ - if(!(language in this.globalLocale)) continue; - - let attrKvPair = this.translations[language]; - for(let attrKey in attrKvPair){ - let attrValue = attrKvPair[attrKey]; + for (const language in this.translations) + { + if (!(language in this.globalLocale)) + { + continue; + } + + const attrKvPair = this.translations[language]; + for (const attrKey in attrKvPair) + { + const attrValue = attrKvPair[attrKey]; this.globalLocale[language].interface[attrKey] = attrValue; } @@ -72,14 +77,14 @@ class HideoutArchitect implements IMod ) } - private getModInfo(url, info, sessionId, output) + private getModInfo(url: string, info: any, sessionId: string, output: string) { - var modOutput = { + const modOutput = { status: 1, data: null }; - modOutput.data = {...this.mod, ...{path: path.resolve(this.modLoader.getModPath(this.mod.name))}}; + modOutput.data = {...this.mod, ...{path: this.path.resolve(this.modLoader.getModPath(this.mod.name))}}; modOutput.status = 0; return this.json.serialize(modOutput); diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/BotCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/BotCallbacks.d.ts index 9602975..2db60dc 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/BotCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/BotCallbacks.d.ts @@ -5,8 +5,8 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class BotCallbacks { - private botController; - private httpResponse; + protected botController: BotController; + protected httpResponse: HttpResponseUtil; constructor(botController: BotController, httpResponse: HttpResponseUtil); getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/BundleCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/BundleCallbacks.d.ts index b007ab8..b28abe1 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/BundleCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/BundleCallbacks.d.ts @@ -1,15 +1,16 @@ import { BundleLoader } from "../loaders/BundleLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class BundleCallbacks { - private logger; - private httpResponse; - private httpServer; - private bundleLoader; - private configServer; - private httpConfig; + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, bundleLoader: BundleLoader, configServer: ConfigServer); sendBundle(sessionID: string, req: any, resp: any, body: any): any; getBundles(url: string, info: any, sessionID: string): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/CustomizationCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/CustomizationCallbacks.d.ts index 918b8b6..3bab8c0 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/CustomizationCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/CustomizationCallbacks.d.ts @@ -9,9 +9,9 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { SaveServer } from "../servers/SaveServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class CustomizationCallbacks { - private customizationController; - private saveServer; - private httpResponse; + protected customizationController: CustomizationController; + protected saveServer: SaveServer; + protected httpResponse: HttpResponseUtil; constructor(customizationController: CustomizationController, saveServer: SaveServer, httpResponse: HttpResponseUtil); getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<{ _id: string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/DataCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/DataCallbacks.d.ts index 018420e..cfb1c16 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/DataCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/DataCallbacks.d.ts @@ -12,8 +12,8 @@ import { ISettingsBase } from "../models/spt/server/ISettingsBase"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class DataCallbacks { - private httpResponse; - private databaseServer; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer); getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/DialogueCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/DialogueCallbacks.d.ts index 3b6fbd1..634f90b 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/DialogueCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/DialogueCallbacks.d.ts @@ -21,10 +21,10 @@ import { HashUtil } from "../utils/HashUtil"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class DialogueCallbacks extends OnUpdate { - private hashUtil; - private timeUtil; - private httpResponse; - private dialogueController; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected dialogueController: DialogueController; constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController); getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/GameCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/GameCallbacks.d.ts index 44a30ea..d5cad76 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/GameCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/GameCallbacks.d.ts @@ -8,9 +8,9 @@ import { INullResponseData } from "../models/eft/httpResponse/INullResponseData" import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { Watermark } from "../utils/Watermark"; declare class GameCallbacks { - private httpResponse; - private watermark; - private gameController; + protected httpResponse: HttpResponseUtil; + protected watermark: Watermark; + protected gameController: GameController; constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController); versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HandbookCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HandbookCallbacks.d.ts index 0db5fec..891e375 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HandbookCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HandbookCallbacks.d.ts @@ -1,7 +1,7 @@ import { HandbookController } from "../controllers/HandbookController"; import { OnLoad } from "../di/OnLoad"; export declare class HandbookCallbacks extends OnLoad { - private handbookController; + protected handbookController: HandbookController; constructor(handbookController: HandbookController); onLoad(): void; getRoute(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HealthCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HealthCallbacks.d.ts index a50dd42..8f7b89d 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HealthCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HealthCallbacks.d.ts @@ -9,9 +9,9 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class HealthCallbacks { - private httpResponse; - private profileHelper; - private healthController; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected healthController: HealthController; constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController); syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData; offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HideoutCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HideoutCallbacks.d.ts index 3698176..99ab4c9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HideoutCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HideoutCallbacks.d.ts @@ -11,11 +11,12 @@ import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutTog import { IHideoutUpgradeCompleteRequestData } from "../models/eft/hideout/IHideoutUpgradeCompleteRequestData"; import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; import { ConfigServer } from "../servers/ConfigServer"; export declare class HideoutCallbacks extends OnUpdate { - private hideoutController; - private configServer; - private hideoutConfig; + protected hideoutController: HideoutController; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; constructor(hideoutController: HideoutController, // TODO: delay needed configServer: ConfigServer); upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HttpCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HttpCallbacks.d.ts index 9fe387d..94c97bd 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HttpCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/HttpCallbacks.d.ts @@ -1,7 +1,7 @@ import { OnLoad } from "../di/OnLoad"; import { IHttpServer } from "../models/spt/server/IHttpServer"; export declare class HttpCallbacks extends OnLoad { - private httpServer; + protected httpServer: IHttpServer; constructor(httpServer: IHttpServer); onLoad(): void; getRoute(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InraidCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InraidCallbacks.d.ts index 2d53227..05bcce4 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InraidCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InraidCallbacks.d.ts @@ -3,14 +3,16 @@ import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IAirdropConfig } from "../models/spt/config/IAirdropConfig"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class InraidCallbacks { - private inraidController; - private httpResponse; - private configServer; - private airdropConfig; - private inraidConfig; + protected inraidController: InraidController; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected airdropConfig: IAirdropConfig; + protected inraidConfig: IInRaidConfig; constructor(inraidController: InraidController, httpResponse: HttpResponseUtil, configServer: ConfigServer); registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InsuranceCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InsuranceCallbacks.d.ts index 79feb67..520d0eb 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InsuranceCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InsuranceCallbacks.d.ts @@ -5,15 +5,16 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { InsuranceService } from "../services/InsuranceService"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class InsuranceCallbacks extends OnLoadOnUpdate { - private insuranceController; - private insuranceService; - private httpResponse; - private configServer; - private insuranceConfig; + protected insuranceController: InsuranceController; + protected insuranceService: InsuranceService; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer); onLoad(): void; getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InventoryCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InventoryCallbacks.d.ts index 9795aa0..9ab1486 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InventoryCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/InventoryCallbacks.d.ts @@ -18,7 +18,7 @@ import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryT import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; export declare class InventoryCallbacks { - private inventoryController; + protected inventoryController: InventoryController; constructor(inventoryController: InventoryController); moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ItemEventCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ItemEventCallbacks.d.ts index 74e79c4..f4f04f9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ItemEventCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ItemEventCallbacks.d.ts @@ -4,8 +4,8 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { ItemEventRouter } from "../routers/ItemEventRouter"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class ItemEventCallbacks { - private httpResponse; - private itemEventRouter; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter); handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/LauncherCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/LauncherCallbacks.d.ts index 4bd5e2c..c022325 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/LauncherCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/LauncherCallbacks.d.ts @@ -8,10 +8,10 @@ import { SaveServer } from "../servers/SaveServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { Watermark } from "../utils/Watermark"; declare class LauncherCallbacks { - private httpResponse; - private launcherController; - private saveServer; - private watermark; + protected httpResponse: HttpResponseUtil; + protected launcherController: LauncherController; + protected saveServer: SaveServer; + protected watermark: Watermark; constructor(httpResponse: HttpResponseUtil, launcherController: LauncherController, saveServer: SaveServer, watermark: Watermark); connect(): string; login(url: string, info: ILoginRequestData, sessionID: string): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/LocationCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/LocationCallbacks.d.ts index 5ecab74..cc69369 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/LocationCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/LocationCallbacks.d.ts @@ -6,8 +6,8 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { IGetLocationRequestData } from "../models/eft/location/IGetLocationRequestData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class LocationCallbacks { - private httpResponse; - private locationController; + protected httpResponse: HttpResponseUtil; + protected locationController: LocationController; constructor(httpResponse: HttpResponseUtil, locationController: LocationController); getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/MatchCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/MatchCallbacks.d.ts index 63d38d9..083c1f5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/MatchCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/MatchCallbacks.d.ts @@ -9,10 +9,10 @@ import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class MatchCallbacks { - private httpResponse; - private jsonUtil; - private matchController; - private databaseServer; + protected httpResponse: HttpResponseUtil; + protected jsonUtil: JsonUtil; + protected matchController: MatchController; + protected databaseServer: DatabaseServer; constructor(httpResponse: HttpResponseUtil, jsonUtil: JsonUtil, matchController: MatchController, databaseServer: DatabaseServer); updatePing(url: string, info: any, sessionID: string): INullResponseData; exitMatch(url: string, info: any, sessionID: string): INullResponseData; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ModCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ModCallbacks.d.ts index 2011f0e..866abf7 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ModCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ModCallbacks.d.ts @@ -1,16 +1,17 @@ import { OnLoad } from "../di/OnLoad"; import { DelayedModLoader } from "../loaders/DelayedModLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; declare class ModCallbacks extends OnLoad { - private logger; - private httpResponse; - private httpServer; - private modLoader; - private configServer; - private httpConfig; + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected modLoader: DelayedModLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, modLoader: DelayedModLoader, configServer: ConfigServer); onLoad(): void; getRoute(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/NoteCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/NoteCallbacks.d.ts index fd7c5ca..d39d400 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/NoteCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/NoteCallbacks.d.ts @@ -3,7 +3,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { INoteActionData } from "../models/eft/notes/INoteActionData"; export declare class NoteCallbacks { - private noteController; + protected noteController: NoteController; constructor(noteController: NoteController); addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/NotifierCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/NotifierCallbacks.d.ts index 416e6a3..cd1e736 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/NotifierCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/NotifierCallbacks.d.ts @@ -6,9 +6,9 @@ import { INotifierChannel } from "../models/eft/notifier/INotifier"; import { ISelectProfileRequestData } from "../models/eft/notifier/ISelectProfileRequestData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class NotifierCallbacks { - private httpServerHelper; - private httpResponse; - private notifierController; + protected httpServerHelper: HttpServerHelper; + protected httpResponse: HttpResponseUtil; + protected notifierController: NotifierController; constructor(httpServerHelper: HttpServerHelper, httpResponse: HttpResponseUtil, notifierController: NotifierController); /** * If we don't have anything to send, it's ok to not send anything back @@ -16,7 +16,7 @@ export declare class NotifierCallbacks { * until we actually have something to send because otherwise we'd spam the client * and the client would abort the connection due to spam. */ - sendNotification(sessionID: string, req: any, resp: any, data: any): void; + sendNotification(_sessionID: string, req: any, resp: any, _data: any): void; getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/PresetBuildCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/PresetBuildCallbacks.d.ts index 639c33f..8a0c155 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/PresetBuildCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/PresetBuildCallbacks.d.ts @@ -6,8 +6,8 @@ import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPreset import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class PresetBuildCallbacks { - private httpResponse; - private presetBuildController; + protected httpResponse: HttpResponseUtil; + protected presetBuildController: PresetBuildController; constructor(httpResponse: HttpResponseUtil, presetBuildController: PresetBuildController); getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/PresetCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/PresetCallbacks.d.ts index f62afd6..4553f8f 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/PresetCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/PresetCallbacks.d.ts @@ -1,7 +1,7 @@ import { PresetController } from "../controllers/PresetController"; import { OnLoad } from "../di/OnLoad"; export declare class PresetCallbacks extends OnLoad { - private presetController; + protected presetController: PresetController; constructor(presetController: PresetController); onLoad(): void; getRoute(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ProfileCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ProfileCallbacks.d.ts index efce47d..116e7c5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ProfileCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/ProfileCallbacks.d.ts @@ -12,9 +12,9 @@ import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNic import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class ProfileCallbacks { - private httpResponse; - private timeUtil; - private profileController; + protected httpResponse: HttpResponseUtil; + protected timeUtil: TimeUtil; + protected profileController: ProfileController; constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, profileController: ProfileController); createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/QuestCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/QuestCallbacks.d.ts index f742096..559c29e 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/QuestCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/QuestCallbacks.d.ts @@ -13,9 +13,9 @@ import { IListQuestsRequestData } from "../models/eft/quests/IListQuestsRequestD import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class QuestCallbacks { - private httpResponse; - private questController; - private repeatableQuestController; + protected httpResponse: HttpResponseUtil; + protected questController: QuestController; + protected repeatableQuestController: RepeatableQuestController; constructor(httpResponse: HttpResponseUtil, questController: QuestController, repeatableQuestController: RepeatableQuestController); changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/RagfairCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/RagfairCallbacks.d.ts index 152475f..d5bab8b 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/RagfairCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/RagfairCallbacks.d.ts @@ -3,6 +3,7 @@ import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { IPmcData } from "../models/eft/common/IPmcData"; import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IAddOfferRequestData } from "../models/eft/ragfair/IAddOfferRequestData"; import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; @@ -10,19 +11,20 @@ import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; import { IRemoveOfferRequestData } from "../models/eft/ragfair/IRemoveOfferRequestData"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { RagfairServer } from "../servers/RagfairServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class RagfairCallbacks extends OnLoadOnUpdate { - private httpResponse; - private logger; - private jsonUtil; - private ragfairServer; - private ragfairController; - private configServer; - private ragfairConfig; + protected httpResponse: HttpResponseUtil; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected ragfairServer: RagfairServer; + protected ragfairController: RagfairController; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(httpResponse: HttpResponseUtil, logger: ILogger, jsonUtil: JsonUtil, ragfairServer: RagfairServer, ragfairController: RagfairController, configServer: ConfigServer); onLoad(): void; getRoute(): string; @@ -33,4 +35,5 @@ export declare class RagfairCallbacks extends OnLoadOnUpdate { removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; onUpdate(timeSinceLastRun: number): boolean; + sendReport(url: string, info: any, sessionID: string): INullResponseData; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/RepairCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/RepairCallbacks.d.ts index f63ec18..63733fa 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/RepairCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/RepairCallbacks.d.ts @@ -4,7 +4,7 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; export declare class RepairCallbacks { - private repairController; + protected repairController: RepairController; constructor(repairController: RepairController); traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/SaveCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/SaveCallbacks.d.ts index b7219a0..bbb6e53 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/SaveCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/SaveCallbacks.d.ts @@ -1,7 +1,7 @@ import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; import { SaveServer } from "../servers/SaveServer"; export declare class SaveCallbacks extends OnLoadOnUpdate { - private saveServer; + protected saveServer: SaveServer; constructor(saveServer: SaveServer); onLoad(): void; getRoute(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/TradeCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/TradeCallbacks.d.ts index 9928951..272ae46 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/TradeCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/TradeCallbacks.d.ts @@ -4,7 +4,7 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; export declare class TradeCallbacks { - private tradeController; + protected tradeController: TradeController; constructor(tradeController: TradeController); processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/TraderCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/TraderCallbacks.d.ts index 2a8af7f..128d9b2 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/TraderCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/TraderCallbacks.d.ts @@ -5,8 +5,8 @@ import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class TraderCallbacks extends OnLoadOnUpdate { - private httpResponse; - private traderController; + protected httpResponse: HttpResponseUtil; + protected traderController: TraderController; constructor(httpResponse: HttpResponseUtil, traderController: TraderController); onLoad(): void; getRoute(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/WeatherCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/WeatherCallbacks.d.ts index e40ab3e..ae784c8 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/WeatherCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/WeatherCallbacks.d.ts @@ -3,8 +3,8 @@ import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class WeatherCallbacks { - private httpResponse; - private weatherController; + protected httpResponse: HttpResponseUtil; + protected weatherController: WeatherController; constructor(httpResponse: HttpResponseUtil, weatherController: WeatherController); getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/WishlistCallbacks.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/WishlistCallbacks.d.ts index e0249fd..c2cc2a8 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/WishlistCallbacks.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/callbacks/WishlistCallbacks.d.ts @@ -3,7 +3,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; export declare class WishlistCallbacks { - private wishlistController; + protected wishlistController: WishlistController; constructor(wishlistController: WishlistController); addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/BotController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/BotController.d.ts index d7dc36d..09a1788 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/BotController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/BotController.d.ts @@ -1,20 +1,35 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { Difficulty } from "../models/eft/common/tables/IBotType"; +import { BotGenerator } from "../generators/BotGenerator"; +import { BotHelper } from "../helpers/BotHelper"; import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; 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 { ConfigServer } from "../servers/ConfigServer"; -import { BotHelper } from "../helpers/BotHelper"; -import { BotGenerator } from "../generators/BotGenerator"; +import { DatabaseServer } from "../servers/DatabaseServer"; export declare class BotController { - private databaseServer; - private botGenerator; - private botHelper; - private configServer; - private botConfig; + protected databaseServer: DatabaseServer; + protected botGenerator: BotGenerator; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); - getBotLimit(type: string): number; - getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; + /** + * Return the number of bot loadout varieties to be generated + * @param type bot Type we want the loadout gen count for + * @returns + */ + getBotPresetGenerationLimit(type: string): number; + getBotCoreDifficulty(): IBotCore; + /** + * Get bot difficulty settings + * adjust PMC settings to ensure they engage the correct bot types + * @param type what bot the server is requesting settings for + * @param difficulty difficulty level server requested settings for + * @returns Difficulty object + */ + getBotDifficulty(type: string, difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; getBotCap(): number; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/CustomizationController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/CustomizationController.d.ts index 6fd3b12..a6c4730 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/CustomizationController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/CustomizationController.d.ts @@ -1,22 +1,22 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { SaveServer } from "../servers/SaveServer"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; -import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; export declare class CustomizationController { - private logger; - private itemEventRouter; - private databaseServer; - private saveServer; - private profileHelper; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper); getTraderSuits(traderID: string, sessionID: string): ISuit[]; wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; - private getAllTraderSuits; + protected getAllTraderSuits(sessionID: string): ISuit[]; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/DialogueController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/DialogueController.d.ts index 8095666..b15c4b6 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/DialogueController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/DialogueController.d.ts @@ -1,15 +1,15 @@ -import { SaveServer } from "../servers/SaveServer"; import { DialogueHelper } from "../helpers/DialogueHelper"; -import { DialogueInfo } from "../models/eft/profile/IAkiProfile"; -import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; -import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { DialogueInfo, Message } from "../models/eft/profile/IAkiProfile"; +import { SaveServer } from "../servers/SaveServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class DialogueController { - private httpResponse; - private saveServer; - private dialogueHelper; + protected httpResponse: HttpResponseUtil; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; constructor(httpResponse: HttpResponseUtil, saveServer: SaveServer, dialogueHelper: DialogueHelper); getFriendList(sessionID: string): IGetFriendListDataResponse; generateDialogueList(sessionID: string): IGetBodyResponseData; @@ -19,6 +19,7 @@ export declare class DialogueController { setDialoguePin(dialogueID: string, shouldPin: boolean, sessionID: string): void; setRead(dialogueIDs: string[], sessionID: string): void; getAllAttachments(dialogueID: string, sessionID: string): IGetAllAttachmentsResponse; - private removeExpiredItems; + protected messagesHaveUncollectedRewards(messages: Message[]): boolean; + protected removeExpiredItems(sessionID: string): void; update(): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/GameController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/GameController.d.ts index 5c9a464..b9067fa 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/GameController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/GameController.d.ts @@ -1,20 +1,32 @@ import { HttpServerHelper } from "../helpers/HttpServerHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcDataRepeatableQuest, IRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { Watermark } from "../utils/Watermark"; export declare class GameController { - private logger; - private watermark; - private httpServerHelper; - private profileHelper; - private configServer; - private httpConfig; + protected logger: ILogger; + protected watermark: Watermark; + protected httpServerHelper: HttpServerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; constructor(logger: ILogger, watermark: Watermark, httpServerHelper: HttpServerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); - gameStart(url: string, info: IEmptyRequestData, sessionID: string): void; + gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void; + protected addMissingBonusesProperty(pmcProfile: IPmcData): void; + protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void; + protected addMissingWeaponRepairSkill(pmcProfile: IPmcData): void; + protected addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void; + protected addMissingArmorRepairSkill(pmcProfile: IPmcData): void; + protected fixNullTraderSalesSums(pmcProfile: IPmcData): void; + protected removeDanglingConditionCounters(pmcProfile: IPmcData): void; + protected removeDanglingBackendCounters(pmcProfile: IPmcData): void; getGameConfig(sessionID: string): IGameConfigResponse; getServer(): any[]; - private getActiveRepeatableQuests; + protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[]; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HandbookController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HandbookController.d.ts index 5a55e89..52d2dd8 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HandbookController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HandbookController.d.ts @@ -1,8 +1,8 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { HandbookHelper } from "../helpers/HandbookHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; export declare class HandbookController { - private databaseServer; - private handbookHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; constructor(databaseServer: DatabaseServer, handbookHelper: HandbookHelper); load(): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HealthController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HealthController.d.ts index ca049f6..aafb8df 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HealthController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HealthController.d.ts @@ -11,12 +11,12 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class HealthController { - private logger; - private itemEventRouter; - private itemHelper; - private paymentService; - private inventoryHelper; - private healthHelper; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected inventoryHelper: InventoryHelper; + protected healthHelper: HealthHelper; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, healthHelper: HealthHelper); saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HideoutController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HideoutController.d.ts index 22b7040..a8bf229 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HideoutController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/HideoutController.d.ts @@ -1,46 +1,47 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { TimeUtil } from "../utils/TimeUtil"; -import { HashUtil } from "../utils/HashUtil"; -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { PlayerService } from "../services/PlayerService"; +import { HideoutHelper } from "../helpers/HideoutHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; import { PresetHelper } from "../helpers/PresetHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; -import { PaymentHelper } from "../helpers/PaymentHelper"; -import { InventoryHelper } from "../helpers/InventoryHelper"; -import { HideoutHelper } from "../helpers/HideoutHelper"; -import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; import { IPmcData } from "../models/eft/common/IPmcData"; import { HideoutUpgradeCompleteRequestData } from "../models/eft/hideout/HideoutUpgradeCompleteRequestData"; -import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; -import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; -import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; -import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; -import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; -import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; export declare class HideoutController { - private logger; - private hashUtil; - private timeUtil; - private databaseServer; - private randomUtil; - private inventoryHelper; - private saveServer; - private playerService; - private presetHelper; - private paymentHelper; - private itemEventRouter; - private httpResponse; - private profileHelper; - private hideoutHelper; - private configServer; - private hideoutConfig; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected inventoryHelper: InventoryHelper; + protected saveServer: SaveServer; + protected playerService: PlayerService; + protected presetHelper: PresetHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected hideoutHelper: HideoutHelper; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, configServer: ConfigServer); upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InraidController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InraidController.d.ts index 1033e5f..7f2036c 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InraidController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InraidController.d.ts @@ -1,29 +1,30 @@ -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ItemHelper } from "../helpers/ItemHelper"; -import { TraderHelper } from "../helpers/TraderHelper"; +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; import { HealthHelper } from "../helpers/HealthHelper"; +import { InRaidHelper } from "../helpers/InRaidHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; import { ConfigServer } from "../servers/ConfigServer"; -import { JsonUtil } from "../utils/JsonUtil"; -import { QuestHelper } from "../helpers/QuestHelper"; -import { InRaidHelper } from "../helpers/InRaidHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; import { InsuranceService } from "../services/InsuranceService"; -import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { JsonUtil } from "../utils/JsonUtil"; export declare class InraidController { - private saveServer; - private jsonUtil; - private databaseServer; - private questHelper; - private itemHelper; - private extendedProfileHelper; - private healthHelper; - private traderHelper; - private insuranceService; - private inRaidHelper; - private configServer; - private inraidConfig; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected itemHelper: ItemHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + protected healthHelper: HealthHelper; + protected traderHelper: TraderHelper; + protected insuranceService: InsuranceService; + protected inRaidHelper: InRaidHelper; + protected configServer: ConfigServer; + protected inraidConfig: IInRaidConfig; constructor(saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, extendedProfileHelper: ExtendedProfileHelper, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer); addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void; saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InsuranceController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InsuranceController.d.ts index 50437a6..db2c567 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InsuranceController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InsuranceController.d.ts @@ -1,33 +1,34 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { TimeUtil } from "../utils/TimeUtil"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { PaymentService } from "../services/PaymentService"; import { DialogueHelper } from "../helpers/DialogueHelper"; -import { ProfileHelper } from "../helpers/ProfileHelper"; import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { InsuranceService } from "../services/InsuranceService"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { PaymentService } from "../services/PaymentService"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; export declare class InsuranceController { - private logger; - private randomUtil; - private itemEventRouter; - private timeUtil; - private saveServer; - private databaseServer; - private itemHelper; - private profileHelper; - private dialogueHelper; - private paymentService; - private insuranceService; - private configServer; - private insuranceConfig; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected itemEventRouter: ItemEventRouter; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected profileHelper: ProfileHelper; + protected dialogueHelper: DialogueHelper; + protected paymentService: PaymentService; + protected insuranceService: InsuranceService; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; constructor(logger: ILogger, randomUtil: RandomUtil, itemEventRouter: ItemEventRouter, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required insuranceService: InsuranceService, configServer: ConfigServer); processReturn(): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InventoryController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InventoryController.d.ts index 8235082..b732aa9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InventoryController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/InventoryController.d.ts @@ -27,15 +27,15 @@ import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class InventoryController { - private logger; - private hashUtil; - private jsonUtil; - private databaseServer; - private presetHelper; - private inventoryHelper; - private profileHelper; - private paymentHelper; - private itemEventRouter; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected presetHelper: PresetHelper; + protected inventoryHelper: InventoryHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter); /** * Move Item diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/LauncherController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/LauncherController.d.ts index d3d8e6a..1af1f56 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/LauncherController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/LauncherController.d.ts @@ -1,25 +1,26 @@ -import { HashUtil } from "../utils/HashUtil"; -import { SaveServer } from "../servers/SaveServer"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { Info } from "../models/eft/profile/IAkiProfile"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; -import { IRegisterData } from "../models/eft/launcher/IRegisterData"; -import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; -import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; -import { Info } from "../models/eft/profile/IAkiProfile"; -import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; export declare class LauncherController { - private hashUtil; - private saveServer; - private httpServerHelper; - private databaseServer; - private configServer; - private coreConfig; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected httpServerHelper: HttpServerHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected coreConfig: ICoreConfig; constructor(hashUtil: HashUtil, saveServer: SaveServer, httpServerHelper: HttpServerHelper, databaseServer: DatabaseServer, configServer: ConfigServer); connect(): any; find(sessionIdKey: string): Info; login(info: ILoginRequestData): string; register(info: IRegisterData): string; - private createAccount; + protected createAccount(info: IRegisterData): string; changeUsername(info: IChangeRequestData): string; changePassword(info: IChangeRequestData): string; wipe(info: IRegisterData): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/LocationController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/LocationController.d.ts index dde270c..90b6d7a 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/LocationController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/LocationController.d.ts @@ -1,16 +1,16 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { LocationGenerator } from "../generators/LocationGenerator"; import { ILocationBase } from "../models/eft/common/ILocationBase"; import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class LocationController { - private jsonUtil; - private logger; - private locationGenerator; - private databaseServer; - private timeUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected locationGenerator: LocationGenerator; + protected databaseServer: DatabaseServer; + protected timeUtil: TimeUtil; constructor(jsonUtil: JsonUtil, logger: ILogger, locationGenerator: LocationGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil); get(location: string): ILocationBase; generate(name: string): ILocationBase; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/MatchController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/MatchController.d.ts index 84abbe3..c322d96 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/MatchController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/MatchController.d.ts @@ -4,21 +4,23 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; import { MatchLocationService } from "../services/MatchLocationService"; export declare class MatchController { - private saveServer; - private profileHelper; - private matchLocationService; - private traderHelper; - private configServer; - private matchConfig; - private inraidConfig; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected matchLocationService: MatchLocationService; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected matchConfig: IMatchConfig; + protected inraidConfig: IInRaidConfig; constructor(saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, configServer: ConfigServer); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; - private getMatch; + protected getMatch(location: any): any; createGroup(sessionID: string, info: any): any; deleteGroup(info: any): void; joinMatch(info: any, sessionID: string): any[]; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/NoteController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/NoteController.d.ts index ecd8001..cc78383 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/NoteController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/NoteController.d.ts @@ -1,9 +1,9 @@ import { IPmcData } from "../models/eft/common/IPmcData"; -import { INoteActionData } from "../models/eft/notes/INoteActionData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; import { ItemEventRouter } from "../routers/ItemEventRouter"; declare class NoteController { - private itemEventRouter; + protected itemEventRouter: ItemEventRouter; constructor(itemEventRouter: ItemEventRouter); addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/NotifierController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/NotifierController.d.ts index 36fef66..31d7bfe 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/NotifierController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/NotifierController.d.ts @@ -3,11 +3,11 @@ import { NotificationService } from "../services/NotificationService"; import { INotifierChannel } from "../models/eft/notifier/INotifier"; import { HttpServerHelper } from "../helpers/HttpServerHelper"; export declare class NotifierController { - private notifierHelper; - private httpServerHelper; - private notificationService; - private pollInterval; - private timeout; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected notificationService: NotificationService; + protected pollInterval: number; + protected timeout: number; constructor(notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, notificationService: NotificationService); /** * Resolve an array of session notifications. diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/PresetBuildController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/PresetBuildController.d.ts index a15b181..adf4084 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/PresetBuildController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/PresetBuildController.d.ts @@ -1,16 +1,16 @@ import { ItemHelper } from "../helpers/ItemHelper"; -import { SaveServer } from "../servers/SaveServer"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; -import { HashUtil } from "../utils/HashUtil"; import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; export declare class PresetBuildController { - private hashUtil; - private itemEventRouter; - private itemHelper; - private saveServer; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; constructor(hashUtil: HashUtil, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, saveServer: SaveServer); getUserBuilds(sessionID: string): WeaponBuild[]; saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/PresetController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/PresetController.d.ts index 6ec8c55..ca1af1a 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/PresetController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/PresetController.d.ts @@ -1,8 +1,8 @@ import { PresetHelper } from "../helpers/PresetHelper"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class PresetController { - private presetHelper; - private databaseServer; + protected presetHelper: PresetHelper; + protected databaseServer: DatabaseServer; constructor(presetHelper: PresetHelper, databaseServer: DatabaseServer); initialize(): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/ProfileController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/ProfileController.d.ts index 46b66d8..9b7a6d5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/ProfileController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/ProfileController.d.ts @@ -1,26 +1,26 @@ -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; +import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; -import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; import { HashUtil } from "../utils/HashUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; -import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; export declare class ProfileController { - private hashUtil; - private timeUtil; - private saveServer; - private databaseServer; - private itemHelper; - private traderHelper; - private extendedProfileHelper; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected traderHelper: TraderHelper; + protected extendedProfileHelper: ExtendedProfileHelper; constructor(hashUtil: HashUtil, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, traderHelper: TraderHelper, extendedProfileHelper: ExtendedProfileHelper); getMiniProfiles(): IMiniProfile[]; getMiniProfile(sessionID: string): any; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/QuestController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/QuestController.d.ts index a964c32..e588de0 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/QuestController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/QuestController.d.ts @@ -1,33 +1,34 @@ -import { TimeUtil } from "../utils/TimeUtil"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { QuestHelper } from "../helpers/QuestHelper"; -import { ItemHelper } from "../helpers/ItemHelper"; import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { QuestConditionHelper } from "../helpers/QuestConditionHelper"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { PlayerService } from "../services/PlayerService"; +import { QuestHelper } from "../helpers/QuestHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; -import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { TimeUtil } from "../utils/TimeUtil"; export declare class QuestController { - private logger; - private timeUtil; - private itemEventRouter; - private databaseServer; - private itemHelper; - private dialogueHelper; - private profileHelper; - private questHelper; - private questConditionHelper; - private playerService; - private configServer; - private questConfig; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected questHelper: QuestHelper; + protected questConditionHelper: QuestConditionHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; constructor(logger: ILogger, timeUtil: TimeUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, questConditionHelper: QuestConditionHelper, playerService: PlayerService, configServer: ConfigServer); getClientQuests(sessionID: string): IQuest[]; acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RagfairController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RagfairController.d.ts index 5b94a95..c758593 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RagfairController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RagfairController.d.ts @@ -20,6 +20,7 @@ import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPric import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -33,30 +34,30 @@ import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsSer import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class RagfairController { - private logger; - private timeUtil; - private httpResponse; - private itemEventRouter; - private ragfairServer; - private ragfairPriceService; - private databaseServer; - private itemHelper; - private saveServer; - private ragfairSellHelper; - private ragfairTaxHelper; - private ragfairSortHelper; - private ragfairOfferHelper; - private profileHelper; - private paymentService; - private handbookHelper; - private paymentHelper; - private inventoryHelper; - private ragfairHelper; - private ragfairOfferService; - private ragfairRequiredItemsService; - private ragfairOfferGenerator; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + protected ragfairServer: RagfairServer; + protected ragfairPriceService: RagfairPriceService; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + protected ragfairSellHelper: RagfairSellHelper; + protected ragfairTaxHelper: RagfairTaxHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairOfferHelper: RagfairOfferHelper; + protected profileHelper: ProfileHelper; + protected paymentService: PaymentService; + protected handbookHelper: HandbookHelper; + protected paymentHelper: PaymentHelper; + protected inventoryHelper: InventoryHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter, ragfairServer: RagfairServer, ragfairPriceService: RagfairPriceService, databaseServer: DatabaseServer, itemHelper: ItemHelper, saveServer: SaveServer, ragfairSellHelper: RagfairSellHelper, ragfairTaxHelper: RagfairTaxHelper, ragfairSortHelper: RagfairSortHelper, ragfairOfferHelper: RagfairOfferHelper, profileHelper: ProfileHelper, paymentService: PaymentService, handbookHelper: HandbookHelper, paymentHelper: PaymentHelper, inventoryHelper: InventoryHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer); getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult; update(): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RepairController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RepairController.d.ts index 3a9f3a2..e9458f6 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RepairController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RepairController.d.ts @@ -1,25 +1,26 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { QuestHelper } from "../helpers/QuestHelper"; -import { TraderHelper } from "../helpers/TraderHelper"; -import { PaymentService } from "../services/PaymentService"; -import { IPmcData } from "../models/eft/common/IPmcData"; -import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; -import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; -import { ConfigServer } from "../servers/ConfigServer"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; import { RepairHelper } from "../helpers/RepairHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; export declare class RepairController { - private logger; - private itemEventRouter; - private databaseServer; - private questHelper; - private traderHelper; - private paymentService; - private repairHelper; - private configServer; - private repairConfig; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected traderHelper: TraderHelper; + protected paymentService: PaymentService; + protected repairHelper: RepairHelper; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, questHelper: QuestHelper, traderHelper: TraderHelper, paymentService: PaymentService, repairHelper: RepairHelper, configServer: ConfigServer); /** * Repair with trader diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RepeatableQuestController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RepeatableQuestController.d.ts index bd5e5a1..ce190aa 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RepeatableQuestController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/RepeatableQuestController.d.ts @@ -8,7 +8,8 @@ import { IPmcData, TraderInfo } from "../models/eft/common/IPmcData"; import { ICompletion, ICompletionAvailableFor, IElimination, IEliminationCondition, IExploration, IExplorationCondition, IPmcDataRepeatableQuest, IRepeatableQuest, IReward, IRewards } from "../models/eft/common/tables/IRepeatableQuests"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; -import { ELocationName, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ELocationName } from "../models/enums/ELocationName"; +import { IQuestConfig, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -47,21 +48,21 @@ export interface ITargetLocation { locations: string[]; } export declare class RepeatableQuestController { - private timeUtil; - private logger; - private randomUtil; - private mathUtil; - private jsonUtil; - private databaseServer; - private itemHelper; - private presetHelper; - private profileHelper; - private ragfairServerHelper; - private itemEventRouter; - private paymentService; - private objectId; - private configServer; - private questConfig; + protected timeUtil: TimeUtil; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected mathUtil: MathUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected itemEventRouter: ItemEventRouter; + protected paymentService: PaymentService; + protected objectId: ObjectId; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, itemEventRouter: ItemEventRouter, paymentService: PaymentService, objectId: ObjectId, configServer: ConfigServer); /** * This is the method reached by the /client/repeatalbeQuests/activityPeriods endpoint @@ -88,7 +89,7 @@ export declare class RepeatableQuestController { * @param {string} sessionId Player's session id * @returns {array} array of "repeatableQuestObjects" as descibed above */ - getClientRepeatableQuests(info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; + getClientRepeatableQuests(_info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; /** * This method is called by GetClientRepeatableQuests and creates one element of quest type format (see assets/database/templates/repeatableQuests.json). * It randomly draws a quest type (currently Elimination, Completion or Exploration) as well as a trader who is providing the quest diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/TradeController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/TradeController.d.ts index f0a177b..c86745c 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/TradeController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/TradeController.d.ts @@ -9,11 +9,11 @@ import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTr import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ILogger } from "../models/spt/utils/ILogger"; declare class TradeController { - private logger; - private itemEventRouter; - private tradeHelper; - private profileHelper; - private ragfairServer; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected tradeHelper: TradeHelper; + protected profileHelper: ProfileHelper; + protected ragfairServer: RagfairServer; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, tradeHelper: TradeHelper, profileHelper: ProfileHelper, ragfairServer: RagfairServer); confirmTrading(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid?: boolean, upd?: Upd): IItemEventRouterResponse; confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/TraderController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/TraderController.d.ts index 36eac75..7bab158 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/TraderController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/TraderController.d.ts @@ -8,14 +8,14 @@ import { TraderAssortService } from "../services/TraderAssortService"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class TraderController { - private logger; - private databaseServer; - private traderAssortHelper; - private profileHelper; - private traderHelper; - private timeUtil; - private traderAssortService; - private jsonUtil; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected traderAssortHelper: TraderAssortHelper; + protected profileHelper: ProfileHelper; + protected traderHelper: TraderHelper; + protected timeUtil: TimeUtil; + protected traderAssortService: TraderAssortService; + protected jsonUtil: JsonUtil; constructor(logger: ILogger, databaseServer: DatabaseServer, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, timeUtil: TimeUtil, traderAssortService: TraderAssortService, jsonUtil: JsonUtil); load(): void; getTrader(traderID: string, sessionID: string): ITraderBase; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/WeatherController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/WeatherController.d.ts index 4f8bcf1..ca7f5eb 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/WeatherController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/WeatherController.d.ts @@ -1,10 +1,11 @@ -import { ConfigServer } from "../servers/ConfigServer"; import { WeatherGenerator } from "../generators/WeatherGenerator"; import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { ConfigServer } from "../servers/ConfigServer"; export declare class WeatherController { - private weatherGenerator; - private configServer; - private weatherConfig; + protected weatherGenerator: WeatherGenerator; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer); generate(): IWeatherData; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/WishlistController.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/WishlistController.d.ts index 5ef8df3..a96c522 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/WishlistController.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/controllers/WishlistController.d.ts @@ -3,7 +3,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; export declare class WishlistController { - private itemEvenRouter; + protected itemEvenRouter: ItemEventRouter; constructor(itemEvenRouter: ItemEventRouter); addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotGenerator.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotGenerator.d.ts index af7d7d4..88a8014 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotGenerator.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotGenerator.d.ts @@ -1,36 +1,46 @@ -import { HashUtil } from "../utils/HashUtil"; -import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; -import { IBotBase } from "../models/eft/common/tables/IBotBase"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { JsonUtil } from "../utils/JsonUtil"; -import { ConfigServer } from "../servers/ConfigServer"; -import { GameEventHelper } from "../helpers/GameEventHelper"; -import { BotInventoryGenerator } from "./BotInventoryGenerator"; import { BotHelper } from "../helpers/BotHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { Health as PmcHealth } from "../models/eft/common/IPmcData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { Health, Inventory, Skills } 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 { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotInventoryGenerator } from "./BotInventoryGenerator"; +declare namespace BotGenerator { + interface IRandomisedBotLevelResult { + level: number; + exp: number; + } +} export declare class BotGenerator { - private logger; - private hashUtil; - private randomUtil; - private jsonUtil; - private databaseServer; - private botInventoryGenerator; - private botHelper; - private gameEventHelper; - private configServer; - private botConfig; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected botInventoryGenerator: BotInventoryGenerator; + protected botHelper: BotHelper; + protected gameEventHelper: GameEventHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; - private generateBot; - private generateRandomLevel; + protected generateBot(bot: IBotBase, role: string, isPmc: boolean): IBotBase; + protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** Converts health object to the required format */ - private generateHealth; - private generateSkills; - private getPmcRole; - private removeChristmasItemsFromBotInventory; - private generateId; - private generateInventoryID; - private getPMCDifficulty; - private generateDogtag; + protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; + protected generateSkills(skillsObj: Skills): Skills; + protected getPmcRole(pmcSide: string): string; + protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + protected generateId(bot: IBotBase): IBotBase; + protected generateInventoryID(profile: IBotBase): IBotBase; + protected getPMCDifficulty(requestedDifficulty: string): string; + protected generateDogtag(bot: IBotBase): IBotBase; } +export {}; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotInventoryGenerator.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotInventoryGenerator.d.ts index 0cdbacb..783d0c5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotInventoryGenerator.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotInventoryGenerator.d.ts @@ -1,5 +1,5 @@ import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; -import { Inventory, Chances, Generation } from "../models/eft/common/tables/IBotType"; +import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; @@ -9,16 +9,16 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; export declare class BotInventoryGenerator { - private logger; - private hashUtil; - private randomUtil; - private databaseServer; - private botWeaponGenerator; - private botLootGenerator; - private botGeneratorHelper; - private weightedRandomHelper; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected botWeaponGenerator: BotWeaponGenerator; + 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(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; - private generateEquipment; - private generateInventoryBase; + protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; + protected generateInventoryBase(): PmcInventory; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotLootGenerator.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotLootGenerator.d.ts index 3bf1b36..1d91836 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotLootGenerator.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotLootGenerator.d.ts @@ -1,27 +1,29 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { HandbookHelper } from "../helpers/HandbookHelper"; import { PMCLootGenerator } from "../generators/PMCLootGenerator"; +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { HandbookHelper } from "../helpers/HandbookHelper"; import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; import { ItemMinMax, Items } from "../models/eft/common/tables/IBotType"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; export declare class BotLootGenerator { - private jsonUtil; - private hashUtil; - private randomUtil; - private databaseServer; - private handbookHelper; - private botGeneratorHelper; - private pmcLootGenerator; - private configServer; - private botConfig; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected pmcLootGenerator: PMCLootGenerator; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, pmcLootGenerator: PMCLootGenerator, configServer: ConfigServer); generateLoot(lootPool: Items, itemCounts: ItemMinMax, isPmc: boolean, inventory: PmcInventory): void; - private getRandomisedCount; - private addLootFromPool; + protected getRandomisedCount(min: number, max: number, nValue: number): number; + protected addLootFromPool(pool: ITemplateItem[], equipmentSlots: string[], count: number, inventory: PmcInventory, totalValueLimit?: number, useLimits?: boolean): void; /** Compares two item templates by their price to spawn chance ratio */ - private compareByValue; + protected compareByValue(a: ITemplateItem, b: ITemplateItem): number; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotWeaponGenerator.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotWeaponGenerator.d.ts index e8f91cb..13fe7df 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotWeaponGenerator.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/BotWeaponGenerator.d.ts @@ -3,22 +3,24 @@ import { ItemHelper } from "../helpers/ItemHelper"; import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; import { MinMax, Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class BotWeaponGenerator { - private logger; - private hashUtil; - private databaseServer; - private itemHelper; - private weightedRandomHelper; - private botGeneratorHelper; - private randomUtil; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected weightedRandomHelper: WeightedRandomHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected randomUtil: RandomUtil; constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil); generateWeapon(equipmentSlot: string, weaponPool: Record, modPool: Mods, modChances: ModsChances, magCounts: MinMax, botRole: string, isPmc: boolean, inventory: PmcInventory): void; /** Checks if all required slots are occupied on a weapon and all it's mods */ - private isWeaponValid; + protected isWeaponValid(itemList: Item[]): boolean; /** * Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets. * Additionally, adds extra bullets to SecuredContainer @@ -29,8 +31,8 @@ export declare class BotWeaponGenerator { * @param {*} ammoTpl * @returns */ - private generateExtraMagazines; - private addBullets; + protected generateExtraMagazines(weaponMods: Item[], weaponTemplate: ITemplateItem, magCounts: MinMax, ammoTpl: string, inventory: PmcInventory): void; + protected addBullets(ammoTpl: string, bulletCount: number, inventory: PmcInventory): void; /** * Finds and returns tpl of ammo that should be used, while making sure it's compatible * @@ -38,7 +40,7 @@ export declare class BotWeaponGenerator { * @param {*} weaponTemplate * @returns */ - private getCompatibleAmmo; + protected getCompatibleAmmo(weaponMods: Item[], weaponTemplate: ITemplateItem): string; /** Fill existing magazines to full, while replacing their contents with specified ammo */ - private fillExistingMagazines; + protected fillExistingMagazines(weaponMods: Item[], magazine: Item, ammoTpl: string): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/LocationGenerator.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/LocationGenerator.d.ts index b7ba7c5..bd368b5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/LocationGenerator.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/LocationGenerator.d.ts @@ -1,44 +1,46 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { IStaticContainerProps, IStaticLootDetails, IStaticAmmoDetails, IStaticForcedProps } from "../models/eft/common/tables/ILootBase"; +import { ContainerHelper } from "../helpers/ContainerHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; import { ILooseLoot, SpawnpointTemplate } from "../models/eft/common/ILooseLoot"; import { Item } from "../models/eft/common/tables/IItem"; -import { ItemHelper } from "../helpers/ItemHelper"; -import { GameEventHelper } from "../helpers/GameEventHelper"; -import { ContainerHelper } from "../helpers/ContainerHelper"; -import { PresetHelper } from "../helpers/PresetHelper"; +import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "../models/eft/common/tables/ILootBase"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILocationConfig } from "../models/spt/config/ILocationConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { JsonUtil } from "../utils/JsonUtil"; import { MathUtil } from "../utils/MathUtil"; import { ObjectId } from "../utils/ObjectId"; -import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; -import { ILogger } from "../models/spt/utils/ILogger"; +import { RandomUtil } from "../utils/RandomUtil"; export interface IContainerItem { items: Item[]; width: number; height: number; } export declare class LocationGenerator { - private logger; - private jsonUtil; - private objectId; - private randomUtil; - private ragfairServerHelper; - private itemHelper; - private mathUtil; - private gameEventHelper; - private containerHelper; - private presetHelper; - private configServer; - private locationConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected objectId: ObjectId; + protected randomUtil: RandomUtil; + protected ragfairServerHelper: RagfairServerHelper; + protected itemHelper: ItemHelper; + protected mathUtil: MathUtil; + protected gameEventHelper: GameEventHelper; + protected containerHelper: ContainerHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected locationConfig: ILocationConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, objectId: ObjectId, randomUtil: RandomUtil, ragfairServerHelper: RagfairServerHelper, itemHelper: ItemHelper, mathUtil: MathUtil, gameEventHelper: GameEventHelper, containerHelper: ContainerHelper, presetHelper: PresetHelper, configServer: ConfigServer); generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; - private getLooseLootMultiplerForLocation; - private getStaticLootMultiplerForLocation; + protected getLooseLootMultiplerForLocation(location: string): number; + protected getStaticLootMultiplerForLocation(location: string): number; generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; - private createItem; - private getRandomCompatibleCaliberTemplateId; - private getRandomValidCaliber; - private drawAmmoTpl; - private createRandomMagCartridges; - private createCartidges; + protected createItem(tpl: string, staticAmmoDist: Record, parentId?: string): IContainerItem; + protected getRandomCompatibleCaliberTemplateId(item: ITemplateItem): string; + protected getRandomValidCaliber(magTemplate: ITemplateItem): string; + protected drawAmmoTpl(caliber: string, staticAmmoDist: Record): string; + protected createRandomMagCartridges(magTemplate: ITemplateItem, parentId: string, staticAmmoDist: Record, caliber?: string): Item; + protected createCartidges(parentId: string, ammoTpl: string, stackCount: number): Item; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/PMCLootGenerator.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/PMCLootGenerator.d.ts index 601431b..64e6f7f 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/PMCLootGenerator.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/PMCLootGenerator.d.ts @@ -1,13 +1,14 @@ import { ItemHelper } from "../helpers/ItemHelper"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ConfigServer } from "../servers/ConfigServer"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; export declare class PMCLootGenerator { - private itemHelper; - private databaseServer; - private configServer; - private pocketLootPool; - private backpackLootPool; - private botConfig; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected pocketLootPool: string[]; + protected backpackLootPool: string[]; + protected botConfig: IBotConfig; constructor(itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); generatePMCPocketLootPool(): string[]; generatePMCBackpackLootPool(): string[]; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/RagfairAssortGenerator.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/RagfairAssortGenerator.d.ts index 8b52a90..cbdd7f2 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/RagfairAssortGenerator.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/RagfairAssortGenerator.d.ts @@ -1,17 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; import { Item } from "../models/eft/common/tables/IItem"; import { DatabaseServer } from "../servers/DatabaseServer"; -import { ItemHelper } from "../helpers/ItemHelper"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class RagfairAssortGenerator { - private jsonUtil; - private hashUtil; - private itemHelper; - private databaseServer; - private generatedAssortItems; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected generatedAssortItems: Item[]; constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + /** + * Get an array of unique items that can be sold on the flea + * @returns array of unique items + */ getAssortItems(): Item[]; - private assortsAreGenerated; - private generateRagfairAssortItems; - private createRagfairAssortItem; + protected assortsAreGenerated(): boolean; + /** + * Generate an array of items the flea can sell + * @returns array of unique items + */ + protected generateRagfairAssortItems(): Item[]; + protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/RagfairOfferGenerator.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/RagfairOfferGenerator.d.ts index cb2566c..de53ea9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/RagfairOfferGenerator.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/RagfairOfferGenerator.d.ts @@ -1,49 +1,58 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { SaveServer } from "../servers/SaveServer"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { IBarterScheme } from "../models/eft/common/tables/ITrader"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; -import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { PresetHelper } from "../helpers/PresetHelper"; import { RagfairAssortGenerator } from "./RagfairAssortGenerator"; -import { ItemHelper } from "../helpers/ItemHelper"; -import { RagfairOfferService } from "../services/RagfairOfferService"; -import { RagfairPriceService } from "../services/RagfairPriceService"; -import { FenceService } from "../services/FenceService"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class RagfairOfferGenerator { - private logger; - private jsonUtil; - private hashUtil; - private randomUtil; - private timeUtil; - private databaseServer; - private ragfairServerHelper; - private saveServer; - private presetHelper; - private ragfairAssortGenerator; - private ragfairOfferService; - private ragfairPriceService; - private fenceService; - private itemHelper; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected saveServer: SaveServer; + protected presetHelper: PresetHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairPriceService: RagfairPriceService; + protected fenceService: FenceService; + protected itemHelper: ItemHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer); createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; - private getTraderId; - private getRating; - private getRatingGrowing; - private getOfferEndTime; + protected getTraderId(userID: string): string; + protected getRating(userID: string): number; + protected getRatingGrowing(userID: string): boolean; + protected getOfferEndTime(userID: string, time: number): number; + /** + * Create multiple offers for items by using a unique list of items we've generated previously + * @param expiredOffers + */ generateDynamicOffers(expiredOffers?: Item[]): void; generateTraderOffers(traderID: string): void; - private getItemCondition; - private addMissingCondition; - private getOfferRequirements; + protected getItemCondition(userID: string, items: Item[], itemDetails: ITemplateItem): Item[]; + protected addMissingCondition(item: Item): Item; + protected getOfferRequirements(items: Item[]): { + count: number; + _tpl: string; + }[]; /** * Create a flea offer and store it in the Ragfair server offers array */ diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/WeatherGenerator.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/WeatherGenerator.d.ts index b9faa3a..23aa169 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/WeatherGenerator.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/generators/WeatherGenerator.d.ts @@ -1,19 +1,20 @@ import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { ConfigServer } from "../servers/ConfigServer"; import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class WeatherGenerator { - private weightedRandomHelper; - private randomUtil; - private timeUtil; - private configServer; - private weatherConfig; + protected weightedRandomHelper: WeightedRandomHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); calculateTime(data: IWeatherData): IWeatherData; generateWeather(data: IWeatherData): IWeatherData; - private getWeightedFog; - private getWeightedRain; - private getRandomFloat; - private getRandomInt; + protected getWeightedFog(): string; + protected getWeightedRain(): number; + protected getRandomFloat(node: string): number; + protected getRandomInt(node: string): number; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/AssortHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/AssortHelper.d.ts index 33cb5c6..15586b9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/AssortHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/AssortHelper.d.ts @@ -5,12 +5,32 @@ import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemHelper } from "./ItemHelper"; import { QuestHelper } from "./QuestHelper"; export declare class AssortHelper { - private logger; - private itemHelper; - private databaseServer; - private questHelper; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; constructor(logger: ILogger, itemHelper: ItemHelper, databaseServer: DatabaseServer, questHelper: QuestHelper); + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort assort items from a trader + * @returns assort items minus locked quest assorts + */ + stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort traders assorts + * @returns traders assorts minus locked loyality assorts + */ + stripLockedLoyaltyAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove an item from an assort + * @param assort assort to modify + * @param itemID item id to remove from asort + * @returns Modified assort + */ removeItemFromAssort(assort: ITraderAssort, itemID: string): ITraderAssort; - stripQuestAssort(pmcProfile: IPmcData, sessionId: string, traderId: string, assort: ITraderAssort): ITraderAssort; - stripLoyaltyAssort(pmcProfile: IPmcData, sessionId: string, traderId: string, assort: ITraderAssort): ITraderAssort; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/BotGeneratorHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/BotGeneratorHelper.d.ts index 6abdc07..c382fc9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/BotGeneratorHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/BotGeneratorHelper.d.ts @@ -1,8 +1,9 @@ import { DurabilityLimitsHelper } from "../helpers/DurabilityLimitsHelper"; import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; import { Mods, ModsChances } from "../models/eft/common/tables/IBotType"; -import { Item, Upd } from "../models/eft/common/tables/IItem"; -import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { Item, Repairable, Upd } from "../models/eft/common/tables/IItem"; +import { Grid, ITemplateItem, Slot } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -12,18 +13,18 @@ import { RandomUtil } from "../utils/RandomUtil"; import { ContainerHelper } from "./ContainerHelper"; import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; -declare class BotGeneratorHelper { - private logger; - private jsonUtil; - private hashUtil; - private randomUtil; - private databaseServer; - private durabilityLimitsHelper; - private itemHelper; - private inventoryHelper; - private containerHelper; - private configServer; - private botConfig; +export declare class BotGeneratorHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected durabilityLimitsHelper: DurabilityLimitsHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected containerHelper: ContainerHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, configServer: ConfigServer); generateModsForItem(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, isPmc?: boolean): Item[]; /** @@ -37,16 +38,50 @@ declare class BotGeneratorHelper { * @param {string} parentId The CylinderMagazine's UID * @param {object} parentTemplate The CylinderMagazine's template */ - private fillCamora; + protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void; generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): { - "upd"?: Upd; + upd?: Upd; }; - private getModTplFromItemDb; + /** + * Create a repairable object for a weapon that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + /** + * Create a repairable object for an armor that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string; + /** + * Sort by spawn chance, highest to lowest, higher is more common + * @param unsortedModArray String array to sort + * @returns Sorted string array + */ + protected sortModArray(unsortedModArray: string[]): string[]; + /** + * Can an item be added to an item without issue + * @param items + * @param tplToCheck + * @param equipmentSlot + * @returns true if possible + */ isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean; - /** Adds an item with all its childern into specified equipmentSlots, wherever it fits. - * Returns a `boolean` indicating success. */ + /** + * Adds an item with all its childern into specified equipmentSlots, wherever it fits. + * @param equipmentSlots + * @param parentId + * @param parentTpl + * @param itemWithChildren + * @param inventory + * @returns a `boolean` indicating item was added + */ addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: PmcInventory): boolean; - private itemAllowedInContainer; + protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean; } export declare class ExhaustableArray { private itemPool; @@ -58,22 +93,3 @@ export declare class ExhaustableArray { getFirstValue(): T; hasValues(): boolean; } -declare namespace BotGeneratorHelper { - enum EquipmentSlots { - HEADWEAR = "Headwear", - EARPIECE = "Earpiece", - FACE_COVER = "FaceCover", - ARMOR_VEST = "ArmorVest", - EYEWEAR = "Eyewear", - ARM_BAND = "ArmBand", - TACTICAL_VEST = "TacticalVest", - POCKETS = "Pockets", - BACKPACK = "Backpack", - SECURED_CONTAINER = "SecuredContainer", - FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", - SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", - HOLSTER = "Holster", - SCABBARD = "Scabbard" - } -} -export { BotGeneratorHelper }; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/BotHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/BotHelper.d.ts index 032218b..0cb1227 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/BotHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/BotHelper.d.ts @@ -1,22 +1,44 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; 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 { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class BotHelper { - private logger; - private jsonUtil; - private databaseServer; - private randomUtil; - private configServer; - private botConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); getBotDifficultySettings(type: string, difficulty: string): Difficulty; getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Randomise the chance the PMC will attack their own side + * @param difficultySettings pmc difficulty settings + */ randomisePmcHostility(difficultySettings: Difficulty): void; isBotPmc(botRole: string): boolean; isBotBoss(botRole: string): boolean; isBotFollower(botRole: string): boolean; + /** + * Add a bot to the FRIENDLY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typeToAdd bot type to add to friendly list + */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; + /** + * Add a bot to the ENEMY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to enemy list + */ + addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Add a bot to the REVENGE_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to revenge list + */ + addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ContainerHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ContainerHelper.d.ts index 34cd1e4..3c2ee93 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ContainerHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ContainerHelper.d.ts @@ -6,7 +6,7 @@ export declare class FindSlotResult { constructor(success?: boolean, x?: any, y?: any, rotation?: boolean); } export declare class ContainerHelper { - private locateSlot; + protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean; findSlotForItem(container2D: number[][], itemWidth: number, itemHeight: number): FindSlotResult; fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): any; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/DialogueHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/DialogueHelper.d.ts index d8082e4..9776c6a 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/DialogueHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/DialogueHelper.d.ts @@ -1,17 +1,18 @@ +import { Dialogue, MessageContent, MessagePreview } from "../models/eft/profile/IAkiProfile"; +import { MessageType } from "../models/enums/MessageType"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; -import { ItemHelper } from "./ItemHelper"; -import { Dialogue, MessageContent, MessagePreview, MessageType } from "../models/eft/profile/IAkiProfile"; import { HashUtil } from "../utils/HashUtil"; -import { NotifierHelper } from "./NotifierHelper"; +import { ItemHelper } from "./ItemHelper"; import { NotificationSendHelper } from "./NotificationSendHelper"; +import { NotifierHelper } from "./NotifierHelper"; export declare class DialogueHelper { - private hashUtil; - private saveServer; - private databaseServer; - private notifierHelper; - private notificationSendHelper; - private itemHelper; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected notificationSendHelper: NotificationSendHelper; + protected itemHelper: ItemHelper; constructor(hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, notificationSendHelper: NotificationSendHelper, itemHelper: ItemHelper); createMessageContext(templateId: string, messageType: MessageType, maxStoreTime: number): MessageContent; addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards?: any[]): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/DurabilityLimitsHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/DurabilityLimitsHelper.d.ts index ee8c887..07a5db1 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/DurabilityLimitsHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/DurabilityLimitsHelper.d.ts @@ -1,25 +1,26 @@ -import { ConfigServer } from "../servers/ConfigServer"; import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { RandomUtil } from "../utils/RandomUtil"; import { BotHelper } from "./BotHelper"; export declare class DurabilityLimitsHelper { - private randomUtil; - private botHelper; - private configServer; - private botConfig; + protected randomUtil: RandomUtil; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(randomUtil: RandomUtil, botHelper: BotHelper, configServer: ConfigServer); getRandomisedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number; getRandomisedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number; getRandomisedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; getRandomisedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; - private generateMaxWeaponDurability; - private generateMaxPmcArmorDurability; - private getLowestMaxWeaponFromConfig; - private getHighestMaxWeaponDurabilityFromConfig; - private generateWeaponDurability; - private generateArmorDurability; - private getMinWeaponDeltaFromConfig; - private getMaxWeaponDeltaFromConfig; - private getMinArmorDeltaFromConfig; - private getMaxArmorDeltaFromConfig; + protected generateMaxWeaponDurability(botRole: string): number; + protected generateMaxPmcArmorDurability(itemMaxDurability: number): number; + protected getLowestMaxWeaponFromConfig(botRole: string): number; + protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number; + protected generateWeaponDurability(botRole: string, maxDurability: number): number; + protected generateArmorDurability(botRole: string, maxDurability: number): number; + protected getMinWeaponDeltaFromConfig(botRole: string): number; + protected getMaxWeaponDeltaFromConfig(botRole: string): number; + protected getMinArmorDeltaFromConfig(botRole: string): number; + protected getMaxArmorDeltaFromConfig(botRole: string): number; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ExtendedProfileHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ExtendedProfileHelper.d.ts index 4dd7d3a..d8b754d 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ExtendedProfileHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ExtendedProfileHelper.d.ts @@ -1,5 +1,5 @@ import { BotGenerator } from "../generators/BotGenerator"; -import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcData, Skills, Stats } from "../models/eft/common/IPmcData"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; import { FenceService } from "../services/FenceService"; @@ -9,14 +9,14 @@ import { Watermark } from "../utils/Watermark"; import { ItemHelper } from "./ItemHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class ExtendedProfileHelper extends ProfileHelper { - private botGenerator; + protected botGenerator: BotGenerator; constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService, botGenerator: BotGenerator); generatePlayerScav(sessionID: string): IPmcData; - private getScavSkills; - private removeSecureContainer; - private getDefaultScavSkills; - private getScavStats; - private getScavLevel; - private getScavExperience; - private setScavCooldownTimer; + protected getScavSkills(sessionID: string): Skills; + protected removeSecureContainer(profile: IPmcData): IPmcData; + protected getDefaultScavSkills(): Skills; + protected getScavStats(sessionID: string): Stats; + protected getScavLevel(sessionID: string): number; + protected getScavExperience(sessionID: string): number; + protected setScavCooldownTimer(profile: IPmcData, pmcData: IPmcData): IPmcData; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/GameEventHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/GameEventHelper.d.ts index 8131d31..b2d6377 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/GameEventHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/GameEventHelper.d.ts @@ -1,6 +1,6 @@ import { DatabaseServer } from "../servers/DatabaseServer"; export declare class GameEventHelper { - private databaseServer; + protected databaseServer: DatabaseServer; constructor(databaseServer: DatabaseServer); get EVENT(): Record; get christmasEventItems(): string[]; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HandbookHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HandbookHelper.d.ts index aed6984..b47d466 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HandbookHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HandbookHelper.d.ts @@ -9,7 +9,7 @@ export declare class LookupCollection { constructor(); } export declare class HandbookHelper { - private lookup; + protected lookup: LookupCollection; hydrateLookup(lookup: LookupCollection): void; getTemplatePrice(x: string): number; templatesWithParent(x: string): string[]; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HealthHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HealthHelper.d.ts index fb5bed7..518c23f 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HealthHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HealthHelper.d.ts @@ -1,23 +1,27 @@ -import { SaveServer } from "../servers/SaveServer"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHealthConfig } from "../models/spt/config/IHealthConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class HealthHelper { - private jsonUtil; - private logger; - private timeUtil; - private saveServer; - private configServer; - private healthConfig; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected configServer: ConfigServer; + protected healthConfig: IHealthConfig; constructor(jsonUtil: JsonUtil, logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, configServer: ConfigServer); resetVitality(sessionID: string): IAkiProfile; saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; - private saveHealth; - private saveEffects; - private addEffect; - private isEmpty; + protected saveHealth(pmcData: IPmcData, sessionID: string): void; + protected saveEffects(pmcData: IPmcData, sessionID: string): void; + protected addEffect(pmcData: IPmcData, sessionID: string, effect: { + bodyPart: string; + effectType: string; + }): void; + protected isEmpty(map: any): boolean; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HideoutHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HideoutHelper.d.ts index 5b4a5ad..76b337f 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HideoutHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HideoutHelper.d.ts @@ -1,10 +1,12 @@ -import { IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Common, HideoutArea, IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Upd } from "../models/eft/common/tables/IItem"; import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { StageBonus } from "../models/eft/hideout/IHideoutArea"; import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -17,26 +19,26 @@ import { TimeUtil } from "../utils/TimeUtil"; import { InventoryHelper } from "./InventoryHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class HideoutHelper { - private logger; - private hashUtil; - private timeUtil; - private randomUtil; - private databaseServer; - private itemEventRouter; - private httpResponse; - private profileHelper; - private inventoryHelper; - private playerService; - private configServer; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected inventoryHelper: InventoryHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; static BITCOIN_FARM: string; - private WATER_COLLECTOR; - private BITCOIN; - private EXPEDITIONARY_FUEL_TANK; + protected WATER_COLLECTOR: string; + protected BITCOIN: string; + protected EXPEDITIONARY_FUEL_TANK: string; static NAME_BACKENDCOUNTERS_CRAFTING: string; static SKILL_NAME_HIDEOUT: string; static HOUR_FOR_SKILL_CRAFTING: number; static SKILL_NAME_CRAFITING: string; - private hideoutConfig; + protected hideoutConfig: IHideoutConfig; constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer); registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; /** @@ -46,18 +48,20 @@ export declare class HideoutHelper { initProduction(recipeId: string, productionTime: number): Production; isProductionType(productive: Productive): productive is Production; applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void; - private applySkillXPBoost; + protected applySkillXPBoost(pmcData: IPmcData, bonus: StageBonus): void; updatePlayerHideout(sessionID: string): void; - private updateFuel; - private updateWaterFilters; - private getAreaUpdObject; - private updateAirFilters; - private updateBitcoinFarm; - private getBTCSlots; - private getManagementSkillsSlots; - private hasManagementSkillSlots; - private getHideoutManagementSkill; - private getHideoutManagementConsumptionBonus; + protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void; + protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean; + protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateWaterFilters(waterFilterArea: HideoutArea, pwProd: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea; + protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd; + protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production; + protected getBTCSlots(pmcData: IPmcData): number; + protected getManagementSkillsSlots(): number; + protected hasManagementSkillSlots(pmcData: IPmcData): boolean; + protected getHideoutManagementSkill(pmcData: IPmcData): Common; + protected getHideoutManagementConsumptionBonus(pmcData: IPmcData): number; isProduction(productive: Productive): productive is Production; getBTC(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; getRandomAmountRewardForScavCase(itemToCalculate: ITemplateItem): number; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HttpServerHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HttpServerHelper.d.ts index 2e40814..c6e5296 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HttpServerHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/HttpServerHelper.d.ts @@ -1,8 +1,19 @@ +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { ConfigServer } from "../servers/ConfigServer"; export declare class HttpServerHelper { - private configServer; - private httpConfig; - private mime; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + protected mime: { + css: string; + bin: string; + html: string; + jpg: string; + js: string; + json: string; + png: string; + svg: string; + txt: string; + }; constructor(configServer: ConfigServer); getMimeText(key: string): string; buildUrl(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/InRaidHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/InRaidHelper.d.ts index e79d384..05b6fdf 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/InRaidHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/InRaidHelper.d.ts @@ -8,15 +8,15 @@ import { JsonUtil } from "../utils/JsonUtil"; import { InventoryHelper } from "./InventoryHelper"; import { PaymentHelper } from "./PaymentHelper"; export declare class InRaidHelper { - private logger; - private saveServer; - private jsonUtil; - private databaseServer; - private inventoryHelper; - private paymentHelper; + protected logger: ILogger; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); - private removePlayer; - private removeMapAccessKey; + protected removePlayer(sessionID: string): void; + protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void; addUpdToMoneyFromRaid(items: Item[]): void; /** * Add positive karma for PMC kills diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/InventoryHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/InventoryHelper.d.ts index 00e95d3..dc7cbca 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/InventoryHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/InventoryHelper.d.ts @@ -5,6 +5,7 @@ import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMe import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInventoryConfig } from "../models/spt/config/IInventoryConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -25,26 +26,26 @@ export interface OwnerInventoryItems { isMail: boolean; } export declare class InventoryHelper { - private logger; - private jsonUtil; - private hashUtil; - private httpResponse; - private fenceService; - private databaseServer; - private paymentHelper; - private traderAssortHelper; - private dialogueHelper; - private itemHelper; - private containerHelper; - private profileHelper; - private configServer; - private inventoryConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected httpResponse: HttpResponseUtil; + protected fenceService: FenceService; + protected databaseServer: DatabaseServer; + protected paymentHelper: PaymentHelper; + protected traderAssortHelper: TraderAssortHelper; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected containerHelper: ContainerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected inventoryConfig: IInventoryConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, httpResponse: HttpResponseUtil, fenceService: FenceService, databaseServer: DatabaseServer, paymentHelper: PaymentHelper, traderAssortHelper: TraderAssortHelper, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, containerHelper: ContainerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; getItemSize(itemTpl: string, itemID: string, inventoryItem: Item[]): Record; - private getSizeByInventoryItemHash; - private getInventoryItemHash; + protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): Record; + protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash; getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]; /** * Based on the item action, determine whose inventories we should be looking at for from and to. @@ -56,9 +57,9 @@ export declare class InventoryHelper { * @param {string} sessionID * @returns Array */ - private getStashSlotMap; - private getStashType; - private getPlayerStashSize; + protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][]; + protected getStashType(sessionID: string): string; + protected getPlayerStashSize(sessionID: string): Record; /** * Internal helper function to transfer an item from one profile to another. * fromProfileData: Profile of the source. @@ -73,5 +74,12 @@ export declare class InventoryHelper { /** * Internal helper function to handle cartridges in inventory if any of them exist. */ - private handleCartridges; + protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void; } +declare namespace InventoryHelper { + interface InventoryItemHash { + byItemId: Record; + byParentId: Record; + } +} +export {}; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ItemHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ItemHelper.d.ts index 8c1175a..f124cb1 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ItemHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ItemHelper.d.ts @@ -1,15 +1,15 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { InsuredItem, IPmcData } from "../models/eft/common/IPmcData"; -import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; declare class ItemHelper { - private logger; - private hashUtil; - private jsonUtil; - private databaseServer; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer); /** * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash @@ -139,98 +139,9 @@ declare class ItemHelper { getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize; } declare namespace ItemHelper { - enum BaseClasses { - WEAPON = "5422acb9af1c889c16000029", - ARMOR = "5448e54d4bdc2dcc718b4568", - VEST = "5448e5284bdc2dcb718b4567", - BACKPACK = "5448e53e4bdc2d60728b4567", - VISORS = "5448e5724bdc2ddf718b4568", - FOOD = "5448e8d04bdc2ddf718b4569", - DRINK = "5448e8d64bdc2dce718b4568", - BARTER_ITEM = "5448eb774bdc2d0a728b4567", - INFO = "5448ecbe4bdc2d60728b4568", - MEDKIT = "5448f39d4bdc2d0a728b4568", - DRUGS = "5448f3a14bdc2d27728b4569", - STIMULATOR = "5448f3a64bdc2d60728b456a", - MEDICAL = "5448f3ac4bdc2dce718b4569", - MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", - MOD = "5448fe124bdc2da5018b4567", - FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", - FUEL = "5d650c3e815116009f6201d2", - GEAR_MOD = "55802f3e4bdc2de7118b4584", - STOCK = "55818a594bdc2db9688b456a", - FOREGRIP = "55818af64bdc2d5b648b4570", - MASTER_MOD = "55802f4a4bdc2ddb688b4569", - MOUNT = "55818b224bdc2dde698b456f", - MUZZLE = "5448fe394bdc2d0d028b456c", - SIGHTS = "5448fe7a4bdc2d6f028b456b", - MEDS = "543be5664bdc2dd4348b4569", - MONEY = "543be5dd4bdc2deb348b4569", - KEY = "543be5e94bdc2df1348b4568", - KEY_MECHANICAL = "5c99f98d86f7745c314214b3", - KEYCARD = "5c164d2286f774194c5e69fa", - EQUIPMENT = "543be5f84bdc2dd4348b456a", - THROW_WEAPON = "543be6564bdc2df4348b4568", - FOOD_DRINK = "543be6674bdc2df1348b4569", - PISTOL = "5447b5cf4bdc2d65278b4567", - SMG = "5447b5e04bdc2d62278b4567", - ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", - ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", - SHOTGUN = "5447b6094bdc2dc3278b4567", - MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", - SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", - MACHINE_GUN = "5447bed64bdc2d97278b4568", - GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", - SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", - SPEC_ITEM = "5447e0e74bdc2d3c308b4567", - KNIFE = "5447e1d04bdc2dff2f8b4567", - AMMO = "5485a8684bdc2da71d8b4567", - AMMO_BOX = "543be5cb4bdc2deb348b4568", - LOOT_CONTAINER = "566965d44bdc2d814c8b4571", - MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", - SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", - STASH = "566abbb64bdc2d144c8b457d", - SORTING_TABLE = "6050cac987d3f925bf016837", - LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", - SIMPLE_CONTAINER = "5795f317245977243854e041", - INVENTORY = "55d720f24bdc2d88028b456d", - STATIONARY_CONTAINER = "567583764bdc2d98058b456e", - POCKETS = "557596e64bdc2dc2118b4571", - ARMBAND = "5b3f15d486f77432d0509248", - DOG_TAG_USEC = "59f32c3b86f77472a31742f0", - DOG_TAG_BEAR = "59f32bb586f774757e1e8442", - JEWELRY = "57864a3d24597754843f8721", - ELECTRONICS = "57864a66245977548f04a81f", - BUILDING_MATERIAL = "57864ada245977548638de91", - TOOL = "57864bb7245977548b3b66c2", - HOUSEHOLD_GOODS = "57864c322459775490116fbf", - LUBRICANT = "57864e4c24597754843f8723", - BATTERY = "57864ee62459775490116fc1", - ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", - TACTICAL_COMBO = "55818b164bdc2ddc698b456c", - MAGAZINE = "5448bc234bdc2d3c308b4569", - LIGHT_LASER = "55818b0e4bdc2dde698b456e", - FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", - COLLIMATOR = "55818ad54bdc2ddc698b4569", - COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", - COMPENSATOR = "550aa4af4bdc2dd4348b456e", - OPTIC_SCOPE = "55818ae44bdc2dde698b456c", - SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", - OTHER = "590c745b86f7743cc433c5f2", - SILENCER = "550aa4cd4bdc2dd8348b456c", - PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", - ITEM = "54009119af1c881c07000029", - CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" - } interface ItemSize { width: number; height: number; } - enum Money { - ROUBLES = "5449016a4bdc2d6f028b456f", - EUROS = "569668774bdc2da2298b4568", - DOLLARS = "5696686a4bdc2da3298b456a" - } } export { ItemHelper }; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/NotificationSendHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/NotificationSendHelper.d.ts index b9298da..34e62d9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/NotificationSendHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/NotificationSendHelper.d.ts @@ -2,8 +2,8 @@ import { INotification } from "../models/eft/notifier/INotifier"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { NotificationService } from "../services/NotificationService"; export declare class NotificationSendHelper { - private httpServer; - private notificationService; + protected httpServer: IHttpServer; + protected notificationService: NotificationService; constructor(httpServer: IHttpServer, notificationService: NotificationService); /** * Send notification message to the appropiate channel diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/NotifierHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/NotifierHelper.d.ts index 0d524e9..738b69a 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/NotifierHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/NotifierHelper.d.ts @@ -2,11 +2,11 @@ import { INotification } from "../models/eft/notifier/INotifier"; import { Message, MessageContentRagfair } from "../models/eft/profile/IAkiProfile"; import { HttpServerHelper } from "./HttpServerHelper"; export declare class NotifierHelper { - private httpServerHelper; + protected httpServerHelper: HttpServerHelper; /** * The default notification sent when waiting times out. */ - private defaultNotification; + protected defaultNotification: INotification; constructor(httpServerHelper: HttpServerHelper); getDefaultNotification(): INotification; /** Creates a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside */ diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/PresetHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/PresetHelper.d.ts index 0a24128..0371886 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/PresetHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/PresetHelper.d.ts @@ -1,8 +1,8 @@ import { Preset } from "../models/eft/common/IGlobals"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class PresetHelper { - private databaseServer; - private lookup; + protected databaseServer: DatabaseServer; + protected lookup: Record; constructor(databaseServer: DatabaseServer); hydratePresetStore(input: Record): void; isPreset(id: string): boolean; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ProfileHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ProfileHelper.d.ts index 508443c..6a64291 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ProfileHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/ProfileHelper.d.ts @@ -28,6 +28,6 @@ export declare class ProfileHelper { getPmcProfile(sessionID: string): IPmcData; getScavProfile(sessionID: string): IPmcData; getDefaultCounters(): Stats; - private isWiped; - private getServerVersion; + protected isWiped(sessionID: string): boolean; + protected getServerVersion(): string; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/QuestConditionHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/QuestConditionHelper.d.ts index 2a0ee94..90ee560 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/QuestConditionHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/QuestConditionHelper.d.ts @@ -3,5 +3,5 @@ export declare class QuestConditionHelper { getQuestConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; getLevelConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; getLoyaltyConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; - private filterConditions; + protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/QuestHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/QuestHelper.d.ts index 9e2dd5e..f32c85c 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/QuestHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/QuestHelper.d.ts @@ -3,6 +3,7 @@ import { AvailableForConditions, AvailableForProps, IQuest, Reward } from "../mo import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -17,20 +18,20 @@ import { ProfileHelper } from "./ProfileHelper"; import { RagfairServerHelper } from "./RagfairServerHelper"; import { TraderHelper } from "./TraderHelper"; export declare class QuestHelper { - private logger; - private jsonUtil; - private timeUtil; - private hashUtil; - private itemHelper; - private itemEventRouter; - private databaseServer; - private ragfairServerHelper; - private dialogueHelper; - private profileHelper; - private paymentHelper; - private traderHelper; - private configServer; - private questConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, traderHelper: TraderHelper, configServer: ConfigServer); static get STATUS(): Record; questStatus(pmcData: IPmcData, questID: string): string; @@ -47,7 +48,7 @@ export declare class QuestHelper { */ dumpQuests(quests: any, label?: any): void; loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean; - private processReward; + protected processReward(reward: Reward): any[]; getQuestRewardItems(quest: IQuest, state: string): Reward[]; addQuestToPMCData(pmcData: IPmcData, quest: Quest, newState: string, acceptedQuest: IAcceptQuestRequestData): void; acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[]; @@ -58,7 +59,7 @@ export declare class QuestHelper { * Get List of All Quests as an array */ questValues(): IQuest[]; - private cleanQuestList; + protected cleanQuestList(quests: IQuest[]): IQuest[]; cleanQuestConditions(quest: IQuest): IQuest; failQuest(pmcData: IPmcData, body: any, sessionID: string): any; getQuestFromDb(questId: string, pmcData: IPmcData): IQuest; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairHelper.d.ts index 8e70bcd..c8bc5ba 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairHelper.d.ts @@ -2,6 +2,7 @@ import { Item } from "../models/eft/common/tables/IItem"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -12,16 +13,16 @@ import { ItemHelper } from "./ItemHelper"; import { TraderAssortHelper } from "./TraderAssortHelper"; import { UtilityHelper } from "./UtilityHelper"; export declare class RagfairHelper { - private logger; - private jsonUtil; - private traderAssortHelper; - private databaseServer; - private handbookHelper; - private itemHelper; - private ragfairLinkedItemService; - private utilityHelper; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected traderAssortHelper: TraderAssortHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected ragfairLinkedItemService: RagfairLinkedItemService; + protected utilityHelper: UtilityHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, traderAssortHelper: TraderAssortHelper, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, ragfairLinkedItemService: RagfairLinkedItemService, utilityHelper: UtilityHelper, configServer: ConfigServer); /** * Gets currency TAG from TPL @@ -31,7 +32,7 @@ export declare class RagfairHelper { getCurrencyTag(currency: string): string; filterCategories(sessionID: string, info: ISearchRequestData): string[]; getDisplayableAssorts(sessionID: string): Record; - private getCategoryList; + protected getCategoryList(handbookId: string): string[]; countCategories(result: IGetOffersResult): void; /** * Merges Root Items diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairOfferHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairOfferHelper.d.ts index 3bf8add..129bc1c 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairOfferHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairOfferHelper.d.ts @@ -1,7 +1,10 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -19,31 +22,31 @@ import { RagfairHelper } from "./RagfairHelper"; import { RagfairServerHelper } from "./RagfairServerHelper"; import { RagfairSortHelper } from "./RagfairSortHelper"; export declare class RagfairOfferHelper { - private logger; - private timeUtil; - private hashUtil; - private itemEventRouter; - private databaseServer; - private saveServer; - private dialogueHelper; - private itemHelper; - private paymentHelper; - private presetHelper; - private profileHelper; - private ragfairServerHelper; - private ragfairSortHelper; - private ragfairHelper; - private ragfairOfferService; - private configServer; - private static TPL_GOODS_SOLD; - private ragfairConfig; - private questConfig; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected paymentHelper: PaymentHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected configServer: ConfigServer; + protected static TPL_GOODS_SOLD: string; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, configServer: ConfigServer); getValidOffers(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; getOffersForBuild(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; processOffers(sessionID: string): boolean; - private getProfileOffers; - private deleteOfferByOfferId; - private completeOffer; + protected getProfileOffers(sessionID: string): IRagfairOffer[]; + protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairSellHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairSellHelper.d.ts index 929d112..6ec004a 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairSellHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairSellHelper.d.ts @@ -1,14 +1,15 @@ import { SellResult } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class RagfairSellHelper { - private logger; - private randomUtil; - private timeUtil; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); calculateSellChance(baseChance: number, offerPrice: number, requirementsPriceInRub: number): number; rollForSale(sellChance: number, count: number): SellResult[]; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairServerHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairServerHelper.d.ts index 0f32a66..2cb3ea5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairServerHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairServerHelper.d.ts @@ -1,6 +1,8 @@ -import { MemberCategory } from "../models/eft/common/MemberCategory"; +import { MemberCategory } from "../models/enums/MemberCategory"; import { Item } from "../models/eft/common/tables/IItem"; import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; @@ -11,21 +13,26 @@ import { DialogueHelper } from "./DialogueHelper"; import { ItemHelper } from "./ItemHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class RagfairServerHelper { - private randomUtil; - private hashUtil; - private saveServer; - private databaseServer; - private profileHelper; - private itemHelper; - private dialogueHelper; - private jsonUtil; - private configServer; - private ragfairConfig; - private questConfig; - private static TPL_GOODS_RETURNED; + protected randomUtil: RandomUtil; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected jsonUtil: JsonUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + protected static TPL_GOODS_RETURNED: string; constructor(randomUtil: RandomUtil, hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, profileHelper: ProfileHelper, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, jsonUtil: JsonUtil, configServer: ConfigServer); + /** + * Is item valid / on blacklist / quest item + * @param itemDetails + * @returns boolean + */ isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean; - isItemBlacklisted(itemTemplateId: string): boolean; + protected isItemBlacklisted(itemTemplateId: string): boolean; isTrader(userID: string): boolean; isPlayer(userID: string): boolean; returnItems(sessionID: string, items: any[]): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairSortHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairSortHelper.d.ts index e9d8069..e983569 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairSortHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairSortHelper.d.ts @@ -1,12 +1,12 @@ import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class RagfairSortHelper { - private databaseServer; + protected databaseServer: DatabaseServer; constructor(databaseServer: DatabaseServer); sortOffers(offers: IRagfairOffer[], type: number, direction?: number): IRagfairOffer[]; - private sortOffersByID; - private sortOffersByRating; - private sortOffersByName; - private sortOffersByPrice; - private sortOffersByExpiry; + protected sortOffersByID(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByExpiry(a: IRagfairOffer, b: IRagfairOffer): number; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairTaxHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairTaxHelper.d.ts index e87334f..820facb 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairTaxHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RagfairTaxHelper.d.ts @@ -1,15 +1,16 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { DatabaseServer } from "../servers/DatabaseServer"; import { RagfairPriceService } from "../services/RagfairPriceService"; import { ItemHelper } from "./ItemHelper"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class RagfairTaxHelper { - private logger; - private databaseServer; - private ragfairPriceService; - private itemHelper; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected ragfairPriceService: RagfairPriceService; + protected itemHelper: ItemHelper; constructor(logger: ILogger, databaseServer: DatabaseServer, ragfairPriceService: RagfairPriceService, itemHelper: ItemHelper); calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number; - private calculateItemWorth; + protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem?: boolean): number; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RepairHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RepairHelper.d.ts index d11d0d2..650c1aa 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RepairHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/RepairHelper.d.ts @@ -1,20 +1,22 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { IPmcData } from "../models/eft/common/IPmcData"; import { Item } from "../models/eft/common/tables/IItem"; +import { Props } from "../models/eft/common/tables/ITemplateItem"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class RepairHelper { - private logger; - private jsonUtil; - private randomUtil; - private databaseServer; - private configServer; - private repairConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, configServer: ConfigServer); updateItemDurability(itemToRepairId: string, amountToRepair: number, pmcData: IPmcData, useRepairKit?: boolean): Item; - private getRandomisedArmorRepairDegredationValue; - private getRandomisedWeaponRepairDegredationValue; + protected getRandomisedArmorRepairDegredationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number): number; + protected getRandomisedWeaponRepairDegredationValue(itemProps: Props, isRepairKit: boolean, armorMax: number): number; isWeaponTemplate(tpl: string): boolean; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/SecureContainerHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/SecureContainerHelper.d.ts index 8f246b6..9e2bc32 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/SecureContainerHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/SecureContainerHelper.d.ts @@ -7,7 +7,7 @@ export interface OwnerInventoryItems { isMail: boolean; } export declare class SecureContainerHelper { - private itemHelper; + protected itemHelper: ItemHelper; constructor(itemHelper: ItemHelper); getSecureContainerItems(items: Item[]): string[]; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TradeHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TradeHelper.d.ts index a78cd20..975062b 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TradeHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TradeHelper.d.ts @@ -2,7 +2,7 @@ import { InventoryHelper } from "../helpers/InventoryHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { Upd } from "../models/eft/common/tables/IItem"; +import { Item, Upd } from "../models/eft/common/tables/IItem"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; @@ -12,20 +12,33 @@ import { RagfairServer } from "../servers/RagfairServer"; import { FenceService } from "../services/FenceService"; import { PaymentService } from "../services/PaymentService"; export declare class TradeHelper { - private logger; - private itemEventRouter; - private traderHelper; - private itemHelper; - private paymentService; - private fenceService; - private inventoryHelper; - private ragfairServer; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected fenceService: FenceService; + protected inventoryHelper: InventoryHelper; + protected ragfairServer: RagfairServer; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer); + /** + * Buy item from flea or trader + * @param pmcData + * @param buyRequestData data from client + * @param sessionID + * @param foundInRaid + * @param upd optional item details used when buying from flea + * @returns + */ buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse; /** - * Selling item to trader + * Sell item to trader + * @param pmcData + * @param body + * @param sessionID + * @returns */ sellItem(pmcData: IPmcData, body: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse; - private incrementAssortBuyCount; - private checkPurchaseIsWithinTraderItemLimit; + protected incrementAssortBuyCount(assortBeingPurchased: Item, itemsPurchasedCount: number): void; + protected checkPurchaseIsWithinTraderItemLimit(assortBeingPurchased: Item, assortId: string, count: number): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TraderAssortHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TraderAssortHelper.d.ts index d95879c..4f41ac2 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TraderAssortHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TraderAssortHelper.d.ts @@ -1,7 +1,8 @@ -import { ITraderAssort } from "../models/eft/common/tables/ITrader"; -import { ILogger } from "../models/spt/utils/ILogger"; import { RagfairAssortGenerator } from "../generators/RagfairAssortGenerator"; import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { FenceService } from "../services/FenceService"; import { TraderAssortService } from "../services/TraderAssortService"; @@ -9,15 +10,33 @@ import { JsonUtil } from "../utils/JsonUtil"; import { AssortHelper } from "./AssortHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class TraderAssortHelper { - private logger; - private jsonUtil; - private databaseServer; - private profileHelper; - private assortHelper; - private ragfairAssortGenerator; - private ragfairOfferGenerator; - private traderAssortService; - private fenceService; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected assortHelper: AssortHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected traderAssortService: TraderAssortService; + protected fenceService: FenceService; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, profileHelper: ProfileHelper, assortHelper: AssortHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferGenerator: RagfairOfferGenerator, traderAssortService: TraderAssortService, fenceService: FenceService); + /** + * Get a traders assorts + * Can be used for returning ragfair / fence assorts + * @param sessionId session id + * @param traderId trader id + * @returns a traders assorts + */ getAssort(sessionId: string, traderId: string): ITraderAssort; + /** + * Get an array of pristine trader items prior to any alteration by player + * @param traderId trader id + * @returns array of Items + */ + protected getPristineTraderAssorts(traderId: string): Item[]; + /** + * Returns generated ragfair offers in a trader assort format + * @returns Trader assort object + */ + protected getRagfairDataAsTraderAssort(): ITraderAssort; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TraderHelper.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TraderHelper.d.ts index 5440afe..ab4a371 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TraderHelper.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/helpers/TraderHelper.d.ts @@ -1,35 +1,53 @@ -import { SaveServer } from "../servers/SaveServer"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; import { PlayerService } from "../services/PlayerService"; import { HandbookHelper } from "./HandbookHelper"; import { ItemHelper } from "./ItemHelper"; -import { ProfileHelper } from "./ProfileHelper"; import { PaymentHelper } from "./PaymentHelper"; -import { FenceService } from "../services/FenceService"; -import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; -import { IPmcData } from "../models/eft/common/IPmcData"; -import { ConfigServer } from "../servers/ConfigServer"; -import { ILogger } from "../models/spt/utils/ILogger"; +import { ProfileHelper } from "./ProfileHelper"; export declare class TraderHelper { - private logger; - private databaseServer; - private saveServer; - private profileHelper; - private paymentHelper; - private itemHelper; - private handbookHelper; - private playerService; - private fenceService; - private configServer; - private traderConfig; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemHelper: ItemHelper; + protected handbookHelper: HandbookHelper; + protected playerService: PlayerService; + protected fenceService: FenceService; + protected configServer: ConfigServer; + protected traderConfig: ITraderConfig; constructor(logger: ILogger, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemHelper: ItemHelper, handbookHelper: HandbookHelper, playerService: PlayerService, fenceService: FenceService, configServer: ConfigServer); getTrader(traderID: string, sessionID: string): ITraderBase; getTraderAssortsById(traderId: string): ITraderAssort; + /** + * Reset a trader back to its initial state as seen by a level 1 player + * Does NOT take into account different profile levels + * @param sessionID session id + * @param traderID trader id to reset + */ resetTrader(sessionID: string, traderID: string): void; changeTraderDisplay(traderID: string, status: boolean, sessionID: string): void; getPurchasesData(traderID: string, sessionID: string): Record; + /** + * Calculate traders level based on exp amount and increment level if over threshold + * @param traderID trader to process + * @param sessionID session id + */ lvlUp(traderID: string, sessionID: string): void; getTraderUpdateSeconds(traderId: string): number; + /** + * check if an item is allowed to be sold to a trader + * @param traderFilters array of allowed categories + * @param tplToCheck itemTpl of inventory + * @returns boolean + */ traderFilter(traderFilters: string[], tplToCheck: string): boolean; getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/ide/BleedingEdgeEntry.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/ide/BleedingEdgeEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/ide/BleedingEdgeEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/BundleLoader.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/BundleLoader.d.ts index 9abfe9f..06ad698 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/BundleLoader.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/BundleLoader.d.ts @@ -2,18 +2,18 @@ import { HttpServerHelper } from "../helpers/HttpServerHelper"; import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; declare class BundleInfo { - private httpServerHelper; + modPath: string; key: string; path: string; filepath: string; dependencyKeys: string[]; - constructor(modpath: string, bundle: any, httpServerHelper: HttpServerHelper); + constructor(modpath: string, bundle: any, bundlePath: string, bundleFilepath: string); } export declare class BundleLoader { - private httpServerHelper; - private vfs; - private jsonUtil; - private bundles; + protected httpServerHelper: HttpServerHelper; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected bundles: Record; constructor(httpServerHelper: HttpServerHelper, vfs: VFS, jsonUtil: JsonUtil); getBundles(local: boolean): BundleInfo[]; getBundle(key: string, local: boolean): BundleInfo; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/DelayedModLoader.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/DelayedModLoader.d.ts index 7e7d8d0..2a05604 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/DelayedModLoader.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/DelayedModLoader.d.ts @@ -6,17 +6,16 @@ import { VFS } from "../utils/VFS"; import { BundleLoader } from "./BundleLoader"; import { InitialModLoader } from "./InitialModLoader"; export declare class DelayedModLoader implements IModLoader { - private bundleLoader; - private handbookController; - private vfs; - private modCompilerService; - private initialModLoader; + protected bundleLoader: BundleLoader; + protected handbookController: HandbookController; + protected vfs: VFS; + protected modCompilerService: ModCompilerService; + protected initialModLoader: InitialModLoader; constructor(bundleLoader: BundleLoader, handbookController: HandbookController, vfs: VFS, modCompilerService: ModCompilerService, initialModLoader: InitialModLoader); getBundles(local: boolean): string; getBundle(key: string, local: boolean): void; - getImportedModsNames(): string[]; getModPath(mod: string): string; - load(container: DependencyContainer): void; - private executeMods; - private addBundles; + load(): void; + protected executeMods(container: DependencyContainer): void; + protected addBundles(): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/InitialModLoader.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/InitialModLoader.d.ts index a53cce2..68e47fe 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/InitialModLoader.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/loaders/InitialModLoader.d.ts @@ -1,35 +1,64 @@ import { DependencyContainer } from "tsyringe"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ModLoader } from "../models/spt/mod/IMod"; import { IModLoader } from "../models/spt/mod/IModLoader"; +import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { ModCompilerService } from "../services/ModCompilerService"; import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; export declare class InitialModLoader implements IModLoader { - private logger; - private vfs; - private jsonUtil; - private modCompilerService; - private configServer; - private readonly basepath; - private imported; - private onLoad; - private akiConfig; - constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, configServer: ConfigServer); + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected modCompilerService: ModCompilerService; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected static container: DependencyContainer; + protected readonly basepath = "user/mods/"; + protected imported: Record; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer); load(container: DependencyContainer): Promise; getBundles(local: boolean): string; getBundle(key: string, local: boolean): void; + /** + * Returns a list of mods with preserved load order + * @returns Array of mod names in load order + */ getImportedModsNames(): string[]; getModPath(mod: string): string; - private importClass; - private importMods; - private isModCombatibleWithAki; - private executeMods; - private sortModsLoadOrder; - private addMod; - private areModDependenciesFulfilled; - private isModCompatible; - private validMod; - private getLoadOrderRecursive; - private getLoadOrder; + protected importClass(name: string, filepath: string, container: DependencyContainer): void; + protected importMods(): Promise; + /** + * + * @param mods Get an array of broken/invalid mods by name + * @returns Mod names array + */ + protected getBrokenMods(mods: string[]): string[]; + /** + * Get packageJson data for mods + * @param mods mods to get packageJson for + * @returns dictionary + */ + protected getModsPackageData(mods: string[]): Record; + /** + * Does mod have "delayedLoad(" string in its entry class + * @param modFolderName folder name + * @param modToValidate package.json details + * @returns boolean + */ + protected isModSpt300Compatible(modFolderName: string, modToValidate: IPackageJsonData): boolean; + protected isModCombatibleWithAki(mod: IPackageJsonData): boolean; + protected executeMods(container: DependencyContainer): void; + sortModsLoadOrder(): string[]; + protected addMod(mod: string): Promise; + protected areModDependenciesFulfilled(mod: IPackageJsonData, loadedMods: Record): boolean; + protected isModCompatible(mod: IPackageJsonData, loadedMods: Record): boolean; + protected validMod(mod: string): boolean; + protected getLoadOrderRecursive(mod: string, result: Record, visited: Record): void; + protected getLoadOrder(mods: Record): Record; + getContainer(): DependencyContainer; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/ILocationBase.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/ILocationBase.d.ts index 0d092f6..ad48d32 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/ILocationBase.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/ILocationBase.d.ts @@ -107,6 +107,15 @@ export interface BossLocationSpawn { BossPlayer: boolean; BossZone: string; Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; +} +export interface BossSupport { + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; } export interface BotLocationModifier { AccuracySpeed: number; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/IPmcData.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/IPmcData.d.ts index 2360147..adc2aa5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/IPmcData.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/IPmcData.d.ts @@ -1,8 +1,8 @@ import { IRagfairOffer } from "../ragfair/IRagfairOffer"; import { IPmcDataRepeatableQuest } from "./tables/IRepeatableQuests"; import { Item, Upd } from "./tables/IItem"; -import { HideoutAreasEnum } from "../hideout/HideoutAreasEnum"; -import { MemberCategory } from "./MemberCategory"; +import { HideoutAreas } from "../../enums/HideoutAreas"; +import { MemberCategory } from "../../enums/MemberCategory"; export interface IPmcData { _id: string; aid: string; @@ -289,7 +289,7 @@ export interface Production extends Productive { ProductionTime: number; } export interface HideoutArea { - type: HideoutAreasEnum; + type: HideoutAreas; level: number; active: boolean; passiveBonusesEnabled: boolean; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/tables/IBotType.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/tables/IBotType.d.ts index e0f39d9..01be0be 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/tables/IBotType.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/tables/IBotType.d.ts @@ -100,6 +100,8 @@ export interface Generation { export interface ItemMinMax { grenades: MinMax; healing: MinMax; + drugs: MinMax; + stims: MinMax; looseLoot: MinMax; magazines: MinMax; specialItems: MinMax; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/tables/IQuest.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/tables/IQuest.d.ts index 1582a2f..e1fc888 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/tables/IQuest.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/common/tables/IQuest.d.ts @@ -44,8 +44,42 @@ export interface AvailableForProps { value?: number; compareMethod?: string; visibilityConditions?: VisibilityCondition[]; - target?: string; + target?: string | string[]; status?: number[]; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; +} +export interface AvailableForCounter { + id: string; + conditions: CounterCondition[]; +} +export interface CounterCondition { + _parent: string; + _props: CounterProps; +} +export interface CounterProps { + id: string; + target: string[] | string; + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; +} +export interface DaytimeCounter { + from: number; + to: number; } export interface VisibilityCondition { id: string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/IGetFriendListDataResponse.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/IGetFriendListDataResponse.d.ts index 41858c9..1d0c0e8 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/IGetFriendListDataResponse.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/IGetFriendListDataResponse.d.ts @@ -1,4 +1,4 @@ -import { MemberCategory } from "../common/MemberCategory"; +import { MemberCategory } from "../../enums/MemberCategory"; export interface IGetFriendListDataResponse { Friends: Friend[]; Ignore: any[]; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts index db45477..43d416e 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts @@ -1,4 +1,4 @@ -import { MessageType } from "../profile/IAkiProfile"; +import { MessageType } from "../../enums/MessageType"; export interface IGetMailDialogViewRequestData { type: MessageType; dialogId: string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/ISendMessageRequest.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/ISendMessageRequest.d.ts index 5f140c7..dd79deb 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/ISendMessageRequest.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/dialog/ISendMessageRequest.d.ts @@ -1,4 +1,4 @@ -import { MessageType } from "../profile/IAkiProfile"; +import { MessageType } from "../../enums/MessageType"; export interface ISendMessageRequest { dialogId: string; type: MessageType; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/profile/IAkiProfile.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/profile/IAkiProfile.d.ts index f95e9a8..3e0b319 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/profile/IAkiProfile.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/profile/IAkiProfile.d.ts @@ -1,3 +1,4 @@ +import { MessageType } from "../../enums/MessageType"; import { IPmcData } from "../common/IPmcData"; import { Item } from "../common/tables/IItem"; export interface IAkiProfile { @@ -43,22 +44,6 @@ export interface DialogueInfo { new: number; attachmentsNew: number; } -export declare enum MessageType { - USER_MESSAGE = 1, - NPC_TRADER = 2, - AUCTION_MESSAGE = 3, - FLEAMARKET_MESSAGE = 4, - ADMIN_MESSAGE = 5, - GROUP_CHAT_MESSAGE = 6, - SYSTEM_MESSAGE = 7, - INSURANCE_RETURN = 8, - GLOBAL_CHAT = 9, - QUEST_START = 10, - QUEST_FAIL = 11, - QUEST_SUCCESS = 12, - MESSAGE_WITH_ITEMS = 13, - INITIAL_SUPPORT = 14 -} export interface Message { _id: string; uid: string; @@ -141,12 +126,16 @@ export interface Chest { export interface Stomach { } export interface LeftArm { + Fracture?: number; } export interface RightArm { + Fracture?: number; } export interface LeftLeg { + Fracture?: number; } export interface RightLeg { + Fracture?: number; } export interface Inraid { location: string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/ragfair/IRagfairOffer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/ragfair/IRagfairOffer.d.ts index 6620a00..63f655e 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/ragfair/IRagfairOffer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/eft/ragfair/IRagfairOffer.d.ts @@ -1,4 +1,4 @@ -import { MemberCategory } from "../common/MemberCategory"; +import { MemberCategory } from "../../enums/MemberCategory"; import { Item } from "../common/tables/IItem"; export interface IRagfairOffer { sellResult?: SellResult[]; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/BaseClasses.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/BaseClasses.d.ts new file mode 100644 index 0000000..e733bca --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/BaseClasses.d.ts @@ -0,0 +1,84 @@ +export declare enum BaseClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMOR = "5448e54d4bdc2dcc718b4568", + VEST = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/ConfigTypes.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/ConfigTypes.d.ts new file mode 100644 index 0000000..6bd31e8 --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/ConfigTypes.d.ts @@ -0,0 +1,18 @@ +export declare enum ConfigTypes { + AIRDROP = "aki-airdrop", + BOT = "aki-bot", + CORE = "aki-core", + HEALTH = "aki-health", + HIDEOUT = "aki-hideout", + HTTP = "aki-http", + IN_RAID = "aki-inraid", + INSURANCE = "aki-insurance", + INVENTORY = "aki-inventory", + LOCATION = "aki-location", + MATCH = "aki-match", + QUEST = "aki-quest", + RAGFAIR = "aki-ragfair", + REPAIR = "aki-repair", + TRADER = "aki-trader", + WEATHER = "aki-weather" +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/ELocationName.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/ELocationName.d.ts new file mode 100644 index 0000000..b56cc08 --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/ELocationName.d.ts @@ -0,0 +1,11 @@ +export declare enum ELocationName { + FACTORY_DAY = "factory4_day", + BIGMAP = "bigmap", + WOODS = "Woods", + SHORELINE = "Shoreline", + INTERCHANGE = "Interchange", + LIGHTHOUSE = "Lighthouse", + LABORATORY = "laboratory", + RESERVE = "RezervBase", + ANY = "any" +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/EquipmentSlots.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/EquipmentSlots.d.ts new file mode 100644 index 0000000..35c18ff --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/EquipmentSlots.d.ts @@ -0,0 +1,16 @@ +export declare enum EquipmentSlots { + HEADWEAR = "Headwear", + EARPIECE = "Earpiece", + FACE_COVER = "FaceCover", + ARMOR_VEST = "ArmorVest", + EYEWEAR = "Eyewear", + ARM_BAND = "ArmBand", + TACTICAL_VEST = "TacticalVest", + POCKETS = "Pockets", + BACKPACK = "Backpack", + SECURED_CONTAINER = "SecuredContainer", + FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", + SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", + HOLSTER = "Holster", + SCABBARD = "Scabbard" +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/HideoutAreas.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/HideoutAreas.d.ts new file mode 100644 index 0000000..b44a20a --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/HideoutAreas.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreas { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/MemberCategory.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/MessageType.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/MessageType.d.ts new file mode 100644 index 0000000..1b0c649 --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/MessageType.d.ts @@ -0,0 +1,16 @@ +export declare enum MessageType { + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14 +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/Money.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/Money.d.ts new file mode 100644 index 0000000..0d39613 --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/Money.d.ts @@ -0,0 +1,5 @@ +export declare enum Money { + ROUBLES = "5449016a4bdc2d6f028b456f", + EUROS = "569668774bdc2da2298b4568", + DOLLARS = "5696686a4bdc2da3298b456a" +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/Traders.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/Traders.d.ts new file mode 100644 index 0000000..163cd71 --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/enums/Traders.d.ts @@ -0,0 +1,10 @@ +export declare enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/config/IBotConfig.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/config/IBotConfig.d.ts index f8ea940..5fb9d93 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/config/IBotConfig.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/config/IBotConfig.d.ts @@ -5,6 +5,7 @@ export interface IBotConfig extends IBaseConfig { bosses: string[]; durability: Durability; lootNValue: LootNvalue; + revenge: Record; pmc: PmcConfig; showTypeInNickname: boolean; maxBotCap: number; @@ -97,6 +98,7 @@ export interface PmcConfig { maxPocketLootTotalRub: number; maxVestLootTotalRub: number; types: Types; + enemyTypes: string[]; } export interface DynamicLoot { whitelist: string[]; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/config/IQuestConfig.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/config/IQuestConfig.d.ts index 03dc890..be4a97b 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/config/IQuestConfig.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/config/IQuestConfig.d.ts @@ -1,3 +1,4 @@ +import { ELocationName } from "../../enums/ELocationName"; import { IBaseConfig } from "./IBaseConfig"; export interface IQuestConfig extends IBaseConfig { kind: "aki-quest"; @@ -15,17 +16,6 @@ export interface IRepeatableQuestConfig { traderWhitelist: ITraderWhitelist[]; questConfig: IQuestConfig; } -export declare enum ELocationName { - FACTORY_DAY = "factory4_day", - BIGMAP = "bigmap", - WOODS = "Woods", - SHORELINE = "Shoreline", - INTERCHANGE = "Interchange", - LIGHTHOUSE = "Lighthouse", - LABORATORY = "laboratory", - RESERVE = "RezervBase", - ANY = "any" -} export interface IRewardScaling { levels: number[]; experience: number[]; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/helpers/Traders.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/helpers/Traders.d.ts index 163cd71..e935d29 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/helpers/Traders.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/helpers/Traders.d.ts @@ -1,4 +1,4 @@ -export declare enum Traders { +export declare const enum Traders { PRAPOR = "54cb50c76803fa8b248b4571", THERAPIST = "54cb57776803fa99248b456e", FENCE = "579dc571d53a0658a154fbec", diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/mod/IMod.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/mod/IMod.d.ts index 623e3dd..e6eec79 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/mod/IMod.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/mod/IMod.d.ts @@ -1,4 +1,4 @@ -declare namespace ModLoader { +export declare namespace ModLoader { interface IMod { name: string; version: string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/mod/IModLoader.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/mod/IModLoader.d.ts index 5398c9b..40a5e19 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/mod/IModLoader.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/mod/IModLoader.d.ts @@ -3,6 +3,5 @@ export interface IModLoader { load(container: DependencyContainer): void; getBundles(local: boolean): string; getBundle(key: string, local: boolean): void; - getImportedModsNames(): string[]; getModPath(mod: string): string; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/server/IHttpServer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/server/IHttpServer.d.ts index 50e5c91..c828399 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/server/IHttpServer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/server/IHttpServer.d.ts @@ -1,4 +1,5 @@ /// +/// import http, { ServerResponse } from "http"; import { INotification } from "../../eft/notifier/INotifier"; export interface IHttpServer { diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/server/ILocaleBase.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/server/ILocaleBase.d.ts index a20084d..8887c06 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/server/ILocaleBase.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/models/spt/server/ILocaleBase.d.ts @@ -1,5 +1,5 @@ export interface ILocaleBase { - global: ILocaleGlobalBase; + global: Record; menu: Record; languages: ILanguageBase[]; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/HttpRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/HttpRouter.d.ts index 44edc0b..f75a47d 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/HttpRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/HttpRouter.d.ts @@ -1,11 +1,16 @@ /// import { IncomingMessage } from "http"; -import { DynamicRouter, StaticRouter } from "../di/Router"; +import { DynamicRouter, Router, StaticRouter } from "../di/Router"; export declare class HttpRouter { - private staticRouters; - private dynamicRoutes; + protected staticRouters: StaticRouter[]; + protected dynamicRoutes: DynamicRouter[]; constructor(staticRouters: StaticRouter[], dynamicRoutes: DynamicRouter[]); - private groupBy; + protected groupBy(list: T[], keyGetter: (t: T) => string): Map; getResponse(req: IncomingMessage, info: any, sessionID: string): string; - private handleRoute; + protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean; } +declare class ResponseWrapper { + output: string; + constructor(output: string); +} +export {}; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/ImageRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/ImageRouter.d.ts index 07a0606..ab03977 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/ImageRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/ImageRouter.d.ts @@ -1,11 +1,12 @@ /// import { IncomingMessage, ServerResponse } from "http"; -import { VFS } from "../utils/VFS"; import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ImageRouteService } from "../services/mod/image/ImageRouteService"; +import { VFS } from "../utils/VFS"; export declare class ImageRouter { - private vfs; - constructor(vfs: VFS); - private onRoute; + protected vfs: VFS; + protected imageRouteService: ImageRouteService; + constructor(vfs: VFS, imageRouteService: ImageRouteService); addRoute(key: string, valueToAdd: string): void; sendImage(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any, httpServer: IHttpServer): void; getImage(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/ItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/ItemEventRouter.d.ts index bb20152..b1ac5d9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/ItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/ItemEventRouter.d.ts @@ -5,13 +5,13 @@ import { ProfileHelper } from "../helpers/ProfileHelper"; import { ItemEventRouterDefinition } from "../di/Router"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class ItemEventRouter { - private logger; - private jsonUtil; - private profileHelper; - private itemEventRouters; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected profileHelper: ProfileHelper; + protected itemEventRouters: ItemEventRouterDefinition[]; constructor(logger: ILogger, jsonUtil: JsonUtil, profileHelper: ProfileHelper, itemEventRouters: ItemEventRouterDefinition[]); - private output; + protected output: IItemEventRouterResponse; handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse; getOutput(sessionID: string): IItemEventRouterResponse; - private resetOutput; + protected resetOutput(sessionID: string): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/BotDynamicRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/BotDynamicRouter.d.ts index dd2f68a..6d0ab4b 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/BotDynamicRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/BotDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { BotCallbacks } from "../../callbacks/BotCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class BotDynamicRouter extends DynamicRouter { - private botCallbacks; + protected botCallbacks: BotCallbacks; constructor(botCallbacks: BotCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/BundleDynamicRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/BundleDynamicRouter.d.ts index be27008..a765410 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/BundleDynamicRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/BundleDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class BundleDynamicRouter extends DynamicRouter { - private bundleCallbacks; + protected bundleCallbacks: BundleCallbacks; constructor(bundleCallbacks: BundleCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/CustomizationDynamicRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/CustomizationDynamicRouter.d.ts index 03a5967..2db7cc5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/CustomizationDynamicRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/CustomizationDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class CustomizationDynamicRouter extends DynamicRouter { - private customizationCallbacks; + protected customizationCallbacks: CustomizationCallbacks; constructor(customizationCallbacks: CustomizationCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/DataDynamicRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/DataDynamicRouter.d.ts index c30501a..836ed8d 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/DataDynamicRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/DataDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { DataCallbacks } from "../../callbacks/DataCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class DataDynamicRouter extends DynamicRouter { - private dataCallbacks; + protected dataCallbacks: DataCallbacks; constructor(dataCallbacks: DataCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/HttpDynamicRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/HttpDynamicRouter.d.ts index b2933e9..a152b4d 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/HttpDynamicRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/HttpDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { DynamicRouter } from "../../di/Router"; import { ImageRouter } from "../ImageRouter"; export declare class HttpDynamicRouter extends DynamicRouter { - private imageRouter; + protected imageRouter: ImageRouter; constructor(imageRouter: ImageRouter); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/InraidDynamicRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/InraidDynamicRouter.d.ts index ea4a9ae..7c0561f 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/InraidDynamicRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/InraidDynamicRouter.d.ts @@ -1,7 +1,7 @@ import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class InraidDynamicRouter extends DynamicRouter { - private inraidCallbacks; + protected inraidCallbacks: InraidCallbacks; constructor(inraidCallbacks: InraidCallbacks); getTopLevelRoute(): string; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/LocationDynamicRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/LocationDynamicRouter.d.ts index 30741db..b8e5cdf 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/LocationDynamicRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/LocationDynamicRouter.d.ts @@ -1,7 +1,7 @@ import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class LocationDynamicRouter extends DynamicRouter { - private locationCallbacks; + protected locationCallbacks: LocationCallbacks; constructor(locationCallbacks: LocationCallbacks); getTopLevelRoute(): string; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/NotifierDynamicRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/NotifierDynamicRouter.d.ts index 4786817..83c60c5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/NotifierDynamicRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/NotifierDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class NotifierDynamicRouter extends DynamicRouter { - private notifierCallbacks; + protected notifierCallbacks: NotifierCallbacks; constructor(notifierCallbacks: NotifierCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/TraderDynamicRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/TraderDynamicRouter.d.ts index a100b4c..5b7cc1b 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/TraderDynamicRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/dynamic/TraderDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class TraderDynamicRouter extends DynamicRouter { - private traderCallbacks; + protected traderCallbacks: TraderCallbacks; constructor(traderCallbacks: TraderCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/CustomizationItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/CustomizationItemEventRouter.d.ts index 3025e2c..e78445e 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/CustomizationItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/CustomizationItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class CustomizationItemEventRouter extends ItemEventRouterDefinition { - private customizationCallbacks; + protected customizationCallbacks: CustomizationCallbacks; constructor(customizationCallbacks: CustomizationCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/HealthItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/HealthItemEventRouter.d.ts index bad9af2..99847c6 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/HealthItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/HealthItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class HealthItemEventRouter extends ItemEventRouterDefinition { - private healthCallbacks; + protected healthCallbacks: HealthCallbacks; constructor(healthCallbacks: HealthCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/HideoutItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/HideoutItemEventRouter.d.ts index 2cec18b..e1e98af 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/HideoutItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/HideoutItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { HideoutCallbacks } from "../../callbacks/HideoutCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class HideoutItemEventRouter extends ItemEventRouterDefinition { - private hideoutCallbacks; + protected hideoutCallbacks: HideoutCallbacks; constructor(hideoutCallbacks: HideoutCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/InsuranceItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/InsuranceItemEventRouter.d.ts index 8efc2c2..a922cc0 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/InsuranceItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/InsuranceItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class InsuranceItemEventRouter extends ItemEventRouterDefinition { - private insuranceCallbacks; + protected insuranceCallbacks: InsuranceCallbacks; constructor(insuranceCallbacks: InsuranceCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/InventoryItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/InventoryItemEventRouter.d.ts index 1d93e7b..2619bb9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/InventoryItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/InventoryItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { InventoryCallbacks } from "../../callbacks/InventoryCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class InventoryItemEventRouter extends ItemEventRouterDefinition { - private inventoryCallbacks; + protected inventoryCallbacks: InventoryCallbacks; constructor(inventoryCallbacks: InventoryCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/NoteItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/NoteItemEventRouter.d.ts index 12af594..59bf598 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/NoteItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/NoteItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { NoteCallbacks } from "../../callbacks/NoteCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class NoteItemEventRouter extends ItemEventRouterDefinition { - private noteCallbacks; + protected noteCallbacks: NoteCallbacks; constructor(noteCallbacks: NoteCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/PresetBuildItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/PresetBuildItemEventRouter.d.ts index 7298c52..277db44 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/PresetBuildItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/PresetBuildItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class PresetBuildItemEventRouter extends ItemEventRouterDefinition { - private presetBuildCallbacks; + protected presetBuildCallbacks: PresetBuildCallbacks; constructor(presetBuildCallbacks: PresetBuildCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/QuestItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/QuestItemEventRouter.d.ts index 9944ae9..db59c25 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/QuestItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/QuestItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class QuestItemEventRouter extends ItemEventRouterDefinition { - private questCallbacks; + protected questCallbacks: QuestCallbacks; constructor(questCallbacks: QuestCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/RagfairItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/RagfairItemEventRouter.d.ts index 88e52ba..9216cc5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/RagfairItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/RagfairItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class RagfairItemEventRouter extends ItemEventRouterDefinition { - private ragfairCallbacks; + protected ragfairCallbacks: RagfairCallbacks; constructor(ragfairCallbacks: RagfairCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/RepairItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/RepairItemEventRouter.d.ts index b292ded..5196ba9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/RepairItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/RepairItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { RepairCallbacks } from "../../callbacks/RepairCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class RepairItemEventRouter extends ItemEventRouterDefinition { - private repairCallbacks; + protected repairCallbacks: RepairCallbacks; constructor(repairCallbacks: RepairCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/TradeItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/TradeItemEventRouter.d.ts index 1bca2b8..a43bb0a 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/TradeItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/TradeItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { TradeCallbacks } from "../../callbacks/TradeCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class TradeItemEventRouter extends ItemEventRouterDefinition { - private tradeCallbacks; + protected tradeCallbacks: TradeCallbacks; constructor(tradeCallbacks: TradeCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/WishlistItemEventRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/WishlistItemEventRouter.d.ts index 38831f6..38497fb 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/WishlistItemEventRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/item_events/WishlistItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { WishlistCallbacks } from "../../callbacks/WishlistCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class WishlistItemEventRouter extends ItemEventRouterDefinition { - private wishlistCallbacks; + protected wishlistCallbacks: WishlistCallbacks; constructor(wishlistCallbacks: WishlistCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/BundleSerializer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/BundleSerializer.d.ts index 5f275c4..912db83 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/BundleSerializer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/BundleSerializer.d.ts @@ -1,10 +1,10 @@ -import { IHttpServer } from "../../models/spt/server/IHttpServer"; -import { ILogger } from "../../models/spt/utils/ILogger"; import { Serializer } from "../../di/Serializer"; import { BundleLoader } from "../../loaders/BundleLoader"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { ILogger } from "../../models/spt/utils/ILogger"; export declare class BundleSerializer extends Serializer { - private logger; - private bundleLoader; + protected logger: ILogger; + protected bundleLoader: BundleLoader; constructor(logger: ILogger, bundleLoader: BundleLoader); serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; canHandle(route: string): boolean; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/ImageSerializer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/ImageSerializer.d.ts index 29340d0..0e040d4 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/ImageSerializer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/ImageSerializer.d.ts @@ -2,7 +2,7 @@ import { IHttpServer } from "../../models/spt/server/IHttpServer"; import { Serializer } from "../../di/Serializer"; import { ImageRouter } from "../ImageRouter"; export declare class ImageSerializer extends Serializer { - private imageRouter; + protected imageRouter: ImageRouter; constructor(imageRouter: ImageRouter); serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; canHandle(route: string): boolean; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/NotifySerializer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/NotifySerializer.d.ts index 8be8ac2..1779ac9 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/NotifySerializer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/serializers/NotifySerializer.d.ts @@ -3,9 +3,9 @@ import { Serializer } from "../../di/Serializer"; import { HttpServerHelper } from "../../helpers/HttpServerHelper"; import { IHttpServer } from "../../models/spt/server/IHttpServer"; export declare class NotifySerializer extends Serializer { - private notifierController; - private httpServerHelper; + protected notifierController: NotifierController; + protected httpServerHelper: HttpServerHelper; constructor(notifierController: NotifierController, httpServerHelper: HttpServerHelper); - serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + serialize(_sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; canHandle(route: string): boolean; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/BotStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/BotStaticRouter.d.ts index d8b0bf4..aeea220 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/BotStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/BotStaticRouter.d.ts @@ -1,6 +1,6 @@ import { BotCallbacks } from "../../callbacks/BotCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class BotStaticRouter extends StaticRouter { - private botCallbacks; + protected botCallbacks: BotCallbacks; constructor(botCallbacks: BotCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/BundleStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/BundleStaticRouter.d.ts index 3905b82..fb682fc 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/BundleStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/BundleStaticRouter.d.ts @@ -1,6 +1,6 @@ import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class BundleStaticRouter extends StaticRouter { - private bundleCallbacks; + protected bundleCallbacks: BundleCallbacks; constructor(bundleCallbacks: BundleCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/CustomizationStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/CustomizationStaticRouter.d.ts index 46c71b8..21bc4bb 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/CustomizationStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/CustomizationStaticRouter.d.ts @@ -1,6 +1,6 @@ import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class CustomizationStaticRouter extends StaticRouter { - private customizationCallbacks; + protected customizationCallbacks: CustomizationCallbacks; constructor(customizationCallbacks: CustomizationCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/DataStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/DataStaticRouter.d.ts index a493d3a..84ba7fd 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/DataStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/DataStaticRouter.d.ts @@ -1,6 +1,6 @@ import { DataCallbacks } from "../../callbacks/DataCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class DataStaticRouter extends StaticRouter { - private dataCallbacks; + protected dataCallbacks: DataCallbacks; constructor(dataCallbacks: DataCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/DialogStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/DialogStaticRouter.d.ts index a59fb14..546cdf1 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/DialogStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/DialogStaticRouter.d.ts @@ -1,6 +1,6 @@ import { DialogueCallbacks } from "../../callbacks/DialogueCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class DialogStaticRouter extends StaticRouter { - private dialogueCallbacks; + protected dialogueCallbacks: DialogueCallbacks; constructor(dialogueCallbacks: DialogueCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/GameStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/GameStaticRouter.d.ts index 988b673..a9a7496 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/GameStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/GameStaticRouter.d.ts @@ -1,6 +1,6 @@ import { GameCallbacks } from "../../callbacks/GameCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class GameStaticRouter extends StaticRouter { - private gameCallbacks; + protected gameCallbacks: GameCallbacks; constructor(gameCallbacks: GameCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/HealthStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/HealthStaticRouter.d.ts index e644861..863fd5e 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/HealthStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/HealthStaticRouter.d.ts @@ -1,6 +1,6 @@ import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class HealthStaticRouter extends StaticRouter { - private healthCallbacks; + protected healthCallbacks: HealthCallbacks; constructor(healthCallbacks: HealthCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/InraidStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/InraidStaticRouter.d.ts index 66ed860..b29ad23 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/InraidStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/InraidStaticRouter.d.ts @@ -1,6 +1,6 @@ import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class InraidStaticRouter extends StaticRouter { - private inraidCallbacks; + protected inraidCallbacks: InraidCallbacks; constructor(inraidCallbacks: InraidCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/InsuranceStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/InsuranceStaticRouter.d.ts index 8da26b3..5676499 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/InsuranceStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/InsuranceStaticRouter.d.ts @@ -1,6 +1,6 @@ import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class InsuranceStaticRouter extends StaticRouter { - private insuranceCallbacks; + protected insuranceCallbacks: InsuranceCallbacks; constructor(insuranceCallbacks: InsuranceCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/ItemEventStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/ItemEventStaticRouter.d.ts index 08ba6bb..c30a7fc 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/ItemEventStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/ItemEventStaticRouter.d.ts @@ -1,6 +1,6 @@ import { ItemEventCallbacks } from "../../callbacks/ItemEventCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class ItemEventStaticRouter extends StaticRouter { - private itemEventCallbacks; + protected itemEventCallbacks: ItemEventCallbacks; constructor(itemEventCallbacks: ItemEventCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/LauncherStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/LauncherStaticRouter.d.ts index 9d07f78..0040cbd 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/LauncherStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/LauncherStaticRouter.d.ts @@ -1,6 +1,6 @@ import { LauncherCallbacks } from "../../callbacks/LauncherCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class LauncherStaticRouter extends StaticRouter { - private launcherCallbacks; + protected launcherCallbacks: LauncherCallbacks; constructor(launcherCallbacks: LauncherCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/LocationStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/LocationStaticRouter.d.ts index 9c5c52e..b6de956 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/LocationStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/LocationStaticRouter.d.ts @@ -1,6 +1,6 @@ import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class LocationStaticRouter extends StaticRouter { - private locationCallbacks; + protected locationCallbacks: LocationCallbacks; constructor(locationCallbacks: LocationCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/MatchStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/MatchStaticRouter.d.ts index d746381..9920a92 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/MatchStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/MatchStaticRouter.d.ts @@ -1,6 +1,6 @@ import { MatchCallbacks } from "../../callbacks/MatchCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class MatchStaticRouter extends StaticRouter { - private matchCallbacks; + protected matchCallbacks: MatchCallbacks; constructor(matchCallbacks: MatchCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/NotifierStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/NotifierStaticRouter.d.ts index 1c8566d..8f1f5cc 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/NotifierStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/NotifierStaticRouter.d.ts @@ -1,6 +1,6 @@ import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class NotifierStaticRouter extends StaticRouter { - private notifierCallbacks; + protected notifierCallbacks: NotifierCallbacks; constructor(notifierCallbacks: NotifierCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/PresetStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/PresetStaticRouter.d.ts index 2272f82..a9e7458 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/PresetStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/PresetStaticRouter.d.ts @@ -1,6 +1,6 @@ import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class PresetStaticRouter extends StaticRouter { - private presetCallbacks; + protected presetCallbacks: PresetBuildCallbacks; constructor(presetCallbacks: PresetBuildCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/ProfileStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/ProfileStaticRouter.d.ts index fd787f1..83403f2 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/ProfileStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/ProfileStaticRouter.d.ts @@ -1,6 +1,6 @@ import { ProfileCallbacks } from "../../callbacks/ProfileCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class ProfileStaticRouter extends StaticRouter { - private profileCallbacks; + protected profileCallbacks: ProfileCallbacks; constructor(profileCallbacks: ProfileCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/QuestStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/QuestStaticRouter.d.ts index fda3c23..8f7ca0a 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/QuestStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/QuestStaticRouter.d.ts @@ -1,6 +1,6 @@ import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class QuestStaticRouter extends StaticRouter { - private questCallbacks; + protected questCallbacks: QuestCallbacks; constructor(questCallbacks: QuestCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/RagfairStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/RagfairStaticRouter.d.ts index 618374f..6c41467 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/RagfairStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/RagfairStaticRouter.d.ts @@ -1,6 +1,6 @@ import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class RagfairStaticRouter extends StaticRouter { - private ragfairCallbacks; + protected ragfairCallbacks: RagfairCallbacks; constructor(ragfairCallbacks: RagfairCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/TraderStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/TraderStaticRouter.d.ts index 18f0629..41728a1 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/TraderStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/TraderStaticRouter.d.ts @@ -1,6 +1,6 @@ import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class TraderStaticRouter extends StaticRouter { - private traderCallbacks; + protected traderCallbacks: TraderCallbacks; constructor(traderCallbacks: TraderCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/WeatherStaticRouter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/WeatherStaticRouter.d.ts index 61b904d..72ed851 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/WeatherStaticRouter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/routers/static/WeatherStaticRouter.d.ts @@ -1,6 +1,6 @@ import { WeatherCallbacks } from "../../callbacks/WeatherCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class WeatherStaticRouter extends StaticRouter { - private weatherCallbacks; + protected weatherCallbacks: WeatherCallbacks; constructor(weatherCallbacks: WeatherCallbacks); } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/ConfigServer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/ConfigServer.d.ts index 9c2e114..a079be8 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/ConfigServer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/ConfigServer.d.ts @@ -1,30 +1,14 @@ import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigTypes } from "../models/enums/ConfigTypes"; export declare class ConfigServer { - private logger; - private vfs; - private jsonUtil; - private configs; + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected configs: Record; constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil); getConfig(configType: ConfigTypes): T; + getConfigByString(configType: string): T; initialize(): void; } -export declare const enum ConfigTypes { - AIRDROP = "aki-airdrop", - BOT = "aki-bot", - CORE = "aki-core", - HEALTH = "aki-health", - HIDEOUT = "aki-hideout", - HTTP = "aki-http", - IN_RAID = "aki-inraid", - INSURANCE = "aki-insurance", - INVENTORY = "aki-inventory", - LOCATION = "aki-location", - MATCH = "aki-match", - QUEST = "aki-quest", - RAGFAIR = "aki-ragfair", - REPAIR = "aki-repair", - TRADER = "aki-trader", - WEATHER = "aki-weather" -} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/DatabaseServer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/DatabaseServer.d.ts index 521bcf9..aa152d0 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/DatabaseServer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/DatabaseServer.d.ts @@ -1,6 +1,6 @@ import { IDatabaseTables } from "../models/spt/server/IDatabaseTables"; export declare class DatabaseServer { - private tableData; + protected tableData: IDatabaseTables; getTables(): IDatabaseTables; setTables(any: any): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/HttpServer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/HttpServer.d.ts index d0db7e4..5234966 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/HttpServer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/HttpServer.d.ts @@ -1,9 +1,11 @@ /// +/// import http, { ServerResponse } from "http"; import { Serializer } from "../di/Serializer"; import { HttpServerHelper } from "../helpers/HttpServerHelper"; import { NotifierHelper } from "../helpers/NotifierHelper"; import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { ILogger } from "../models/spt/utils/ILogger"; import { HttpRouter } from "../routers/HttpRouter"; @@ -13,24 +15,24 @@ import { RandomUtil } from "../utils/RandomUtil"; import { ConfigServer } from "./ConfigServer"; import { DatabaseServer } from "./DatabaseServer"; export declare class HttpServer implements IHttpServer { - private httpRouter; - private logger; - private randomUtil; - private jsonUtil; - private httpResponse; - private databaseServer; - private notifierHelper; - private httpServerHelper; - private serializers; - private configServer; + protected httpRouter: HttpRouter; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected serializers: Serializer[]; + protected configServer: ConfigServer; constructor(httpRouter: HttpRouter, // TODO: delay required logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, serializers: Serializer[], configServer: ConfigServer); - private buffers; - private onReceive; - private onRespond; - private httpConfig; - private webSockets; - private websocketPingHandler; + protected buffers: {}; + protected onReceive: {}; + protected onRespond: {}; + protected httpConfig: IHttpConfig; + protected webSockets: {}; + protected websocketPingHandler: any; getCookies(req: http.IncomingMessage): any; resetBuffer(sessionID: string): void; putInBuffer(sessionID: any, data: any, bufLength: number): boolean; @@ -42,6 +44,6 @@ export declare class HttpServer implements IHttpServer { sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; handleRequest(req: http.IncomingMessage, resp: http.ServerResponse): void; load(): void; - private getRandomisedMessage; + protected getRandomisedMessage(): string; wsOnConnection(ws: any, req: any): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/RagfairServer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/RagfairServer.d.ts index d103625..60c92b5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/RagfairServer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/RagfairServer.d.ts @@ -1,38 +1,22 @@ -import { HttpResponseUtil } from "../utils/HttpResponseUtil"; -import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; -import { ProfileHelper } from "../helpers/ProfileHelper"; import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; -import { SaveServer } from "./SaveServer"; -import { RagfairPriceService } from "../services/RagfairPriceService"; -import { RagfairOfferService } from "../services/RagfairOfferService"; -import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; -import { RagfairLinkedItemService } from "../services/RagfairLinkedItemService"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; -import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ConfigServer } from "./ConfigServer"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { ConfigServer } from "./ConfigServer"; export declare class RagfairServer { - private logger; - private ragfairOfferGenerator; - private ragfairServerHelper; - private profileHelper; - private itemEventRouter; - private httpResponse; - private saveServer; - private ragfairPriceService; - private ragfairOfferService; - private ragfairLinkedItemService; - private ragfairCategoriesService; - private ragfairRequiredItemsService; - private configServer; - private ragfairConfig; - constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, saveServer: SaveServer, ragfairPriceService: RagfairPriceService, ragfairOfferService: RagfairOfferService, ragfairLinkedItemService: RagfairLinkedItemService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); + protected logger: ILogger; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairCategoriesService: RagfairCategoriesService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairOfferService: RagfairOfferService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); load(): void; update(): void; - private processExpiredOffer; - returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; getCategories(): Record; /** * Disable/Hide an offer from flea @@ -40,6 +24,7 @@ export declare class RagfairServer { */ hideOffer(offerId: string): void; getOffer(offerID: string): IRagfairOffer; + getOffers(): IRagfairOffer[]; removeOfferStack(offerID: string, amount: number): void; doesOfferExist(offerId: string): boolean; addPlayerOffers(): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/SaveServer.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/SaveServer.d.ts index fdf92e4..cb28f49 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/SaveServer.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/servers/SaveServer.d.ts @@ -5,15 +5,15 @@ import { VFS } from "../utils/VFS"; import { SaveLoadRouter } from "../di/Router"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class SaveServer { - private vfs; - private saveLoadRouters; - private jsonUtil; - private hashUtil; - private logger; - private profileFilepath; - private profiles; - private onSave; - private saveMd5; + protected vfs: VFS; + protected saveLoadRouters: SaveLoadRouter[]; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected profileFilepath: string; + protected profiles: {}; + protected onSave: {}; + protected saveMd5: {}; constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger); load(): void; save(): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/FenceService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/FenceService.d.ts index eef87b3..12723fb 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/FenceService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/FenceService.d.ts @@ -1,29 +1,30 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { HandbookHelper } from "../helpers/HandbookHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { PresetHelper } from "../helpers/PresetHelper"; import { FenceLevel } from "../models/eft/common/IGlobals"; import { IPmcData } from "../models/eft/common/IPmcData"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class FenceService { - private logger; - private hashUtil; - private jsonUtil; - private randomUtil; - private databaseServer; - private handbookHelper; - private itemHelper; - private presetHelper; - private configServer; - private fenceAssort; - private traderConfig; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected fenceAssort: ITraderAssort; + protected traderConfig: ITraderConfig; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, presetHelper: PresetHelper, configServer: ConfigServer); - private setFenceAssort; + protected setFenceAssort(fenceAssort: ITraderAssort): void; getFenceAssorts(): ITraderAssort; hasExpiredCache(refreshAssort: boolean): boolean; generateFenceAssortCache(pmcData: IPmcData): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/HashCacheService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/HashCacheService.d.ts index c9b0170..5320f28 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/HashCacheService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/HashCacheService.d.ts @@ -3,13 +3,13 @@ import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; export declare class HashCacheService { - private vfs; - private hashUtil; - private jsonUtil; - private logger; - private jsonHashes; - private modHashes; - private readonly modCachePath; + protected vfs: VFS; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected jsonHashes: any; + protected modHashes: any; + protected readonly modCachePath = "./user/cache/modCache.json"; constructor(vfs: VFS, hashUtil: HashUtil, jsonUtil: JsonUtil, logger: ILogger); getStoredModHash(modName: string): string; modContentMatchesStoredHash(modName: string, modContent: string): boolean; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/InsuranceService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/InsuranceService.d.ts index 160faba..0219816 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/InsuranceService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/InsuranceService.d.ts @@ -4,6 +4,7 @@ import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; import { Item } from "../models/eft/common/tables/IItem"; import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -11,18 +12,18 @@ import { SaveServer } from "../servers/SaveServer"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class InsuranceService { - private logger; - private databaseServer; - private secureContainerHelper; - private randomUtil; - private timeUtil; - private saveServer; - private traderHelper; - private dialogueHelper; - private configServer; - private insured; - private templatesById; - private insuranceConfig; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected secureContainerHelper: SecureContainerHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected traderHelper: TraderHelper; + protected dialogueHelper: DialogueHelper; + protected configServer: ConfigServer; + protected insured: Record>; + protected templatesById: {}; + protected insuranceConfig: IInsuranceConfig; constructor(logger: ILogger, databaseServer: DatabaseServer, secureContainerHelper: SecureContainerHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, saveServer: SaveServer, traderHelper: TraderHelper, dialogueHelper: DialogueHelper, configServer: ConfigServer); insuranceExists(sessionId: string): boolean; insuranceTraderArrayExists(sessionId: string, traderId: string): boolean; @@ -36,6 +37,6 @@ export declare class InsuranceService { sendInsuredItems(pmcData: IPmcData, sessionID: string): void; storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; - private addGearToSend; + protected addGearToSend(pmcData: IPmcData, insuredItem: any, actualItem: any, sessionID: string): any; getPremium(pmcData: IPmcData, inventoryItem: Item, traderId: string): number; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/MatchLocationService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/MatchLocationService.d.ts index f7b7d3b..2b5fc0e 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/MatchLocationService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/MatchLocationService.d.ts @@ -1,7 +1,7 @@ import { TimeUtil } from "../utils/TimeUtil"; export declare class MatchLocationService { - private timeUtil; - private locations; + protected timeUtil: TimeUtil; + protected locations: {}; constructor(timeUtil: TimeUtil); createGroup(sessionID: string, info: any): any; deleteGroup(info: any): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/ModCompilerService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/ModCompilerService.d.ts index d316e48..26cb4ac 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/ModCompilerService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/ModCompilerService.d.ts @@ -1,13 +1,20 @@ +import * as ts from "typescript"; import { ILogger } from "../models/spt/utils/ILogger"; import { VFS } from "../utils/VFS"; import { HashCacheService } from "./HashCacheService"; export declare class ModCompilerService { - private logger; - private hashCacheService; - private vfs; + protected logger: ILogger; + protected hashCacheService: HashCacheService; + protected vfs: VFS; constructor(logger: ILogger, hashCacheService: HashCacheService, vfs: VFS); - compileMod(modName: string, path: string, modTypeScriptFiles: string[]): Promise; - private compile; - private areFilesReady; - private delay; + compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise; + protected compile(fileNames: string[], options: ts.CompilerOptions): Promise; + protected buildDepth(depth: number): string; + protected getNodesModulesPath(depth: number): string; + protected getAkiPath(depth: number): string; + protected getAkiFolder(): string; + protected getNodesModulesFolder(): string; + protected calculateDepth(file: string): number; + protected areFilesReady(fileNames: string[]): boolean; + protected delay(ms: number): Promise; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/NotificationService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/NotificationService.d.ts index 9c6c143..7e2a127 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/NotificationService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/NotificationService.d.ts @@ -1,6 +1,6 @@ import { INotification } from "../models/eft/notifier/INotifier"; export declare class NotificationService { - private messageQueue; + protected messageQueue: {}; getMessageQueue(): {}; getMessageFromQueue(sessionId: string): any; updateMessageOnQueue(sessionId: string, value: any[]): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/PaymentService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/PaymentService.d.ts index 0a6c4d6..5834750 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/PaymentService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/PaymentService.d.ts @@ -4,6 +4,7 @@ import { ItemHelper } from "../helpers/ItemHelper"; import { PaymentHelper } from "../helpers/PaymentHelper"; import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; @@ -11,14 +12,14 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class PaymentService { - private logger; - private httpResponse; - private databaseServer; - private handbookHelper; - private traderHelper; - private itemHelper; - private inventoryHelper; - private paymentHelper; + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); /** * Take money and insert items into return to server request @@ -43,6 +44,6 @@ export declare class PaymentService { * inside the stash, that is it has the stash as * ancestor with slotId=hideout */ - private isItemInStash; + protected isItemInStash(pmcData: IPmcData, item: Item): boolean; addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/PlayerService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/PlayerService.d.ts index 99e5986..519b7e5 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/PlayerService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/PlayerService.d.ts @@ -3,8 +3,8 @@ import { IPlayerIncrementSkillLevelRequestData } from "../models/eft/player/IPla import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class PlayerService { - private logger; - private databaseServer; + protected logger: ILogger; + protected databaseServer: DatabaseServer; constructor(logger: ILogger, databaseServer: DatabaseServer); /** * increases the profile skill and updates any output diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairCategoriesService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairCategoriesService.d.ts index fb9efa2..09956cc 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairCategoriesService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairCategoriesService.d.ts @@ -1,7 +1,7 @@ import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; export declare class RagfairCategoriesService { updateCategories(offers: IRagfairOffer[]): void; - private categories; + protected categories: Record; getCategories(): Record; getCategoryByItemId(itemId: string): number; resetCategories(): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairLinkedItemService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairLinkedItemService.d.ts index d5dc58e..6c34ee0 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairLinkedItemService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairLinkedItemService.d.ts @@ -1,9 +1,10 @@ import { DatabaseServer } from "../servers/DatabaseServer"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; export declare class RagfairLinkedItemService { - private databaseServer; - private linkedItemsCache; + protected databaseServer: DatabaseServer; + protected linkedItemsCache: Record>; constructor(databaseServer: DatabaseServer); getLinkedItems(linkedSearchId: string): Iterable; - buildLinkedItemTable(): void; - private getFilters; + protected buildLinkedItemTable(): void; + protected getFilters(item: ITemplateItem, slot: string): string[]; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairOfferService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairOfferService.d.ts index 4e4ae26..7afbf8c 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairOfferService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairOfferService.d.ts @@ -1,20 +1,32 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { Item } from "../models/eft/common/tables/IItem"; -import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; export declare class RagfairOfferService { - private timeUtil; - private databaseServer; - private saveServer; - private configServer; - private playerOffersLoaded; - private toUpdate; - private expiredOffers; - private offers; - private ragfairConfig; - constructor(timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, configServer: ConfigServer); + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected ragfairServerHelper: RagfairServerHelper; + protected profileHelper: ProfileHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected playerOffersLoaded: boolean; + protected toUpdate: Record; + protected expiredOffers: Item[]; + protected offers: IRagfairOffer[]; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, configServer: ConfigServer); getOffers(): IRagfairOffer[]; getOfferByOfferId(offerId: string): IRagfairOffer; getOffersOfType(templateId: string): IRagfairOffer[]; @@ -22,20 +34,13 @@ export declare class RagfairOfferService { addOfferToExpired(offer: Item): void; setTraderUpdateStatus(traderId: string, shouldUpdate: boolean): void; shouldTraderBeUpdated(traderID: string): boolean; - /** - * Get an array of expired offers that are still shown to player - * @returns IRagfairOffer array - */ - getExpiredActiveOffers(): IRagfairOffer[]; getExpiredOfferCount(): number; - getOfferIndexByOfferId(offerId: string): number; /** * Get an array of expired items not yet processed into new offers * @returns items that need to be turned into offers */ getExpiredOffers(): Item[]; resetExpiredOffers(): void; - private isExpired; /** * Does the offer exist on the ragfair * @param offerId offer id to check for @@ -44,9 +49,18 @@ export declare class RagfairOfferService { doesOfferExist(offerId: string): boolean; getTraders(): Record; flagTraderForUpdate(expiredOfferUserId: string): void; - removeOffer(globalOfferIndex: number, countToRemove: number): void; + removeOfferById(offerId: string): void; removeOfferStack(offerID: string, amount: number): void; removeAllOffersByTrader(traderId: string): void; addTradersToUpdateList(): void; addPlayerOffers(): void; + expireStaleOffers(): void; + /** + * Get an array of stale offers that are still shown to player + * @returns IRagfairOffer array + */ + protected getStaleOffers(): IRagfairOffer[]; + protected isStale(offer: IRagfairOffer, time: number): boolean; + protected processStaleOffer(staleOffer: IRagfairOffer): void; + protected returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairPriceService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairPriceService.d.ts index 7cc42f9..5256b99 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairPriceService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairPriceService.d.ts @@ -1,22 +1,24 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; import { HandbookHelper } from "../helpers/HandbookHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { PresetHelper } from "../helpers/PresetHelper"; import { Item } from "../models/eft/common/tables/IItem"; import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { IRagfairServerPrices } from "../models/spt/ragfair/IRagfairServerPrices"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RandomUtil } from "../utils/RandomUtil"; export declare class RagfairPriceService { - private handbookHelper; - private databaseServer; - private logger; - private itemHelper; - private presetHelper; - private randomUtil; - private configServer; - private ragfairConfig; - private prices; + protected handbookHelper: HandbookHelper; + protected databaseServer: DatabaseServer; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected prices: IRagfairServerPrices; constructor(handbookHelper: HandbookHelper, databaseServer: DatabaseServer, logger: ILogger, itemHelper: ItemHelper, presetHelper: PresetHelper, randomUtil: RandomUtil, configServer: ConfigServer); generateStaticPrices(): void; generateDynamicPrices(): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairRequiredItemsService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairRequiredItemsService.d.ts index e4582d0..b05fc65 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairRequiredItemsService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/RagfairRequiredItemsService.d.ts @@ -2,10 +2,10 @@ import { PaymentHelper } from "../helpers/PaymentHelper"; import { RagfairOfferService } from "../services/RagfairOfferService"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class RagfairRequiredItemsService { - private logger; - private paymentHelper; - private ragfairOfferService; - private requiredItemsCache; + protected logger: ILogger; + protected paymentHelper: PaymentHelper; + protected ragfairOfferService: RagfairOfferService; + protected requiredItemsCache: {}; constructor(logger: ILogger, paymentHelper: PaymentHelper, ragfairOfferService: RagfairOfferService); getRequiredItems(searchId: string): any; buildRequiredItemTable(): void; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/TraderAssortService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/TraderAssortService.d.ts index ccb9e45..5ba2d05 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/TraderAssortService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/TraderAssortService.d.ts @@ -1,6 +1,6 @@ import { ITraderAssort } from "../models/eft/common/tables/ITrader"; export declare class TraderAssortService { - private pristineTraderAssorts; + protected pristineTraderAssorts: Record; getPristineTraderAssort(traderId: string): ITraderAssort; setPristineTraderAssort(traderId: string, assort: ITraderAssort): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/image/imageRouteService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/image/imageRouteService.d.ts new file mode 100644 index 0000000..29569b2 --- /dev/null +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/image/imageRouteService.d.ts @@ -0,0 +1,6 @@ +export declare class ImageRouteService { + protected routes: Record; + addRoute(urlKey: string, route: string): void; + getByKey(urlKey: string): string; + existsByKey(urlKey: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/onLoad/OnLoadModService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/onLoad/OnLoadModService.d.ts index 89bad14..f402103 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/onLoad/OnLoadModService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/onLoad/OnLoadModService.d.ts @@ -1,6 +1,6 @@ import { DependencyContainer } from "tsyringe"; export declare class OnLoadModService { - private container; + protected container: DependencyContainer; constructor(container: DependencyContainer); registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/onUpdate/OnUpdateModService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/onUpdate/OnUpdateModService.d.ts index 32419f4..05d735b 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/onUpdate/OnUpdateModService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/onUpdate/OnUpdateModService.d.ts @@ -1,6 +1,6 @@ import { DependencyContainer } from "tsyringe"; export declare class OnUpdateModService { - private container; + protected container: DependencyContainer; constructor(container: DependencyContainer); registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/staticRouter/StaticRouterModService.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/staticRouter/StaticRouterModService.d.ts index d4c42aa..f28fd45 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/staticRouter/StaticRouterModService.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/services/mod/staticRouter/StaticRouterModService.d.ts @@ -1,7 +1,7 @@ import { DependencyContainer } from "tsyringe"; import { RouteAction } from "../../../di/Router"; export declare class StaticRouterModService { - private container; + protected container: DependencyContainer; constructor(container: DependencyContainer); registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/App.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/App.d.ts index a11f576..34c141e 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/App.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/App.d.ts @@ -3,12 +3,12 @@ import { OnLoad } from "../di/OnLoad"; import { OnUpdate } from "../di/OnUpdate"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class App { - private logger; - private timeUtil; - private onLoadComponents; - private onUpdateComponents; - private onUpdateLastRun; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected onLoadComponents: OnLoad[]; + protected onUpdateComponents: OnUpdate[]; + protected onUpdateLastRun: {}; constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]); load(): void; - private update; + protected update(onUpdateComponents: OnUpdate[]): void; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/AyncQueue.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/AyncQueue.d.ts index a99aa37..da6ab18 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/AyncQueue.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/AyncQueue.d.ts @@ -1,7 +1,7 @@ import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; import { ICommand } from "../models/spt/utils/ICommand"; export declare class AsyncQueue implements IAsyncQueue { - private commandsQueue; + protected commandsQueue: ICommand[]; constructor(); waitFor(command: ICommand): Promise; } diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/DatabaseImporter.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/DatabaseImporter.d.ts index 97dda30..0857b67 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/DatabaseImporter.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/DatabaseImporter.d.ts @@ -5,11 +5,11 @@ import { ImageRouter } from "../routers/ImageRouter"; import { OnLoad } from "../di/OnLoad"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class DatabaseImporter extends OnLoad { - private logger; - private vfs; - private jsonUtil; - private databaseServer; - private imageRouter; + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected imageRouter: ImageRouter; constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter); onLoad(): void; getRoute(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/HashUtil.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/HashUtil.d.ts index cf92b47..bacbf2a 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/HashUtil.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/HashUtil.d.ts @@ -2,7 +2,7 @@ import crypto from "crypto"; import { TimeUtil } from "./TimeUtil"; export declare class HashUtil { - private timeUtil; + protected timeUtil: TimeUtil; constructor(timeUtil: TimeUtil); generate(): string; generateMd5ForData(data: string): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/HttpResponseUtil.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/HttpResponseUtil.d.ts index 85c28bd..29502be 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/HttpResponseUtil.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/HttpResponseUtil.d.ts @@ -3,9 +3,9 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; export declare class HttpResponseUtil { - private jsonUtil; + protected jsonUtil: JsonUtil; constructor(jsonUtil: JsonUtil); - private clearString; + protected clearString(s: string): any; noBody(data: any): any; getBody(data: T, err?: number, errmsg?: any): IGetBodyResponseData; getUnclearedBody(data: any, err?: number, errmsg?: any): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/JsonUtil.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/JsonUtil.d.ts index 20b7448..71e95f6 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/JsonUtil.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/JsonUtil.d.ts @@ -2,10 +2,10 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { HashUtil } from "./HashUtil"; import { VFS } from "./VFS"; export declare class JsonUtil { - private vfs; - private hashUtil; - private logger; - private fileHashes; + protected vfs: VFS; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected fileHashes: any; constructor(vfs: VFS, hashUtil: HashUtil, logger: ILogger); /** * From object to string diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/Logger.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/Logger.d.ts index 9d5b32a..f5b774b 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/Logger.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/Logger.d.ts @@ -1,18 +1,43 @@ /// import { Daum } from "../models/eft/itemEvent/IItemEventRouterRequest"; import { ILogger } from "../models/spt/utils/ILogger"; +import winston from "winston"; import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; import fs from "fs"; +interface SptLogger { + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} export declare class WinstonLogger implements ILogger { - private asyncQueue; - private uuidGenerator; - private showDebugInConsole; - private folderPath; - private file; - private filePath; - private logLevels; - private logger; + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + protected showDebugInConsole: boolean; + protected folderPath: string; + protected file: string; + protected filePath: string; + protected logLevels: { + levels: { + error: number; + warn: number; + succ: number; + info: number; + custom: number; + debug: number; + }; + colors: { + error: string; + warn: string; + succ: string; + info: string; + custom: string; + debug: string; + }; + }; + protected logger: winston.Logger & SptLogger; writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); writeToLogFile(data: string | Daum): Promise; @@ -23,3 +48,4 @@ export declare class WinstonLogger implements ILogger { info(data: string | Record): Promise; debug(data: string | Record, onlyShowInConsole?: boolean): Promise; } +export {}; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/ObjectId.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/ObjectId.d.ts index b100572..03aae56 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/ObjectId.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/ObjectId.d.ts @@ -1,13 +1,13 @@ /// import { TimeUtil } from "./TimeUtil"; export declare class ObjectId { - private timeUtil; + protected timeUtil: TimeUtil; constructor(timeUtil: TimeUtil); - private randomBytes; - private constglobalCounter; - private consttime; - private globalCounter; - private time; + protected randomBytes: Buffer; + protected constglobalCounter: number; + protected consttime: number; + protected globalCounter: number; + protected time: number; incGlobalCounter(): number; toHexString(byteArray: string | any[] | Buffer): string; generate(): string; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/RandomUtil.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/RandomUtil.d.ts index 3a3ecb6..c24dd60 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/RandomUtil.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/RandomUtil.d.ts @@ -103,8 +103,8 @@ export declare class ProbabilityObject { constructor(key: K, relativeProbability: number, data?: V); } export declare class RandomUtil { - private jsonUtil; - private logger; + protected jsonUtil: JsonUtil; + protected logger: ILogger; constructor(jsonUtil: JsonUtil, logger: ILogger); getInt(min: number, max: number): number; getIntEx(max: number): number; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/VFS.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/VFS.d.ts index b064cf4..e5eaf02 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/VFS.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/VFS.d.ts @@ -1,11 +1,12 @@ /// +/// import "reflect-metadata"; import fs from "fs"; import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; export declare class VFS { - private asyncQueue; - private uuidGenerator; + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { @@ -29,7 +30,7 @@ export declare class VFS { copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise; createDir(filepath: string): void; createDirAsync(filepath: string): Promise; - copyDir(filepath: string, target: string, fileExtensions: string | string[]): void; + copyDir(filepath: string, target: string, fileExtensions?: string | string[]): void; copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise; readFile(filepath: string): any; readFileAsync(filepath: string): Promise; diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/Watermark.d.ts b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/Watermark.d.ts index e7b9883..111bdd0 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/Watermark.d.ts +++ b/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/types/utils/Watermark.d.ts @@ -1,19 +1,32 @@ -import { ConfigServer } from "../servers/ConfigServer"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; export declare class WatermarkLocale { - private locales; + protected locales: { + "en-US": { + description: string[]; + warning: string[]; + modding: string[]; + }; + "zh-CN": { + description: string[]; + warning: string[]; + modding: string[]; + }; + }; getLocale(): string; getDescription(): string[]; getWarning(): string[]; + getModding(): string[]; } export declare class Watermark { - private logger; - private configServer; - private watermarkLocale?; - private akiConfig; + protected logger: ILogger; + protected configServer: ConfigServer; + protected watermarkLocale?: WatermarkLocale; + protected akiConfig: ICoreConfig; constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale); - private text; - private versionLabel; + protected text: string[]; + protected versionLabel: string; initialize(): void; getVersionTag(): string; getVersionLabel(): string; @@ -24,5 +37,5 @@ export declare class Watermark { /** Draw the watermark */ draw(): void; /** Caculate text length */ - private textLength; + protected textLength(s: string): number; } diff --git a/Faupi-HideoutMod/Project/src/client/Main.cs b/Faupi-HideoutMod/Project/src/client/Main.cs index b689ab0..0ed30fd 100644 --- a/Faupi-HideoutMod/Project/src/client/Main.cs +++ b/Faupi-HideoutMod/Project/src/client/Main.cs @@ -8,8 +8,8 @@ using System.IO; using System.Linq; using BepInEx; using UnityEngine; -using Hideout = GClass1582; -using Requirement = GClass1606; +using Hideout = GClass1584; +using Requirement = GClass1608; namespace HideoutArchitect { diff --git a/Faupi-HideoutMod/Project/src/server/.eslintignore b/Faupi-HideoutMod/Project/src/server/.eslintignore new file mode 100644 index 0000000..9922d9a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/.eslintignore @@ -0,0 +1,9 @@ +# Exclude these folders from linting +node_modules +dist/ +types/ + +# Exclude these filetypes from linting +*.json +*.txt +*.exe \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/src/server/.eslintrc.json b/Faupi-HideoutMod/Project/src/server/.eslintrc.json new file mode 100644 index 0000000..c505160 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/.eslintrc.json @@ -0,0 +1,75 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-unused-vars": 1, + "@typescript-eslint/no-empty-interface": 0, + "@typescript-eslint/no-namespace": 0, + "@typescript-eslint/comma-dangle": 1, + "@typescript-eslint/func-call-spacing": 2, + "@typescript-eslint/quotes": 1, + "@typescript-eslint/brace-style": [ + "warn", + "allman" + ], + "@typescript-eslint/naming-convention": [ + "warn", + { + "selector": "default", + "format": ["camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "typeLike", + "format": ["PascalCase"] + }, + { + "selector": "objectLiteralProperty", + "format": ["PascalCase", "camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "typeProperty", + "format": ["PascalCase", "camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "enumMember", + "format": ["UPPER_CASE"] + } + ], + "@typescript-eslint/indent": [ + "warn", + 4 + ], + "@typescript-eslint/no-unused-expressions": [ + "warn", + { + "allowShortCircuit": false, + "allowTernary": false + } + ], + "@typescript-eslint/keyword-spacing": [ + "warn", + { + "before": true, + "after": true + } + ], + "@typescript-eslint/explicit-module-boundary-types": [ + "warn", + { + "allowArgumentsExplicitlyTypedAsAny": true + } + ] + } +} \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/LICENSE b/Faupi-HideoutMod/Project/src/server/LICENSE similarity index 100% rename from Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/LICENSE rename to Faupi-HideoutMod/Project/src/server/LICENSE diff --git a/Faupi-HideoutMod/Project/src/server/config.jsonc b/Faupi-HideoutMod/Project/src/server/config.jsonc new file mode 100644 index 0000000..5014617 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/config.jsonc @@ -0,0 +1,9 @@ +{ + "NeededForHideoutDefinition": "NextLevel"/* + NeededForHideoutDefinition - Defines the logic used to determine which items are marked. See mod page for details. + Options: + NextLevel: Generally marks items required for the facility's next upgrade + NextLevelReady: Marks items required for the facility's next upgrade only when its other facility pre-requisites are fulfilled. (e.g. Items for Lavatory 2 won't be marked until Water Collector 1 is finished.)*/, + "TooltipHeaderColor": "#56C427"/* + TooltipHeaderColor - Color of the tooltip 'Needed for hideout' header.*/ +} \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/src/server/dist/config.jsonc b/Faupi-HideoutMod/Project/src/server/dist/config.jsonc new file mode 100644 index 0000000..5014617 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/config.jsonc @@ -0,0 +1,9 @@ +{ + "NeededForHideoutDefinition": "NextLevel"/* + NeededForHideoutDefinition - Defines the logic used to determine which items are marked. See mod page for details. + Options: + NextLevel: Generally marks items required for the facility's next upgrade + NextLevelReady: Marks items required for the facility's next upgrade only when its other facility pre-requisites are fulfilled. (e.g. Items for Lavatory 2 won't be marked until Water Collector 1 is finished.)*/, + "TooltipHeaderColor": "#56C427"/* + TooltipHeaderColor - Color of the tooltip 'Needed for hideout' header.*/ +} \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/src/server/dist/package.json b/Faupi-HideoutMod/Project/src/server/dist/package.json new file mode 100644 index 0000000..86e779c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/package.json @@ -0,0 +1,26 @@ +{ + "name": "HideoutArchitect", + "version": "1.5.0", + "main": "./src/hideoutarchitect.js", + "license": "NCSA Open Source", + "author": "Faupi", + "akiVersion": "3.0.0", + "updated by": "CWX", + "scripts": { + "setup:environment": "npm i", + "build:unzipped": "copyfiles -e \"./node_modules/**/*.*\" -e \"./dist/**/*.*\" -e \"./package-lock.json\" -e \"./tsconfig.json\" -e \"./README.txt\" -e \"./mod.code-workspace\" ./**/*.* ./dist", + "zip:files": "cd dist/ && bestzip ../mod.zip *", + "build:zip": "npm run clean:environment && npm run build:unzipped && npm run zip:files", + "clean:environment": "node -e \"require('fs').rm('mod.zip', ()=>{})\" && node -e \"require('fs').rmdir('./dist/',{recursive:true},()=>{})\"" + }, + "devDependencies": { + "@types/node": "^14.15.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "copyfiles": "2.4.1", + "eslint": "7.26.0", + "tsyringe": "4.6.0", + "typescript": "4.6.4", + "bestzip": "2.2.1" + } +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/res/icon_neededforhideout_small.png b/Faupi-HideoutMod/Project/src/server/dist/res/icon_neededforhideout_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2c08c2c646a1055ee094c93e359c5945bfe6ca05 GIT binary patch literal 553 zcmV+^0@nSBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0lrB@K~yMHb&tJE zBS9F(-`TiHmc-p?(2E~Ya#tlWVj2q(JUG7!L9wv$AJFbjID0KU(bmpJu#KhKXoNda zL=jPo^E(7LXmri$ZpLiJcS4F=P9OL&GtWHFe82~CBi)rv&SdXY%o<*au+V^#cgYop z=r0PT$p7M{P-LjS#rKU0>WRkGZ6iG3v-6Mes;ZH}NpXwHJC3kseF5hRBPc!}S}!_IP{6aO;aHxup<8co}w z0WuO>{c(DrU6~179U+%Un$(4>Q(d#o^+n~y_7p4SW^0ote{$D!0hdYS z9-&Bqj3ioF_D*B@#{yJGB;t}CVBNUc>d)f?J@q<=q4jd1fRrR$?q;mrY1Q1DQE6tA z9|WME6)h}m;`BFSD{u*amva|SDf8CK1GPlTxcR8&bR15REMhBg3EA`KEy?fHgWXyF~_N}7NA3^7Y7n*iPb;{m8fE5%>K00000NkvXXu0mjfG1BpS literal 0 HcmV?d00001 diff --git a/Faupi-HideoutMod/Project/src/server/dist/res/translations.json b/Faupi-HideoutMod/Project/src/server/dist/res/translations.json new file mode 100644 index 0000000..0c42800 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/res/translations.json @@ -0,0 +1,47 @@ +{ + "en": { + "NEEDED FOR HIDEOUT": "Needed for hideout" + }, + "cz": { + "NEEDED FOR HIDEOUT": "Potřebné pro úkryt" + }, + "pl": { + "NEEDED FOR HIDEOUT": "Potrzebne do kryjówki" + }, + "po": { + "NEEDED FOR HIDEOUT": "Necessário para esconderijo" + }, + "ch": { + "NEEDED FOR HIDEOUT": "藏身之处所需" + }, + "ru": { + "NEEDED FOR HIDEOUT": "Необходим для укрытия" + }, + "es": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "es-mx": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "ge": { + "NEEDED FOR HIDEOUT": "Benötigt für Versteck" + }, + "sk": { + "NEEDED FOR HIDEOUT": "Potrebné pre úkryt" + }, + "tu": { + "NEEDED FOR HIDEOUT": "saklanmak için gerekli" + }, + "it": { + "NEEDED FOR HIDEOUT": "Necessario per il nascondiglio" + }, + "jp": { + "NEEDED FOR HIDEOUT": "アジトに必要なもの" + }, + "fr": { + "NEEDED FOR HIDEOUT": "Nécessaire pour la cachette" + }, + "hu": { + "NEEDED FOR HIDEOUT": "Rejtekhelyhez szükséges" + } +} \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/src/server/dist/src/hideoutarchitect.ts b/Faupi-HideoutMod/Project/src/server/dist/src/hideoutarchitect.ts new file mode 100644 index 0000000..948483c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/src/hideoutarchitect.ts @@ -0,0 +1,94 @@ +import type { DependencyContainer } from "tsyringe"; +import { IMod } from "@spt-aki/models/external/mod"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; +import { DynamicRouterModService } from "@spt-aki/services/mod/dynamicRouter/DynamicRouterModService" +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer" +import { JsonUtil } from "@spt-aki/utils/JsonUtil" +import { InitialModLoader } from "@spt-aki/loaders/InitialModLoader" + +class HideoutArchitect implements IMod +{ + private path; + private logger: ILogger; + private database: DatabaseServer; + private router: DynamicRouterModService; + private json: JsonUtil; + private globalLocale; + private modLoader: InitialModLoader; + private mod; + private translations; + private table; + + public load(container: DependencyContainer) + { + this.logger = container.resolve("WinstonLogger"); + this.router = container.resolve("DynamicRouterModService"); + this.path = require("path"); + this.json = container.resolve("JsonUtil"); + this.mod = require("../package.json"); + this.translations = require("../res/translations.json"); + this.logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); + this.hookRoutes(); + + } + + public delayedLoad(container: DependencyContainer) + { + this.modLoader = container.resolve("InitialModLoader"); + this.database = container.resolve("DatabaseServer"); + this.table = this.database.getTables(); + this.globalLocale = this.table.locales.global; + this.loadLocalization(); + } + + private loadLocalization() + { + for (const language in this.translations) + { + if (!(language in this.globalLocale)) + { + continue; + } + + const attrKvPair = this.translations[language]; + for (const attrKey in attrKvPair) + { + const attrValue = attrKvPair[attrKey]; + + this.globalLocale[language].interface[attrKey] = attrValue; + } + } + } + + private hookRoutes() + { + this.router.registerDynamicRouter( + "HideoutArchitect", + [ + { + url: "/HideoutArchitect/GetInfo", + action: (url, info, sessionId, output) => + { + return this.getModInfo(url, info, sessionId, output) + } + } + ], + "HideoutArchitect" + ) + } + + private getModInfo(url: string, info: any, sessionId: string, output: string) + { + const modOutput = { + status: 1, + data: null + }; + + modOutput.data = {...this.mod, ...{path: this.path.resolve(this.modLoader.getModPath(this.mod.name))}}; + modOutput.status = 0; + + return this.json.serialize(modOutput); + } +} + +module.exports = { mod: new HideoutArchitect() }; \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/Program.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/Program.d.ts new file mode 100644 index 0000000..d4b71b9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/Program.d.ts @@ -0,0 +1,4 @@ +export declare class Program { + constructor(); + start(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/TYPES.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/TYPES.d.ts new file mode 100644 index 0000000..6407c3a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/TYPES.d.ts @@ -0,0 +1,3 @@ +export declare const TYPES: { + [name: string]: symbol; +}; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/Utils.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/Utils.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/BotCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/BotCallbacks.d.ts new file mode 100644 index 0000000..2db60dc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/BotCallbacks.d.ts @@ -0,0 +1,15 @@ +import { BotController } from "../controllers/BotController"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BotCallbacks { + protected botController: BotController; + protected httpResponse: HttpResponseUtil; + constructor(botController: BotController, httpResponse: HttpResponseUtil); + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/BundleCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/BundleCallbacks.d.ts new file mode 100644 index 0000000..b28abe1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/BundleCallbacks.d.ts @@ -0,0 +1,18 @@ +import { BundleLoader } from "../loaders/BundleLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BundleCallbacks { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, bundleLoader: BundleLoader, configServer: ConfigServer); + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/CustomizationCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/CustomizationCallbacks.d.ts new file mode 100644 index 0000000..3bab8c0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/CustomizationCallbacks.d.ts @@ -0,0 +1,23 @@ +import { CustomizationController } from "../controllers/CustomizationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class CustomizationCallbacks { + protected customizationController: CustomizationController; + protected saveServer: SaveServer; + protected httpResponse: HttpResponseUtil; + constructor(customizationController: CustomizationController, saveServer: SaveServer, httpResponse: HttpResponseUtil); + getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<{ + _id: string; + suites: string[]; + }>; + getTraderSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/DataCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/DataCallbacks.d.ts new file mode 100644 index 0000000..cfb1c16 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/DataCallbacks.d.ts @@ -0,0 +1,32 @@ +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGlobals } from "../models/eft/common/IGlobals"; +import { ICustomizationItem } from "../models/eft/common/tables/ICustomizationItem"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IHideoutArea } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../models/eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../models/eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../models/eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../models/spt/server/ILocaleBase"; +import { ISettingsBase } from "../models/spt/server/ISettingsBase"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DataCallbacks { + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer); + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/DialogueCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/DialogueCallbacks.d.ts new file mode 100644 index 0000000..634f90b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/DialogueCallbacks.d.ts @@ -0,0 +1,45 @@ +import { DialogueController } from "../controllers/DialogueController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../models/eft/dialog/IFriendRequestData"; +import { IGetAllAttachmentsRequestData } from "../models/eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetChatServerListRequestData } from "../models/eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogInfoRequestData } from "../models/eft/dialog/IGetMailDialogInfoRequestData"; +import { IGetMailDialogListRequestData } from "../models/eft/dialog/IGetMailDialogListRequestData"; +import { IGetMailDialogViewRequestData } from "../models/eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IPinDialogRequestData } from "../models/eft/dialog/IPinDialogRequestData"; +import { IRemoveDialogRequestData } from "../models/eft/dialog/IRemoveDialogRequestData"; +import { ISendMessageRequest } from "../models/eft/dialog/ISendMessageRequest"; +import { ISetDialogReadRequestData } from "../models/eft/dialog/ISetDialogReadRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { DialogueInfo } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class DialogueCallbacks extends OnUpdate { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected dialogueController: DialogueController; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController); + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/GameCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/GameCallbacks.d.ts new file mode 100644 index 0000000..d5cad76 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/GameCallbacks.d.ts @@ -0,0 +1,24 @@ +import { GameController } from "../controllers/GameController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IGameEmptyCrcRequestData } from "../models/eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../models/eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class GameCallbacks { + protected httpResponse: HttpResponseUtil; + protected watermark: Watermark; + protected gameController: GameController; + constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController); + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} +export { GameCallbacks }; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HandbookCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HandbookCallbacks.d.ts new file mode 100644 index 0000000..891e375 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HandbookCallbacks.d.ts @@ -0,0 +1,8 @@ +import { HandbookController } from "../controllers/HandbookController"; +import { OnLoad } from "../di/OnLoad"; +export declare class HandbookCallbacks extends OnLoad { + protected handbookController: HandbookController; + constructor(handbookController: HandbookController); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HealthCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HealthCallbacks.d.ts new file mode 100644 index 0000000..8f7b89d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HealthCallbacks.d.ts @@ -0,0 +1,20 @@ +import { HealthController } from "../controllers/HealthController"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class HealthCallbacks { + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected healthController: HealthController; + constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController); + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HideoutCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HideoutCallbacks.d.ts new file mode 100644 index 0000000..99ab4c9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HideoutCallbacks.d.ts @@ -0,0 +1,33 @@ +import { HideoutController } from "../controllers/HideoutController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../models/eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HideoutCallbacks extends OnUpdate { + protected hideoutController: HideoutController; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(hideoutController: HideoutController, // TODO: delay needed + configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HttpCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HttpCallbacks.d.ts new file mode 100644 index 0000000..94c97bd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/HttpCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoad } from "../di/OnLoad"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class HttpCallbacks extends OnLoad { + protected httpServer: IHttpServer; + constructor(httpServer: IHttpServer); + onLoad(): void; + getRoute(): string; + getImage(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InraidCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InraidCallbacks.d.ts new file mode 100644 index 0000000..05bcce4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InraidCallbacks.d.ts @@ -0,0 +1,23 @@ +import { InraidController } from "../controllers/InraidController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IAirdropConfig } from "../models/spt/config/IAirdropConfig"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InraidCallbacks { + protected inraidController: InraidController; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected airdropConfig: IAirdropConfig; + protected inraidConfig: IInRaidConfig; + constructor(inraidController: InraidController, httpResponse: HttpResponseUtil, configServer: ConfigServer); + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InsuranceCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InsuranceCallbacks.d.ts new file mode 100644 index 0000000..520d0eb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InsuranceCallbacks.d.ts @@ -0,0 +1,24 @@ +import { InsuranceController } from "../controllers/InsuranceController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InsuranceCallbacks extends OnLoadOnUpdate { + protected insuranceController: InsuranceController; + protected insuranceService: InsuranceService; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer); + onLoad(): void; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(secondsSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InventoryCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InventoryCallbacks.d.ts new file mode 100644 index 0000000..9ab1486 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/InventoryCallbacks.d.ts @@ -0,0 +1,39 @@ +import { InventoryController } from "../controllers/InventoryController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class InventoryCallbacks { + protected inventoryController: InventoryController; + constructor(inventoryController: InventoryController); + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ItemEventCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ItemEventCallbacks.d.ts new file mode 100644 index 0000000..f4f04f9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ItemEventCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class ItemEventCallbacks { + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter); + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/LauncherCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/LauncherCallbacks.d.ts new file mode 100644 index 0000000..c022325 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/LauncherCallbacks.d.ts @@ -0,0 +1,28 @@ +import { LauncherController } from "../controllers/LauncherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../models/eft/launcher/IRemoveProfileData"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class LauncherCallbacks { + protected httpResponse: HttpResponseUtil; + protected launcherController: LauncherController; + protected saveServer: SaveServer; + protected watermark: Watermark; + constructor(httpResponse: HttpResponseUtil, launcherController: LauncherController, saveServer: SaveServer, watermark: Watermark); + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getServerVersion(): string; + ping(url: string, info: IEmptyRequestData, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} +export { LauncherCallbacks }; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/LocationCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/LocationCallbacks.d.ts new file mode 100644 index 0000000..cc69369 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/LocationCallbacks.d.ts @@ -0,0 +1,14 @@ +import { LocationController } from "../controllers/LocationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetLocationRequestData } from "../models/eft/location/IGetLocationRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class LocationCallbacks { + protected httpResponse: HttpResponseUtil; + protected locationController: LocationController; + constructor(httpResponse: HttpResponseUtil, locationController: LocationController); + getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/MatchCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/MatchCallbacks.d.ts new file mode 100644 index 0000000..083c1f5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/MatchCallbacks.d.ts @@ -0,0 +1,35 @@ +import { MatchController } from "../controllers/MatchController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class MatchCallbacks { + protected httpResponse: HttpResponseUtil; + protected jsonUtil: JsonUtil; + protected matchController: MatchController; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, jsonUtil: JsonUtil, matchController: MatchController, databaseServer: DatabaseServer); + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: IGetProfileRequestData, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ModCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ModCallbacks.d.ts new file mode 100644 index 0000000..866abf7 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ModCallbacks.d.ts @@ -0,0 +1,22 @@ +import { OnLoad } from "../di/OnLoad"; +import { DelayedModLoader } from "../loaders/DelayedModLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +declare class ModCallbacks extends OnLoad { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected modLoader: DelayedModLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, modLoader: DelayedModLoader, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} +export { ModCallbacks }; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/NoteCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/NoteCallbacks.d.ts new file mode 100644 index 0000000..d39d400 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/NoteCallbacks.d.ts @@ -0,0 +1,11 @@ +import { NoteController } from "../controllers/NoteController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +export declare class NoteCallbacks { + protected noteController: NoteController; + constructor(noteController: NoteController); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/NotifierCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/NotifierCallbacks.d.ts new file mode 100644 index 0000000..cd1e736 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/NotifierCallbacks.d.ts @@ -0,0 +1,24 @@ +import { NotifierController } from "../controllers/NotifierController"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../models/eft/notifier/ISelectProfileRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class NotifierCallbacks { + protected httpServerHelper: HttpServerHelper; + protected httpResponse: HttpResponseUtil; + protected notifierController: NotifierController; + constructor(httpServerHelper: HttpServerHelper, httpResponse: HttpResponseUtil, notifierController: NotifierController); + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(_sessionID: string, req: any, resp: any, _data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/PresetBuildCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/PresetBuildCallbacks.d.ts new file mode 100644 index 0000000..8a0c155 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/PresetBuildCallbacks.d.ts @@ -0,0 +1,15 @@ +import { PresetBuildController } from "../controllers/PresetBuildController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PresetBuildCallbacks { + protected httpResponse: HttpResponseUtil; + protected presetBuildController: PresetBuildController; + constructor(httpResponse: HttpResponseUtil, presetBuildController: PresetBuildController); + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/PresetCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/PresetCallbacks.d.ts new file mode 100644 index 0000000..4553f8f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/PresetCallbacks.d.ts @@ -0,0 +1,8 @@ +import { PresetController } from "../controllers/PresetController"; +import { OnLoad } from "../di/OnLoad"; +export declare class PresetCallbacks extends OnLoad { + protected presetController: PresetController; + constructor(presetController: PresetController); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ProfileCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ProfileCallbacks.d.ts new file mode 100644 index 0000000..116e7c5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/ProfileCallbacks.d.ts @@ -0,0 +1,30 @@ +import { ProfileController } from "../controllers/ProfileController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IGetMiniProfileRequestData } from "../models/eft/launcher/IGetMiniProfileRequestData"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileCallbacks { + protected httpResponse: HttpResponseUtil; + protected timeUtil: TimeUtil; + protected profileController: ProfileController; + constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, profileController: ProfileController); + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/QuestCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/QuestCallbacks.d.ts new file mode 100644 index 0000000..559c29e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/QuestCallbacks.d.ts @@ -0,0 +1,26 @@ +import { QuestController } from "../controllers/QuestController"; +import { RepeatableQuestController } from "../controllers/RepeatableQuestController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IListQuestsRequestData } from "../models/eft/quests/IListQuestsRequestData"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class QuestCallbacks { + protected httpResponse: HttpResponseUtil; + protected questController: QuestController; + protected repeatableQuestController: RepeatableQuestController; + constructor(httpResponse: HttpResponseUtil, questController: QuestController, repeatableQuestController: RepeatableQuestController); + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/RagfairCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/RagfairCallbacks.d.ts new file mode 100644 index 0000000..d5bab8b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/RagfairCallbacks.d.ts @@ -0,0 +1,39 @@ +import { RagfairController } from "../controllers/RagfairController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAddOfferRequestData } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IRemoveOfferRequestData } from "../models/eft/ragfair/IRemoveOfferRequestData"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected ragfairServer: RagfairServer; + protected ragfairController: RagfairController; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(httpResponse: HttpResponseUtil, logger: ILogger, jsonUtil: JsonUtil, ragfairServer: RagfairServer, ragfairController: RagfairController, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + sendReport(url: string, info: any, sessionID: string): INullResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/RepairCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/RepairCallbacks.d.ts new file mode 100644 index 0000000..63733fa --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/RepairCallbacks.d.ts @@ -0,0 +1,11 @@ +import { RepairController } from "../controllers/RepairController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +export declare class RepairCallbacks { + protected repairController: RepairController; + constructor(repairController: RepairController); + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/SaveCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/SaveCallbacks.d.ts new file mode 100644 index 0000000..bbb6e53 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/SaveCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { SaveServer } from "../servers/SaveServer"; +export declare class SaveCallbacks extends OnLoadOnUpdate { + protected saveServer: SaveServer; + constructor(saveServer: SaveServer); + onLoad(): void; + getRoute(): string; + onUpdate(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/TradeCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/TradeCallbacks.d.ts new file mode 100644 index 0000000..272ae46 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/TradeCallbacks.d.ts @@ -0,0 +1,11 @@ +import { TradeController } from "../controllers/TradeController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +export declare class TradeCallbacks { + protected tradeController: TradeController; + constructor(tradeController: TradeController); + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/TraderCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/TraderCallbacks.d.ts new file mode 100644 index 0000000..128d9b2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/TraderCallbacks.d.ts @@ -0,0 +1,18 @@ +import { TraderController } from "../controllers/TraderController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class TraderCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected traderController: TraderController; + constructor(httpResponse: HttpResponseUtil, traderController: TraderController); + onLoad(): void; + getRoute(): string; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + onUpdate(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/WeatherCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/WeatherCallbacks.d.ts new file mode 100644 index 0000000..ae784c8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/WeatherCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WeatherController } from "../controllers/WeatherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class WeatherCallbacks { + protected httpResponse: HttpResponseUtil; + protected weatherController: WeatherController; + constructor(httpResponse: HttpResponseUtil, weatherController: WeatherController); + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/WishlistCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/WishlistCallbacks.d.ts new file mode 100644 index 0000000..c2cc2a8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/callbacks/WishlistCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WishlistController } from "../controllers/WishlistController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +export declare class WishlistCallbacks { + protected wishlistController: WishlistController; + constructor(wishlistController: WishlistController); + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/BotController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/BotController.d.ts new file mode 100644 index 0000000..09a1788 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/BotController.d.ts @@ -0,0 +1,35 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { BotHelper } from "../helpers/BotHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +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 { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class BotController { + protected databaseServer: DatabaseServer; + protected botGenerator: BotGenerator; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + /** + * Return the number of bot loadout varieties to be generated + * @param type bot Type we want the loadout gen count for + * @returns + */ + getBotPresetGenerationLimit(type: string): number; + getBotCoreDifficulty(): IBotCore; + /** + * Get bot difficulty settings + * adjust PMC settings to ensure they engage the correct bot types + * @param type what bot the server is requesting settings for + * @param difficulty difficulty level server requested settings for + * @returns Difficulty object + */ + getBotDifficulty(type: string, difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/CustomizationController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/CustomizationController.d.ts new file mode 100644 index 0000000..a6c4730 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/CustomizationController.d.ts @@ -0,0 +1,22 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +export declare class CustomizationController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper); + getTraderSuits(traderID: string, sessionID: string): ISuit[]; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; + protected getAllTraderSuits(sessionID: string): ISuit[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/DialogueController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/DialogueController.d.ts new file mode 100644 index 0000000..b15c4b6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/DialogueController.d.ts @@ -0,0 +1,25 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { DialogueInfo, Message } from "../models/eft/profile/IAkiProfile"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DialogueController { + protected httpResponse: HttpResponseUtil; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + constructor(httpResponse: HttpResponseUtil, saveServer: SaveServer, dialogueHelper: DialogueHelper); + getFriendList(sessionID: string): IGetFriendListDataResponse; + generateDialogueList(sessionID: string): IGetBodyResponseData; + getDialogueInfo(dialogueID: string, sessionID: string): DialogueInfo; + generateDialogueView(dialogueID: string, sessionID: string): IGetMailDialogViewResponseData; + removeDialogue(dialogueID: string, sessionID: string): void; + setDialoguePin(dialogueID: string, shouldPin: boolean, sessionID: string): void; + setRead(dialogueIDs: string[], sessionID: string): void; + getAllAttachments(dialogueID: string, sessionID: string): IGetAllAttachmentsResponse; + protected messagesHaveUncollectedRewards(messages: Message[]): boolean; + protected removeExpiredItems(sessionID: string): void; + update(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/GameController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/GameController.d.ts new file mode 100644 index 0000000..b9067fa --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/GameController.d.ts @@ -0,0 +1,32 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcDataRepeatableQuest, IRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { Watermark } from "../utils/Watermark"; +export declare class GameController { + protected logger: ILogger; + protected watermark: Watermark; + protected httpServerHelper: HttpServerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, watermark: Watermark, httpServerHelper: HttpServerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void; + protected addMissingBonusesProperty(pmcProfile: IPmcData): void; + protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void; + protected addMissingWeaponRepairSkill(pmcProfile: IPmcData): void; + protected addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void; + protected addMissingArmorRepairSkill(pmcProfile: IPmcData): void; + protected fixNullTraderSalesSums(pmcProfile: IPmcData): void; + protected removeDanglingConditionCounters(pmcProfile: IPmcData): void; + protected removeDanglingBackendCounters(pmcProfile: IPmcData): void; + getGameConfig(sessionID: string): IGameConfigResponse; + getServer(): any[]; + protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/HandbookController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/HandbookController.d.ts new file mode 100644 index 0000000..52d2dd8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/HandbookController.d.ts @@ -0,0 +1,8 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class HandbookController { + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + constructor(databaseServer: DatabaseServer, handbookHelper: HandbookHelper); + load(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/HealthController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/HealthController.d.ts new file mode 100644 index 0000000..aafb8df --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/HealthController.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentService } from "../services/PaymentService"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class HealthController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected inventoryHelper: InventoryHelper; + protected healthHelper: HealthHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, healthHelper: HealthHelper); + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/HideoutController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/HideoutController.d.ts new file mode 100644 index 0000000..a8bf229 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/HideoutController.d.ts @@ -0,0 +1,57 @@ +import { HideoutHelper } from "../helpers/HideoutHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { HideoutUpgradeCompleteRequestData } from "../models/eft/hideout/HideoutUpgradeCompleteRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HideoutController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected inventoryHelper: InventoryHelper; + protected saveServer: SaveServer; + protected playerService: PlayerService; + protected presetHelper: PresetHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected hideoutHelper: HideoutHelper; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + update(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/InraidController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/InraidController.d.ts new file mode 100644 index 0000000..7f2036c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/InraidController.d.ts @@ -0,0 +1,31 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { InRaidHelper } from "../helpers/InRaidHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InraidController { + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected itemHelper: ItemHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + protected healthHelper: HealthHelper; + protected traderHelper: TraderHelper; + protected insuranceService: InsuranceService; + protected inRaidHelper: InRaidHelper; + protected configServer: ConfigServer; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, extendedProfileHelper: ExtendedProfileHelper, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer); + addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void; + saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/InsuranceController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/InsuranceController.d.ts new file mode 100644 index 0000000..db2c567 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/InsuranceController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { PaymentService } from "../services/PaymentService"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceController { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected itemEventRouter: ItemEventRouter; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected profileHelper: ProfileHelper; + protected dialogueHelper: DialogueHelper; + protected paymentService: PaymentService; + protected insuranceService: InsuranceService; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, itemEventRouter: ItemEventRouter, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required + insuranceService: InsuranceService, configServer: ConfigServer); + processReturn(): void; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + cost(info: IGetInsuranceCostRequestData, sessionID: string): any; + doAbsolutelyNothing(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/InventoryController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/InventoryController.d.ts new file mode 100644 index 0000000..b732aa9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/InventoryController.d.ts @@ -0,0 +1,107 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InventoryController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected presetHelper: PresetHelper; + protected inventoryHelper: InventoryHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter); + /** + * Move Item + * change location of item with parentId and slotId + * transfers items from one profile to another if fromOwner/toOwner is set in the body. + * otherwise, move is contained within the same profile_f. + */ + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Remove Item from Profile + * Deep tree item deletion, also removes items from insurance list + */ + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Implements functionality "Discard" from Main menu (Stash etc.) + * Removes item from PMC Profile + */ + discardItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Split Item + * spliting 1 item-stack into 2 separate items ... + */ + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Merge Item + * merges 2 items into one, deletes item from `body.item` and adding number of stacks into `body.with` + */ + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Transfer item + * Used to take items from scav inventory into stash or to insert ammo into mags (shotgun ones) and reloading weapon by clicking "Reload" + */ + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Swap Item + * its used for "reload" if you have weapon in hands and magazine is somewhere else in rig or backpack in equipment + */ + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Give Item + * its used for "add" item like gifts etc. + */ + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + /** + * Handles folding of Weapons + */ + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Toggles "Toggleable" items like night vision goggles and face shields. + */ + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles Tagging of items (primary Containers). + */ + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles examining of the item * + */ + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles sorting of Inventory. + */ + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/LauncherController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/LauncherController.d.ts new file mode 100644 index 0000000..1af1f56 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/LauncherController.d.ts @@ -0,0 +1,28 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { Info } from "../models/eft/profile/IAkiProfile"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class LauncherController { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected httpServerHelper: HttpServerHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected coreConfig: ICoreConfig; + constructor(hashUtil: HashUtil, saveServer: SaveServer, httpServerHelper: HttpServerHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + connect(): any; + find(sessionIdKey: string): Info; + login(info: ILoginRequestData): string; + register(info: IRegisterData): string; + protected createAccount(info: IRegisterData): string; + changeUsername(info: IChangeRequestData): string; + changePassword(info: IChangeRequestData): string; + wipe(info: IRegisterData): string; + getCompatibleTarkovVersion(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/LocationController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/LocationController.d.ts new file mode 100644 index 0000000..90b6d7a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/LocationController.d.ts @@ -0,0 +1,18 @@ +import { LocationGenerator } from "../generators/LocationGenerator"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class LocationController { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected locationGenerator: LocationGenerator; + protected databaseServer: DatabaseServer; + protected timeUtil: TimeUtil; + constructor(jsonUtil: JsonUtil, logger: ILogger, locationGenerator: LocationGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil); + get(location: string): ILocationBase; + generate(name: string): ILocationBase; + generateAll(): ILocationsGenerateAllResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/MatchController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/MatchController.d.ts new file mode 100644 index 0000000..c322d96 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/MatchController.d.ts @@ -0,0 +1,30 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { IMatchConfig } from "../models/spt/config/IMatchConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { MatchLocationService } from "../services/MatchLocationService"; +export declare class MatchController { + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected matchLocationService: MatchLocationService; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected matchConfig: IMatchConfig; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, configServer: ConfigServer); + getEnabled(): boolean; + getProfile(info: IGetProfileRequestData): IPmcData[]; + protected getMatch(location: any): any; + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; + joinMatch(info: any, sessionID: string): any[]; + getGroupStatus(info: any): any; + startOfflineRaid(info: IStartOfflineRaidRequestData, sessionID: string): void; + endOfflineRaid(info: IEndOfflineRaidRequestData, sessionID: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/NoteController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/NoteController.d.ts new file mode 100644 index 0000000..cc78383 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/NoteController.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +declare class NoteController { + protected itemEventRouter: ItemEventRouter; + constructor(itemEventRouter: ItemEventRouter); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} +export { NoteController }; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/NotifierController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/NotifierController.d.ts new file mode 100644 index 0000000..31d7bfe --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/NotifierController.d.ts @@ -0,0 +1,22 @@ +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { NotificationService } from "../services/NotificationService"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +export declare class NotifierController { + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected notificationService: NotificationService; + protected pollInterval: number; + protected timeout: number; + constructor(notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, notificationService: NotificationService); + /** + * Resolve an array of session notifications. + * + * If no notifications are currently queued then intermittently check for new notifications until either + * one or more appear or when a timeout expires. + * If no notifications are available after the timeout, use a default message. + */ + notifyAsync(sessionID: string): Promise; + getServer(sessionID: string): string; + getChannel(sessionID: string): INotifierChannel; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/PresetBuildController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/PresetBuildController.d.ts new file mode 100644 index 0000000..adf4084 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/PresetBuildController.d.ts @@ -0,0 +1,18 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class PresetBuildController { + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + constructor(hashUtil: HashUtil, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, saveServer: SaveServer); + getUserBuilds(sessionID: string): WeaponBuild[]; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/PresetController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/PresetController.d.ts new file mode 100644 index 0000000..ca1af1a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/PresetController.d.ts @@ -0,0 +1,8 @@ +import { PresetHelper } from "../helpers/PresetHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetController { + protected presetHelper: PresetHelper; + protected databaseServer: DatabaseServer; + constructor(presetHelper: PresetHelper, databaseServer: DatabaseServer); + initialize(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/ProfileController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/ProfileController.d.ts new file mode 100644 index 0000000..9b7a6d5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/ProfileController.d.ts @@ -0,0 +1,34 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileController { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected traderHelper: TraderHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, traderHelper: TraderHelper, extendedProfileHelper: ExtendedProfileHelper); + getMiniProfiles(): IMiniProfile[]; + getMiniProfile(sessionID: string): any; + getCompleteProfile(sessionID: string): IPmcData[]; + createProfile(info: IProfileCreateRequestData, sessionID: string): void; + generatePlayerScav(sessionID: string): IPmcData; + validateNickname(info: IValidateNicknameRequestData, sessionID: string): string; + changeNickname(info: IProfileChangeNicknameRequestData, sessionID: string): string; + changeVoice(info: IProfileChangeVoiceRequestData, sessionID: string): void; + getFriends(info: ISearchFriendRequestData, sessionID: string): ISearchFriendResponse[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/QuestController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/QuestController.d.ts new file mode 100644 index 0000000..e588de0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/QuestController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { QuestConditionHelper } from "../helpers/QuestConditionHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class QuestController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected questHelper: QuestHelper; + protected questConditionHelper: QuestConditionHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, questConditionHelper: QuestConditionHelper, playerService: PlayerService, configServer: ConfigServer); + getClientQuests(sessionID: string): IQuest[]; + acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + acceptRepeatableQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/RagfairController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/RagfairController.d.ts new file mode 100644 index 0000000..c758593 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/RagfairController.d.ts @@ -0,0 +1,70 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairHelper } from "../helpers/RagfairHelper"; +import { RagfairOfferHelper } from "../helpers/RagfairOfferHelper"; +import { RagfairSellHelper } from "../helpers/RagfairSellHelper"; +import { RagfairSortHelper } from "../helpers/RagfairSortHelper"; +import { RagfairTaxHelper } from "../helpers/RagfairTaxHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IAddOfferRequestData, Requirement } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PaymentService } from "../services/PaymentService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + protected ragfairServer: RagfairServer; + protected ragfairPriceService: RagfairPriceService; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + protected ragfairSellHelper: RagfairSellHelper; + protected ragfairTaxHelper: RagfairTaxHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairOfferHelper: RagfairOfferHelper; + protected profileHelper: ProfileHelper; + protected paymentService: PaymentService; + protected handbookHelper: HandbookHelper; + protected paymentHelper: PaymentHelper; + protected inventoryHelper: InventoryHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter, ragfairServer: RagfairServer, ragfairPriceService: RagfairPriceService, databaseServer: DatabaseServer, itemHelper: ItemHelper, saveServer: SaveServer, ragfairSellHelper: RagfairSellHelper, ragfairTaxHelper: RagfairTaxHelper, ragfairSortHelper: RagfairSortHelper, ragfairOfferHelper: RagfairOfferHelper, profileHelper: ProfileHelper, paymentService: PaymentService, handbookHelper: HandbookHelper, paymentHelper: PaymentHelper, inventoryHelper: InventoryHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer); + getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult; + update(): void; + getItemPrice(info: IGetMarketPriceRequestData): IGetItemPriceResult; + addPlayerOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + createPlayerOffer(profile: IAkiProfile, requirements: Requirement[], items: Item[], sellInOnePiece: boolean, amountToSend: number): IRagfairOffer; + getAllFleaPrices(): Record; + removeOffer(offerId: string, sessionID: string): IItemEventRouterResponse; + extendOffer(info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/RepairController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/RepairController.d.ts new file mode 100644 index 0000000..e9458f6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/RepairController.d.ts @@ -0,0 +1,41 @@ +import { QuestHelper } from "../helpers/QuestHelper"; +import { RepairHelper } from "../helpers/RepairHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +export declare class RepairController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected traderHelper: TraderHelper; + protected paymentService: PaymentService; + protected repairHelper: RepairHelper; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, questHelper: QuestHelper, traderHelper: TraderHelper, paymentService: PaymentService, repairHelper: RepairHelper, configServer: ConfigServer); + /** + * Repair with trader + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + /** + * Repair with repair kit + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/RepeatableQuestController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/RepeatableQuestController.d.ts new file mode 100644 index 0000000..ce190aa --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/RepeatableQuestController.d.ts @@ -0,0 +1,217 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { Exit } from "../models/eft/common/ILocationBase"; +import { IPmcData, TraderInfo } from "../models/eft/common/IPmcData"; +import { ICompletion, ICompletionAvailableFor, IElimination, IEliminationCondition, IExploration, IExplorationCondition, IPmcDataRepeatableQuest, IRepeatableQuest, IReward, IRewards } from "../models/eft/common/tables/IRepeatableQuests"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { ELocationName } from "../models/enums/ELocationName"; +import { IQuestConfig, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { ProbabilityObject, ProbabilityObjectArray, RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export interface IQuestTypePool { + types: string[]; + pool: IQuestPool; +} +export interface IQuestPool { + Exploration: IExplorationPool; + Elimination: IEliminationPool; +} +export interface IExplorationPool { + locations: Partial>; +} +export interface IEliminationPool { + targets: IEliminationTargetPool; +} +export interface IEliminationTargetPool { + Savage?: ITargetLocation; + AnyPmc?: ITargetLocation; + bossBully?: ITargetLocation; + bossGluhar?: ITargetLocation; + bossKilla?: ITargetLocation; + bossSanitar?: ITargetLocation; + bossTagilla?: ITargetLocation; + bossKojaniy?: ITargetLocation; +} +export interface ITargetLocation { + locations: string[]; +} +export declare class RepeatableQuestController { + protected timeUtil: TimeUtil; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected mathUtil: MathUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected itemEventRouter: ItemEventRouter; + protected paymentService: PaymentService; + protected objectId: ObjectId; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, itemEventRouter: ItemEventRouter, paymentService: PaymentService, objectId: ObjectId, configServer: ConfigServer); + /** + * This is the method reached by the /client/repeatalbeQuests/activityPeriods endpoint + * Returns an array of objects in the format of repeatable quests to the client. + * repeatableQuestObject = { + * id: Unique Id, + * name: "Daily", + * endTime: the time when the quests expire + * activeQuests: currently available quests in an array. Each element of quest type format (see assets/database/templates/repeatableQuests.json). + * inactiveQuests: the quests which were previously active (required by client to fail them if they are not completed) + * } + * + * The method checks if the player level requirement for repeatable quests (e.g. daily lvl5, weekly lvl15) is met and if the previously active quests + * are still valid. This ischecked by endTime persisted in profile accordning to the resetTime configured for each repeatable kind (daily, weekly) + * in QuestCondig.js + * + * If the condition is met, new repeatableQuests are created, old quests (which are persisted in the profile.RepeatableQuests[i].activeQuests) are + * moved to profile.RepeatableQuests[i].inactiveQuests. This memory is required to get rid of old repeatable quest data in the profile, otherwise + * they'll litter the profile's Quests field. + * (if the are on "Succeed" but not "Completed" we keep them, to allow the player to complete them and get the rewards) + * The new quests generated are again persisted in profile.RepeatableQuests + * + * + * @param {string} sessionId Player's session id + * @returns {array} array of "repeatableQuestObjects" as descibed above + */ + getClientRepeatableQuests(_info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; + /** + * This method is called by GetClientRepeatableQuests and creates one element of quest type format (see assets/database/templates/repeatableQuests.json). + * It randomly draws a quest type (currently Elimination, Completion or Exploration) as well as a trader who is providing the quest + */ + generateRepeatableQuest(pmcLevel: number, pmcTraderInfo: Record, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest; + /** + * Just for debug reasons. Draws dailies a random assort of dailies extracted from dumps + */ + generateDebugDailies(dailiesPool: any, factory: any, number: any): any; + /** + * Generates the base object of quest type format given as templates in assets/database/templates/repeatableQuests.json + * The templates include Elimination, Completion and Extraction quest types + * + * @param {string} type quest type: "Elimination", "Completion" or "Extraction" + * @param {string} traderId trader from which the quest will be provided + * @returns {object} a object which contains the base elements for repeatable quests of the requests type + * (needs to be filled with reward and conditions by called to make a valid quest) + */ + generateRepeatableTemplate(type: string, traderId: string): IRepeatableQuest; + /** + * Generates a valid Exploration quest + * + * @param {integer} pmcLevel player's level for reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Exploration" (see assets/database/templates/repeatableQuests.json) + */ + generateExplorationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IExploration; + /** + * Generates a valid Completion quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Completion" (see assets/database/templates/repeatableQuests.json) + */ + generateCompletionQuest(pmcLevel: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): ICompletion; + /** + * Generates a valid Elimination quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Elimination" (see assets/database/templates/repeatableQuests.json) + */ + generateEliminationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IElimination; + /** + * Exploration repeatable quests can specify a required extraction point. + * This method creates the according object which will be appended to the conditions array + * + * @param {string} exit The exit name to generate the condition for + * @returns {object} Exit condition + */ + generateExplorationExitCondition(exit: Exit): IExplorationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateCompletionQuest to create a completion condition (of which a completion quest theoretically can have many) + * + * @param {string} targetItemId id of the item to request + * @param {integer} value amount of items of this specific type to request + * @returns {object} object of "Completion"-condition + */ + generateCompletionAvailableForFinish(targetItemId: string, value: number): ICompletionAvailableFor; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a location condition. + * + * @param {string} location the location on which to fulfill the elimination quest + * @returns {object} object of "Elimination"-location-subcondition + */ + generateEliminationLocation(location: string[]): IEliminationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a kill condition. + * + * @param {string} target array of target npcs e.g. "AnyPmc", "Savage" + * @param {array} bodyParts array of body parts with which to kill e.g. ["stomach", "thorax"] + * @param {number} distance distance from which to kill (currently only >= supported) + * @returns {object} object of "Elimination"-kill-subcondition + */ + generateEliminationCondition(target: string, bodyPart: string[], distance: number): IEliminationCondition; + /** + * Used to create a quest pool during each cycle of repeatable quest generation. The pool will be subsequently + * narrowed down during quest generation to avoid duplicate quests. Like duplicate extractions or elimination quests + * where you have to e.g. kill scavs in same locations. + * + * @returns {object} the quest pool + */ + generateQuestPool(repeatableConfig: IRepeatableQuestConfig): IQuestTypePool; + /** + * Generate the reward for a mission. A reward can consist of + * - Experience + * - Money + * - Items + * - Trader Reputation + * + * The reward is dependent on the player level as given by the wiki. The exact mapping of pmcLevel to + * experience / money / items / trader reputation can be defined in QuestConfig.js + * + * There's also a random variation of the reward the spread of which can be also defined in the config. + * + * Additonaly, a scaling factor w.r.t. quest difficulty going from 0.2...1 can be used + * + * @param {integer} pmcLevel player's level + * @param {number} difficulty a reward scaling factor goint from 0.2 to 1 + * @param {string} traderId the trader for reputation gain (and possible in the future filtering of reward item type based on trader) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of "Reward"-type that can be given for a repeatable mission + */ + generateReward(pmcLevel: number, difficulty: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): IRewards; + /** + * Helper to create a reward item structured as required by the client + * + * @param {string} tpl itemId of the rewarded item + * @param {integer} value amount of items to give + * @param {integer} index all rewards will be appended to a list, for unkown reasons the client wants the index + * @returns {object} object of "Reward"-item-type + */ + generateRewardItem(tpl: string, value: number, index: number, preset?: any): IReward; + debugLogRepeatableQuestIds(pmcData: IPmcData): void; + probabilityObjectArray(configArrayInput: ProbabilityObject[]): ProbabilityObjectArray; + changeRepeatableQuest(pmcDataIn: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/TradeController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/TradeController.d.ts new file mode 100644 index 0000000..c86745c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/TradeController.d.ts @@ -0,0 +1,21 @@ +import { RagfairServer } from "../servers/RagfairServer"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TradeHelper } from "../helpers/TradeHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +declare class TradeController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected tradeHelper: TradeHelper; + protected profileHelper: ProfileHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, tradeHelper: TradeHelper, profileHelper: ProfileHelper, ragfairServer: RagfairServer); + confirmTrading(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid?: boolean, upd?: Upd): IItemEventRouterResponse; + confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} +export { TradeController }; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/TraderController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/TraderController.d.ts new file mode 100644 index 0000000..7bab158 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/TraderController.d.ts @@ -0,0 +1,26 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderAssortHelper } from "../helpers/TraderAssortHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class TraderController { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected traderAssortHelper: TraderAssortHelper; + protected profileHelper: ProfileHelper; + protected traderHelper: TraderHelper; + protected timeUtil: TimeUtil; + protected traderAssortService: TraderAssortService; + protected jsonUtil: JsonUtil; + constructor(logger: ILogger, databaseServer: DatabaseServer, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, timeUtil: TimeUtil, traderAssortService: TraderAssortService, jsonUtil: JsonUtil); + load(): void; + getTrader(traderID: string, sessionID: string): ITraderBase; + getAllTraders(sessionID: string): ITraderBase[]; + updateTraders(): boolean; + getAssort(sessionId: string, traderId: string): ITraderAssort; + getPurchasesData(traderID: string, sessionID: string): Record; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/WeatherController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/WeatherController.d.ts new file mode 100644 index 0000000..ca7f5eb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/WeatherController.d.ts @@ -0,0 +1,11 @@ +import { WeatherGenerator } from "../generators/WeatherGenerator"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WeatherController { + protected weatherGenerator: WeatherGenerator; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer); + generate(): IWeatherData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/controllers/WishlistController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/WishlistController.d.ts new file mode 100644 index 0000000..a96c522 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/controllers/WishlistController.d.ts @@ -0,0 +1,10 @@ +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class WishlistController { + protected itemEvenRouter: ItemEventRouter; + constructor(itemEvenRouter: ItemEventRouter); + addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/di/Container.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/di/Container.d.ts new file mode 100644 index 0000000..17791b0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/di/Container.d.ts @@ -0,0 +1,14 @@ +import { DependencyContainer } from "tsyringe"; +export declare class Container { + static registerTypes(depContainer: DependencyContainer): void; + static registerListTypes(depContainer: DependencyContainer): void; + private static registerUtils; + private static registerRouters; + private static registerGenerators; + private static registerHelpers; + private static registerLoaders; + private static registerCallbacks; + private static registerServices; + private static registerServers; + private static registerControllers; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/di/OnLoad.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/di/OnLoad.d.ts new file mode 100644 index 0000000..064d07d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/di/OnLoad.d.ts @@ -0,0 +1,4 @@ +export declare class OnLoad { + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/di/OnLoadOnUpdate.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/di/OnLoadOnUpdate.d.ts new file mode 100644 index 0000000..8bd3dc3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/di/OnLoadOnUpdate.d.ts @@ -0,0 +1,7 @@ +import { OnLoad } from "./OnLoad"; +import { OnUpdate } from "./OnUpdate"; +export declare class OnLoadOnUpdate implements OnLoad, OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/di/OnUpdate.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/di/OnUpdate.d.ts new file mode 100644 index 0000000..7fbbe09 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/di/OnUpdate.d.ts @@ -0,0 +1,4 @@ +export declare class OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/di/Router.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/di/Router.d.ts new file mode 100644 index 0000000..2fb98e0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/di/Router.d.ts @@ -0,0 +1,40 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +export declare class Router { + private handledRoutes; + getTopLevelRoute(): string; + protected getHandledRoutes(): HandledRoute[]; + private getInternalHandledRoutes; + canHandle(url: string, partialMatch?: boolean): boolean; +} +export declare class StaticRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleStatic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class DynamicRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleDynamic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class ItemEventRouterDefinition extends Router { + constructor(); + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} +export declare class SaveLoadRouter extends Router { + constructor(); + handleLoad(profile: IAkiProfile): IAkiProfile; +} +export declare class HandledRoute { + route: string; + dynamic: boolean; + constructor(route: string, dynamic: boolean); +} +export declare class RouteAction { + url: string; + action: (url: string, info: any, sessionID: string, output: string) => any; + constructor(url: string, action: (url: string, info: any, sessionID: string, output: string) => any); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/di/Serializer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/di/Serializer.d.ts new file mode 100644 index 0000000..70aa7c5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/di/Serializer.d.ts @@ -0,0 +1,5 @@ +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class Serializer { + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(something: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotGenerator.d.ts new file mode 100644 index 0000000..88a8014 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { Health as PmcHealth } from "../models/eft/common/IPmcData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { Health, Inventory, Skills } 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 { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotInventoryGenerator } from "./BotInventoryGenerator"; +declare namespace BotGenerator { + interface IRandomisedBotLevelResult { + level: number; + exp: number; + } +} +export declare class BotGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected botInventoryGenerator: BotInventoryGenerator; + protected botHelper: BotHelper; + protected gameEventHelper: GameEventHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + protected generateBot(bot: IBotBase, role: string, isPmc: boolean): IBotBase; + protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** Converts health object to the required format */ + protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; + protected generateSkills(skillsObj: Skills): Skills; + protected getPmcRole(pmcSide: string): string; + protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + protected generateId(bot: IBotBase): IBotBase; + protected generateInventoryID(profile: IBotBase): IBotBase; + protected getPMCDifficulty(requestedDifficulty: string): string; + protected generateDogtag(bot: IBotBase): IBotBase; +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotInventoryGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotInventoryGenerator.d.ts new file mode 100644 index 0000000..783d0c5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotInventoryGenerator.d.ts @@ -0,0 +1,24 @@ +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +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"; +export declare class BotInventoryGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected botWeaponGenerator: BotWeaponGenerator; + 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(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; + protected generateInventoryBase(): PmcInventory; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotLootGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotLootGenerator.d.ts new file mode 100644 index 0000000..1d91836 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotLootGenerator.d.ts @@ -0,0 +1,29 @@ +import { PMCLootGenerator } from "../generators/PMCLootGenerator"; +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { ItemMinMax, Items } from "../models/eft/common/tables/IBotType"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotLootGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected pmcLootGenerator: PMCLootGenerator; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, pmcLootGenerator: PMCLootGenerator, configServer: ConfigServer); + generateLoot(lootPool: Items, itemCounts: ItemMinMax, isPmc: boolean, inventory: PmcInventory): void; + protected getRandomisedCount(min: number, max: number, nValue: number): number; + protected addLootFromPool(pool: ITemplateItem[], equipmentSlots: string[], count: number, inventory: PmcInventory, totalValueLimit?: number, useLimits?: boolean): void; + /** Compares two item templates by their price to spawn chance ratio */ + protected compareByValue(a: ITemplateItem, b: ITemplateItem): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotWeaponGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotWeaponGenerator.d.ts new file mode 100644 index 0000000..13fe7df --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/generators/BotWeaponGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { MinMax, Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotWeaponGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected weightedRandomHelper: WeightedRandomHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected randomUtil: RandomUtil; + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil); + generateWeapon(equipmentSlot: string, weaponPool: Record, modPool: Mods, modChances: ModsChances, magCounts: MinMax, botRole: string, isPmc: boolean, inventory: PmcInventory): void; + /** Checks if all required slots are occupied on a weapon and all it's mods */ + protected isWeaponValid(itemList: Item[]): boolean; + /** + * Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets. + * Additionally, adds extra bullets to SecuredContainer + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @param {*} magCounts + * @param {*} ammoTpl + * @returns + */ + protected generateExtraMagazines(weaponMods: Item[], weaponTemplate: ITemplateItem, magCounts: MinMax, ammoTpl: string, inventory: PmcInventory): void; + protected addBullets(ammoTpl: string, bulletCount: number, inventory: PmcInventory): void; + /** + * Finds and returns tpl of ammo that should be used, while making sure it's compatible + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @returns + */ + protected getCompatibleAmmo(weaponMods: Item[], weaponTemplate: ITemplateItem): string; + /** Fill existing magazines to full, while replacing their contents with specified ammo */ + protected fillExistingMagazines(weaponMods: Item[], magazine: Item, ammoTpl: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/generators/LocationGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/generators/LocationGenerator.d.ts new file mode 100644 index 0000000..bd368b5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/generators/LocationGenerator.d.ts @@ -0,0 +1,46 @@ +import { ContainerHelper } from "../helpers/ContainerHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { ILooseLoot, SpawnpointTemplate } from "../models/eft/common/ILooseLoot"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "../models/eft/common/tables/ILootBase"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILocationConfig } from "../models/spt/config/ILocationConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { RandomUtil } from "../utils/RandomUtil"; +export interface IContainerItem { + items: Item[]; + width: number; + height: number; +} +export declare class LocationGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected objectId: ObjectId; + protected randomUtil: RandomUtil; + protected ragfairServerHelper: RagfairServerHelper; + protected itemHelper: ItemHelper; + protected mathUtil: MathUtil; + protected gameEventHelper: GameEventHelper; + protected containerHelper: ContainerHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected locationConfig: ILocationConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, objectId: ObjectId, randomUtil: RandomUtil, ragfairServerHelper: RagfairServerHelper, itemHelper: ItemHelper, mathUtil: MathUtil, gameEventHelper: GameEventHelper, containerHelper: ContainerHelper, presetHelper: PresetHelper, configServer: ConfigServer); + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + protected getLooseLootMultiplerForLocation(location: string): number; + protected getStaticLootMultiplerForLocation(location: string): number; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; + protected createItem(tpl: string, staticAmmoDist: Record, parentId?: string): IContainerItem; + protected getRandomCompatibleCaliberTemplateId(item: ITemplateItem): string; + protected getRandomValidCaliber(magTemplate: ITemplateItem): string; + protected drawAmmoTpl(caliber: string, staticAmmoDist: Record): string; + protected createRandomMagCartridges(magTemplate: ITemplateItem, parentId: string, staticAmmoDist: Record, caliber?: string): Item; + protected createCartidges(parentId: string, ammoTpl: string, stackCount: number): Item; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/generators/PMCLootGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/generators/PMCLootGenerator.d.ts new file mode 100644 index 0000000..64e6f7f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/generators/PMCLootGenerator.d.ts @@ -0,0 +1,15 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +export declare class PMCLootGenerator { + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected pocketLootPool: string[]; + protected backpackLootPool: string[]; + protected botConfig: IBotConfig; + constructor(itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/generators/RagfairAssortGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/generators/RagfairAssortGenerator.d.ts new file mode 100644 index 0000000..cbdd7f2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/generators/RagfairAssortGenerator.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairAssortGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected generatedAssortItems: Item[]; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + /** + * Get an array of unique items that can be sold on the flea + * @returns array of unique items + */ + getAssortItems(): Item[]; + protected assortsAreGenerated(): boolean; + /** + * Generate an array of items the flea can sell + * @returns array of unique items + */ + protected generateRagfairAssortItems(): Item[]; + protected createRagfairAssortItem(tplId: string, id?: string): Item; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/generators/RagfairOfferGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/generators/RagfairOfferGenerator.d.ts new file mode 100644 index 0000000..de53ea9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/generators/RagfairOfferGenerator.d.ts @@ -0,0 +1,60 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { RagfairAssortGenerator } from "./RagfairAssortGenerator"; +export declare class RagfairOfferGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected saveServer: SaveServer; + protected presetHelper: PresetHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairPriceService: RagfairPriceService; + protected fenceService: FenceService; + protected itemHelper: ItemHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer); + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; + protected getTraderId(userID: string): string; + protected getRating(userID: string): number; + protected getRatingGrowing(userID: string): boolean; + protected getOfferEndTime(userID: string, time: number): number; + /** + * Create multiple offers for items by using a unique list of items we've generated previously + * @param expiredOffers + */ + generateDynamicOffers(expiredOffers?: Item[]): void; + generateTraderOffers(traderID: string): void; + protected getItemCondition(userID: string, items: Item[], itemDetails: ITemplateItem): Item[]; + protected addMissingCondition(item: Item): Item; + protected getOfferRequirements(items: Item[]): { + count: number; + _tpl: string; + }[]; + /** + * Create a flea offer and store it in the Ragfair server offers array + */ + createFleaOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/generators/WeatherGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/generators/WeatherGenerator.d.ts new file mode 100644 index 0000000..23aa169 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/generators/WeatherGenerator.d.ts @@ -0,0 +1,20 @@ +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class WeatherGenerator { + protected weightedRandomHelper: WeightedRandomHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateTime(data: IWeatherData): IWeatherData; + generateWeather(data: IWeatherData): IWeatherData; + protected getWeightedFog(): string; + protected getWeightedRain(): number; + protected getRandomFloat(node: string): number; + protected getRandomInt(node: string): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/AssortHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/AssortHelper.d.ts new file mode 100644 index 0000000..15586b9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/AssortHelper.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ItemHelper } from "./ItemHelper"; +import { QuestHelper } from "./QuestHelper"; +export declare class AssortHelper { + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + constructor(logger: ILogger, itemHelper: ItemHelper, databaseServer: DatabaseServer, questHelper: QuestHelper); + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort assort items from a trader + * @returns assort items minus locked quest assorts + */ + stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort traders assorts + * @returns traders assorts minus locked loyality assorts + */ + stripLockedLoyaltyAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove an item from an assort + * @param assort assort to modify + * @param itemID item id to remove from asort + * @returns Modified assort + */ + removeItemFromAssort(assort: ITraderAssort, itemID: string): ITraderAssort; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/BotGeneratorHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/BotGeneratorHelper.d.ts new file mode 100644 index 0000000..c382fc9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/BotGeneratorHelper.d.ts @@ -0,0 +1,95 @@ +import { DurabilityLimitsHelper } from "../helpers/DurabilityLimitsHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item, Repairable, Upd } from "../models/eft/common/tables/IItem"; +import { Grid, ITemplateItem, Slot } from "../models/eft/common/tables/ITemplateItem"; +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { InventoryHelper } from "./InventoryHelper"; +import { ItemHelper } from "./ItemHelper"; +export declare class BotGeneratorHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected durabilityLimitsHelper: DurabilityLimitsHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected containerHelper: ContainerHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, configServer: ConfigServer); + generateModsForItem(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, isPmc?: boolean): Item[]; + /** + * With the shotgun revolver (60db29ce99594040e04c4a27) 12.12 introduced CylinderMagazines. + * Those magazines (e.g. 60dc519adf4c47305f6d410d) have a "Cartridges" entry with a _max_count=0. + * Ammo is not put into the magazine directly but assigned to the magazine's slots: The "camora_xxx" slots. + * This function is a helper called by generateModsForItem for mods with parent type "CylinderMagazine" + * + * @param {object} items The items where the CylinderMagazine's camora are appended to + * @param {object} modPool modPool which should include available cartrigdes + * @param {string} parentId The CylinderMagazine's UID + * @param {object} parentTemplate The CylinderMagazine's template + */ + protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void; + generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): { + upd?: Upd; + }; + /** + * Create a repairable object for a weapon that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + /** + * Create a repairable object for an armor that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string; + /** + * Sort by spawn chance, highest to lowest, higher is more common + * @param unsortedModArray String array to sort + * @returns Sorted string array + */ + protected sortModArray(unsortedModArray: string[]): string[]; + /** + * Can an item be added to an item without issue + * @param items + * @param tplToCheck + * @param equipmentSlot + * @returns true if possible + */ + isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean; + /** + * Adds an item with all its childern into specified equipmentSlots, wherever it fits. + * @param equipmentSlots + * @param parentId + * @param parentTpl + * @param itemWithChildren + * @param inventory + * @returns a `boolean` indicating item was added + */ + addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: PmcInventory): boolean; + protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean; +} +export declare class ExhaustableArray { + private itemPool; + private randomUtil; + private jsonUtil; + private pool; + constructor(itemPool: T[], randomUtil: RandomUtil, jsonUtil: JsonUtil); + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/BotHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/BotHelper.d.ts new file mode 100644 index 0000000..0cb1227 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/BotHelper.d.ts @@ -0,0 +1,44 @@ +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + getBotDifficultySettings(type: string, difficulty: string): Difficulty; + getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Randomise the chance the PMC will attack their own side + * @param difficultySettings pmc difficulty settings + */ + randomisePmcHostility(difficultySettings: Difficulty): void; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + /** + * Add a bot to the FRIENDLY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typeToAdd bot type to add to friendly list + */ + addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; + /** + * Add a bot to the ENEMY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to enemy list + */ + addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Add a bot to the REVENGE_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to revenge list + */ + addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ContainerHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ContainerHelper.d.ts new file mode 100644 index 0000000..3c2ee93 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ContainerHelper.d.ts @@ -0,0 +1,12 @@ +export declare class FindSlotResult { + success: boolean; + x: any; + y: any; + rotation: boolean; + constructor(success?: boolean, x?: any, y?: any, rotation?: boolean); +} +export declare class ContainerHelper { + protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean; + findSlotForItem(container2D: number[][], itemWidth: number, itemHeight: number): FindSlotResult; + fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): any; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/DialogueHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/DialogueHelper.d.ts new file mode 100644 index 0000000..9776c6a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/DialogueHelper.d.ts @@ -0,0 +1,21 @@ +import { Dialogue, MessageContent, MessagePreview } from "../models/eft/profile/IAkiProfile"; +import { MessageType } from "../models/enums/MessageType"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { ItemHelper } from "./ItemHelper"; +import { NotificationSendHelper } from "./NotificationSendHelper"; +import { NotifierHelper } from "./NotifierHelper"; +export declare class DialogueHelper { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected notificationSendHelper: NotificationSendHelper; + protected itemHelper: ItemHelper; + constructor(hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, notificationSendHelper: NotificationSendHelper, itemHelper: ItemHelper); + createMessageContext(templateId: string, messageType: MessageType, maxStoreTime: number): MessageContent; + addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards?: any[]): void; + getMessagePreview(dialogue: Dialogue): MessagePreview; + getMessageItemContents(messageID: string, sessionID: string): any[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/DurabilityLimitsHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/DurabilityLimitsHelper.d.ts new file mode 100644 index 0000000..07a5db1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/DurabilityLimitsHelper.d.ts @@ -0,0 +1,26 @@ +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotHelper } from "./BotHelper"; +export declare class DurabilityLimitsHelper { + protected randomUtil: RandomUtil; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(randomUtil: RandomUtil, botHelper: BotHelper, configServer: ConfigServer); + getRandomisedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + getRandomisedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + protected generateMaxWeaponDurability(botRole: string): number; + protected generateMaxPmcArmorDurability(itemMaxDurability: number): number; + protected getLowestMaxWeaponFromConfig(botRole: string): number; + protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number; + protected generateWeaponDurability(botRole: string, maxDurability: number): number; + protected generateArmorDurability(botRole: string, maxDurability: number): number; + protected getMinWeaponDeltaFromConfig(botRole: string): number; + protected getMaxWeaponDeltaFromConfig(botRole: string): number; + protected getMinArmorDeltaFromConfig(botRole: string): number; + protected getMaxArmorDeltaFromConfig(botRole: string): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ExtendedProfileHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ExtendedProfileHelper.d.ts new file mode 100644 index 0000000..d8b754d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ExtendedProfileHelper.d.ts @@ -0,0 +1,22 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { IPmcData, Skills, Stats } from "../models/eft/common/IPmcData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class ExtendedProfileHelper extends ProfileHelper { + protected botGenerator: BotGenerator; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService, botGenerator: BotGenerator); + generatePlayerScav(sessionID: string): IPmcData; + protected getScavSkills(sessionID: string): Skills; + protected removeSecureContainer(profile: IPmcData): IPmcData; + protected getDefaultScavSkills(): Skills; + protected getScavStats(sessionID: string): Stats; + protected getScavLevel(sessionID: string): number; + protected getScavExperience(sessionID: string): number; + protected setScavCooldownTimer(profile: IPmcData, pmcData: IPmcData): IPmcData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/GameEventHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/GameEventHelper.d.ts new file mode 100644 index 0000000..b2d6377 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/GameEventHelper.d.ts @@ -0,0 +1,9 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class GameEventHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + get EVENT(): Record; + get christmasEventItems(): string[]; + itemIsChristmasRelated(itemId: string): boolean; + christmasEventEnabled(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HandbookHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HandbookHelper.d.ts new file mode 100644 index 0000000..b47d466 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HandbookHelper.d.ts @@ -0,0 +1,33 @@ +declare class LookupItem { + byId: Record; + byParent: Record; + constructor(); +} +export declare class LookupCollection { + items: LookupItem; + categories: LookupItem; + constructor(); +} +export declare class HandbookHelper { + protected lookup: LookupCollection; + hydrateLookup(lookup: LookupCollection): void; + getTemplatePrice(x: string): number; + templatesWithParent(x: string): string[]; + isCategory(x: string): boolean; + childrenCategories(x: string): string[]; + /** + * Gets Currency to Ruble conversion Value + * @param {number} value + * @param {string} currencyFrom + * @returns number + */ + inRUB(value: number, currencyFrom: string): number; + /** + * Gets Ruble to Currency conversion Value + * @param {number} value + * @param {string} currencyTo + * @returns number + */ + fromRUB(value: number, currencyTo: string): number; +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HealthHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HealthHelper.d.ts new file mode 100644 index 0000000..518c23f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HealthHelper.d.ts @@ -0,0 +1,27 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHealthConfig } from "../models/spt/config/IHealthConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HealthHelper { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected configServer: ConfigServer; + protected healthConfig: IHealthConfig; + constructor(jsonUtil: JsonUtil, logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, configServer: ConfigServer); + resetVitality(sessionID: string): IAkiProfile; + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + protected saveHealth(pmcData: IPmcData, sessionID: string): void; + protected saveEffects(pmcData: IPmcData, sessionID: string): void; + protected addEffect(pmcData: IPmcData, sessionID: string, effect: { + bodyPart: string; + effectType: string; + }): void; + protected isEmpty(map: any): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HideoutHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HideoutHelper.d.ts new file mode 100644 index 0000000..76b337f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HideoutHelper.d.ts @@ -0,0 +1,68 @@ +import { Common, HideoutArea, IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { StageBonus } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class HideoutHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected inventoryHelper: InventoryHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + static BITCOIN_FARM: string; + protected WATER_COLLECTOR: string; + protected BITCOIN: string; + protected EXPEDITIONARY_FUEL_TANK: string; + static NAME_BACKENDCOUNTERS_CRAFTING: string; + static SKILL_NAME_HIDEOUT: string; + static HOUR_FOR_SKILL_CRAFTING: number; + static SKILL_NAME_CRAFITING: string; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer); + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + /** + * This convinience function intialies new Production Object + * with all the constants. + */ + initProduction(recipeId: string, productionTime: number): Production; + isProductionType(productive: Productive): productive is Production; + applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void; + protected applySkillXPBoost(pmcData: IPmcData, bonus: StageBonus): void; + updatePlayerHideout(sessionID: string): void; + protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void; + protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean; + protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateWaterFilters(waterFilterArea: HideoutArea, pwProd: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea; + protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd; + protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production; + protected getBTCSlots(pmcData: IPmcData): number; + protected getManagementSkillsSlots(): number; + protected hasManagementSkillSlots(pmcData: IPmcData): boolean; + protected getHideoutManagementSkill(pmcData: IPmcData): Common; + protected getHideoutManagementConsumptionBonus(pmcData: IPmcData): number; + isProduction(productive: Productive): productive is Production; + getBTC(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + getRandomAmountRewardForScavCase(itemToCalculate: ITemplateItem): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HttpServerHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HttpServerHelper.d.ts new file mode 100644 index 0000000..c6e5296 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/HttpServerHelper.d.ts @@ -0,0 +1,23 @@ +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HttpServerHelper { + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + protected mime: { + css: string; + bin: string; + html: string; + jpg: string; + js: string; + json: string; + png: string; + svg: string; + txt: string; + }; + constructor(configServer: ConfigServer); + getMimeText(key: string): string; + buildUrl(): string; + getBackendUrl(): string; + getWebsocketUrl(): string; + sendTextJson(resp: any, output: any): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/InRaidHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/InRaidHelper.d.ts new file mode 100644 index 0000000..05b6fdf --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/InRaidHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Victim } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { PaymentHelper } from "./PaymentHelper"; +export declare class InRaidHelper { + protected logger: ILogger; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + protected removePlayer(sessionID: string): void; + protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void; + addUpdToMoneyFromRaid(items: Item[]): void; + /** + * Add positive karma for PMC kills + * @param {*} existingFenceStanding + * @param {*} victims + */ + calculateFenceStandingChangeFromKills(existingFenceStanding: number, victims: Victim[]): void; + setBaseStats(profileData: IPmcData, offraidData: ISaveProgressRequestData, sessionID: string): IPmcData; + markFoundItems(pmcData: IPmcData, profile: IPmcData, isPlayerScav: boolean): IPmcData; + removeFoundInRaidStatusFromItems(profile: IPmcData): IPmcData; + setInventory(sessionID: string, pmcData: IPmcData, profile: IPmcData): IPmcData; + deleteInventory(pmcData: IPmcData, sessionID: string): IPmcData; + getPlayerGear(items: Item[]): Item[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/InventoryHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/InventoryHelper.d.ts new file mode 100644 index 0000000..dc7cbca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/InventoryHelper.d.ts @@ -0,0 +1,85 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInventoryConfig } from "../models/spt/config/IInventoryConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class InventoryHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected httpResponse: HttpResponseUtil; + protected fenceService: FenceService; + protected databaseServer: DatabaseServer; + protected paymentHelper: PaymentHelper; + protected traderAssortHelper: TraderAssortHelper; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected containerHelper: ContainerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected inventoryConfig: IInventoryConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, httpResponse: HttpResponseUtil, fenceService: FenceService, databaseServer: DatabaseServer, paymentHelper: PaymentHelper, traderAssortHelper: TraderAssortHelper, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, containerHelper: ContainerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + getItemSize(itemTpl: string, itemID: string, inventoryItem: Item[]): Record; + protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): Record; + protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash; + getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]; + /** + * Based on the item action, determine whose inventories we should be looking at for from and to. + */ + getOwnerInventoryItems(body: IInventoryMoveRequestData | IInventorySplitRequestData | IInventoryMergeRequestData, sessionID: string): OwnerInventoryItems; + /** + * Made a 2d array table with 0 - free slot and 1 - used slot + * @param {Object} pmcData + * @param {string} sessionID + * @returns Array + */ + protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][]; + protected getStashType(sessionID: string): string; + protected getPlayerStashSize(sessionID: string): Record; + /** + * Internal helper function to transfer an item from one profile to another. + * fromProfileData: Profile of the source. + * toProfileData: Profile of the destination. + * body: Move request + */ + moveItemToProfile(fromItems: Item[], toItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to move item within the same profile_f. + */ + moveItemInternal(inventoryItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to handle cartridges in inventory if any of them exist. + */ + protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void; +} +declare namespace InventoryHelper { + interface InventoryItemHash { + byItemId: Record; + byParentId: Record; + } +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ItemHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ItemHelper.d.ts new file mode 100644 index 0000000..f124cb1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ItemHelper.d.ts @@ -0,0 +1,147 @@ +import { InsuredItem, IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +declare class ItemHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer); + /** + * Checks if a 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 + */ + isValidItem(tpl: string, invalidBaseTypes?: string[]): boolean; + /** + * Checks if a id is a valid item. Valid meaning that it's an item that may be a reward + * or content of bot loot. Items that are tested as valid may be in a player backpack or stash. + * @param {*} tpl template id of item to check + * @returns boolean: true if item is valid reward + */ + isValidRewardItem(tpl: string): boolean; + /** + * Picks rewardable items from items.json. This means they need to fit into the inventory and they shouldn't be keys (debatable) + * @returns a list of rewardable items [[_tpl, itemTemplate],...] + */ + getRewardableItems(): [string, ITemplateItem][]; + /** + * Check if the tpl / template Id provided is a descendent of the baseclass + * + * @param {string} tpl the item template id to check + * @param {string} baseclassTpl the baseclass to check for + * @return {boolean} is the tpl a descendent? + */ + isOfBaseclass(tpl: string, baseclassTpl: string): any; + /** + * Returns the item price based on the handbook or as a fallback from the prices.json if the item is not + * found in the handbook. If the price can't be found at all return 0 + * + * @param {string} tpl the item template to check + * @returns {integer} The price of the item or 0 if not found + */ + getItemPrice(tpl: string): number; + fixItemStackCount(item: Item): Item; + /** + * AmmoBoxes contain StackSlots which need to be filled for the AmmoBox to have content. + * Here's what a filled AmmoBox looks like: + * { + * "_id": "b1bbe982daa00ac841d4ae4d", + * "_tpl": "57372c89245977685d4159b1", + * "parentId": "5fe49a0e2694b0755a504876", + * "slotId": "hideout", + * "location": { + * "x": 3, + * "y": 4, + * "r": 0 + * }, + * "upd": { + * "StackObjectsCount": 1 + * } + * }, + * { + * "_id": "b997b4117199033afd274a06", + * "_tpl": "56dff061d2720bb5668b4567", + * "parentId": "b1bbe982daa00ac841d4ae4d", + * "slotId": "cartridges", + * "location": 0, + * "upd": { + * "StackObjectsCount": 30 + * } + * } + * Given the AmmoBox Item (first object) this function generates the StackSlot (second object) and returns it. + * StackSlots are only used for AmmoBoxes which only have one element in StackSlots. However, it seems to be generic + * to possibly also have more than one StackSlot. As good as possible, without seeing items having more than one + * StackSlot, this function takes account of this and creates and returns an array of StackSlotItems + * + * @param {object} item The item template of the AmmoBox as given in items.json + * @param {string} parentId The id of the AmmoBox instance these StackSlotItems should be children of + * @returns {array} The array of StackSlotItems + */ + generateStackSlotItems(item: ITemplateItem, parentId: string): StackSlot[]; + getItem(tpl: string): [boolean, ITemplateItem]; + getItemQualityModifier(item: Item): number; + findAndReturnChildrenByItems(items: Item[], itemID: string): string[]; + /** + * A variant of findAndReturnChildren where the output is list of item objects instead of their ids. + */ + findAndReturnChildrenAsItems(items: Item[], baseItemId: string): Item[]; + /** + * find children of the item in a given assort (weapons parts for example, need recursive loop function) + */ + findAndReturnChildrenByAssort(itemIdToFind: string, assort: Item[]): Item[]; + hasBuyRestrictions(itemToCheck: Item): boolean; + /** + * Is Dogtag + * Checks if an item is a dogtag. Used under profile_f.js to modify preparePrice based + * on the level of the dogtag + */ + isDogtag(tpl: string): boolean; + isNotSellable(tpl: string): boolean; + getChildId(item: Item): string; + isItemTplStackable(tpl: string): boolean; + /** + * split item stack if it exceeds StackMaxSize + */ + splitStack(item: Item): Item[]; + /** + * Find Barter items in the inventory + * @param {string} by + * @param {Object} pmcData + * @param {string} barter_itemID + * @returns Array + */ + findBarterItems(by: string, pmcData: IPmcData, barter_itemID: string): any[]; + /** + * @param {Object} pmcData + * @param {Array} items + * @param {Object} fastPanel + * @returns Array + */ + replaceIDs(pmcData: IPmcData, items: Item[], insuredItems?: InsuredItem[], fastPanel?: any): any[]; + /** + * Recursivly loop down through an items hierarchy to see if any of the ids match the supplied list, return true if any do + * @param {string} tpl + * @param {Array} tplsToCheck + * @returns boolean + */ + doesItemOrParentsIdMatch(tpl: string, tplsToCheck: string[]): boolean; + /** + * Return true if item is a quest item + * @param {string} tpl + * @returns boolean + */ + isQuestItem(tpl: string): boolean; + getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize; +} +declare namespace ItemHelper { + interface ItemSize { + width: number; + height: number; + } +} +export { ItemHelper }; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/NotificationSendHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/NotificationSendHelper.d.ts new file mode 100644 index 0000000..34e62d9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/NotificationSendHelper.d.ts @@ -0,0 +1,12 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { NotificationService } from "../services/NotificationService"; +export declare class NotificationSendHelper { + protected httpServer: IHttpServer; + protected notificationService: NotificationService; + constructor(httpServer: IHttpServer, notificationService: NotificationService); + /** + * Send notification message to the appropiate channel + */ + sendMessage(sessionID: string, notificationMessage: INotification): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/NotifierHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/NotifierHelper.d.ts new file mode 100644 index 0000000..738b69a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/NotifierHelper.d.ts @@ -0,0 +1,17 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { Message, MessageContentRagfair } from "../models/eft/profile/IAkiProfile"; +import { HttpServerHelper } from "./HttpServerHelper"; +export declare class NotifierHelper { + protected httpServerHelper: HttpServerHelper; + /** + * The default notification sent when waiting times out. + */ + protected defaultNotification: INotification; + constructor(httpServerHelper: HttpServerHelper); + getDefaultNotification(): INotification; + /** Creates a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside */ + createRagfairOfferSoldNotification(dialogueMessage: Message, ragfairData: MessageContentRagfair): INotification; + /** Creates a new notification with the specified dialogueMessage object. */ + createNewMessageNotification(dialogueMessage: Message): INotification; + getWebSocketServer(sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/PaymentHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/PaymentHelper.d.ts new file mode 100644 index 0000000..2d068a4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/PaymentHelper.d.ts @@ -0,0 +1,14 @@ +export declare class PaymentHelper { + /** + * Check whether tpl is Money + * @param {string} tpl + * @returns void + */ + isMoneyTpl(tpl: string): boolean; + /** + * Gets currency TPL from TAG + * @param {string} currency + * @returns string + */ + getCurrency(currency: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/PresetHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/PresetHelper.d.ts new file mode 100644 index 0000000..0371886 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/PresetHelper.d.ts @@ -0,0 +1,14 @@ +import { Preset } from "../models/eft/common/IGlobals"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetHelper { + protected databaseServer: DatabaseServer; + protected lookup: Record; + constructor(databaseServer: DatabaseServer); + hydratePresetStore(input: Record): void; + isPreset(id: string): boolean; + hasPreset(templateId: string): boolean; + getPreset(id: string): Preset; + getPresets(templateId: string): Preset[]; + getDefaultPreset(templateId: string): Preset; + getBaseItemTpl(presetId: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ProfileHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ProfileHelper.d.ts new file mode 100644 index 0000000..6a64291 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/ProfileHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Stats } from "../models/eft/common/IPmcData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +export declare class ProfileHelper { + protected jsonUtil: JsonUtil; + protected watermark: Watermark; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected fenceService: FenceService; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService); + resetProfileQuestCondition(sessionID: string, conditionId: string): void; + getCompleteProfile(sessionID: string): IPmcData[]; + isNicknameTaken(info: IValidateNicknameRequestData, sessionID: string): boolean; + getProfileByPmcId(pmcId: string): IPmcData; + getExperience(level: number): number; + getMaxLevel(): number; + getDefaultAkiDataObject(): any; + getFullProfile(sessionID: string): IAkiProfile; + getPmcProfile(sessionID: string): IPmcData; + getScavProfile(sessionID: string): IPmcData; + getDefaultCounters(): Stats; + protected isWiped(sessionID: string): boolean; + protected getServerVersion(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/QuestConditionHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/QuestConditionHelper.d.ts new file mode 100644 index 0000000..90ee560 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/QuestConditionHelper.d.ts @@ -0,0 +1,7 @@ +import { AvailableForConditions } from "../models/eft/common/tables/IQuest"; +export declare class QuestConditionHelper { + getQuestConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLevelConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLoyaltyConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/QuestHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/QuestHelper.d.ts new file mode 100644 index 0000000..f32c85c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/QuestHelper.d.ts @@ -0,0 +1,69 @@ +import { IPmcData, Quest } from "../models/eft/common/IPmcData"; +import { AvailableForConditions, AvailableForProps, IQuest, Reward } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { TraderHelper } from "./TraderHelper"; +export declare class QuestHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, traderHelper: TraderHelper, configServer: ConfigServer); + static get STATUS(): Record; + questStatus(pmcData: IPmcData, questID: string): string; + /** + * returns true is the condition is satisfied + */ + evaluateLevel(pmcProfile: IPmcData, cond: AvailableForConditions): boolean; + getDeltaQuests(before: IQuest[], after: IQuest[]): IQuest[]; + rewardSkillPoints(sessionID: string, pmcData: IPmcData, output: IItemEventRouterResponse, skillName: string, progress: number): void; + getQuestLocale(questId: string): any; + /** + * Debug Routine for showing some information on the + * quest list in question. + */ + dumpQuests(quests: any, label?: any): void; + loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean; + protected processReward(reward: Reward): any[]; + getQuestRewardItems(quest: IQuest, state: string): Reward[]; + addQuestToPMCData(pmcData: IPmcData, quest: Quest, newState: string, acceptedQuest: IAcceptQuestRequestData): void; + acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[]; + failedUnlocked(failedQuestId: string, sessionID: string): IQuest[]; + applyMoneyBoost(quest: IQuest, moneyBoost: number): IQuest; + changeItemStack(pmcData: IPmcData, id: string, value: number, sessionID: string, output: any): void; + /** + * Get List of All Quests as an array + */ + questValues(): IQuest[]; + protected cleanQuestList(quests: IQuest[]): IQuest[]; + cleanQuestConditions(quest: IQuest): IQuest; + failQuest(pmcData: IPmcData, body: any, sessionID: string): any; + getQuestFromDb(questId: string, pmcData: IPmcData): IQuest; + getQuestLocaleIdFromDb(messageId: string, localisation?: string): string; + applyQuestReward(pmcData: IPmcData, body: ICompleteQuestRequestData, state: string, sessionID: string): any[]; + getFindItemIdForQuestItem(itemTpl: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairHelper.d.ts new file mode 100644 index 0000000..c8bc5ba --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairHelper.d.ts @@ -0,0 +1,44 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairLinkedItemService } from "../services/RagfairLinkedItemService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +import { UtilityHelper } from "./UtilityHelper"; +export declare class RagfairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected traderAssortHelper: TraderAssortHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected ragfairLinkedItemService: RagfairLinkedItemService; + protected utilityHelper: UtilityHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, traderAssortHelper: TraderAssortHelper, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, ragfairLinkedItemService: RagfairLinkedItemService, utilityHelper: UtilityHelper, configServer: ConfigServer); + /** + * Gets currency TAG from TPL + * @param {string} currency + * @returns string + */ + getCurrencyTag(currency: string): string; + filterCategories(sessionID: string, info: ISearchRequestData): string[]; + getDisplayableAssorts(sessionID: string): Record; + protected getCategoryList(handbookId: string): string[]; + countCategories(result: IGetOffersResult): void; + /** + * Merges Root Items + * Ragfair allows abnormally large stacks. + */ + mergeStackable(items: Item[]): Item[]; + getCurrencySymbol(currencyTpl: string): string; + formatCurrency(moneyAmount: number): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairOfferHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairOfferHelper.d.ts new file mode 100644 index 0000000..129bc1c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairOfferHelper.d.ts @@ -0,0 +1,52 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { PresetHelper } from "./PresetHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairHelper } from "./RagfairHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { RagfairSortHelper } from "./RagfairSortHelper"; +export declare class RagfairOfferHelper { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected paymentHelper: PaymentHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected configServer: ConfigServer; + protected static TPL_GOODS_SOLD: string; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, configServer: ConfigServer); + getValidOffers(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + getOffersForBuild(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + processOffers(sessionID: string): boolean; + protected getProfileOffers(sessionID: string): IRagfairOffer[]; + protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; + isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairSellHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairSellHelper.d.ts new file mode 100644 index 0000000..6ec004a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairSellHelper.d.ts @@ -0,0 +1,16 @@ +import { SellResult } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairSellHelper { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateSellChance(baseChance: number, offerPrice: number, requirementsPriceInRub: number): number; + rollForSale(sellChance: number, count: number): SellResult[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairServerHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairServerHelper.d.ts new file mode 100644 index 0000000..2cb3ea5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairServerHelper.d.ts @@ -0,0 +1,46 @@ +import { MemberCategory } from "../models/enums/MemberCategory"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class RagfairServerHelper { + protected randomUtil: RandomUtil; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected jsonUtil: JsonUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + protected static TPL_GOODS_RETURNED: string; + constructor(randomUtil: RandomUtil, hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, profileHelper: ProfileHelper, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, jsonUtil: JsonUtil, configServer: ConfigServer); + /** + * Is item valid / on blacklist / quest item + * @param itemDetails + * @returns boolean + */ + isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean; + protected isItemBlacklisted(itemTemplateId: string): boolean; + isTrader(userID: string): boolean; + isPlayer(userID: string): boolean; + returnItems(sessionID: string, items: any[]): void; + calculateDynamicStackCount(tplId: string, isWeaponPreset: boolean): number; + getDynamicOfferCurrency(): string; + getMemberType(userID: string): MemberCategory; + getNickname(userID: string): string; + getPresetItems(item: any): Item[]; + getPresetItemsByTpl(item: Item): Item[]; + reparentPresets(item: Item, preset: Item[]): Item[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairSortHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairSortHelper.d.ts new file mode 100644 index 0000000..e983569 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairSortHelper.d.ts @@ -0,0 +1,12 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class RagfairSortHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + sortOffers(offers: IRagfairOffer[], type: number, direction?: number): IRagfairOffer[]; + protected sortOffersByID(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByExpiry(a: IRagfairOffer, b: IRagfairOffer): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairTaxHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairTaxHelper.d.ts new file mode 100644 index 0000000..820facb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RagfairTaxHelper.d.ts @@ -0,0 +1,16 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { ItemHelper } from "./ItemHelper"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairTaxHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected ragfairPriceService: RagfairPriceService; + protected itemHelper: ItemHelper; + constructor(logger: ILogger, databaseServer: DatabaseServer, ragfairPriceService: RagfairPriceService, itemHelper: ItemHelper); + calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number; + protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem?: boolean): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RepairHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RepairHelper.d.ts new file mode 100644 index 0000000..650c1aa --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/RepairHelper.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { Props } from "../models/eft/common/tables/ITemplateItem"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RepairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, configServer: ConfigServer); + updateItemDurability(itemToRepairId: string, amountToRepair: number, pmcData: IPmcData, useRepairKit?: boolean): Item; + protected getRandomisedArmorRepairDegredationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number): number; + protected getRandomisedWeaponRepairDegredationValue(itemProps: Props, isRepairKit: boolean, armorMax: number): number; + isWeaponTemplate(tpl: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/SecureContainerHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/SecureContainerHelper.d.ts new file mode 100644 index 0000000..9e2bc32 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/SecureContainerHelper.d.ts @@ -0,0 +1,13 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ItemHelper } from "./ItemHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class SecureContainerHelper { + protected itemHelper: ItemHelper; + constructor(itemHelper: ItemHelper); + getSecureContainerItems(items: Item[]): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/TradeHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/TradeHelper.d.ts new file mode 100644 index 0000000..975062b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/TradeHelper.d.ts @@ -0,0 +1,44 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item, Upd } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { RagfairServer } from "../servers/RagfairServer"; +import { FenceService } from "../services/FenceService"; +import { PaymentService } from "../services/PaymentService"; +export declare class TradeHelper { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected fenceService: FenceService; + protected inventoryHelper: InventoryHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer); + /** + * Buy item from flea or trader + * @param pmcData + * @param buyRequestData data from client + * @param sessionID + * @param foundInRaid + * @param upd optional item details used when buying from flea + * @returns + */ + buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse; + /** + * Sell item to trader + * @param pmcData + * @param body + * @param sessionID + * @returns + */ + sellItem(pmcData: IPmcData, body: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse; + protected incrementAssortBuyCount(assortBeingPurchased: Item, itemsPurchasedCount: number): void; + protected checkPurchaseIsWithinTraderItemLimit(assortBeingPurchased: Item, assortId: string, count: number): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/TraderAssortHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/TraderAssortHelper.d.ts new file mode 100644 index 0000000..4f41ac2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/TraderAssortHelper.d.ts @@ -0,0 +1,42 @@ +import { RagfairAssortGenerator } from "../generators/RagfairAssortGenerator"; +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { AssortHelper } from "./AssortHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderAssortHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected assortHelper: AssortHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected traderAssortService: TraderAssortService; + protected fenceService: FenceService; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, profileHelper: ProfileHelper, assortHelper: AssortHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferGenerator: RagfairOfferGenerator, traderAssortService: TraderAssortService, fenceService: FenceService); + /** + * Get a traders assorts + * Can be used for returning ragfair / fence assorts + * @param sessionId session id + * @param traderId trader id + * @returns a traders assorts + */ + getAssort(sessionId: string, traderId: string): ITraderAssort; + /** + * Get an array of pristine trader items prior to any alteration by player + * @param traderId trader id + * @returns array of Items + */ + protected getPristineTraderAssorts(traderId: string): Item[]; + /** + * Returns generated ragfair offers in a trader assort format + * @returns Trader assort object + */ + protected getRagfairDataAsTraderAssort(): ITraderAssort; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/TraderHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/TraderHelper.d.ts new file mode 100644 index 0000000..ab4a371 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/TraderHelper.d.ts @@ -0,0 +1,53 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { PlayerService } from "../services/PlayerService"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemHelper: ItemHelper; + protected handbookHelper: HandbookHelper; + protected playerService: PlayerService; + protected fenceService: FenceService; + protected configServer: ConfigServer; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemHelper: ItemHelper, handbookHelper: HandbookHelper, playerService: PlayerService, fenceService: FenceService, configServer: ConfigServer); + getTrader(traderID: string, sessionID: string): ITraderBase; + getTraderAssortsById(traderId: string): ITraderAssort; + /** + * Reset a trader back to its initial state as seen by a level 1 player + * Does NOT take into account different profile levels + * @param sessionID session id + * @param traderID trader id to reset + */ + resetTrader(sessionID: string, traderID: string): void; + changeTraderDisplay(traderID: string, status: boolean, sessionID: string): void; + getPurchasesData(traderID: string, sessionID: string): Record; + /** + * Calculate traders level based on exp amount and increment level if over threshold + * @param traderID trader to process + * @param sessionID session id + */ + lvlUp(traderID: string, sessionID: string): void; + getTraderUpdateSeconds(traderId: string): number; + /** + * check if an item is allowed to be sold to a trader + * @param traderFilters array of allowed categories + * @param tplToCheck itemTpl of inventory + * @returns boolean + */ + traderFilter(traderFilters: string[], tplToCheck: string): boolean; + getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/UtilityHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/UtilityHelper.d.ts new file mode 100644 index 0000000..5d9f482 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/UtilityHelper.d.ts @@ -0,0 +1,3 @@ +export declare class UtilityHelper { + arrayIntersect(a: T[], b: T[]): T[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/helpers/WeightedRandomHelper.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/WeightedRandomHelper.d.ts new file mode 100644 index 0000000..9aa0d29 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/helpers/WeightedRandomHelper.d.ts @@ -0,0 +1,28 @@ +export declare class WeightedRandomHelper { + /** + * Gets a tplId from a weighted dictionary + * @param {tplId: weighting[]} itemArray + * @returns tplId + */ + getWeightedInventoryItem(itemArray: { + [tplId: string]: unknown; + } | ArrayLike): string; + /** + * Picks the random item based on its weight. + * The items with higher weight will be picked more often (with a higher probability). + * + * For example: + * - items = ['banana', 'orange', 'apple'] + * - weights = [0, 0.2, 0.8] + * - weightedRandom(items, weights) in 80% of cases will return 'apple', in 20% of cases will return + * 'orange' and it will never return 'banana' (because probability of picking the banana is 0%) + * + * @param {any[]} items + * @param {number[]} weights + * @returns {{item: any, index: number}} + */ + weightedRandom(items: string | any[], weights: string | any[]): { + item: any; + index: number; + }; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/ide/BleedingEdgeEntry.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/ide/BleedingEdgeEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/ide/BleedingEdgeEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/ide/Compiler.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/ide/Compiler.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/ide/Compiler.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/ide/DebugEntry.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/ide/DebugEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/ide/DebugEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/ide/ReleaseEntry.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/ide/ReleaseEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/ide/ReleaseEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/ide/TestEntry.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/ide/TestEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/ide/TestEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/loaders/BundleLoader.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/loaders/BundleLoader.d.ts new file mode 100644 index 0000000..06ad698 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/loaders/BundleLoader.d.ts @@ -0,0 +1,22 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +declare class BundleInfo { + modPath: string; + key: string; + path: string; + filepath: string; + dependencyKeys: string[]; + constructor(modpath: string, bundle: any, bundlePath: string, bundleFilepath: string); +} +export declare class BundleLoader { + protected httpServerHelper: HttpServerHelper; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected bundles: Record; + constructor(httpServerHelper: HttpServerHelper, vfs: VFS, jsonUtil: JsonUtil); + getBundles(local: boolean): BundleInfo[]; + getBundle(key: string, local: boolean): BundleInfo; + addBundles(modpath: string): void; +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/loaders/DelayedModLoader.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/loaders/DelayedModLoader.d.ts new file mode 100644 index 0000000..2a05604 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/loaders/DelayedModLoader.d.ts @@ -0,0 +1,21 @@ +import { DependencyContainer } from "tsyringe"; +import { HandbookController } from "../controllers/HandbookController"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +import { InitialModLoader } from "./InitialModLoader"; +export declare class DelayedModLoader implements IModLoader { + protected bundleLoader: BundleLoader; + protected handbookController: HandbookController; + protected vfs: VFS; + protected modCompilerService: ModCompilerService; + protected initialModLoader: InitialModLoader; + constructor(bundleLoader: BundleLoader, handbookController: HandbookController, vfs: VFS, modCompilerService: ModCompilerService, initialModLoader: InitialModLoader); + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; + load(): void; + protected executeMods(container: DependencyContainer): void; + protected addBundles(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/loaders/InitialModLoader.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/loaders/InitialModLoader.d.ts new file mode 100644 index 0000000..68e47fe --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/loaders/InitialModLoader.d.ts @@ -0,0 +1,64 @@ +import { DependencyContainer } from "tsyringe"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ModLoader } from "../models/spt/mod/IMod"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +export declare class InitialModLoader implements IModLoader { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected modCompilerService: ModCompilerService; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected static container: DependencyContainer; + protected readonly basepath = "user/mods/"; + protected imported: Record; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer); + load(container: DependencyContainer): Promise; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + /** + * Returns a list of mods with preserved load order + * @returns Array of mod names in load order + */ + getImportedModsNames(): string[]; + getModPath(mod: string): string; + protected importClass(name: string, filepath: string, container: DependencyContainer): void; + protected importMods(): Promise; + /** + * + * @param mods Get an array of broken/invalid mods by name + * @returns Mod names array + */ + protected getBrokenMods(mods: string[]): string[]; + /** + * Get packageJson data for mods + * @param mods mods to get packageJson for + * @returns dictionary + */ + protected getModsPackageData(mods: string[]): Record; + /** + * Does mod have "delayedLoad(" string in its entry class + * @param modFolderName folder name + * @param modToValidate package.json details + * @returns boolean + */ + protected isModSpt300Compatible(modFolderName: string, modToValidate: IPackageJsonData): boolean; + protected isModCombatibleWithAki(mod: IPackageJsonData): boolean; + protected executeMods(container: DependencyContainer): void; + sortModsLoadOrder(): string[]; + protected addMod(mod: string): Promise; + protected areModDependenciesFulfilled(mod: IPackageJsonData, loadedMods: Record): boolean; + protected isModCompatible(mod: IPackageJsonData, loadedMods: Record): boolean; + protected validMod(mod: string): boolean; + protected getLoadOrderRecursive(mod: string, result: Record, visited: Record): void; + protected getLoadOrder(mods: Record): Record; + getContainer(): DependencyContainer; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts new file mode 100644 index 0000000..c49cef7 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts @@ -0,0 +1,8 @@ +export interface IGenerateBotsRequestData { + conditions: Condition[]; +} +export interface Condition { + Role: string; + Limit: number; + Difficulty: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IEmptyRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IEmptyRequestData.d.ts new file mode 100644 index 0000000..284d16e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IEmptyRequestData.d.ts @@ -0,0 +1,2 @@ +export interface IEmptyRequestData { +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IGlobals.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IGlobals.d.ts new file mode 100644 index 0000000..456895c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IGlobals.d.ts @@ -0,0 +1,1176 @@ +import { Item } from "./tables/IItem"; +export interface IGlobals { + time: number; + config: Config; + bot_presets: BotPreset[]; + BotWeaponScatterings: BotWeaponScattering[]; + ItemPresets: Record; +} +export interface Config { + content: Content; + AimPunchMagnitude: number; + WeaponSkillProgressRate: number; + SkillAtrophy: boolean; + exp: Exp; + t_base_looting: number; + t_base_lockpicking: number; + armor: Armor; + SessionsToShowHotKeys: number; + MaxBotsAliveOnMap: number; + SavagePlayCooldown: number; + SavagePlayCooldownNdaFree: number; + MarksmanAccuracy: number; + SavagePlayCooldownDevelop: number; + TODSkyDate: string; + Mastering: Mastering[]; + GlobalItemPriceModifier: number; + TradingUnlimitedItems: boolean; + MaxLoyaltyLevelForAll: boolean; + GlobalLootChanceModifier: number; + TimeBeforeDeploy: number; + TimeBeforeDeployLocal: number; + LoadTimeSpeedProgress: number; + BaseLoadTime: number; + BaseUnloadTime: number; + BaseCheckTime: number; + Customization: Customization; + UncheckOnShot: boolean; + BotsEnabled: boolean; + ArmorMaterials: ArmorMaterials; + LegsOverdamage: number; + HandsOverdamage: number; + StomachOverdamage: number; + Health: Health; + rating: Rating; + tournament: Tournament; + RagFair: RagFair; + handbook: Handbook; + FractureCausedByFalling: Probability; + FractureCausedByBulletHit: Probability; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + Stamina: Stamina; + StaminaRestoration: StaminaRestoration; + StaminaDrain: StaminaDrain; + RequirementReferences: RequirementReferences; + RepairKitSettings: RepairKitSettings; + RestrictionsInRaid: RestrictionsInRaid[]; + SkillMinEffectiveness: number; + SkillFatiguePerPoint: number; + SkillFreshEffectiveness: number; + SkillFreshPoints: number; + SkillPointsBeforeFatigue: number; + SkillFatigueReset: number; + DiscardLimitsEnabled: boolean; + EventType: string[]; + WalkSpeed: xyz; + SprintSpeed: xyz; + SkillEnduranceWeightThreshold: number; + TeamSearchingTimeout: number; + Insurance: Insurance; + SkillExpPerLevel: number; + GameSearchingTimeout: number; + WallContusionAbsorption: xyz; + SkillsSettings: SkillsSettings; + AzimuthPanelShowsPlayerOrientation: boolean; + Aiming: Aiming; + Malfunction: Malfunction; + Overheat: Overheat; + FenceSettings: FenceSettings; + TestValue: number; + Inertia: Inertia; + Ballistic: Ballistic; +} +export interface Content { + ip: string; + port: number; + root: string; +} +export interface Exp { + heal: Heal; + match_end: MatchEnd; + kill: Kill; + level: Level; + loot_attempts: LootAttempt[]; + expForLockedDoorOpen: number; + expForLockedDoorBreach: number; + triggerMult: number; +} +export interface Heal { + expForHeal: number; + expForHydration: number; + expForEnergy: number; +} +export interface MatchEnd { + README: string; + survived_exp_requirement: number; + survived_seconds_requirement: number; + survived_exp_reward: number; + mia_exp_reward: number; + runner_exp_reward: number; + leftMult: number; + miaMult: number; + survivedMult: number; + runnerMult: number; + killedMult: number; +} +export interface Kill { + combo: Combo[]; + victimLevelExp: number; + headShotMult: number; + expOnDamageAllHealth: number; + longShotDistance: number; + bloodLossToLitre: number; + victimBotLevelExp: number; +} +export interface Combo { + percent: number; +} +export interface Level { + exp_table: ExpTable[]; + trade_level: number; + savage_level: number; + clan_level: number; + mastering1: number; + mastering2: number; +} +export interface ExpTable { + exp: number; +} +export interface LootAttempt { + k_exp: number; +} +export interface Armor { + class: Class[]; +} +export interface Class { + resistance: number; +} +export interface Mastering { + Name: string; + Templates: string[]; + Level2: number; + Level3: number; +} +export interface Customization { + SavageHead: SavageHead; + SavageBody: SavageBody; + SavageFeet: SavageFeet; + CustomizationVoice: CustomizationVoice[]; + BodyParts: BodyParts; +} +export interface SavageHead { + wild_head_1: WildHead; + wild_head_2: WildHead; + wild_head_3: WildHead; + Wild_Dealmaker_head: WildHead; + Wild_Killa_head: WildHead; + bear_head: WildHead; + bear_head_1: WildHead; + usec_head_1: WildHead; + Head_BOSS_Glukhar: WildHead; + Wild_Head_nonMesh: WildHead; + Head_BOSS_Sanitar: WildHead; + wild_head_drozd: WildHead; + wild_head_misha: WildHead; + head_cultist_01: WildHead; + head_cultist_02: WildHead; + head_cultist_03: WildHead; + DefaultUsecHead: WildHead; + usec_head_3: WildHead; + usec_head_4: WildHead; + usec_head_5: WildHead; +} +export interface WildHead { + head: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface SavageBody { + wild_body: WildBody; + wild_body_1: WildBody; + wild_body_2: WildBody; + wild_body_3: WildBody; + Wild_Dealmaker_body: WildBody; + wild_security_body_1: WildBody; + wild_security_body_2: WildBody; + wild_Killa_body: WildBody; + wild_pmcBot_body: WildBody; + wild_Shturman_body: WildBody; + wild_Gluhar_body: WildBody; + Tshirt_security_TshirtTatu_01: WildBody; + Tshirt_security_TshirtTatu_02: WildBody; + Top_security_Husky: WildBody; + Top_security_Gorka4: WildBody; + scav_kit_upper_meteor: WildBody; + wild_body_russia1: WildBody; + Top_BOSS_Sanitar: WildBody; + wild_body_motocross: WildBody; + top_cultist_01: WildBody; + top_cultist_02: WildBody; + wild_body_rainparka: WildBody; + wild_body_underarmour: WildBody; + top_boss_tagilla: WildBody; + DefaultUsecBody: WildBody; + usec_upper_acu: WildBody; + usec_upper_commando: WildBody; + usec_upper_aggressor: WildBody; + usec_upper_hoody: WildBody; + usec_upper_pcuironsight: WildBody; + usec_top_beltstaff: WildBody; + usec_upper_flexion: WildBody; + usec_upper_tier3: WildBody; + usec_upper_pcsmulticam: WildBody; + usec_upper_tier_2: WildBody; + usec_upper_infiltrator: WildBody; + user_upper_NightPatrol: WildBody; + wild_body_bomber: WildBody; + wild_top_yellowcoat: WildBody; +} +export interface WildBody { + body: string; + hands: string; + isNotRandom: boolean; +} +export interface SavageFeet { + wild_feet: WildFeet; + wild_feet_1: WildFeet; + wild_feet_2: WildFeet; + Wild_Dealmaker_feet: WildFeet; + wild_security_feet_1: WildFeet; + Wild_Killa_feet: WildFeet; + wild_pmcBot_feet: WildFeet; + Pants_BOSS_Glukhar: WildFeet; + Pants_BOSS_Shturman: WildFeet; + Pants_security_Gorka4: WildFeet; + Pants_security_Flora: WildFeet; + scav_kit_lower_sklon: WildFeet; + Pants_BOSS_Sanitar: WildFeet; + wild_feet_sweatpants: WildFeet; + wild_feet_wasatch: WildFeet; + wild_feet_slimPants: WildFeet; + pants_cultist_01: WildFeet; + pants_cultist_02: WildFeet; + wild_feet_scavelite_taclite: WildFeet; + pants_boss_tagilla: WildFeet; + wild_feet_bomber: WildFeet; + wild_pants_yellowcoat: WildFeet; +} +export interface WildFeet { + feet: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface CustomizationVoice { + voice: string; + side: string[]; + isNotRandom: boolean; +} +export interface BodyParts { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface ArmorMaterials { + UHMWPE: ArmorType; + Aramid: ArmorType; + Combined: ArmorType; + Titan: ArmorType; + Aluminium: ArmorType; + ArmoredSteel: ArmorType; + Ceramic: ArmorType; + Glass: ArmorType; +} +export interface ArmorType { + Destructibility: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + ExplosionDestructibility: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; +} +export interface Health { + Falling: Falling; + Effects: Effects; + HealPrice: HealPrice; + ProfileHealthSettings: ProfileHealthSettings; +} +export interface Falling { + DamagePerMeter: number; + SafeHeight: number; +} +export interface Effects { + Existence: Existence; + Dehydration: Dehydration; + BreakPart: BreakPart; + Contusion: Contusion; + Disorientation: Disorientation; + Exhaustion: Exhaustion; + LowEdgeHealth: LowEdgeHealth; + RadExposure: RadExposure; + Stun: Stun; + Intoxication: Intoxication; + Regeneration: Regeneration; + Wound: Wound; + Berserk: Berserk; + Flash: Flash; + MedEffect: MedEffect; + Pain: Pain; + PainKiller: PainKiller; + SandingScreen: SandingScreen; + Stimulator: Stimulator; + Tremor: Tremor; + ChronicStaminaFatigue: ChronicStaminaFatigue; + Fracture: Fracture2; + HeavyBleeding: HeavyBleeding2; + LightBleeding: LightBleeding2; + BodyTemperature: BodyTemperature; +} +export interface Existence { + EnergyLoopTime: number; + HydrationLoopTime: number; + EnergyDamage: number; + HydrationDamage: number; + DestroyedStomachEnergyTimeFactor: number; + DestroyedStomachHydrationTimeFactor: number; +} +export interface Dehydration { + DefaultDelay: number; + DefaultResidueTime: number; + BleedingHealth: number; + BleedingLoopTime: number; + BleedingLifeTime: number; + DamageOnStrongDehydration: number; + StrongDehydrationLoopTime: number; +} +export interface BreakPart { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface Contusion { + Dummy: number; +} +export interface Disorientation { + Dummy: number; +} +export interface Exhaustion { + DefaultDelay: number; + DefaultResidueTime: number; + Damage: number; + DamageLoopTime: number; +} +export interface LowEdgeHealth { + DefaultDelay: number; + DefaultResidueTime: number; + StartCommonHealth: number; +} +export interface RadExposure { + Damage: number; + DamageLoopTime: number; +} +export interface Stun { + Dummy: number; +} +export interface Intoxication { + DefaultDelay: number; + DefaultResidueTime: number; + DamageHealth: number; + HealthLoopTime: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovedAfterDeath: boolean; + HealExperience: number; + RemovePrice: number; +} +export interface Regeneration { + LoopTime: number; + MinimumHealthPercentage: number; + Energy: number; + Hydration: number; + BodyHealth: BodyHealth; + Influences: Influences; +} +export interface BodyHealth { + Head: BodyHealthValue; + Chest: BodyHealthValue; + Stomach: BodyHealthValue; + LeftArm: BodyHealthValue; + RightArm: BodyHealthValue; + LeftLeg: BodyHealthValue; + RightLeg: BodyHealthValue; +} +export interface BodyHealthValue { + Value: number; +} +export interface Influences { + LightBleeding: Influence; + HeavyBleeding: Influence; + Fracture: Influence; + RadExposure: Influence; + Intoxication: Influence; +} +export interface Influence { + HealthSlowDownPercentage: number; + EnergySlowDownPercentage: number; + HydrationSlowDownPercentage: number; +} +export interface Wound { + WorkingTime: number; + ThresholdMin: number; + ThresholdMax: number; +} +export interface Berserk { + DefaultDelay: number; + WorkingTime: number; + DefaultResidueTime: number; +} +export interface Flash { + Dummy: number; +} +export interface MedEffect { + LoopTime: number; + StartDelay: number; + DrinkStartDelay: number; + FoodStartDelay: number; + DrugsStartDelay: number; + MedKitStartDelay: number; + MedicalStartDelay: number; + StimulatorStartDelay: number; +} +export interface Pain { + TremorDelay: number; + HealExperience: number; +} +export interface PainKiller { + Dummy: number; +} +export interface SandingScreen { + Dummy: number; +} +export interface Stimulator { + BuffLoopTime: number; + Buffs: Buffs; +} +export interface Buffs { + BuffsSJ1TGLabs: Buff[]; + BuffsSJ6TGLabs: Buff[]; + BuffsPropital: Buff[]; + BuffsZagustin: Buff[]; + BuffseTGchange: Buff[]; + BuffsAdrenaline: Buff[]; + BuffsGoldenStarBalm: Buff[]; + Buffs_drink_aquamari: Buff[]; + Buffs_drink_maxenergy: Buff[]; + Buffs_drink_milk: Buff[]; + Buffs_drink_tarcola: Buff[]; + Buffs_drink_hotrod: Buff[]; + Buffs_drink_juice_army: Buff[]; + Buffs_drink_water: Buff[]; + Buffs_food_borodinskiye: Buff[]; + Buffs_food_condensed_milk: Buff[]; + Buffs_food_emelya: Buff[]; + Buffs_food_mayonez: Buff[]; + Buffs_food_mre: Buff[]; + Buffs_food_sugar: Buff[]; + Buffs_drink_vodka: Buff[]; + Buffs_drink_jack: Buff[]; + Buffs_drink_moonshine: Buff[]; + Buffs_drink_purewater: Buff[]; + Buffs_3bTG: Buff[]; + Buffs_AHF1M: Buff[]; + Buffs_L1: Buff[]; + Buffs_MULE: Buff[]; + Buffs_Meldonin: Buff[]; + Buffs_Obdolbos: Buff[]; + Buffs_P22: Buff[]; + Buffs_KultistsToxin: Buff[]; + Buffs_BodyTemperature: Buff[]; + Buffs_Antidote: Buff[]; + Buffs_melee_bleed: Buff[]; + Buffs_melee_blunt: Buff[]; + Buffs_hultafors: Buff[]; + Buffs_drink_vodka_BAD: Buff[]; + Buffs_food_alyonka: Buff[]; + Buffs_food_slippers: Buff[]; + Buffs_knife: Buff[]; +} +export interface Buff { + BuffType: string; + Chance: number; + Delay: number; + Duration: number; + Value: number; + AbsoluteValue: boolean; + SkillName: string; +} +export interface Tremor { + DefaultDelay: number; + DefaultResidueTime: number; +} +export interface ChronicStaminaFatigue { + EnergyRate: number; + WorkingTime: number; + TicksEvery: number; + EnergyRatePerStack: number; +} +export interface Fracture2 { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface HeavyBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface Probability { + FunctionType: string; + K: number; + B: number; + Threshold: number; +} +export interface LightBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface BodyTemperature { + DefaultBuildUpTime: number; + DefaultResidueTime: number; + LoopTime: number; +} +export interface HealPrice { + HealthPointPrice: number; + HydrationPointPrice: number; + EnergyPointPrice: number; + TrialLevels: number; + TrialRaids: number; +} +export interface ProfileHealthSettings { + BodyPartsSettings: BodyPartsSettings; + HealthFactorsSettings: HealthFactorsSettings; +} +export interface BodyPartsSettings { + Head: BodyPartsSetting; + Chest: BodyPartsSetting; + Stomach: BodyPartsSetting; + LeftArm: BodyPartsSetting; + RightArm: BodyPartsSetting; + LeftLeg: BodyPartsSetting; + RightLeg: BodyPartsSetting; +} +export interface BodyPartsSetting { + Minimum: number; + Maximum: number; + Default: number; + OverDamageReceivedMultiplier: number; +} +export interface HealthFactorsSettings { + Energy: HealthFactorSetting; + Hydration: HealthFactorSetting; + Temperature: HealthFactorSetting; + Poisoning: HealthFactorSetting; + Radiation: HealthFactorSetting; +} +export interface HealthFactorSetting { + Minimum: number; + Maximum: number; + Default: number; +} +export interface Rating { + levelRequired: number; + limit: number; + categories: Categories; +} +export interface Categories { + experience: boolean; + kd: boolean; + surviveRatio: boolean; + avgEarnings: boolean; + kills: boolean; + raidCount: boolean; + longestShot: boolean; + timeOnline: boolean; + inventoryFullCost: boolean; + ragFairStanding: boolean; +} +export interface Tournament { + categories: Categories2; + limit: number; + levelRequired: number; +} +export interface Categories2 { + dogtags: boolean; +} +export interface RagFair { + enabled: boolean; + priceStabilizerEnabled: boolean; + includePveTraderSales: boolean; + priceStabilizerStartIntervalInHours: number; + minUserLevel: number; + communityTax: number; + communityItemTax: number; + communityRequirementTax: number; + offerPriorityCost: number; + offerDurationTimeInHour: number; + offerDurationTimeInHourAfterRemove: number; + priorityTimeModifier: number; + maxRenewOfferTimeInHour: number; + renewPricePerHour: number; + maxActiveOfferCount: MaxActiveOfferCount[]; + balancerRemovePriceCoefficient: number; + balancerMinPriceCount: number; + balancerAveragePriceCoefficient: number; + delaySinceOfferAdd: number; + uniqueBuyerTimeoutInDays: number; + ratingSumForIncrease: number; + ratingIncreaseCount: number; + ratingSumForDecrease: number; + ratingDecreaseCount: number; + maxSumForIncreaseRatingPerOneSale: number; + maxSumForDecreaseRatingPerOneSale: number; + maxSumForRarity: MaxSumForRarity; + ChangePriceCoef: number; + balancerUserItemSaleCooldownEnabled: boolean; + balancerUserItemSaleCooldown: number; + youSellOfferMaxStorageTimeInHour: number; + yourOfferDidNotSellMaxStorageTimeInHour: number; + isOnlyFoundInRaidAllowed: boolean; + sellInOnePiece: number; +} +export interface MaxActiveOfferCount { + from: number; + to: number; + count: number; +} +export interface MaxSumForRarity { + Common: RarityMaxSum; + Rare: RarityMaxSum; + Superrare: RarityMaxSum; + Not_exist: RarityMaxSum; +} +export interface RarityMaxSum { + value: number; +} +export interface Handbook { + defaultCategory: string; +} +export interface Stamina { + Capacity: number; + SprintDrainRate: number; + BaseRestorationRate: number; + JumpConsumption: number; + GrenadeHighThrow: number; + GrenadeLowThrow: number; + AimDrainRate: number; + AimRangeFinderDrainRate: number; + OxygenCapacity: number; + OxygenRestoration: number; + WalkOverweightLimits: xyz; + BaseOverweightLimits: xyz; + SprintOverweightLimits: xyz; + WalkSpeedOverweightLimits: xyz; + CrouchConsumption: xyz; + WalkConsumption: xyz; + StandupConsumption: xyz; + TransitionSpeed: xyz; + SprintAccelerationLowerLimit: number; + SprintSpeedLowerLimit: number; + SprintSensitivityLowerLimit: number; + AimConsumptionByPose: xyz; + RestorationMultiplierByPose: xyz; + OverweightConsumptionByPose: xyz; + AimingSpeedMultiplier: number; + WalkVisualEffectMultiplier: number; + HandsCapacity: number; + HandsRestoration: number; + ProneConsumption: number; + BaseHoldBreathConsumption: number; + SoundRadius: xyz; + ExhaustedMeleeSpeed: number; + FatigueRestorationRate: number; + FatigueAmountToCreateEffect: number; + ExhaustedMeleeDamageMultiplier: number; + FallDamageMultiplier: number; + SafeHeightOverweight: number; + SitToStandConsumption: number; + StaminaExhaustionCausesJiggle: boolean; + StaminaExhaustionStartsBreathSound: boolean; + StaminaExhaustionRocksCamera: boolean; + HoldBreathStaminaMultiplier: xyz; + PoseLevelIncreaseSpeed: xyz; + PoseLevelDecreaseSpeed: xyz; + PoseLevelConsumptionPerNotch: xyz; +} +export interface StaminaRestoration { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface StaminaDrain { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface RequirementReferences { + Alpinist: Alpinist[]; +} +export interface Alpinist { + Requirement: string; + Id: string; + Count: number; + RequiredSlot: string; + RequirementTip: string; +} +export interface RestrictionsInRaid { + TemplateId: string; + Value: number; +} +export interface Insurance { + MaxStorageTimeInHour: number; +} +export interface SkillsSettings { + SkillProgressRate: number; + WeaponSkillProgressRate: number; + WeaponSkillRecoilBonusPerLevel: number; + HideoutManagement: HideoutManagement; + Crafting: Crafting; + Metabolism: Metabolism; + Immunity: Immunity; + Endurance: Endurance; + Strength: Strength; + Vitality: Vitality; + Health: Health2; + StressResistance: StressResistance; + Throwing: Throwing; + RecoilControl: RecoilControl; + Pistol: WeaponSkills; + Revolver: WeaponSkills; + SMG: any[]; + Assault: WeaponSkills; + Shotgun: WeaponSkills; + Sniper: WeaponSkills; + LMG: any[]; + HMG: any[]; + Launcher: any[]; + AttachedLauncher: any[]; + Melee: any[]; + DMR: WeaponSkills; + BearAssaultoperations: any[]; + BearAuthority: any[]; + BearAksystems: any[]; + BearHeavycaliber: any[]; + BearRawpower: any[]; + UsecArsystems: any[]; + UsecDeepweaponmodding_Settings: any[]; + UsecLongrangeoptics_Settings: any[]; + UsecNegotiations: any[]; + UsecTactics: any[]; + BotReload: any[]; + CovertMovement: CovertMovement; + FieldMedicine: any[]; + Search: Search; + Sniping: any[]; + ProneMovement: any[]; + FirstAid: any[]; + LightVests: ArmorSkills; + HeavyVests: ArmorSkills; + WeaponModding: any[]; + AdvancedModding: any[]; + NightOps: any[]; + SilentOps: any[]; + Lockpicking: any[]; + WeaponTreatment: WeaponTreatment; + MagDrills: MagDrills; + Freetrading: any[]; + Auctions: any[]; + Cleanoperations: any[]; + Barter: any[]; + Shadowconnections: any[]; + Taskperformance: any[]; + Perception: Perception; + Intellect: Intellect; + Attention: Attention; + Charisma: Charisma; + Memory: Memory; + Surgery: Surgery; + AimDrills: AimDrills; + BotSound: any[]; + TroubleShooting: TroubleShooting; +} +export interface ArmorSkills { + WearAmountRepairLVestsReducePerLevel: number; + WearChanceRepairLVestsReduceEliteLevel: number; +} +export interface HideoutManagement { + SkillPointsPerAreaUpgrade: number; + SkillPointsPerCraft: number; + ConsumptionReductionPerLevel: number; + SkillBoostPercent: number; + SkillPointsRate: SkillPointsRate; + EliteSlots: EliteSlots; +} +export interface SkillPointsRate { + Generator: Generator; + AirFilteringUnit: SkillPointRate; + WaterCollector: SkillPointRate; + SolarPower: SkillPointRate; +} +export interface SkillPointRate { + ResourceSpent: number; + PointsGained: number; +} +export interface EliteSlots { + Generator: EliteSlot; + AirFilteringUnit: EliteSlot; + WaterCollector: EliteSlot; + BitcoinFarm: EliteSlot; +} +export interface EliteSlot { + Slots: number; + Container: number; +} +export interface Crafting { + PointsPerCraftingCycle: number; + CraftingCycleHours: number; + PointsPerUniqueCraftCycle: number; + UniqueCraftsPerCycle: number; + CraftTimeReductionPerLevel: number; + ProductionTimeReductionPerLevel: number; + EliteExtraProductions: number; + CraftingPointsToInteligence: number; +} +export interface Metabolism { + HydrationRecoveryRate: number; + EnergyRecoveryRate: number; + IncreasePositiveEffectDurationRate: number; + DecreaseNegativeEffectDurationRate: number; + DecreasePoisonDurationRate: number; +} +export interface Immunity { + ImmunityMiscEffects: number; + ImmunityPoisonBuff: number; + ImmunityPainKiller: number; + HealthNegativeEffect: number; + StimulatorNegativeBuff: number; +} +export interface Endurance { + MovementAction: number; + SprintAction: number; + GainPerFatigueStack: number; +} +export interface Strength { + SprintActionMin: number; + SprintActionMax: number; + MovementActionMin: number; + MovementActionMax: number; + PushUpMin: number; + PushUpMax: number; + FistfightAction: number; + ThrowAction: number; +} +export interface Vitality { + DamageTakenAction: number; + HealthNegativeEffect: number; +} +export interface Health2 { + SkillProgress: number; +} +export interface StressResistance { + HealthNegativeEffect: number; + LowHPDuration: number; +} +export interface Throwing { + ThrowAction: number; +} +export interface RecoilControl { + RecoilAction: number; + RecoilBonusPerLevel: number; +} +export interface WeaponSkills { + WeaponReloadAction: number; + WeaponShotAction: number; + WeaponFixAction: number; + WeaponChamberAction: number; +} +export interface CovertMovement { + MovementAction: number; +} +export interface Search { + SearchAction: number; + FindAction: number; +} +export interface WeaponTreatment { + DurLossReducePerLevel: number; + SkillPointsPerRepair: number; + Filter: any[]; + WearAmountRepairGunsReducePerLevel: number; + WearChanceRepairGunsReduceEliteLevel: number; +} +export interface MagDrills { + RaidLoadedAmmoAction: number; + RaidUnloadedAmmoAction: number; + MagazineCheckAction: number; +} +export interface Perception { + OnlineAction: number; + UniqueLoot: number; +} +export interface Intellect { + ExamineAction: number; + SkillProgress: number; + RepairAction: number; + WearAmountReducePerLevel: number; + WearChanceReduceEliteLevel: number; + RepairPointsCostReduction: number; +} +export interface Attention { + ExamineWithInstruction: number; + FindActionFalse: number; + FindActionTrue: number; +} +export interface Charisma { + SkillProgressInt: number; + SkillProgressAtn: number; + SkillProgressPer: number; +} +export interface Memory { + AnySkillUp: number; + SkillProgress: number; +} +export interface Surgery { + SurgeryAction: number; + SkillProgress: number; +} +export interface AimDrills { + WeaponShotAction: number; +} +export interface TroubleShooting { + MalfRepairSpeedBonusPerLevel: number; + SkillPointsPerMalfFix: number; + EliteDurabilityChanceReduceMult: number; + EliteAmmoChanceReduceMult: number; + EliteMagChanceReduceMult: number; +} +export interface Aiming { + ProceduralIntensityByPose: xyz; + AimProceduralIntensity: number; + HeavyWeight: number; + LightWeight: number; + MaxTimeHeavy: number; + MinTimeHeavy: number; + MaxTimeLight: number; + MinTimeLight: number; + RecoilScaling: number; + RecoilDamping: number; + CameraSnapGlobalMult: number; + RecoilXIntensityByPose: xyz; + RecoilYIntensityByPose: xyz; + RecoilZIntensityByPose: xyz; + RecoilCrank: boolean; + RecoilHandDamping: number; + RecoilConvergenceMult: number; + RecoilVertBonus: number; + RecoilBackBonus: number; +} +export interface Malfunction { + AmmoMalfChanceMult: number; + MagazineMalfChanceMult: number; + MalfRepairHardSlideMult: number; + MalfRepairOneHandBrokenMult: number; + MalfRepairTwoHandsBrokenMult: number; + AllowMalfForBots: boolean; + ShowGlowAttemptsCount: number; + OutToIdleSpeedMultForPistol: number; + IdleToOutSpeedMultOnMalf: number; + TimeToQuickdrawPistol: number; + DurRangeToIgnoreMalfs: xyz; + DurFeedWt: number; + DurMisfireWt: number; + DurJamWt: number; + DurSoftSlideWt: number; + DurHardSlideMinWt: number; + DurHardSlideMaxWt: number; + AmmoMisfireWt: number; + AmmoFeedWt: number; + AmmoJamWt: number; + OverheatFeedWt: number; + OverheatJamWt: number; + OverheatSoftSlideWt: number; + OverheatHardSlideMinWt: number; + OverheatHardSlideMaxWt: number; +} +export interface Overheat { + MinOverheat: number; + MaxOverheat: number; + OverheatProblemsStart: number; + ModHeatFactor: number; + ModCoolFactor: number; + MinWearOnOverheat: number; + MaxWearOnOverheat: number; + MinWearOnMaxOverheat: number; + MaxWearOnMaxOverheat: number; + OverheatWearLimit: number; + MaxCOIIncreaseMult: number; + MinMalfChance: number; + MaxMalfChance: number; + DurReduceMinMult: number; + DurReduceMaxMult: number; + BarrelMoveRndDuration: number; + BarrelMoveMaxMult: number; + FireratePitchMult: number; + FirerateReduceMinMult: number; + FirerateReduceMaxMult: number; + FirerateOverheatBorder: number; + EnableSlideOnMaxOverheat: boolean; + StartSlideOverheat: number; + FixSlideOverheat: number; + AutoshotMinOverheat: number; + AutoshotChance: number; + AutoshotPossibilityDuration: number; + MaxOverheatCoolCoef: number; +} +export interface FenceSettings { + FenceId: string; + Levels: Record; + paidExitStandingNumerator: number; +} +export interface FenceLevel { + SavageCooldownModifier: number; + ScavCaseTimeModifier: number; + PaidExitCostModifier: number; + BotFollowChance: number; + ScavEquipmentSpawnChanceModifier: number; + PriceModifier: number; + HostileBosses: boolean; + HostileScavs: boolean; + ScavAttackSupport: boolean; + ExfiltrationPriceModifier: number; + AvailableExits: number; +} +export interface Inertia { + InertiaLimits: xyz; + InertiaLimitsStep: number; + ExitMovementStateSpeedThreshold: xyz; + WalkInertia: xyz; + FallThreshold: number; + SpeedLimitAfterFallMin: xyz; + SpeedLimitAfterFallMax: xyz; + SpeedLimitDurationMin: xyz; + SpeedLimitDurationMax: xyz; + SpeedInertiaAfterJump: xyz; + BaseJumpPenaltyDuration: number; + DurationPower: number; + BaseJumpPenalty: number; + PenaltyPower: number; + InertiaTiltCurveMin: xyz; + InertiaTiltCurveMax: xyz; + InertiaBackwardCoef: xyz; + TiltInertiaMaxSpeed: xyz; + TiltStartSideBackSpeed: xyz; + TiltMaxSideBackSpeed: xyz; + TiltAcceleration: xyz; + AverageRotationFrameSpan: number; + SprintSpeedInertiaCurveMin: xyz; + SprintSpeedInertiaCurveMax: xyz; + SprintBrakeInertia: xyz; + SprintTransitionMotionPreservation: xyz; + WeaponFlipSpeed: xyz; + PreSprintAccelerationLimits: xyz; + SprintAccelerationLimits: xyz; + SideTime: xyz; + DiagonalTime: xyz; + MinDirectionBlendTime: number; + MoveTime: number; + MinMovementAccelerationRangeRight: xyz; + MaxMovementAccelerationRangeRight: xyz; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Ballistic { + GlobalDamageDegradationCoefficient: number; +} +export interface RepairKitSettings { + armorClassDivisor: number; + durabilityPointCostArmor: number; + durabilityPointCostGuns: number; +} +export interface BotPreset { + UseThis: boolean; + Role: string; + BotDifficulty: string; + VisibleAngle: number; + VisibleDistance: number; + ScatteringPerMeter: number; + HearingSense: number; + SCATTERING_DIST_MODIF: number; + MAX_AIMING_UPGRADE_BY_TIME: number; + FIRST_CONTACT_ADD_SEC: number; + COEF_IF_MOVE: number; +} +export interface BotWeaponScattering { + Name: string; + PriorityScatter1meter: number; + PriorityScatter10meter: number; + PriorityScatter100meter: number; +} +export interface Preset { + _id: string; + _type: string; + _changeWeaponName: boolean; + _name: string; + _parent: string; + _items: Item[]; + _encyclopedia?: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocation.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocation.d.ts new file mode 100644 index 0000000..42fac06 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocation.d.ts @@ -0,0 +1,6 @@ +import { ILocationBase } from "./ILocationBase"; +import { ILooseLoot } from "./ILooseLoot"; +export interface ILocation { + base: ILocationBase; + looseLoot: ILooseLoot; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocationBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocationBase.d.ts new file mode 100644 index 0000000..ad48d32 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocationBase.d.ts @@ -0,0 +1,198 @@ +export interface ILocationBase { + AccessKeys: string[]; + AirdropParameters: AirdropParameter[]; + Area: number; + AveragePlayTime: number; + AveragePlayerLevel: number; + Banners: Banner[]; + BossLocationSpawn: BossLocationSpawn[]; + BotAssault: number; + BotEasy: number; + BotHard: number; + BotImpossible: number; + BotLocationModifier: BotLocationModifier; + BotMarksman: number; + BotMax: number; + BotMaxPlayer: number; + BotMaxTimePlayer: number; + BotNormal: number; + BotSpawnTimeOffMax: number; + BotSpawnTimeOffMin: number; + BotSpawnTimeOnMax: number; + BotSpawnTimeOnMin: number; + BotStart: number; + BotStop: number; + Description: string; + DisabledForScav: boolean; + DisabledScavExits: string; + Enabled: boolean; + GlobalLootChanceModifier: number; + IconX: number; + IconY: number; + Id: string; + Insurance: boolean; + IsSecret: boolean; + Locked: boolean; + Loot: any[]; + MaxBotPerZone: number; + MaxDistToFreePoint: number; + MaxPlayers: number; + MinDistToExitPoint: number; + MinDistToFreePoint: number; + MinMaxBots: MinMaxBot[]; + MinPlayers: number; + Name: string; + NewSpawn: boolean; + OcculsionCullingEnabled: boolean; + OldSpawn: boolean; + OpenZones: string; + Preview: Preview; + RequiredPlayerLevel: number; + Rules: string; + SafeLocation: boolean; + Scene: Scene; + SpawnPointParams: SpawnPointParam[]; + UnixDateTime: number; + _Id: string; + doors: any[]; + escape_time_limit: number; + exit_access_time: number; + exit_count: number; + exit_time: number; + exits: Exit[]; + filter_ex: string[]; + limits: ILimit[]; + matching_min_seconds: number; + maxItemCountInLocation: MaxItemCountInLocation[]; + sav_summon_seconds: number; + tmp_location_field_remove_me: number; + users_gather_seconds: number; + users_spawn_seconds_n: number; + users_spawn_seconds_n2: number; + users_summon_seconds: number; + waves: Wave[]; +} +export interface ILimit { + min: number; + max: number; + items: any[]; +} +export interface AirdropParameter { + AirdropPointDeactivateDistance: number; + MinPlayersCountToSpawnAirdrop: number; + PlaneAirdropChance: number; + PlaneAirdropCooldownMax: number; + PlaneAirdropCooldownMin: number; + PlaneAirdropEnd: number; + PlaneAirdropMax: number; + PlaneAirdropStartMax: number; + PlaneAirdropStartMin: number; + UnsuccessfulTryPenalty: number; +} +export interface Banner { + id: string; + pic: Pic; +} +export interface Pic { + path: string; + rcid: string; +} +export interface BossLocationSpawn { + BossChance: number; + BossDifficult: string; + BossEscortAmount: string; + BossEscortDifficult: string; + BossEscortType: string; + BossName: string; + BossPlayer: boolean; + BossZone: string; + Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; +} +export interface BossSupport { + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; +} +export interface BotLocationModifier { + AccuracySpeed: number; + DistToActivate: number; + DistToPersueAxemanCoef: number; + DistToSleep: number; + GainSight: number; + KhorovodChance: number; + MagnetPower: number; + MarksmanAccuratyCoef: number; + Scattering: number; + VisibleDistance: number; +} +export interface MinMaxBot { + WildSpawnType: string; + max: number; + min: number; +} +export interface Preview { + path: string; + rcid: string; +} +export interface Scene { + path: string; + rcid: string; +} +export interface SpawnPointParam { + BotZoneName: string; + Categories: string[]; + ColliderParams: ColliderParams; + DelayToCanSpawnSec: number; + Id: string; + Infiltration: string; + Position: xyz; + Rotation: number; + Sides: string[]; +} +export interface ColliderParams { + _parent: string; + _props: Props; +} +export interface Props { + Center: xyz; + Radius: number; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Exit { + Chance: number; + Count: number; + EntryPoints: string; + ExfiltrationTime: number; + ExfiltrationType: string; + Id: string; + MaxTime: number; + MinTime: number; + Name: string; + PassageRequirement: string; + PlayersCount: number; + RequirementTip: string; +} +export interface MaxItemCountInLocation { + TemplateId: string; + Value: number; +} +export interface Wave { + BotPreset: string; + BotSide: string; + SpawnPoints: string; + WildSpawnType: string; + isPlayers: boolean; + number: number; + slots_max: number; + slots_min: number; + time_max: number; + time_min: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts new file mode 100644 index 0000000..7f8d915 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts @@ -0,0 +1,9 @@ +import { ILocations } from "../../spt/server/ILocations"; +export interface ILocationsGenerateAllResponse { + locations: ILocations; + paths: Path[]; +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILooseLoot.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILooseLoot.d.ts new file mode 100644 index 0000000..14b795e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/ILooseLoot.d.ts @@ -0,0 +1,45 @@ +export interface ILooseLoot { + spawnpointCount: SpawnpointCount; + spawnpointsForced: SpawnpointsForced[]; + spawnpoints: Spawnpoint[]; +} +export interface SpawnpointCount { + mean: number; + std: number; +} +export interface SpawnpointsForced { + locationId: string; + probability: number; + template: SpawnpointTemplate; +} +export interface SpawnpointTemplate { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: Item[]; +} +export interface Item { + _id: string; + _tpl?: string; +} +export interface Spawnpoint { + locationId: string; + probability: number; + template: SpawnpointTemplate; + itemDistribution: ItemDistribution[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IMetricsTableData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IMetricsTableData.d.ts new file mode 100644 index 0000000..873ef82 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IMetricsTableData.d.ts @@ -0,0 +1,7 @@ +export interface IMetricsTableData { + Keys: number[]; + NetProcessingBins: number[]; + RenderBins: number[]; + GameUpdateBins: number[]; + MemoryMeasureInterval: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IPmcData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IPmcData.d.ts new file mode 100644 index 0000000..adc2aa5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/IPmcData.d.ts @@ -0,0 +1,341 @@ +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +import { IPmcDataRepeatableQuest } from "./tables/IRepeatableQuests"; +import { Item, Upd } from "./tables/IItem"; +import { HideoutAreas } from "../../enums/HideoutAreas"; +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IPmcData { + _id: string; + aid: string; + savage: string; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: Record; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: InsuredItem[]; + Hideout: Hideout; + Bonuses: Bonus[]; + Notes: Notes; + Quests: Quest[]; + TradersInfo: Record; + RagfairInfo: RagfairInfo; + WishList: string[]; + RepeatableQuests: IPmcDataRepeatableQuest[]; + CarExtractCounts: CarExtractCounts; + SurvivorClass: SurvivorClass; +} +export declare enum SurvivorClass { + Unknown = 0, + Neutralizer = 1, + Marauder = 2, + Paramedic = 3, + Survivor = 4 +} +export interface Info { + EntryPoint: string; + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: MemberCategory; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + IsStreamerModeAvailable: boolean; + Bans: IBan[]; + BannedState: boolean; + BannedUntil: number; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface IBan { + type: BanType; + dateTime: number; +} +export declare enum BanType { + Chat = 0, + RagFair = 1, + Voip = 2, + Trading = 3, + Online = 4, + Friends = 5, + ChangeNickname = 6 +} +export interface Notes { + Notes: Note[]; +} +export interface Note { + Time: number; + Text: string; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { + Hydration: CurrentMax; + Energy: CurrentMax; + Temperature: CurrentMax; + BodyParts: BodyPartsHealth; + UpdateTime: number; +} +export interface BodyPartsHealth { + Head: BodyPartHealth; + Chest: BodyPartHealth; + Stomach: BodyPartHealth; + LeftArm: BodyPartHealth; + RightArm: BodyPartHealth; + LeftLeg: BodyPartHealth; + RightLeg: BodyPartHealth; +} +export interface BodyPartHealth { + Health: CurrentMax; + Effects?: Record; +} +export interface CurrentMax { + Current: number; + Maximum: number; +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: Common[]; + Mastering: Mastering[]; + Bonuses?: any[]; + Points: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession: number; + LastAccess: number; +} +export interface Mastering { + Id: string; + Progress: number; +} +export interface Stats { + CarriedQuestItems: string[]; + Victims: Victim[]; + TotalSessionExperience: number; + LastSessionDate: number; + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; + SessionExperienceMult?: number; + ExperienceBonusMult?: number; + Aggressor?: Aggressor; + DroppedItems?: IDroppedItem[]; + FoundInRaidItems?: FoundInRaidItem[]; + DamageHistory?: DamageHistory; + DeathCause?: DeathCause; + LastPlayerState?: LastPlayerState; + TotalInGameTime: number; + SurvivorClass?: string; +} +export interface IDroppedItem { + QuestId: string; + ItemId: string; + ZoneId: string; +} +export interface FoundInRaidItem { + QuestId: string; + ItemId: string; +} +export interface Victim { + AccountId: string; + ProfileId: string; + Name: string; + Side: string; + BodyPart: string; + Time: string; + Distance: number; + Level: number; + Weapon: string; + Role: string; +} +export interface SessionCounters { + Items: CounterKeyValue[]; +} +export interface OverallCounters { + Items: CounterKeyValue[]; +} +export interface CounterKeyValue { + Key: string[]; + Value: number; +} +export interface Aggressor { + AccountId: string; + ProfileId: string; + MainProfileNickname: string; + Name: string; + Side: string; + BodyPart: string; + HeadSegment: string; + WeaponName: string; + Category: string; +} +export interface DamageHistory { + LethalDamagePart: string; + LethalDamage: LethalDamage; + BodyParts: BodyPartsDamageHistory; +} +export interface LethalDamage { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface BodyPartsDamageHistory { + Head: DamageStats[]; + Chest: DamageStats[]; + Stomach: DamageStats[]; + LeftArm: DamageStats[]; + RightArm: DamageStats[]; + LeftLeg: DamageStats[]; + RightLeg: DamageStats[]; + Common: DamageStats[]; +} +export interface DamageStats { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface DeathCause { + DamageType: string; + Side: string; + Role: string; + WeaponId: string; +} +export interface LastPlayerState { + Info: LastPlayerStateInfo; + Customization: Record; + Equipment: any; +} +export interface LastPlayerStateInfo { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; +} +export interface ConditionCounters { + Counters: Counter[]; +} +export interface Counter { + id: string; + value: number; + qid: string; +} +export interface BackendCounter { + id: string; + qid?: string; + value: number; +} +export interface InsuredItem { + tid: string; + itemId: string; +} +export interface Hideout { + Production: Record; + Areas: HideoutArea[]; +} +export interface Productive { + Products: Product[]; + Progress?: number; + inProgress?: boolean; + StartTimestamp?: number; +} +export interface Product { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface ScavCase extends Productive { +} +export interface Production extends Productive { + RecipeId: string; + SkipTime: number; + ProductionTime: number; +} +export interface HideoutArea { + type: HideoutAreas; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: HideoutSlot[]; + lastRecipe: string; +} +export interface HideoutSlot { + item: HideoutItem[]; +} +export interface HideoutItem { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface Bonus { + type: string; + templateId?: string; + passive?: boolean; + production?: boolean; + visible?: boolean; + value?: number; + icon?: string; +} +export interface Quest { + qid: string; + startTime: number; + status: string; + statusTimers?: StatusTimer; + completedConditions?: string[]; +} +export interface StatusTimer { + AvailableForStart?: number; +} +export interface TraderInfo { + loyaltyLevel: number; + salesSum: number; + standing: number; + nextResupply: number; + unlocked: boolean; +} +export interface RagfairInfo { + rating: number; + isRatingGrowing: boolean; + offers: IRagfairOffer[]; +} +export interface CarExtractCounts { +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/MemberCategory.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts new file mode 100644 index 0000000..7303275 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts @@ -0,0 +1,9 @@ +export interface IBaseInteractionRequestData { + Action: string; + fromOwner?: OwnerInfo; + toOwner?: OwnerInfo; +} +export interface OwnerInfo { + id: string; + type: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotBase.d.ts new file mode 100644 index 0000000..677fd49 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotBase.d.ts @@ -0,0 +1,101 @@ +import { BackendCounter, Bonus } from "../IPmcData"; +import { Item } from "./IItem"; +export interface IBotBase { + _id: string; + aid: string; + savage: any; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: any; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: any[]; + Hideout: Hideout; + Bonuses: Bonus[]; +} +export interface Info { + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: number; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + NeedWipeOptions: any[]; + lastCompletedWipe: any; + BannedState: boolean; + BannedUntil: number; + IsStreamerModeAvailable: boolean; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: any[]; + Mastering: any[]; + Points: number; +} +export interface Stats { + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; +} +export interface SessionCounters { + Items: any[]; +} +export interface OverallCounters { + Items: any[]; +} +export interface ConditionCounters { + Counters: any[]; +} +export interface Hideout { + Production: Production; + Areas: Area[]; +} +export interface Production { +} +export interface Area { + type: number; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: any[]; + lastRecipe: any; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotCore.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotCore.d.ts new file mode 100644 index 0000000..16a782d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotCore.d.ts @@ -0,0 +1,133 @@ +export interface IBotCore { + SAVAGE_KILL_DIST: number; + SOUND_DOOR_BREACH_METERS: number; + SOUND_DOOR_OPEN_METERS: number; + STEP_NOISE_DELTA: number; + JUMP_NOISE_DELTA: number; + GUNSHOT_SPREAD: number; + GUNSHOT_SPREAD_SILENCE: number; + BASE_WALK_SPEREAD2: number; + MOVE_SPEED_COEF_MAX: number; + SPEED_SERV_SOUND_COEF_A: number; + SPEED_SERV_SOUND_COEF_B: number; + G: number; + STAY_COEF: number; + SIT_COEF: number; + LAY_COEF: number; + MAX_ITERATIONS: number; + START_DIST_TO_COV: number; + MAX_DIST_TO_COV: number; + STAY_HEIGHT: number; + CLOSE_POINTS: number; + COUNT_TURNS: number; + SIMPLE_POINT_LIFE_TIME_SEC: number; + DANGER_POINT_LIFE_TIME_SEC: number; + DANGER_POWER: number; + COVER_DIST_CLOSE: number; + GOOD_DIST_TO_POINT: number; + COVER_TOOFAR_FROM_BOSS: number; + COVER_TOOFAR_FROM_BOSS_SQRT: number; + MAX_Y_DIFF_TO_PROTECT: number; + FLARE_POWER: number; + MOVE_COEF: number; + PRONE_POSE: number; + LOWER_POSE: number; + MAX_POSE: number; + FLARE_TIME: number; + MAX_REQUESTS__PER_GROUP: number; + UPDATE_GOAL_TIMER_SEC: number; + DIST_NOT_TO_GROUP: number; + DIST_NOT_TO_GROUP_SQR: number; + LAST_SEEN_POS_LIFETIME: number; + DELTA_GRENADE_START_TIME: number; + DELTA_GRENADE_END_TIME: number; + DELTA_GRENADE_RUN_DIST: number; + DELTA_GRENADE_RUN_DIST_SQRT: number; + PATROL_MIN_LIGHT_DIST: number; + HOLD_MIN_LIGHT_DIST: number; + STANDART_BOT_PAUSE_DOOR: number; + ARMOR_CLASS_COEF: number; + SHOTGUN_POWER: number; + RIFLE_POWER: number; + PISTOL_POWER: number; + SMG_POWER: number; + SNIPE_POWER: number; + GESTUS_PERIOD_SEC: number; + GESTUS_AIMING_DELAY: number; + GESTUS_REQUEST_LIFETIME: number; + GESTUS_FIRST_STAGE_MAX_TIME: number; + GESTUS_SECOND_STAGE_MAX_TIME: number; + GESTUS_MAX_ANSWERS: number; + GESTUS_FUCK_TO_SHOOT: number; + GESTUS_DIST_ANSWERS: number; + GESTUS_DIST_ANSWERS_SQRT: number; + GESTUS_ANYWAY_CHANCE: number; + TALK_DELAY: number; + CAN_SHOOT_TO_HEAD: boolean; + CAN_TILT: boolean; + TILT_CHANCE: number; + MIN_BLOCK_DIST: number; + MIN_BLOCK_TIME: number; + COVER_SECONDS_AFTER_LOSE_VISION: number; + MIN_ARG_COEF: number; + MAX_ARG_COEF: number; + DEAD_AGR_DIST: number; + MAX_DANGER_CARE_DIST_SQRT: number; + MAX_DANGER_CARE_DIST: number; + MIN_MAX_PERSON_SEARCH: number; + PERCENT_PERSON_SEARCH: number; + LOOK_ANYSIDE_BY_WALL_SEC_OF_ENEMY: number; + CLOSE_TO_WALL_ROTATE_BY_WALL_SQRT: number; + SHOOT_TO_CHANGE_RND_PART_MIN: number; + SHOOT_TO_CHANGE_RND_PART_MAX: number; + SHOOT_TO_CHANGE_RND_PART_DELTA: number; + FORMUL_COEF_DELTA_DIST: number; + FORMUL_COEF_DELTA_SHOOT: number; + FORMUL_COEF_DELTA_FRIEND_COVER: number; + SUSPETION_POINT_DIST_CHECK: number; + MAX_BASE_REQUESTS_PER_PLAYER: number; + MAX_HOLD_REQUESTS_PER_PLAYER: number; + MAX_GO_TO_REQUESTS_PER_PLAYER: number; + MAX_COME_WITH_ME_REQUESTS_PER_PLAYER: number; + CORE_POINT_MAX_VALUE: number; + CORE_POINTS_MAX: number; + CORE_POINTS_MIN: number; + BORN_POISTS_FREE_ONLY_FAREST_BOT: boolean; + BORN_POINSTS_FREE_ONLY_FAREST_PLAYER: boolean; + SCAV_GROUPS_TOGETHER: boolean; + LAY_DOWN_ANG_SHOOT: number; + HOLD_REQUEST_TIME_SEC: number; + TRIGGERS_DOWN_TO_RUN_WHEN_MOVE: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING_OTHER_ENEMIS: number; + MIN_DIST_TO_STOP_RUN: number; + JUMP_SPREAD_DIST: number; + LOOK_TIMES_TO_KILL: number; + COME_INSIDE_TIMES: number; + TOTAL_TIME_KILL: number; + TOTAL_TIME_KILL_AFTER_WARN: number; + MOVING_AIM_COEF: number; + VERTICAL_DIST_TO_IGNORE_SOUND: number; + DEFENCE_LEVEL_SHIFT: number; + MIN_DIST_CLOSE_DEF: number; + USE_ID_PRIOR_WHO_GO: boolean; + SMOKE_GRENADE_RADIUS_COEF: number; + GRENADE_PRECISION: number; + MAX_WARNS_BEFORE_KILL: number; + CARE_ENEMY_ONLY_TIME: number; + MIDDLE_POINT_COEF: number; + MAIN_TACTIC_ONLY_ATTACK: boolean; + LAST_DAMAGE_ACTIVE: number; + SHALL_DIE_IF_NOT_INITED: boolean; + CHECK_BOT_INIT_TIME_SEC: number; + WEAPON_ROOT_Y_OFFSET: number; + DELTA_SUPRESS_DISTANCE_SQRT: number; + DELTA_SUPRESS_DISTANCE: number; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + WAVE_ONLY_AS_ONLINE: boolean; + LOCAL_BOTS_COUNT: number; + AXE_MAN_KILLS_END: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotType.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotType.d.ts new file mode 100644 index 0000000..01be0be --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IBotType.d.ts @@ -0,0 +1,176 @@ +export interface IBotType { + appearance: Appearance; + chances: Chances; + difficulty: Difficulties; + experience: Experience; + firstName: string[]; + generation: Generation; + health: Health; + inventory: Inventory; + lastName: string[]; + skills: Skills; +} +export interface Appearance { + body: string[]; + feet: string[]; + hands: string[]; + head: string[]; + voice: string[]; +} +export interface Chances { + equipment: EquipmentChances; + mods: ModsChances; +} +export interface EquipmentChances { + ArmBand: number; + ArmorVest: number; + Backpack: number; + Earpiece: number; + Eyewear: number; + FaceCover: number; + FirstPrimaryWeapon: number; + Headwear: number; + Holster: number; + Pockets: number; + Scabbard: number; + SecondPrimaryWeapon: number; + SecuredContainer: number; + TacticalVest: number; +} +export interface ModsChances { + mod_charge: number; + mod_equipment: number; + mod_equipment_000: number; + mod_equipment_001: number; + mod_equipment_002: number; + mod_flashlight: number; + mod_foregrip: number; + mod_launcher: number; + mod_magazine: number; + mod_mount: number; + mod_mount_000: number; + mod_mount_001: number; + mod_muzzle: number; + mod_nvg: number; + mod_pistol_grip: number; + mod_reciever: number; + mod_scope: number; + mod_sight_front: number; + mod_sight_rear: number; + mod_stock: number; + mod_stock_000: number; + mod_stock_akms: number; + mod_tactical: number; + mod_tactical_000: number; + mod_tactical_001: number; + mod_tactical_002: number; + mod_tactical_003: number; +} +export interface Difficulties { + easy: Difficulty; + normal: Difficulty; + hard: Difficulty; + impossible: Difficulty; +} +export interface Difficulty { + Aiming: Record; + Boss: Record; + Change: Record; + Core: Record; + Cover: Record; + Grenade: Record; + Hearing: Record; + Lay: Record; + Look: Record; + Mind: Record; + Move: Record; + Patrol: Record; + Scattering: Record; + Shoot: Record; +} +export interface Experience { + aggressorBonus: number; + level: MinMax; + reward: MinMax; + standingForKill: number; +} +export interface Generation { + items: ItemMinMax; +} +export interface ItemMinMax { + grenades: MinMax; + healing: MinMax; + drugs: MinMax; + stims: MinMax; + looseLoot: MinMax; + magazines: MinMax; + specialItems: MinMax; +} +export interface Health { + BodyParts: BodyPart[]; + Energy: MinMax; + Hydration: MinMax; + Temperature: MinMax; +} +export interface BodyPart { + Chest: MinMax; + Head: MinMax; + LeftArm: MinMax; + LeftLeg: MinMax; + RightArm: MinMax; + RightLeg: MinMax; + Stomach: MinMax; +} +export interface MinMax { + max: number; + min: number; +} +export interface Inventory { + equipment: Equipment; + items: Items; + mods: Mods; +} +export interface Equipment { + ArmBand: Record; + ArmorVest: Record; + Backpack: Record; + Earpiece: Record; + Eyewear: Record; + FaceCover: Record; + FirstPrimaryWeapon: Record; + Headwear: Record; + Holster: Record; + Pockets: Record; + Scabbard: Record; + SecondPrimaryWeapon: Record; + SecuredContainer: Record; + TacticalVest: Record; +} +export interface Items { + Backpack: string[]; + Pockets: string[]; + SecuredContainer: string[]; + SpecialLoot: string[]; + TacticalVest: string[]; +} +export declare type Mods = Record>; +export interface Skills { + Common: Common[]; + Bonuses?: any; + Mastering: Mastering[]; + Points: number; +} +export interface Mastering { + Id: string; + Progress: number; + max?: number; + min?: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession?: number; + LastAccess?: number; + max?: number; + min?: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts new file mode 100644 index 0000000..8bfeece --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts @@ -0,0 +1,33 @@ +export interface ICustomizationItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Side: string[]; + BodyPart: string; + AvailableAsDefault?: boolean; + Body: string; + Hands: string; + Feet: string; + Prefab: Prefab; + WatchPrefab: Prefab; + IntegratedArmorVest: boolean; + WatchPosition: Xyz; + WatchRotation: Xyz; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Xyz { + x: number; + y: number; + z: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts new file mode 100644 index 0000000..7d7db07 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts @@ -0,0 +1,16 @@ +export interface IHandbookBase { + Categories: Category[]; + Items: HandbookItem[]; +} +export interface Category { + Id: string; + ParentId?: string; + Icon: string; + Color: string; + Order: string; +} +export interface HandbookItem { + Id: string; + ParentId: string; + Price: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IItem.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IItem.d.ts new file mode 100644 index 0000000..2dd2c03 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IItem.d.ts @@ -0,0 +1,108 @@ +export interface Item { + _id: string; + _tpl: string; + parentId?: string; + slotId?: string; + location?: Location | number; + upd?: Upd; +} +export interface Upd { + OriginalStackObjectsCount?: number; + Togglable?: Togglable; + Map?: Map; + Tag?: Tag; + sptPresetId?: string; + FaceShield?: FaceShield; + StackObjectsCount?: number; + UnlimitedCount?: boolean; + Repairable?: Repairable; + FireMode?: FireMode; + SpawnedInSession?: boolean; + Light?: Light; + Key?: Key; + Resource?: Resource; + Sight?: Sight; + MedKit?: MedKit; + FoodDrink?: FoodDrink; + Dogtag?: Dogtag; + BuyRestrictionMax?: number; + BuyRestrictionCurrent?: number; + Foldable?: Foldable; + SideEffect?: SideEffect; + RepairKit?: RepairKit; +} +export interface Togglable { + On: boolean; +} +export interface Map { + Markers: MapMarker[]; +} +export interface MapMarker { + X: number; + Y: number; +} +export interface Tag { + Color: number; + Name: string; +} +export interface FaceShield { + Hits: number; +} +export interface Repairable { + Durability: number; + MaxDurability: number; +} +export interface MedKit { + HpResource: number; +} +export interface Sight { + ScopesCurrentCalibPointIndexes: number[]; + ScopesSelectedModes: number[]; + SelectedScope: number; +} +export interface Foldable { + Folded: boolean; +} +export interface FireMode { + FireMode: string; +} +export interface FoodDrink { + HpPercent: number; +} +export interface Key { + NumberOfUsages: number; +} +export interface Resource { + Value: number; + UnitsConsumed: number; +} +export interface Light { + IsActive: boolean; + SelectedMode: number; +} +export interface Dogtag { + AccountId: string; + ProfileId: string; + Nickname: string; + Side: string; + Level: number; + Time: string; + Status: string; + KillerAccountId: string; + KillerProfileId: string; + KillerName: string; + WeaponName: string; +} +export interface Location { + x: number; + y: number; + r: string | number; + isSearched?: boolean; + rotation?: string; +} +export interface SideEffect { + Value: number; +} +export interface RepairKit { + Resource: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts new file mode 100644 index 0000000..2c96af3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts @@ -0,0 +1,10 @@ +export interface ILocationsBase { + locations: Locations; + paths: Path[]; +} +export interface Locations { +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ILootBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ILootBase.d.ts new file mode 100644 index 0000000..e4baac5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ILootBase.d.ts @@ -0,0 +1,64 @@ +import { Item } from "./IItem"; +export interface ILootBase { + staticAmmo: Record; + staticContainers: Record; + staticLoot: Record; +} +export interface IStaticAmmoDetails { + tpl: string; + relativeProbability: number; +} +export interface IStaticContainerDetails { + staticWeapons: IStaticWeaponProps[]; + staticContainers: IStaticContainerProps[]; + staticForced: IStaticForcedProps[]; +} +export interface IStaticWeaponProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: string; + Items: Item[]; +} +export interface IStaticContainerProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: StaticItem[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StaticItem { + _id: any; + _tpl: string; +} +export interface IStaticForcedProps { + containerId: string; + itemTpl: string; +} +export interface IStaticLootDetails { + itemcountDistribution: ItemCountDistribution[]; + itemDistribution: ItemDistribution[]; +} +export interface ItemCountDistribution { + count: number; + relativeProbability: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IQuest.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IQuest.d.ts new file mode 100644 index 0000000..e1fc888 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IQuest.d.ts @@ -0,0 +1,110 @@ +import { Item } from "./IItem"; +export interface IQuest { + QuestName: string; + _id: string; + canShowNotificationsInGame: boolean; + conditions: Conditions; + description: string; + failMessageText: string; + name: string; + note: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + startedMessageText: string; + successMessageText: string; + templateId: string; + rewards: Rewards; + status: string; + KeyQuest: boolean; + changeQuestMessageText: string; +} +export interface Conditions { + Started: AvailableForConditions[]; + AvailableForFinish: AvailableForConditions[]; + AvailableForStart: AvailableForConditions[]; + Success: AvailableForConditions[]; + Fail: AvailableForConditions[]; +} +export interface AvailableForConditions { + _parent: string; + _props: AvailableForProps; + dynamicLocale: boolean; +} +export interface AvailableForProps { + id: string; + index: number; + parentId: string; + dynamicLocale: boolean; + value?: number; + compareMethod?: string; + visibilityConditions?: VisibilityCondition[]; + target?: string | string[]; + status?: number[]; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; +} +export interface AvailableForCounter { + id: string; + conditions: CounterCondition[]; +} +export interface CounterCondition { + _parent: string; + _props: CounterProps; +} +export interface CounterProps { + id: string; + target: string[] | string; + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; +} +export interface DaytimeCounter { + from: number; + to: number; +} +export interface VisibilityCondition { + id: string; + value: number; + dynamicLocale: boolean; + oneSessionOnly: boolean; +} +export interface Rewards { + AvailableForStart: Reward[]; + AvailableForFinish: Reward[]; + Started: Reward[]; + Success: Reward[]; + Fail: Reward[]; + FailRestartable: Reward[]; + Expired: Reward[]; +} +export interface Reward { + value?: string; + id: string; + type: string; + index: number; + target?: string; + items?: Item[]; + loyaltyLevel?: number; + traderId?: string; + unknown?: boolean; + findInRaid?: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts new file mode 100644 index 0000000..e23ec73 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts @@ -0,0 +1,219 @@ +import { Item } from "./IItem"; +export interface IReward { + index: number; + type: string; + value: number; + target?: string; + items?: Item[]; +} +export interface IRepeatableQuestDatabase { + templates: ITemplates; + rewards: IRewardOptions; + data: IOptions; + samples: ISampleQuests[]; +} +export interface ITemplates { + Elimination: IRepeatableQuest; + Completion: IRepeatableQuest; + Exploration: IRepeatableQuest; +} +export interface IPmcDataRepeatableQuest { + id?: string; + name: string; + activeQuests: IRepeatableQuest[]; + inactiveQuests: IRepeatableQuest[]; + endTime: number; + changeRequirement: TChangeRequirementRecord; +} +export declare type TChangeRequirementRecord = Record; +export interface IChangeRequirement { + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IChangeCost { + templateId: string; + count: number; +} +export interface IRepeatableQuest { + _id: any; + traderId: string; + location: any; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + changeQuestMessageText: string; + templateId: string; + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IRewards { + Started: IReward[]; + Success: IReward[]; + Fail: IReward[]; +} +export interface IConditions { + AvailableForStart: any[]; + AvailableForFinish: IAvailableFor[]; + Fail: any[]; +} +export interface IAvailableFor { + _props: IAvailableForProps; + _parent: string; + dynamicLocale: boolean; +} +export interface IAvailableForProps { + id: string; + parentId: string; + dynamicLocale: boolean; + index: number; + visibilityConditions: IVisibilityCondition[]; + value: number; +} +export interface IVisibilityCondition { + id: string; + oneSessionOnly: boolean; + value: number; + index: number; + dynamicLocale: boolean; +} +export interface IAvailableForPropsCounter extends IAvailableForProps { + type: string; + oneSessionOnly: boolean; + doNotResetIfCounterCompleted: boolean; + counter: ICounter; +} +export interface ICounter { + id: string; + conditions: ICondition[]; +} +export interface ICondition { + _props: IConditionProps; + _parent: string; +} +export interface IConditionProps { + id: string; + dynamicLocale: boolean; +} +export interface IElimination extends IRepeatableQuest { + conditions: IEliminationConditions; +} +export interface IEliminationConditions extends IConditions { + AvailableForFinish: IEliminationAvailableFor[]; +} +export interface IEliminationAvailableFor extends IAvailableFor { + _props: IEliminationAvailableForProps; +} +export interface IEliminationAvailableForProps extends IAvailableForPropsCounter { + counter: IEliminationCounter; +} +export interface IEliminationCounter extends ICounter { + conditions: IEliminationCondition[]; +} +export interface IEliminationCondition extends ICondition { + _props: ILocationConditionProps | IKillConditionProps; +} +export interface IExploration extends IRepeatableQuest { + conditions: IExplorationConditions; +} +export interface IExplorationConditions extends IConditions { + AvailableForFinish: IExplorationAvailableFor[]; +} +export interface IExplorationAvailableFor extends IAvailableFor { + _props: IExplorationAvailableForProps; +} +export interface IExplorationAvailableForProps extends IAvailableForPropsCounter { + counter: IExplorationCounter; +} +export interface IExplorationCounter extends ICounter { + conditions: IExplorationCondition[]; +} +export interface IExplorationCondition extends ICondition { + _props: ILocationConditionProps | IExitStatusConditionProps | IExitNameConditionProps; +} +export interface ICompletion extends IRepeatableQuest { + conditions: ICompletionConditions; +} +export interface ICompletionConditions extends IConditions { + AvailableForFinish: ICompletionAvailableFor[]; +} +export interface ICompletionAvailableFor extends IAvailableFor { + _props: ICompletionAvailableForProps; +} +export interface ICompletionAvailableForProps extends IAvailableForProps { + target: string[]; + minDurability: number; + maxDurability: number; + dogtagLevel: number; + onlyFoundInRaid: boolean; +} +export interface ILocationConditionProps extends IConditionProps { + target: string[]; +} +export interface IKillConditionProps extends IConditionProps { + target: string; + value: number; + savageRole?: string[]; + bodyPart?: string[]; + distance?: IDistanceCheck; +} +export interface IDistanceCheck { + compareMethod: string; + value: number; +} +export interface IExitStatusConditionProps extends IConditionProps { + status: string[]; +} +export interface IExitNameConditionProps extends IConditionProps { + exitName: string; +} +export interface IRewardOptions { + itemsBlacklist: string[]; +} +export interface IOptions { + Completion: ICompletionFilter; +} +export interface ICompletionFilter { + itemsBlacklist: ItemsBlacklist[]; + itemsWhitelist: ItemsWhitelist[]; +} +export interface ItemsBlacklist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ItemsWhitelist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ISampleQuests { + _id: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + templateId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts new file mode 100644 index 0000000..c2ba762 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts @@ -0,0 +1,401 @@ +export interface ITemplateItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Weight: number; + BackgroundColor: string; + Width: number; + Height: number; + StackMaxSize: number; + Rarity?: string; + SpawnChance?: number; + CreditsPrice?: number; + ItemSound: string; + Prefab: Prefab; + UsePrefab: Prefab; + StackObjectsCount: number; + NotShownInSlot: boolean; + ExaminedByDefault: boolean; + ExamineTime: number; + IsUndiscardable: boolean; + IsUnsaleable: boolean; + IsUnbuyable: boolean; + IsUngivable: boolean; + IsLockedafterEquip: boolean; + QuestItem: boolean; + LootExperience: number; + ExamineExperience: number; + HideEntrails: boolean; + RepairCost: number; + RepairSpeed: number; + ExtraSizeLeft: number; + ExtraSizeRight: number; + ExtraSizeUp: number; + ExtraSizeDown: number; + ExtraSizeForceAdd: boolean; + MergesWithChildren: boolean; + CanSellOnRagfair: boolean; + CanRequireOnRagfair: boolean; + ConflictingItems: string[]; + DiscardLimit: number; + Unlootable: boolean; + UnlootableFromSlot: string; + UnlootableFromSide: string[]; + AnimationVariantsNumber: number; + DiscardingBlock: boolean; + RagFairCommissionModifier: number; + IsAlwaysAvailableForInsurance: boolean; + Grids: Grid[]; + Slots: Slot[]; + CanPutIntoDuringTheRaid: boolean; + CantRemoveFromSlotsDuringRaid: string[]; + weapClass: string; + weapUseType: string; + ammoCaliber: string; + Durability: number; + MaxDurability: number; + OperatingResource: number; + RepairComplexity: number; + durabSpawnMin: number; + durabSpawnMax: number; + isFastReload: boolean; + RecoilForceUp: number; + RecoilForceBack: number; + Convergence: number; + RecoilAngle: number; + weapFireType: string[]; + RecolDispersion: number; + SingleFireRate: number; + CanQueueSecondShot: boolean; + bFirerate: number; + Ergonomics: number; + Velocity: number; + bEffDist: number; + bHearDist: number; + isChamberLoad: boolean; + chamberAmmoCount: number; + isBoltCatch: boolean; + defMagType: string; + defAmmo: string; + AdjustCollimatorsToTrajectory: boolean; + shotgunDispersion: number; + Chambers: Chamber[]; + CameraRecoil: number; + CameraSnap: number; + ReloadMode: string; + CenterOfImpact: number; + AimPlane: number; + DeviationCurve: number; + DeviationMax: number; + Foldable: boolean; + Retractable: boolean; + TacticalReloadStiffnes: Xyz; + TacticalReloadFixation: number; + RecoilCenter: Xyz; + RotationCenter: Xyz; + RotationCenterNoStock: Xyz; + SizeReduceRight: number; + FoldedSlot: string; + CompactHandling: boolean; + SightingRange: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; + IronSightRange: number; + MustBoltBeOpennedForExternalReload: boolean; + MustBoltBeOpennedForInternalReload: boolean; + BoltAction: boolean; + HipAccuracyRestorationDelay: number; + HipAccuracyRestorationSpeed: number; + HipInnaccuracyGain: number; + ManualBoltCatch: boolean; + BurstShotsCount: number; + BaseMalfunctionChance: number; + AllowJam: boolean; + AllowFeed: boolean; + AllowMisfire: boolean; + AllowSlide: boolean; + DurabilityBurnRatio: number; + HeatFactorGun: number; + CoolFactorGun: number; + CoolFactorGunMods: number; + HeatFactorByShot: number; + AllowOverheat: boolean; + DoubleActionAccuracyPenalty: number; + RecoilPosZMult: number; + ShotgunDispersion: number; + StackMinRandom: number; + StackMaxRandom: number; + StackSlots: StackSlot[]; + SearchSound: string; + BlocksArmorVest: boolean; + RigLayoutName: string; + armorZone: string[]; + armorClass: number; + speedPenaltyPercent: number; + mousePenalty: number; + weaponErgonomicPenalty: number; + BluntThroughput: number; + ArmorMaterial: string; + medUseTime: number; + medEffectType: string; + MaxHpResource: number; + hpResourceRate: number; + StimulatorBuffs: string; + effects_health: EffectsHealth; + effects_damage: EffectsDamage; + knifeHitDelay: number; + knifeHitSlashRate: number; + knifeHitStabRate: number; + knifeHitRadius: number; + knifeHitSlashDam: number; + knifeHitStabDam: number; + knifeDurab: number; + PrimaryDistance: number; + SecondryDistance: number; + SlashPenetration: number; + StabPenetration: number; + PrimaryConsumption: number; + SecondryConsumption: number; + DeflectionConsumption: number; + MaxResource: number; + AppliedTrunkRotation: Xyz; + AppliedHeadRotation: Xyz; + DisplayOnModel: boolean; + AdditionalAnimationLayer: number; + StaminaBurnRate: number; + ColliderScaleMultiplier: Xyz; + ammoType: string; + InitialSpeed: number; + BallisticCoeficient: number; + BulletMassGram: number; + BulletDiameterMilimeters: number; + Damage: number; + ammoAccr: number; + ammoRec: number; + ammoDist: number; + buckshotBullets: number; + PenetrationPower: number; + PenetrationPowerDiviation: number; + ammoHear: number; + ammoSfx: string; + MisfireChance: number; + MinFragmentsCount: number; + MaxFragmentsCount: number; + ammoShiftChance: number; + casingName: string; + casingEjectPower: number; + casingMass: number; + casingSounds: string; + ProjectileCount: number; + PenetrationChance: number; + RicochetChance: number; + FragmentationChance: number; + Deterioration: number; + SpeedRetardation: number; + Tracer: boolean; + TracerColor: string; + TracerDistance: number; + ArmorDamage: number; + Caliber: string; + StaminaBurnPerDamage: number; + HeavyBleedingDelta: number; + LightBleedingDelta: number; + ShowBullet: boolean; + HasGrenaderComponent: boolean; + FuzeArmTimeSec: number; + ExplosionStrength: number; + MinExplosionDistance: number; + MaxExplosionDistance: number; + FragmentsCount: number; + FragmentType: string; + ShowHitEffectOnExplode: boolean; + ExplosionType: string; + AmmoLifeTimeSec: number; + Contusion: Contusion; + ArmorDistanceDistanceDamage: Xyz; + Blindness: Xyz; + IsLightAndSoundShot: boolean; + LightAndSoundShotAngle: number; + LightAndSoundShotSelfContusionTime: number; + LightAndSoundShotSelfContusionStrength: number; + MalfMisfireChance: number; + DurabilityBurnModificator: number; + HeatFactor: number; + MalfFeedChance: number; + Accuracy: number; + Recoil: number; + Loudness: number; + EffectiveDistance: number; + RaidModdable: boolean; + ToolModdable: boolean; + BlocksFolding: boolean; + BlocksCollapsible: boolean; + IsAnimated: boolean; + HasShoulderContact: boolean; + DoubleActionAccuracyPenaltyMult: number; + magAnimationIndex: number; + Cartridges: Cartridge[]; + CanFast: boolean; + CanHit: boolean; + CanAdmin: boolean; + LoadUnloadModifier: number; + CheckTimeModifier: number; + CheckOverride: number; + ReloadMagType: string; + VisibleAmmoRangesString: string; + MalfunctionChance: number; + TagColor: number; + TagName: string; + MaximumNumberOfUsage: number; + CustomAimPlane: string; + sightModType: string; + aimingSensitivity: number; + SightModesCount: number; + OpticCalibrationDistances: number[]; + ScopesCount: number; + AimSensitivity: number[][]; + ModesCount: number[]; + Zooms: number[][]; + CalibrationDistances: number[][]; + Intensity: number; + Mask: string; + MaskSize: number; + NoiseIntensity: number; + NoiseScale: number; + Color: Color; + DiffuseIntensity: number; + HasHinge: boolean; + Resource?: number; + CoolFactor?: number; + foodUseTime?: number; + foodEffectType?: string; + MaxRepairResource: number; + RepairQuality: number; + RepairType: string; + TargetItemFilter: string[]; + apResource: number; + krResource: number; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Grid { + _name: string; + _id: string; + _parent: string; + _props: GridProps; + _proto: string; +} +export interface GridProps { + filters: GridFilter[]; + cellsH: number; + cellsV: number; + minCount: number; + maxCount: number; + maxWeight: number; + isSortingTable: boolean; +} +export interface GridFilter { + Filter: string[]; + ExcludedFilter: string[]; +} +export interface Slot { + _name: string; + _id: string; + _parent: string; + _props: SlotProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface SlotProps { + filters: Filter[]; +} +export interface Chamber { + _name: string; + _id: string; + _parent: string; + _props: ChamberProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface ChamberProps { + filters: FilterProps[]; +} +export interface FilterProps { + Filter: string[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StackSlot { + _name?: string; + _id: string; + _sptTpl: string; + parent: string; + location: any; + slotId: string; + _max_count: number; + _props?: StackSlotProps; + _proto?: string; + upd: any; +} +export interface StackSlotProps { + filters: Filter[]; +} +export interface EffectsHealth { + Hydration: Hydration; +} +export interface Hydration { + value: number; +} +export interface EffectsDamage { + Pain: Pain; + Contusion: Contusion; +} +export interface Pain { + delay: number; + duration: number; + fadeOut: number; +} +export interface Contusion { + delay: number; + duration: number; + fadeOut: number; +} +export interface Cartridge { + _name: string; + _id: string; + _parent: string; + _max_count: number; + _props: CartridgeProps; + _proto: string; +} +export interface CartridgeProps { + filters: Filter[]; +} +export interface Filter { + Shift?: number; + Filter: string[]; + AnimationIndex?: number; +} +export interface Color { + r: number; + g: number; + b: number; + a: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ITrader.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ITrader.d.ts new file mode 100644 index 0000000..f0fe2b5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/common/tables/ITrader.d.ts @@ -0,0 +1,90 @@ +import { Item } from "./IItem"; +export interface ITrader { + assort: ITraderAssort; + base: ITraderBase; + dialogue?: Record; + questassort: Record>; + suits?: ISuit[]; +} +export interface ITraderBase { + refreshAssort: boolean; + _id: string; + avatar: string; + balance_dol: number; + balance_eur: number; + balance_rub: number; + buyer_up: boolean; + currency: string; + customization_seller: boolean; + discount: number; + discount_end: number; + gridHeight: number; + insurance: Insurance; + location: string; + loyaltyLevels: LoyaltyLevel[]; + medic: boolean; + name: string; + nextResupply: number; + nickname: string; + repair: Repair; + sell_category: string[]; + surname: string; + unlockedByDefault: boolean; +} +export interface Insurance { + availability: boolean; + excluded_category: string[]; + max_return_hour: number; + max_storage_time: number; + min_payment: number; + min_return_hour: number; +} +export interface LoyaltyLevel { + buy_price_coef: number; + exchange_price_coef: number; + heal_price_coef: number; + insurance_price_coef: number; + minLevel: number; + minSalesSum: number; + minStanding: number; + repair_price_coef: number; +} +export interface Repair { + availability: boolean; + currency: string; + currency_coefficient: number; + excluded_category: string[]; + excluded_id_list: any[]; + quality: string; +} +export interface ITraderAssort { + nextResupply?: number; + items: Item[]; + barter_scheme: Record; + loyal_level_items: Record; +} +export interface IBarterScheme { + count: number; + _tpl: string; + onlyFunctional?: boolean; +} +export interface ISuit { + _id: string; + tid: string; + suiteId: string; + isActive: boolean; + requirements: Requirements; +} +export interface Requirements { + loyaltyLevel: number; + profileLevel: number; + standing: number; + skillRequirements: string[]; + questRequirements: string[]; + itemRequirements: ItemRequirement[]; +} +export interface ItemRequirement { + count: number; + _tpl: string; + onlyFunctional: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts new file mode 100644 index 0000000..d19b70d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IBuyClothingRequestData { + Action: "CustomizationBuy"; + offer: string; + items: ClothingItem[]; +} +export interface ClothingItem { + del: boolean; + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts new file mode 100644 index 0000000..122d9cf --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IWearClothingRequestData { + Action: "CustomizationWear"; + suites: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts new file mode 100644 index 0000000..9c326ac --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IFriendRequestData { + to: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts new file mode 100644 index 0000000..53d8289 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetAllAttachmentsRequestData { + dialogId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts new file mode 100644 index 0000000..076d414 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts @@ -0,0 +1,6 @@ +import { Message } from "../profile/IAkiProfile"; +export interface IGetAllAttachmentsResponse { + messages: Message[]; + profiles: any[]; + hasMessagesWithRewards: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts new file mode 100644 index 0000000..8f1beac --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetChatServerListRequestData { + VersionId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts new file mode 100644 index 0000000..1d0c0e8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts @@ -0,0 +1,16 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IGetFriendListDataResponse { + Friends: Friend[]; + Ignore: any[]; + InIgnoreList: any[]; +} +export interface Friend { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; + MemberCategory: MemberCategory; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts new file mode 100644 index 0000000..eed84b1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMailDialogInfoRequestData { + dialogId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts new file mode 100644 index 0000000..f8fbf5d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMailDialogListRequestData { + limit: number; + offset: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts new file mode 100644 index 0000000..43d416e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface IGetMailDialogViewRequestData { + type: MessageType; + dialogId: string; + limit: number; + time: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts new file mode 100644 index 0000000..4f8b946 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../common/IPmcData"; +import { Message } from "../profile/IAkiProfile"; +export interface IGetMailDialogViewResponseData { + messages: Message[]; + profiles: IPmcData[]; + hasMessagesWithRewards: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts new file mode 100644 index 0000000..57b8a00 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IPinDialogRequestData { + dialogId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts new file mode 100644 index 0000000..874b828 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IRemoveDialogRequestData { + dialogId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts new file mode 100644 index 0000000..dd79deb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface ISendMessageRequest { + dialogId: string; + type: MessageType; + text: string; + replyTo: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts new file mode 100644 index 0000000..2076232 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISetDialogReadRequestData { + dialogs: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IGameConfigResponse.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IGameConfigResponse.d.ts new file mode 100644 index 0000000..eb37a39 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IGameConfigResponse.d.ts @@ -0,0 +1,19 @@ +export interface IGameConfigResponse { + aid: string; + lang: string; + languages: Record; + ndaFree: boolean; + taxonomy: number; + activeProfileId: string; + backend: Backend; + utc_time: number; + totalInGame: number; + reportAvailable: boolean; + twitchEventMember: boolean; +} +export interface Backend { + Trading: string; + Messaging: string; + Main: string; + RagFair: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts new file mode 100644 index 0000000..a3ecad9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGameEmptyCrcRequestData { + crc: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts new file mode 100644 index 0000000..0aa0fed --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts @@ -0,0 +1,11 @@ +export interface IVersionValidateRequestData { + version: Version; + develop: boolean; +} +export interface Version { + major: string; + minor: string; + game: string; + backend: string; + taxonomy: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts new file mode 100644 index 0000000..7fb80a8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts @@ -0,0 +1,29 @@ +export interface IHealthTreatmentRequestData { + Action: "RestoreHealth"; + trader: string; + items: Item[]; + difference: Difference; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} +export interface Difference { + BodyParts: BodyParts; + Energy: number; + Hydration: number; +} +export interface BodyParts { + Head: BodyPart; + Chest: BodyPart; + Stomach: BodyPart; + LeftArm: BodyPart; + RightArm: BodyPart; + LeftLeg: BodyPart; + RightLeg: BodyPart; +} +export interface BodyPart { + Health: number; + Effects: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts new file mode 100644 index 0000000..8e2b6c3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts @@ -0,0 +1,7 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidEatRequestData extends IBaseInteractionRequestData { + Action: "Eat"; + item: string; + count: number; + time: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts new file mode 100644 index 0000000..c242300 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts @@ -0,0 +1,18 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidHealRequestData extends IBaseInteractionRequestData { + Action: "Heal"; + item: string; + part: BodyPart; + count: number; + time: number; +} +export declare enum BodyPart { + Head = 0, + Chest = 1, + Stomach = 2, + LeftArm = 3, + RightArm = 4, + LeftLeg = 5, + RightLeg = 6, + Common = 7 +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts new file mode 100644 index 0000000..20e32f6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts @@ -0,0 +1,21 @@ +export interface ISyncHealthRequestData { + Health: Health; + IsAlive: boolean; + Hydration?: number; + Energy?: number; + Temperature?: number; +} +export interface Health { + Head?: BodyPartHealth; + Chest?: BodyPartHealth; + Stomach?: BodyPartHealth; + LeftArm?: BodyPartHealth; + RightArm?: BodyPartHealth; + LeftLeg?: BodyPartHealth; + RightLeg?: BodyPartHealth; +} +export interface BodyPartHealth { + Maximum: number; + Current: number; + Effects: Record; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts new file mode 100644 index 0000000..10f851b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreasEnum { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..8583e8d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface HideoutUpgradeCompleteRequestData { + Action: string; + areaType: number; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutArea.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutArea.d.ts new file mode 100644 index 0000000..d9fd2bf --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutArea.d.ts @@ -0,0 +1,40 @@ +export interface IHideoutArea { + _id: string; + type: number; + enabled: boolean; + needsFuel: boolean; + takeFromSlotLocked: boolean; + craftGivesExp: boolean; + stages: Record; +} +export interface Stage { + requirements: Requirement[]; + bonuses: StageBonus[]; + slots: number; + constructionTime: number; + description: string; +} +export interface Requirement { + areaType?: number; + requiredLevel?: number; + type: string; + templateId?: string; + count?: number; + isFunctional?: boolean; + traderId?: string; + loyaltyLevel?: number; + skillName?: string; + skillLevel?: number; +} +export interface StageBonus { + value: number; + passive: boolean; + production: boolean; + visible: boolean; + skillType?: string; + type: string; + filter?: string[]; + icon?: string; + id?: string; + templateId?: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts new file mode 100644 index 0000000..dba83eb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutContinousProductionStartRequestData { + Action: "HideoutContinuousProductionStart"; + recipeId: string; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts new file mode 100644 index 0000000..ce878be --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts @@ -0,0 +1,20 @@ +export interface IHideoutProduction { + _id: string; + areaType: number; + requirements: Requirement[]; + productionTime: number; + boosters: any; + endProduct: string; + continuous: boolean; + count: number; + productionLimitCount: number; +} +export interface Requirement { + templateId?: string; + count?: number; + isFunctional?: boolean; + type: string; + areaType?: number; + requiredLevel?: number; + resource?: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts new file mode 100644 index 0000000..8326c55 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutPutItemInRequestData { + Action: "HideoutPutItemsInAreaSlots"; + areaType: number; + items: Record; + timestamp: number; +} +export interface ItemDetails { + count: number; + id: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts new file mode 100644 index 0000000..25abcf3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts @@ -0,0 +1,21 @@ +export interface IHideoutScavCase { + _id: string; + ProductionTime: number; + Requirements: Requirement[]; + EndProducts: EndProducts; +} +export interface Requirement { + templateId: string; + count: number; + isFunctional: boolean; + type: string; +} +export interface EndProducts { + Common: MinMax; + Rare: MinMax; + Superrare: MinMax; +} +export interface MinMax { + min: string; + max: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts new file mode 100644 index 0000000..72fda86 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts @@ -0,0 +1,15 @@ +export interface IHideoutScavCaseStartRequestData { + Action: "HideoutScavCaseProductionStart"; + recipeId: string; + items: HideoutItem[]; + tools: Tool[]; + timestamp: number; +} +export interface HideoutItem { + id: string; + count: number; +} +export interface Tool { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts new file mode 100644 index 0000000..8e45939 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutSettingsBase { + generatorSpeedWithoutFuel: number; + generatorFuelFlowRate: number; + airFilterUnitFlowRate: number; + gpuBoostRate: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts new file mode 100644 index 0000000..1ed542a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutSingleProductionStartRequestData { + Action: "HideoutSingleProductionStart"; + recipeId: string; + items: Item[]; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts new file mode 100644 index 0000000..83a740a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutTakeItemOutRequestData { + Action: "HideoutTakeItemsFromAreaSlots"; + areaType: number; + slots: number[]; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts new file mode 100644 index 0000000..a6847ef --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutTakeProductionRequestData { + Action: "HideoutTakeProduction"; + recipeId: string; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts new file mode 100644 index 0000000..cdea513 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutToggleAreaRequestData { + Action: "HideoutToggleArea"; + areaType: number; + enabled: boolean; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..545311e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutUpgradeCompleteRequestData { + Action: "HideoutUpgradeComplete"; + areaType: number; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts new file mode 100644 index 0000000..dfbfdca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutUpgradeRequestData { + Action: "HideoutUpgrade"; + areaType: number; + items: HideoutItem[]; + timestamp: number; +} +export interface HideoutItem { + count: number; + id: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts new file mode 100644 index 0000000..b5dc5c1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts @@ -0,0 +1,5 @@ +export interface IGetBodyResponseData { + err: number; + errmsg: any; + (data: Type): Type; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts new file mode 100644 index 0000000..a3ae838 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts @@ -0,0 +1,5 @@ +export interface INullResponseData { + err: number; + errmsg: any; + data: null; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts new file mode 100644 index 0000000..e2d9cf1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IRegisterPlayerRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts new file mode 100644 index 0000000..6930261 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../common/IPmcData"; +import { ISyncHealthRequestData } from "../health/ISyncHealthRequestData"; +export interface ISaveProgressRequestData { + exit: string; + profile: IPmcData; + isPlayerScav: boolean; + health: ISyncHealthRequestData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts new file mode 100644 index 0000000..0e32e96 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetInsuranceCostRequestData { + traders: string[]; + items: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts new file mode 100644 index 0000000..f657bb7 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts @@ -0,0 +1,6 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInsureRequestData extends IBaseInteractionRequestData { + Action: "Insure"; + tid: string; + items: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts new file mode 100644 index 0000000..53db97a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IAddItemRequestData { + tid: string; + items: any[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts new file mode 100644 index 0000000..462e0de --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts @@ -0,0 +1,6 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryAddRequestData extends IInventoryBaseActionRequestData { + Action: "Add"; + item: string; + container: Container; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts new file mode 100644 index 0000000..b45e459 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts @@ -0,0 +1,27 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInventoryBaseActionRequestData extends IBaseInteractionRequestData { +} +export interface To { + id: string; + container: string; + location?: ToLocation | number; +} +export interface ToLocation { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} +export interface Container { + id: string; + container: string; + location: Location | number; +} +export interface Location { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts new file mode 100644 index 0000000..ff35066 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryBindRequestData extends IInventoryBaseActionRequestData { + Action: "Bind"; + item: string; + index: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts new file mode 100644 index 0000000..1e1ecef --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts @@ -0,0 +1,12 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryCreateMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "CreateMapMarker"; + item: string; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts new file mode 100644 index 0000000..0657e1b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryDeleteMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "DeleteMapMarker"; + item: string; + X: number; + Y: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts new file mode 100644 index 0000000..e2857e1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts @@ -0,0 +1,14 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryEditMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "EditMapMarker"; + item: string; + X: number; + Y: number; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts new file mode 100644 index 0000000..614711f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts @@ -0,0 +1,10 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryExamineRequestData extends IInventoryBaseActionRequestData { + Action: "Examine"; + item: string; + fromOwner: IFromOwner; +} +export interface IFromOwner { + id: string; + type: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts new file mode 100644 index 0000000..a5fb2a1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryFoldRequestData extends IInventoryBaseActionRequestData { + Action: "Fold"; + item: string; + value: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts new file mode 100644 index 0000000..3fcfa35 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMergeRequestData extends IInventoryBaseActionRequestData { + Action: "Merge"; + item: string; + with: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts new file mode 100644 index 0000000..b767908 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMoveRequestData extends IInventoryBaseActionRequestData { + Action: "Move"; + item: string; + to: To; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts new file mode 100644 index 0000000..5487b20 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryReadEncyclopediaRequestData extends IInventoryBaseActionRequestData { + Action: "ReadEncyclopedia"; + ids: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts new file mode 100644 index 0000000..07d1a52 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryRemoveRequestData extends IInventoryBaseActionRequestData { + Action: "Remove"; + item: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts new file mode 100644 index 0000000..a0b7928 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts @@ -0,0 +1,20 @@ +import { Upd } from "../common/tables/IItem"; +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySortRequestData extends IInventoryBaseActionRequestData { + Action: "ApplyInventoryChanges"; + changedItems: ChangedItem[]; +} +export interface ChangedItem { + _id: string; + _tpl: string; + parentId: string; + slotId: string; + location: Location; + upd: Upd; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts new file mode 100644 index 0000000..730ae71 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts @@ -0,0 +1,7 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySplitRequestData extends IInventoryBaseActionRequestData { + Action: "Split"; + item: string; + container: Container; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts new file mode 100644 index 0000000..1b0464d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts @@ -0,0 +1,11 @@ +import { OwnerInfo } from "../common/request/IBaseInteractionRequestData"; +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventorySwapRequestData extends IInventoryBaseActionRequestData { + Action: "Swap"; + item: string; + to: To; + item2: string; + to2: To; + fromOwner2: OwnerInfo; + toOwner2: OwnerInfo; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts new file mode 100644 index 0000000..f021661 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTagRequestData extends IInventoryBaseActionRequestData { + Action: "Tag"; + item: string; + TagName: string; + TagColor: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts new file mode 100644 index 0000000..0955440 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryToggleRequestData extends IInventoryBaseActionRequestData { + Action: "Toggle"; + item: string; + value: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts new file mode 100644 index 0000000..cf4391b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTransferRequestData extends IInventoryBaseActionRequestData { + Action: "Transfer"; + item: string; + with: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts new file mode 100644 index 0000000..689fe75 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts @@ -0,0 +1,4 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IEmptyItemEventRouterResponse extends IItemEventRouterBase { + profileChanges: ""; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts new file mode 100644 index 0000000..31e62fe --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts @@ -0,0 +1,67 @@ +import { Skills } from "../common/IPmcData"; +import { Item, Upd } from "../common/tables/IItem"; +import { IQuest } from "../common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../common/tables/IRepeatableQuests"; +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +export interface IItemEventRouterBase { + warnings: Warning[]; + profileChanges: TProfileChanges | ""; +} +export declare type TProfileChanges = Record; +export interface Warning { + index: number; + err: string; + errmsg: string; +} +export interface ProfileChange { + _id: string; + experience: number; + quests: IQuest[]; + ragFairOffers: IRagfairOffer[]; + builds: BuildChange[]; + items: ItemChanges; + production: Record; + skills: Skills; + traderRelations: Record; + repeatableQuests?: IPmcDataRepeatableQuest[]; +} +export interface BuildChange { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface ItemChanges { + new: Product[]; + change: Product[]; + del: Product[]; +} +export interface Production { + Progress: number; + StartTimestamp: number; + ProductionTime: number; + inProgress: boolean; + RecipeId: string; + Products: Product[]; +} +export interface Product { + _id: string; + _tpl?: string; + parentId?: string; + slotId?: string; + location?: ItemChangeLocation; + upd?: Upd; +} +export interface ItemChangeLocation { + x: number; + y: number; + r: number; + isSearched?: boolean; +} +export interface TraderRelations { + salesSum?: number; + standing?: number; + loyalty?: number; + unlocked?: boolean; + disabled?: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts new file mode 100644 index 0000000..515b49a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts @@ -0,0 +1,21 @@ +export interface IItemEventRouterRequest { + data: Daum[]; + tm: number; + reload: number; +} +export interface Daum { + Action: string; + item: string; + to: To; +} +export interface To { + id: string; + container: string; + location?: Location; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts new file mode 100644 index 0000000..72a9b5b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts @@ -0,0 +1,3 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IItemEventRouterResponse extends IItemEventRouterBase { +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts new file mode 100644 index 0000000..f0a7838 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IChangeRequestData extends ILoginRequestData { + change: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts new file mode 100644 index 0000000..a14c7c9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMiniProfileRequestData { + username: string; + password: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts new file mode 100644 index 0000000..e965813 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts @@ -0,0 +1,4 @@ +export interface ILoginRequestData { + username: string; + password: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IMiniProfile.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IMiniProfile.d.ts new file mode 100644 index 0000000..c12661a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IMiniProfile.d.ts @@ -0,0 +1,14 @@ +export interface IMiniProfile { + username: string; + nickname: string; + side: string; + currlvl: number; + currexp: number; + prevexp: number; + nextlvl: number; + maxlvl: number; + akiData: AkiData; +} +export interface AkiData { + version: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IRegisterData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IRegisterData.d.ts new file mode 100644 index 0000000..61a8bbe --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IRegisterData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IRegisterData extends ILoginRequestData { + edition: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts new file mode 100644 index 0000000..d31c9ac --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts @@ -0,0 +1,2 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export declare type IRemoveProfileData = ILoginRequestData; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts new file mode 100644 index 0000000..04e84d9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IGetLocationRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts new file mode 100644 index 0000000..811e9a2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IEndOfflineRaidRequestData { + crc: number; + exitStatus: string; + exitName: any; + raidSeconds: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts new file mode 100644 index 0000000..86b5bbd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetProfileRequestData { + profileId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts new file mode 100644 index 0000000..84bccc8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts @@ -0,0 +1,27 @@ +export interface IStartOfflineRaidRequestData { + locationName: string; + entryPoint: string; + startTime: number; + dateTime: string; + gameSettings: GameSettings; +} +export interface GameSettings { + timeAndWeatherSettings: TimeAndWeatherSettings; + botsSettings: BotsSettings; + wavesSettings: WavesSettings; +} +export interface TimeAndWeatherSettings { + isRandomTime: boolean; + isRandomWeather: boolean; +} +export interface BotsSettings { + isEnabled: boolean; + isScavWars: boolean; + botAmount: string; +} +export interface WavesSettings { + botDifficulty: string; + isBosses: boolean; + isTaggedAndCursed: boolean; + wavesBotAmount: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notes/INoteActionData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notes/INoteActionData.d.ts new file mode 100644 index 0000000..610657f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notes/INoteActionData.d.ts @@ -0,0 +1,10 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface INoteActionData extends IBaseInteractionRequestData { + Action: string; + index: number; + note: INote; +} +export interface INote { + Time: number; + Text: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notifier/INotifier.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notifier/INotifier.d.ts new file mode 100644 index 0000000..8c48260 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notifier/INotifier.d.ts @@ -0,0 +1,14 @@ +export interface INotifierChannel { + "server": string; + "channel_id": string; + "url": string; + "notifierServer": string; + "ws": string; +} +import { Message } from "../profile/IAkiProfile"; +export interface INotification { + type: "RagfairOfferSold" | "new_message" | "ping"; + eventId: string; + dialogId?: string; + message?: Message; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts new file mode 100644 index 0000000..2bc3d1e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISelectProfileRequestData { + uid: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts new file mode 100644 index 0000000..dcd14a2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts @@ -0,0 +1,21 @@ +import { Skills } from "../common/IPmcData"; +export interface IPlayerIncrementSkillLevelRequestData { + _id: string; + experience: number; + quests: any[]; + ragFairOffers: any[]; + builds: any[]; + items: Items; + production: Production; + skills: Skills; + traderRelations: TraderRelations; +} +export interface Items { + new: any[]; + change: any[]; + del: any[]; +} +export interface Production { +} +export interface TraderRelations { +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts new file mode 100644 index 0000000..99c61f1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts @@ -0,0 +1,25 @@ +export interface IPresetBuildActionRequestData { + Action: string; + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Item { + _id: string; + _tpl: string; + upd?: Upd; + parentId?: string; + slotId?: string; +} +export interface Upd { + Repairable: Repairable; + FireMode: FireMode; +} +export interface Repairable { + MaxDurability: number; + Durability: number; +} +export interface FireMode { + FireMode: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IAkiProfile.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IAkiProfile.d.ts new file mode 100644 index 0000000..3e0b319 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IAkiProfile.d.ts @@ -0,0 +1,167 @@ +import { MessageType } from "../../enums/MessageType"; +import { IPmcData } from "../common/IPmcData"; +import { Item } from "../common/tables/IItem"; +export interface IAkiProfile { + info: Info; + characters: Characters; + suits: string[]; + weaponbuilds: WeaponBuild[]; + dialogues: Record; + aki: Aki; + vitality: Vitality; + inraid: Inraid; + insurance: Insurance[]; +} +export interface Info { + id: string; + username: string; + password: string; + wipe: boolean; + edition: string; +} +export interface Characters { + pmc: IPmcData; + scav: IPmcData; +} +export interface WeaponBuild { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Dialogue { + _id: string; + messages: Message[]; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface DialogueInfo { + _id: string; + type: MessageType; + message: MessagePreview; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface Message { + _id: string; + uid: string; + type: MessageType; + dt: number; + localDateTime: number; + UtcDateTime?: number; + Member?: IUpdatableChatMember; + templateId: string; + text?: string; + hasRewards: boolean; + rewardCollected: boolean; + items: Items; + maxStorageTime?: number; + systemData?: ISystemData; +} +export interface MessagePreview { + uid: string; + type: MessageType; + dt: number; + templateId: string; + text?: string; +} +export interface Items { + stash?: string; + data?: Item[]; +} +export interface ISystemData { + date?: string; + time?: string; + location?: string; + buyerNickname?: string; + soldItem?: string; + itemCount?: number; +} +export interface IUpdatableChatMember { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; + Ignored: boolean; + Banned: boolean; +} +export interface DateTime { + date: string; + time: string; +} +export interface Aki { + version: string; +} +export interface Vitality { + health: Health; + effects: Effects; +} +export interface Health { + Hydration: number; + Energy: number; + Temperature: number; + Head: number; + Chest: number; + Stomach: number; + LeftArm: number; + RightArm: number; + LeftLeg: number; + RightLeg: number; +} +export interface Effects { + Head: Head; + Chest: Chest; + Stomach: Stomach; + LeftArm: LeftArm; + RightArm: RightArm; + LeftLeg: LeftLeg; + RightLeg: RightLeg; +} +export interface Head { +} +export interface Chest { +} +export interface Stomach { +} +export interface LeftArm { + Fracture?: number; +} +export interface RightArm { + Fracture?: number; +} +export interface LeftLeg { + Fracture?: number; +} +export interface RightLeg { + Fracture?: number; +} +export interface Inraid { + location: string; + character: string; +} +export interface Insurance { + scheduledTime: number; + traderId: string; + messageContent: MessageContent; + items: Item[]; +} +export interface MessageContent { + ragfair?: MessageContentRagfair; + text?: string; + templateId: string; + type: MessageType; + maxStorageTime?: number; + systemData?: MessageContentData; +} +export interface MessageContentRagfair { + offerId: string; + count: number; + handbookId: string; +} +export interface MessageContentData { + date: string; + time: string; + location: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts new file mode 100644 index 0000000..4a61196 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeNicknameRequestData { + nickname: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts new file mode 100644 index 0000000..91058ce --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeVoiceRequestData { + voice: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts new file mode 100644 index 0000000..93cc656 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IProfileCreateRequestData { + side: string; + nickname: string; + headId: string; + voiceId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts new file mode 100644 index 0000000..e63e386 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISearchFriendRequestData { + nickname: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts new file mode 100644 index 0000000..96d88b2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts @@ -0,0 +1,9 @@ +export interface ISearchFriendResponse { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts new file mode 100644 index 0000000..9cca7e7 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IValidateNicknameRequestData { + nickname: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts new file mode 100644 index 0000000..0e4821a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IAcceptQuestRequestData { + Action: "QuestAccept"; + qid: string; + type: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts new file mode 100644 index 0000000..cc67404 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface ICompleteQuestRequestData { + Action: string; + qid: string; + removeExcessItems: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts new file mode 100644 index 0000000..63f10a8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHandoverQuestRequestData { + Action: "QuestHandover"; + qid: string; + conditionId: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts new file mode 100644 index 0000000..91f0b8c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IListQuestsRequestData { + completed: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts new file mode 100644 index 0000000..015f58e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts @@ -0,0 +1,4 @@ +export interface IRepeatableQuestChangeRequest { + Action: "RepeatableQuestChange"; + qid: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts new file mode 100644 index 0000000..465ee02 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IAddOfferRequestData { + Action: string; + sellInOnePiece: boolean; + items: string[]; + requirements: Requirement[]; +} +export interface Requirement { + _tpl: string; + count: number; + level: number; + side: number; + onlyFunctional: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts new file mode 100644 index 0000000..2a4a876 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IExtendOfferRequestData { + offerId: string; + renewalTime: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts new file mode 100644 index 0000000..676322a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts @@ -0,0 +1,5 @@ +export interface IGetItemPriceResult { + avg: number; + min: number; + max: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts new file mode 100644 index 0000000..00f8f17 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMarketPriceRequestData { + templateId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts new file mode 100644 index 0000000..1c11422 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts @@ -0,0 +1,7 @@ +import { IRagfairOffer } from "./IRagfairOffer"; +export interface IGetOffersResult { + categories: Record; + offers: IRagfairOffer[]; + offersCount: number; + selectedCategory: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts new file mode 100644 index 0000000..63f655e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts @@ -0,0 +1,42 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +import { Item } from "../common/tables/IItem"; +export interface IRagfairOffer { + sellResult?: SellResult[]; + _id: string; + items: Item[]; + requirements: OfferRequirement[]; + root: string; + intId: number; + itemsCost: number; + requirementsCost: number; + startTime: number; + endTime: number; + sellInOnePiece: boolean; + name?: string; + shortName?: string; + loyaltyLevel: number; + locked: boolean; + unlimitedCount: boolean; + summaryCost: number; + user: IRagfairOfferUser; + notAvailable: boolean; + CurrentItemCount: number; + priority: boolean; +} +export interface OfferRequirement { + _tpl: string; + count: number; + onlyFunctional: boolean; +} +export interface IRagfairOfferUser { + id: string; + nickname: string; + rating: number; + memberType: MemberCategory; + avatar: string; + isRatingGrowing: boolean; +} +export interface SellResult { + sellTime: number; + amount: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts new file mode 100644 index 0000000..d926615 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IRemoveOfferRequestData { + Action: string; + offerId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts new file mode 100644 index 0000000..08e7fd3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts @@ -0,0 +1,32 @@ +export interface ISearchRequestData { + page: number; + limit: number; + sortType: number; + sortDirection: number; + currency: number; + priceFrom: number; + priceTo: number; + quantityFrom: number; + quantityTo: number; + conditionFrom: number; + conditionTo: number; + oneHourExpiration: boolean; + removeBartering: boolean; + offerOwnerType: OfferOwnerType; + onlyFunctional: boolean; + updateOfferCount: boolean; + handbookId: string; + linkedSearchId: string; + neededSearchId: string; + buildItems: BuildItems; + buildCount: number; + tm: number; + reload: number; +} +export declare enum OfferOwnerType { + ANYOWNERTYPE = 0, + TRADEROWNERTYPE = 1, + PLAYEROWNERTYPE = 2 +} +export interface BuildItems { +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e645fb3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts @@ -0,0 +1,3 @@ +export interface IBaseRepairActionDataRequest { + Action: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts new file mode 100644 index 0000000..263d400 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface IRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "Repair"; + repairKitsInfo: RepairKitsInfo[]; + target: string; +} +export interface RepairKitsInfo { + _id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e3d469d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface ITraderRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "TraderRepair"; + tid: string; + repairItems: RepairItem[]; +} +export interface RepairItem { + _id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts new file mode 100644 index 0000000..a9ef757 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IProcessBaseTradeRequestData { + Action: string; + type: string; + tid: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts new file mode 100644 index 0000000..a9e4c17 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts @@ -0,0 +1,14 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData { + Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | ""; + type: string; + tid: string; + item_id: string; + count: number; + scheme_id: number; + scheme_items: SchemeItem[]; +} +export interface SchemeItem { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts new file mode 100644 index 0000000..889dfd1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IProcessRagfairTradeRequestData { + Action: string; + offers: Offer[]; +} +export interface Offer { + id: string; + count: number; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts new file mode 100644 index 0000000..f1d555f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts @@ -0,0 +1,12 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessSellTradeRequestData extends IProcessBaseTradeRequestData { + Action: "sell_to_trader"; + type: string; + tid: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; + scheme_id: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/weather/IWeatherData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/weather/IWeatherData.d.ts new file mode 100644 index 0000000..ecc96ce --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/weather/IWeatherData.d.ts @@ -0,0 +1,20 @@ +export interface IWeatherData { + acceleration: number; + time: string; + date: string; + weather: IWeather; +} +export interface IWeather { + pressure: number; + temp: number; + fog: string; + rain_intensity: number; + rain: any; + wind_gustiness: number; + wind_direction: any; + wind_speed: number; + cloud: number; + time: string; + date: string; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts new file mode 100644 index 0000000..9217864 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts @@ -0,0 +1,4 @@ +export interface IWishlistActionData { + Action: string; + templateId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/BaseClasses.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/BaseClasses.d.ts new file mode 100644 index 0000000..e733bca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/BaseClasses.d.ts @@ -0,0 +1,84 @@ +export declare enum BaseClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMOR = "5448e54d4bdc2dcc718b4568", + VEST = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/ConfigTypes.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/ConfigTypes.d.ts new file mode 100644 index 0000000..6bd31e8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/ConfigTypes.d.ts @@ -0,0 +1,18 @@ +export declare enum ConfigTypes { + AIRDROP = "aki-airdrop", + BOT = "aki-bot", + CORE = "aki-core", + HEALTH = "aki-health", + HIDEOUT = "aki-hideout", + HTTP = "aki-http", + IN_RAID = "aki-inraid", + INSURANCE = "aki-insurance", + INVENTORY = "aki-inventory", + LOCATION = "aki-location", + MATCH = "aki-match", + QUEST = "aki-quest", + RAGFAIR = "aki-ragfair", + REPAIR = "aki-repair", + TRADER = "aki-trader", + WEATHER = "aki-weather" +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/ELocationName.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/ELocationName.d.ts new file mode 100644 index 0000000..b56cc08 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/ELocationName.d.ts @@ -0,0 +1,11 @@ +export declare enum ELocationName { + FACTORY_DAY = "factory4_day", + BIGMAP = "bigmap", + WOODS = "Woods", + SHORELINE = "Shoreline", + INTERCHANGE = "Interchange", + LIGHTHOUSE = "Lighthouse", + LABORATORY = "laboratory", + RESERVE = "RezervBase", + ANY = "any" +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/EquipmentSlots.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/EquipmentSlots.d.ts new file mode 100644 index 0000000..35c18ff --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/EquipmentSlots.d.ts @@ -0,0 +1,16 @@ +export declare enum EquipmentSlots { + HEADWEAR = "Headwear", + EARPIECE = "Earpiece", + FACE_COVER = "FaceCover", + ARMOR_VEST = "ArmorVest", + EYEWEAR = "Eyewear", + ARM_BAND = "ArmBand", + TACTICAL_VEST = "TacticalVest", + POCKETS = "Pockets", + BACKPACK = "Backpack", + SECURED_CONTAINER = "SecuredContainer", + FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", + SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", + HOLSTER = "Holster", + SCABBARD = "Scabbard" +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/HideoutAreas.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/HideoutAreas.d.ts new file mode 100644 index 0000000..b44a20a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/HideoutAreas.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreas { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/MemberCategory.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/MessageType.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/MessageType.d.ts new file mode 100644 index 0000000..1b0c649 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/MessageType.d.ts @@ -0,0 +1,16 @@ +export declare enum MessageType { + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14 +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/Money.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/Money.d.ts new file mode 100644 index 0000000..0d39613 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/Money.d.ts @@ -0,0 +1,5 @@ +export declare enum Money { + ROUBLES = "5449016a4bdc2d6f028b456f", + EUROS = "569668774bdc2da2298b4568", + DOLLARS = "5696686a4bdc2da3298b456a" +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/Traders.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/Traders.d.ts new file mode 100644 index 0000000..163cd71 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/enums/Traders.d.ts @@ -0,0 +1,10 @@ +export declare enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/external/mod.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/external/mod.d.ts new file mode 100644 index 0000000..ecef460 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/external/mod.d.ts @@ -0,0 +1,5 @@ +import { DependencyContainer } from "./tsyringe"; +export interface IMod { + load: (container: DependencyContainer) => void; + delayedLoad: (container: DependencyContainer) => void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/external/tsyringe.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/external/tsyringe.d.ts new file mode 100644 index 0000000..56a7e58 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/external/tsyringe.d.ts @@ -0,0 +1,2 @@ +import type { DependencyContainer } from "tsyringe"; +export type { DependencyContainer }; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/bindings/Route.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/bindings/Route.d.ts new file mode 100644 index 0000000..1b29d7d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/bindings/Route.d.ts @@ -0,0 +1,3 @@ +export interface IRoute { + aki: any; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts new file mode 100644 index 0000000..2c42813 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface IBotCallbacks { + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts new file mode 100644 index 0000000..7e37c6e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IBundleCallbacks { + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts new file mode 100644 index 0000000..d10027f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IBuyClothingRequestData } from "../../eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../../eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISuit } from "../../eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface ICustomizationCallbacks { + getSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + getTraderSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts new file mode 100644 index 0000000..a098560 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts @@ -0,0 +1,26 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGlobals } from "../../eft/common/IGlobals"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../server/ILocaleBase"; +import { ISettingsBase } from "../server/ISettingsBase"; +export interface IDataCallbacks { + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts new file mode 100644 index 0000000..fe2115a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts @@ -0,0 +1,34 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetMailDialogViewRequestData } from "../../eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogInfoRequestData } from "../../eft/dialog/IGetMailDialogInfoRequestData"; +import { IRemoveDialogRequestData } from "../../eft/dialog/IRemoveDialogRequestData"; +import { IGetMailDialogListRequestData } from "../../eft/dialog/IGetMailDialogListRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../../eft/dialog/IFriendRequestData"; +import { IPinDialogRequestData } from "../../eft/dialog/IPinDialogRequestData"; +import { ISetDialogReadRequestData } from "../../eft/dialog/ISetDialogReadRequestData"; +import { IGetAllAttachmentsRequestData } from "../../eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetChatServerListRequestData } from "../../eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../../eft/dialog/IGetFriendListDataResponse"; +import { ISendMessageRequest } from "../../eft/dialog/ISendMessageRequest"; +import { IGetMailDialogViewResponseData } from "../../eft/dialog/IGetMailDialogViewResponseData"; +import { IGetAllAttachmentsResponse } from "../../eft/dialog/IGetAllAttachmentsResponse"; +import { DialogueInfo } from "../../eft/profile/IAkiProfile"; +export interface IDialogueCallbacks { + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts new file mode 100644 index 0000000..38ebc5f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts @@ -0,0 +1,16 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGameEmptyCrcRequestData } from "../../eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../../eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGameConfigResponse } from "../../eft/game/IGameConfigResponse"; +export interface IGameCallbacks { + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts new file mode 100644 index 0000000..5857a3e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IHandbookCallbacks { + load(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts new file mode 100644 index 0000000..d238c7a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts @@ -0,0 +1,13 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { ISyncHealthRequestData } from "../../eft/health/ISyncHealthRequestData"; +import { IOffraidEatRequestData } from "../../eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../../eft/health/IOffraidHealRequestData"; +import { IHealthTreatmentRequestData } from "../../eft/health/IHealthTreatmentRequestData"; +export interface IHealthCallbacks { + onLoad(sessionID: string): IAkiProfile; + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): any; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): any; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): any; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): any; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts new file mode 100644 index 0000000..e9badb6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts @@ -0,0 +1,23 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IHideoutUpgradeRequestData } from "../../eft/hideout/IHideoutUpgradeRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../../eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutScavCaseStartRequestData } from "../../eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutPutItemInRequestData } from "../../eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutTakeItemOutRequestData } from "../../eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutToggleAreaRequestData } from "../../eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../../eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../../eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../../eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IHideoutCallbacks { + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts new file mode 100644 index 0000000..3ecd945 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IHttpCallbacks { + load(): void; + sendImage(sessionID: string, req: any, resp: any, body: any): void; + getImage(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts new file mode 100644 index 0000000..e959b98 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts @@ -0,0 +1,14 @@ +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IRegisterPlayerRequestData } from "../../eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../../eft/inRaid/ISaveProgressRequestData"; +export interface IInraidCallbacks { + onLoad(sessionID: string): IAkiProfile; + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts new file mode 100644 index 0000000..082112d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IGetInsuranceCostRequestData } from "../../eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../../eft/insurance/IInsureRequestData"; +export interface IInsuranceCallbacks { + onLoad(sessionID: string): IAkiProfile; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): any; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): any; + update(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts new file mode 100644 index 0000000..e53f7d0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IInventoryFoldRequestData } from "../../eft/inventory/IInventoryFoldRequestData"; +import { IInventorySplitRequestData } from "../../eft/inventory/IInventorySplitRequestData"; +import { IInventoryMoveRequestData } from "../../eft/inventory/IInventoryMoveRequestData"; +import { IInventoryMergeRequestData } from "../../eft/inventory/IInventoryMergeRequestData"; +import { IInventoryRemoveRequestData } from "../../eft/inventory/IInventoryRemoveRequestData"; +import { IInventoryTransferRequestData } from "../../eft/inventory/IInventoryTransferRequestData"; +import { IInventorySwapRequestData } from "../../eft/inventory/IInventorySwapRequestData"; +import { IInventoryToggleRequestData } from "../../eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTagRequestData } from "../../eft/inventory/IInventoryTagRequestData"; +import { IInventoryBindRequestData } from "../../eft/inventory/IInventoryBindRequestData"; +import { IInventoryExamineRequestData } from "../../eft/inventory/IInventoryExamineRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../../eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventorySortRequestData } from "../../eft/inventory/IInventorySortRequestData"; +import { IInventoryCreateMarkerRequestData } from "../../eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../../eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../../eft/inventory/IInventoryEditMarkerRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IInventoryCallbacks { + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts new file mode 100644 index 0000000..59db771 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts @@ -0,0 +1,6 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../../eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IItemEventCallbacks { + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts new file mode 100644 index 0000000..52dfec6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts @@ -0,0 +1,20 @@ +import { IRegisterData } from "../../eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../../eft/launcher/IRemoveProfileData"; +import { ILoginRequestData } from "../../eft/launcher/ILoginRequestData"; +import { IChangeRequestData } from "../../eft/launcher/IChangeRequestData"; +import { IGetMiniProfileRequestData } from "../../eft/launcher/IGetMiniProfileRequestData.js"; +export interface ILauncherCallbacks { + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; + getServerVersion(): string; + ping(url: string, info: any, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts new file mode 100644 index 0000000..71656a4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IGetLocationRequestData } from "../../eft/location/IGetLocationRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILocationsGenerateAllResponse } from "../../eft/common/ILocationsSourceDestinationBase"; +import { ILocationBase } from "../../eft/common/ILocationBase"; +export interface ILocationCallbacks { + getLocationData(url: string, info: any, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts new file mode 100644 index 0000000..fcbf173 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts @@ -0,0 +1,25 @@ +import { IStartOfflineRaidRequestData } from "../../eft/match/IStartOffineRaidRequestData"; +import { IEndOfflineRaidRequestData } from "../../eft/match/IEndOfflineRaidRequestData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IPmcData } from "../../eft/common/IPmcData"; +export interface IMatchCallbacks { + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: any, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts new file mode 100644 index 0000000..1a4cd7b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts @@ -0,0 +1,6 @@ +export interface IModCallbacks { + load(): void; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts new file mode 100644 index 0000000..8453a4f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { INoteActionData } from "../../eft/notes/INoteActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface INoteCallbacks { + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts new file mode 100644 index 0000000..a211310 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts @@ -0,0 +1,17 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../../eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../../eft/notifier/ISelectProfileRequestData"; +export interface INotifierCallbacks { + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(sessionID: string, req: any, resp: any, data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts new file mode 100644 index 0000000..97c6487 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IPresetBuildActionRequestData } from "../../eft/presetBuild/IPresetBuildActionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { WeaponBuild } from "../../eft/profile/IAkiProfile"; +export interface IPresetBuildCallbacks { + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts new file mode 100644 index 0000000..4169857 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IPresetCallbacks { + load(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts new file mode 100644 index 0000000..9d4d2df --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IProfileChangeNicknameRequestData } from "../../eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../../eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../../eft/profile/IProfileCreateRequestData"; +import { IValidateNicknameRequestData } from "../../eft/profile/IValidateNicknameRequestData"; +import { ISearchFriendRequestData } from "../../eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../../eft/profile/ISearchFriendResponse"; +export interface IProfileCallbacks { + onLoad(sessionID: string): any; + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts new file mode 100644 index 0000000..1c4d0c3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts @@ -0,0 +1,19 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAcceptQuestRequestData } from "../../eft/quests/IAcceptQuestRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IListQuestsRequestData } from "../../eft/quests/IListQuestsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { ICompleteQuestRequestData } from "../../eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../../eft/quests/IHandoverQuestRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../../eft/common/tables/IRepeatableQuests"; +import { IRepeatableQuestChangeRequest } from "../../eft/quests/IRepeatableQuestChangeRequest"; +export interface IQuestCallbacks { + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts new file mode 100644 index 0000000..9282bd4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISearchRequestData } from "../../eft/ragfair/ISearchRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetMarketPriceRequestData } from "../../eft/ragfair/IGetMarketPriceRequestData"; +import { IAddOfferRequestData } from "../../eft/ragfair/IAddOfferRequestData"; +import { IRemoveOfferRequestData } from "../../eft/ragfair/IRemoveOfferRequestData"; +import { IExtendOfferRequestData } from "../../eft/ragfair/IExtendOfferRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetItemPriceResult } from "../../eft/ragfair/IGetItemPriceResult"; +export interface IRagfairCallbacks { + load(): void; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; + updatePlayer(timeSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts new file mode 100644 index 0000000..e8183c9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../../eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../../eft/repair/ITraderRepairActionDataRequest"; +export interface IRepairCallbacks { + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts new file mode 100644 index 0000000..1ad3b82 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts @@ -0,0 +1,4 @@ +export interface ISaveCallbacks { + load(): void; + update(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts new file mode 100644 index 0000000..2f41d54 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../../eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../../eft/trade/IProcessBaseTradeRequestData"; +export interface ITradeCallbacks { + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts new file mode 100644 index 0000000..e0d7d06 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../../eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface ITraderCallbacks { + load(): void; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts new file mode 100644 index 0000000..9ac72ae --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts @@ -0,0 +1,5 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +export interface IWeatherCallbacks { + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts new file mode 100644 index 0000000..e5d519c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IWishlistActionData } from "../../eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IWishlistCallbacks { + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IAirdropConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IAirdropConfig.d.ts new file mode 100644 index 0000000..f4aee89 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IAirdropConfig.d.ts @@ -0,0 +1,20 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IAirdropConfig extends IBaseConfig { + kind: "aki-airdrop"; + airdropChancePercent: AirdropChancePercent; + airdropMinOpenHeight: number; + airdropMaxOpenHeight: number; + planeMinFlyHeight: number; + planeMaxFlyHeight: number; + planeVolume: number; + airdropMinStartTimeSeconds: number; + airdropMaxStartTimeSeconds: number; +} +export interface AirdropChancePercent { + bigmap: number; + woods: number; + lighthouse: number; + shoreline: number; + interchange: number; + reserve: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IBaseConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IBaseConfig.d.ts new file mode 100644 index 0000000..8b6ba88 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IBaseConfig.d.ts @@ -0,0 +1,3 @@ +export interface IBaseConfig { + kind: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IBotConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IBotConfig.d.ts new file mode 100644 index 0000000..5fb9d93 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IBotConfig.d.ts @@ -0,0 +1,114 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IBotConfig extends IBaseConfig { + kind: "aki-bot"; + presetBatch: PresetBatch; + bosses: string[]; + durability: Durability; + lootNValue: LootNvalue; + revenge: Record; + pmc: PmcConfig; + showTypeInNickname: boolean; + maxBotCap: number; +} +export interface PresetBatch { + assault: number; + bossBully: number; + bossGluhar: number; + bossKilla: number; + bossKojaniy: number; + bossSanitar: number; + bossTagilla: number; + bossTest: number; + cursedAssault: number; + followerBully: number; + followerGluharAssault: number; + followerGluharScout: number; + followerGluharSecurity: number; + followerGluharSnipe: number; + followerKojaniy: number; + followerSanitar: number; + followerTagilla: number; + followerTest: number; + marksman: number; + pmcBot: number; + sectantPriest: number; + sectantWarrior: number; + gifter: number; + test: number; + exUsec: number; +} +export interface Durability { + default: DefaultDurability; + pmc: PmcDurability; + boss: BotDurability; + follower: BotDurability; + assault: BotDurability; + cursedassault: BotDurability; + marksman: BotDurability; + pmcbot: BotDurability; + exusec: BotDurability; + sectantpriest: BotDurability; + sectantwarrior: BotDurability; +} +export interface DefaultDurability { + armor: DefaultArmor; + weapon: WeaponDurability; +} +export interface DefaultArmor { + maxDelta: number; + minDelta: number; +} +export interface WeaponDurability { + lowestMax: number; + highestMax: number; + maxDelta: number; + minDelta: number; +} +export interface PmcDurability { + armor: PmcDurabilityArmor; + weapon: WeaponDurability; +} +export interface PmcDurabilityArmor { + lowestMaxPercent: number; + highestMaxPercent: number; + maxDelta: number; + minDelta: number; +} +export interface BotDurability { + armor: ArmorDurability; + weapon: WeaponDurability; +} +export interface ArmorDurability { + maxDelta: number; + minDelta: number; +} +export interface LootNvalue { + scav: number; + pmc: number; +} +export interface PmcConfig { + dynamicLoot: DynamicLoot; + cartridgeBlacklist: string[]; + difficulty: string; + isUsec: number; + chanceSameSideIsHostilePercent: number; + usecType: string; + bearType: string; + maxBackpackLootTotalRub: number; + maxPocketLootTotalRub: number; + maxVestLootTotalRub: number; + types: Types; + enemyTypes: string[]; +} +export interface DynamicLoot { + whitelist: string[]; + blacklist: string[]; + spawnLimits: Record; + moneyStackLimits: Record; +} +export interface Types { + assault: number; + cursedAssault: number; + pmcBot: number; + exUsec: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ICoreConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ICoreConfig.d.ts new file mode 100644 index 0000000..cfcaf61 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ICoreConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ICoreConfig extends IBaseConfig { + kind: "aki-core"; + akiVersion: string; + projectName: string; + compatibleTarkovVersion: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHealthConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHealthConfig.d.ts new file mode 100644 index 0000000..fdbf656 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHealthConfig.d.ts @@ -0,0 +1,14 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHealthConfig extends IBaseConfig { + kind: "aki-health"; + healthMultipliers: HealthMultipliers; + save: Save; +} +export interface HealthMultipliers { + death: number; + blacked: number; +} +export interface Save { + health: boolean; + effects: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHideoutConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHideoutConfig.d.ts new file mode 100644 index 0000000..4658fa6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHideoutConfig.d.ts @@ -0,0 +1,27 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHideoutConfig extends IBaseConfig { + kind: "aki-hideout"; + runIntervalSeconds: number; + scavCase: ScavCase; + fuelDrainRateMultipler: number; +} +export interface ScavCase { + rewardParentBlacklist: string[]; + rewardItemBlacklist: any[]; + ammoRewards: AmmoRewards; + moneyRewards: MoneyRewards; +} +export interface AmmoRewards { + giveMultipleOfTen: boolean; + minAmount: number; +} +export interface MoneyRewards { + enabled: boolean; + rub: MinMax; + usd: MinMax; + eur: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHttpConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHttpConfig.d.ts new file mode 100644 index 0000000..c41d035 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IHttpConfig.d.ts @@ -0,0 +1,6 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHttpConfig extends IBaseConfig { + kind: "aki-http"; + ip: string; + port: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInRaidConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInRaidConfig.d.ts new file mode 100644 index 0000000..baaf083 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInRaidConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInRaidConfig extends IBaseConfig { + kind: "aki-inraid"; + MIAOnRaidEnd: boolean; + raidMenuSettings: RaidMenuSettings; + save: Save; + carExtracts: string[]; + carExtractBaseStandingGain: number; + scavExtractGain: number; +} +export interface RaidMenuSettings { + aiAmount: string; + aiDifficulty: string; + bossEnabled: boolean; + scavWars: boolean; + taggedAndCursed: boolean; +} +export interface Save { + loot: boolean; + durability: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInsuranceConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInsuranceConfig.d.ts new file mode 100644 index 0000000..6e9c744 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInsuranceConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInsuranceConfig extends IBaseConfig { + kind: "aki-insurance"; + insuranceMultiplier: Record; + returnChancePercent: Record; + runIntervalSeconds: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInventoryConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInventoryConfig.d.ts new file mode 100644 index 0000000..ffffa41 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IInventoryConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInventoryConfig extends IBaseConfig { + kind: "aki-inventory"; + newItemsMarkedFound: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ILocationConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ILocationConfig.d.ts new file mode 100644 index 0000000..0551d57 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ILocationConfig.d.ts @@ -0,0 +1,24 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ILocationConfig extends IBaseConfig { + kind: "aki-location"; + looseLootMultiplier: LootMultiplier; + staticLootMultiplier: LootMultiplier; +} +export interface LootMultiplier { + bigmap: number; + develop: number; + factory4_day: number; + factory4_night: number; + interchange: number; + laboratory: number; + rezervbase: number; + shoreline: number; + woods: number; + hideout: number; + lighthouse: number; + privatearea: number; + suburbs: number; + tarkovstreets: number; + terminal: number; + town: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IMatchConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IMatchConfig.d.ts new file mode 100644 index 0000000..92c4d77 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IMatchConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IMatchConfig extends IBaseConfig { + kind: "aki-match"; + enabled: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IQuestConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IQuestConfig.d.ts new file mode 100644 index 0000000..be4a97b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IQuestConfig.d.ts @@ -0,0 +1,77 @@ +import { ELocationName } from "../../enums/ELocationName"; +import { IBaseConfig } from "./IBaseConfig"; +export interface IQuestConfig extends IBaseConfig { + kind: "aki-quest"; + redeemTime: number; + repeatableQuests: IRepeatableQuestConfig[]; +} +export interface IRepeatableQuestConfig { + name: string; + types: string[]; + resetTime: number; + numQuests: number; + minPlayerLevel: number; + rewardScaling: IRewardScaling; + locations: Record; + traderWhitelist: ITraderWhitelist[]; + questConfig: IQuestConfig; +} +export interface IRewardScaling { + levels: number[]; + experience: number[]; + roubles: number[]; + items: number[]; + reputation: number[]; + rewardSpread: number; +} +export interface ITraderWhitelist { + traderId: string; + questTypes: string[]; +} +export interface IQuestConfig { + Exploration: IExploration; + Completion: ICompletion; + Elimination: IElimination; +} +export interface IExploration { + maxExtracts: number; + specificExits: ISpecificExits; +} +export interface ISpecificExits { + probability: number; + passageRequirementWhitelist: string[]; +} +export interface ICompletion { + minRequestedAmount: number; + maxRequestedAmount: number; + minRequestedBulletAmount: number; + maxRequestedBulletAmount: number; + useWhitelist: boolean; + useBlacklist: boolean; +} +export interface IElimination { + targets: ITarget[]; + bodyPartProb: number; + bodyParts: IBodyPart[]; + specificLocationProb: number; + distLocationBlacklist: string[]; + distProb: number; + maxDist: number; + minDist: number; + maxKills: number; + minKills: number; +} +export interface IProbabilityObject { + key: string; + relativeProbability: number; + data?: any; +} +export interface ITarget extends IProbabilityObject { + data: IBossInfo; +} +export interface IBossInfo { + isBoss: boolean; +} +export interface IBodyPart extends IProbabilityObject { + data: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IRagfairConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IRagfairConfig.d.ts new file mode 100644 index 0000000..2d151ca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IRagfairConfig.d.ts @@ -0,0 +1,59 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRagfairConfig extends IBaseConfig { + kind: "aki-ragfair"; + runIntervalSeconds: number; + sell: Sell; + traders: Record; + dynamic: Dynamic; +} +export interface Sell { + fees: boolean; + chance: Chance; + time: Time; + reputation: Reputation; +} +export interface Chance { + base: number; + overprices: number; + underpriced: number; +} +export interface Time { + base: number; + min: number; + max: number; +} +export interface Reputation { + gain: number; + loss: number; +} +export interface Dynamic { + expiredOfferThreshold: number; + offerItemCount: MinMax; + price: MinMax; + endTimeSeconds: MinMax; + condition: Condition; + stackablePercent: MinMax; + nonStackableCount: MinMax; + rating: MinMax; + currencies: Record; + showAsSingleStack: string[]; + blacklist: Blacklist; +} +export interface MinMax { + min: number; + max: number; +} +export interface Condition { + conditionChance: number; + min: number; + max: number; +} +export interface Blacklist { + /** + * show/hide trader items that are blacklisted by bsg + */ + traderItems: boolean; + custom: string[]; + enableBsgList: boolean; + enableQuestList: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IRepairConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IRepairConfig.d.ts new file mode 100644 index 0000000..4966eb5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IRepairConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRepairConfig extends IBaseConfig { + kind: "aki-repair"; + priceMultiplier: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ITraderConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ITraderConfig.d.ts new file mode 100644 index 0000000..dab73e3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/ITraderConfig.d.ts @@ -0,0 +1,15 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ITraderConfig extends IBaseConfig { + kind: "aki-trader"; + updateTime: UpdateTime[]; + updateTimeDefault: number; + fenceAssortSize: number; + fenceMaxPresetsCount: number; + fencePresetPriceMult: number; + minDurabilityForSale: number; + fenceItemIgnoreList: string[]; +} +export interface UpdateTime { + traderId: string; + seconds: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IWeatherConfig.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IWeatherConfig.d.ts new file mode 100644 index 0000000..c52cab3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/config/IWeatherConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IWeatherConfig extends IBaseConfig { + kind: "aki-weather"; + acceleration: number; + weather: Weather; +} +export interface Weather { + clouds: MinMax; + windSpeed: MinMax; + windDirection: MinMax; + windGustiness: MinMax; + rain: MinMax; + rainIntensity: MinMax; + fog: MinMax; + temp: MinMax; + pressure: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/controllers/IBotController.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/controllers/IBotController.d.ts new file mode 100644 index 0000000..010e208 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/controllers/IBotController.d.ts @@ -0,0 +1,13 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { Difficulty } from "../../eft/common/tables/IBotType"; +export interface IBotController { + getBotLimit(type: string): number; + getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + generate(info: IGenerateBotsRequestData, playerScav: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IBotGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IBotGenerator.d.ts new file mode 100644 index 0000000..f3e8586 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IBotGenerator.d.ts @@ -0,0 +1,10 @@ +import { Inventory as PmcInventory } from "../../eft/common/IPmcData"; +import { Inventory, Chances, Generation } from "../../eft/common/tables/IBotType"; +export interface IBotGenerator { + generateInventory(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; +} +export interface IExhaustableArray { + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/ILocationGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/ILocationGenerator.d.ts new file mode 100644 index 0000000..530ceca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/ILocationGenerator.d.ts @@ -0,0 +1,6 @@ +import { IStaticContainerProps, IStaticLootDetails, IStaticAmmoDetails, IStaticForcedProps } from "../../eft/common/tables/ILootBase"; +import { ILooseLoot, SpawnpointTemplate } from "../../eft/common/ILooseLoot"; +export interface ILocationGenerator { + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts new file mode 100644 index 0000000..a9db89b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts @@ -0,0 +1,4 @@ +export interface IPMCLootGenerator { + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts new file mode 100644 index 0000000..6670540 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts @@ -0,0 +1,4 @@ +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairAssortGenerator { + getAssortItems(): Item[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts new file mode 100644 index 0000000..30b4be5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts @@ -0,0 +1,6 @@ +import { IBarterScheme } from "../../eft/common/tables/ITrader"; +import { IRagfairOffer } from "../../eft/ragfair/IRagfairOffer"; +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairOfferGenerator { + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece: boolean): IRagfairOffer; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/helpers/Traders.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/helpers/Traders.d.ts new file mode 100644 index 0000000..e935d29 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/helpers/Traders.d.ts @@ -0,0 +1,10 @@ +export declare const enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IMod.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IMod.d.ts new file mode 100644 index 0000000..e6eec79 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IMod.d.ts @@ -0,0 +1,10 @@ +export declare namespace ModLoader { + interface IMod { + name: string; + version: string; + main?: string; + author?: string; + license: string; + dependencies?: Record; + } +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IModLoader.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IModLoader.d.ts new file mode 100644 index 0000000..40a5e19 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IModLoader.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +export interface IModLoader { + load(container: DependencyContainer): void; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IPackageJsonData.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IPackageJsonData.d.ts new file mode 100644 index 0000000..09472cd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/mod/IPackageJsonData.d.ts @@ -0,0 +1,11 @@ +export interface IPackageJsonData { + incompatibilities?: string[]; + dependencies?: string[]; + name: string; + author: string; + version: string; + akiVersion: string; + licence: string; + main: string; + contributors: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts new file mode 100644 index 0000000..c7d246a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts @@ -0,0 +1,4 @@ +export interface IRagfairServerPrices { + static: Record; + dynamic: Record; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IDatabaseTables.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IDatabaseTables.d.ts new file mode 100644 index 0000000..dbb71be --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IDatabaseTables.d.ts @@ -0,0 +1,51 @@ +import { IGlobals } from "../../eft/common/IGlobals"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { IBotType } from "../../eft/common/tables/IBotType"; +import { ICustomizationItem } from "../../eft/common/tables/ICustomizationItem"; +import { IHandbookBase } from "../../eft/common/tables/IHandbookBase"; +import { ILootBase } from "../../eft/common/tables/ILootBase"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IRepeatableQuestDatabase } from "../../eft/common/tables/IRepeatableQuests"; +import { ITemplateItem } from "../../eft/common/tables/ITemplateItem"; +import { ITrader } from "../../eft/common/tables/ITrader"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { ILocaleBase } from "./ILocaleBase"; +import { ILocations } from "./ILocations"; +import { IServerBase } from "./IServerBase"; +import { ISettingsBase } from "./ISettingsBase"; +export interface IDatabaseTables { + bots: { + types: Record; + base: IBotBase; + core: IBotCore; + }; + hideout: { + areas: IHideoutArea[]; + production: IHideoutProduction[]; + scavcase: IHideoutScavCase[]; + settings: IHideoutSettingsBase; + }; + locales: ILocaleBase; + locations: ILocations; + loot: ILootBase; + match: any; + templates: { + character: string[]; + items: Record; + quests: IQuest[]; + repeatableQuests: IRepeatableQuestDatabase; + clientItems: Record; + handbook: IHandbookBase; + customization: Record; + profiles: any; + prices: Record; + }; + traders: Record; + globals: IGlobals; + server: IServerBase; + settings: ISettingsBase; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IHttpServer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IHttpServer.d.ts new file mode 100644 index 0000000..c828399 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IHttpServer.d.ts @@ -0,0 +1,12 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { INotification } from "../../eft/notifier/INotifier"; +export interface IHttpServer { + load(): void; + getCookies(req: http.IncomingMessage): any; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + sendMessage(sessionID: string, output: INotification): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ILocaleBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ILocaleBase.d.ts new file mode 100644 index 0000000..8887c06 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ILocaleBase.d.ts @@ -0,0 +1,61 @@ +export interface ILocaleBase { + global: Record; + menu: Record; + languages: ILanguageBase[]; +} +export interface ILocaleGlobalBase { + interface: Record; + enum: any[]; + mail: Record; + quest: Record; + preset: Record; + handbook: Record; + season: Record; + customization: Record; + repeatableQuest: Record; + templates: ILocaleTemplateBase; + locations: ILocaleLocationsBase; + banners: ILocaleBannersBase; + trading: ILocaleTradingBase; +} +export interface ILocaleQuest { + name: string; + description: string; + note: string; + failMessageText: string; + startedMessageText: string; + successMessageText: string; + conditions: Record; + location: string; +} +export interface ILocalePreset { + Name: string; +} +export interface ILocaleTemplateBase { + templates: Record; +} +export interface ILocaleLocationsBase { + locations: Record; +} +export interface ILocaleBannersBase { + locations: Record; +} +export interface ILocaleProps { + Name: string; + ShortName: string; + Description: string; +} +export interface ILocaleTradingBase { + locations: Record; +} +export interface ILocaleTradingProps { + FullName: string; + FirstName: string; + Nickname: string; + Location: string; + Description: string; +} +export interface ILanguageBase { + ShortName: string; + Name: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ILocations.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ILocations.d.ts new file mode 100644 index 0000000..18f0262 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ILocations.d.ts @@ -0,0 +1,26 @@ +import { ILocationBase } from "../../eft/common/ILocationBase"; +import { ILooseLoot } from "../../eft/common/ILooseLoot"; +import { ILocationsBase } from "../../eft/common/tables/ILocationsBase"; +export interface ILocations { + bigmap?: ILocationData; + develop?: ILocationData; + factory4_day?: ILocationData; + factory4_night?: ILocationData; + hideout?: ILocationData; + interchange?: ILocationData; + laboratory?: ILocationData; + lighthouse?: ILocationData; + privatearea?: ILocationData; + rezervbase?: ILocationData; + shoreline?: ILocationData; + suburbs?: ILocationData; + tarkovstreets?: ILocationData; + terminal?: ILocationData; + town?: ILocationData; + woods?: ILocationData; + base?: ILocationsBase; +} +export interface ILocationData { + base: ILocationBase; + looseLoot?: ILooseLoot; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IServerBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IServerBase.d.ts new file mode 100644 index 0000000..d033db3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/IServerBase.d.ts @@ -0,0 +1,4 @@ +export interface IServerBase { + ip: string; + port: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ISettingsBase.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ISettingsBase.d.ts new file mode 100644 index 0000000..c067cda --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/server/ISettingsBase.d.ts @@ -0,0 +1,43 @@ +export interface ISettingsBase { + config: Config; +} +export interface Config { + AFKTimeoutSeconds: number; + AdditionalRandomDelaySeconds: number; + ClientSendRateLimit: number; + CriticalRetriesCount: number; + DefaultRetriesCount: number; + FirstCycleDelaySeconds: number; + FramerateLimit: FramerateLimit; + GroupStatusInterval: number; + KeepAliveInterval: number; + Mark502and504AsNonImportant: boolean; + MemoryManagementSettings: MemoryManagementSettings; + NVidiaHighlights: boolean; + NextCycleDelaySeconds: number; + PingServerResultSendInterval: number; + PingServersInterval: number; + ReleaseProfiler: ReleaseProfiler; + SecondCycleDelaySeconds: number; + TurnOffLogging: boolean; + WeaponOverlapDistanceCulling: number; + WebDiagnosticsEnabled: boolean; +} +export interface FramerateLimit { + MaxFramerateGameLimit: number; + MaxFramerateLobbyLimit: number; + MinFramerateLimit: number; +} +export interface MemoryManagementSettings { + AggressiveGC: boolean; + GigabytesRequiredToDisableGCDuringRaid: number; + HeapPreAllocationEnabled: boolean; + HeapPreAllocationMB: number; + OverrideRamCleanerSettings: boolean; + RamCleanerEnabled: boolean; +} +export interface ReleaseProfiler { + Enabled: boolean; + MaxRecords: number; + RecordTriggerValue: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/IAsyncQueue.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/IAsyncQueue.d.ts new file mode 100644 index 0000000..2be801a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/IAsyncQueue.d.ts @@ -0,0 +1,4 @@ +import { ICommand } from "./ICommand"; +export interface IAsyncQueue { + waitFor(command: ICommand): Promise; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/ICommand.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/ICommand.d.ts new file mode 100644 index 0000000..696bb83 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/ICommand.d.ts @@ -0,0 +1,4 @@ +export interface ICommand { + uuid: string; + cmd: () => Promise; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/ILogger.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/ILogger.d.ts new file mode 100644 index 0000000..c983701 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/ILogger.d.ts @@ -0,0 +1,10 @@ +import { Daum } from "../../eft/itemEvent/IItemEventRouterRequest"; +export interface ILogger { + writeToLogFile(data: string | Daum): void; + log(data: string | Record | Error, color: string): void; + error(data: string): void; + warning(data: string): void; + success(data: string): void; + info(data: string): void; + debug(data: string | Record, onlyShowInConsole?: boolean): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/IUuidGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/IUuidGenerator.d.ts new file mode 100644 index 0000000..3870469 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/models/spt/utils/IUuidGenerator.d.ts @@ -0,0 +1,3 @@ +export interface IUUidGenerator { + generate(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/HttpRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/HttpRouter.d.ts new file mode 100644 index 0000000..f75a47d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/HttpRouter.d.ts @@ -0,0 +1,16 @@ +/// +import { IncomingMessage } from "http"; +import { DynamicRouter, Router, StaticRouter } from "../di/Router"; +export declare class HttpRouter { + protected staticRouters: StaticRouter[]; + protected dynamicRoutes: DynamicRouter[]; + constructor(staticRouters: StaticRouter[], dynamicRoutes: DynamicRouter[]); + protected groupBy(list: T[], keyGetter: (t: T) => string): Map; + getResponse(req: IncomingMessage, info: any, sessionID: string): string; + protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean; +} +declare class ResponseWrapper { + output: string; + constructor(output: string); +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/ImageRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/ImageRouter.d.ts new file mode 100644 index 0000000..ab03977 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/ImageRouter.d.ts @@ -0,0 +1,13 @@ +/// +import { IncomingMessage, ServerResponse } from "http"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ImageRouteService } from "../services/mod/image/ImageRouteService"; +import { VFS } from "../utils/VFS"; +export declare class ImageRouter { + protected vfs: VFS; + protected imageRouteService: ImageRouteService; + constructor(vfs: VFS, imageRouteService: ImageRouteService); + addRoute(key: string, valueToAdd: string): void; + sendImage(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any, httpServer: IHttpServer): void; + getImage(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/ItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/ItemEventRouter.d.ts new file mode 100644 index 0000000..b1ac5d9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/ItemEventRouter.d.ts @@ -0,0 +1,17 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { ItemEventRouterDefinition } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class ItemEventRouter { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected profileHelper: ProfileHelper; + protected itemEventRouters: ItemEventRouterDefinition[]; + constructor(logger: ILogger, jsonUtil: JsonUtil, profileHelper: ProfileHelper, itemEventRouters: ItemEventRouterDefinition[]); + protected output: IItemEventRouterResponse; + handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse; + getOutput(sessionID: string): IItemEventRouterResponse; + protected resetOutput(sessionID: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts new file mode 100644 index 0000000..6d0ab4b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BotDynamicRouter extends DynamicRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts new file mode 100644 index 0000000..a765410 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BundleDynamicRouter extends DynamicRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts new file mode 100644 index 0000000..2db7cc5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class CustomizationDynamicRouter extends DynamicRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts new file mode 100644 index 0000000..836ed8d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class DataDynamicRouter extends DynamicRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts new file mode 100644 index 0000000..a152b4d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter } from "../../di/Router"; +import { ImageRouter } from "../ImageRouter"; +export declare class HttpDynamicRouter extends DynamicRouter { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts new file mode 100644 index 0000000..7c0561f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class InraidDynamicRouter extends DynamicRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); + getTopLevelRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts new file mode 100644 index 0000000..b8e5cdf --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class LocationDynamicRouter extends DynamicRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); + getTopLevelRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts new file mode 100644 index 0000000..83c60c5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class NotifierDynamicRouter extends DynamicRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts new file mode 100644 index 0000000..5b7cc1b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class TraderDynamicRouter extends DynamicRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts new file mode 100644 index 0000000..e78445e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class CustomizationItemEventRouter extends ItemEventRouterDefinition { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts new file mode 100644 index 0000000..99847c6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HealthItemEventRouter extends ItemEventRouterDefinition { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts new file mode 100644 index 0000000..e1e98af --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HideoutCallbacks } from "../../callbacks/HideoutCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HideoutItemEventRouter extends ItemEventRouterDefinition { + protected hideoutCallbacks: HideoutCallbacks; + constructor(hideoutCallbacks: HideoutCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts new file mode 100644 index 0000000..a922cc0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InsuranceItemEventRouter extends ItemEventRouterDefinition { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts new file mode 100644 index 0000000..2619bb9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InventoryCallbacks } from "../../callbacks/InventoryCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InventoryItemEventRouter extends ItemEventRouterDefinition { + protected inventoryCallbacks: InventoryCallbacks; + constructor(inventoryCallbacks: InventoryCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts new file mode 100644 index 0000000..59bf598 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { NoteCallbacks } from "../../callbacks/NoteCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class NoteItemEventRouter extends ItemEventRouterDefinition { + protected noteCallbacks: NoteCallbacks; + constructor(noteCallbacks: NoteCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts new file mode 100644 index 0000000..277db44 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class PresetBuildItemEventRouter extends ItemEventRouterDefinition { + protected presetBuildCallbacks: PresetBuildCallbacks; + constructor(presetBuildCallbacks: PresetBuildCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts new file mode 100644 index 0000000..db59c25 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class QuestItemEventRouter extends ItemEventRouterDefinition { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts new file mode 100644 index 0000000..9216cc5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RagfairItemEventRouter extends ItemEventRouterDefinition { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts new file mode 100644 index 0000000..5196ba9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RepairCallbacks } from "../../callbacks/RepairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RepairItemEventRouter extends ItemEventRouterDefinition { + protected repairCallbacks: RepairCallbacks; + constructor(repairCallbacks: RepairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts new file mode 100644 index 0000000..a43bb0a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { TradeCallbacks } from "../../callbacks/TradeCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class TradeItemEventRouter extends ItemEventRouterDefinition { + protected tradeCallbacks: TradeCallbacks; + constructor(tradeCallbacks: TradeCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts new file mode 100644 index 0000000..38497fb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { WishlistCallbacks } from "../../callbacks/WishlistCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class WishlistItemEventRouter extends ItemEventRouterDefinition { + protected wishlistCallbacks: WishlistCallbacks; + constructor(wishlistCallbacks: WishlistCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts new file mode 100644 index 0000000..114f5b2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class HealthSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts new file mode 100644 index 0000000..4c00b40 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InraidSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts new file mode 100644 index 0000000..30ce98e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InsuranceSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts new file mode 100644 index 0000000..16c7619 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class ProfileSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/BundleSerializer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/BundleSerializer.d.ts new file mode 100644 index 0000000..912db83 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/BundleSerializer.d.ts @@ -0,0 +1,11 @@ +import { Serializer } from "../../di/Serializer"; +import { BundleLoader } from "../../loaders/BundleLoader"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { ILogger } from "../../models/spt/utils/ILogger"; +export declare class BundleSerializer extends Serializer { + protected logger: ILogger; + protected bundleLoader: BundleLoader; + constructor(logger: ILogger, bundleLoader: BundleLoader); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/ImageSerializer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/ImageSerializer.d.ts new file mode 100644 index 0000000..0e040d4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/ImageSerializer.d.ts @@ -0,0 +1,9 @@ +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { Serializer } from "../../di/Serializer"; +import { ImageRouter } from "../ImageRouter"; +export declare class ImageSerializer extends Serializer { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/NotifySerializer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/NotifySerializer.d.ts new file mode 100644 index 0000000..1779ac9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/serializers/NotifySerializer.d.ts @@ -0,0 +1,11 @@ +import { NotifierController } from "../../controllers/NotifierController"; +import { Serializer } from "../../di/Serializer"; +import { HttpServerHelper } from "../../helpers/HttpServerHelper"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +export declare class NotifySerializer extends Serializer { + protected notifierController: NotifierController; + protected httpServerHelper: HttpServerHelper; + constructor(notifierController: NotifierController, httpServerHelper: HttpServerHelper); + serialize(_sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/BotStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/BotStaticRouter.d.ts new file mode 100644 index 0000000..aeea220 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/BotStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BotStaticRouter extends StaticRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/BundleStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/BundleStaticRouter.d.ts new file mode 100644 index 0000000..fb682fc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/BundleStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BundleStaticRouter extends StaticRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/CustomizationStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/CustomizationStaticRouter.d.ts new file mode 100644 index 0000000..21bc4bb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/CustomizationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class CustomizationStaticRouter extends StaticRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/DataStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/DataStaticRouter.d.ts new file mode 100644 index 0000000..84ba7fd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/DataStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DataStaticRouter extends StaticRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/DialogStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/DialogStaticRouter.d.ts new file mode 100644 index 0000000..546cdf1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/DialogStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DialogueCallbacks } from "../../callbacks/DialogueCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DialogStaticRouter extends StaticRouter { + protected dialogueCallbacks: DialogueCallbacks; + constructor(dialogueCallbacks: DialogueCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/GameStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/GameStaticRouter.d.ts new file mode 100644 index 0000000..a9a7496 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/GameStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { GameCallbacks } from "../../callbacks/GameCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class GameStaticRouter extends StaticRouter { + protected gameCallbacks: GameCallbacks; + constructor(gameCallbacks: GameCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/HealthStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/HealthStaticRouter.d.ts new file mode 100644 index 0000000..863fd5e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/HealthStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class HealthStaticRouter extends StaticRouter { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/InraidStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/InraidStaticRouter.d.ts new file mode 100644 index 0000000..b29ad23 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/InraidStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InraidStaticRouter extends StaticRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/InsuranceStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/InsuranceStaticRouter.d.ts new file mode 100644 index 0000000..5676499 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/InsuranceStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InsuranceStaticRouter extends StaticRouter { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/ItemEventStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/ItemEventStaticRouter.d.ts new file mode 100644 index 0000000..c30a7fc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/ItemEventStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ItemEventCallbacks } from "../../callbacks/ItemEventCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ItemEventStaticRouter extends StaticRouter { + protected itemEventCallbacks: ItemEventCallbacks; + constructor(itemEventCallbacks: ItemEventCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/LauncherStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/LauncherStaticRouter.d.ts new file mode 100644 index 0000000..0040cbd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/LauncherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LauncherCallbacks } from "../../callbacks/LauncherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LauncherStaticRouter extends StaticRouter { + protected launcherCallbacks: LauncherCallbacks; + constructor(launcherCallbacks: LauncherCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/LocationStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/LocationStaticRouter.d.ts new file mode 100644 index 0000000..b6de956 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/LocationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LocationStaticRouter extends StaticRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/MatchStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/MatchStaticRouter.d.ts new file mode 100644 index 0000000..9920a92 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/MatchStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { MatchCallbacks } from "../../callbacks/MatchCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class MatchStaticRouter extends StaticRouter { + protected matchCallbacks: MatchCallbacks; + constructor(matchCallbacks: MatchCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/NotifierStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/NotifierStaticRouter.d.ts new file mode 100644 index 0000000..8f1f5cc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/NotifierStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class NotifierStaticRouter extends StaticRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/PresetStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/PresetStaticRouter.d.ts new file mode 100644 index 0000000..a9e7458 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/PresetStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class PresetStaticRouter extends StaticRouter { + protected presetCallbacks: PresetBuildCallbacks; + constructor(presetCallbacks: PresetBuildCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/ProfileStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/ProfileStaticRouter.d.ts new file mode 100644 index 0000000..83403f2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/ProfileStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ProfileCallbacks } from "../../callbacks/ProfileCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ProfileStaticRouter extends StaticRouter { + protected profileCallbacks: ProfileCallbacks; + constructor(profileCallbacks: ProfileCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/QuestStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/QuestStaticRouter.d.ts new file mode 100644 index 0000000..8f7ca0a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/QuestStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class QuestStaticRouter extends StaticRouter { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/RagfairStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/RagfairStaticRouter.d.ts new file mode 100644 index 0000000..6c41467 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/RagfairStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class RagfairStaticRouter extends StaticRouter { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/TraderStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/TraderStaticRouter.d.ts new file mode 100644 index 0000000..41728a1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/TraderStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class TraderStaticRouter extends StaticRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/WeatherStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/WeatherStaticRouter.d.ts new file mode 100644 index 0000000..72ed851 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/routers/static/WeatherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { WeatherCallbacks } from "../../callbacks/WeatherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class WeatherStaticRouter extends StaticRouter { + protected weatherCallbacks: WeatherCallbacks; + constructor(weatherCallbacks: WeatherCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/servers/ConfigServer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/servers/ConfigServer.d.ts new file mode 100644 index 0000000..a079be8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/servers/ConfigServer.d.ts @@ -0,0 +1,14 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigTypes } from "../models/enums/ConfigTypes"; +export declare class ConfigServer { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected configs: Record; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil); + getConfig(configType: ConfigTypes): T; + getConfigByString(configType: string): T; + initialize(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/servers/DatabaseServer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/servers/DatabaseServer.d.ts new file mode 100644 index 0000000..aa152d0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/servers/DatabaseServer.d.ts @@ -0,0 +1,6 @@ +import { IDatabaseTables } from "../models/spt/server/IDatabaseTables"; +export declare class DatabaseServer { + protected tableData: IDatabaseTables; + getTables(): IDatabaseTables; + setTables(any: any): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/servers/HttpServer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/servers/HttpServer.d.ts new file mode 100644 index 0000000..5234966 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/servers/HttpServer.d.ts @@ -0,0 +1,49 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { Serializer } from "../di/Serializer"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { HttpRouter } from "../routers/HttpRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ConfigServer } from "./ConfigServer"; +import { DatabaseServer } from "./DatabaseServer"; +export declare class HttpServer implements IHttpServer { + protected httpRouter: HttpRouter; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected serializers: Serializer[]; + protected configServer: ConfigServer; + constructor(httpRouter: HttpRouter, // TODO: delay required + logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, serializers: Serializer[], configServer: ConfigServer); + protected buffers: {}; + protected onReceive: {}; + protected onRespond: {}; + protected httpConfig: IHttpConfig; + protected webSockets: {}; + protected websocketPingHandler: any; + getCookies(req: http.IncomingMessage): any; + resetBuffer(sessionID: string): void; + putInBuffer(sessionID: any, data: any, bufLength: number): boolean; + getFromBuffer(sessionID: string): any; + sendZlibJson(resp: any, output: any, sessionID: string): void; + sendMessage(sessionID: string, output: INotification): void; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + handleRequest(req: http.IncomingMessage, resp: http.ServerResponse): void; + load(): void; + protected getRandomisedMessage(): string; + wsOnConnection(ws: any, req: any): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/servers/RagfairServer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/servers/RagfairServer.d.ts new file mode 100644 index 0000000..60c92b5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/servers/RagfairServer.d.ts @@ -0,0 +1,31 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { ConfigServer } from "./ConfigServer"; +export declare class RagfairServer { + protected logger: ILogger; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairCategoriesService: RagfairCategoriesService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairOfferService: RagfairOfferService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); + load(): void; + update(): void; + getCategories(): Record; + /** + * Disable/Hide an offer from flea + * @param offerId + */ + hideOffer(offerId: string): void; + getOffer(offerID: string): IRagfairOffer; + getOffers(): IRagfairOffer[]; + removeOfferStack(offerID: string, amount: number): void; + doesOfferExist(offerId: string): boolean; + addPlayerOffers(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/servers/SaveServer.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/servers/SaveServer.d.ts new file mode 100644 index 0000000..cb28f49 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/servers/SaveServer.d.ts @@ -0,0 +1,28 @@ +import { IAkiProfile, Info } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { SaveLoadRouter } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class SaveServer { + protected vfs: VFS; + protected saveLoadRouters: SaveLoadRouter[]; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected profileFilepath: string; + protected profiles: {}; + protected onSave: {}; + protected saveMd5: {}; + constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger); + load(): void; + save(): void; + getProfile(sessionId: string): IAkiProfile; + getProfiles(): Record; + deleteProfileById(sessionID: string): boolean; + createProfile(profileInfo: Info): void; + addProfile(profileDetails: IAkiProfile): void; + loadProfile(sessionID: string): void; + saveProfile(sessionID: string): void; + removeProfile(sessionID: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/FenceService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/FenceService.d.ts new file mode 100644 index 0000000..12723fb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/FenceService.d.ts @@ -0,0 +1,39 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { FenceLevel } from "../models/eft/common/IGlobals"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class FenceService { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected fenceAssort: ITraderAssort; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, presetHelper: PresetHelper, configServer: ConfigServer); + protected setFenceAssort(fenceAssort: ITraderAssort): void; + getFenceAssorts(): ITraderAssort; + hasExpiredCache(refreshAssort: boolean): boolean; + generateFenceAssortCache(pmcData: IPmcData): void; + /** + * + * @param pmcData Get the fence level the passed in profile has + * @returns FenceLevel + */ + getFenceInfo(pmcData: IPmcData): FenceLevel; + removeFenceOffer(assortIdToRemove: string): void; + updateFenceOffers(pmcData: IPmcData): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/HashCacheService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/HashCacheService.d.ts new file mode 100644 index 0000000..5320f28 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/HashCacheService.d.ts @@ -0,0 +1,19 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +export declare class HashCacheService { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected jsonHashes: any; + protected modHashes: any; + protected readonly modCachePath = "./user/cache/modCache.json"; + constructor(vfs: VFS, hashUtil: HashUtil, jsonUtil: JsonUtil, logger: ILogger); + getStoredModHash(modName: string): string; + modContentMatchesStoredHash(modName: string, modContent: string): boolean; + hashMatchesStoredHash(modName: string, modHash: string): boolean; + storeModContent(modName: string, modContent: string): void; + storeModHash(modName: string, modHash: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/InsuranceService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/InsuranceService.d.ts new file mode 100644 index 0000000..0219816 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/InsuranceService.d.ts @@ -0,0 +1,42 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { SecureContainerHelper } from "../helpers/SecureContainerHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected secureContainerHelper: SecureContainerHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected traderHelper: TraderHelper; + protected dialogueHelper: DialogueHelper; + protected configServer: ConfigServer; + protected insured: Record>; + protected templatesById: {}; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, secureContainerHelper: SecureContainerHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, saveServer: SaveServer, traderHelper: TraderHelper, dialogueHelper: DialogueHelper, configServer: ConfigServer); + insuranceExists(sessionId: string): boolean; + insuranceTraderArrayExists(sessionId: string, traderId: string): boolean; + getInsurance(sessionId: string): Record; + getInsuranceItems(sessionId: string, traderId: string): any[]; + resetInsurance(sessionId: string): void; + resetInsuranceTraderArray(sessionId: string, traderId: string): void; + addInsuranceItemToArray(sessionId: string, traderId: string, itemToAdd: any): void; + getItemPrice(_tpl: string): number; + generateTemplatesById(): void; + sendInsuredItems(pmcData: IPmcData, sessionID: string): void; + storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + protected addGearToSend(pmcData: IPmcData, insuredItem: any, actualItem: any, sessionID: string): any; + getPremium(pmcData: IPmcData, inventoryItem: Item, traderId: string): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/MatchLocationService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/MatchLocationService.d.ts new file mode 100644 index 0000000..2b5fc0e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/MatchLocationService.d.ts @@ -0,0 +1,8 @@ +import { TimeUtil } from "../utils/TimeUtil"; +export declare class MatchLocationService { + protected timeUtil: TimeUtil; + protected locations: {}; + constructor(timeUtil: TimeUtil); + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/ModCompilerService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/ModCompilerService.d.ts new file mode 100644 index 0000000..26cb4ac --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/ModCompilerService.d.ts @@ -0,0 +1,20 @@ +import * as ts from "typescript"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { VFS } from "../utils/VFS"; +import { HashCacheService } from "./HashCacheService"; +export declare class ModCompilerService { + protected logger: ILogger; + protected hashCacheService: HashCacheService; + protected vfs: VFS; + constructor(logger: ILogger, hashCacheService: HashCacheService, vfs: VFS); + compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise; + protected compile(fileNames: string[], options: ts.CompilerOptions): Promise; + protected buildDepth(depth: number): string; + protected getNodesModulesPath(depth: number): string; + protected getAkiPath(depth: number): string; + protected getAkiFolder(): string; + protected getNodesModulesFolder(): string; + protected calculateDepth(file: string): number; + protected areFilesReady(fileNames: string[]): boolean; + protected delay(ms: number): Promise; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/NotificationService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/NotificationService.d.ts new file mode 100644 index 0000000..7e2a127 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/NotificationService.d.ts @@ -0,0 +1,21 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +export declare class NotificationService { + protected messageQueue: {}; + getMessageQueue(): {}; + getMessageFromQueue(sessionId: string): any; + updateMessageOnQueue(sessionId: string, value: any[]): void; + has(sessionID: string): boolean; + /** + * Pop first message from queue. + */ + pop(sessionID: string): any; + /** + * Add message to queue + */ + add(sessionID: string, message: INotification): void; + /** + * Get message queue for session + * @param sessionID + */ + get(sessionID: string): any; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/PaymentService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/PaymentService.d.ts new file mode 100644 index 0000000..5834750 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/PaymentService.d.ts @@ -0,0 +1,49 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PaymentService { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + /** + * Take money and insert items into return to server request + * @param {Object} pmcData + * @param {Object} body + * @param {string} sessionID + * @returns Object + */ + payMoney(pmcData: IPmcData, body: IProcessBuyTradeRequestData, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Receive money back after selling + * @param {IPmcData} pmcData + * @param {number} amount + * @param {IProcessSellTradeRequestData} body + * @param {IItemEventRouterResponse} output + * @param {string} sessionID + * @returns IItemEventRouterResponse + */ + getMoney(pmcData: IPmcData, amount: number, body: IProcessSellTradeRequestData, output: IItemEventRouterResponse, sessionID: string): IItemEventRouterResponse; + /** + * Recursively checks if the given item is + * inside the stash, that is it has the stash as + * ancestor with slotId=hideout + */ + protected isItemInStash(pmcData: IPmcData, item: Item): boolean; + addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/PlayerService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/PlayerService.d.ts new file mode 100644 index 0000000..519b7e5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/PlayerService.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPlayerIncrementSkillLevelRequestData } from "../models/eft/player/IPlayerIncrementSkillLevelRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PlayerService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, databaseServer: DatabaseServer); + /** + * increases the profile skill and updates any output + * @param {Object} pmcData + * @param {Object} output + * @param {String} skillName + * @param {Number} amount + */ + incrementSkillLevel(pmcData: IPmcData, output: IPlayerIncrementSkillLevelRequestData, skillName: string, amount: number): void; + /** + * @param {Object} pmcData + * @returns number + */ + calculateLevel(pmcData: IPmcData): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairCategoriesService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairCategoriesService.d.ts new file mode 100644 index 0000000..09956cc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairCategoriesService.d.ts @@ -0,0 +1,10 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +export declare class RagfairCategoriesService { + updateCategories(offers: IRagfairOffer[]): void; + protected categories: Record; + getCategories(): Record; + getCategoryByItemId(itemId: string): number; + resetCategories(): void; + setCategoryValue(itemId: string, newValue: number): void; + incrementCategory(itemId: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairLinkedItemService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairLinkedItemService.d.ts new file mode 100644 index 0000000..6c34ee0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairLinkedItemService.d.ts @@ -0,0 +1,10 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +export declare class RagfairLinkedItemService { + protected databaseServer: DatabaseServer; + protected linkedItemsCache: Record>; + constructor(databaseServer: DatabaseServer); + getLinkedItems(linkedSearchId: string): Iterable; + protected buildLinkedItemTable(): void; + protected getFilters(item: ITemplateItem, slot: string): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairOfferService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairOfferService.d.ts new file mode 100644 index 0000000..7afbf8c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairOfferService.d.ts @@ -0,0 +1,66 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairOfferService { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected ragfairServerHelper: RagfairServerHelper; + protected profileHelper: ProfileHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected playerOffersLoaded: boolean; + protected toUpdate: Record; + protected expiredOffers: Item[]; + protected offers: IRagfairOffer[]; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, configServer: ConfigServer); + getOffers(): IRagfairOffer[]; + getOfferByOfferId(offerId: string): IRagfairOffer; + getOffersOfType(templateId: string): IRagfairOffer[]; + addOffer(offer: IRagfairOffer): void; + addOfferToExpired(offer: Item): void; + setTraderUpdateStatus(traderId: string, shouldUpdate: boolean): void; + shouldTraderBeUpdated(traderID: string): boolean; + getExpiredOfferCount(): number; + /** + * Get an array of expired items not yet processed into new offers + * @returns items that need to be turned into offers + */ + getExpiredOffers(): Item[]; + resetExpiredOffers(): void; + /** + * Does the offer exist on the ragfair + * @param offerId offer id to check for + * @returns offer exists - true + */ + doesOfferExist(offerId: string): boolean; + getTraders(): Record; + flagTraderForUpdate(expiredOfferUserId: string): void; + removeOfferById(offerId: string): void; + removeOfferStack(offerID: string, amount: number): void; + removeAllOffersByTrader(traderId: string): void; + addTradersToUpdateList(): void; + addPlayerOffers(): void; + expireStaleOffers(): void; + /** + * Get an array of stale offers that are still shown to player + * @returns IRagfairOffer array + */ + protected getStaleOffers(): IRagfairOffer[]; + protected isStale(offer: IRagfairOffer, time: number): boolean; + protected processStaleOffer(staleOffer: IRagfairOffer): void; + protected returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairPriceService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairPriceService.d.ts new file mode 100644 index 0000000..5256b99 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairPriceService.d.ts @@ -0,0 +1,32 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { IRagfairServerPrices } from "../models/spt/ragfair/IRagfairServerPrices"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RagfairPriceService { + protected handbookHelper: HandbookHelper; + protected databaseServer: DatabaseServer; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected prices: IRagfairServerPrices; + constructor(handbookHelper: HandbookHelper, databaseServer: DatabaseServer, logger: ILogger, itemHelper: ItemHelper, presetHelper: PresetHelper, randomUtil: RandomUtil, configServer: ConfigServer); + generateStaticPrices(): void; + generateDynamicPrices(): void; + hasDynamicPrices(): boolean; + getDynamicPrice(itemTpl: string): number; + getAllFleaPrices(): Record; + getFleaPriceForItem(tplId: string): number; + getBarterPrice(barterScheme: IBarterScheme[]): number; + getDynamicOfferPrice(items: Item[], desiredCurrency: string): number; + getWeaponPresetPrice(item: Item, items: Item[], existingPrice: number): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairRequiredItemsService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairRequiredItemsService.d.ts new file mode 100644 index 0000000..b05fc65 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/RagfairRequiredItemsService.d.ts @@ -0,0 +1,12 @@ +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairRequiredItemsService { + protected logger: ILogger; + protected paymentHelper: PaymentHelper; + protected ragfairOfferService: RagfairOfferService; + protected requiredItemsCache: {}; + constructor(logger: ILogger, paymentHelper: PaymentHelper, ragfairOfferService: RagfairOfferService); + getRequiredItems(searchId: string): any; + buildRequiredItemTable(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/TraderAssortService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/TraderAssortService.d.ts new file mode 100644 index 0000000..5ba2d05 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/TraderAssortService.d.ts @@ -0,0 +1,6 @@ +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +export declare class TraderAssortService { + protected pristineTraderAssorts: Record; + getPristineTraderAssort(traderId: string): ITraderAssort; + setPristineTraderAssort(traderId: string, assort: ITraderAssort): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts new file mode 100644 index 0000000..abfe237 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter, RouteAction } from "../../../di/Router"; +export declare class DynamicRouterMod extends DynamicRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts new file mode 100644 index 0000000..6742fc6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class DynamicRouterModService { + private container; + constructor(container: DependencyContainer); + registerDynamicRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/image/imageRouteService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/image/imageRouteService.d.ts new file mode 100644 index 0000000..29569b2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/image/imageRouteService.d.ts @@ -0,0 +1,6 @@ +export declare class ImageRouteService { + protected routes: Record; + addRoute(urlKey: string, route: string): void; + getByKey(urlKey: string): string; + existsByKey(urlKey: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts new file mode 100644 index 0000000..53fb062 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts @@ -0,0 +1,8 @@ +import { OnLoad } from "../../../di/OnLoad"; +export declare class OnLoadMod extends OnLoad { + private onLoadOverride; + private getRouteOverride; + constructor(onLoadOverride: () => void, getRouteOverride: () => string); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts new file mode 100644 index 0000000..f402103 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnLoadModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts new file mode 100644 index 0000000..ee89043 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts @@ -0,0 +1,8 @@ +import { OnUpdate } from "../../../di/OnUpdate"; +export declare class OnUpdateMod extends OnUpdate { + private onUpdateOverride; + private getRouteOverride; + constructor(onUpdateOverride: (timeSinceLastRun: number) => boolean, getRouteOverride: () => string); + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts new file mode 100644 index 0000000..05d735b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnUpdateModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts new file mode 100644 index 0000000..1e62747 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts @@ -0,0 +1,6 @@ +import { RouteAction, StaticRouter } from "../../../di/Router"; +export declare class StaticRouterMod extends StaticRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts new file mode 100644 index 0000000..f28fd45 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class StaticRouterModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/App.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/App.d.ts new file mode 100644 index 0000000..34c141e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/App.d.ts @@ -0,0 +1,14 @@ +import { TimeUtil } from "./TimeUtil"; +import { OnLoad } from "../di/OnLoad"; +import { OnUpdate } from "../di/OnUpdate"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class App { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected onLoadComponents: OnLoad[]; + protected onUpdateComponents: OnUpdate[]; + protected onUpdateLastRun: {}; + constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]); + load(): void; + protected update(onUpdateComponents: OnUpdate[]): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/AyncQueue.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/AyncQueue.d.ts new file mode 100644 index 0000000..da6ab18 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/AyncQueue.d.ts @@ -0,0 +1,7 @@ +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { ICommand } from "../models/spt/utils/ICommand"; +export declare class AsyncQueue implements IAsyncQueue { + protected commandsQueue: ICommand[]; + constructor(); + waitFor(command: ICommand): Promise; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/DatabaseImporter.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/DatabaseImporter.d.ts new file mode 100644 index 0000000..0857b67 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/DatabaseImporter.d.ts @@ -0,0 +1,18 @@ +import { VFS } from "./VFS"; +import { JsonUtil } from "./JsonUtil"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ImageRouter } from "../routers/ImageRouter"; +import { OnLoad } from "../di/OnLoad"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class DatabaseImporter extends OnLoad { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected imageRouter: ImageRouter; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter); + onLoad(): void; + getRoute(): string; + loadRecursive(filepath: string): any; + loadImages(filepath: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/HashUtil.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/HashUtil.d.ts new file mode 100644 index 0000000..bacbf2a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/HashUtil.d.ts @@ -0,0 +1,11 @@ +/// +import crypto from "crypto"; +import { TimeUtil } from "./TimeUtil"; +export declare class HashUtil { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + generate(): string; + generateMd5ForData(data: string): string; + generateSha1ForData(data: string): string; + generateHashForData(algorithm: string, data: crypto.BinaryLike): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/HttpResponseUtil.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/HttpResponseUtil.d.ts new file mode 100644 index 0000000..29502be --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/HttpResponseUtil.d.ts @@ -0,0 +1,16 @@ +import { JsonUtil } from "./JsonUtil"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class HttpResponseUtil { + protected jsonUtil: JsonUtil; + constructor(jsonUtil: JsonUtil); + protected clearString(s: string): any; + noBody(data: any): any; + getBody(data: T, err?: number, errmsg?: any): IGetBodyResponseData; + getUnclearedBody(data: any, err?: number, errmsg?: any): string; + emptyResponse(): IGetBodyResponseData; + nullResponse(): INullResponseData; + emptyArrayResponse(): IGetBodyResponseData; + appendErrorToOutput(output: IItemEventRouterResponse, message?: string, title?: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/JsonUtil.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/JsonUtil.d.ts new file mode 100644 index 0000000..71e95f6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/JsonUtil.d.ts @@ -0,0 +1,25 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "./HashUtil"; +import { VFS } from "./VFS"; +export declare class JsonUtil { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected fileHashes: any; + constructor(vfs: VFS, hashUtil: HashUtil, logger: ILogger); + /** + * From object to string + * @param data object to turn into JSON + * @param prettify Should output be prettified? + * @returns string + */ + serialize(data: any, prettify?: boolean): string; + /** + * From string to object + * @param jsonString json string to turn into object + * @returns object + */ + deserialize(jsonString: string): any; + deserializeWithCacheCheck(jsonString: string, filePath: string): string; + clone(data: T): T; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/Logger.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/Logger.d.ts new file mode 100644 index 0000000..f5b774b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/Logger.d.ts @@ -0,0 +1,51 @@ +/// +import { Daum } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ILogger } from "../models/spt/utils/ILogger"; +import winston from "winston"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +import fs from "fs"; +interface SptLogger { + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} +export declare class WinstonLogger implements ILogger { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + protected showDebugInConsole: boolean; + protected folderPath: string; + protected file: string; + protected filePath: string; + protected logLevels: { + levels: { + error: number; + warn: number; + succ: number; + info: number; + custom: number; + debug: number; + }; + colors: { + error: string; + warn: string; + succ: string; + info: string; + custom: string; + debug: string; + }; + }; + protected logger: winston.Logger & SptLogger; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + writeToLogFile(data: string | Daum): Promise; + log(data: string | Error | Record, color: string): Promise; + error(data: string | Record): Promise; + warning(data: string | Record): Promise; + success(data: string | Record): Promise; + info(data: string | Record): Promise; + debug(data: string | Record, onlyShowInConsole?: boolean): Promise; +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/MathUtil.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/MathUtil.d.ts new file mode 100644 index 0000000..ea5fd69 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/MathUtil.d.ts @@ -0,0 +1,53 @@ +export declare class MathUtil { + /** + * Helper to create the sum of all array elements + * @param {array} values The array with numbers of which to calculate the sum + * @return {number} sum(values) + */ + arraySum(values: number[]): number; + /** + * Helper to create the cumulative sum of all array elements + * arrayCumsum([1, 2, 3, 4]) = [1, 3, 6, 10] + * @param {array} values The array with numbers of which to calculate the cumulative sum + * @return {array} cumsum(values) + */ + arrayCumsum(values: number[]): number[]; + /** + * Helper to create the product of each element times factor + * @param {array} values The array of numbers which shall be multiplied by the factor + * @return {array} array times factor + */ + arrayProd(values: number[], factor: number): number[]; + /** + * Helper to add a constant to all array elements + * @param {array} values The array of numbers to which the summand should be added + * @return {array} array plus summand + */ + arrayAdd(values: number[], summand: number): number[]; + /** + * Map a value from an input range to an output range linearly + * + * Example: + * a_min = 0; a_max=1; + * b_min = 1; b_max=3; + * MathUtil.mapToRange(0.5, a_min, a_max, b_min, b_max) // returns 2 + * + * @param {number} x The value from input range to be mapped to output range + * @param {number} minIn min of input range + * @param {number} maxIn max of input range + * @param {number} minOut min of output range + * @param {number} maxOut max of outout range + * @return {number} the result of the mapping + */ + mapToRange(x: number, minIn: number, maxIn: number, minOut: number, maxOut: number): number; + /** + * Linear interpolation + * e.g. used to do a continuous integration for quest rewards which are defined for specific support centers of pmcLevel + * + * @param {string} xp the point of x at which to interpolate + * @param {array} x support points in x (of same length as y) + * @param {array} y support points in y (of same length as x) + * @return {number} y(xp) + */ + interp1(xp: number, x: number[], y: number[]): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/ObjectId.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/ObjectId.d.ts new file mode 100644 index 0000000..03aae56 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/ObjectId.d.ts @@ -0,0 +1,14 @@ +/// +import { TimeUtil } from "./TimeUtil"; +export declare class ObjectId { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + protected randomBytes: Buffer; + protected constglobalCounter: number; + protected consttime: number; + protected globalCounter: number; + protected time: number; + incGlobalCounter(): number; + toHexString(byteArray: string | any[] | Buffer): string; + generate(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/RandomUtil.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/RandomUtil.d.ts new file mode 100644 index 0000000..c24dd60 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/RandomUtil.d.ts @@ -0,0 +1,153 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "./JsonUtil"; +import { MathUtil } from "./MathUtil"; +/** + * Array of ProbabilityObjectArray which allow to randomly draw of the contained objects + * based on the relative probability of each of its elements. + * The probabilities of the contained element is not required to be normalized. + * + * Example: + * po = new ProbabilityObjectArray( + * new ProbabilityObject("a", 5), + * new ProbabilityObject("b", 1), + * new ProbabilityObject("c", 1) + * ); + * res = po.draw(10000); + * // count the elements which should be distributed according to the relative probabilities + * res.filter(x => x==="b").reduce((sum, x) => sum + 1 , 0) + */ +export declare class ProbabilityObjectArray extends Array> { + private mathUtil; + constructor(mathUtil: MathUtil, ...items: ProbabilityObject[]); + filter(callbackfn: (value: ProbabilityObject, index: number, array: ProbabilityObject[]) => any): ProbabilityObjectArray; + /** + * Calculates the normalized cumulative probability of the ProbabilityObjectArray's elements normalized to 1 + * @param {array} probValues The relative probability values of which to calculate the normalized cumulative sum + * @returns {array} Cumulative Sum normalized to 1 + */ + cumulativeProbability(probValues: number[]): number[]; + /** + * Clone this ProbabilitObjectArray + * @returns {ProbabilityObjectArray} Deep Copy of this ProbabilityObjectArray + */ + clone(): ProbabilityObjectArray; + /** + * Drop an element from the ProbabilityObjectArray + * + * @param {string} key The key of the element to drop + * @returns {ProbabilityObjectArray} ProbabilityObjectArray without the dropped element + */ + drop(key: K): ProbabilityObjectArray; + /** + * Return the data field of a element of the ProbabilityObjectArray + * @param {string} key The key of the element whose data shall be retrieved + * @returns {object} The data object + */ + data(key: K): V; + /** + * Get the relative probability of an element by its key + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @param {string} key The key of the element whose relative probability shall be retrieved + * @return {number} The relative probability + */ + probability(key: K): number; + /** + * Get the maximum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @return {number} the maximum value of all relative probabilities in this ProbabilityObjectArray + */ + maxProbability(): number; + /** + * Get the minimum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.minProbability() // returns 1 + * + * @return {number} the minimum value of all relative probabilities in this ProbabilityObjectArray + */ + minProbability(): number; + /** + * Draw random element of the ProbabilityObject N times to return an array of N keys. + * Drawing can be with or without replacement + * + * @param {integer} count The number of times we want to draw + * @param {boolean} replacement Draw with or without replacement from the input dict + * @param {array} locklist list keys which shall be replaced even if drawing without replacement + * @return {array} Array consisting of N random keys for this ProbabilityObjectArray + */ + draw(count?: number, replacement?: boolean, locklist?: Array): K[]; +} +/** + * A ProbabilityObject which is use as an element to the ProbabilityObjectArray array + * It contains a key, the relative probability as well as optional data. + */ +export declare class ProbabilityObject { + key: K; + relativeProbability: number; + data: V; + /** + * Constructor for the ProbabilityObject + * @param {string} key The key of the element + * @param {number} relativeProbability The relative probability of this element + * @param {any} data Optional data attached to the element + */ + constructor(key: K, relativeProbability: number, data?: V); +} +export declare class RandomUtil { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + constructor(jsonUtil: JsonUtil, logger: ILogger); + getInt(min: number, max: number): number; + getIntEx(max: number): number; + getFloat(min: number, max: number): number; + getBool(): boolean; + getStringArrayValue(arr: string[]): string; + getArrayValue(arr: T[]): T; + getKey(node: any): string; + getKeyValue(node: { + [x: string]: any; + }): any; + /** + * Draw from normal distribution + * @param {number} mu Mean of the normal distribution + * @param {number} sigma Standard deviation of the normal distribution + * @returns {number} The value drawn + */ + randn(mu: number, sigma: number): number; + /** + * Draw Random integer low inclusive, high exclusive + * if high is not set we draw from 0 to low (exclusive) + * @param {integer} low Lower bound inclusive, when high is not set, this is high + * @param {integer} high Higher bound exclusive + * @returns {integer} The random integer in [low, high) + */ + randInt(low: number, high?: number): number; + /** + * Draw a random element of the provided list N times to return an array of N random elements + * 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 + * @return {array} Array consisting of N random elements + */ + drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; + /** + * Draw a random (top level) element of the provided dictionary N times to return an array of N random dictionary keys + * Drawing can be with or without replacement + * @param {any} dict The dictionary 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 dict + * @return {array} Array consisting of N random keys of the dictionary + */ + drawRandomFromDict(dict: any, count?: number, replacement?: boolean): any[]; + getBiasedRandomNumber(min: number, max: number, shift: number, n: number): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/TimeUtil.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/TimeUtil.d.ts new file mode 100644 index 0000000..9733be9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/TimeUtil.d.ts @@ -0,0 +1,8 @@ +export declare class TimeUtil { + static readonly oneHourAsSeconds = 3600; + formatTime(date: Date): string; + formatDate(date: Date): string; + getDate(): string; + getTime(): string; + getTimestamp(): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/UUidGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/UUidGenerator.d.ts new file mode 100644 index 0000000..000b719 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/UUidGenerator.d.ts @@ -0,0 +1,4 @@ +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class UUidGenerator implements IUUidGenerator { + generate: () => string; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/VFS.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/VFS.d.ts new file mode 100644 index 0000000..e5eaf02 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/VFS.d.ts @@ -0,0 +1,55 @@ +/// +/// +import "reflect-metadata"; +import fs from "fs"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class VFS { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; + copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; + mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { + recursive: true; + }) => Promise; + readFilePromisify: (path: fs.PathLike) => Promise; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + readdirPromisify: (path: fs.PathLike, options?: BufferEncoding | { + encoding: BufferEncoding; + withFileTypes?: false; + }) => Promise; + statPromisify: (path: fs.PathLike, options?: fs.StatOptions & { + bigint?: false; + }) => Promise; + unlinkPromisify: (path: fs.PathLike) => Promise; + rmdirPromisify: (path: fs.PathLike) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + exists(filepath: fs.PathLike): boolean; + existsAsync(filepath: fs.PathLike): Promise; + copyFile(filepath: fs.PathLike, target: fs.PathLike): void; + copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise; + createDir(filepath: string): void; + createDirAsync(filepath: string): Promise; + copyDir(filepath: string, target: string, fileExtensions?: string | string[]): void; + copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise; + readFile(filepath: string): any; + readFileAsync(filepath: string): Promise; + writeFile(filepath: any, data?: string, append?: boolean, atomic?: boolean): void; + writeFileAsync(filepath: any, data?: string, append?: boolean, atomic?: boolean): Promise; + getFiles(filepath: string): string[]; + getFilesAsync(filepath: string): Promise; + getDirs(filepath: string): string[]; + getDirsAsync(filepath: string): Promise; + removeFile(filepath: string): void; + removeFileAsync(filepath: string): Promise; + removeDir(filepath: string): void; + removeDirAsync(filepath: string): Promise; + private lockFileSync; + private checkFileSync; + private unlockFileSync; + getFileExtension(filepath: string): string; + stripExtension(filepath: string): string; + minifyAllJsonInDirRecursive(filepath: string): Promise; + minifyAllJsonInDirRecursiveAsync(filepath: string): Promise; + getFilesOfType(directory: string, fileType: string, files?: string[]): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/Watermark.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/Watermark.d.ts new file mode 100644 index 0000000..111bdd0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/Watermark.d.ts @@ -0,0 +1,41 @@ +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WatermarkLocale { + protected locales: { + "en-US": { + description: string[]; + warning: string[]; + modding: string[]; + }; + "zh-CN": { + description: string[]; + warning: string[]; + modding: string[]; + }; + }; + getLocale(): string; + getDescription(): string[]; + getWarning(): string[]; + getModding(): string[]; +} +export declare class Watermark { + protected logger: ILogger; + protected configServer: ConfigServer; + protected watermarkLocale?: WatermarkLocale; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale); + protected text: string[]; + protected versionLabel: string; + initialize(): void; + getVersionTag(): string; + getVersionLabel(): string; + /** Set window title */ + setTitle(): void; + /** Reset console cursor to top */ + resetCursor(): void; + /** Draw the watermark */ + draw(): void; + /** Caculate text length */ + protected textLength(s: string): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/decorators/Singleton.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/decorators/Singleton.d.ts new file mode 100644 index 0000000..7e89026 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/decorators/Singleton.d.ts @@ -0,0 +1,4 @@ +import type constructor from "./constructor"; +import { InjectionToken } from "tsyringe"; +declare function singleton(token?: InjectionToken): (target: constructor) => void; +export default singleton; diff --git a/Faupi-HideoutMod/Project/src/server/dist/types/utils/decorators/constructor.d.ts b/Faupi-HideoutMod/Project/src/server/dist/types/utils/decorators/constructor.d.ts new file mode 100644 index 0000000..416f354 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/dist/types/utils/decorators/constructor.d.ts @@ -0,0 +1,4 @@ +declare type constructor = { + new (...args: any[]): T; +}; +export default constructor; diff --git a/Faupi-HideoutMod/Project/src/server/hideoutarchitect.js b/Faupi-HideoutMod/Project/src/server/hideoutarchitect.js deleted file mode 100644 index c95bd72..0000000 --- a/Faupi-HideoutMod/Project/src/server/hideoutarchitect.js +++ /dev/null @@ -1,68 +0,0 @@ -/* hideoutarchitect.js - * license: NCSA - * copyright: Faupi - * authors: - * - Faupi - */ - -"use strict"; -const path = require('path'); - -class HideoutArchitect { - constructor() { - this.mod = require("../package.json"); - this.translations = require("../res/translations.json"); - Logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); - - ModLoader.onLoad[this.mod.name] = this.init.bind(this); - } - - init(){ - this.hookRoutes(); - this.loadLocalization(); - } - - loadLocalization(){ - var globalLocale = DatabaseServer.tables.locales.global; - - for(let language in this.translations){ - if(!language in globalLocale) continue; - - let attrKvPair = this.translations[language]; - for(let attrKey in attrKvPair){ - let attrValue = attrKvPair[attrKey]; - - globalLocale[language].interface[attrKey] = attrValue; - } - } - } - - log(data){ - // console.log(data); - } - - hookRoutes(){ - HttpRouter.onStaticRoute["/HideoutArchitect/GetInfo"] = { - AttachmentOffset: this.getModInfo.bind(this) - }; - } - - getModInfo(url, info, sessionID, output){ - var output = { - status: 1, - data: null - }; - - // Don't mind this pointless try catch - try{ - output.data = {...this.mod, ...{path: path.resolve(ModLoader.getModPath(this.mod.name))}}; - output.status = 0; - }catch(ex){ - throw ex; - } - - return JsonUtil.serialize(output); - } -} - -module.exports = new HideoutArchitect(); \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/src/server/mod.code-workspace b/Faupi-HideoutMod/Project/src/server/mod.code-workspace new file mode 100644 index 0000000..6732c67 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/mod.code-workspace @@ -0,0 +1,12 @@ +{ + "folders": [ + { + "path": "." + } + ], + "extensions": { + "recommendations": [ + "dbaeumer.vscode-eslint" + ] + } +} \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/src/server/package.json b/Faupi-HideoutMod/Project/src/server/package.json new file mode 100644 index 0000000..86e779c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/package.json @@ -0,0 +1,26 @@ +{ + "name": "HideoutArchitect", + "version": "1.5.0", + "main": "./src/hideoutarchitect.js", + "license": "NCSA Open Source", + "author": "Faupi", + "akiVersion": "3.0.0", + "updated by": "CWX", + "scripts": { + "setup:environment": "npm i", + "build:unzipped": "copyfiles -e \"./node_modules/**/*.*\" -e \"./dist/**/*.*\" -e \"./package-lock.json\" -e \"./tsconfig.json\" -e \"./README.txt\" -e \"./mod.code-workspace\" ./**/*.* ./dist", + "zip:files": "cd dist/ && bestzip ../mod.zip *", + "build:zip": "npm run clean:environment && npm run build:unzipped && npm run zip:files", + "clean:environment": "node -e \"require('fs').rm('mod.zip', ()=>{})\" && node -e \"require('fs').rmdir('./dist/',{recursive:true},()=>{})\"" + }, + "devDependencies": { + "@types/node": "^14.15.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "copyfiles": "2.4.1", + "eslint": "7.26.0", + "tsyringe": "4.6.0", + "typescript": "4.6.4", + "bestzip": "2.2.1" + } +} diff --git a/Faupi-HideoutMod/Project/src/server/res/icon_neededforhideout_small.png b/Faupi-HideoutMod/Project/src/server/res/icon_neededforhideout_small.png new file mode 100644 index 0000000000000000000000000000000000000000..2c08c2c646a1055ee094c93e359c5945bfe6ca05 GIT binary patch literal 553 zcmV+^0@nSBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0lrB@K~yMHb&tJE zBS9F(-`TiHmc-p?(2E~Ya#tlWVj2q(JUG7!L9wv$AJFbjID0KU(bmpJu#KhKXoNda zL=jPo^E(7LXmri$ZpLiJcS4F=P9OL&GtWHFe82~CBi)rv&SdXY%o<*au+V^#cgYop z=r0PT$p7M{P-LjS#rKU0>WRkGZ6iG3v-6Mes;ZH}NpXwHJC3kseF5hRBPc!}S}!_IP{6aO;aHxup<8co}w z0WuO>{c(DrU6~179U+%Un$(4>Q(d#o^+n~y_7p4SW^0ote{$D!0hdYS z9-&Bqj3ioF_D*B@#{yJGB;t}CVBNUc>d)f?J@q<=q4jd1fRrR$?q;mrY1Q1DQE6tA z9|WME6)h}m;`BFSD{u*amva|SDf8CK1GPlTxcR8&bR15REMhBg3EA`KEy?fHgWXyF~_N}7NA3^7Y7n*iPb;{m8fE5%>K00000NkvXXu0mjfG1BpS literal 0 HcmV?d00001 diff --git a/Faupi-HideoutMod/Project/src/server/res/translations.json b/Faupi-HideoutMod/Project/src/server/res/translations.json new file mode 100644 index 0000000..0c42800 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/res/translations.json @@ -0,0 +1,47 @@ +{ + "en": { + "NEEDED FOR HIDEOUT": "Needed for hideout" + }, + "cz": { + "NEEDED FOR HIDEOUT": "Potřebné pro úkryt" + }, + "pl": { + "NEEDED FOR HIDEOUT": "Potrzebne do kryjówki" + }, + "po": { + "NEEDED FOR HIDEOUT": "Necessário para esconderijo" + }, + "ch": { + "NEEDED FOR HIDEOUT": "藏身之处所需" + }, + "ru": { + "NEEDED FOR HIDEOUT": "Необходим для укрытия" + }, + "es": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "es-mx": { + "NEEDED FOR HIDEOUT": "Se necesita para el escondite" + }, + "ge": { + "NEEDED FOR HIDEOUT": "Benötigt für Versteck" + }, + "sk": { + "NEEDED FOR HIDEOUT": "Potrebné pre úkryt" + }, + "tu": { + "NEEDED FOR HIDEOUT": "saklanmak için gerekli" + }, + "it": { + "NEEDED FOR HIDEOUT": "Necessario per il nascondiglio" + }, + "jp": { + "NEEDED FOR HIDEOUT": "アジトに必要なもの" + }, + "fr": { + "NEEDED FOR HIDEOUT": "Nécessaire pour la cachette" + }, + "hu": { + "NEEDED FOR HIDEOUT": "Rejtekhelyhez szükséges" + } +} \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/src/server/src/hideoutarchitect.ts b/Faupi-HideoutMod/Project/src/server/src/hideoutarchitect.ts new file mode 100644 index 0000000..948483c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/src/hideoutarchitect.ts @@ -0,0 +1,94 @@ +import type { DependencyContainer } from "tsyringe"; +import { IMod } from "@spt-aki/models/external/mod"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; +import { DynamicRouterModService } from "@spt-aki/services/mod/dynamicRouter/DynamicRouterModService" +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer" +import { JsonUtil } from "@spt-aki/utils/JsonUtil" +import { InitialModLoader } from "@spt-aki/loaders/InitialModLoader" + +class HideoutArchitect implements IMod +{ + private path; + private logger: ILogger; + private database: DatabaseServer; + private router: DynamicRouterModService; + private json: JsonUtil; + private globalLocale; + private modLoader: InitialModLoader; + private mod; + private translations; + private table; + + public load(container: DependencyContainer) + { + this.logger = container.resolve("WinstonLogger"); + this.router = container.resolve("DynamicRouterModService"); + this.path = require("path"); + this.json = container.resolve("JsonUtil"); + this.mod = require("../package.json"); + this.translations = require("../res/translations.json"); + this.logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); + this.hookRoutes(); + + } + + public delayedLoad(container: DependencyContainer) + { + this.modLoader = container.resolve("InitialModLoader"); + this.database = container.resolve("DatabaseServer"); + this.table = this.database.getTables(); + this.globalLocale = this.table.locales.global; + this.loadLocalization(); + } + + private loadLocalization() + { + for (const language in this.translations) + { + if (!(language in this.globalLocale)) + { + continue; + } + + const attrKvPair = this.translations[language]; + for (const attrKey in attrKvPair) + { + const attrValue = attrKvPair[attrKey]; + + this.globalLocale[language].interface[attrKey] = attrValue; + } + } + } + + private hookRoutes() + { + this.router.registerDynamicRouter( + "HideoutArchitect", + [ + { + url: "/HideoutArchitect/GetInfo", + action: (url, info, sessionId, output) => + { + return this.getModInfo(url, info, sessionId, output) + } + } + ], + "HideoutArchitect" + ) + } + + private getModInfo(url: string, info: any, sessionId: string, output: string) + { + const modOutput = { + status: 1, + data: null + }; + + modOutput.data = {...this.mod, ...{path: this.path.resolve(this.modLoader.getModPath(this.mod.name))}}; + modOutput.status = 0; + + return this.json.serialize(modOutput); + } +} + +module.exports = { mod: new HideoutArchitect() }; \ No newline at end of file diff --git a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/tsconfig.json b/Faupi-HideoutMod/Project/src/server/tsconfig.json similarity index 72% rename from Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/tsconfig.json rename to Faupi-HideoutMod/Project/src/server/tsconfig.json index 8ba3117..8151310 100644 --- a/Faupi-HideoutMod/Project/Built/Faupi-HideoutArchitect/user/mods/HideoutArchitect/tsconfig.json +++ b/Faupi-HideoutMod/Project/src/server/tsconfig.json @@ -8,8 +8,12 @@ "downlevelIteration": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "resolveJsonModule": true, - "outDir": "out" + "resolveJsonModule": true, + "outDir": "tmp", + "baseUrl": ".", + "paths": { + "@spt-aki/*": ["./types/*"] + } }, "lib": [ "es2020" diff --git a/Faupi-HideoutMod/Project/src/server/types/Program.d.ts b/Faupi-HideoutMod/Project/src/server/types/Program.d.ts new file mode 100644 index 0000000..d4b71b9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/Program.d.ts @@ -0,0 +1,4 @@ +export declare class Program { + constructor(); + start(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/TYPES.d.ts b/Faupi-HideoutMod/Project/src/server/types/TYPES.d.ts new file mode 100644 index 0000000..6407c3a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/TYPES.d.ts @@ -0,0 +1,3 @@ +export declare const TYPES: { + [name: string]: symbol; +}; diff --git a/Faupi-HideoutMod/Project/src/server/types/Utils.d.ts b/Faupi-HideoutMod/Project/src/server/types/Utils.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/BotCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/BotCallbacks.d.ts new file mode 100644 index 0000000..2db60dc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/BotCallbacks.d.ts @@ -0,0 +1,15 @@ +import { BotController } from "../controllers/BotController"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BotCallbacks { + protected botController: BotController; + protected httpResponse: HttpResponseUtil; + constructor(botController: BotController, httpResponse: HttpResponseUtil); + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/BundleCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/BundleCallbacks.d.ts new file mode 100644 index 0000000..b28abe1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/BundleCallbacks.d.ts @@ -0,0 +1,18 @@ +import { BundleLoader } from "../loaders/BundleLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BundleCallbacks { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, bundleLoader: BundleLoader, configServer: ConfigServer); + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/CustomizationCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/CustomizationCallbacks.d.ts new file mode 100644 index 0000000..3bab8c0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/CustomizationCallbacks.d.ts @@ -0,0 +1,23 @@ +import { CustomizationController } from "../controllers/CustomizationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class CustomizationCallbacks { + protected customizationController: CustomizationController; + protected saveServer: SaveServer; + protected httpResponse: HttpResponseUtil; + constructor(customizationController: CustomizationController, saveServer: SaveServer, httpResponse: HttpResponseUtil); + getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<{ + _id: string; + suites: string[]; + }>; + getTraderSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/DataCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/DataCallbacks.d.ts new file mode 100644 index 0000000..cfb1c16 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/DataCallbacks.d.ts @@ -0,0 +1,32 @@ +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGlobals } from "../models/eft/common/IGlobals"; +import { ICustomizationItem } from "../models/eft/common/tables/ICustomizationItem"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IHideoutArea } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../models/eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../models/eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../models/eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../models/spt/server/ILocaleBase"; +import { ISettingsBase } from "../models/spt/server/ISettingsBase"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DataCallbacks { + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer); + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/DialogueCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/DialogueCallbacks.d.ts new file mode 100644 index 0000000..634f90b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/DialogueCallbacks.d.ts @@ -0,0 +1,45 @@ +import { DialogueController } from "../controllers/DialogueController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../models/eft/dialog/IFriendRequestData"; +import { IGetAllAttachmentsRequestData } from "../models/eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetChatServerListRequestData } from "../models/eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogInfoRequestData } from "../models/eft/dialog/IGetMailDialogInfoRequestData"; +import { IGetMailDialogListRequestData } from "../models/eft/dialog/IGetMailDialogListRequestData"; +import { IGetMailDialogViewRequestData } from "../models/eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IPinDialogRequestData } from "../models/eft/dialog/IPinDialogRequestData"; +import { IRemoveDialogRequestData } from "../models/eft/dialog/IRemoveDialogRequestData"; +import { ISendMessageRequest } from "../models/eft/dialog/ISendMessageRequest"; +import { ISetDialogReadRequestData } from "../models/eft/dialog/ISetDialogReadRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { DialogueInfo } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class DialogueCallbacks extends OnUpdate { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected dialogueController: DialogueController; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController); + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/GameCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/GameCallbacks.d.ts new file mode 100644 index 0000000..d5cad76 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/GameCallbacks.d.ts @@ -0,0 +1,24 @@ +import { GameController } from "../controllers/GameController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IGameEmptyCrcRequestData } from "../models/eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../models/eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class GameCallbacks { + protected httpResponse: HttpResponseUtil; + protected watermark: Watermark; + protected gameController: GameController; + constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController); + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} +export { GameCallbacks }; diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/HandbookCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/HandbookCallbacks.d.ts new file mode 100644 index 0000000..891e375 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/HandbookCallbacks.d.ts @@ -0,0 +1,8 @@ +import { HandbookController } from "../controllers/HandbookController"; +import { OnLoad } from "../di/OnLoad"; +export declare class HandbookCallbacks extends OnLoad { + protected handbookController: HandbookController; + constructor(handbookController: HandbookController); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/HealthCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/HealthCallbacks.d.ts new file mode 100644 index 0000000..8f7b89d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/HealthCallbacks.d.ts @@ -0,0 +1,20 @@ +import { HealthController } from "../controllers/HealthController"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class HealthCallbacks { + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected healthController: HealthController; + constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController); + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/HideoutCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/HideoutCallbacks.d.ts new file mode 100644 index 0000000..99ab4c9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/HideoutCallbacks.d.ts @@ -0,0 +1,33 @@ +import { HideoutController } from "../controllers/HideoutController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../models/eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HideoutCallbacks extends OnUpdate { + protected hideoutController: HideoutController; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(hideoutController: HideoutController, // TODO: delay needed + configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/HttpCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/HttpCallbacks.d.ts new file mode 100644 index 0000000..94c97bd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/HttpCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoad } from "../di/OnLoad"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class HttpCallbacks extends OnLoad { + protected httpServer: IHttpServer; + constructor(httpServer: IHttpServer); + onLoad(): void; + getRoute(): string; + getImage(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/InraidCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/InraidCallbacks.d.ts new file mode 100644 index 0000000..05bcce4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/InraidCallbacks.d.ts @@ -0,0 +1,23 @@ +import { InraidController } from "../controllers/InraidController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IAirdropConfig } from "../models/spt/config/IAirdropConfig"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InraidCallbacks { + protected inraidController: InraidController; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected airdropConfig: IAirdropConfig; + protected inraidConfig: IInRaidConfig; + constructor(inraidController: InraidController, httpResponse: HttpResponseUtil, configServer: ConfigServer); + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/InsuranceCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/InsuranceCallbacks.d.ts new file mode 100644 index 0000000..520d0eb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/InsuranceCallbacks.d.ts @@ -0,0 +1,24 @@ +import { InsuranceController } from "../controllers/InsuranceController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InsuranceCallbacks extends OnLoadOnUpdate { + protected insuranceController: InsuranceController; + protected insuranceService: InsuranceService; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer); + onLoad(): void; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(secondsSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/InventoryCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/InventoryCallbacks.d.ts new file mode 100644 index 0000000..9ab1486 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/InventoryCallbacks.d.ts @@ -0,0 +1,39 @@ +import { InventoryController } from "../controllers/InventoryController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class InventoryCallbacks { + protected inventoryController: InventoryController; + constructor(inventoryController: InventoryController); + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/ItemEventCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/ItemEventCallbacks.d.ts new file mode 100644 index 0000000..f4f04f9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/ItemEventCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class ItemEventCallbacks { + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter); + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/LauncherCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/LauncherCallbacks.d.ts new file mode 100644 index 0000000..c022325 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/LauncherCallbacks.d.ts @@ -0,0 +1,28 @@ +import { LauncherController } from "../controllers/LauncherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../models/eft/launcher/IRemoveProfileData"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class LauncherCallbacks { + protected httpResponse: HttpResponseUtil; + protected launcherController: LauncherController; + protected saveServer: SaveServer; + protected watermark: Watermark; + constructor(httpResponse: HttpResponseUtil, launcherController: LauncherController, saveServer: SaveServer, watermark: Watermark); + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getServerVersion(): string; + ping(url: string, info: IEmptyRequestData, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} +export { LauncherCallbacks }; diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/LocationCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/LocationCallbacks.d.ts new file mode 100644 index 0000000..cc69369 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/LocationCallbacks.d.ts @@ -0,0 +1,14 @@ +import { LocationController } from "../controllers/LocationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetLocationRequestData } from "../models/eft/location/IGetLocationRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class LocationCallbacks { + protected httpResponse: HttpResponseUtil; + protected locationController: LocationController; + constructor(httpResponse: HttpResponseUtil, locationController: LocationController); + getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/MatchCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/MatchCallbacks.d.ts new file mode 100644 index 0000000..083c1f5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/MatchCallbacks.d.ts @@ -0,0 +1,35 @@ +import { MatchController } from "../controllers/MatchController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class MatchCallbacks { + protected httpResponse: HttpResponseUtil; + protected jsonUtil: JsonUtil; + protected matchController: MatchController; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, jsonUtil: JsonUtil, matchController: MatchController, databaseServer: DatabaseServer); + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: IGetProfileRequestData, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/ModCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/ModCallbacks.d.ts new file mode 100644 index 0000000..866abf7 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/ModCallbacks.d.ts @@ -0,0 +1,22 @@ +import { OnLoad } from "../di/OnLoad"; +import { DelayedModLoader } from "../loaders/DelayedModLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +declare class ModCallbacks extends OnLoad { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected modLoader: DelayedModLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, modLoader: DelayedModLoader, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} +export { ModCallbacks }; diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/NoteCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/NoteCallbacks.d.ts new file mode 100644 index 0000000..d39d400 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/NoteCallbacks.d.ts @@ -0,0 +1,11 @@ +import { NoteController } from "../controllers/NoteController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +export declare class NoteCallbacks { + protected noteController: NoteController; + constructor(noteController: NoteController); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/NotifierCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/NotifierCallbacks.d.ts new file mode 100644 index 0000000..cd1e736 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/NotifierCallbacks.d.ts @@ -0,0 +1,24 @@ +import { NotifierController } from "../controllers/NotifierController"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../models/eft/notifier/ISelectProfileRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class NotifierCallbacks { + protected httpServerHelper: HttpServerHelper; + protected httpResponse: HttpResponseUtil; + protected notifierController: NotifierController; + constructor(httpServerHelper: HttpServerHelper, httpResponse: HttpResponseUtil, notifierController: NotifierController); + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(_sessionID: string, req: any, resp: any, _data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/PresetBuildCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/PresetBuildCallbacks.d.ts new file mode 100644 index 0000000..8a0c155 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/PresetBuildCallbacks.d.ts @@ -0,0 +1,15 @@ +import { PresetBuildController } from "../controllers/PresetBuildController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PresetBuildCallbacks { + protected httpResponse: HttpResponseUtil; + protected presetBuildController: PresetBuildController; + constructor(httpResponse: HttpResponseUtil, presetBuildController: PresetBuildController); + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/PresetCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/PresetCallbacks.d.ts new file mode 100644 index 0000000..4553f8f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/PresetCallbacks.d.ts @@ -0,0 +1,8 @@ +import { PresetController } from "../controllers/PresetController"; +import { OnLoad } from "../di/OnLoad"; +export declare class PresetCallbacks extends OnLoad { + protected presetController: PresetController; + constructor(presetController: PresetController); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/ProfileCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/ProfileCallbacks.d.ts new file mode 100644 index 0000000..116e7c5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/ProfileCallbacks.d.ts @@ -0,0 +1,30 @@ +import { ProfileController } from "../controllers/ProfileController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IGetMiniProfileRequestData } from "../models/eft/launcher/IGetMiniProfileRequestData"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileCallbacks { + protected httpResponse: HttpResponseUtil; + protected timeUtil: TimeUtil; + protected profileController: ProfileController; + constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, profileController: ProfileController); + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/QuestCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/QuestCallbacks.d.ts new file mode 100644 index 0000000..559c29e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/QuestCallbacks.d.ts @@ -0,0 +1,26 @@ +import { QuestController } from "../controllers/QuestController"; +import { RepeatableQuestController } from "../controllers/RepeatableQuestController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IListQuestsRequestData } from "../models/eft/quests/IListQuestsRequestData"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class QuestCallbacks { + protected httpResponse: HttpResponseUtil; + protected questController: QuestController; + protected repeatableQuestController: RepeatableQuestController; + constructor(httpResponse: HttpResponseUtil, questController: QuestController, repeatableQuestController: RepeatableQuestController); + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/RagfairCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/RagfairCallbacks.d.ts new file mode 100644 index 0000000..d5bab8b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/RagfairCallbacks.d.ts @@ -0,0 +1,39 @@ +import { RagfairController } from "../controllers/RagfairController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAddOfferRequestData } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IRemoveOfferRequestData } from "../models/eft/ragfair/IRemoveOfferRequestData"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected ragfairServer: RagfairServer; + protected ragfairController: RagfairController; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(httpResponse: HttpResponseUtil, logger: ILogger, jsonUtil: JsonUtil, ragfairServer: RagfairServer, ragfairController: RagfairController, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + sendReport(url: string, info: any, sessionID: string): INullResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/RepairCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/RepairCallbacks.d.ts new file mode 100644 index 0000000..63733fa --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/RepairCallbacks.d.ts @@ -0,0 +1,11 @@ +import { RepairController } from "../controllers/RepairController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +export declare class RepairCallbacks { + protected repairController: RepairController; + constructor(repairController: RepairController); + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/SaveCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/SaveCallbacks.d.ts new file mode 100644 index 0000000..bbb6e53 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/SaveCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { SaveServer } from "../servers/SaveServer"; +export declare class SaveCallbacks extends OnLoadOnUpdate { + protected saveServer: SaveServer; + constructor(saveServer: SaveServer); + onLoad(): void; + getRoute(): string; + onUpdate(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/TradeCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/TradeCallbacks.d.ts new file mode 100644 index 0000000..272ae46 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/TradeCallbacks.d.ts @@ -0,0 +1,11 @@ +import { TradeController } from "../controllers/TradeController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +export declare class TradeCallbacks { + protected tradeController: TradeController; + constructor(tradeController: TradeController); + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/TraderCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/TraderCallbacks.d.ts new file mode 100644 index 0000000..128d9b2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/TraderCallbacks.d.ts @@ -0,0 +1,18 @@ +import { TraderController } from "../controllers/TraderController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class TraderCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected traderController: TraderController; + constructor(httpResponse: HttpResponseUtil, traderController: TraderController); + onLoad(): void; + getRoute(): string; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + onUpdate(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/WeatherCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/WeatherCallbacks.d.ts new file mode 100644 index 0000000..ae784c8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/WeatherCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WeatherController } from "../controllers/WeatherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class WeatherCallbacks { + protected httpResponse: HttpResponseUtil; + protected weatherController: WeatherController; + constructor(httpResponse: HttpResponseUtil, weatherController: WeatherController); + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/callbacks/WishlistCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/callbacks/WishlistCallbacks.d.ts new file mode 100644 index 0000000..c2cc2a8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/callbacks/WishlistCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WishlistController } from "../controllers/WishlistController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +export declare class WishlistCallbacks { + protected wishlistController: WishlistController; + constructor(wishlistController: WishlistController); + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/BotController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/BotController.d.ts new file mode 100644 index 0000000..09a1788 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/BotController.d.ts @@ -0,0 +1,35 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { BotHelper } from "../helpers/BotHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +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 { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class BotController { + protected databaseServer: DatabaseServer; + protected botGenerator: BotGenerator; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + /** + * Return the number of bot loadout varieties to be generated + * @param type bot Type we want the loadout gen count for + * @returns + */ + getBotPresetGenerationLimit(type: string): number; + getBotCoreDifficulty(): IBotCore; + /** + * Get bot difficulty settings + * adjust PMC settings to ensure they engage the correct bot types + * @param type what bot the server is requesting settings for + * @param difficulty difficulty level server requested settings for + * @returns Difficulty object + */ + getBotDifficulty(type: string, difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/CustomizationController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/CustomizationController.d.ts new file mode 100644 index 0000000..a6c4730 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/CustomizationController.d.ts @@ -0,0 +1,22 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +export declare class CustomizationController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper); + getTraderSuits(traderID: string, sessionID: string): ISuit[]; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; + protected getAllTraderSuits(sessionID: string): ISuit[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/DialogueController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/DialogueController.d.ts new file mode 100644 index 0000000..b15c4b6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/DialogueController.d.ts @@ -0,0 +1,25 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { DialogueInfo, Message } from "../models/eft/profile/IAkiProfile"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DialogueController { + protected httpResponse: HttpResponseUtil; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + constructor(httpResponse: HttpResponseUtil, saveServer: SaveServer, dialogueHelper: DialogueHelper); + getFriendList(sessionID: string): IGetFriendListDataResponse; + generateDialogueList(sessionID: string): IGetBodyResponseData; + getDialogueInfo(dialogueID: string, sessionID: string): DialogueInfo; + generateDialogueView(dialogueID: string, sessionID: string): IGetMailDialogViewResponseData; + removeDialogue(dialogueID: string, sessionID: string): void; + setDialoguePin(dialogueID: string, shouldPin: boolean, sessionID: string): void; + setRead(dialogueIDs: string[], sessionID: string): void; + getAllAttachments(dialogueID: string, sessionID: string): IGetAllAttachmentsResponse; + protected messagesHaveUncollectedRewards(messages: Message[]): boolean; + protected removeExpiredItems(sessionID: string): void; + update(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/GameController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/GameController.d.ts new file mode 100644 index 0000000..b9067fa --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/GameController.d.ts @@ -0,0 +1,32 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcDataRepeatableQuest, IRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { Watermark } from "../utils/Watermark"; +export declare class GameController { + protected logger: ILogger; + protected watermark: Watermark; + protected httpServerHelper: HttpServerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, watermark: Watermark, httpServerHelper: HttpServerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void; + protected addMissingBonusesProperty(pmcProfile: IPmcData): void; + protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void; + protected addMissingWeaponRepairSkill(pmcProfile: IPmcData): void; + protected addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void; + protected addMissingArmorRepairSkill(pmcProfile: IPmcData): void; + protected fixNullTraderSalesSums(pmcProfile: IPmcData): void; + protected removeDanglingConditionCounters(pmcProfile: IPmcData): void; + protected removeDanglingBackendCounters(pmcProfile: IPmcData): void; + getGameConfig(sessionID: string): IGameConfigResponse; + getServer(): any[]; + protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/HandbookController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/HandbookController.d.ts new file mode 100644 index 0000000..52d2dd8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/HandbookController.d.ts @@ -0,0 +1,8 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class HandbookController { + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + constructor(databaseServer: DatabaseServer, handbookHelper: HandbookHelper); + load(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/HealthController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/HealthController.d.ts new file mode 100644 index 0000000..aafb8df --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/HealthController.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentService } from "../services/PaymentService"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class HealthController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected inventoryHelper: InventoryHelper; + protected healthHelper: HealthHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, healthHelper: HealthHelper); + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/HideoutController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/HideoutController.d.ts new file mode 100644 index 0000000..a8bf229 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/HideoutController.d.ts @@ -0,0 +1,57 @@ +import { HideoutHelper } from "../helpers/HideoutHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { HideoutUpgradeCompleteRequestData } from "../models/eft/hideout/HideoutUpgradeCompleteRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HideoutController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected inventoryHelper: InventoryHelper; + protected saveServer: SaveServer; + protected playerService: PlayerService; + protected presetHelper: PresetHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected hideoutHelper: HideoutHelper; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + update(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/InraidController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/InraidController.d.ts new file mode 100644 index 0000000..7f2036c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/InraidController.d.ts @@ -0,0 +1,31 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { InRaidHelper } from "../helpers/InRaidHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InraidController { + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected itemHelper: ItemHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + protected healthHelper: HealthHelper; + protected traderHelper: TraderHelper; + protected insuranceService: InsuranceService; + protected inRaidHelper: InRaidHelper; + protected configServer: ConfigServer; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, extendedProfileHelper: ExtendedProfileHelper, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer); + addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void; + saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/InsuranceController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/InsuranceController.d.ts new file mode 100644 index 0000000..db2c567 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/InsuranceController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { PaymentService } from "../services/PaymentService"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceController { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected itemEventRouter: ItemEventRouter; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected profileHelper: ProfileHelper; + protected dialogueHelper: DialogueHelper; + protected paymentService: PaymentService; + protected insuranceService: InsuranceService; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, itemEventRouter: ItemEventRouter, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required + insuranceService: InsuranceService, configServer: ConfigServer); + processReturn(): void; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + cost(info: IGetInsuranceCostRequestData, sessionID: string): any; + doAbsolutelyNothing(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/InventoryController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/InventoryController.d.ts new file mode 100644 index 0000000..b732aa9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/InventoryController.d.ts @@ -0,0 +1,107 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InventoryController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected presetHelper: PresetHelper; + protected inventoryHelper: InventoryHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter); + /** + * Move Item + * change location of item with parentId and slotId + * transfers items from one profile to another if fromOwner/toOwner is set in the body. + * otherwise, move is contained within the same profile_f. + */ + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Remove Item from Profile + * Deep tree item deletion, also removes items from insurance list + */ + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Implements functionality "Discard" from Main menu (Stash etc.) + * Removes item from PMC Profile + */ + discardItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Split Item + * spliting 1 item-stack into 2 separate items ... + */ + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Merge Item + * merges 2 items into one, deletes item from `body.item` and adding number of stacks into `body.with` + */ + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Transfer item + * Used to take items from scav inventory into stash or to insert ammo into mags (shotgun ones) and reloading weapon by clicking "Reload" + */ + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Swap Item + * its used for "reload" if you have weapon in hands and magazine is somewhere else in rig or backpack in equipment + */ + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Give Item + * its used for "add" item like gifts etc. + */ + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + /** + * Handles folding of Weapons + */ + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Toggles "Toggleable" items like night vision goggles and face shields. + */ + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles Tagging of items (primary Containers). + */ + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles examining of the item * + */ + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles sorting of Inventory. + */ + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/LauncherController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/LauncherController.d.ts new file mode 100644 index 0000000..1af1f56 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/LauncherController.d.ts @@ -0,0 +1,28 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { Info } from "../models/eft/profile/IAkiProfile"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class LauncherController { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected httpServerHelper: HttpServerHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected coreConfig: ICoreConfig; + constructor(hashUtil: HashUtil, saveServer: SaveServer, httpServerHelper: HttpServerHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + connect(): any; + find(sessionIdKey: string): Info; + login(info: ILoginRequestData): string; + register(info: IRegisterData): string; + protected createAccount(info: IRegisterData): string; + changeUsername(info: IChangeRequestData): string; + changePassword(info: IChangeRequestData): string; + wipe(info: IRegisterData): string; + getCompatibleTarkovVersion(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/LocationController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/LocationController.d.ts new file mode 100644 index 0000000..90b6d7a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/LocationController.d.ts @@ -0,0 +1,18 @@ +import { LocationGenerator } from "../generators/LocationGenerator"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class LocationController { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected locationGenerator: LocationGenerator; + protected databaseServer: DatabaseServer; + protected timeUtil: TimeUtil; + constructor(jsonUtil: JsonUtil, logger: ILogger, locationGenerator: LocationGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil); + get(location: string): ILocationBase; + generate(name: string): ILocationBase; + generateAll(): ILocationsGenerateAllResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/MatchController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/MatchController.d.ts new file mode 100644 index 0000000..c322d96 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/MatchController.d.ts @@ -0,0 +1,30 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { IMatchConfig } from "../models/spt/config/IMatchConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { MatchLocationService } from "../services/MatchLocationService"; +export declare class MatchController { + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected matchLocationService: MatchLocationService; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected matchConfig: IMatchConfig; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, configServer: ConfigServer); + getEnabled(): boolean; + getProfile(info: IGetProfileRequestData): IPmcData[]; + protected getMatch(location: any): any; + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; + joinMatch(info: any, sessionID: string): any[]; + getGroupStatus(info: any): any; + startOfflineRaid(info: IStartOfflineRaidRequestData, sessionID: string): void; + endOfflineRaid(info: IEndOfflineRaidRequestData, sessionID: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/NoteController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/NoteController.d.ts new file mode 100644 index 0000000..cc78383 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/NoteController.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +declare class NoteController { + protected itemEventRouter: ItemEventRouter; + constructor(itemEventRouter: ItemEventRouter); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} +export { NoteController }; diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/NotifierController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/NotifierController.d.ts new file mode 100644 index 0000000..31d7bfe --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/NotifierController.d.ts @@ -0,0 +1,22 @@ +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { NotificationService } from "../services/NotificationService"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +export declare class NotifierController { + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected notificationService: NotificationService; + protected pollInterval: number; + protected timeout: number; + constructor(notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, notificationService: NotificationService); + /** + * Resolve an array of session notifications. + * + * If no notifications are currently queued then intermittently check for new notifications until either + * one or more appear or when a timeout expires. + * If no notifications are available after the timeout, use a default message. + */ + notifyAsync(sessionID: string): Promise; + getServer(sessionID: string): string; + getChannel(sessionID: string): INotifierChannel; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/PresetBuildController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/PresetBuildController.d.ts new file mode 100644 index 0000000..adf4084 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/PresetBuildController.d.ts @@ -0,0 +1,18 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class PresetBuildController { + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + constructor(hashUtil: HashUtil, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, saveServer: SaveServer); + getUserBuilds(sessionID: string): WeaponBuild[]; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/PresetController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/PresetController.d.ts new file mode 100644 index 0000000..ca1af1a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/PresetController.d.ts @@ -0,0 +1,8 @@ +import { PresetHelper } from "../helpers/PresetHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetController { + protected presetHelper: PresetHelper; + protected databaseServer: DatabaseServer; + constructor(presetHelper: PresetHelper, databaseServer: DatabaseServer); + initialize(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/ProfileController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/ProfileController.d.ts new file mode 100644 index 0000000..9b7a6d5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/ProfileController.d.ts @@ -0,0 +1,34 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileController { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected traderHelper: TraderHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, traderHelper: TraderHelper, extendedProfileHelper: ExtendedProfileHelper); + getMiniProfiles(): IMiniProfile[]; + getMiniProfile(sessionID: string): any; + getCompleteProfile(sessionID: string): IPmcData[]; + createProfile(info: IProfileCreateRequestData, sessionID: string): void; + generatePlayerScav(sessionID: string): IPmcData; + validateNickname(info: IValidateNicknameRequestData, sessionID: string): string; + changeNickname(info: IProfileChangeNicknameRequestData, sessionID: string): string; + changeVoice(info: IProfileChangeVoiceRequestData, sessionID: string): void; + getFriends(info: ISearchFriendRequestData, sessionID: string): ISearchFriendResponse[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/QuestController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/QuestController.d.ts new file mode 100644 index 0000000..e588de0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/QuestController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { QuestConditionHelper } from "../helpers/QuestConditionHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class QuestController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected questHelper: QuestHelper; + protected questConditionHelper: QuestConditionHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, questConditionHelper: QuestConditionHelper, playerService: PlayerService, configServer: ConfigServer); + getClientQuests(sessionID: string): IQuest[]; + acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + acceptRepeatableQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/RagfairController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/RagfairController.d.ts new file mode 100644 index 0000000..c758593 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/RagfairController.d.ts @@ -0,0 +1,70 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairHelper } from "../helpers/RagfairHelper"; +import { RagfairOfferHelper } from "../helpers/RagfairOfferHelper"; +import { RagfairSellHelper } from "../helpers/RagfairSellHelper"; +import { RagfairSortHelper } from "../helpers/RagfairSortHelper"; +import { RagfairTaxHelper } from "../helpers/RagfairTaxHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IAddOfferRequestData, Requirement } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PaymentService } from "../services/PaymentService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + protected ragfairServer: RagfairServer; + protected ragfairPriceService: RagfairPriceService; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + protected ragfairSellHelper: RagfairSellHelper; + protected ragfairTaxHelper: RagfairTaxHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairOfferHelper: RagfairOfferHelper; + protected profileHelper: ProfileHelper; + protected paymentService: PaymentService; + protected handbookHelper: HandbookHelper; + protected paymentHelper: PaymentHelper; + protected inventoryHelper: InventoryHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter, ragfairServer: RagfairServer, ragfairPriceService: RagfairPriceService, databaseServer: DatabaseServer, itemHelper: ItemHelper, saveServer: SaveServer, ragfairSellHelper: RagfairSellHelper, ragfairTaxHelper: RagfairTaxHelper, ragfairSortHelper: RagfairSortHelper, ragfairOfferHelper: RagfairOfferHelper, profileHelper: ProfileHelper, paymentService: PaymentService, handbookHelper: HandbookHelper, paymentHelper: PaymentHelper, inventoryHelper: InventoryHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer); + getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult; + update(): void; + getItemPrice(info: IGetMarketPriceRequestData): IGetItemPriceResult; + addPlayerOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + createPlayerOffer(profile: IAkiProfile, requirements: Requirement[], items: Item[], sellInOnePiece: boolean, amountToSend: number): IRagfairOffer; + getAllFleaPrices(): Record; + removeOffer(offerId: string, sessionID: string): IItemEventRouterResponse; + extendOffer(info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/RepairController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/RepairController.d.ts new file mode 100644 index 0000000..e9458f6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/RepairController.d.ts @@ -0,0 +1,41 @@ +import { QuestHelper } from "../helpers/QuestHelper"; +import { RepairHelper } from "../helpers/RepairHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +export declare class RepairController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected traderHelper: TraderHelper; + protected paymentService: PaymentService; + protected repairHelper: RepairHelper; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, questHelper: QuestHelper, traderHelper: TraderHelper, paymentService: PaymentService, repairHelper: RepairHelper, configServer: ConfigServer); + /** + * Repair with trader + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + /** + * Repair with repair kit + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/RepeatableQuestController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/RepeatableQuestController.d.ts new file mode 100644 index 0000000..ce190aa --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/RepeatableQuestController.d.ts @@ -0,0 +1,217 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { Exit } from "../models/eft/common/ILocationBase"; +import { IPmcData, TraderInfo } from "../models/eft/common/IPmcData"; +import { ICompletion, ICompletionAvailableFor, IElimination, IEliminationCondition, IExploration, IExplorationCondition, IPmcDataRepeatableQuest, IRepeatableQuest, IReward, IRewards } from "../models/eft/common/tables/IRepeatableQuests"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { ELocationName } from "../models/enums/ELocationName"; +import { IQuestConfig, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { ProbabilityObject, ProbabilityObjectArray, RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export interface IQuestTypePool { + types: string[]; + pool: IQuestPool; +} +export interface IQuestPool { + Exploration: IExplorationPool; + Elimination: IEliminationPool; +} +export interface IExplorationPool { + locations: Partial>; +} +export interface IEliminationPool { + targets: IEliminationTargetPool; +} +export interface IEliminationTargetPool { + Savage?: ITargetLocation; + AnyPmc?: ITargetLocation; + bossBully?: ITargetLocation; + bossGluhar?: ITargetLocation; + bossKilla?: ITargetLocation; + bossSanitar?: ITargetLocation; + bossTagilla?: ITargetLocation; + bossKojaniy?: ITargetLocation; +} +export interface ITargetLocation { + locations: string[]; +} +export declare class RepeatableQuestController { + protected timeUtil: TimeUtil; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected mathUtil: MathUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected itemEventRouter: ItemEventRouter; + protected paymentService: PaymentService; + protected objectId: ObjectId; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, itemEventRouter: ItemEventRouter, paymentService: PaymentService, objectId: ObjectId, configServer: ConfigServer); + /** + * This is the method reached by the /client/repeatalbeQuests/activityPeriods endpoint + * Returns an array of objects in the format of repeatable quests to the client. + * repeatableQuestObject = { + * id: Unique Id, + * name: "Daily", + * endTime: the time when the quests expire + * activeQuests: currently available quests in an array. Each element of quest type format (see assets/database/templates/repeatableQuests.json). + * inactiveQuests: the quests which were previously active (required by client to fail them if they are not completed) + * } + * + * The method checks if the player level requirement for repeatable quests (e.g. daily lvl5, weekly lvl15) is met and if the previously active quests + * are still valid. This ischecked by endTime persisted in profile accordning to the resetTime configured for each repeatable kind (daily, weekly) + * in QuestCondig.js + * + * If the condition is met, new repeatableQuests are created, old quests (which are persisted in the profile.RepeatableQuests[i].activeQuests) are + * moved to profile.RepeatableQuests[i].inactiveQuests. This memory is required to get rid of old repeatable quest data in the profile, otherwise + * they'll litter the profile's Quests field. + * (if the are on "Succeed" but not "Completed" we keep them, to allow the player to complete them and get the rewards) + * The new quests generated are again persisted in profile.RepeatableQuests + * + * + * @param {string} sessionId Player's session id + * @returns {array} array of "repeatableQuestObjects" as descibed above + */ + getClientRepeatableQuests(_info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; + /** + * This method is called by GetClientRepeatableQuests and creates one element of quest type format (see assets/database/templates/repeatableQuests.json). + * It randomly draws a quest type (currently Elimination, Completion or Exploration) as well as a trader who is providing the quest + */ + generateRepeatableQuest(pmcLevel: number, pmcTraderInfo: Record, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest; + /** + * Just for debug reasons. Draws dailies a random assort of dailies extracted from dumps + */ + generateDebugDailies(dailiesPool: any, factory: any, number: any): any; + /** + * Generates the base object of quest type format given as templates in assets/database/templates/repeatableQuests.json + * The templates include Elimination, Completion and Extraction quest types + * + * @param {string} type quest type: "Elimination", "Completion" or "Extraction" + * @param {string} traderId trader from which the quest will be provided + * @returns {object} a object which contains the base elements for repeatable quests of the requests type + * (needs to be filled with reward and conditions by called to make a valid quest) + */ + generateRepeatableTemplate(type: string, traderId: string): IRepeatableQuest; + /** + * Generates a valid Exploration quest + * + * @param {integer} pmcLevel player's level for reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Exploration" (see assets/database/templates/repeatableQuests.json) + */ + generateExplorationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IExploration; + /** + * Generates a valid Completion quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Completion" (see assets/database/templates/repeatableQuests.json) + */ + generateCompletionQuest(pmcLevel: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): ICompletion; + /** + * Generates a valid Elimination quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Elimination" (see assets/database/templates/repeatableQuests.json) + */ + generateEliminationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IElimination; + /** + * Exploration repeatable quests can specify a required extraction point. + * This method creates the according object which will be appended to the conditions array + * + * @param {string} exit The exit name to generate the condition for + * @returns {object} Exit condition + */ + generateExplorationExitCondition(exit: Exit): IExplorationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateCompletionQuest to create a completion condition (of which a completion quest theoretically can have many) + * + * @param {string} targetItemId id of the item to request + * @param {integer} value amount of items of this specific type to request + * @returns {object} object of "Completion"-condition + */ + generateCompletionAvailableForFinish(targetItemId: string, value: number): ICompletionAvailableFor; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a location condition. + * + * @param {string} location the location on which to fulfill the elimination quest + * @returns {object} object of "Elimination"-location-subcondition + */ + generateEliminationLocation(location: string[]): IEliminationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a kill condition. + * + * @param {string} target array of target npcs e.g. "AnyPmc", "Savage" + * @param {array} bodyParts array of body parts with which to kill e.g. ["stomach", "thorax"] + * @param {number} distance distance from which to kill (currently only >= supported) + * @returns {object} object of "Elimination"-kill-subcondition + */ + generateEliminationCondition(target: string, bodyPart: string[], distance: number): IEliminationCondition; + /** + * Used to create a quest pool during each cycle of repeatable quest generation. The pool will be subsequently + * narrowed down during quest generation to avoid duplicate quests. Like duplicate extractions or elimination quests + * where you have to e.g. kill scavs in same locations. + * + * @returns {object} the quest pool + */ + generateQuestPool(repeatableConfig: IRepeatableQuestConfig): IQuestTypePool; + /** + * Generate the reward for a mission. A reward can consist of + * - Experience + * - Money + * - Items + * - Trader Reputation + * + * The reward is dependent on the player level as given by the wiki. The exact mapping of pmcLevel to + * experience / money / items / trader reputation can be defined in QuestConfig.js + * + * There's also a random variation of the reward the spread of which can be also defined in the config. + * + * Additonaly, a scaling factor w.r.t. quest difficulty going from 0.2...1 can be used + * + * @param {integer} pmcLevel player's level + * @param {number} difficulty a reward scaling factor goint from 0.2 to 1 + * @param {string} traderId the trader for reputation gain (and possible in the future filtering of reward item type based on trader) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of "Reward"-type that can be given for a repeatable mission + */ + generateReward(pmcLevel: number, difficulty: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): IRewards; + /** + * Helper to create a reward item structured as required by the client + * + * @param {string} tpl itemId of the rewarded item + * @param {integer} value amount of items to give + * @param {integer} index all rewards will be appended to a list, for unkown reasons the client wants the index + * @returns {object} object of "Reward"-item-type + */ + generateRewardItem(tpl: string, value: number, index: number, preset?: any): IReward; + debugLogRepeatableQuestIds(pmcData: IPmcData): void; + probabilityObjectArray(configArrayInput: ProbabilityObject[]): ProbabilityObjectArray; + changeRepeatableQuest(pmcDataIn: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/TradeController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/TradeController.d.ts new file mode 100644 index 0000000..c86745c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/TradeController.d.ts @@ -0,0 +1,21 @@ +import { RagfairServer } from "../servers/RagfairServer"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TradeHelper } from "../helpers/TradeHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +declare class TradeController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected tradeHelper: TradeHelper; + protected profileHelper: ProfileHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, tradeHelper: TradeHelper, profileHelper: ProfileHelper, ragfairServer: RagfairServer); + confirmTrading(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid?: boolean, upd?: Upd): IItemEventRouterResponse; + confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} +export { TradeController }; diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/TraderController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/TraderController.d.ts new file mode 100644 index 0000000..7bab158 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/TraderController.d.ts @@ -0,0 +1,26 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderAssortHelper } from "../helpers/TraderAssortHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class TraderController { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected traderAssortHelper: TraderAssortHelper; + protected profileHelper: ProfileHelper; + protected traderHelper: TraderHelper; + protected timeUtil: TimeUtil; + protected traderAssortService: TraderAssortService; + protected jsonUtil: JsonUtil; + constructor(logger: ILogger, databaseServer: DatabaseServer, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, timeUtil: TimeUtil, traderAssortService: TraderAssortService, jsonUtil: JsonUtil); + load(): void; + getTrader(traderID: string, sessionID: string): ITraderBase; + getAllTraders(sessionID: string): ITraderBase[]; + updateTraders(): boolean; + getAssort(sessionId: string, traderId: string): ITraderAssort; + getPurchasesData(traderID: string, sessionID: string): Record; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/WeatherController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/WeatherController.d.ts new file mode 100644 index 0000000..ca7f5eb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/WeatherController.d.ts @@ -0,0 +1,11 @@ +import { WeatherGenerator } from "../generators/WeatherGenerator"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WeatherController { + protected weatherGenerator: WeatherGenerator; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer); + generate(): IWeatherData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/controllers/WishlistController.d.ts b/Faupi-HideoutMod/Project/src/server/types/controllers/WishlistController.d.ts new file mode 100644 index 0000000..a96c522 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/controllers/WishlistController.d.ts @@ -0,0 +1,10 @@ +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class WishlistController { + protected itemEvenRouter: ItemEventRouter; + constructor(itemEvenRouter: ItemEventRouter); + addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/di/Container.d.ts b/Faupi-HideoutMod/Project/src/server/types/di/Container.d.ts new file mode 100644 index 0000000..17791b0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/di/Container.d.ts @@ -0,0 +1,14 @@ +import { DependencyContainer } from "tsyringe"; +export declare class Container { + static registerTypes(depContainer: DependencyContainer): void; + static registerListTypes(depContainer: DependencyContainer): void; + private static registerUtils; + private static registerRouters; + private static registerGenerators; + private static registerHelpers; + private static registerLoaders; + private static registerCallbacks; + private static registerServices; + private static registerServers; + private static registerControllers; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/di/OnLoad.d.ts b/Faupi-HideoutMod/Project/src/server/types/di/OnLoad.d.ts new file mode 100644 index 0000000..064d07d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/di/OnLoad.d.ts @@ -0,0 +1,4 @@ +export declare class OnLoad { + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/di/OnLoadOnUpdate.d.ts b/Faupi-HideoutMod/Project/src/server/types/di/OnLoadOnUpdate.d.ts new file mode 100644 index 0000000..8bd3dc3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/di/OnLoadOnUpdate.d.ts @@ -0,0 +1,7 @@ +import { OnLoad } from "./OnLoad"; +import { OnUpdate } from "./OnUpdate"; +export declare class OnLoadOnUpdate implements OnLoad, OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/di/OnUpdate.d.ts b/Faupi-HideoutMod/Project/src/server/types/di/OnUpdate.d.ts new file mode 100644 index 0000000..7fbbe09 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/di/OnUpdate.d.ts @@ -0,0 +1,4 @@ +export declare class OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/di/Router.d.ts b/Faupi-HideoutMod/Project/src/server/types/di/Router.d.ts new file mode 100644 index 0000000..2fb98e0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/di/Router.d.ts @@ -0,0 +1,40 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +export declare class Router { + private handledRoutes; + getTopLevelRoute(): string; + protected getHandledRoutes(): HandledRoute[]; + private getInternalHandledRoutes; + canHandle(url: string, partialMatch?: boolean): boolean; +} +export declare class StaticRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleStatic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class DynamicRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleDynamic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class ItemEventRouterDefinition extends Router { + constructor(); + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} +export declare class SaveLoadRouter extends Router { + constructor(); + handleLoad(profile: IAkiProfile): IAkiProfile; +} +export declare class HandledRoute { + route: string; + dynamic: boolean; + constructor(route: string, dynamic: boolean); +} +export declare class RouteAction { + url: string; + action: (url: string, info: any, sessionID: string, output: string) => any; + constructor(url: string, action: (url: string, info: any, sessionID: string, output: string) => any); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/di/Serializer.d.ts b/Faupi-HideoutMod/Project/src/server/types/di/Serializer.d.ts new file mode 100644 index 0000000..70aa7c5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/di/Serializer.d.ts @@ -0,0 +1,5 @@ +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class Serializer { + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(something: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/generators/BotGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/generators/BotGenerator.d.ts new file mode 100644 index 0000000..88a8014 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/generators/BotGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { Health as PmcHealth } from "../models/eft/common/IPmcData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { Health, Inventory, Skills } 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 { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotInventoryGenerator } from "./BotInventoryGenerator"; +declare namespace BotGenerator { + interface IRandomisedBotLevelResult { + level: number; + exp: number; + } +} +export declare class BotGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected botInventoryGenerator: BotInventoryGenerator; + protected botHelper: BotHelper; + protected gameEventHelper: GameEventHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + protected generateBot(bot: IBotBase, role: string, isPmc: boolean): IBotBase; + protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** Converts health object to the required format */ + protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; + protected generateSkills(skillsObj: Skills): Skills; + protected getPmcRole(pmcSide: string): string; + protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + protected generateId(bot: IBotBase): IBotBase; + protected generateInventoryID(profile: IBotBase): IBotBase; + protected getPMCDifficulty(requestedDifficulty: string): string; + protected generateDogtag(bot: IBotBase): IBotBase; +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/types/generators/BotInventoryGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/generators/BotInventoryGenerator.d.ts new file mode 100644 index 0000000..783d0c5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/generators/BotInventoryGenerator.d.ts @@ -0,0 +1,24 @@ +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +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"; +export declare class BotInventoryGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected botWeaponGenerator: BotWeaponGenerator; + 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(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; + protected generateInventoryBase(): PmcInventory; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/generators/BotLootGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/generators/BotLootGenerator.d.ts new file mode 100644 index 0000000..1d91836 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/generators/BotLootGenerator.d.ts @@ -0,0 +1,29 @@ +import { PMCLootGenerator } from "../generators/PMCLootGenerator"; +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { ItemMinMax, Items } from "../models/eft/common/tables/IBotType"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotLootGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected pmcLootGenerator: PMCLootGenerator; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, pmcLootGenerator: PMCLootGenerator, configServer: ConfigServer); + generateLoot(lootPool: Items, itemCounts: ItemMinMax, isPmc: boolean, inventory: PmcInventory): void; + protected getRandomisedCount(min: number, max: number, nValue: number): number; + protected addLootFromPool(pool: ITemplateItem[], equipmentSlots: string[], count: number, inventory: PmcInventory, totalValueLimit?: number, useLimits?: boolean): void; + /** Compares two item templates by their price to spawn chance ratio */ + protected compareByValue(a: ITemplateItem, b: ITemplateItem): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/generators/BotWeaponGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/generators/BotWeaponGenerator.d.ts new file mode 100644 index 0000000..13fe7df --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/generators/BotWeaponGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { MinMax, Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotWeaponGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected weightedRandomHelper: WeightedRandomHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected randomUtil: RandomUtil; + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil); + generateWeapon(equipmentSlot: string, weaponPool: Record, modPool: Mods, modChances: ModsChances, magCounts: MinMax, botRole: string, isPmc: boolean, inventory: PmcInventory): void; + /** Checks if all required slots are occupied on a weapon and all it's mods */ + protected isWeaponValid(itemList: Item[]): boolean; + /** + * Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets. + * Additionally, adds extra bullets to SecuredContainer + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @param {*} magCounts + * @param {*} ammoTpl + * @returns + */ + protected generateExtraMagazines(weaponMods: Item[], weaponTemplate: ITemplateItem, magCounts: MinMax, ammoTpl: string, inventory: PmcInventory): void; + protected addBullets(ammoTpl: string, bulletCount: number, inventory: PmcInventory): void; + /** + * Finds and returns tpl of ammo that should be used, while making sure it's compatible + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @returns + */ + protected getCompatibleAmmo(weaponMods: Item[], weaponTemplate: ITemplateItem): string; + /** Fill existing magazines to full, while replacing their contents with specified ammo */ + protected fillExistingMagazines(weaponMods: Item[], magazine: Item, ammoTpl: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/generators/LocationGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/generators/LocationGenerator.d.ts new file mode 100644 index 0000000..bd368b5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/generators/LocationGenerator.d.ts @@ -0,0 +1,46 @@ +import { ContainerHelper } from "../helpers/ContainerHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { ILooseLoot, SpawnpointTemplate } from "../models/eft/common/ILooseLoot"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "../models/eft/common/tables/ILootBase"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILocationConfig } from "../models/spt/config/ILocationConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { RandomUtil } from "../utils/RandomUtil"; +export interface IContainerItem { + items: Item[]; + width: number; + height: number; +} +export declare class LocationGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected objectId: ObjectId; + protected randomUtil: RandomUtil; + protected ragfairServerHelper: RagfairServerHelper; + protected itemHelper: ItemHelper; + protected mathUtil: MathUtil; + protected gameEventHelper: GameEventHelper; + protected containerHelper: ContainerHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected locationConfig: ILocationConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, objectId: ObjectId, randomUtil: RandomUtil, ragfairServerHelper: RagfairServerHelper, itemHelper: ItemHelper, mathUtil: MathUtil, gameEventHelper: GameEventHelper, containerHelper: ContainerHelper, presetHelper: PresetHelper, configServer: ConfigServer); + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + protected getLooseLootMultiplerForLocation(location: string): number; + protected getStaticLootMultiplerForLocation(location: string): number; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; + protected createItem(tpl: string, staticAmmoDist: Record, parentId?: string): IContainerItem; + protected getRandomCompatibleCaliberTemplateId(item: ITemplateItem): string; + protected getRandomValidCaliber(magTemplate: ITemplateItem): string; + protected drawAmmoTpl(caliber: string, staticAmmoDist: Record): string; + protected createRandomMagCartridges(magTemplate: ITemplateItem, parentId: string, staticAmmoDist: Record, caliber?: string): Item; + protected createCartidges(parentId: string, ammoTpl: string, stackCount: number): Item; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/generators/PMCLootGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/generators/PMCLootGenerator.d.ts new file mode 100644 index 0000000..64e6f7f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/generators/PMCLootGenerator.d.ts @@ -0,0 +1,15 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +export declare class PMCLootGenerator { + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected pocketLootPool: string[]; + protected backpackLootPool: string[]; + protected botConfig: IBotConfig; + constructor(itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/generators/RagfairAssortGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/generators/RagfairAssortGenerator.d.ts new file mode 100644 index 0000000..cbdd7f2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/generators/RagfairAssortGenerator.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairAssortGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected generatedAssortItems: Item[]; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + /** + * Get an array of unique items that can be sold on the flea + * @returns array of unique items + */ + getAssortItems(): Item[]; + protected assortsAreGenerated(): boolean; + /** + * Generate an array of items the flea can sell + * @returns array of unique items + */ + protected generateRagfairAssortItems(): Item[]; + protected createRagfairAssortItem(tplId: string, id?: string): Item; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/generators/RagfairOfferGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/generators/RagfairOfferGenerator.d.ts new file mode 100644 index 0000000..de53ea9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/generators/RagfairOfferGenerator.d.ts @@ -0,0 +1,60 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { RagfairAssortGenerator } from "./RagfairAssortGenerator"; +export declare class RagfairOfferGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected saveServer: SaveServer; + protected presetHelper: PresetHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairPriceService: RagfairPriceService; + protected fenceService: FenceService; + protected itemHelper: ItemHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer); + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; + protected getTraderId(userID: string): string; + protected getRating(userID: string): number; + protected getRatingGrowing(userID: string): boolean; + protected getOfferEndTime(userID: string, time: number): number; + /** + * Create multiple offers for items by using a unique list of items we've generated previously + * @param expiredOffers + */ + generateDynamicOffers(expiredOffers?: Item[]): void; + generateTraderOffers(traderID: string): void; + protected getItemCondition(userID: string, items: Item[], itemDetails: ITemplateItem): Item[]; + protected addMissingCondition(item: Item): Item; + protected getOfferRequirements(items: Item[]): { + count: number; + _tpl: string; + }[]; + /** + * Create a flea offer and store it in the Ragfair server offers array + */ + createFleaOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/generators/WeatherGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/generators/WeatherGenerator.d.ts new file mode 100644 index 0000000..23aa169 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/generators/WeatherGenerator.d.ts @@ -0,0 +1,20 @@ +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class WeatherGenerator { + protected weightedRandomHelper: WeightedRandomHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateTime(data: IWeatherData): IWeatherData; + generateWeather(data: IWeatherData): IWeatherData; + protected getWeightedFog(): string; + protected getWeightedRain(): number; + protected getRandomFloat(node: string): number; + protected getRandomInt(node: string): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/AssortHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/AssortHelper.d.ts new file mode 100644 index 0000000..15586b9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/AssortHelper.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ItemHelper } from "./ItemHelper"; +import { QuestHelper } from "./QuestHelper"; +export declare class AssortHelper { + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + constructor(logger: ILogger, itemHelper: ItemHelper, databaseServer: DatabaseServer, questHelper: QuestHelper); + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort assort items from a trader + * @returns assort items minus locked quest assorts + */ + stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort traders assorts + * @returns traders assorts minus locked loyality assorts + */ + stripLockedLoyaltyAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove an item from an assort + * @param assort assort to modify + * @param itemID item id to remove from asort + * @returns Modified assort + */ + removeItemFromAssort(assort: ITraderAssort, itemID: string): ITraderAssort; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/BotGeneratorHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/BotGeneratorHelper.d.ts new file mode 100644 index 0000000..c382fc9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/BotGeneratorHelper.d.ts @@ -0,0 +1,95 @@ +import { DurabilityLimitsHelper } from "../helpers/DurabilityLimitsHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item, Repairable, Upd } from "../models/eft/common/tables/IItem"; +import { Grid, ITemplateItem, Slot } from "../models/eft/common/tables/ITemplateItem"; +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { InventoryHelper } from "./InventoryHelper"; +import { ItemHelper } from "./ItemHelper"; +export declare class BotGeneratorHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected durabilityLimitsHelper: DurabilityLimitsHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected containerHelper: ContainerHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, configServer: ConfigServer); + generateModsForItem(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, isPmc?: boolean): Item[]; + /** + * With the shotgun revolver (60db29ce99594040e04c4a27) 12.12 introduced CylinderMagazines. + * Those magazines (e.g. 60dc519adf4c47305f6d410d) have a "Cartridges" entry with a _max_count=0. + * Ammo is not put into the magazine directly but assigned to the magazine's slots: The "camora_xxx" slots. + * This function is a helper called by generateModsForItem for mods with parent type "CylinderMagazine" + * + * @param {object} items The items where the CylinderMagazine's camora are appended to + * @param {object} modPool modPool which should include available cartrigdes + * @param {string} parentId The CylinderMagazine's UID + * @param {object} parentTemplate The CylinderMagazine's template + */ + protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void; + generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): { + upd?: Upd; + }; + /** + * Create a repairable object for a weapon that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + /** + * Create a repairable object for an armor that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string; + /** + * Sort by spawn chance, highest to lowest, higher is more common + * @param unsortedModArray String array to sort + * @returns Sorted string array + */ + protected sortModArray(unsortedModArray: string[]): string[]; + /** + * Can an item be added to an item without issue + * @param items + * @param tplToCheck + * @param equipmentSlot + * @returns true if possible + */ + isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean; + /** + * Adds an item with all its childern into specified equipmentSlots, wherever it fits. + * @param equipmentSlots + * @param parentId + * @param parentTpl + * @param itemWithChildren + * @param inventory + * @returns a `boolean` indicating item was added + */ + addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: PmcInventory): boolean; + protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean; +} +export declare class ExhaustableArray { + private itemPool; + private randomUtil; + private jsonUtil; + private pool; + constructor(itemPool: T[], randomUtil: RandomUtil, jsonUtil: JsonUtil); + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/BotHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/BotHelper.d.ts new file mode 100644 index 0000000..0cb1227 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/BotHelper.d.ts @@ -0,0 +1,44 @@ +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + getBotDifficultySettings(type: string, difficulty: string): Difficulty; + getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Randomise the chance the PMC will attack their own side + * @param difficultySettings pmc difficulty settings + */ + randomisePmcHostility(difficultySettings: Difficulty): void; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + /** + * Add a bot to the FRIENDLY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typeToAdd bot type to add to friendly list + */ + addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; + /** + * Add a bot to the ENEMY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to enemy list + */ + addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Add a bot to the REVENGE_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to revenge list + */ + addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/ContainerHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/ContainerHelper.d.ts new file mode 100644 index 0000000..3c2ee93 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/ContainerHelper.d.ts @@ -0,0 +1,12 @@ +export declare class FindSlotResult { + success: boolean; + x: any; + y: any; + rotation: boolean; + constructor(success?: boolean, x?: any, y?: any, rotation?: boolean); +} +export declare class ContainerHelper { + protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean; + findSlotForItem(container2D: number[][], itemWidth: number, itemHeight: number): FindSlotResult; + fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): any; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/DialogueHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/DialogueHelper.d.ts new file mode 100644 index 0000000..9776c6a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/DialogueHelper.d.ts @@ -0,0 +1,21 @@ +import { Dialogue, MessageContent, MessagePreview } from "../models/eft/profile/IAkiProfile"; +import { MessageType } from "../models/enums/MessageType"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { ItemHelper } from "./ItemHelper"; +import { NotificationSendHelper } from "./NotificationSendHelper"; +import { NotifierHelper } from "./NotifierHelper"; +export declare class DialogueHelper { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected notificationSendHelper: NotificationSendHelper; + protected itemHelper: ItemHelper; + constructor(hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, notificationSendHelper: NotificationSendHelper, itemHelper: ItemHelper); + createMessageContext(templateId: string, messageType: MessageType, maxStoreTime: number): MessageContent; + addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards?: any[]): void; + getMessagePreview(dialogue: Dialogue): MessagePreview; + getMessageItemContents(messageID: string, sessionID: string): any[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/DurabilityLimitsHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/DurabilityLimitsHelper.d.ts new file mode 100644 index 0000000..07a5db1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/DurabilityLimitsHelper.d.ts @@ -0,0 +1,26 @@ +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotHelper } from "./BotHelper"; +export declare class DurabilityLimitsHelper { + protected randomUtil: RandomUtil; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(randomUtil: RandomUtil, botHelper: BotHelper, configServer: ConfigServer); + getRandomisedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + getRandomisedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + protected generateMaxWeaponDurability(botRole: string): number; + protected generateMaxPmcArmorDurability(itemMaxDurability: number): number; + protected getLowestMaxWeaponFromConfig(botRole: string): number; + protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number; + protected generateWeaponDurability(botRole: string, maxDurability: number): number; + protected generateArmorDurability(botRole: string, maxDurability: number): number; + protected getMinWeaponDeltaFromConfig(botRole: string): number; + protected getMaxWeaponDeltaFromConfig(botRole: string): number; + protected getMinArmorDeltaFromConfig(botRole: string): number; + protected getMaxArmorDeltaFromConfig(botRole: string): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/ExtendedProfileHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/ExtendedProfileHelper.d.ts new file mode 100644 index 0000000..d8b754d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/ExtendedProfileHelper.d.ts @@ -0,0 +1,22 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { IPmcData, Skills, Stats } from "../models/eft/common/IPmcData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class ExtendedProfileHelper extends ProfileHelper { + protected botGenerator: BotGenerator; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService, botGenerator: BotGenerator); + generatePlayerScav(sessionID: string): IPmcData; + protected getScavSkills(sessionID: string): Skills; + protected removeSecureContainer(profile: IPmcData): IPmcData; + protected getDefaultScavSkills(): Skills; + protected getScavStats(sessionID: string): Stats; + protected getScavLevel(sessionID: string): number; + protected getScavExperience(sessionID: string): number; + protected setScavCooldownTimer(profile: IPmcData, pmcData: IPmcData): IPmcData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/GameEventHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/GameEventHelper.d.ts new file mode 100644 index 0000000..b2d6377 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/GameEventHelper.d.ts @@ -0,0 +1,9 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class GameEventHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + get EVENT(): Record; + get christmasEventItems(): string[]; + itemIsChristmasRelated(itemId: string): boolean; + christmasEventEnabled(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/HandbookHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/HandbookHelper.d.ts new file mode 100644 index 0000000..b47d466 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/HandbookHelper.d.ts @@ -0,0 +1,33 @@ +declare class LookupItem { + byId: Record; + byParent: Record; + constructor(); +} +export declare class LookupCollection { + items: LookupItem; + categories: LookupItem; + constructor(); +} +export declare class HandbookHelper { + protected lookup: LookupCollection; + hydrateLookup(lookup: LookupCollection): void; + getTemplatePrice(x: string): number; + templatesWithParent(x: string): string[]; + isCategory(x: string): boolean; + childrenCategories(x: string): string[]; + /** + * Gets Currency to Ruble conversion Value + * @param {number} value + * @param {string} currencyFrom + * @returns number + */ + inRUB(value: number, currencyFrom: string): number; + /** + * Gets Ruble to Currency conversion Value + * @param {number} value + * @param {string} currencyTo + * @returns number + */ + fromRUB(value: number, currencyTo: string): number; +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/HealthHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/HealthHelper.d.ts new file mode 100644 index 0000000..518c23f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/HealthHelper.d.ts @@ -0,0 +1,27 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHealthConfig } from "../models/spt/config/IHealthConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HealthHelper { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected configServer: ConfigServer; + protected healthConfig: IHealthConfig; + constructor(jsonUtil: JsonUtil, logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, configServer: ConfigServer); + resetVitality(sessionID: string): IAkiProfile; + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + protected saveHealth(pmcData: IPmcData, sessionID: string): void; + protected saveEffects(pmcData: IPmcData, sessionID: string): void; + protected addEffect(pmcData: IPmcData, sessionID: string, effect: { + bodyPart: string; + effectType: string; + }): void; + protected isEmpty(map: any): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/HideoutHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/HideoutHelper.d.ts new file mode 100644 index 0000000..76b337f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/HideoutHelper.d.ts @@ -0,0 +1,68 @@ +import { Common, HideoutArea, IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { StageBonus } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class HideoutHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected inventoryHelper: InventoryHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + static BITCOIN_FARM: string; + protected WATER_COLLECTOR: string; + protected BITCOIN: string; + protected EXPEDITIONARY_FUEL_TANK: string; + static NAME_BACKENDCOUNTERS_CRAFTING: string; + static SKILL_NAME_HIDEOUT: string; + static HOUR_FOR_SKILL_CRAFTING: number; + static SKILL_NAME_CRAFITING: string; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer); + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + /** + * This convinience function intialies new Production Object + * with all the constants. + */ + initProduction(recipeId: string, productionTime: number): Production; + isProductionType(productive: Productive): productive is Production; + applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void; + protected applySkillXPBoost(pmcData: IPmcData, bonus: StageBonus): void; + updatePlayerHideout(sessionID: string): void; + protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void; + protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean; + protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateWaterFilters(waterFilterArea: HideoutArea, pwProd: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea; + protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd; + protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production; + protected getBTCSlots(pmcData: IPmcData): number; + protected getManagementSkillsSlots(): number; + protected hasManagementSkillSlots(pmcData: IPmcData): boolean; + protected getHideoutManagementSkill(pmcData: IPmcData): Common; + protected getHideoutManagementConsumptionBonus(pmcData: IPmcData): number; + isProduction(productive: Productive): productive is Production; + getBTC(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + getRandomAmountRewardForScavCase(itemToCalculate: ITemplateItem): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/HttpServerHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/HttpServerHelper.d.ts new file mode 100644 index 0000000..c6e5296 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/HttpServerHelper.d.ts @@ -0,0 +1,23 @@ +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HttpServerHelper { + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + protected mime: { + css: string; + bin: string; + html: string; + jpg: string; + js: string; + json: string; + png: string; + svg: string; + txt: string; + }; + constructor(configServer: ConfigServer); + getMimeText(key: string): string; + buildUrl(): string; + getBackendUrl(): string; + getWebsocketUrl(): string; + sendTextJson(resp: any, output: any): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/InRaidHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/InRaidHelper.d.ts new file mode 100644 index 0000000..05b6fdf --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/InRaidHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Victim } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { PaymentHelper } from "./PaymentHelper"; +export declare class InRaidHelper { + protected logger: ILogger; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + protected removePlayer(sessionID: string): void; + protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void; + addUpdToMoneyFromRaid(items: Item[]): void; + /** + * Add positive karma for PMC kills + * @param {*} existingFenceStanding + * @param {*} victims + */ + calculateFenceStandingChangeFromKills(existingFenceStanding: number, victims: Victim[]): void; + setBaseStats(profileData: IPmcData, offraidData: ISaveProgressRequestData, sessionID: string): IPmcData; + markFoundItems(pmcData: IPmcData, profile: IPmcData, isPlayerScav: boolean): IPmcData; + removeFoundInRaidStatusFromItems(profile: IPmcData): IPmcData; + setInventory(sessionID: string, pmcData: IPmcData, profile: IPmcData): IPmcData; + deleteInventory(pmcData: IPmcData, sessionID: string): IPmcData; + getPlayerGear(items: Item[]): Item[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/InventoryHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/InventoryHelper.d.ts new file mode 100644 index 0000000..dc7cbca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/InventoryHelper.d.ts @@ -0,0 +1,85 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInventoryConfig } from "../models/spt/config/IInventoryConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class InventoryHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected httpResponse: HttpResponseUtil; + protected fenceService: FenceService; + protected databaseServer: DatabaseServer; + protected paymentHelper: PaymentHelper; + protected traderAssortHelper: TraderAssortHelper; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected containerHelper: ContainerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected inventoryConfig: IInventoryConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, httpResponse: HttpResponseUtil, fenceService: FenceService, databaseServer: DatabaseServer, paymentHelper: PaymentHelper, traderAssortHelper: TraderAssortHelper, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, containerHelper: ContainerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + getItemSize(itemTpl: string, itemID: string, inventoryItem: Item[]): Record; + protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): Record; + protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash; + getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]; + /** + * Based on the item action, determine whose inventories we should be looking at for from and to. + */ + getOwnerInventoryItems(body: IInventoryMoveRequestData | IInventorySplitRequestData | IInventoryMergeRequestData, sessionID: string): OwnerInventoryItems; + /** + * Made a 2d array table with 0 - free slot and 1 - used slot + * @param {Object} pmcData + * @param {string} sessionID + * @returns Array + */ + protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][]; + protected getStashType(sessionID: string): string; + protected getPlayerStashSize(sessionID: string): Record; + /** + * Internal helper function to transfer an item from one profile to another. + * fromProfileData: Profile of the source. + * toProfileData: Profile of the destination. + * body: Move request + */ + moveItemToProfile(fromItems: Item[], toItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to move item within the same profile_f. + */ + moveItemInternal(inventoryItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to handle cartridges in inventory if any of them exist. + */ + protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void; +} +declare namespace InventoryHelper { + interface InventoryItemHash { + byItemId: Record; + byParentId: Record; + } +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/ItemHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/ItemHelper.d.ts new file mode 100644 index 0000000..f124cb1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/ItemHelper.d.ts @@ -0,0 +1,147 @@ +import { InsuredItem, IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +declare class ItemHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer); + /** + * Checks if a 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 + */ + isValidItem(tpl: string, invalidBaseTypes?: string[]): boolean; + /** + * Checks if a id is a valid item. Valid meaning that it's an item that may be a reward + * or content of bot loot. Items that are tested as valid may be in a player backpack or stash. + * @param {*} tpl template id of item to check + * @returns boolean: true if item is valid reward + */ + isValidRewardItem(tpl: string): boolean; + /** + * Picks rewardable items from items.json. This means they need to fit into the inventory and they shouldn't be keys (debatable) + * @returns a list of rewardable items [[_tpl, itemTemplate],...] + */ + getRewardableItems(): [string, ITemplateItem][]; + /** + * Check if the tpl / template Id provided is a descendent of the baseclass + * + * @param {string} tpl the item template id to check + * @param {string} baseclassTpl the baseclass to check for + * @return {boolean} is the tpl a descendent? + */ + isOfBaseclass(tpl: string, baseclassTpl: string): any; + /** + * Returns the item price based on the handbook or as a fallback from the prices.json if the item is not + * found in the handbook. If the price can't be found at all return 0 + * + * @param {string} tpl the item template to check + * @returns {integer} The price of the item or 0 if not found + */ + getItemPrice(tpl: string): number; + fixItemStackCount(item: Item): Item; + /** + * AmmoBoxes contain StackSlots which need to be filled for the AmmoBox to have content. + * Here's what a filled AmmoBox looks like: + * { + * "_id": "b1bbe982daa00ac841d4ae4d", + * "_tpl": "57372c89245977685d4159b1", + * "parentId": "5fe49a0e2694b0755a504876", + * "slotId": "hideout", + * "location": { + * "x": 3, + * "y": 4, + * "r": 0 + * }, + * "upd": { + * "StackObjectsCount": 1 + * } + * }, + * { + * "_id": "b997b4117199033afd274a06", + * "_tpl": "56dff061d2720bb5668b4567", + * "parentId": "b1bbe982daa00ac841d4ae4d", + * "slotId": "cartridges", + * "location": 0, + * "upd": { + * "StackObjectsCount": 30 + * } + * } + * Given the AmmoBox Item (first object) this function generates the StackSlot (second object) and returns it. + * StackSlots are only used for AmmoBoxes which only have one element in StackSlots. However, it seems to be generic + * to possibly also have more than one StackSlot. As good as possible, without seeing items having more than one + * StackSlot, this function takes account of this and creates and returns an array of StackSlotItems + * + * @param {object} item The item template of the AmmoBox as given in items.json + * @param {string} parentId The id of the AmmoBox instance these StackSlotItems should be children of + * @returns {array} The array of StackSlotItems + */ + generateStackSlotItems(item: ITemplateItem, parentId: string): StackSlot[]; + getItem(tpl: string): [boolean, ITemplateItem]; + getItemQualityModifier(item: Item): number; + findAndReturnChildrenByItems(items: Item[], itemID: string): string[]; + /** + * A variant of findAndReturnChildren where the output is list of item objects instead of their ids. + */ + findAndReturnChildrenAsItems(items: Item[], baseItemId: string): Item[]; + /** + * find children of the item in a given assort (weapons parts for example, need recursive loop function) + */ + findAndReturnChildrenByAssort(itemIdToFind: string, assort: Item[]): Item[]; + hasBuyRestrictions(itemToCheck: Item): boolean; + /** + * Is Dogtag + * Checks if an item is a dogtag. Used under profile_f.js to modify preparePrice based + * on the level of the dogtag + */ + isDogtag(tpl: string): boolean; + isNotSellable(tpl: string): boolean; + getChildId(item: Item): string; + isItemTplStackable(tpl: string): boolean; + /** + * split item stack if it exceeds StackMaxSize + */ + splitStack(item: Item): Item[]; + /** + * Find Barter items in the inventory + * @param {string} by + * @param {Object} pmcData + * @param {string} barter_itemID + * @returns Array + */ + findBarterItems(by: string, pmcData: IPmcData, barter_itemID: string): any[]; + /** + * @param {Object} pmcData + * @param {Array} items + * @param {Object} fastPanel + * @returns Array + */ + replaceIDs(pmcData: IPmcData, items: Item[], insuredItems?: InsuredItem[], fastPanel?: any): any[]; + /** + * Recursivly loop down through an items hierarchy to see if any of the ids match the supplied list, return true if any do + * @param {string} tpl + * @param {Array} tplsToCheck + * @returns boolean + */ + doesItemOrParentsIdMatch(tpl: string, tplsToCheck: string[]): boolean; + /** + * Return true if item is a quest item + * @param {string} tpl + * @returns boolean + */ + isQuestItem(tpl: string): boolean; + getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize; +} +declare namespace ItemHelper { + interface ItemSize { + width: number; + height: number; + } +} +export { ItemHelper }; diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/NotificationSendHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/NotificationSendHelper.d.ts new file mode 100644 index 0000000..34e62d9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/NotificationSendHelper.d.ts @@ -0,0 +1,12 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { NotificationService } from "../services/NotificationService"; +export declare class NotificationSendHelper { + protected httpServer: IHttpServer; + protected notificationService: NotificationService; + constructor(httpServer: IHttpServer, notificationService: NotificationService); + /** + * Send notification message to the appropiate channel + */ + sendMessage(sessionID: string, notificationMessage: INotification): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/NotifierHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/NotifierHelper.d.ts new file mode 100644 index 0000000..738b69a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/NotifierHelper.d.ts @@ -0,0 +1,17 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { Message, MessageContentRagfair } from "../models/eft/profile/IAkiProfile"; +import { HttpServerHelper } from "./HttpServerHelper"; +export declare class NotifierHelper { + protected httpServerHelper: HttpServerHelper; + /** + * The default notification sent when waiting times out. + */ + protected defaultNotification: INotification; + constructor(httpServerHelper: HttpServerHelper); + getDefaultNotification(): INotification; + /** Creates a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside */ + createRagfairOfferSoldNotification(dialogueMessage: Message, ragfairData: MessageContentRagfair): INotification; + /** Creates a new notification with the specified dialogueMessage object. */ + createNewMessageNotification(dialogueMessage: Message): INotification; + getWebSocketServer(sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/PaymentHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/PaymentHelper.d.ts new file mode 100644 index 0000000..2d068a4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/PaymentHelper.d.ts @@ -0,0 +1,14 @@ +export declare class PaymentHelper { + /** + * Check whether tpl is Money + * @param {string} tpl + * @returns void + */ + isMoneyTpl(tpl: string): boolean; + /** + * Gets currency TPL from TAG + * @param {string} currency + * @returns string + */ + getCurrency(currency: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/PresetHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/PresetHelper.d.ts new file mode 100644 index 0000000..0371886 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/PresetHelper.d.ts @@ -0,0 +1,14 @@ +import { Preset } from "../models/eft/common/IGlobals"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetHelper { + protected databaseServer: DatabaseServer; + protected lookup: Record; + constructor(databaseServer: DatabaseServer); + hydratePresetStore(input: Record): void; + isPreset(id: string): boolean; + hasPreset(templateId: string): boolean; + getPreset(id: string): Preset; + getPresets(templateId: string): Preset[]; + getDefaultPreset(templateId: string): Preset; + getBaseItemTpl(presetId: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/ProfileHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/ProfileHelper.d.ts new file mode 100644 index 0000000..6a64291 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/ProfileHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Stats } from "../models/eft/common/IPmcData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +export declare class ProfileHelper { + protected jsonUtil: JsonUtil; + protected watermark: Watermark; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected fenceService: FenceService; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService); + resetProfileQuestCondition(sessionID: string, conditionId: string): void; + getCompleteProfile(sessionID: string): IPmcData[]; + isNicknameTaken(info: IValidateNicknameRequestData, sessionID: string): boolean; + getProfileByPmcId(pmcId: string): IPmcData; + getExperience(level: number): number; + getMaxLevel(): number; + getDefaultAkiDataObject(): any; + getFullProfile(sessionID: string): IAkiProfile; + getPmcProfile(sessionID: string): IPmcData; + getScavProfile(sessionID: string): IPmcData; + getDefaultCounters(): Stats; + protected isWiped(sessionID: string): boolean; + protected getServerVersion(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/QuestConditionHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/QuestConditionHelper.d.ts new file mode 100644 index 0000000..90ee560 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/QuestConditionHelper.d.ts @@ -0,0 +1,7 @@ +import { AvailableForConditions } from "../models/eft/common/tables/IQuest"; +export declare class QuestConditionHelper { + getQuestConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLevelConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLoyaltyConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/QuestHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/QuestHelper.d.ts new file mode 100644 index 0000000..f32c85c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/QuestHelper.d.ts @@ -0,0 +1,69 @@ +import { IPmcData, Quest } from "../models/eft/common/IPmcData"; +import { AvailableForConditions, AvailableForProps, IQuest, Reward } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { TraderHelper } from "./TraderHelper"; +export declare class QuestHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, traderHelper: TraderHelper, configServer: ConfigServer); + static get STATUS(): Record; + questStatus(pmcData: IPmcData, questID: string): string; + /** + * returns true is the condition is satisfied + */ + evaluateLevel(pmcProfile: IPmcData, cond: AvailableForConditions): boolean; + getDeltaQuests(before: IQuest[], after: IQuest[]): IQuest[]; + rewardSkillPoints(sessionID: string, pmcData: IPmcData, output: IItemEventRouterResponse, skillName: string, progress: number): void; + getQuestLocale(questId: string): any; + /** + * Debug Routine for showing some information on the + * quest list in question. + */ + dumpQuests(quests: any, label?: any): void; + loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean; + protected processReward(reward: Reward): any[]; + getQuestRewardItems(quest: IQuest, state: string): Reward[]; + addQuestToPMCData(pmcData: IPmcData, quest: Quest, newState: string, acceptedQuest: IAcceptQuestRequestData): void; + acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[]; + failedUnlocked(failedQuestId: string, sessionID: string): IQuest[]; + applyMoneyBoost(quest: IQuest, moneyBoost: number): IQuest; + changeItemStack(pmcData: IPmcData, id: string, value: number, sessionID: string, output: any): void; + /** + * Get List of All Quests as an array + */ + questValues(): IQuest[]; + protected cleanQuestList(quests: IQuest[]): IQuest[]; + cleanQuestConditions(quest: IQuest): IQuest; + failQuest(pmcData: IPmcData, body: any, sessionID: string): any; + getQuestFromDb(questId: string, pmcData: IPmcData): IQuest; + getQuestLocaleIdFromDb(messageId: string, localisation?: string): string; + applyQuestReward(pmcData: IPmcData, body: ICompleteQuestRequestData, state: string, sessionID: string): any[]; + getFindItemIdForQuestItem(itemTpl: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairHelper.d.ts new file mode 100644 index 0000000..c8bc5ba --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairHelper.d.ts @@ -0,0 +1,44 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairLinkedItemService } from "../services/RagfairLinkedItemService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +import { UtilityHelper } from "./UtilityHelper"; +export declare class RagfairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected traderAssortHelper: TraderAssortHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected ragfairLinkedItemService: RagfairLinkedItemService; + protected utilityHelper: UtilityHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, traderAssortHelper: TraderAssortHelper, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, ragfairLinkedItemService: RagfairLinkedItemService, utilityHelper: UtilityHelper, configServer: ConfigServer); + /** + * Gets currency TAG from TPL + * @param {string} currency + * @returns string + */ + getCurrencyTag(currency: string): string; + filterCategories(sessionID: string, info: ISearchRequestData): string[]; + getDisplayableAssorts(sessionID: string): Record; + protected getCategoryList(handbookId: string): string[]; + countCategories(result: IGetOffersResult): void; + /** + * Merges Root Items + * Ragfair allows abnormally large stacks. + */ + mergeStackable(items: Item[]): Item[]; + getCurrencySymbol(currencyTpl: string): string; + formatCurrency(moneyAmount: number): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairOfferHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairOfferHelper.d.ts new file mode 100644 index 0000000..129bc1c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairOfferHelper.d.ts @@ -0,0 +1,52 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { PresetHelper } from "./PresetHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairHelper } from "./RagfairHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { RagfairSortHelper } from "./RagfairSortHelper"; +export declare class RagfairOfferHelper { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected paymentHelper: PaymentHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected configServer: ConfigServer; + protected static TPL_GOODS_SOLD: string; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, configServer: ConfigServer); + getValidOffers(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + getOffersForBuild(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + processOffers(sessionID: string): boolean; + protected getProfileOffers(sessionID: string): IRagfairOffer[]; + protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; + isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairSellHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairSellHelper.d.ts new file mode 100644 index 0000000..6ec004a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairSellHelper.d.ts @@ -0,0 +1,16 @@ +import { SellResult } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairSellHelper { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateSellChance(baseChance: number, offerPrice: number, requirementsPriceInRub: number): number; + rollForSale(sellChance: number, count: number): SellResult[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairServerHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairServerHelper.d.ts new file mode 100644 index 0000000..2cb3ea5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairServerHelper.d.ts @@ -0,0 +1,46 @@ +import { MemberCategory } from "../models/enums/MemberCategory"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class RagfairServerHelper { + protected randomUtil: RandomUtil; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected jsonUtil: JsonUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + protected static TPL_GOODS_RETURNED: string; + constructor(randomUtil: RandomUtil, hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, profileHelper: ProfileHelper, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, jsonUtil: JsonUtil, configServer: ConfigServer); + /** + * Is item valid / on blacklist / quest item + * @param itemDetails + * @returns boolean + */ + isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean; + protected isItemBlacklisted(itemTemplateId: string): boolean; + isTrader(userID: string): boolean; + isPlayer(userID: string): boolean; + returnItems(sessionID: string, items: any[]): void; + calculateDynamicStackCount(tplId: string, isWeaponPreset: boolean): number; + getDynamicOfferCurrency(): string; + getMemberType(userID: string): MemberCategory; + getNickname(userID: string): string; + getPresetItems(item: any): Item[]; + getPresetItemsByTpl(item: Item): Item[]; + reparentPresets(item: Item, preset: Item[]): Item[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairSortHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairSortHelper.d.ts new file mode 100644 index 0000000..e983569 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairSortHelper.d.ts @@ -0,0 +1,12 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class RagfairSortHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + sortOffers(offers: IRagfairOffer[], type: number, direction?: number): IRagfairOffer[]; + protected sortOffersByID(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByExpiry(a: IRagfairOffer, b: IRagfairOffer): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairTaxHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairTaxHelper.d.ts new file mode 100644 index 0000000..820facb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/RagfairTaxHelper.d.ts @@ -0,0 +1,16 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { ItemHelper } from "./ItemHelper"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairTaxHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected ragfairPriceService: RagfairPriceService; + protected itemHelper: ItemHelper; + constructor(logger: ILogger, databaseServer: DatabaseServer, ragfairPriceService: RagfairPriceService, itemHelper: ItemHelper); + calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number; + protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem?: boolean): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/RepairHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/RepairHelper.d.ts new file mode 100644 index 0000000..650c1aa --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/RepairHelper.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { Props } from "../models/eft/common/tables/ITemplateItem"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RepairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, configServer: ConfigServer); + updateItemDurability(itemToRepairId: string, amountToRepair: number, pmcData: IPmcData, useRepairKit?: boolean): Item; + protected getRandomisedArmorRepairDegredationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number): number; + protected getRandomisedWeaponRepairDegredationValue(itemProps: Props, isRepairKit: boolean, armorMax: number): number; + isWeaponTemplate(tpl: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/SecureContainerHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/SecureContainerHelper.d.ts new file mode 100644 index 0000000..9e2bc32 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/SecureContainerHelper.d.ts @@ -0,0 +1,13 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ItemHelper } from "./ItemHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class SecureContainerHelper { + protected itemHelper: ItemHelper; + constructor(itemHelper: ItemHelper); + getSecureContainerItems(items: Item[]): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/TradeHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/TradeHelper.d.ts new file mode 100644 index 0000000..975062b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/TradeHelper.d.ts @@ -0,0 +1,44 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item, Upd } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { RagfairServer } from "../servers/RagfairServer"; +import { FenceService } from "../services/FenceService"; +import { PaymentService } from "../services/PaymentService"; +export declare class TradeHelper { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected fenceService: FenceService; + protected inventoryHelper: InventoryHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer); + /** + * Buy item from flea or trader + * @param pmcData + * @param buyRequestData data from client + * @param sessionID + * @param foundInRaid + * @param upd optional item details used when buying from flea + * @returns + */ + buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse; + /** + * Sell item to trader + * @param pmcData + * @param body + * @param sessionID + * @returns + */ + sellItem(pmcData: IPmcData, body: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse; + protected incrementAssortBuyCount(assortBeingPurchased: Item, itemsPurchasedCount: number): void; + protected checkPurchaseIsWithinTraderItemLimit(assortBeingPurchased: Item, assortId: string, count: number): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/TraderAssortHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/TraderAssortHelper.d.ts new file mode 100644 index 0000000..4f41ac2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/TraderAssortHelper.d.ts @@ -0,0 +1,42 @@ +import { RagfairAssortGenerator } from "../generators/RagfairAssortGenerator"; +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { AssortHelper } from "./AssortHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderAssortHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected assortHelper: AssortHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected traderAssortService: TraderAssortService; + protected fenceService: FenceService; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, profileHelper: ProfileHelper, assortHelper: AssortHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferGenerator: RagfairOfferGenerator, traderAssortService: TraderAssortService, fenceService: FenceService); + /** + * Get a traders assorts + * Can be used for returning ragfair / fence assorts + * @param sessionId session id + * @param traderId trader id + * @returns a traders assorts + */ + getAssort(sessionId: string, traderId: string): ITraderAssort; + /** + * Get an array of pristine trader items prior to any alteration by player + * @param traderId trader id + * @returns array of Items + */ + protected getPristineTraderAssorts(traderId: string): Item[]; + /** + * Returns generated ragfair offers in a trader assort format + * @returns Trader assort object + */ + protected getRagfairDataAsTraderAssort(): ITraderAssort; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/TraderHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/TraderHelper.d.ts new file mode 100644 index 0000000..ab4a371 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/TraderHelper.d.ts @@ -0,0 +1,53 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { PlayerService } from "../services/PlayerService"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemHelper: ItemHelper; + protected handbookHelper: HandbookHelper; + protected playerService: PlayerService; + protected fenceService: FenceService; + protected configServer: ConfigServer; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemHelper: ItemHelper, handbookHelper: HandbookHelper, playerService: PlayerService, fenceService: FenceService, configServer: ConfigServer); + getTrader(traderID: string, sessionID: string): ITraderBase; + getTraderAssortsById(traderId: string): ITraderAssort; + /** + * Reset a trader back to its initial state as seen by a level 1 player + * Does NOT take into account different profile levels + * @param sessionID session id + * @param traderID trader id to reset + */ + resetTrader(sessionID: string, traderID: string): void; + changeTraderDisplay(traderID: string, status: boolean, sessionID: string): void; + getPurchasesData(traderID: string, sessionID: string): Record; + /** + * Calculate traders level based on exp amount and increment level if over threshold + * @param traderID trader to process + * @param sessionID session id + */ + lvlUp(traderID: string, sessionID: string): void; + getTraderUpdateSeconds(traderId: string): number; + /** + * check if an item is allowed to be sold to a trader + * @param traderFilters array of allowed categories + * @param tplToCheck itemTpl of inventory + * @returns boolean + */ + traderFilter(traderFilters: string[], tplToCheck: string): boolean; + getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/UtilityHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/UtilityHelper.d.ts new file mode 100644 index 0000000..5d9f482 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/UtilityHelper.d.ts @@ -0,0 +1,3 @@ +export declare class UtilityHelper { + arrayIntersect(a: T[], b: T[]): T[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/helpers/WeightedRandomHelper.d.ts b/Faupi-HideoutMod/Project/src/server/types/helpers/WeightedRandomHelper.d.ts new file mode 100644 index 0000000..9aa0d29 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/helpers/WeightedRandomHelper.d.ts @@ -0,0 +1,28 @@ +export declare class WeightedRandomHelper { + /** + * Gets a tplId from a weighted dictionary + * @param {tplId: weighting[]} itemArray + * @returns tplId + */ + getWeightedInventoryItem(itemArray: { + [tplId: string]: unknown; + } | ArrayLike): string; + /** + * Picks the random item based on its weight. + * The items with higher weight will be picked more often (with a higher probability). + * + * For example: + * - items = ['banana', 'orange', 'apple'] + * - weights = [0, 0.2, 0.8] + * - weightedRandom(items, weights) in 80% of cases will return 'apple', in 20% of cases will return + * 'orange' and it will never return 'banana' (because probability of picking the banana is 0%) + * + * @param {any[]} items + * @param {number[]} weights + * @returns {{item: any, index: number}} + */ + weightedRandom(items: string | any[], weights: string | any[]): { + item: any; + index: number; + }; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/ide/BleedingEdgeEntry.d.ts b/Faupi-HideoutMod/Project/src/server/types/ide/BleedingEdgeEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/ide/BleedingEdgeEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/types/ide/Compiler.d.ts b/Faupi-HideoutMod/Project/src/server/types/ide/Compiler.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/ide/Compiler.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/types/ide/DebugEntry.d.ts b/Faupi-HideoutMod/Project/src/server/types/ide/DebugEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/ide/DebugEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/types/ide/ReleaseEntry.d.ts b/Faupi-HideoutMod/Project/src/server/types/ide/ReleaseEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/ide/ReleaseEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/types/ide/TestEntry.d.ts b/Faupi-HideoutMod/Project/src/server/types/ide/TestEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/ide/TestEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-HideoutMod/Project/src/server/types/loaders/BundleLoader.d.ts b/Faupi-HideoutMod/Project/src/server/types/loaders/BundleLoader.d.ts new file mode 100644 index 0000000..06ad698 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/loaders/BundleLoader.d.ts @@ -0,0 +1,22 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +declare class BundleInfo { + modPath: string; + key: string; + path: string; + filepath: string; + dependencyKeys: string[]; + constructor(modpath: string, bundle: any, bundlePath: string, bundleFilepath: string); +} +export declare class BundleLoader { + protected httpServerHelper: HttpServerHelper; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected bundles: Record; + constructor(httpServerHelper: HttpServerHelper, vfs: VFS, jsonUtil: JsonUtil); + getBundles(local: boolean): BundleInfo[]; + getBundle(key: string, local: boolean): BundleInfo; + addBundles(modpath: string): void; +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/types/loaders/DelayedModLoader.d.ts b/Faupi-HideoutMod/Project/src/server/types/loaders/DelayedModLoader.d.ts new file mode 100644 index 0000000..2a05604 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/loaders/DelayedModLoader.d.ts @@ -0,0 +1,21 @@ +import { DependencyContainer } from "tsyringe"; +import { HandbookController } from "../controllers/HandbookController"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +import { InitialModLoader } from "./InitialModLoader"; +export declare class DelayedModLoader implements IModLoader { + protected bundleLoader: BundleLoader; + protected handbookController: HandbookController; + protected vfs: VFS; + protected modCompilerService: ModCompilerService; + protected initialModLoader: InitialModLoader; + constructor(bundleLoader: BundleLoader, handbookController: HandbookController, vfs: VFS, modCompilerService: ModCompilerService, initialModLoader: InitialModLoader); + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; + load(): void; + protected executeMods(container: DependencyContainer): void; + protected addBundles(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/loaders/InitialModLoader.d.ts b/Faupi-HideoutMod/Project/src/server/types/loaders/InitialModLoader.d.ts new file mode 100644 index 0000000..68e47fe --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/loaders/InitialModLoader.d.ts @@ -0,0 +1,64 @@ +import { DependencyContainer } from "tsyringe"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ModLoader } from "../models/spt/mod/IMod"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +export declare class InitialModLoader implements IModLoader { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected modCompilerService: ModCompilerService; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected static container: DependencyContainer; + protected readonly basepath = "user/mods/"; + protected imported: Record; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer); + load(container: DependencyContainer): Promise; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + /** + * Returns a list of mods with preserved load order + * @returns Array of mod names in load order + */ + getImportedModsNames(): string[]; + getModPath(mod: string): string; + protected importClass(name: string, filepath: string, container: DependencyContainer): void; + protected importMods(): Promise; + /** + * + * @param mods Get an array of broken/invalid mods by name + * @returns Mod names array + */ + protected getBrokenMods(mods: string[]): string[]; + /** + * Get packageJson data for mods + * @param mods mods to get packageJson for + * @returns dictionary + */ + protected getModsPackageData(mods: string[]): Record; + /** + * Does mod have "delayedLoad(" string in its entry class + * @param modFolderName folder name + * @param modToValidate package.json details + * @returns boolean + */ + protected isModSpt300Compatible(modFolderName: string, modToValidate: IPackageJsonData): boolean; + protected isModCombatibleWithAki(mod: IPackageJsonData): boolean; + protected executeMods(container: DependencyContainer): void; + sortModsLoadOrder(): string[]; + protected addMod(mod: string): Promise; + protected areModDependenciesFulfilled(mod: IPackageJsonData, loadedMods: Record): boolean; + protected isModCompatible(mod: IPackageJsonData, loadedMods: Record): boolean; + protected validMod(mod: string): boolean; + protected getLoadOrderRecursive(mod: string, result: Record, visited: Record): void; + protected getLoadOrder(mods: Record): Record; + getContainer(): DependencyContainer; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts new file mode 100644 index 0000000..c49cef7 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts @@ -0,0 +1,8 @@ +export interface IGenerateBotsRequestData { + conditions: Condition[]; +} +export interface Condition { + Role: string; + Limit: number; + Difficulty: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IEmptyRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IEmptyRequestData.d.ts new file mode 100644 index 0000000..284d16e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IEmptyRequestData.d.ts @@ -0,0 +1,2 @@ +export interface IEmptyRequestData { +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IGlobals.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IGlobals.d.ts new file mode 100644 index 0000000..456895c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IGlobals.d.ts @@ -0,0 +1,1176 @@ +import { Item } from "./tables/IItem"; +export interface IGlobals { + time: number; + config: Config; + bot_presets: BotPreset[]; + BotWeaponScatterings: BotWeaponScattering[]; + ItemPresets: Record; +} +export interface Config { + content: Content; + AimPunchMagnitude: number; + WeaponSkillProgressRate: number; + SkillAtrophy: boolean; + exp: Exp; + t_base_looting: number; + t_base_lockpicking: number; + armor: Armor; + SessionsToShowHotKeys: number; + MaxBotsAliveOnMap: number; + SavagePlayCooldown: number; + SavagePlayCooldownNdaFree: number; + MarksmanAccuracy: number; + SavagePlayCooldownDevelop: number; + TODSkyDate: string; + Mastering: Mastering[]; + GlobalItemPriceModifier: number; + TradingUnlimitedItems: boolean; + MaxLoyaltyLevelForAll: boolean; + GlobalLootChanceModifier: number; + TimeBeforeDeploy: number; + TimeBeforeDeployLocal: number; + LoadTimeSpeedProgress: number; + BaseLoadTime: number; + BaseUnloadTime: number; + BaseCheckTime: number; + Customization: Customization; + UncheckOnShot: boolean; + BotsEnabled: boolean; + ArmorMaterials: ArmorMaterials; + LegsOverdamage: number; + HandsOverdamage: number; + StomachOverdamage: number; + Health: Health; + rating: Rating; + tournament: Tournament; + RagFair: RagFair; + handbook: Handbook; + FractureCausedByFalling: Probability; + FractureCausedByBulletHit: Probability; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + Stamina: Stamina; + StaminaRestoration: StaminaRestoration; + StaminaDrain: StaminaDrain; + RequirementReferences: RequirementReferences; + RepairKitSettings: RepairKitSettings; + RestrictionsInRaid: RestrictionsInRaid[]; + SkillMinEffectiveness: number; + SkillFatiguePerPoint: number; + SkillFreshEffectiveness: number; + SkillFreshPoints: number; + SkillPointsBeforeFatigue: number; + SkillFatigueReset: number; + DiscardLimitsEnabled: boolean; + EventType: string[]; + WalkSpeed: xyz; + SprintSpeed: xyz; + SkillEnduranceWeightThreshold: number; + TeamSearchingTimeout: number; + Insurance: Insurance; + SkillExpPerLevel: number; + GameSearchingTimeout: number; + WallContusionAbsorption: xyz; + SkillsSettings: SkillsSettings; + AzimuthPanelShowsPlayerOrientation: boolean; + Aiming: Aiming; + Malfunction: Malfunction; + Overheat: Overheat; + FenceSettings: FenceSettings; + TestValue: number; + Inertia: Inertia; + Ballistic: Ballistic; +} +export interface Content { + ip: string; + port: number; + root: string; +} +export interface Exp { + heal: Heal; + match_end: MatchEnd; + kill: Kill; + level: Level; + loot_attempts: LootAttempt[]; + expForLockedDoorOpen: number; + expForLockedDoorBreach: number; + triggerMult: number; +} +export interface Heal { + expForHeal: number; + expForHydration: number; + expForEnergy: number; +} +export interface MatchEnd { + README: string; + survived_exp_requirement: number; + survived_seconds_requirement: number; + survived_exp_reward: number; + mia_exp_reward: number; + runner_exp_reward: number; + leftMult: number; + miaMult: number; + survivedMult: number; + runnerMult: number; + killedMult: number; +} +export interface Kill { + combo: Combo[]; + victimLevelExp: number; + headShotMult: number; + expOnDamageAllHealth: number; + longShotDistance: number; + bloodLossToLitre: number; + victimBotLevelExp: number; +} +export interface Combo { + percent: number; +} +export interface Level { + exp_table: ExpTable[]; + trade_level: number; + savage_level: number; + clan_level: number; + mastering1: number; + mastering2: number; +} +export interface ExpTable { + exp: number; +} +export interface LootAttempt { + k_exp: number; +} +export interface Armor { + class: Class[]; +} +export interface Class { + resistance: number; +} +export interface Mastering { + Name: string; + Templates: string[]; + Level2: number; + Level3: number; +} +export interface Customization { + SavageHead: SavageHead; + SavageBody: SavageBody; + SavageFeet: SavageFeet; + CustomizationVoice: CustomizationVoice[]; + BodyParts: BodyParts; +} +export interface SavageHead { + wild_head_1: WildHead; + wild_head_2: WildHead; + wild_head_3: WildHead; + Wild_Dealmaker_head: WildHead; + Wild_Killa_head: WildHead; + bear_head: WildHead; + bear_head_1: WildHead; + usec_head_1: WildHead; + Head_BOSS_Glukhar: WildHead; + Wild_Head_nonMesh: WildHead; + Head_BOSS_Sanitar: WildHead; + wild_head_drozd: WildHead; + wild_head_misha: WildHead; + head_cultist_01: WildHead; + head_cultist_02: WildHead; + head_cultist_03: WildHead; + DefaultUsecHead: WildHead; + usec_head_3: WildHead; + usec_head_4: WildHead; + usec_head_5: WildHead; +} +export interface WildHead { + head: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface SavageBody { + wild_body: WildBody; + wild_body_1: WildBody; + wild_body_2: WildBody; + wild_body_3: WildBody; + Wild_Dealmaker_body: WildBody; + wild_security_body_1: WildBody; + wild_security_body_2: WildBody; + wild_Killa_body: WildBody; + wild_pmcBot_body: WildBody; + wild_Shturman_body: WildBody; + wild_Gluhar_body: WildBody; + Tshirt_security_TshirtTatu_01: WildBody; + Tshirt_security_TshirtTatu_02: WildBody; + Top_security_Husky: WildBody; + Top_security_Gorka4: WildBody; + scav_kit_upper_meteor: WildBody; + wild_body_russia1: WildBody; + Top_BOSS_Sanitar: WildBody; + wild_body_motocross: WildBody; + top_cultist_01: WildBody; + top_cultist_02: WildBody; + wild_body_rainparka: WildBody; + wild_body_underarmour: WildBody; + top_boss_tagilla: WildBody; + DefaultUsecBody: WildBody; + usec_upper_acu: WildBody; + usec_upper_commando: WildBody; + usec_upper_aggressor: WildBody; + usec_upper_hoody: WildBody; + usec_upper_pcuironsight: WildBody; + usec_top_beltstaff: WildBody; + usec_upper_flexion: WildBody; + usec_upper_tier3: WildBody; + usec_upper_pcsmulticam: WildBody; + usec_upper_tier_2: WildBody; + usec_upper_infiltrator: WildBody; + user_upper_NightPatrol: WildBody; + wild_body_bomber: WildBody; + wild_top_yellowcoat: WildBody; +} +export interface WildBody { + body: string; + hands: string; + isNotRandom: boolean; +} +export interface SavageFeet { + wild_feet: WildFeet; + wild_feet_1: WildFeet; + wild_feet_2: WildFeet; + Wild_Dealmaker_feet: WildFeet; + wild_security_feet_1: WildFeet; + Wild_Killa_feet: WildFeet; + wild_pmcBot_feet: WildFeet; + Pants_BOSS_Glukhar: WildFeet; + Pants_BOSS_Shturman: WildFeet; + Pants_security_Gorka4: WildFeet; + Pants_security_Flora: WildFeet; + scav_kit_lower_sklon: WildFeet; + Pants_BOSS_Sanitar: WildFeet; + wild_feet_sweatpants: WildFeet; + wild_feet_wasatch: WildFeet; + wild_feet_slimPants: WildFeet; + pants_cultist_01: WildFeet; + pants_cultist_02: WildFeet; + wild_feet_scavelite_taclite: WildFeet; + pants_boss_tagilla: WildFeet; + wild_feet_bomber: WildFeet; + wild_pants_yellowcoat: WildFeet; +} +export interface WildFeet { + feet: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface CustomizationVoice { + voice: string; + side: string[]; + isNotRandom: boolean; +} +export interface BodyParts { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface ArmorMaterials { + UHMWPE: ArmorType; + Aramid: ArmorType; + Combined: ArmorType; + Titan: ArmorType; + Aluminium: ArmorType; + ArmoredSteel: ArmorType; + Ceramic: ArmorType; + Glass: ArmorType; +} +export interface ArmorType { + Destructibility: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + ExplosionDestructibility: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; +} +export interface Health { + Falling: Falling; + Effects: Effects; + HealPrice: HealPrice; + ProfileHealthSettings: ProfileHealthSettings; +} +export interface Falling { + DamagePerMeter: number; + SafeHeight: number; +} +export interface Effects { + Existence: Existence; + Dehydration: Dehydration; + BreakPart: BreakPart; + Contusion: Contusion; + Disorientation: Disorientation; + Exhaustion: Exhaustion; + LowEdgeHealth: LowEdgeHealth; + RadExposure: RadExposure; + Stun: Stun; + Intoxication: Intoxication; + Regeneration: Regeneration; + Wound: Wound; + Berserk: Berserk; + Flash: Flash; + MedEffect: MedEffect; + Pain: Pain; + PainKiller: PainKiller; + SandingScreen: SandingScreen; + Stimulator: Stimulator; + Tremor: Tremor; + ChronicStaminaFatigue: ChronicStaminaFatigue; + Fracture: Fracture2; + HeavyBleeding: HeavyBleeding2; + LightBleeding: LightBleeding2; + BodyTemperature: BodyTemperature; +} +export interface Existence { + EnergyLoopTime: number; + HydrationLoopTime: number; + EnergyDamage: number; + HydrationDamage: number; + DestroyedStomachEnergyTimeFactor: number; + DestroyedStomachHydrationTimeFactor: number; +} +export interface Dehydration { + DefaultDelay: number; + DefaultResidueTime: number; + BleedingHealth: number; + BleedingLoopTime: number; + BleedingLifeTime: number; + DamageOnStrongDehydration: number; + StrongDehydrationLoopTime: number; +} +export interface BreakPart { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface Contusion { + Dummy: number; +} +export interface Disorientation { + Dummy: number; +} +export interface Exhaustion { + DefaultDelay: number; + DefaultResidueTime: number; + Damage: number; + DamageLoopTime: number; +} +export interface LowEdgeHealth { + DefaultDelay: number; + DefaultResidueTime: number; + StartCommonHealth: number; +} +export interface RadExposure { + Damage: number; + DamageLoopTime: number; +} +export interface Stun { + Dummy: number; +} +export interface Intoxication { + DefaultDelay: number; + DefaultResidueTime: number; + DamageHealth: number; + HealthLoopTime: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovedAfterDeath: boolean; + HealExperience: number; + RemovePrice: number; +} +export interface Regeneration { + LoopTime: number; + MinimumHealthPercentage: number; + Energy: number; + Hydration: number; + BodyHealth: BodyHealth; + Influences: Influences; +} +export interface BodyHealth { + Head: BodyHealthValue; + Chest: BodyHealthValue; + Stomach: BodyHealthValue; + LeftArm: BodyHealthValue; + RightArm: BodyHealthValue; + LeftLeg: BodyHealthValue; + RightLeg: BodyHealthValue; +} +export interface BodyHealthValue { + Value: number; +} +export interface Influences { + LightBleeding: Influence; + HeavyBleeding: Influence; + Fracture: Influence; + RadExposure: Influence; + Intoxication: Influence; +} +export interface Influence { + HealthSlowDownPercentage: number; + EnergySlowDownPercentage: number; + HydrationSlowDownPercentage: number; +} +export interface Wound { + WorkingTime: number; + ThresholdMin: number; + ThresholdMax: number; +} +export interface Berserk { + DefaultDelay: number; + WorkingTime: number; + DefaultResidueTime: number; +} +export interface Flash { + Dummy: number; +} +export interface MedEffect { + LoopTime: number; + StartDelay: number; + DrinkStartDelay: number; + FoodStartDelay: number; + DrugsStartDelay: number; + MedKitStartDelay: number; + MedicalStartDelay: number; + StimulatorStartDelay: number; +} +export interface Pain { + TremorDelay: number; + HealExperience: number; +} +export interface PainKiller { + Dummy: number; +} +export interface SandingScreen { + Dummy: number; +} +export interface Stimulator { + BuffLoopTime: number; + Buffs: Buffs; +} +export interface Buffs { + BuffsSJ1TGLabs: Buff[]; + BuffsSJ6TGLabs: Buff[]; + BuffsPropital: Buff[]; + BuffsZagustin: Buff[]; + BuffseTGchange: Buff[]; + BuffsAdrenaline: Buff[]; + BuffsGoldenStarBalm: Buff[]; + Buffs_drink_aquamari: Buff[]; + Buffs_drink_maxenergy: Buff[]; + Buffs_drink_milk: Buff[]; + Buffs_drink_tarcola: Buff[]; + Buffs_drink_hotrod: Buff[]; + Buffs_drink_juice_army: Buff[]; + Buffs_drink_water: Buff[]; + Buffs_food_borodinskiye: Buff[]; + Buffs_food_condensed_milk: Buff[]; + Buffs_food_emelya: Buff[]; + Buffs_food_mayonez: Buff[]; + Buffs_food_mre: Buff[]; + Buffs_food_sugar: Buff[]; + Buffs_drink_vodka: Buff[]; + Buffs_drink_jack: Buff[]; + Buffs_drink_moonshine: Buff[]; + Buffs_drink_purewater: Buff[]; + Buffs_3bTG: Buff[]; + Buffs_AHF1M: Buff[]; + Buffs_L1: Buff[]; + Buffs_MULE: Buff[]; + Buffs_Meldonin: Buff[]; + Buffs_Obdolbos: Buff[]; + Buffs_P22: Buff[]; + Buffs_KultistsToxin: Buff[]; + Buffs_BodyTemperature: Buff[]; + Buffs_Antidote: Buff[]; + Buffs_melee_bleed: Buff[]; + Buffs_melee_blunt: Buff[]; + Buffs_hultafors: Buff[]; + Buffs_drink_vodka_BAD: Buff[]; + Buffs_food_alyonka: Buff[]; + Buffs_food_slippers: Buff[]; + Buffs_knife: Buff[]; +} +export interface Buff { + BuffType: string; + Chance: number; + Delay: number; + Duration: number; + Value: number; + AbsoluteValue: boolean; + SkillName: string; +} +export interface Tremor { + DefaultDelay: number; + DefaultResidueTime: number; +} +export interface ChronicStaminaFatigue { + EnergyRate: number; + WorkingTime: number; + TicksEvery: number; + EnergyRatePerStack: number; +} +export interface Fracture2 { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface HeavyBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface Probability { + FunctionType: string; + K: number; + B: number; + Threshold: number; +} +export interface LightBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface BodyTemperature { + DefaultBuildUpTime: number; + DefaultResidueTime: number; + LoopTime: number; +} +export interface HealPrice { + HealthPointPrice: number; + HydrationPointPrice: number; + EnergyPointPrice: number; + TrialLevels: number; + TrialRaids: number; +} +export interface ProfileHealthSettings { + BodyPartsSettings: BodyPartsSettings; + HealthFactorsSettings: HealthFactorsSettings; +} +export interface BodyPartsSettings { + Head: BodyPartsSetting; + Chest: BodyPartsSetting; + Stomach: BodyPartsSetting; + LeftArm: BodyPartsSetting; + RightArm: BodyPartsSetting; + LeftLeg: BodyPartsSetting; + RightLeg: BodyPartsSetting; +} +export interface BodyPartsSetting { + Minimum: number; + Maximum: number; + Default: number; + OverDamageReceivedMultiplier: number; +} +export interface HealthFactorsSettings { + Energy: HealthFactorSetting; + Hydration: HealthFactorSetting; + Temperature: HealthFactorSetting; + Poisoning: HealthFactorSetting; + Radiation: HealthFactorSetting; +} +export interface HealthFactorSetting { + Minimum: number; + Maximum: number; + Default: number; +} +export interface Rating { + levelRequired: number; + limit: number; + categories: Categories; +} +export interface Categories { + experience: boolean; + kd: boolean; + surviveRatio: boolean; + avgEarnings: boolean; + kills: boolean; + raidCount: boolean; + longestShot: boolean; + timeOnline: boolean; + inventoryFullCost: boolean; + ragFairStanding: boolean; +} +export interface Tournament { + categories: Categories2; + limit: number; + levelRequired: number; +} +export interface Categories2 { + dogtags: boolean; +} +export interface RagFair { + enabled: boolean; + priceStabilizerEnabled: boolean; + includePveTraderSales: boolean; + priceStabilizerStartIntervalInHours: number; + minUserLevel: number; + communityTax: number; + communityItemTax: number; + communityRequirementTax: number; + offerPriorityCost: number; + offerDurationTimeInHour: number; + offerDurationTimeInHourAfterRemove: number; + priorityTimeModifier: number; + maxRenewOfferTimeInHour: number; + renewPricePerHour: number; + maxActiveOfferCount: MaxActiveOfferCount[]; + balancerRemovePriceCoefficient: number; + balancerMinPriceCount: number; + balancerAveragePriceCoefficient: number; + delaySinceOfferAdd: number; + uniqueBuyerTimeoutInDays: number; + ratingSumForIncrease: number; + ratingIncreaseCount: number; + ratingSumForDecrease: number; + ratingDecreaseCount: number; + maxSumForIncreaseRatingPerOneSale: number; + maxSumForDecreaseRatingPerOneSale: number; + maxSumForRarity: MaxSumForRarity; + ChangePriceCoef: number; + balancerUserItemSaleCooldownEnabled: boolean; + balancerUserItemSaleCooldown: number; + youSellOfferMaxStorageTimeInHour: number; + yourOfferDidNotSellMaxStorageTimeInHour: number; + isOnlyFoundInRaidAllowed: boolean; + sellInOnePiece: number; +} +export interface MaxActiveOfferCount { + from: number; + to: number; + count: number; +} +export interface MaxSumForRarity { + Common: RarityMaxSum; + Rare: RarityMaxSum; + Superrare: RarityMaxSum; + Not_exist: RarityMaxSum; +} +export interface RarityMaxSum { + value: number; +} +export interface Handbook { + defaultCategory: string; +} +export interface Stamina { + Capacity: number; + SprintDrainRate: number; + BaseRestorationRate: number; + JumpConsumption: number; + GrenadeHighThrow: number; + GrenadeLowThrow: number; + AimDrainRate: number; + AimRangeFinderDrainRate: number; + OxygenCapacity: number; + OxygenRestoration: number; + WalkOverweightLimits: xyz; + BaseOverweightLimits: xyz; + SprintOverweightLimits: xyz; + WalkSpeedOverweightLimits: xyz; + CrouchConsumption: xyz; + WalkConsumption: xyz; + StandupConsumption: xyz; + TransitionSpeed: xyz; + SprintAccelerationLowerLimit: number; + SprintSpeedLowerLimit: number; + SprintSensitivityLowerLimit: number; + AimConsumptionByPose: xyz; + RestorationMultiplierByPose: xyz; + OverweightConsumptionByPose: xyz; + AimingSpeedMultiplier: number; + WalkVisualEffectMultiplier: number; + HandsCapacity: number; + HandsRestoration: number; + ProneConsumption: number; + BaseHoldBreathConsumption: number; + SoundRadius: xyz; + ExhaustedMeleeSpeed: number; + FatigueRestorationRate: number; + FatigueAmountToCreateEffect: number; + ExhaustedMeleeDamageMultiplier: number; + FallDamageMultiplier: number; + SafeHeightOverweight: number; + SitToStandConsumption: number; + StaminaExhaustionCausesJiggle: boolean; + StaminaExhaustionStartsBreathSound: boolean; + StaminaExhaustionRocksCamera: boolean; + HoldBreathStaminaMultiplier: xyz; + PoseLevelIncreaseSpeed: xyz; + PoseLevelDecreaseSpeed: xyz; + PoseLevelConsumptionPerNotch: xyz; +} +export interface StaminaRestoration { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface StaminaDrain { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface RequirementReferences { + Alpinist: Alpinist[]; +} +export interface Alpinist { + Requirement: string; + Id: string; + Count: number; + RequiredSlot: string; + RequirementTip: string; +} +export interface RestrictionsInRaid { + TemplateId: string; + Value: number; +} +export interface Insurance { + MaxStorageTimeInHour: number; +} +export interface SkillsSettings { + SkillProgressRate: number; + WeaponSkillProgressRate: number; + WeaponSkillRecoilBonusPerLevel: number; + HideoutManagement: HideoutManagement; + Crafting: Crafting; + Metabolism: Metabolism; + Immunity: Immunity; + Endurance: Endurance; + Strength: Strength; + Vitality: Vitality; + Health: Health2; + StressResistance: StressResistance; + Throwing: Throwing; + RecoilControl: RecoilControl; + Pistol: WeaponSkills; + Revolver: WeaponSkills; + SMG: any[]; + Assault: WeaponSkills; + Shotgun: WeaponSkills; + Sniper: WeaponSkills; + LMG: any[]; + HMG: any[]; + Launcher: any[]; + AttachedLauncher: any[]; + Melee: any[]; + DMR: WeaponSkills; + BearAssaultoperations: any[]; + BearAuthority: any[]; + BearAksystems: any[]; + BearHeavycaliber: any[]; + BearRawpower: any[]; + UsecArsystems: any[]; + UsecDeepweaponmodding_Settings: any[]; + UsecLongrangeoptics_Settings: any[]; + UsecNegotiations: any[]; + UsecTactics: any[]; + BotReload: any[]; + CovertMovement: CovertMovement; + FieldMedicine: any[]; + Search: Search; + Sniping: any[]; + ProneMovement: any[]; + FirstAid: any[]; + LightVests: ArmorSkills; + HeavyVests: ArmorSkills; + WeaponModding: any[]; + AdvancedModding: any[]; + NightOps: any[]; + SilentOps: any[]; + Lockpicking: any[]; + WeaponTreatment: WeaponTreatment; + MagDrills: MagDrills; + Freetrading: any[]; + Auctions: any[]; + Cleanoperations: any[]; + Barter: any[]; + Shadowconnections: any[]; + Taskperformance: any[]; + Perception: Perception; + Intellect: Intellect; + Attention: Attention; + Charisma: Charisma; + Memory: Memory; + Surgery: Surgery; + AimDrills: AimDrills; + BotSound: any[]; + TroubleShooting: TroubleShooting; +} +export interface ArmorSkills { + WearAmountRepairLVestsReducePerLevel: number; + WearChanceRepairLVestsReduceEliteLevel: number; +} +export interface HideoutManagement { + SkillPointsPerAreaUpgrade: number; + SkillPointsPerCraft: number; + ConsumptionReductionPerLevel: number; + SkillBoostPercent: number; + SkillPointsRate: SkillPointsRate; + EliteSlots: EliteSlots; +} +export interface SkillPointsRate { + Generator: Generator; + AirFilteringUnit: SkillPointRate; + WaterCollector: SkillPointRate; + SolarPower: SkillPointRate; +} +export interface SkillPointRate { + ResourceSpent: number; + PointsGained: number; +} +export interface EliteSlots { + Generator: EliteSlot; + AirFilteringUnit: EliteSlot; + WaterCollector: EliteSlot; + BitcoinFarm: EliteSlot; +} +export interface EliteSlot { + Slots: number; + Container: number; +} +export interface Crafting { + PointsPerCraftingCycle: number; + CraftingCycleHours: number; + PointsPerUniqueCraftCycle: number; + UniqueCraftsPerCycle: number; + CraftTimeReductionPerLevel: number; + ProductionTimeReductionPerLevel: number; + EliteExtraProductions: number; + CraftingPointsToInteligence: number; +} +export interface Metabolism { + HydrationRecoveryRate: number; + EnergyRecoveryRate: number; + IncreasePositiveEffectDurationRate: number; + DecreaseNegativeEffectDurationRate: number; + DecreasePoisonDurationRate: number; +} +export interface Immunity { + ImmunityMiscEffects: number; + ImmunityPoisonBuff: number; + ImmunityPainKiller: number; + HealthNegativeEffect: number; + StimulatorNegativeBuff: number; +} +export interface Endurance { + MovementAction: number; + SprintAction: number; + GainPerFatigueStack: number; +} +export interface Strength { + SprintActionMin: number; + SprintActionMax: number; + MovementActionMin: number; + MovementActionMax: number; + PushUpMin: number; + PushUpMax: number; + FistfightAction: number; + ThrowAction: number; +} +export interface Vitality { + DamageTakenAction: number; + HealthNegativeEffect: number; +} +export interface Health2 { + SkillProgress: number; +} +export interface StressResistance { + HealthNegativeEffect: number; + LowHPDuration: number; +} +export interface Throwing { + ThrowAction: number; +} +export interface RecoilControl { + RecoilAction: number; + RecoilBonusPerLevel: number; +} +export interface WeaponSkills { + WeaponReloadAction: number; + WeaponShotAction: number; + WeaponFixAction: number; + WeaponChamberAction: number; +} +export interface CovertMovement { + MovementAction: number; +} +export interface Search { + SearchAction: number; + FindAction: number; +} +export interface WeaponTreatment { + DurLossReducePerLevel: number; + SkillPointsPerRepair: number; + Filter: any[]; + WearAmountRepairGunsReducePerLevel: number; + WearChanceRepairGunsReduceEliteLevel: number; +} +export interface MagDrills { + RaidLoadedAmmoAction: number; + RaidUnloadedAmmoAction: number; + MagazineCheckAction: number; +} +export interface Perception { + OnlineAction: number; + UniqueLoot: number; +} +export interface Intellect { + ExamineAction: number; + SkillProgress: number; + RepairAction: number; + WearAmountReducePerLevel: number; + WearChanceReduceEliteLevel: number; + RepairPointsCostReduction: number; +} +export interface Attention { + ExamineWithInstruction: number; + FindActionFalse: number; + FindActionTrue: number; +} +export interface Charisma { + SkillProgressInt: number; + SkillProgressAtn: number; + SkillProgressPer: number; +} +export interface Memory { + AnySkillUp: number; + SkillProgress: number; +} +export interface Surgery { + SurgeryAction: number; + SkillProgress: number; +} +export interface AimDrills { + WeaponShotAction: number; +} +export interface TroubleShooting { + MalfRepairSpeedBonusPerLevel: number; + SkillPointsPerMalfFix: number; + EliteDurabilityChanceReduceMult: number; + EliteAmmoChanceReduceMult: number; + EliteMagChanceReduceMult: number; +} +export interface Aiming { + ProceduralIntensityByPose: xyz; + AimProceduralIntensity: number; + HeavyWeight: number; + LightWeight: number; + MaxTimeHeavy: number; + MinTimeHeavy: number; + MaxTimeLight: number; + MinTimeLight: number; + RecoilScaling: number; + RecoilDamping: number; + CameraSnapGlobalMult: number; + RecoilXIntensityByPose: xyz; + RecoilYIntensityByPose: xyz; + RecoilZIntensityByPose: xyz; + RecoilCrank: boolean; + RecoilHandDamping: number; + RecoilConvergenceMult: number; + RecoilVertBonus: number; + RecoilBackBonus: number; +} +export interface Malfunction { + AmmoMalfChanceMult: number; + MagazineMalfChanceMult: number; + MalfRepairHardSlideMult: number; + MalfRepairOneHandBrokenMult: number; + MalfRepairTwoHandsBrokenMult: number; + AllowMalfForBots: boolean; + ShowGlowAttemptsCount: number; + OutToIdleSpeedMultForPistol: number; + IdleToOutSpeedMultOnMalf: number; + TimeToQuickdrawPistol: number; + DurRangeToIgnoreMalfs: xyz; + DurFeedWt: number; + DurMisfireWt: number; + DurJamWt: number; + DurSoftSlideWt: number; + DurHardSlideMinWt: number; + DurHardSlideMaxWt: number; + AmmoMisfireWt: number; + AmmoFeedWt: number; + AmmoJamWt: number; + OverheatFeedWt: number; + OverheatJamWt: number; + OverheatSoftSlideWt: number; + OverheatHardSlideMinWt: number; + OverheatHardSlideMaxWt: number; +} +export interface Overheat { + MinOverheat: number; + MaxOverheat: number; + OverheatProblemsStart: number; + ModHeatFactor: number; + ModCoolFactor: number; + MinWearOnOverheat: number; + MaxWearOnOverheat: number; + MinWearOnMaxOverheat: number; + MaxWearOnMaxOverheat: number; + OverheatWearLimit: number; + MaxCOIIncreaseMult: number; + MinMalfChance: number; + MaxMalfChance: number; + DurReduceMinMult: number; + DurReduceMaxMult: number; + BarrelMoveRndDuration: number; + BarrelMoveMaxMult: number; + FireratePitchMult: number; + FirerateReduceMinMult: number; + FirerateReduceMaxMult: number; + FirerateOverheatBorder: number; + EnableSlideOnMaxOverheat: boolean; + StartSlideOverheat: number; + FixSlideOverheat: number; + AutoshotMinOverheat: number; + AutoshotChance: number; + AutoshotPossibilityDuration: number; + MaxOverheatCoolCoef: number; +} +export interface FenceSettings { + FenceId: string; + Levels: Record; + paidExitStandingNumerator: number; +} +export interface FenceLevel { + SavageCooldownModifier: number; + ScavCaseTimeModifier: number; + PaidExitCostModifier: number; + BotFollowChance: number; + ScavEquipmentSpawnChanceModifier: number; + PriceModifier: number; + HostileBosses: boolean; + HostileScavs: boolean; + ScavAttackSupport: boolean; + ExfiltrationPriceModifier: number; + AvailableExits: number; +} +export interface Inertia { + InertiaLimits: xyz; + InertiaLimitsStep: number; + ExitMovementStateSpeedThreshold: xyz; + WalkInertia: xyz; + FallThreshold: number; + SpeedLimitAfterFallMin: xyz; + SpeedLimitAfterFallMax: xyz; + SpeedLimitDurationMin: xyz; + SpeedLimitDurationMax: xyz; + SpeedInertiaAfterJump: xyz; + BaseJumpPenaltyDuration: number; + DurationPower: number; + BaseJumpPenalty: number; + PenaltyPower: number; + InertiaTiltCurveMin: xyz; + InertiaTiltCurveMax: xyz; + InertiaBackwardCoef: xyz; + TiltInertiaMaxSpeed: xyz; + TiltStartSideBackSpeed: xyz; + TiltMaxSideBackSpeed: xyz; + TiltAcceleration: xyz; + AverageRotationFrameSpan: number; + SprintSpeedInertiaCurveMin: xyz; + SprintSpeedInertiaCurveMax: xyz; + SprintBrakeInertia: xyz; + SprintTransitionMotionPreservation: xyz; + WeaponFlipSpeed: xyz; + PreSprintAccelerationLimits: xyz; + SprintAccelerationLimits: xyz; + SideTime: xyz; + DiagonalTime: xyz; + MinDirectionBlendTime: number; + MoveTime: number; + MinMovementAccelerationRangeRight: xyz; + MaxMovementAccelerationRangeRight: xyz; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Ballistic { + GlobalDamageDegradationCoefficient: number; +} +export interface RepairKitSettings { + armorClassDivisor: number; + durabilityPointCostArmor: number; + durabilityPointCostGuns: number; +} +export interface BotPreset { + UseThis: boolean; + Role: string; + BotDifficulty: string; + VisibleAngle: number; + VisibleDistance: number; + ScatteringPerMeter: number; + HearingSense: number; + SCATTERING_DIST_MODIF: number; + MAX_AIMING_UPGRADE_BY_TIME: number; + FIRST_CONTACT_ADD_SEC: number; + COEF_IF_MOVE: number; +} +export interface BotWeaponScattering { + Name: string; + PriorityScatter1meter: number; + PriorityScatter10meter: number; + PriorityScatter100meter: number; +} +export interface Preset { + _id: string; + _type: string; + _changeWeaponName: boolean; + _name: string; + _parent: string; + _items: Item[]; + _encyclopedia?: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocation.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocation.d.ts new file mode 100644 index 0000000..42fac06 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocation.d.ts @@ -0,0 +1,6 @@ +import { ILocationBase } from "./ILocationBase"; +import { ILooseLoot } from "./ILooseLoot"; +export interface ILocation { + base: ILocationBase; + looseLoot: ILooseLoot; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocationBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocationBase.d.ts new file mode 100644 index 0000000..ad48d32 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocationBase.d.ts @@ -0,0 +1,198 @@ +export interface ILocationBase { + AccessKeys: string[]; + AirdropParameters: AirdropParameter[]; + Area: number; + AveragePlayTime: number; + AveragePlayerLevel: number; + Banners: Banner[]; + BossLocationSpawn: BossLocationSpawn[]; + BotAssault: number; + BotEasy: number; + BotHard: number; + BotImpossible: number; + BotLocationModifier: BotLocationModifier; + BotMarksman: number; + BotMax: number; + BotMaxPlayer: number; + BotMaxTimePlayer: number; + BotNormal: number; + BotSpawnTimeOffMax: number; + BotSpawnTimeOffMin: number; + BotSpawnTimeOnMax: number; + BotSpawnTimeOnMin: number; + BotStart: number; + BotStop: number; + Description: string; + DisabledForScav: boolean; + DisabledScavExits: string; + Enabled: boolean; + GlobalLootChanceModifier: number; + IconX: number; + IconY: number; + Id: string; + Insurance: boolean; + IsSecret: boolean; + Locked: boolean; + Loot: any[]; + MaxBotPerZone: number; + MaxDistToFreePoint: number; + MaxPlayers: number; + MinDistToExitPoint: number; + MinDistToFreePoint: number; + MinMaxBots: MinMaxBot[]; + MinPlayers: number; + Name: string; + NewSpawn: boolean; + OcculsionCullingEnabled: boolean; + OldSpawn: boolean; + OpenZones: string; + Preview: Preview; + RequiredPlayerLevel: number; + Rules: string; + SafeLocation: boolean; + Scene: Scene; + SpawnPointParams: SpawnPointParam[]; + UnixDateTime: number; + _Id: string; + doors: any[]; + escape_time_limit: number; + exit_access_time: number; + exit_count: number; + exit_time: number; + exits: Exit[]; + filter_ex: string[]; + limits: ILimit[]; + matching_min_seconds: number; + maxItemCountInLocation: MaxItemCountInLocation[]; + sav_summon_seconds: number; + tmp_location_field_remove_me: number; + users_gather_seconds: number; + users_spawn_seconds_n: number; + users_spawn_seconds_n2: number; + users_summon_seconds: number; + waves: Wave[]; +} +export interface ILimit { + min: number; + max: number; + items: any[]; +} +export interface AirdropParameter { + AirdropPointDeactivateDistance: number; + MinPlayersCountToSpawnAirdrop: number; + PlaneAirdropChance: number; + PlaneAirdropCooldownMax: number; + PlaneAirdropCooldownMin: number; + PlaneAirdropEnd: number; + PlaneAirdropMax: number; + PlaneAirdropStartMax: number; + PlaneAirdropStartMin: number; + UnsuccessfulTryPenalty: number; +} +export interface Banner { + id: string; + pic: Pic; +} +export interface Pic { + path: string; + rcid: string; +} +export interface BossLocationSpawn { + BossChance: number; + BossDifficult: string; + BossEscortAmount: string; + BossEscortDifficult: string; + BossEscortType: string; + BossName: string; + BossPlayer: boolean; + BossZone: string; + Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; +} +export interface BossSupport { + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; +} +export interface BotLocationModifier { + AccuracySpeed: number; + DistToActivate: number; + DistToPersueAxemanCoef: number; + DistToSleep: number; + GainSight: number; + KhorovodChance: number; + MagnetPower: number; + MarksmanAccuratyCoef: number; + Scattering: number; + VisibleDistance: number; +} +export interface MinMaxBot { + WildSpawnType: string; + max: number; + min: number; +} +export interface Preview { + path: string; + rcid: string; +} +export interface Scene { + path: string; + rcid: string; +} +export interface SpawnPointParam { + BotZoneName: string; + Categories: string[]; + ColliderParams: ColliderParams; + DelayToCanSpawnSec: number; + Id: string; + Infiltration: string; + Position: xyz; + Rotation: number; + Sides: string[]; +} +export interface ColliderParams { + _parent: string; + _props: Props; +} +export interface Props { + Center: xyz; + Radius: number; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Exit { + Chance: number; + Count: number; + EntryPoints: string; + ExfiltrationTime: number; + ExfiltrationType: string; + Id: string; + MaxTime: number; + MinTime: number; + Name: string; + PassageRequirement: string; + PlayersCount: number; + RequirementTip: string; +} +export interface MaxItemCountInLocation { + TemplateId: string; + Value: number; +} +export interface Wave { + BotPreset: string; + BotSide: string; + SpawnPoints: string; + WildSpawnType: string; + isPlayers: boolean; + number: number; + slots_max: number; + slots_min: number; + time_max: number; + time_min: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts new file mode 100644 index 0000000..7f8d915 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts @@ -0,0 +1,9 @@ +import { ILocations } from "../../spt/server/ILocations"; +export interface ILocationsGenerateAllResponse { + locations: ILocations; + paths: Path[]; +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILooseLoot.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILooseLoot.d.ts new file mode 100644 index 0000000..14b795e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/ILooseLoot.d.ts @@ -0,0 +1,45 @@ +export interface ILooseLoot { + spawnpointCount: SpawnpointCount; + spawnpointsForced: SpawnpointsForced[]; + spawnpoints: Spawnpoint[]; +} +export interface SpawnpointCount { + mean: number; + std: number; +} +export interface SpawnpointsForced { + locationId: string; + probability: number; + template: SpawnpointTemplate; +} +export interface SpawnpointTemplate { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: Item[]; +} +export interface Item { + _id: string; + _tpl?: string; +} +export interface Spawnpoint { + locationId: string; + probability: number; + template: SpawnpointTemplate; + itemDistribution: ItemDistribution[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IMetricsTableData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IMetricsTableData.d.ts new file mode 100644 index 0000000..873ef82 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IMetricsTableData.d.ts @@ -0,0 +1,7 @@ +export interface IMetricsTableData { + Keys: number[]; + NetProcessingBins: number[]; + RenderBins: number[]; + GameUpdateBins: number[]; + MemoryMeasureInterval: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IPmcData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IPmcData.d.ts new file mode 100644 index 0000000..adc2aa5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/IPmcData.d.ts @@ -0,0 +1,341 @@ +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +import { IPmcDataRepeatableQuest } from "./tables/IRepeatableQuests"; +import { Item, Upd } from "./tables/IItem"; +import { HideoutAreas } from "../../enums/HideoutAreas"; +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IPmcData { + _id: string; + aid: string; + savage: string; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: Record; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: InsuredItem[]; + Hideout: Hideout; + Bonuses: Bonus[]; + Notes: Notes; + Quests: Quest[]; + TradersInfo: Record; + RagfairInfo: RagfairInfo; + WishList: string[]; + RepeatableQuests: IPmcDataRepeatableQuest[]; + CarExtractCounts: CarExtractCounts; + SurvivorClass: SurvivorClass; +} +export declare enum SurvivorClass { + Unknown = 0, + Neutralizer = 1, + Marauder = 2, + Paramedic = 3, + Survivor = 4 +} +export interface Info { + EntryPoint: string; + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: MemberCategory; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + IsStreamerModeAvailable: boolean; + Bans: IBan[]; + BannedState: boolean; + BannedUntil: number; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface IBan { + type: BanType; + dateTime: number; +} +export declare enum BanType { + Chat = 0, + RagFair = 1, + Voip = 2, + Trading = 3, + Online = 4, + Friends = 5, + ChangeNickname = 6 +} +export interface Notes { + Notes: Note[]; +} +export interface Note { + Time: number; + Text: string; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { + Hydration: CurrentMax; + Energy: CurrentMax; + Temperature: CurrentMax; + BodyParts: BodyPartsHealth; + UpdateTime: number; +} +export interface BodyPartsHealth { + Head: BodyPartHealth; + Chest: BodyPartHealth; + Stomach: BodyPartHealth; + LeftArm: BodyPartHealth; + RightArm: BodyPartHealth; + LeftLeg: BodyPartHealth; + RightLeg: BodyPartHealth; +} +export interface BodyPartHealth { + Health: CurrentMax; + Effects?: Record; +} +export interface CurrentMax { + Current: number; + Maximum: number; +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: Common[]; + Mastering: Mastering[]; + Bonuses?: any[]; + Points: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession: number; + LastAccess: number; +} +export interface Mastering { + Id: string; + Progress: number; +} +export interface Stats { + CarriedQuestItems: string[]; + Victims: Victim[]; + TotalSessionExperience: number; + LastSessionDate: number; + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; + SessionExperienceMult?: number; + ExperienceBonusMult?: number; + Aggressor?: Aggressor; + DroppedItems?: IDroppedItem[]; + FoundInRaidItems?: FoundInRaidItem[]; + DamageHistory?: DamageHistory; + DeathCause?: DeathCause; + LastPlayerState?: LastPlayerState; + TotalInGameTime: number; + SurvivorClass?: string; +} +export interface IDroppedItem { + QuestId: string; + ItemId: string; + ZoneId: string; +} +export interface FoundInRaidItem { + QuestId: string; + ItemId: string; +} +export interface Victim { + AccountId: string; + ProfileId: string; + Name: string; + Side: string; + BodyPart: string; + Time: string; + Distance: number; + Level: number; + Weapon: string; + Role: string; +} +export interface SessionCounters { + Items: CounterKeyValue[]; +} +export interface OverallCounters { + Items: CounterKeyValue[]; +} +export interface CounterKeyValue { + Key: string[]; + Value: number; +} +export interface Aggressor { + AccountId: string; + ProfileId: string; + MainProfileNickname: string; + Name: string; + Side: string; + BodyPart: string; + HeadSegment: string; + WeaponName: string; + Category: string; +} +export interface DamageHistory { + LethalDamagePart: string; + LethalDamage: LethalDamage; + BodyParts: BodyPartsDamageHistory; +} +export interface LethalDamage { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface BodyPartsDamageHistory { + Head: DamageStats[]; + Chest: DamageStats[]; + Stomach: DamageStats[]; + LeftArm: DamageStats[]; + RightArm: DamageStats[]; + LeftLeg: DamageStats[]; + RightLeg: DamageStats[]; + Common: DamageStats[]; +} +export interface DamageStats { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface DeathCause { + DamageType: string; + Side: string; + Role: string; + WeaponId: string; +} +export interface LastPlayerState { + Info: LastPlayerStateInfo; + Customization: Record; + Equipment: any; +} +export interface LastPlayerStateInfo { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; +} +export interface ConditionCounters { + Counters: Counter[]; +} +export interface Counter { + id: string; + value: number; + qid: string; +} +export interface BackendCounter { + id: string; + qid?: string; + value: number; +} +export interface InsuredItem { + tid: string; + itemId: string; +} +export interface Hideout { + Production: Record; + Areas: HideoutArea[]; +} +export interface Productive { + Products: Product[]; + Progress?: number; + inProgress?: boolean; + StartTimestamp?: number; +} +export interface Product { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface ScavCase extends Productive { +} +export interface Production extends Productive { + RecipeId: string; + SkipTime: number; + ProductionTime: number; +} +export interface HideoutArea { + type: HideoutAreas; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: HideoutSlot[]; + lastRecipe: string; +} +export interface HideoutSlot { + item: HideoutItem[]; +} +export interface HideoutItem { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface Bonus { + type: string; + templateId?: string; + passive?: boolean; + production?: boolean; + visible?: boolean; + value?: number; + icon?: string; +} +export interface Quest { + qid: string; + startTime: number; + status: string; + statusTimers?: StatusTimer; + completedConditions?: string[]; +} +export interface StatusTimer { + AvailableForStart?: number; +} +export interface TraderInfo { + loyaltyLevel: number; + salesSum: number; + standing: number; + nextResupply: number; + unlocked: boolean; +} +export interface RagfairInfo { + rating: number; + isRatingGrowing: boolean; + offers: IRagfairOffer[]; +} +export interface CarExtractCounts { +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/MemberCategory.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts new file mode 100644 index 0000000..7303275 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts @@ -0,0 +1,9 @@ +export interface IBaseInteractionRequestData { + Action: string; + fromOwner?: OwnerInfo; + toOwner?: OwnerInfo; +} +export interface OwnerInfo { + id: string; + type: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotBase.d.ts new file mode 100644 index 0000000..677fd49 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotBase.d.ts @@ -0,0 +1,101 @@ +import { BackendCounter, Bonus } from "../IPmcData"; +import { Item } from "./IItem"; +export interface IBotBase { + _id: string; + aid: string; + savage: any; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: any; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: any[]; + Hideout: Hideout; + Bonuses: Bonus[]; +} +export interface Info { + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: number; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + NeedWipeOptions: any[]; + lastCompletedWipe: any; + BannedState: boolean; + BannedUntil: number; + IsStreamerModeAvailable: boolean; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: any[]; + Mastering: any[]; + Points: number; +} +export interface Stats { + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; +} +export interface SessionCounters { + Items: any[]; +} +export interface OverallCounters { + Items: any[]; +} +export interface ConditionCounters { + Counters: any[]; +} +export interface Hideout { + Production: Production; + Areas: Area[]; +} +export interface Production { +} +export interface Area { + type: number; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: any[]; + lastRecipe: any; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotCore.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotCore.d.ts new file mode 100644 index 0000000..16a782d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotCore.d.ts @@ -0,0 +1,133 @@ +export interface IBotCore { + SAVAGE_KILL_DIST: number; + SOUND_DOOR_BREACH_METERS: number; + SOUND_DOOR_OPEN_METERS: number; + STEP_NOISE_DELTA: number; + JUMP_NOISE_DELTA: number; + GUNSHOT_SPREAD: number; + GUNSHOT_SPREAD_SILENCE: number; + BASE_WALK_SPEREAD2: number; + MOVE_SPEED_COEF_MAX: number; + SPEED_SERV_SOUND_COEF_A: number; + SPEED_SERV_SOUND_COEF_B: number; + G: number; + STAY_COEF: number; + SIT_COEF: number; + LAY_COEF: number; + MAX_ITERATIONS: number; + START_DIST_TO_COV: number; + MAX_DIST_TO_COV: number; + STAY_HEIGHT: number; + CLOSE_POINTS: number; + COUNT_TURNS: number; + SIMPLE_POINT_LIFE_TIME_SEC: number; + DANGER_POINT_LIFE_TIME_SEC: number; + DANGER_POWER: number; + COVER_DIST_CLOSE: number; + GOOD_DIST_TO_POINT: number; + COVER_TOOFAR_FROM_BOSS: number; + COVER_TOOFAR_FROM_BOSS_SQRT: number; + MAX_Y_DIFF_TO_PROTECT: number; + FLARE_POWER: number; + MOVE_COEF: number; + PRONE_POSE: number; + LOWER_POSE: number; + MAX_POSE: number; + FLARE_TIME: number; + MAX_REQUESTS__PER_GROUP: number; + UPDATE_GOAL_TIMER_SEC: number; + DIST_NOT_TO_GROUP: number; + DIST_NOT_TO_GROUP_SQR: number; + LAST_SEEN_POS_LIFETIME: number; + DELTA_GRENADE_START_TIME: number; + DELTA_GRENADE_END_TIME: number; + DELTA_GRENADE_RUN_DIST: number; + DELTA_GRENADE_RUN_DIST_SQRT: number; + PATROL_MIN_LIGHT_DIST: number; + HOLD_MIN_LIGHT_DIST: number; + STANDART_BOT_PAUSE_DOOR: number; + ARMOR_CLASS_COEF: number; + SHOTGUN_POWER: number; + RIFLE_POWER: number; + PISTOL_POWER: number; + SMG_POWER: number; + SNIPE_POWER: number; + GESTUS_PERIOD_SEC: number; + GESTUS_AIMING_DELAY: number; + GESTUS_REQUEST_LIFETIME: number; + GESTUS_FIRST_STAGE_MAX_TIME: number; + GESTUS_SECOND_STAGE_MAX_TIME: number; + GESTUS_MAX_ANSWERS: number; + GESTUS_FUCK_TO_SHOOT: number; + GESTUS_DIST_ANSWERS: number; + GESTUS_DIST_ANSWERS_SQRT: number; + GESTUS_ANYWAY_CHANCE: number; + TALK_DELAY: number; + CAN_SHOOT_TO_HEAD: boolean; + CAN_TILT: boolean; + TILT_CHANCE: number; + MIN_BLOCK_DIST: number; + MIN_BLOCK_TIME: number; + COVER_SECONDS_AFTER_LOSE_VISION: number; + MIN_ARG_COEF: number; + MAX_ARG_COEF: number; + DEAD_AGR_DIST: number; + MAX_DANGER_CARE_DIST_SQRT: number; + MAX_DANGER_CARE_DIST: number; + MIN_MAX_PERSON_SEARCH: number; + PERCENT_PERSON_SEARCH: number; + LOOK_ANYSIDE_BY_WALL_SEC_OF_ENEMY: number; + CLOSE_TO_WALL_ROTATE_BY_WALL_SQRT: number; + SHOOT_TO_CHANGE_RND_PART_MIN: number; + SHOOT_TO_CHANGE_RND_PART_MAX: number; + SHOOT_TO_CHANGE_RND_PART_DELTA: number; + FORMUL_COEF_DELTA_DIST: number; + FORMUL_COEF_DELTA_SHOOT: number; + FORMUL_COEF_DELTA_FRIEND_COVER: number; + SUSPETION_POINT_DIST_CHECK: number; + MAX_BASE_REQUESTS_PER_PLAYER: number; + MAX_HOLD_REQUESTS_PER_PLAYER: number; + MAX_GO_TO_REQUESTS_PER_PLAYER: number; + MAX_COME_WITH_ME_REQUESTS_PER_PLAYER: number; + CORE_POINT_MAX_VALUE: number; + CORE_POINTS_MAX: number; + CORE_POINTS_MIN: number; + BORN_POISTS_FREE_ONLY_FAREST_BOT: boolean; + BORN_POINSTS_FREE_ONLY_FAREST_PLAYER: boolean; + SCAV_GROUPS_TOGETHER: boolean; + LAY_DOWN_ANG_SHOOT: number; + HOLD_REQUEST_TIME_SEC: number; + TRIGGERS_DOWN_TO_RUN_WHEN_MOVE: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING_OTHER_ENEMIS: number; + MIN_DIST_TO_STOP_RUN: number; + JUMP_SPREAD_DIST: number; + LOOK_TIMES_TO_KILL: number; + COME_INSIDE_TIMES: number; + TOTAL_TIME_KILL: number; + TOTAL_TIME_KILL_AFTER_WARN: number; + MOVING_AIM_COEF: number; + VERTICAL_DIST_TO_IGNORE_SOUND: number; + DEFENCE_LEVEL_SHIFT: number; + MIN_DIST_CLOSE_DEF: number; + USE_ID_PRIOR_WHO_GO: boolean; + SMOKE_GRENADE_RADIUS_COEF: number; + GRENADE_PRECISION: number; + MAX_WARNS_BEFORE_KILL: number; + CARE_ENEMY_ONLY_TIME: number; + MIDDLE_POINT_COEF: number; + MAIN_TACTIC_ONLY_ATTACK: boolean; + LAST_DAMAGE_ACTIVE: number; + SHALL_DIE_IF_NOT_INITED: boolean; + CHECK_BOT_INIT_TIME_SEC: number; + WEAPON_ROOT_Y_OFFSET: number; + DELTA_SUPRESS_DISTANCE_SQRT: number; + DELTA_SUPRESS_DISTANCE: number; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + WAVE_ONLY_AS_ONLINE: boolean; + LOCAL_BOTS_COUNT: number; + AXE_MAN_KILLS_END: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotType.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotType.d.ts new file mode 100644 index 0000000..01be0be --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IBotType.d.ts @@ -0,0 +1,176 @@ +export interface IBotType { + appearance: Appearance; + chances: Chances; + difficulty: Difficulties; + experience: Experience; + firstName: string[]; + generation: Generation; + health: Health; + inventory: Inventory; + lastName: string[]; + skills: Skills; +} +export interface Appearance { + body: string[]; + feet: string[]; + hands: string[]; + head: string[]; + voice: string[]; +} +export interface Chances { + equipment: EquipmentChances; + mods: ModsChances; +} +export interface EquipmentChances { + ArmBand: number; + ArmorVest: number; + Backpack: number; + Earpiece: number; + Eyewear: number; + FaceCover: number; + FirstPrimaryWeapon: number; + Headwear: number; + Holster: number; + Pockets: number; + Scabbard: number; + SecondPrimaryWeapon: number; + SecuredContainer: number; + TacticalVest: number; +} +export interface ModsChances { + mod_charge: number; + mod_equipment: number; + mod_equipment_000: number; + mod_equipment_001: number; + mod_equipment_002: number; + mod_flashlight: number; + mod_foregrip: number; + mod_launcher: number; + mod_magazine: number; + mod_mount: number; + mod_mount_000: number; + mod_mount_001: number; + mod_muzzle: number; + mod_nvg: number; + mod_pistol_grip: number; + mod_reciever: number; + mod_scope: number; + mod_sight_front: number; + mod_sight_rear: number; + mod_stock: number; + mod_stock_000: number; + mod_stock_akms: number; + mod_tactical: number; + mod_tactical_000: number; + mod_tactical_001: number; + mod_tactical_002: number; + mod_tactical_003: number; +} +export interface Difficulties { + easy: Difficulty; + normal: Difficulty; + hard: Difficulty; + impossible: Difficulty; +} +export interface Difficulty { + Aiming: Record; + Boss: Record; + Change: Record; + Core: Record; + Cover: Record; + Grenade: Record; + Hearing: Record; + Lay: Record; + Look: Record; + Mind: Record; + Move: Record; + Patrol: Record; + Scattering: Record; + Shoot: Record; +} +export interface Experience { + aggressorBonus: number; + level: MinMax; + reward: MinMax; + standingForKill: number; +} +export interface Generation { + items: ItemMinMax; +} +export interface ItemMinMax { + grenades: MinMax; + healing: MinMax; + drugs: MinMax; + stims: MinMax; + looseLoot: MinMax; + magazines: MinMax; + specialItems: MinMax; +} +export interface Health { + BodyParts: BodyPart[]; + Energy: MinMax; + Hydration: MinMax; + Temperature: MinMax; +} +export interface BodyPart { + Chest: MinMax; + Head: MinMax; + LeftArm: MinMax; + LeftLeg: MinMax; + RightArm: MinMax; + RightLeg: MinMax; + Stomach: MinMax; +} +export interface MinMax { + max: number; + min: number; +} +export interface Inventory { + equipment: Equipment; + items: Items; + mods: Mods; +} +export interface Equipment { + ArmBand: Record; + ArmorVest: Record; + Backpack: Record; + Earpiece: Record; + Eyewear: Record; + FaceCover: Record; + FirstPrimaryWeapon: Record; + Headwear: Record; + Holster: Record; + Pockets: Record; + Scabbard: Record; + SecondPrimaryWeapon: Record; + SecuredContainer: Record; + TacticalVest: Record; +} +export interface Items { + Backpack: string[]; + Pockets: string[]; + SecuredContainer: string[]; + SpecialLoot: string[]; + TacticalVest: string[]; +} +export declare type Mods = Record>; +export interface Skills { + Common: Common[]; + Bonuses?: any; + Mastering: Mastering[]; + Points: number; +} +export interface Mastering { + Id: string; + Progress: number; + max?: number; + min?: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession?: number; + LastAccess?: number; + max?: number; + min?: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ICustomizationItem.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ICustomizationItem.d.ts new file mode 100644 index 0000000..8bfeece --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ICustomizationItem.d.ts @@ -0,0 +1,33 @@ +export interface ICustomizationItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Side: string[]; + BodyPart: string; + AvailableAsDefault?: boolean; + Body: string; + Hands: string; + Feet: string; + Prefab: Prefab; + WatchPrefab: Prefab; + IntegratedArmorVest: boolean; + WatchPosition: Xyz; + WatchRotation: Xyz; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Xyz { + x: number; + y: number; + z: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IHandbookBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IHandbookBase.d.ts new file mode 100644 index 0000000..7d7db07 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IHandbookBase.d.ts @@ -0,0 +1,16 @@ +export interface IHandbookBase { + Categories: Category[]; + Items: HandbookItem[]; +} +export interface Category { + Id: string; + ParentId?: string; + Icon: string; + Color: string; + Order: string; +} +export interface HandbookItem { + Id: string; + ParentId: string; + Price: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IItem.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IItem.d.ts new file mode 100644 index 0000000..2dd2c03 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IItem.d.ts @@ -0,0 +1,108 @@ +export interface Item { + _id: string; + _tpl: string; + parentId?: string; + slotId?: string; + location?: Location | number; + upd?: Upd; +} +export interface Upd { + OriginalStackObjectsCount?: number; + Togglable?: Togglable; + Map?: Map; + Tag?: Tag; + sptPresetId?: string; + FaceShield?: FaceShield; + StackObjectsCount?: number; + UnlimitedCount?: boolean; + Repairable?: Repairable; + FireMode?: FireMode; + SpawnedInSession?: boolean; + Light?: Light; + Key?: Key; + Resource?: Resource; + Sight?: Sight; + MedKit?: MedKit; + FoodDrink?: FoodDrink; + Dogtag?: Dogtag; + BuyRestrictionMax?: number; + BuyRestrictionCurrent?: number; + Foldable?: Foldable; + SideEffect?: SideEffect; + RepairKit?: RepairKit; +} +export interface Togglable { + On: boolean; +} +export interface Map { + Markers: MapMarker[]; +} +export interface MapMarker { + X: number; + Y: number; +} +export interface Tag { + Color: number; + Name: string; +} +export interface FaceShield { + Hits: number; +} +export interface Repairable { + Durability: number; + MaxDurability: number; +} +export interface MedKit { + HpResource: number; +} +export interface Sight { + ScopesCurrentCalibPointIndexes: number[]; + ScopesSelectedModes: number[]; + SelectedScope: number; +} +export interface Foldable { + Folded: boolean; +} +export interface FireMode { + FireMode: string; +} +export interface FoodDrink { + HpPercent: number; +} +export interface Key { + NumberOfUsages: number; +} +export interface Resource { + Value: number; + UnitsConsumed: number; +} +export interface Light { + IsActive: boolean; + SelectedMode: number; +} +export interface Dogtag { + AccountId: string; + ProfileId: string; + Nickname: string; + Side: string; + Level: number; + Time: string; + Status: string; + KillerAccountId: string; + KillerProfileId: string; + KillerName: string; + WeaponName: string; +} +export interface Location { + x: number; + y: number; + r: string | number; + isSearched?: boolean; + rotation?: string; +} +export interface SideEffect { + Value: number; +} +export interface RepairKit { + Resource: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ILocationsBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ILocationsBase.d.ts new file mode 100644 index 0000000..2c96af3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ILocationsBase.d.ts @@ -0,0 +1,10 @@ +export interface ILocationsBase { + locations: Locations; + paths: Path[]; +} +export interface Locations { +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ILootBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ILootBase.d.ts new file mode 100644 index 0000000..e4baac5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ILootBase.d.ts @@ -0,0 +1,64 @@ +import { Item } from "./IItem"; +export interface ILootBase { + staticAmmo: Record; + staticContainers: Record; + staticLoot: Record; +} +export interface IStaticAmmoDetails { + tpl: string; + relativeProbability: number; +} +export interface IStaticContainerDetails { + staticWeapons: IStaticWeaponProps[]; + staticContainers: IStaticContainerProps[]; + staticForced: IStaticForcedProps[]; +} +export interface IStaticWeaponProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: string; + Items: Item[]; +} +export interface IStaticContainerProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: StaticItem[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StaticItem { + _id: any; + _tpl: string; +} +export interface IStaticForcedProps { + containerId: string; + itemTpl: string; +} +export interface IStaticLootDetails { + itemcountDistribution: ItemCountDistribution[]; + itemDistribution: ItemDistribution[]; +} +export interface ItemCountDistribution { + count: number; + relativeProbability: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IQuest.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IQuest.d.ts new file mode 100644 index 0000000..e1fc888 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IQuest.d.ts @@ -0,0 +1,110 @@ +import { Item } from "./IItem"; +export interface IQuest { + QuestName: string; + _id: string; + canShowNotificationsInGame: boolean; + conditions: Conditions; + description: string; + failMessageText: string; + name: string; + note: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + startedMessageText: string; + successMessageText: string; + templateId: string; + rewards: Rewards; + status: string; + KeyQuest: boolean; + changeQuestMessageText: string; +} +export interface Conditions { + Started: AvailableForConditions[]; + AvailableForFinish: AvailableForConditions[]; + AvailableForStart: AvailableForConditions[]; + Success: AvailableForConditions[]; + Fail: AvailableForConditions[]; +} +export interface AvailableForConditions { + _parent: string; + _props: AvailableForProps; + dynamicLocale: boolean; +} +export interface AvailableForProps { + id: string; + index: number; + parentId: string; + dynamicLocale: boolean; + value?: number; + compareMethod?: string; + visibilityConditions?: VisibilityCondition[]; + target?: string | string[]; + status?: number[]; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; +} +export interface AvailableForCounter { + id: string; + conditions: CounterCondition[]; +} +export interface CounterCondition { + _parent: string; + _props: CounterProps; +} +export interface CounterProps { + id: string; + target: string[] | string; + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; +} +export interface DaytimeCounter { + from: number; + to: number; +} +export interface VisibilityCondition { + id: string; + value: number; + dynamicLocale: boolean; + oneSessionOnly: boolean; +} +export interface Rewards { + AvailableForStart: Reward[]; + AvailableForFinish: Reward[]; + Started: Reward[]; + Success: Reward[]; + Fail: Reward[]; + FailRestartable: Reward[]; + Expired: Reward[]; +} +export interface Reward { + value?: string; + id: string; + type: string; + index: number; + target?: string; + items?: Item[]; + loyaltyLevel?: number; + traderId?: string; + unknown?: boolean; + findInRaid?: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IRepeatableQuests.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IRepeatableQuests.d.ts new file mode 100644 index 0000000..e23ec73 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/IRepeatableQuests.d.ts @@ -0,0 +1,219 @@ +import { Item } from "./IItem"; +export interface IReward { + index: number; + type: string; + value: number; + target?: string; + items?: Item[]; +} +export interface IRepeatableQuestDatabase { + templates: ITemplates; + rewards: IRewardOptions; + data: IOptions; + samples: ISampleQuests[]; +} +export interface ITemplates { + Elimination: IRepeatableQuest; + Completion: IRepeatableQuest; + Exploration: IRepeatableQuest; +} +export interface IPmcDataRepeatableQuest { + id?: string; + name: string; + activeQuests: IRepeatableQuest[]; + inactiveQuests: IRepeatableQuest[]; + endTime: number; + changeRequirement: TChangeRequirementRecord; +} +export declare type TChangeRequirementRecord = Record; +export interface IChangeRequirement { + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IChangeCost { + templateId: string; + count: number; +} +export interface IRepeatableQuest { + _id: any; + traderId: string; + location: any; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + changeQuestMessageText: string; + templateId: string; + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IRewards { + Started: IReward[]; + Success: IReward[]; + Fail: IReward[]; +} +export interface IConditions { + AvailableForStart: any[]; + AvailableForFinish: IAvailableFor[]; + Fail: any[]; +} +export interface IAvailableFor { + _props: IAvailableForProps; + _parent: string; + dynamicLocale: boolean; +} +export interface IAvailableForProps { + id: string; + parentId: string; + dynamicLocale: boolean; + index: number; + visibilityConditions: IVisibilityCondition[]; + value: number; +} +export interface IVisibilityCondition { + id: string; + oneSessionOnly: boolean; + value: number; + index: number; + dynamicLocale: boolean; +} +export interface IAvailableForPropsCounter extends IAvailableForProps { + type: string; + oneSessionOnly: boolean; + doNotResetIfCounterCompleted: boolean; + counter: ICounter; +} +export interface ICounter { + id: string; + conditions: ICondition[]; +} +export interface ICondition { + _props: IConditionProps; + _parent: string; +} +export interface IConditionProps { + id: string; + dynamicLocale: boolean; +} +export interface IElimination extends IRepeatableQuest { + conditions: IEliminationConditions; +} +export interface IEliminationConditions extends IConditions { + AvailableForFinish: IEliminationAvailableFor[]; +} +export interface IEliminationAvailableFor extends IAvailableFor { + _props: IEliminationAvailableForProps; +} +export interface IEliminationAvailableForProps extends IAvailableForPropsCounter { + counter: IEliminationCounter; +} +export interface IEliminationCounter extends ICounter { + conditions: IEliminationCondition[]; +} +export interface IEliminationCondition extends ICondition { + _props: ILocationConditionProps | IKillConditionProps; +} +export interface IExploration extends IRepeatableQuest { + conditions: IExplorationConditions; +} +export interface IExplorationConditions extends IConditions { + AvailableForFinish: IExplorationAvailableFor[]; +} +export interface IExplorationAvailableFor extends IAvailableFor { + _props: IExplorationAvailableForProps; +} +export interface IExplorationAvailableForProps extends IAvailableForPropsCounter { + counter: IExplorationCounter; +} +export interface IExplorationCounter extends ICounter { + conditions: IExplorationCondition[]; +} +export interface IExplorationCondition extends ICondition { + _props: ILocationConditionProps | IExitStatusConditionProps | IExitNameConditionProps; +} +export interface ICompletion extends IRepeatableQuest { + conditions: ICompletionConditions; +} +export interface ICompletionConditions extends IConditions { + AvailableForFinish: ICompletionAvailableFor[]; +} +export interface ICompletionAvailableFor extends IAvailableFor { + _props: ICompletionAvailableForProps; +} +export interface ICompletionAvailableForProps extends IAvailableForProps { + target: string[]; + minDurability: number; + maxDurability: number; + dogtagLevel: number; + onlyFoundInRaid: boolean; +} +export interface ILocationConditionProps extends IConditionProps { + target: string[]; +} +export interface IKillConditionProps extends IConditionProps { + target: string; + value: number; + savageRole?: string[]; + bodyPart?: string[]; + distance?: IDistanceCheck; +} +export interface IDistanceCheck { + compareMethod: string; + value: number; +} +export interface IExitStatusConditionProps extends IConditionProps { + status: string[]; +} +export interface IExitNameConditionProps extends IConditionProps { + exitName: string; +} +export interface IRewardOptions { + itemsBlacklist: string[]; +} +export interface IOptions { + Completion: ICompletionFilter; +} +export interface ICompletionFilter { + itemsBlacklist: ItemsBlacklist[]; + itemsWhitelist: ItemsWhitelist[]; +} +export interface ItemsBlacklist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ItemsWhitelist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ISampleQuests { + _id: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + templateId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ITemplateItem.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ITemplateItem.d.ts new file mode 100644 index 0000000..c2ba762 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ITemplateItem.d.ts @@ -0,0 +1,401 @@ +export interface ITemplateItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Weight: number; + BackgroundColor: string; + Width: number; + Height: number; + StackMaxSize: number; + Rarity?: string; + SpawnChance?: number; + CreditsPrice?: number; + ItemSound: string; + Prefab: Prefab; + UsePrefab: Prefab; + StackObjectsCount: number; + NotShownInSlot: boolean; + ExaminedByDefault: boolean; + ExamineTime: number; + IsUndiscardable: boolean; + IsUnsaleable: boolean; + IsUnbuyable: boolean; + IsUngivable: boolean; + IsLockedafterEquip: boolean; + QuestItem: boolean; + LootExperience: number; + ExamineExperience: number; + HideEntrails: boolean; + RepairCost: number; + RepairSpeed: number; + ExtraSizeLeft: number; + ExtraSizeRight: number; + ExtraSizeUp: number; + ExtraSizeDown: number; + ExtraSizeForceAdd: boolean; + MergesWithChildren: boolean; + CanSellOnRagfair: boolean; + CanRequireOnRagfair: boolean; + ConflictingItems: string[]; + DiscardLimit: number; + Unlootable: boolean; + UnlootableFromSlot: string; + UnlootableFromSide: string[]; + AnimationVariantsNumber: number; + DiscardingBlock: boolean; + RagFairCommissionModifier: number; + IsAlwaysAvailableForInsurance: boolean; + Grids: Grid[]; + Slots: Slot[]; + CanPutIntoDuringTheRaid: boolean; + CantRemoveFromSlotsDuringRaid: string[]; + weapClass: string; + weapUseType: string; + ammoCaliber: string; + Durability: number; + MaxDurability: number; + OperatingResource: number; + RepairComplexity: number; + durabSpawnMin: number; + durabSpawnMax: number; + isFastReload: boolean; + RecoilForceUp: number; + RecoilForceBack: number; + Convergence: number; + RecoilAngle: number; + weapFireType: string[]; + RecolDispersion: number; + SingleFireRate: number; + CanQueueSecondShot: boolean; + bFirerate: number; + Ergonomics: number; + Velocity: number; + bEffDist: number; + bHearDist: number; + isChamberLoad: boolean; + chamberAmmoCount: number; + isBoltCatch: boolean; + defMagType: string; + defAmmo: string; + AdjustCollimatorsToTrajectory: boolean; + shotgunDispersion: number; + Chambers: Chamber[]; + CameraRecoil: number; + CameraSnap: number; + ReloadMode: string; + CenterOfImpact: number; + AimPlane: number; + DeviationCurve: number; + DeviationMax: number; + Foldable: boolean; + Retractable: boolean; + TacticalReloadStiffnes: Xyz; + TacticalReloadFixation: number; + RecoilCenter: Xyz; + RotationCenter: Xyz; + RotationCenterNoStock: Xyz; + SizeReduceRight: number; + FoldedSlot: string; + CompactHandling: boolean; + SightingRange: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; + IronSightRange: number; + MustBoltBeOpennedForExternalReload: boolean; + MustBoltBeOpennedForInternalReload: boolean; + BoltAction: boolean; + HipAccuracyRestorationDelay: number; + HipAccuracyRestorationSpeed: number; + HipInnaccuracyGain: number; + ManualBoltCatch: boolean; + BurstShotsCount: number; + BaseMalfunctionChance: number; + AllowJam: boolean; + AllowFeed: boolean; + AllowMisfire: boolean; + AllowSlide: boolean; + DurabilityBurnRatio: number; + HeatFactorGun: number; + CoolFactorGun: number; + CoolFactorGunMods: number; + HeatFactorByShot: number; + AllowOverheat: boolean; + DoubleActionAccuracyPenalty: number; + RecoilPosZMult: number; + ShotgunDispersion: number; + StackMinRandom: number; + StackMaxRandom: number; + StackSlots: StackSlot[]; + SearchSound: string; + BlocksArmorVest: boolean; + RigLayoutName: string; + armorZone: string[]; + armorClass: number; + speedPenaltyPercent: number; + mousePenalty: number; + weaponErgonomicPenalty: number; + BluntThroughput: number; + ArmorMaterial: string; + medUseTime: number; + medEffectType: string; + MaxHpResource: number; + hpResourceRate: number; + StimulatorBuffs: string; + effects_health: EffectsHealth; + effects_damage: EffectsDamage; + knifeHitDelay: number; + knifeHitSlashRate: number; + knifeHitStabRate: number; + knifeHitRadius: number; + knifeHitSlashDam: number; + knifeHitStabDam: number; + knifeDurab: number; + PrimaryDistance: number; + SecondryDistance: number; + SlashPenetration: number; + StabPenetration: number; + PrimaryConsumption: number; + SecondryConsumption: number; + DeflectionConsumption: number; + MaxResource: number; + AppliedTrunkRotation: Xyz; + AppliedHeadRotation: Xyz; + DisplayOnModel: boolean; + AdditionalAnimationLayer: number; + StaminaBurnRate: number; + ColliderScaleMultiplier: Xyz; + ammoType: string; + InitialSpeed: number; + BallisticCoeficient: number; + BulletMassGram: number; + BulletDiameterMilimeters: number; + Damage: number; + ammoAccr: number; + ammoRec: number; + ammoDist: number; + buckshotBullets: number; + PenetrationPower: number; + PenetrationPowerDiviation: number; + ammoHear: number; + ammoSfx: string; + MisfireChance: number; + MinFragmentsCount: number; + MaxFragmentsCount: number; + ammoShiftChance: number; + casingName: string; + casingEjectPower: number; + casingMass: number; + casingSounds: string; + ProjectileCount: number; + PenetrationChance: number; + RicochetChance: number; + FragmentationChance: number; + Deterioration: number; + SpeedRetardation: number; + Tracer: boolean; + TracerColor: string; + TracerDistance: number; + ArmorDamage: number; + Caliber: string; + StaminaBurnPerDamage: number; + HeavyBleedingDelta: number; + LightBleedingDelta: number; + ShowBullet: boolean; + HasGrenaderComponent: boolean; + FuzeArmTimeSec: number; + ExplosionStrength: number; + MinExplosionDistance: number; + MaxExplosionDistance: number; + FragmentsCount: number; + FragmentType: string; + ShowHitEffectOnExplode: boolean; + ExplosionType: string; + AmmoLifeTimeSec: number; + Contusion: Contusion; + ArmorDistanceDistanceDamage: Xyz; + Blindness: Xyz; + IsLightAndSoundShot: boolean; + LightAndSoundShotAngle: number; + LightAndSoundShotSelfContusionTime: number; + LightAndSoundShotSelfContusionStrength: number; + MalfMisfireChance: number; + DurabilityBurnModificator: number; + HeatFactor: number; + MalfFeedChance: number; + Accuracy: number; + Recoil: number; + Loudness: number; + EffectiveDistance: number; + RaidModdable: boolean; + ToolModdable: boolean; + BlocksFolding: boolean; + BlocksCollapsible: boolean; + IsAnimated: boolean; + HasShoulderContact: boolean; + DoubleActionAccuracyPenaltyMult: number; + magAnimationIndex: number; + Cartridges: Cartridge[]; + CanFast: boolean; + CanHit: boolean; + CanAdmin: boolean; + LoadUnloadModifier: number; + CheckTimeModifier: number; + CheckOverride: number; + ReloadMagType: string; + VisibleAmmoRangesString: string; + MalfunctionChance: number; + TagColor: number; + TagName: string; + MaximumNumberOfUsage: number; + CustomAimPlane: string; + sightModType: string; + aimingSensitivity: number; + SightModesCount: number; + OpticCalibrationDistances: number[]; + ScopesCount: number; + AimSensitivity: number[][]; + ModesCount: number[]; + Zooms: number[][]; + CalibrationDistances: number[][]; + Intensity: number; + Mask: string; + MaskSize: number; + NoiseIntensity: number; + NoiseScale: number; + Color: Color; + DiffuseIntensity: number; + HasHinge: boolean; + Resource?: number; + CoolFactor?: number; + foodUseTime?: number; + foodEffectType?: string; + MaxRepairResource: number; + RepairQuality: number; + RepairType: string; + TargetItemFilter: string[]; + apResource: number; + krResource: number; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Grid { + _name: string; + _id: string; + _parent: string; + _props: GridProps; + _proto: string; +} +export interface GridProps { + filters: GridFilter[]; + cellsH: number; + cellsV: number; + minCount: number; + maxCount: number; + maxWeight: number; + isSortingTable: boolean; +} +export interface GridFilter { + Filter: string[]; + ExcludedFilter: string[]; +} +export interface Slot { + _name: string; + _id: string; + _parent: string; + _props: SlotProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface SlotProps { + filters: Filter[]; +} +export interface Chamber { + _name: string; + _id: string; + _parent: string; + _props: ChamberProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface ChamberProps { + filters: FilterProps[]; +} +export interface FilterProps { + Filter: string[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StackSlot { + _name?: string; + _id: string; + _sptTpl: string; + parent: string; + location: any; + slotId: string; + _max_count: number; + _props?: StackSlotProps; + _proto?: string; + upd: any; +} +export interface StackSlotProps { + filters: Filter[]; +} +export interface EffectsHealth { + Hydration: Hydration; +} +export interface Hydration { + value: number; +} +export interface EffectsDamage { + Pain: Pain; + Contusion: Contusion; +} +export interface Pain { + delay: number; + duration: number; + fadeOut: number; +} +export interface Contusion { + delay: number; + duration: number; + fadeOut: number; +} +export interface Cartridge { + _name: string; + _id: string; + _parent: string; + _max_count: number; + _props: CartridgeProps; + _proto: string; +} +export interface CartridgeProps { + filters: Filter[]; +} +export interface Filter { + Shift?: number; + Filter: string[]; + AnimationIndex?: number; +} +export interface Color { + r: number; + g: number; + b: number; + a: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ITrader.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ITrader.d.ts new file mode 100644 index 0000000..f0fe2b5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/common/tables/ITrader.d.ts @@ -0,0 +1,90 @@ +import { Item } from "./IItem"; +export interface ITrader { + assort: ITraderAssort; + base: ITraderBase; + dialogue?: Record; + questassort: Record>; + suits?: ISuit[]; +} +export interface ITraderBase { + refreshAssort: boolean; + _id: string; + avatar: string; + balance_dol: number; + balance_eur: number; + balance_rub: number; + buyer_up: boolean; + currency: string; + customization_seller: boolean; + discount: number; + discount_end: number; + gridHeight: number; + insurance: Insurance; + location: string; + loyaltyLevels: LoyaltyLevel[]; + medic: boolean; + name: string; + nextResupply: number; + nickname: string; + repair: Repair; + sell_category: string[]; + surname: string; + unlockedByDefault: boolean; +} +export interface Insurance { + availability: boolean; + excluded_category: string[]; + max_return_hour: number; + max_storage_time: number; + min_payment: number; + min_return_hour: number; +} +export interface LoyaltyLevel { + buy_price_coef: number; + exchange_price_coef: number; + heal_price_coef: number; + insurance_price_coef: number; + minLevel: number; + minSalesSum: number; + minStanding: number; + repair_price_coef: number; +} +export interface Repair { + availability: boolean; + currency: string; + currency_coefficient: number; + excluded_category: string[]; + excluded_id_list: any[]; + quality: string; +} +export interface ITraderAssort { + nextResupply?: number; + items: Item[]; + barter_scheme: Record; + loyal_level_items: Record; +} +export interface IBarterScheme { + count: number; + _tpl: string; + onlyFunctional?: boolean; +} +export interface ISuit { + _id: string; + tid: string; + suiteId: string; + isActive: boolean; + requirements: Requirements; +} +export interface Requirements { + loyaltyLevel: number; + profileLevel: number; + standing: number; + skillRequirements: string[]; + questRequirements: string[]; + itemRequirements: ItemRequirement[]; +} +export interface ItemRequirement { + count: number; + _tpl: string; + onlyFunctional: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/customization/IBuyClothingRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/customization/IBuyClothingRequestData.d.ts new file mode 100644 index 0000000..d19b70d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/customization/IBuyClothingRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IBuyClothingRequestData { + Action: "CustomizationBuy"; + offer: string; + items: ClothingItem[]; +} +export interface ClothingItem { + del: boolean; + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/customization/IWearClothingRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/customization/IWearClothingRequestData.d.ts new file mode 100644 index 0000000..122d9cf --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/customization/IWearClothingRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IWearClothingRequestData { + Action: "CustomizationWear"; + suites: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IFriendRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IFriendRequestData.d.ts new file mode 100644 index 0000000..9c326ac --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IFriendRequestData { + to: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts new file mode 100644 index 0000000..53d8289 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetAllAttachmentsRequestData { + dialogId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts new file mode 100644 index 0000000..076d414 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts @@ -0,0 +1,6 @@ +import { Message } from "../profile/IAkiProfile"; +export interface IGetAllAttachmentsResponse { + messages: Message[]; + profiles: any[]; + hasMessagesWithRewards: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts new file mode 100644 index 0000000..8f1beac --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetChatServerListRequestData { + VersionId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts new file mode 100644 index 0000000..1d0c0e8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts @@ -0,0 +1,16 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IGetFriendListDataResponse { + Friends: Friend[]; + Ignore: any[]; + InIgnoreList: any[]; +} +export interface Friend { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; + MemberCategory: MemberCategory; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts new file mode 100644 index 0000000..eed84b1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMailDialogInfoRequestData { + dialogId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts new file mode 100644 index 0000000..f8fbf5d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMailDialogListRequestData { + limit: number; + offset: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts new file mode 100644 index 0000000..43d416e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface IGetMailDialogViewRequestData { + type: MessageType; + dialogId: string; + limit: number; + time: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts new file mode 100644 index 0000000..4f8b946 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../common/IPmcData"; +import { Message } from "../profile/IAkiProfile"; +export interface IGetMailDialogViewResponseData { + messages: Message[]; + profiles: IPmcData[]; + hasMessagesWithRewards: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IPinDialogRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IPinDialogRequestData.d.ts new file mode 100644 index 0000000..57b8a00 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IPinDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IPinDialogRequestData { + dialogId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts new file mode 100644 index 0000000..874b828 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IRemoveDialogRequestData { + dialogId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/ISendMessageRequest.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/ISendMessageRequest.d.ts new file mode 100644 index 0000000..dd79deb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/ISendMessageRequest.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface ISendMessageRequest { + dialogId: string; + type: MessageType; + text: string; + replyTo: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts new file mode 100644 index 0000000..2076232 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISetDialogReadRequestData { + dialogs: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/game/IGameConfigResponse.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/game/IGameConfigResponse.d.ts new file mode 100644 index 0000000..eb37a39 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/game/IGameConfigResponse.d.ts @@ -0,0 +1,19 @@ +export interface IGameConfigResponse { + aid: string; + lang: string; + languages: Record; + ndaFree: boolean; + taxonomy: number; + activeProfileId: string; + backend: Backend; + utc_time: number; + totalInGame: number; + reportAvailable: boolean; + twitchEventMember: boolean; +} +export interface Backend { + Trading: string; + Messaging: string; + Main: string; + RagFair: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts new file mode 100644 index 0000000..a3ecad9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGameEmptyCrcRequestData { + crc: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/game/IVersionValidateRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/game/IVersionValidateRequestData.d.ts new file mode 100644 index 0000000..0aa0fed --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/game/IVersionValidateRequestData.d.ts @@ -0,0 +1,11 @@ +export interface IVersionValidateRequestData { + version: Version; + develop: boolean; +} +export interface Version { + major: string; + minor: string; + game: string; + backend: string; + taxonomy: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts new file mode 100644 index 0000000..7fb80a8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts @@ -0,0 +1,29 @@ +export interface IHealthTreatmentRequestData { + Action: "RestoreHealth"; + trader: string; + items: Item[]; + difference: Difference; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} +export interface Difference { + BodyParts: BodyParts; + Energy: number; + Hydration: number; +} +export interface BodyParts { + Head: BodyPart; + Chest: BodyPart; + Stomach: BodyPart; + LeftArm: BodyPart; + RightArm: BodyPart; + LeftLeg: BodyPart; + RightLeg: BodyPart; +} +export interface BodyPart { + Health: number; + Effects: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/health/IOffraidEatRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/health/IOffraidEatRequestData.d.ts new file mode 100644 index 0000000..8e2b6c3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/health/IOffraidEatRequestData.d.ts @@ -0,0 +1,7 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidEatRequestData extends IBaseInteractionRequestData { + Action: "Eat"; + item: string; + count: number; + time: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/health/IOffraidHealRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/health/IOffraidHealRequestData.d.ts new file mode 100644 index 0000000..c242300 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/health/IOffraidHealRequestData.d.ts @@ -0,0 +1,18 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidHealRequestData extends IBaseInteractionRequestData { + Action: "Heal"; + item: string; + part: BodyPart; + count: number; + time: number; +} +export declare enum BodyPart { + Head = 0, + Chest = 1, + Stomach = 2, + LeftArm = 3, + RightArm = 4, + LeftLeg = 5, + RightLeg = 6, + Common = 7 +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/health/ISyncHealthRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/health/ISyncHealthRequestData.d.ts new file mode 100644 index 0000000..20e32f6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/health/ISyncHealthRequestData.d.ts @@ -0,0 +1,21 @@ +export interface ISyncHealthRequestData { + Health: Health; + IsAlive: boolean; + Hydration?: number; + Energy?: number; + Temperature?: number; +} +export interface Health { + Head?: BodyPartHealth; + Chest?: BodyPartHealth; + Stomach?: BodyPartHealth; + LeftArm?: BodyPartHealth; + RightArm?: BodyPartHealth; + LeftLeg?: BodyPartHealth; + RightLeg?: BodyPartHealth; +} +export interface BodyPartHealth { + Maximum: number; + Current: number; + Effects: Record; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/HideoutAreasEnum.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/HideoutAreasEnum.d.ts new file mode 100644 index 0000000..10f851b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/HideoutAreasEnum.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreasEnum { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..8583e8d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface HideoutUpgradeCompleteRequestData { + Action: string; + areaType: number; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutArea.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutArea.d.ts new file mode 100644 index 0000000..d9fd2bf --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutArea.d.ts @@ -0,0 +1,40 @@ +export interface IHideoutArea { + _id: string; + type: number; + enabled: boolean; + needsFuel: boolean; + takeFromSlotLocked: boolean; + craftGivesExp: boolean; + stages: Record; +} +export interface Stage { + requirements: Requirement[]; + bonuses: StageBonus[]; + slots: number; + constructionTime: number; + description: string; +} +export interface Requirement { + areaType?: number; + requiredLevel?: number; + type: string; + templateId?: string; + count?: number; + isFunctional?: boolean; + traderId?: string; + loyaltyLevel?: number; + skillName?: string; + skillLevel?: number; +} +export interface StageBonus { + value: number; + passive: boolean; + production: boolean; + visible: boolean; + skillType?: string; + type: string; + filter?: string[]; + icon?: string; + id?: string; + templateId?: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts new file mode 100644 index 0000000..dba83eb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutContinousProductionStartRequestData { + Action: "HideoutContinuousProductionStart"; + recipeId: string; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutProduction.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutProduction.d.ts new file mode 100644 index 0000000..ce878be --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutProduction.d.ts @@ -0,0 +1,20 @@ +export interface IHideoutProduction { + _id: string; + areaType: number; + requirements: Requirement[]; + productionTime: number; + boosters: any; + endProduct: string; + continuous: boolean; + count: number; + productionLimitCount: number; +} +export interface Requirement { + templateId?: string; + count?: number; + isFunctional?: boolean; + type: string; + areaType?: number; + requiredLevel?: number; + resource?: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts new file mode 100644 index 0000000..8326c55 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutPutItemInRequestData { + Action: "HideoutPutItemsInAreaSlots"; + areaType: number; + items: Record; + timestamp: number; +} +export interface ItemDetails { + count: number; + id: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutScavCase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutScavCase.d.ts new file mode 100644 index 0000000..25abcf3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutScavCase.d.ts @@ -0,0 +1,21 @@ +export interface IHideoutScavCase { + _id: string; + ProductionTime: number; + Requirements: Requirement[]; + EndProducts: EndProducts; +} +export interface Requirement { + templateId: string; + count: number; + isFunctional: boolean; + type: string; +} +export interface EndProducts { + Common: MinMax; + Rare: MinMax; + Superrare: MinMax; +} +export interface MinMax { + min: string; + max: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts new file mode 100644 index 0000000..72fda86 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts @@ -0,0 +1,15 @@ +export interface IHideoutScavCaseStartRequestData { + Action: "HideoutScavCaseProductionStart"; + recipeId: string; + items: HideoutItem[]; + tools: Tool[]; + timestamp: number; +} +export interface HideoutItem { + id: string; + count: number; +} +export interface Tool { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts new file mode 100644 index 0000000..8e45939 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutSettingsBase { + generatorSpeedWithoutFuel: number; + generatorFuelFlowRate: number; + airFilterUnitFlowRate: number; + gpuBoostRate: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts new file mode 100644 index 0000000..1ed542a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutSingleProductionStartRequestData { + Action: "HideoutSingleProductionStart"; + recipeId: string; + items: Item[]; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts new file mode 100644 index 0000000..83a740a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutTakeItemOutRequestData { + Action: "HideoutTakeItemsFromAreaSlots"; + areaType: number; + slots: number[]; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts new file mode 100644 index 0000000..a6847ef --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutTakeProductionRequestData { + Action: "HideoutTakeProduction"; + recipeId: string; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts new file mode 100644 index 0000000..cdea513 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutToggleAreaRequestData { + Action: "HideoutToggleArea"; + areaType: number; + enabled: boolean; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..545311e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutUpgradeCompleteRequestData { + Action: "HideoutUpgradeComplete"; + areaType: number; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts new file mode 100644 index 0000000..dfbfdca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutUpgradeRequestData { + Action: "HideoutUpgrade"; + areaType: number; + items: HideoutItem[]; + timestamp: number; +} +export interface HideoutItem { + count: number; + id: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts new file mode 100644 index 0000000..b5dc5c1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts @@ -0,0 +1,5 @@ +export interface IGetBodyResponseData { + err: number; + errmsg: any; + (data: Type): Type; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/httpResponse/INullResponseData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/httpResponse/INullResponseData.d.ts new file mode 100644 index 0000000..a3ae838 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/httpResponse/INullResponseData.d.ts @@ -0,0 +1,5 @@ +export interface INullResponseData { + err: number; + errmsg: any; + data: null; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts new file mode 100644 index 0000000..e2d9cf1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IRegisterPlayerRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts new file mode 100644 index 0000000..6930261 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../common/IPmcData"; +import { ISyncHealthRequestData } from "../health/ISyncHealthRequestData"; +export interface ISaveProgressRequestData { + exit: string; + profile: IPmcData; + isPlayerScav: boolean; + health: ISyncHealthRequestData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts new file mode 100644 index 0000000..0e32e96 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetInsuranceCostRequestData { + traders: string[]; + items: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/insurance/IInsureRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/insurance/IInsureRequestData.d.ts new file mode 100644 index 0000000..f657bb7 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/insurance/IInsureRequestData.d.ts @@ -0,0 +1,6 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInsureRequestData extends IBaseInteractionRequestData { + Action: "Insure"; + tid: string; + items: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IAddItemRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IAddItemRequestData.d.ts new file mode 100644 index 0000000..53db97a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IAddItemRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IAddItemRequestData { + tid: string; + items: any[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts new file mode 100644 index 0000000..462e0de --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts @@ -0,0 +1,6 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryAddRequestData extends IInventoryBaseActionRequestData { + Action: "Add"; + item: string; + container: Container; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts new file mode 100644 index 0000000..b45e459 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts @@ -0,0 +1,27 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInventoryBaseActionRequestData extends IBaseInteractionRequestData { +} +export interface To { + id: string; + container: string; + location?: ToLocation | number; +} +export interface ToLocation { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} +export interface Container { + id: string; + container: string; + location: Location | number; +} +export interface Location { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts new file mode 100644 index 0000000..ff35066 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryBindRequestData extends IInventoryBaseActionRequestData { + Action: "Bind"; + item: string; + index: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts new file mode 100644 index 0000000..1e1ecef --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts @@ -0,0 +1,12 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryCreateMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "CreateMapMarker"; + item: string; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts new file mode 100644 index 0000000..0657e1b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryDeleteMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "DeleteMapMarker"; + item: string; + X: number; + Y: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts new file mode 100644 index 0000000..e2857e1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts @@ -0,0 +1,14 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryEditMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "EditMapMarker"; + item: string; + X: number; + Y: number; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts new file mode 100644 index 0000000..614711f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts @@ -0,0 +1,10 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryExamineRequestData extends IInventoryBaseActionRequestData { + Action: "Examine"; + item: string; + fromOwner: IFromOwner; +} +export interface IFromOwner { + id: string; + type: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts new file mode 100644 index 0000000..a5fb2a1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryFoldRequestData extends IInventoryBaseActionRequestData { + Action: "Fold"; + item: string; + value: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts new file mode 100644 index 0000000..3fcfa35 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMergeRequestData extends IInventoryBaseActionRequestData { + Action: "Merge"; + item: string; + with: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts new file mode 100644 index 0000000..b767908 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMoveRequestData extends IInventoryBaseActionRequestData { + Action: "Move"; + item: string; + to: To; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts new file mode 100644 index 0000000..5487b20 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryReadEncyclopediaRequestData extends IInventoryBaseActionRequestData { + Action: "ReadEncyclopedia"; + ids: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts new file mode 100644 index 0000000..07d1a52 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryRemoveRequestData extends IInventoryBaseActionRequestData { + Action: "Remove"; + item: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySortRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySortRequestData.d.ts new file mode 100644 index 0000000..a0b7928 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySortRequestData.d.ts @@ -0,0 +1,20 @@ +import { Upd } from "../common/tables/IItem"; +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySortRequestData extends IInventoryBaseActionRequestData { + Action: "ApplyInventoryChanges"; + changedItems: ChangedItem[]; +} +export interface ChangedItem { + _id: string; + _tpl: string; + parentId: string; + slotId: string; + location: Location; + upd: Upd; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts new file mode 100644 index 0000000..730ae71 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts @@ -0,0 +1,7 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySplitRequestData extends IInventoryBaseActionRequestData { + Action: "Split"; + item: string; + container: Container; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts new file mode 100644 index 0000000..1b0464d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts @@ -0,0 +1,11 @@ +import { OwnerInfo } from "../common/request/IBaseInteractionRequestData"; +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventorySwapRequestData extends IInventoryBaseActionRequestData { + Action: "Swap"; + item: string; + to: To; + item2: string; + to2: To; + fromOwner2: OwnerInfo; + toOwner2: OwnerInfo; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts new file mode 100644 index 0000000..f021661 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTagRequestData extends IInventoryBaseActionRequestData { + Action: "Tag"; + item: string; + TagName: string; + TagColor: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts new file mode 100644 index 0000000..0955440 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryToggleRequestData extends IInventoryBaseActionRequestData { + Action: "Toggle"; + item: string; + value: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts new file mode 100644 index 0000000..cf4391b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTransferRequestData extends IInventoryBaseActionRequestData { + Action: "Transfer"; + item: string; + with: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts new file mode 100644 index 0000000..689fe75 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts @@ -0,0 +1,4 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IEmptyItemEventRouterResponse extends IItemEventRouterBase { + profileChanges: ""; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts new file mode 100644 index 0000000..31e62fe --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts @@ -0,0 +1,67 @@ +import { Skills } from "../common/IPmcData"; +import { Item, Upd } from "../common/tables/IItem"; +import { IQuest } from "../common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../common/tables/IRepeatableQuests"; +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +export interface IItemEventRouterBase { + warnings: Warning[]; + profileChanges: TProfileChanges | ""; +} +export declare type TProfileChanges = Record; +export interface Warning { + index: number; + err: string; + errmsg: string; +} +export interface ProfileChange { + _id: string; + experience: number; + quests: IQuest[]; + ragFairOffers: IRagfairOffer[]; + builds: BuildChange[]; + items: ItemChanges; + production: Record; + skills: Skills; + traderRelations: Record; + repeatableQuests?: IPmcDataRepeatableQuest[]; +} +export interface BuildChange { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface ItemChanges { + new: Product[]; + change: Product[]; + del: Product[]; +} +export interface Production { + Progress: number; + StartTimestamp: number; + ProductionTime: number; + inProgress: boolean; + RecipeId: string; + Products: Product[]; +} +export interface Product { + _id: string; + _tpl?: string; + parentId?: string; + slotId?: string; + location?: ItemChangeLocation; + upd?: Upd; +} +export interface ItemChangeLocation { + x: number; + y: number; + r: number; + isSearched?: boolean; +} +export interface TraderRelations { + salesSum?: number; + standing?: number; + loyalty?: number; + unlocked?: boolean; + disabled?: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts new file mode 100644 index 0000000..515b49a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts @@ -0,0 +1,21 @@ +export interface IItemEventRouterRequest { + data: Daum[]; + tm: number; + reload: number; +} +export interface Daum { + Action: string; + item: string; + to: To; +} +export interface To { + id: string; + container: string; + location?: Location; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts new file mode 100644 index 0000000..72a9b5b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts @@ -0,0 +1,3 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IItemEventRouterResponse extends IItemEventRouterBase { +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IChangeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IChangeRequestData.d.ts new file mode 100644 index 0000000..f0a7838 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IChangeRequestData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IChangeRequestData extends ILoginRequestData { + change: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts new file mode 100644 index 0000000..a14c7c9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMiniProfileRequestData { + username: string; + password: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/ILoginRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/ILoginRequestData.d.ts new file mode 100644 index 0000000..e965813 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/ILoginRequestData.d.ts @@ -0,0 +1,4 @@ +export interface ILoginRequestData { + username: string; + password: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IMiniProfile.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IMiniProfile.d.ts new file mode 100644 index 0000000..c12661a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IMiniProfile.d.ts @@ -0,0 +1,14 @@ +export interface IMiniProfile { + username: string; + nickname: string; + side: string; + currlvl: number; + currexp: number; + prevexp: number; + nextlvl: number; + maxlvl: number; + akiData: AkiData; +} +export interface AkiData { + version: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IRegisterData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IRegisterData.d.ts new file mode 100644 index 0000000..61a8bbe --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IRegisterData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IRegisterData extends ILoginRequestData { + edition: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IRemoveProfileData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IRemoveProfileData.d.ts new file mode 100644 index 0000000..d31c9ac --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/launcher/IRemoveProfileData.d.ts @@ -0,0 +1,2 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export declare type IRemoveProfileData = ILoginRequestData; diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/location/IGetLocationRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/location/IGetLocationRequestData.d.ts new file mode 100644 index 0000000..04e84d9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/location/IGetLocationRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IGetLocationRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts new file mode 100644 index 0000000..811e9a2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IEndOfflineRaidRequestData { + crc: number; + exitStatus: string; + exitName: any; + raidSeconds: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/match/IGetProfileRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/match/IGetProfileRequestData.d.ts new file mode 100644 index 0000000..86b5bbd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/match/IGetProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetProfileRequestData { + profileId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts new file mode 100644 index 0000000..84bccc8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts @@ -0,0 +1,27 @@ +export interface IStartOfflineRaidRequestData { + locationName: string; + entryPoint: string; + startTime: number; + dateTime: string; + gameSettings: GameSettings; +} +export interface GameSettings { + timeAndWeatherSettings: TimeAndWeatherSettings; + botsSettings: BotsSettings; + wavesSettings: WavesSettings; +} +export interface TimeAndWeatherSettings { + isRandomTime: boolean; + isRandomWeather: boolean; +} +export interface BotsSettings { + isEnabled: boolean; + isScavWars: boolean; + botAmount: string; +} +export interface WavesSettings { + botDifficulty: string; + isBosses: boolean; + isTaggedAndCursed: boolean; + wavesBotAmount: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/notes/INoteActionData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/notes/INoteActionData.d.ts new file mode 100644 index 0000000..610657f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/notes/INoteActionData.d.ts @@ -0,0 +1,10 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface INoteActionData extends IBaseInteractionRequestData { + Action: string; + index: number; + note: INote; +} +export interface INote { + Time: number; + Text: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/notifier/INotifier.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/notifier/INotifier.d.ts new file mode 100644 index 0000000..8c48260 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/notifier/INotifier.d.ts @@ -0,0 +1,14 @@ +export interface INotifierChannel { + "server": string; + "channel_id": string; + "url": string; + "notifierServer": string; + "ws": string; +} +import { Message } from "../profile/IAkiProfile"; +export interface INotification { + type: "RagfairOfferSold" | "new_message" | "ping"; + eventId: string; + dialogId?: string; + message?: Message; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts new file mode 100644 index 0000000..2bc3d1e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISelectProfileRequestData { + uid: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts new file mode 100644 index 0000000..dcd14a2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts @@ -0,0 +1,21 @@ +import { Skills } from "../common/IPmcData"; +export interface IPlayerIncrementSkillLevelRequestData { + _id: string; + experience: number; + quests: any[]; + ragFairOffers: any[]; + builds: any[]; + items: Items; + production: Production; + skills: Skills; + traderRelations: TraderRelations; +} +export interface Items { + new: any[]; + change: any[]; + del: any[]; +} +export interface Production { +} +export interface TraderRelations { +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts new file mode 100644 index 0000000..99c61f1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts @@ -0,0 +1,25 @@ +export interface IPresetBuildActionRequestData { + Action: string; + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Item { + _id: string; + _tpl: string; + upd?: Upd; + parentId?: string; + slotId?: string; +} +export interface Upd { + Repairable: Repairable; + FireMode: FireMode; +} +export interface Repairable { + MaxDurability: number; + Durability: number; +} +export interface FireMode { + FireMode: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IAkiProfile.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IAkiProfile.d.ts new file mode 100644 index 0000000..3e0b319 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IAkiProfile.d.ts @@ -0,0 +1,167 @@ +import { MessageType } from "../../enums/MessageType"; +import { IPmcData } from "../common/IPmcData"; +import { Item } from "../common/tables/IItem"; +export interface IAkiProfile { + info: Info; + characters: Characters; + suits: string[]; + weaponbuilds: WeaponBuild[]; + dialogues: Record; + aki: Aki; + vitality: Vitality; + inraid: Inraid; + insurance: Insurance[]; +} +export interface Info { + id: string; + username: string; + password: string; + wipe: boolean; + edition: string; +} +export interface Characters { + pmc: IPmcData; + scav: IPmcData; +} +export interface WeaponBuild { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Dialogue { + _id: string; + messages: Message[]; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface DialogueInfo { + _id: string; + type: MessageType; + message: MessagePreview; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface Message { + _id: string; + uid: string; + type: MessageType; + dt: number; + localDateTime: number; + UtcDateTime?: number; + Member?: IUpdatableChatMember; + templateId: string; + text?: string; + hasRewards: boolean; + rewardCollected: boolean; + items: Items; + maxStorageTime?: number; + systemData?: ISystemData; +} +export interface MessagePreview { + uid: string; + type: MessageType; + dt: number; + templateId: string; + text?: string; +} +export interface Items { + stash?: string; + data?: Item[]; +} +export interface ISystemData { + date?: string; + time?: string; + location?: string; + buyerNickname?: string; + soldItem?: string; + itemCount?: number; +} +export interface IUpdatableChatMember { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; + Ignored: boolean; + Banned: boolean; +} +export interface DateTime { + date: string; + time: string; +} +export interface Aki { + version: string; +} +export interface Vitality { + health: Health; + effects: Effects; +} +export interface Health { + Hydration: number; + Energy: number; + Temperature: number; + Head: number; + Chest: number; + Stomach: number; + LeftArm: number; + RightArm: number; + LeftLeg: number; + RightLeg: number; +} +export interface Effects { + Head: Head; + Chest: Chest; + Stomach: Stomach; + LeftArm: LeftArm; + RightArm: RightArm; + LeftLeg: LeftLeg; + RightLeg: RightLeg; +} +export interface Head { +} +export interface Chest { +} +export interface Stomach { +} +export interface LeftArm { + Fracture?: number; +} +export interface RightArm { + Fracture?: number; +} +export interface LeftLeg { + Fracture?: number; +} +export interface RightLeg { + Fracture?: number; +} +export interface Inraid { + location: string; + character: string; +} +export interface Insurance { + scheduledTime: number; + traderId: string; + messageContent: MessageContent; + items: Item[]; +} +export interface MessageContent { + ragfair?: MessageContentRagfair; + text?: string; + templateId: string; + type: MessageType; + maxStorageTime?: number; + systemData?: MessageContentData; +} +export interface MessageContentRagfair { + offerId: string; + count: number; + handbookId: string; +} +export interface MessageContentData { + date: string; + time: string; + location: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts new file mode 100644 index 0000000..4a61196 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeNicknameRequestData { + nickname: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts new file mode 100644 index 0000000..91058ce --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeVoiceRequestData { + voice: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileCreateRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileCreateRequestData.d.ts new file mode 100644 index 0000000..93cc656 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IProfileCreateRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IProfileCreateRequestData { + side: string; + nickname: string; + headId: string; + voiceId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/ISearchFriendRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/ISearchFriendRequestData.d.ts new file mode 100644 index 0000000..e63e386 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/ISearchFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISearchFriendRequestData { + nickname: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/ISearchFriendResponse.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/ISearchFriendResponse.d.ts new file mode 100644 index 0000000..96d88b2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/ISearchFriendResponse.d.ts @@ -0,0 +1,9 @@ +export interface ISearchFriendResponse { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts new file mode 100644 index 0000000..9cca7e7 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IValidateNicknameRequestData { + nickname: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts new file mode 100644 index 0000000..0e4821a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IAcceptQuestRequestData { + Action: "QuestAccept"; + qid: string; + type: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts new file mode 100644 index 0000000..cc67404 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface ICompleteQuestRequestData { + Action: string; + qid: string; + removeExcessItems: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts new file mode 100644 index 0000000..63f10a8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHandoverQuestRequestData { + Action: "QuestHandover"; + qid: string; + conditionId: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IListQuestsRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IListQuestsRequestData.d.ts new file mode 100644 index 0000000..91f0b8c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IListQuestsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IListQuestsRequestData { + completed: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts new file mode 100644 index 0000000..015f58e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts @@ -0,0 +1,4 @@ +export interface IRepeatableQuestChangeRequest { + Action: "RepeatableQuestChange"; + qid: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts new file mode 100644 index 0000000..465ee02 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IAddOfferRequestData { + Action: string; + sellInOnePiece: boolean; + items: string[]; + requirements: Requirement[]; +} +export interface Requirement { + _tpl: string; + count: number; + level: number; + side: number; + onlyFunctional: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts new file mode 100644 index 0000000..2a4a876 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IExtendOfferRequestData { + offerId: string; + renewalTime: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts new file mode 100644 index 0000000..676322a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts @@ -0,0 +1,5 @@ +export interface IGetItemPriceResult { + avg: number; + min: number; + max: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts new file mode 100644 index 0000000..00f8f17 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMarketPriceRequestData { + templateId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetOffersResult.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetOffersResult.d.ts new file mode 100644 index 0000000..1c11422 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IGetOffersResult.d.ts @@ -0,0 +1,7 @@ +import { IRagfairOffer } from "./IRagfairOffer"; +export interface IGetOffersResult { + categories: Record; + offers: IRagfairOffer[]; + offersCount: number; + selectedCategory: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IRagfairOffer.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IRagfairOffer.d.ts new file mode 100644 index 0000000..63f655e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IRagfairOffer.d.ts @@ -0,0 +1,42 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +import { Item } from "../common/tables/IItem"; +export interface IRagfairOffer { + sellResult?: SellResult[]; + _id: string; + items: Item[]; + requirements: OfferRequirement[]; + root: string; + intId: number; + itemsCost: number; + requirementsCost: number; + startTime: number; + endTime: number; + sellInOnePiece: boolean; + name?: string; + shortName?: string; + loyaltyLevel: number; + locked: boolean; + unlimitedCount: boolean; + summaryCost: number; + user: IRagfairOfferUser; + notAvailable: boolean; + CurrentItemCount: number; + priority: boolean; +} +export interface OfferRequirement { + _tpl: string; + count: number; + onlyFunctional: boolean; +} +export interface IRagfairOfferUser { + id: string; + nickname: string; + rating: number; + memberType: MemberCategory; + avatar: string; + isRatingGrowing: boolean; +} +export interface SellResult { + sellTime: number; + amount: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts new file mode 100644 index 0000000..d926615 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IRemoveOfferRequestData { + Action: string; + offerId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/ISearchRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/ISearchRequestData.d.ts new file mode 100644 index 0000000..08e7fd3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/ragfair/ISearchRequestData.d.ts @@ -0,0 +1,32 @@ +export interface ISearchRequestData { + page: number; + limit: number; + sortType: number; + sortDirection: number; + currency: number; + priceFrom: number; + priceTo: number; + quantityFrom: number; + quantityTo: number; + conditionFrom: number; + conditionTo: number; + oneHourExpiration: boolean; + removeBartering: boolean; + offerOwnerType: OfferOwnerType; + onlyFunctional: boolean; + updateOfferCount: boolean; + handbookId: string; + linkedSearchId: string; + neededSearchId: string; + buildItems: BuildItems; + buildCount: number; + tm: number; + reload: number; +} +export declare enum OfferOwnerType { + ANYOWNERTYPE = 0, + TRADEROWNERTYPE = 1, + PLAYEROWNERTYPE = 2 +} +export interface BuildItems { +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e645fb3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts @@ -0,0 +1,3 @@ +export interface IBaseRepairActionDataRequest { + Action: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/repair/IRepairActionDataRequest.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/repair/IRepairActionDataRequest.d.ts new file mode 100644 index 0000000..263d400 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/repair/IRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface IRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "Repair"; + repairKitsInfo: RepairKitsInfo[]; + target: string; +} +export interface RepairKitsInfo { + _id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e3d469d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface ITraderRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "TraderRepair"; + tid: string; + repairItems: RepairItem[]; +} +export interface RepairItem { + _id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts new file mode 100644 index 0000000..a9ef757 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IProcessBaseTradeRequestData { + Action: string; + type: string; + tid: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts new file mode 100644 index 0000000..a9e4c17 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts @@ -0,0 +1,14 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData { + Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | ""; + type: string; + tid: string; + item_id: string; + count: number; + scheme_id: number; + scheme_items: SchemeItem[]; +} +export interface SchemeItem { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts new file mode 100644 index 0000000..889dfd1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IProcessRagfairTradeRequestData { + Action: string; + offers: Offer[]; +} +export interface Offer { + id: string; + count: number; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts new file mode 100644 index 0000000..f1d555f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts @@ -0,0 +1,12 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessSellTradeRequestData extends IProcessBaseTradeRequestData { + Action: "sell_to_trader"; + type: string; + tid: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; + scheme_id: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/weather/IWeatherData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/weather/IWeatherData.d.ts new file mode 100644 index 0000000..ecc96ce --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/weather/IWeatherData.d.ts @@ -0,0 +1,20 @@ +export interface IWeatherData { + acceleration: number; + time: string; + date: string; + weather: IWeather; +} +export interface IWeather { + pressure: number; + temp: number; + fog: string; + rain_intensity: number; + rain: any; + wind_gustiness: number; + wind_direction: any; + wind_speed: number; + cloud: number; + time: string; + date: string; + timestamp: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/eft/wishlist/IWishlistActionData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/eft/wishlist/IWishlistActionData.d.ts new file mode 100644 index 0000000..9217864 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/eft/wishlist/IWishlistActionData.d.ts @@ -0,0 +1,4 @@ +export interface IWishlistActionData { + Action: string; + templateId: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/enums/BaseClasses.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/enums/BaseClasses.d.ts new file mode 100644 index 0000000..e733bca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/enums/BaseClasses.d.ts @@ -0,0 +1,84 @@ +export declare enum BaseClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMOR = "5448e54d4bdc2dcc718b4568", + VEST = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/enums/ConfigTypes.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/enums/ConfigTypes.d.ts new file mode 100644 index 0000000..6bd31e8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/enums/ConfigTypes.d.ts @@ -0,0 +1,18 @@ +export declare enum ConfigTypes { + AIRDROP = "aki-airdrop", + BOT = "aki-bot", + CORE = "aki-core", + HEALTH = "aki-health", + HIDEOUT = "aki-hideout", + HTTP = "aki-http", + IN_RAID = "aki-inraid", + INSURANCE = "aki-insurance", + INVENTORY = "aki-inventory", + LOCATION = "aki-location", + MATCH = "aki-match", + QUEST = "aki-quest", + RAGFAIR = "aki-ragfair", + REPAIR = "aki-repair", + TRADER = "aki-trader", + WEATHER = "aki-weather" +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/enums/ELocationName.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/enums/ELocationName.d.ts new file mode 100644 index 0000000..b56cc08 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/enums/ELocationName.d.ts @@ -0,0 +1,11 @@ +export declare enum ELocationName { + FACTORY_DAY = "factory4_day", + BIGMAP = "bigmap", + WOODS = "Woods", + SHORELINE = "Shoreline", + INTERCHANGE = "Interchange", + LIGHTHOUSE = "Lighthouse", + LABORATORY = "laboratory", + RESERVE = "RezervBase", + ANY = "any" +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/enums/EquipmentSlots.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/enums/EquipmentSlots.d.ts new file mode 100644 index 0000000..35c18ff --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/enums/EquipmentSlots.d.ts @@ -0,0 +1,16 @@ +export declare enum EquipmentSlots { + HEADWEAR = "Headwear", + EARPIECE = "Earpiece", + FACE_COVER = "FaceCover", + ARMOR_VEST = "ArmorVest", + EYEWEAR = "Eyewear", + ARM_BAND = "ArmBand", + TACTICAL_VEST = "TacticalVest", + POCKETS = "Pockets", + BACKPACK = "Backpack", + SECURED_CONTAINER = "SecuredContainer", + FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", + SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", + HOLSTER = "Holster", + SCABBARD = "Scabbard" +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/enums/HideoutAreas.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/enums/HideoutAreas.d.ts new file mode 100644 index 0000000..b44a20a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/enums/HideoutAreas.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreas { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/enums/MemberCategory.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/enums/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/enums/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/enums/MessageType.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/enums/MessageType.d.ts new file mode 100644 index 0000000..1b0c649 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/enums/MessageType.d.ts @@ -0,0 +1,16 @@ +export declare enum MessageType { + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14 +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/enums/Money.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/enums/Money.d.ts new file mode 100644 index 0000000..0d39613 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/enums/Money.d.ts @@ -0,0 +1,5 @@ +export declare enum Money { + ROUBLES = "5449016a4bdc2d6f028b456f", + EUROS = "569668774bdc2da2298b4568", + DOLLARS = "5696686a4bdc2da3298b456a" +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/enums/Traders.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/enums/Traders.d.ts new file mode 100644 index 0000000..163cd71 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/enums/Traders.d.ts @@ -0,0 +1,10 @@ +export declare enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/external/mod.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/external/mod.d.ts new file mode 100644 index 0000000..ecef460 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/external/mod.d.ts @@ -0,0 +1,5 @@ +import { DependencyContainer } from "./tsyringe"; +export interface IMod { + load: (container: DependencyContainer) => void; + delayedLoad: (container: DependencyContainer) => void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/external/tsyringe.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/external/tsyringe.d.ts new file mode 100644 index 0000000..56a7e58 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/external/tsyringe.d.ts @@ -0,0 +1,2 @@ +import type { DependencyContainer } from "tsyringe"; +export type { DependencyContainer }; diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/bindings/Route.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/bindings/Route.d.ts new file mode 100644 index 0000000..1b29d7d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/bindings/Route.d.ts @@ -0,0 +1,3 @@ +export interface IRoute { + aki: any; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IBotCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IBotCallbacks.d.ts new file mode 100644 index 0000000..2c42813 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IBotCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface IBotCallbacks { + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IBundleCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IBundleCallbacks.d.ts new file mode 100644 index 0000000..7e37c6e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IBundleCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IBundleCallbacks { + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts new file mode 100644 index 0000000..d10027f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IBuyClothingRequestData } from "../../eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../../eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISuit } from "../../eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface ICustomizationCallbacks { + getSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + getTraderSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IDataCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IDataCallbacks.d.ts new file mode 100644 index 0000000..a098560 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IDataCallbacks.d.ts @@ -0,0 +1,26 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGlobals } from "../../eft/common/IGlobals"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../server/ILocaleBase"; +import { ISettingsBase } from "../server/ISettingsBase"; +export interface IDataCallbacks { + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts new file mode 100644 index 0000000..fe2115a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts @@ -0,0 +1,34 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetMailDialogViewRequestData } from "../../eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogInfoRequestData } from "../../eft/dialog/IGetMailDialogInfoRequestData"; +import { IRemoveDialogRequestData } from "../../eft/dialog/IRemoveDialogRequestData"; +import { IGetMailDialogListRequestData } from "../../eft/dialog/IGetMailDialogListRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../../eft/dialog/IFriendRequestData"; +import { IPinDialogRequestData } from "../../eft/dialog/IPinDialogRequestData"; +import { ISetDialogReadRequestData } from "../../eft/dialog/ISetDialogReadRequestData"; +import { IGetAllAttachmentsRequestData } from "../../eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetChatServerListRequestData } from "../../eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../../eft/dialog/IGetFriendListDataResponse"; +import { ISendMessageRequest } from "../../eft/dialog/ISendMessageRequest"; +import { IGetMailDialogViewResponseData } from "../../eft/dialog/IGetMailDialogViewResponseData"; +import { IGetAllAttachmentsResponse } from "../../eft/dialog/IGetAllAttachmentsResponse"; +import { DialogueInfo } from "../../eft/profile/IAkiProfile"; +export interface IDialogueCallbacks { + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IGameCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IGameCallbacks.d.ts new file mode 100644 index 0000000..38ebc5f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IGameCallbacks.d.ts @@ -0,0 +1,16 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGameEmptyCrcRequestData } from "../../eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../../eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGameConfigResponse } from "../../eft/game/IGameConfigResponse"; +export interface IGameCallbacks { + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts new file mode 100644 index 0000000..5857a3e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IHandbookCallbacks { + load(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHealthCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHealthCallbacks.d.ts new file mode 100644 index 0000000..d238c7a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHealthCallbacks.d.ts @@ -0,0 +1,13 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { ISyncHealthRequestData } from "../../eft/health/ISyncHealthRequestData"; +import { IOffraidEatRequestData } from "../../eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../../eft/health/IOffraidHealRequestData"; +import { IHealthTreatmentRequestData } from "../../eft/health/IHealthTreatmentRequestData"; +export interface IHealthCallbacks { + onLoad(sessionID: string): IAkiProfile; + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): any; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): any; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): any; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): any; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts new file mode 100644 index 0000000..e9badb6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts @@ -0,0 +1,23 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IHideoutUpgradeRequestData } from "../../eft/hideout/IHideoutUpgradeRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../../eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutScavCaseStartRequestData } from "../../eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutPutItemInRequestData } from "../../eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutTakeItemOutRequestData } from "../../eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutToggleAreaRequestData } from "../../eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../../eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../../eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../../eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IHideoutCallbacks { + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHttpCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHttpCallbacks.d.ts new file mode 100644 index 0000000..3ecd945 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IHttpCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IHttpCallbacks { + load(): void; + sendImage(sessionID: string, req: any, resp: any, body: any): void; + getImage(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInraidCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInraidCallbacks.d.ts new file mode 100644 index 0000000..e959b98 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInraidCallbacks.d.ts @@ -0,0 +1,14 @@ +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IRegisterPlayerRequestData } from "../../eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../../eft/inRaid/ISaveProgressRequestData"; +export interface IInraidCallbacks { + onLoad(sessionID: string): IAkiProfile; + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts new file mode 100644 index 0000000..082112d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IGetInsuranceCostRequestData } from "../../eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../../eft/insurance/IInsureRequestData"; +export interface IInsuranceCallbacks { + onLoad(sessionID: string): IAkiProfile; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): any; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): any; + update(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts new file mode 100644 index 0000000..e53f7d0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IInventoryFoldRequestData } from "../../eft/inventory/IInventoryFoldRequestData"; +import { IInventorySplitRequestData } from "../../eft/inventory/IInventorySplitRequestData"; +import { IInventoryMoveRequestData } from "../../eft/inventory/IInventoryMoveRequestData"; +import { IInventoryMergeRequestData } from "../../eft/inventory/IInventoryMergeRequestData"; +import { IInventoryRemoveRequestData } from "../../eft/inventory/IInventoryRemoveRequestData"; +import { IInventoryTransferRequestData } from "../../eft/inventory/IInventoryTransferRequestData"; +import { IInventorySwapRequestData } from "../../eft/inventory/IInventorySwapRequestData"; +import { IInventoryToggleRequestData } from "../../eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTagRequestData } from "../../eft/inventory/IInventoryTagRequestData"; +import { IInventoryBindRequestData } from "../../eft/inventory/IInventoryBindRequestData"; +import { IInventoryExamineRequestData } from "../../eft/inventory/IInventoryExamineRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../../eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventorySortRequestData } from "../../eft/inventory/IInventorySortRequestData"; +import { IInventoryCreateMarkerRequestData } from "../../eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../../eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../../eft/inventory/IInventoryEditMarkerRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IInventoryCallbacks { + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts new file mode 100644 index 0000000..59db771 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts @@ -0,0 +1,6 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../../eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IItemEventCallbacks { + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts new file mode 100644 index 0000000..52dfec6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts @@ -0,0 +1,20 @@ +import { IRegisterData } from "../../eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../../eft/launcher/IRemoveProfileData"; +import { ILoginRequestData } from "../../eft/launcher/ILoginRequestData"; +import { IChangeRequestData } from "../../eft/launcher/IChangeRequestData"; +import { IGetMiniProfileRequestData } from "../../eft/launcher/IGetMiniProfileRequestData.js"; +export interface ILauncherCallbacks { + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; + getServerVersion(): string; + ping(url: string, info: any, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ILocationCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ILocationCallbacks.d.ts new file mode 100644 index 0000000..71656a4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ILocationCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IGetLocationRequestData } from "../../eft/location/IGetLocationRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILocationsGenerateAllResponse } from "../../eft/common/ILocationsSourceDestinationBase"; +import { ILocationBase } from "../../eft/common/ILocationBase"; +export interface ILocationCallbacks { + getLocationData(url: string, info: any, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IMatchCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IMatchCallbacks.d.ts new file mode 100644 index 0000000..fcbf173 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IMatchCallbacks.d.ts @@ -0,0 +1,25 @@ +import { IStartOfflineRaidRequestData } from "../../eft/match/IStartOffineRaidRequestData"; +import { IEndOfflineRaidRequestData } from "../../eft/match/IEndOfflineRaidRequestData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IPmcData } from "../../eft/common/IPmcData"; +export interface IMatchCallbacks { + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: any, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IModCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IModCallbacks.d.ts new file mode 100644 index 0000000..1a4cd7b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IModCallbacks.d.ts @@ -0,0 +1,6 @@ +export interface IModCallbacks { + load(): void; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/INoteCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/INoteCallbacks.d.ts new file mode 100644 index 0000000..8453a4f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/INoteCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { INoteActionData } from "../../eft/notes/INoteActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface INoteCallbacks { + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/INotifierCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/INotifierCallbacks.d.ts new file mode 100644 index 0000000..a211310 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/INotifierCallbacks.d.ts @@ -0,0 +1,17 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../../eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../../eft/notifier/ISelectProfileRequestData"; +export interface INotifierCallbacks { + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(sessionID: string, req: any, resp: any, data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts new file mode 100644 index 0000000..97c6487 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IPresetBuildActionRequestData } from "../../eft/presetBuild/IPresetBuildActionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { WeaponBuild } from "../../eft/profile/IAkiProfile"; +export interface IPresetBuildCallbacks { + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IPresetCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IPresetCallbacks.d.ts new file mode 100644 index 0000000..4169857 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IPresetCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IPresetCallbacks { + load(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IProfileCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IProfileCallbacks.d.ts new file mode 100644 index 0000000..9d4d2df --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IProfileCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IProfileChangeNicknameRequestData } from "../../eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../../eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../../eft/profile/IProfileCreateRequestData"; +import { IValidateNicknameRequestData } from "../../eft/profile/IValidateNicknameRequestData"; +import { ISearchFriendRequestData } from "../../eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../../eft/profile/ISearchFriendResponse"; +export interface IProfileCallbacks { + onLoad(sessionID: string): any; + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IQuestCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IQuestCallbacks.d.ts new file mode 100644 index 0000000..1c4d0c3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IQuestCallbacks.d.ts @@ -0,0 +1,19 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAcceptQuestRequestData } from "../../eft/quests/IAcceptQuestRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IListQuestsRequestData } from "../../eft/quests/IListQuestsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { ICompleteQuestRequestData } from "../../eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../../eft/quests/IHandoverQuestRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../../eft/common/tables/IRepeatableQuests"; +import { IRepeatableQuestChangeRequest } from "../../eft/quests/IRepeatableQuestChangeRequest"; +export interface IQuestCallbacks { + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts new file mode 100644 index 0000000..9282bd4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISearchRequestData } from "../../eft/ragfair/ISearchRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetMarketPriceRequestData } from "../../eft/ragfair/IGetMarketPriceRequestData"; +import { IAddOfferRequestData } from "../../eft/ragfair/IAddOfferRequestData"; +import { IRemoveOfferRequestData } from "../../eft/ragfair/IRemoveOfferRequestData"; +import { IExtendOfferRequestData } from "../../eft/ragfair/IExtendOfferRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetItemPriceResult } from "../../eft/ragfair/IGetItemPriceResult"; +export interface IRagfairCallbacks { + load(): void; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; + updatePlayer(timeSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IRepairCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IRepairCallbacks.d.ts new file mode 100644 index 0000000..e8183c9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IRepairCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../../eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../../eft/repair/ITraderRepairActionDataRequest"; +export interface IRepairCallbacks { + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ISaveCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ISaveCallbacks.d.ts new file mode 100644 index 0000000..1ad3b82 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ISaveCallbacks.d.ts @@ -0,0 +1,4 @@ +export interface ISaveCallbacks { + load(): void; + update(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ITradeCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ITradeCallbacks.d.ts new file mode 100644 index 0000000..2f41d54 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ITradeCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../../eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../../eft/trade/IProcessBaseTradeRequestData"; +export interface ITradeCallbacks { + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ITraderCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ITraderCallbacks.d.ts new file mode 100644 index 0000000..e0d7d06 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/ITraderCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../../eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface ITraderCallbacks { + load(): void; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts new file mode 100644 index 0000000..9ac72ae --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts @@ -0,0 +1,5 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +export interface IWeatherCallbacks { + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts new file mode 100644 index 0000000..e5d519c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IWishlistActionData } from "../../eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IWishlistCallbacks { + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IAirdropConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IAirdropConfig.d.ts new file mode 100644 index 0000000..f4aee89 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IAirdropConfig.d.ts @@ -0,0 +1,20 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IAirdropConfig extends IBaseConfig { + kind: "aki-airdrop"; + airdropChancePercent: AirdropChancePercent; + airdropMinOpenHeight: number; + airdropMaxOpenHeight: number; + planeMinFlyHeight: number; + planeMaxFlyHeight: number; + planeVolume: number; + airdropMinStartTimeSeconds: number; + airdropMaxStartTimeSeconds: number; +} +export interface AirdropChancePercent { + bigmap: number; + woods: number; + lighthouse: number; + shoreline: number; + interchange: number; + reserve: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IBaseConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IBaseConfig.d.ts new file mode 100644 index 0000000..8b6ba88 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IBaseConfig.d.ts @@ -0,0 +1,3 @@ +export interface IBaseConfig { + kind: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IBotConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IBotConfig.d.ts new file mode 100644 index 0000000..5fb9d93 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IBotConfig.d.ts @@ -0,0 +1,114 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IBotConfig extends IBaseConfig { + kind: "aki-bot"; + presetBatch: PresetBatch; + bosses: string[]; + durability: Durability; + lootNValue: LootNvalue; + revenge: Record; + pmc: PmcConfig; + showTypeInNickname: boolean; + maxBotCap: number; +} +export interface PresetBatch { + assault: number; + bossBully: number; + bossGluhar: number; + bossKilla: number; + bossKojaniy: number; + bossSanitar: number; + bossTagilla: number; + bossTest: number; + cursedAssault: number; + followerBully: number; + followerGluharAssault: number; + followerGluharScout: number; + followerGluharSecurity: number; + followerGluharSnipe: number; + followerKojaniy: number; + followerSanitar: number; + followerTagilla: number; + followerTest: number; + marksman: number; + pmcBot: number; + sectantPriest: number; + sectantWarrior: number; + gifter: number; + test: number; + exUsec: number; +} +export interface Durability { + default: DefaultDurability; + pmc: PmcDurability; + boss: BotDurability; + follower: BotDurability; + assault: BotDurability; + cursedassault: BotDurability; + marksman: BotDurability; + pmcbot: BotDurability; + exusec: BotDurability; + sectantpriest: BotDurability; + sectantwarrior: BotDurability; +} +export interface DefaultDurability { + armor: DefaultArmor; + weapon: WeaponDurability; +} +export interface DefaultArmor { + maxDelta: number; + minDelta: number; +} +export interface WeaponDurability { + lowestMax: number; + highestMax: number; + maxDelta: number; + minDelta: number; +} +export interface PmcDurability { + armor: PmcDurabilityArmor; + weapon: WeaponDurability; +} +export interface PmcDurabilityArmor { + lowestMaxPercent: number; + highestMaxPercent: number; + maxDelta: number; + minDelta: number; +} +export interface BotDurability { + armor: ArmorDurability; + weapon: WeaponDurability; +} +export interface ArmorDurability { + maxDelta: number; + minDelta: number; +} +export interface LootNvalue { + scav: number; + pmc: number; +} +export interface PmcConfig { + dynamicLoot: DynamicLoot; + cartridgeBlacklist: string[]; + difficulty: string; + isUsec: number; + chanceSameSideIsHostilePercent: number; + usecType: string; + bearType: string; + maxBackpackLootTotalRub: number; + maxPocketLootTotalRub: number; + maxVestLootTotalRub: number; + types: Types; + enemyTypes: string[]; +} +export interface DynamicLoot { + whitelist: string[]; + blacklist: string[]; + spawnLimits: Record; + moneyStackLimits: Record; +} +export interface Types { + assault: number; + cursedAssault: number; + pmcBot: number; + exUsec: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/ICoreConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/ICoreConfig.d.ts new file mode 100644 index 0000000..cfcaf61 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/ICoreConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ICoreConfig extends IBaseConfig { + kind: "aki-core"; + akiVersion: string; + projectName: string; + compatibleTarkovVersion: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHealthConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHealthConfig.d.ts new file mode 100644 index 0000000..fdbf656 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHealthConfig.d.ts @@ -0,0 +1,14 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHealthConfig extends IBaseConfig { + kind: "aki-health"; + healthMultipliers: HealthMultipliers; + save: Save; +} +export interface HealthMultipliers { + death: number; + blacked: number; +} +export interface Save { + health: boolean; + effects: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHideoutConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHideoutConfig.d.ts new file mode 100644 index 0000000..4658fa6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHideoutConfig.d.ts @@ -0,0 +1,27 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHideoutConfig extends IBaseConfig { + kind: "aki-hideout"; + runIntervalSeconds: number; + scavCase: ScavCase; + fuelDrainRateMultipler: number; +} +export interface ScavCase { + rewardParentBlacklist: string[]; + rewardItemBlacklist: any[]; + ammoRewards: AmmoRewards; + moneyRewards: MoneyRewards; +} +export interface AmmoRewards { + giveMultipleOfTen: boolean; + minAmount: number; +} +export interface MoneyRewards { + enabled: boolean; + rub: MinMax; + usd: MinMax; + eur: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHttpConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHttpConfig.d.ts new file mode 100644 index 0000000..c41d035 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IHttpConfig.d.ts @@ -0,0 +1,6 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHttpConfig extends IBaseConfig { + kind: "aki-http"; + ip: string; + port: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInRaidConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInRaidConfig.d.ts new file mode 100644 index 0000000..baaf083 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInRaidConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInRaidConfig extends IBaseConfig { + kind: "aki-inraid"; + MIAOnRaidEnd: boolean; + raidMenuSettings: RaidMenuSettings; + save: Save; + carExtracts: string[]; + carExtractBaseStandingGain: number; + scavExtractGain: number; +} +export interface RaidMenuSettings { + aiAmount: string; + aiDifficulty: string; + bossEnabled: boolean; + scavWars: boolean; + taggedAndCursed: boolean; +} +export interface Save { + loot: boolean; + durability: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInsuranceConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInsuranceConfig.d.ts new file mode 100644 index 0000000..6e9c744 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInsuranceConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInsuranceConfig extends IBaseConfig { + kind: "aki-insurance"; + insuranceMultiplier: Record; + returnChancePercent: Record; + runIntervalSeconds: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInventoryConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInventoryConfig.d.ts new file mode 100644 index 0000000..ffffa41 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IInventoryConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInventoryConfig extends IBaseConfig { + kind: "aki-inventory"; + newItemsMarkedFound: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/ILocationConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/ILocationConfig.d.ts new file mode 100644 index 0000000..0551d57 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/ILocationConfig.d.ts @@ -0,0 +1,24 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ILocationConfig extends IBaseConfig { + kind: "aki-location"; + looseLootMultiplier: LootMultiplier; + staticLootMultiplier: LootMultiplier; +} +export interface LootMultiplier { + bigmap: number; + develop: number; + factory4_day: number; + factory4_night: number; + interchange: number; + laboratory: number; + rezervbase: number; + shoreline: number; + woods: number; + hideout: number; + lighthouse: number; + privatearea: number; + suburbs: number; + tarkovstreets: number; + terminal: number; + town: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IMatchConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IMatchConfig.d.ts new file mode 100644 index 0000000..92c4d77 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IMatchConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IMatchConfig extends IBaseConfig { + kind: "aki-match"; + enabled: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IQuestConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IQuestConfig.d.ts new file mode 100644 index 0000000..be4a97b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IQuestConfig.d.ts @@ -0,0 +1,77 @@ +import { ELocationName } from "../../enums/ELocationName"; +import { IBaseConfig } from "./IBaseConfig"; +export interface IQuestConfig extends IBaseConfig { + kind: "aki-quest"; + redeemTime: number; + repeatableQuests: IRepeatableQuestConfig[]; +} +export interface IRepeatableQuestConfig { + name: string; + types: string[]; + resetTime: number; + numQuests: number; + minPlayerLevel: number; + rewardScaling: IRewardScaling; + locations: Record; + traderWhitelist: ITraderWhitelist[]; + questConfig: IQuestConfig; +} +export interface IRewardScaling { + levels: number[]; + experience: number[]; + roubles: number[]; + items: number[]; + reputation: number[]; + rewardSpread: number; +} +export interface ITraderWhitelist { + traderId: string; + questTypes: string[]; +} +export interface IQuestConfig { + Exploration: IExploration; + Completion: ICompletion; + Elimination: IElimination; +} +export interface IExploration { + maxExtracts: number; + specificExits: ISpecificExits; +} +export interface ISpecificExits { + probability: number; + passageRequirementWhitelist: string[]; +} +export interface ICompletion { + minRequestedAmount: number; + maxRequestedAmount: number; + minRequestedBulletAmount: number; + maxRequestedBulletAmount: number; + useWhitelist: boolean; + useBlacklist: boolean; +} +export interface IElimination { + targets: ITarget[]; + bodyPartProb: number; + bodyParts: IBodyPart[]; + specificLocationProb: number; + distLocationBlacklist: string[]; + distProb: number; + maxDist: number; + minDist: number; + maxKills: number; + minKills: number; +} +export interface IProbabilityObject { + key: string; + relativeProbability: number; + data?: any; +} +export interface ITarget extends IProbabilityObject { + data: IBossInfo; +} +export interface IBossInfo { + isBoss: boolean; +} +export interface IBodyPart extends IProbabilityObject { + data: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IRagfairConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IRagfairConfig.d.ts new file mode 100644 index 0000000..2d151ca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IRagfairConfig.d.ts @@ -0,0 +1,59 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRagfairConfig extends IBaseConfig { + kind: "aki-ragfair"; + runIntervalSeconds: number; + sell: Sell; + traders: Record; + dynamic: Dynamic; +} +export interface Sell { + fees: boolean; + chance: Chance; + time: Time; + reputation: Reputation; +} +export interface Chance { + base: number; + overprices: number; + underpriced: number; +} +export interface Time { + base: number; + min: number; + max: number; +} +export interface Reputation { + gain: number; + loss: number; +} +export interface Dynamic { + expiredOfferThreshold: number; + offerItemCount: MinMax; + price: MinMax; + endTimeSeconds: MinMax; + condition: Condition; + stackablePercent: MinMax; + nonStackableCount: MinMax; + rating: MinMax; + currencies: Record; + showAsSingleStack: string[]; + blacklist: Blacklist; +} +export interface MinMax { + min: number; + max: number; +} +export interface Condition { + conditionChance: number; + min: number; + max: number; +} +export interface Blacklist { + /** + * show/hide trader items that are blacklisted by bsg + */ + traderItems: boolean; + custom: string[]; + enableBsgList: boolean; + enableQuestList: boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IRepairConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IRepairConfig.d.ts new file mode 100644 index 0000000..4966eb5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IRepairConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRepairConfig extends IBaseConfig { + kind: "aki-repair"; + priceMultiplier: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/ITraderConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/ITraderConfig.d.ts new file mode 100644 index 0000000..dab73e3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/ITraderConfig.d.ts @@ -0,0 +1,15 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ITraderConfig extends IBaseConfig { + kind: "aki-trader"; + updateTime: UpdateTime[]; + updateTimeDefault: number; + fenceAssortSize: number; + fenceMaxPresetsCount: number; + fencePresetPriceMult: number; + minDurabilityForSale: number; + fenceItemIgnoreList: string[]; +} +export interface UpdateTime { + traderId: string; + seconds: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IWeatherConfig.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IWeatherConfig.d.ts new file mode 100644 index 0000000..c52cab3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/config/IWeatherConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IWeatherConfig extends IBaseConfig { + kind: "aki-weather"; + acceleration: number; + weather: Weather; +} +export interface Weather { + clouds: MinMax; + windSpeed: MinMax; + windDirection: MinMax; + windGustiness: MinMax; + rain: MinMax; + rainIntensity: MinMax; + fog: MinMax; + temp: MinMax; + pressure: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/controllers/IBotController.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/controllers/IBotController.d.ts new file mode 100644 index 0000000..010e208 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/controllers/IBotController.d.ts @@ -0,0 +1,13 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { Difficulty } from "../../eft/common/tables/IBotType"; +export interface IBotController { + getBotLimit(type: string): number; + getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + generate(info: IGenerateBotsRequestData, playerScav: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IBotGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IBotGenerator.d.ts new file mode 100644 index 0000000..f3e8586 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IBotGenerator.d.ts @@ -0,0 +1,10 @@ +import { Inventory as PmcInventory } from "../../eft/common/IPmcData"; +import { Inventory, Chances, Generation } from "../../eft/common/tables/IBotType"; +export interface IBotGenerator { + generateInventory(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; +} +export interface IExhaustableArray { + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/ILocationGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/ILocationGenerator.d.ts new file mode 100644 index 0000000..530ceca --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/ILocationGenerator.d.ts @@ -0,0 +1,6 @@ +import { IStaticContainerProps, IStaticLootDetails, IStaticAmmoDetails, IStaticForcedProps } from "../../eft/common/tables/ILootBase"; +import { ILooseLoot, SpawnpointTemplate } from "../../eft/common/ILooseLoot"; +export interface ILocationGenerator { + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IPMCLootGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IPMCLootGenerator.d.ts new file mode 100644 index 0000000..a9db89b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IPMCLootGenerator.d.ts @@ -0,0 +1,4 @@ +export interface IPMCLootGenerator { + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts new file mode 100644 index 0000000..6670540 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts @@ -0,0 +1,4 @@ +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairAssortGenerator { + getAssortItems(): Item[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts new file mode 100644 index 0000000..30b4be5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts @@ -0,0 +1,6 @@ +import { IBarterScheme } from "../../eft/common/tables/ITrader"; +import { IRagfairOffer } from "../../eft/ragfair/IRagfairOffer"; +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairOfferGenerator { + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece: boolean): IRagfairOffer; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/helpers/Traders.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/helpers/Traders.d.ts new file mode 100644 index 0000000..e935d29 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/helpers/Traders.d.ts @@ -0,0 +1,10 @@ +export declare const enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IMod.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IMod.d.ts new file mode 100644 index 0000000..e6eec79 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IMod.d.ts @@ -0,0 +1,10 @@ +export declare namespace ModLoader { + interface IMod { + name: string; + version: string; + main?: string; + author?: string; + license: string; + dependencies?: Record; + } +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IModLoader.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IModLoader.d.ts new file mode 100644 index 0000000..40a5e19 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IModLoader.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +export interface IModLoader { + load(container: DependencyContainer): void; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IPackageJsonData.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IPackageJsonData.d.ts new file mode 100644 index 0000000..09472cd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/mod/IPackageJsonData.d.ts @@ -0,0 +1,11 @@ +export interface IPackageJsonData { + incompatibilities?: string[]; + dependencies?: string[]; + name: string; + author: string; + version: string; + akiVersion: string; + licence: string; + main: string; + contributors: string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts new file mode 100644 index 0000000..c7d246a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts @@ -0,0 +1,4 @@ +export interface IRagfairServerPrices { + static: Record; + dynamic: Record; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/server/IDatabaseTables.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/IDatabaseTables.d.ts new file mode 100644 index 0000000..dbb71be --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/IDatabaseTables.d.ts @@ -0,0 +1,51 @@ +import { IGlobals } from "../../eft/common/IGlobals"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { IBotType } from "../../eft/common/tables/IBotType"; +import { ICustomizationItem } from "../../eft/common/tables/ICustomizationItem"; +import { IHandbookBase } from "../../eft/common/tables/IHandbookBase"; +import { ILootBase } from "../../eft/common/tables/ILootBase"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IRepeatableQuestDatabase } from "../../eft/common/tables/IRepeatableQuests"; +import { ITemplateItem } from "../../eft/common/tables/ITemplateItem"; +import { ITrader } from "../../eft/common/tables/ITrader"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { ILocaleBase } from "./ILocaleBase"; +import { ILocations } from "./ILocations"; +import { IServerBase } from "./IServerBase"; +import { ISettingsBase } from "./ISettingsBase"; +export interface IDatabaseTables { + bots: { + types: Record; + base: IBotBase; + core: IBotCore; + }; + hideout: { + areas: IHideoutArea[]; + production: IHideoutProduction[]; + scavcase: IHideoutScavCase[]; + settings: IHideoutSettingsBase; + }; + locales: ILocaleBase; + locations: ILocations; + loot: ILootBase; + match: any; + templates: { + character: string[]; + items: Record; + quests: IQuest[]; + repeatableQuests: IRepeatableQuestDatabase; + clientItems: Record; + handbook: IHandbookBase; + customization: Record; + profiles: any; + prices: Record; + }; + traders: Record; + globals: IGlobals; + server: IServerBase; + settings: ISettingsBase; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/server/IHttpServer.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/IHttpServer.d.ts new file mode 100644 index 0000000..c828399 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/IHttpServer.d.ts @@ -0,0 +1,12 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { INotification } from "../../eft/notifier/INotifier"; +export interface IHttpServer { + load(): void; + getCookies(req: http.IncomingMessage): any; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + sendMessage(sessionID: string, output: INotification): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/server/ILocaleBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/ILocaleBase.d.ts new file mode 100644 index 0000000..8887c06 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/ILocaleBase.d.ts @@ -0,0 +1,61 @@ +export interface ILocaleBase { + global: Record; + menu: Record; + languages: ILanguageBase[]; +} +export interface ILocaleGlobalBase { + interface: Record; + enum: any[]; + mail: Record; + quest: Record; + preset: Record; + handbook: Record; + season: Record; + customization: Record; + repeatableQuest: Record; + templates: ILocaleTemplateBase; + locations: ILocaleLocationsBase; + banners: ILocaleBannersBase; + trading: ILocaleTradingBase; +} +export interface ILocaleQuest { + name: string; + description: string; + note: string; + failMessageText: string; + startedMessageText: string; + successMessageText: string; + conditions: Record; + location: string; +} +export interface ILocalePreset { + Name: string; +} +export interface ILocaleTemplateBase { + templates: Record; +} +export interface ILocaleLocationsBase { + locations: Record; +} +export interface ILocaleBannersBase { + locations: Record; +} +export interface ILocaleProps { + Name: string; + ShortName: string; + Description: string; +} +export interface ILocaleTradingBase { + locations: Record; +} +export interface ILocaleTradingProps { + FullName: string; + FirstName: string; + Nickname: string; + Location: string; + Description: string; +} +export interface ILanguageBase { + ShortName: string; + Name: string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/server/ILocations.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/ILocations.d.ts new file mode 100644 index 0000000..18f0262 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/ILocations.d.ts @@ -0,0 +1,26 @@ +import { ILocationBase } from "../../eft/common/ILocationBase"; +import { ILooseLoot } from "../../eft/common/ILooseLoot"; +import { ILocationsBase } from "../../eft/common/tables/ILocationsBase"; +export interface ILocations { + bigmap?: ILocationData; + develop?: ILocationData; + factory4_day?: ILocationData; + factory4_night?: ILocationData; + hideout?: ILocationData; + interchange?: ILocationData; + laboratory?: ILocationData; + lighthouse?: ILocationData; + privatearea?: ILocationData; + rezervbase?: ILocationData; + shoreline?: ILocationData; + suburbs?: ILocationData; + tarkovstreets?: ILocationData; + terminal?: ILocationData; + town?: ILocationData; + woods?: ILocationData; + base?: ILocationsBase; +} +export interface ILocationData { + base: ILocationBase; + looseLoot?: ILooseLoot; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/server/IServerBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/IServerBase.d.ts new file mode 100644 index 0000000..d033db3 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/IServerBase.d.ts @@ -0,0 +1,4 @@ +export interface IServerBase { + ip: string; + port: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/server/ISettingsBase.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/ISettingsBase.d.ts new file mode 100644 index 0000000..c067cda --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/server/ISettingsBase.d.ts @@ -0,0 +1,43 @@ +export interface ISettingsBase { + config: Config; +} +export interface Config { + AFKTimeoutSeconds: number; + AdditionalRandomDelaySeconds: number; + ClientSendRateLimit: number; + CriticalRetriesCount: number; + DefaultRetriesCount: number; + FirstCycleDelaySeconds: number; + FramerateLimit: FramerateLimit; + GroupStatusInterval: number; + KeepAliveInterval: number; + Mark502and504AsNonImportant: boolean; + MemoryManagementSettings: MemoryManagementSettings; + NVidiaHighlights: boolean; + NextCycleDelaySeconds: number; + PingServerResultSendInterval: number; + PingServersInterval: number; + ReleaseProfiler: ReleaseProfiler; + SecondCycleDelaySeconds: number; + TurnOffLogging: boolean; + WeaponOverlapDistanceCulling: number; + WebDiagnosticsEnabled: boolean; +} +export interface FramerateLimit { + MaxFramerateGameLimit: number; + MaxFramerateLobbyLimit: number; + MinFramerateLimit: number; +} +export interface MemoryManagementSettings { + AggressiveGC: boolean; + GigabytesRequiredToDisableGCDuringRaid: number; + HeapPreAllocationEnabled: boolean; + HeapPreAllocationMB: number; + OverrideRamCleanerSettings: boolean; + RamCleanerEnabled: boolean; +} +export interface ReleaseProfiler { + Enabled: boolean; + MaxRecords: number; + RecordTriggerValue: number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/IAsyncQueue.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/IAsyncQueue.d.ts new file mode 100644 index 0000000..2be801a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/IAsyncQueue.d.ts @@ -0,0 +1,4 @@ +import { ICommand } from "./ICommand"; +export interface IAsyncQueue { + waitFor(command: ICommand): Promise; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/ICommand.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/ICommand.d.ts new file mode 100644 index 0000000..696bb83 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/ICommand.d.ts @@ -0,0 +1,4 @@ +export interface ICommand { + uuid: string; + cmd: () => Promise; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/ILogger.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/ILogger.d.ts new file mode 100644 index 0000000..c983701 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/ILogger.d.ts @@ -0,0 +1,10 @@ +import { Daum } from "../../eft/itemEvent/IItemEventRouterRequest"; +export interface ILogger { + writeToLogFile(data: string | Daum): void; + log(data: string | Record | Error, color: string): void; + error(data: string): void; + warning(data: string): void; + success(data: string): void; + info(data: string): void; + debug(data: string | Record, onlyShowInConsole?: boolean): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/IUuidGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/IUuidGenerator.d.ts new file mode 100644 index 0000000..3870469 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/models/spt/utils/IUuidGenerator.d.ts @@ -0,0 +1,3 @@ +export interface IUUidGenerator { + generate(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/HttpRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/HttpRouter.d.ts new file mode 100644 index 0000000..f75a47d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/HttpRouter.d.ts @@ -0,0 +1,16 @@ +/// +import { IncomingMessage } from "http"; +import { DynamicRouter, Router, StaticRouter } from "../di/Router"; +export declare class HttpRouter { + protected staticRouters: StaticRouter[]; + protected dynamicRoutes: DynamicRouter[]; + constructor(staticRouters: StaticRouter[], dynamicRoutes: DynamicRouter[]); + protected groupBy(list: T[], keyGetter: (t: T) => string): Map; + getResponse(req: IncomingMessage, info: any, sessionID: string): string; + protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean; +} +declare class ResponseWrapper { + output: string; + constructor(output: string); +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/ImageRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/ImageRouter.d.ts new file mode 100644 index 0000000..ab03977 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/ImageRouter.d.ts @@ -0,0 +1,13 @@ +/// +import { IncomingMessage, ServerResponse } from "http"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ImageRouteService } from "../services/mod/image/ImageRouteService"; +import { VFS } from "../utils/VFS"; +export declare class ImageRouter { + protected vfs: VFS; + protected imageRouteService: ImageRouteService; + constructor(vfs: VFS, imageRouteService: ImageRouteService); + addRoute(key: string, valueToAdd: string): void; + sendImage(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any, httpServer: IHttpServer): void; + getImage(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/ItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/ItemEventRouter.d.ts new file mode 100644 index 0000000..b1ac5d9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/ItemEventRouter.d.ts @@ -0,0 +1,17 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { ItemEventRouterDefinition } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class ItemEventRouter { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected profileHelper: ProfileHelper; + protected itemEventRouters: ItemEventRouterDefinition[]; + constructor(logger: ILogger, jsonUtil: JsonUtil, profileHelper: ProfileHelper, itemEventRouters: ItemEventRouterDefinition[]); + protected output: IItemEventRouterResponse; + handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse; + getOutput(sessionID: string): IItemEventRouterResponse; + protected resetOutput(sessionID: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/BotDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/BotDynamicRouter.d.ts new file mode 100644 index 0000000..6d0ab4b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/BotDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BotDynamicRouter extends DynamicRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/BundleDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/BundleDynamicRouter.d.ts new file mode 100644 index 0000000..a765410 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/BundleDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BundleDynamicRouter extends DynamicRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts new file mode 100644 index 0000000..2db7cc5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class CustomizationDynamicRouter extends DynamicRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/DataDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/DataDynamicRouter.d.ts new file mode 100644 index 0000000..836ed8d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/DataDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class DataDynamicRouter extends DynamicRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/HttpDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/HttpDynamicRouter.d.ts new file mode 100644 index 0000000..a152b4d --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/HttpDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter } from "../../di/Router"; +import { ImageRouter } from "../ImageRouter"; +export declare class HttpDynamicRouter extends DynamicRouter { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/InraidDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/InraidDynamicRouter.d.ts new file mode 100644 index 0000000..7c0561f --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/InraidDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class InraidDynamicRouter extends DynamicRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); + getTopLevelRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/LocationDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/LocationDynamicRouter.d.ts new file mode 100644 index 0000000..b8e5cdf --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/LocationDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class LocationDynamicRouter extends DynamicRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); + getTopLevelRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/NotifierDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/NotifierDynamicRouter.d.ts new file mode 100644 index 0000000..83c60c5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/NotifierDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class NotifierDynamicRouter extends DynamicRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/TraderDynamicRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/TraderDynamicRouter.d.ts new file mode 100644 index 0000000..5b7cc1b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/dynamic/TraderDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class TraderDynamicRouter extends DynamicRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/CustomizationItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/CustomizationItemEventRouter.d.ts new file mode 100644 index 0000000..e78445e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/CustomizationItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class CustomizationItemEventRouter extends ItemEventRouterDefinition { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/HealthItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/HealthItemEventRouter.d.ts new file mode 100644 index 0000000..99847c6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/HealthItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HealthItemEventRouter extends ItemEventRouterDefinition { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/HideoutItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/HideoutItemEventRouter.d.ts new file mode 100644 index 0000000..e1e98af --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/HideoutItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HideoutCallbacks } from "../../callbacks/HideoutCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HideoutItemEventRouter extends ItemEventRouterDefinition { + protected hideoutCallbacks: HideoutCallbacks; + constructor(hideoutCallbacks: HideoutCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/InsuranceItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/InsuranceItemEventRouter.d.ts new file mode 100644 index 0000000..a922cc0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/InsuranceItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InsuranceItemEventRouter extends ItemEventRouterDefinition { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/InventoryItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/InventoryItemEventRouter.d.ts new file mode 100644 index 0000000..2619bb9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/InventoryItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InventoryCallbacks } from "../../callbacks/InventoryCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InventoryItemEventRouter extends ItemEventRouterDefinition { + protected inventoryCallbacks: InventoryCallbacks; + constructor(inventoryCallbacks: InventoryCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/NoteItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/NoteItemEventRouter.d.ts new file mode 100644 index 0000000..59bf598 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/NoteItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { NoteCallbacks } from "../../callbacks/NoteCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class NoteItemEventRouter extends ItemEventRouterDefinition { + protected noteCallbacks: NoteCallbacks; + constructor(noteCallbacks: NoteCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts new file mode 100644 index 0000000..277db44 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class PresetBuildItemEventRouter extends ItemEventRouterDefinition { + protected presetBuildCallbacks: PresetBuildCallbacks; + constructor(presetBuildCallbacks: PresetBuildCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/QuestItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/QuestItemEventRouter.d.ts new file mode 100644 index 0000000..db59c25 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/QuestItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class QuestItemEventRouter extends ItemEventRouterDefinition { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/RagfairItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/RagfairItemEventRouter.d.ts new file mode 100644 index 0000000..9216cc5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/RagfairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RagfairItemEventRouter extends ItemEventRouterDefinition { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/RepairItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/RepairItemEventRouter.d.ts new file mode 100644 index 0000000..5196ba9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/RepairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RepairCallbacks } from "../../callbacks/RepairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RepairItemEventRouter extends ItemEventRouterDefinition { + protected repairCallbacks: RepairCallbacks; + constructor(repairCallbacks: RepairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/TradeItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/TradeItemEventRouter.d.ts new file mode 100644 index 0000000..a43bb0a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/TradeItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { TradeCallbacks } from "../../callbacks/TradeCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class TradeItemEventRouter extends ItemEventRouterDefinition { + protected tradeCallbacks: TradeCallbacks; + constructor(tradeCallbacks: TradeCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/item_events/WishlistItemEventRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/WishlistItemEventRouter.d.ts new file mode 100644 index 0000000..38497fb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/item_events/WishlistItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { WishlistCallbacks } from "../../callbacks/WishlistCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class WishlistItemEventRouter extends ItemEventRouterDefinition { + protected wishlistCallbacks: WishlistCallbacks; + constructor(wishlistCallbacks: WishlistCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/save_load/HealthSaveLoadRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/save_load/HealthSaveLoadRouter.d.ts new file mode 100644 index 0000000..114f5b2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/save_load/HealthSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class HealthSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/save_load/InraidSaveLoadRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/save_load/InraidSaveLoadRouter.d.ts new file mode 100644 index 0000000..4c00b40 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/save_load/InraidSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InraidSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts new file mode 100644 index 0000000..30ce98e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InsuranceSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts new file mode 100644 index 0000000..16c7619 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class ProfileSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/serializers/BundleSerializer.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/serializers/BundleSerializer.d.ts new file mode 100644 index 0000000..912db83 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/serializers/BundleSerializer.d.ts @@ -0,0 +1,11 @@ +import { Serializer } from "../../di/Serializer"; +import { BundleLoader } from "../../loaders/BundleLoader"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { ILogger } from "../../models/spt/utils/ILogger"; +export declare class BundleSerializer extends Serializer { + protected logger: ILogger; + protected bundleLoader: BundleLoader; + constructor(logger: ILogger, bundleLoader: BundleLoader); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/serializers/ImageSerializer.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/serializers/ImageSerializer.d.ts new file mode 100644 index 0000000..0e040d4 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/serializers/ImageSerializer.d.ts @@ -0,0 +1,9 @@ +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { Serializer } from "../../di/Serializer"; +import { ImageRouter } from "../ImageRouter"; +export declare class ImageSerializer extends Serializer { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/serializers/NotifySerializer.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/serializers/NotifySerializer.d.ts new file mode 100644 index 0000000..1779ac9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/serializers/NotifySerializer.d.ts @@ -0,0 +1,11 @@ +import { NotifierController } from "../../controllers/NotifierController"; +import { Serializer } from "../../di/Serializer"; +import { HttpServerHelper } from "../../helpers/HttpServerHelper"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +export declare class NotifySerializer extends Serializer { + protected notifierController: NotifierController; + protected httpServerHelper: HttpServerHelper; + constructor(notifierController: NotifierController, httpServerHelper: HttpServerHelper); + serialize(_sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/BotStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/BotStaticRouter.d.ts new file mode 100644 index 0000000..aeea220 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/BotStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BotStaticRouter extends StaticRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/BundleStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/BundleStaticRouter.d.ts new file mode 100644 index 0000000..fb682fc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/BundleStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BundleStaticRouter extends StaticRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/CustomizationStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/CustomizationStaticRouter.d.ts new file mode 100644 index 0000000..21bc4bb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/CustomizationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class CustomizationStaticRouter extends StaticRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/DataStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/DataStaticRouter.d.ts new file mode 100644 index 0000000..84ba7fd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/DataStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DataStaticRouter extends StaticRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/DialogStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/DialogStaticRouter.d.ts new file mode 100644 index 0000000..546cdf1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/DialogStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DialogueCallbacks } from "../../callbacks/DialogueCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DialogStaticRouter extends StaticRouter { + protected dialogueCallbacks: DialogueCallbacks; + constructor(dialogueCallbacks: DialogueCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/GameStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/GameStaticRouter.d.ts new file mode 100644 index 0000000..a9a7496 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/GameStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { GameCallbacks } from "../../callbacks/GameCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class GameStaticRouter extends StaticRouter { + protected gameCallbacks: GameCallbacks; + constructor(gameCallbacks: GameCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/HealthStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/HealthStaticRouter.d.ts new file mode 100644 index 0000000..863fd5e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/HealthStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class HealthStaticRouter extends StaticRouter { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/InraidStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/InraidStaticRouter.d.ts new file mode 100644 index 0000000..b29ad23 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/InraidStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InraidStaticRouter extends StaticRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/InsuranceStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/InsuranceStaticRouter.d.ts new file mode 100644 index 0000000..5676499 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/InsuranceStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InsuranceStaticRouter extends StaticRouter { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/ItemEventStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/ItemEventStaticRouter.d.ts new file mode 100644 index 0000000..c30a7fc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/ItemEventStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ItemEventCallbacks } from "../../callbacks/ItemEventCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ItemEventStaticRouter extends StaticRouter { + protected itemEventCallbacks: ItemEventCallbacks; + constructor(itemEventCallbacks: ItemEventCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/LauncherStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/LauncherStaticRouter.d.ts new file mode 100644 index 0000000..0040cbd --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/LauncherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LauncherCallbacks } from "../../callbacks/LauncherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LauncherStaticRouter extends StaticRouter { + protected launcherCallbacks: LauncherCallbacks; + constructor(launcherCallbacks: LauncherCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/LocationStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/LocationStaticRouter.d.ts new file mode 100644 index 0000000..b6de956 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/LocationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LocationStaticRouter extends StaticRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/MatchStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/MatchStaticRouter.d.ts new file mode 100644 index 0000000..9920a92 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/MatchStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { MatchCallbacks } from "../../callbacks/MatchCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class MatchStaticRouter extends StaticRouter { + protected matchCallbacks: MatchCallbacks; + constructor(matchCallbacks: MatchCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/NotifierStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/NotifierStaticRouter.d.ts new file mode 100644 index 0000000..8f1f5cc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/NotifierStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class NotifierStaticRouter extends StaticRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/PresetStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/PresetStaticRouter.d.ts new file mode 100644 index 0000000..a9e7458 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/PresetStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class PresetStaticRouter extends StaticRouter { + protected presetCallbacks: PresetBuildCallbacks; + constructor(presetCallbacks: PresetBuildCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/ProfileStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/ProfileStaticRouter.d.ts new file mode 100644 index 0000000..83403f2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/ProfileStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ProfileCallbacks } from "../../callbacks/ProfileCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ProfileStaticRouter extends StaticRouter { + protected profileCallbacks: ProfileCallbacks; + constructor(profileCallbacks: ProfileCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/QuestStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/QuestStaticRouter.d.ts new file mode 100644 index 0000000..8f7ca0a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/QuestStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class QuestStaticRouter extends StaticRouter { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/RagfairStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/RagfairStaticRouter.d.ts new file mode 100644 index 0000000..6c41467 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/RagfairStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class RagfairStaticRouter extends StaticRouter { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/TraderStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/TraderStaticRouter.d.ts new file mode 100644 index 0000000..41728a1 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/TraderStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class TraderStaticRouter extends StaticRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/routers/static/WeatherStaticRouter.d.ts b/Faupi-HideoutMod/Project/src/server/types/routers/static/WeatherStaticRouter.d.ts new file mode 100644 index 0000000..72ed851 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/routers/static/WeatherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { WeatherCallbacks } from "../../callbacks/WeatherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class WeatherStaticRouter extends StaticRouter { + protected weatherCallbacks: WeatherCallbacks; + constructor(weatherCallbacks: WeatherCallbacks); +} diff --git a/Faupi-HideoutMod/Project/src/server/types/servers/ConfigServer.d.ts b/Faupi-HideoutMod/Project/src/server/types/servers/ConfigServer.d.ts new file mode 100644 index 0000000..a079be8 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/servers/ConfigServer.d.ts @@ -0,0 +1,14 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigTypes } from "../models/enums/ConfigTypes"; +export declare class ConfigServer { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected configs: Record; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil); + getConfig(configType: ConfigTypes): T; + getConfigByString(configType: string): T; + initialize(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/servers/DatabaseServer.d.ts b/Faupi-HideoutMod/Project/src/server/types/servers/DatabaseServer.d.ts new file mode 100644 index 0000000..aa152d0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/servers/DatabaseServer.d.ts @@ -0,0 +1,6 @@ +import { IDatabaseTables } from "../models/spt/server/IDatabaseTables"; +export declare class DatabaseServer { + protected tableData: IDatabaseTables; + getTables(): IDatabaseTables; + setTables(any: any): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/servers/HttpServer.d.ts b/Faupi-HideoutMod/Project/src/server/types/servers/HttpServer.d.ts new file mode 100644 index 0000000..5234966 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/servers/HttpServer.d.ts @@ -0,0 +1,49 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { Serializer } from "../di/Serializer"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { HttpRouter } from "../routers/HttpRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ConfigServer } from "./ConfigServer"; +import { DatabaseServer } from "./DatabaseServer"; +export declare class HttpServer implements IHttpServer { + protected httpRouter: HttpRouter; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected serializers: Serializer[]; + protected configServer: ConfigServer; + constructor(httpRouter: HttpRouter, // TODO: delay required + logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, serializers: Serializer[], configServer: ConfigServer); + protected buffers: {}; + protected onReceive: {}; + protected onRespond: {}; + protected httpConfig: IHttpConfig; + protected webSockets: {}; + protected websocketPingHandler: any; + getCookies(req: http.IncomingMessage): any; + resetBuffer(sessionID: string): void; + putInBuffer(sessionID: any, data: any, bufLength: number): boolean; + getFromBuffer(sessionID: string): any; + sendZlibJson(resp: any, output: any, sessionID: string): void; + sendMessage(sessionID: string, output: INotification): void; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + handleRequest(req: http.IncomingMessage, resp: http.ServerResponse): void; + load(): void; + protected getRandomisedMessage(): string; + wsOnConnection(ws: any, req: any): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/servers/RagfairServer.d.ts b/Faupi-HideoutMod/Project/src/server/types/servers/RagfairServer.d.ts new file mode 100644 index 0000000..60c92b5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/servers/RagfairServer.d.ts @@ -0,0 +1,31 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { ConfigServer } from "./ConfigServer"; +export declare class RagfairServer { + protected logger: ILogger; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairCategoriesService: RagfairCategoriesService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairOfferService: RagfairOfferService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); + load(): void; + update(): void; + getCategories(): Record; + /** + * Disable/Hide an offer from flea + * @param offerId + */ + hideOffer(offerId: string): void; + getOffer(offerID: string): IRagfairOffer; + getOffers(): IRagfairOffer[]; + removeOfferStack(offerID: string, amount: number): void; + doesOfferExist(offerId: string): boolean; + addPlayerOffers(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/servers/SaveServer.d.ts b/Faupi-HideoutMod/Project/src/server/types/servers/SaveServer.d.ts new file mode 100644 index 0000000..cb28f49 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/servers/SaveServer.d.ts @@ -0,0 +1,28 @@ +import { IAkiProfile, Info } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { SaveLoadRouter } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class SaveServer { + protected vfs: VFS; + protected saveLoadRouters: SaveLoadRouter[]; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected profileFilepath: string; + protected profiles: {}; + protected onSave: {}; + protected saveMd5: {}; + constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger); + load(): void; + save(): void; + getProfile(sessionId: string): IAkiProfile; + getProfiles(): Record; + deleteProfileById(sessionID: string): boolean; + createProfile(profileInfo: Info): void; + addProfile(profileDetails: IAkiProfile): void; + loadProfile(sessionID: string): void; + saveProfile(sessionID: string): void; + removeProfile(sessionID: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/FenceService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/FenceService.d.ts new file mode 100644 index 0000000..12723fb --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/FenceService.d.ts @@ -0,0 +1,39 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { FenceLevel } from "../models/eft/common/IGlobals"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class FenceService { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected fenceAssort: ITraderAssort; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, presetHelper: PresetHelper, configServer: ConfigServer); + protected setFenceAssort(fenceAssort: ITraderAssort): void; + getFenceAssorts(): ITraderAssort; + hasExpiredCache(refreshAssort: boolean): boolean; + generateFenceAssortCache(pmcData: IPmcData): void; + /** + * + * @param pmcData Get the fence level the passed in profile has + * @returns FenceLevel + */ + getFenceInfo(pmcData: IPmcData): FenceLevel; + removeFenceOffer(assortIdToRemove: string): void; + updateFenceOffers(pmcData: IPmcData): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/HashCacheService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/HashCacheService.d.ts new file mode 100644 index 0000000..5320f28 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/HashCacheService.d.ts @@ -0,0 +1,19 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +export declare class HashCacheService { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected jsonHashes: any; + protected modHashes: any; + protected readonly modCachePath = "./user/cache/modCache.json"; + constructor(vfs: VFS, hashUtil: HashUtil, jsonUtil: JsonUtil, logger: ILogger); + getStoredModHash(modName: string): string; + modContentMatchesStoredHash(modName: string, modContent: string): boolean; + hashMatchesStoredHash(modName: string, modHash: string): boolean; + storeModContent(modName: string, modContent: string): void; + storeModHash(modName: string, modHash: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/InsuranceService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/InsuranceService.d.ts new file mode 100644 index 0000000..0219816 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/InsuranceService.d.ts @@ -0,0 +1,42 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { SecureContainerHelper } from "../helpers/SecureContainerHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected secureContainerHelper: SecureContainerHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected traderHelper: TraderHelper; + protected dialogueHelper: DialogueHelper; + protected configServer: ConfigServer; + protected insured: Record>; + protected templatesById: {}; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, secureContainerHelper: SecureContainerHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, saveServer: SaveServer, traderHelper: TraderHelper, dialogueHelper: DialogueHelper, configServer: ConfigServer); + insuranceExists(sessionId: string): boolean; + insuranceTraderArrayExists(sessionId: string, traderId: string): boolean; + getInsurance(sessionId: string): Record; + getInsuranceItems(sessionId: string, traderId: string): any[]; + resetInsurance(sessionId: string): void; + resetInsuranceTraderArray(sessionId: string, traderId: string): void; + addInsuranceItemToArray(sessionId: string, traderId: string, itemToAdd: any): void; + getItemPrice(_tpl: string): number; + generateTemplatesById(): void; + sendInsuredItems(pmcData: IPmcData, sessionID: string): void; + storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + protected addGearToSend(pmcData: IPmcData, insuredItem: any, actualItem: any, sessionID: string): any; + getPremium(pmcData: IPmcData, inventoryItem: Item, traderId: string): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/MatchLocationService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/MatchLocationService.d.ts new file mode 100644 index 0000000..2b5fc0e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/MatchLocationService.d.ts @@ -0,0 +1,8 @@ +import { TimeUtil } from "../utils/TimeUtil"; +export declare class MatchLocationService { + protected timeUtil: TimeUtil; + protected locations: {}; + constructor(timeUtil: TimeUtil); + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/ModCompilerService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/ModCompilerService.d.ts new file mode 100644 index 0000000..26cb4ac --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/ModCompilerService.d.ts @@ -0,0 +1,20 @@ +import * as ts from "typescript"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { VFS } from "../utils/VFS"; +import { HashCacheService } from "./HashCacheService"; +export declare class ModCompilerService { + protected logger: ILogger; + protected hashCacheService: HashCacheService; + protected vfs: VFS; + constructor(logger: ILogger, hashCacheService: HashCacheService, vfs: VFS); + compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise; + protected compile(fileNames: string[], options: ts.CompilerOptions): Promise; + protected buildDepth(depth: number): string; + protected getNodesModulesPath(depth: number): string; + protected getAkiPath(depth: number): string; + protected getAkiFolder(): string; + protected getNodesModulesFolder(): string; + protected calculateDepth(file: string): number; + protected areFilesReady(fileNames: string[]): boolean; + protected delay(ms: number): Promise; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/NotificationService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/NotificationService.d.ts new file mode 100644 index 0000000..7e2a127 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/NotificationService.d.ts @@ -0,0 +1,21 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +export declare class NotificationService { + protected messageQueue: {}; + getMessageQueue(): {}; + getMessageFromQueue(sessionId: string): any; + updateMessageOnQueue(sessionId: string, value: any[]): void; + has(sessionID: string): boolean; + /** + * Pop first message from queue. + */ + pop(sessionID: string): any; + /** + * Add message to queue + */ + add(sessionID: string, message: INotification): void; + /** + * Get message queue for session + * @param sessionID + */ + get(sessionID: string): any; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/PaymentService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/PaymentService.d.ts new file mode 100644 index 0000000..5834750 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/PaymentService.d.ts @@ -0,0 +1,49 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PaymentService { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + /** + * Take money and insert items into return to server request + * @param {Object} pmcData + * @param {Object} body + * @param {string} sessionID + * @returns Object + */ + payMoney(pmcData: IPmcData, body: IProcessBuyTradeRequestData, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Receive money back after selling + * @param {IPmcData} pmcData + * @param {number} amount + * @param {IProcessSellTradeRequestData} body + * @param {IItemEventRouterResponse} output + * @param {string} sessionID + * @returns IItemEventRouterResponse + */ + getMoney(pmcData: IPmcData, amount: number, body: IProcessSellTradeRequestData, output: IItemEventRouterResponse, sessionID: string): IItemEventRouterResponse; + /** + * Recursively checks if the given item is + * inside the stash, that is it has the stash as + * ancestor with slotId=hideout + */ + protected isItemInStash(pmcData: IPmcData, item: Item): boolean; + addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/PlayerService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/PlayerService.d.ts new file mode 100644 index 0000000..519b7e5 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/PlayerService.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPlayerIncrementSkillLevelRequestData } from "../models/eft/player/IPlayerIncrementSkillLevelRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PlayerService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, databaseServer: DatabaseServer); + /** + * increases the profile skill and updates any output + * @param {Object} pmcData + * @param {Object} output + * @param {String} skillName + * @param {Number} amount + */ + incrementSkillLevel(pmcData: IPmcData, output: IPlayerIncrementSkillLevelRequestData, skillName: string, amount: number): void; + /** + * @param {Object} pmcData + * @returns number + */ + calculateLevel(pmcData: IPmcData): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/RagfairCategoriesService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/RagfairCategoriesService.d.ts new file mode 100644 index 0000000..09956cc --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/RagfairCategoriesService.d.ts @@ -0,0 +1,10 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +export declare class RagfairCategoriesService { + updateCategories(offers: IRagfairOffer[]): void; + protected categories: Record; + getCategories(): Record; + getCategoryByItemId(itemId: string): number; + resetCategories(): void; + setCategoryValue(itemId: string, newValue: number): void; + incrementCategory(itemId: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/RagfairLinkedItemService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/RagfairLinkedItemService.d.ts new file mode 100644 index 0000000..6c34ee0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/RagfairLinkedItemService.d.ts @@ -0,0 +1,10 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +export declare class RagfairLinkedItemService { + protected databaseServer: DatabaseServer; + protected linkedItemsCache: Record>; + constructor(databaseServer: DatabaseServer); + getLinkedItems(linkedSearchId: string): Iterable; + protected buildLinkedItemTable(): void; + protected getFilters(item: ITemplateItem, slot: string): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/RagfairOfferService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/RagfairOfferService.d.ts new file mode 100644 index 0000000..7afbf8c --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/RagfairOfferService.d.ts @@ -0,0 +1,66 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairOfferService { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected ragfairServerHelper: RagfairServerHelper; + protected profileHelper: ProfileHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected playerOffersLoaded: boolean; + protected toUpdate: Record; + protected expiredOffers: Item[]; + protected offers: IRagfairOffer[]; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, configServer: ConfigServer); + getOffers(): IRagfairOffer[]; + getOfferByOfferId(offerId: string): IRagfairOffer; + getOffersOfType(templateId: string): IRagfairOffer[]; + addOffer(offer: IRagfairOffer): void; + addOfferToExpired(offer: Item): void; + setTraderUpdateStatus(traderId: string, shouldUpdate: boolean): void; + shouldTraderBeUpdated(traderID: string): boolean; + getExpiredOfferCount(): number; + /** + * Get an array of expired items not yet processed into new offers + * @returns items that need to be turned into offers + */ + getExpiredOffers(): Item[]; + resetExpiredOffers(): void; + /** + * Does the offer exist on the ragfair + * @param offerId offer id to check for + * @returns offer exists - true + */ + doesOfferExist(offerId: string): boolean; + getTraders(): Record; + flagTraderForUpdate(expiredOfferUserId: string): void; + removeOfferById(offerId: string): void; + removeOfferStack(offerID: string, amount: number): void; + removeAllOffersByTrader(traderId: string): void; + addTradersToUpdateList(): void; + addPlayerOffers(): void; + expireStaleOffers(): void; + /** + * Get an array of stale offers that are still shown to player + * @returns IRagfairOffer array + */ + protected getStaleOffers(): IRagfairOffer[]; + protected isStale(offer: IRagfairOffer, time: number): boolean; + protected processStaleOffer(staleOffer: IRagfairOffer): void; + protected returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/RagfairPriceService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/RagfairPriceService.d.ts new file mode 100644 index 0000000..5256b99 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/RagfairPriceService.d.ts @@ -0,0 +1,32 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { IRagfairServerPrices } from "../models/spt/ragfair/IRagfairServerPrices"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RagfairPriceService { + protected handbookHelper: HandbookHelper; + protected databaseServer: DatabaseServer; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected prices: IRagfairServerPrices; + constructor(handbookHelper: HandbookHelper, databaseServer: DatabaseServer, logger: ILogger, itemHelper: ItemHelper, presetHelper: PresetHelper, randomUtil: RandomUtil, configServer: ConfigServer); + generateStaticPrices(): void; + generateDynamicPrices(): void; + hasDynamicPrices(): boolean; + getDynamicPrice(itemTpl: string): number; + getAllFleaPrices(): Record; + getFleaPriceForItem(tplId: string): number; + getBarterPrice(barterScheme: IBarterScheme[]): number; + getDynamicOfferPrice(items: Item[], desiredCurrency: string): number; + getWeaponPresetPrice(item: Item, items: Item[], existingPrice: number): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/RagfairRequiredItemsService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/RagfairRequiredItemsService.d.ts new file mode 100644 index 0000000..b05fc65 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/RagfairRequiredItemsService.d.ts @@ -0,0 +1,12 @@ +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairRequiredItemsService { + protected logger: ILogger; + protected paymentHelper: PaymentHelper; + protected ragfairOfferService: RagfairOfferService; + protected requiredItemsCache: {}; + constructor(logger: ILogger, paymentHelper: PaymentHelper, ragfairOfferService: RagfairOfferService); + getRequiredItems(searchId: string): any; + buildRequiredItemTable(): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/TraderAssortService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/TraderAssortService.d.ts new file mode 100644 index 0000000..5ba2d05 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/TraderAssortService.d.ts @@ -0,0 +1,6 @@ +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +export declare class TraderAssortService { + protected pristineTraderAssorts: Record; + getPristineTraderAssort(traderId: string): ITraderAssort; + setPristineTraderAssort(traderId: string, assort: ITraderAssort): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts new file mode 100644 index 0000000..abfe237 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter, RouteAction } from "../../../di/Router"; +export declare class DynamicRouterMod extends DynamicRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts new file mode 100644 index 0000000..6742fc6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class DynamicRouterModService { + private container; + constructor(container: DependencyContainer); + registerDynamicRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/mod/image/imageRouteService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/mod/image/imageRouteService.d.ts new file mode 100644 index 0000000..29569b2 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/mod/image/imageRouteService.d.ts @@ -0,0 +1,6 @@ +export declare class ImageRouteService { + protected routes: Record; + addRoute(urlKey: string, route: string): void; + getByKey(urlKey: string): string; + existsByKey(urlKey: string): boolean; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/mod/onLoad/OnLoadMod.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/mod/onLoad/OnLoadMod.d.ts new file mode 100644 index 0000000..53fb062 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/mod/onLoad/OnLoadMod.d.ts @@ -0,0 +1,8 @@ +import { OnLoad } from "../../../di/OnLoad"; +export declare class OnLoadMod extends OnLoad { + private onLoadOverride; + private getRouteOverride; + constructor(onLoadOverride: () => void, getRouteOverride: () => string); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/mod/onLoad/OnLoadModService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/mod/onLoad/OnLoadModService.d.ts new file mode 100644 index 0000000..f402103 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/mod/onLoad/OnLoadModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnLoadModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/mod/onUpdate/OnUpdateMod.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/mod/onUpdate/OnUpdateMod.d.ts new file mode 100644 index 0000000..ee89043 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/mod/onUpdate/OnUpdateMod.d.ts @@ -0,0 +1,8 @@ +import { OnUpdate } from "../../../di/OnUpdate"; +export declare class OnUpdateMod extends OnUpdate { + private onUpdateOverride; + private getRouteOverride; + constructor(onUpdateOverride: (timeSinceLastRun: number) => boolean, getRouteOverride: () => string); + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/mod/onUpdate/OnUpdateModService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/mod/onUpdate/OnUpdateModService.d.ts new file mode 100644 index 0000000..05d735b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/mod/onUpdate/OnUpdateModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnUpdateModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/mod/staticRouter/StaticRouterMod.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/mod/staticRouter/StaticRouterMod.d.ts new file mode 100644 index 0000000..1e62747 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/mod/staticRouter/StaticRouterMod.d.ts @@ -0,0 +1,6 @@ +import { RouteAction, StaticRouter } from "../../../di/Router"; +export declare class StaticRouterMod extends StaticRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/services/mod/staticRouter/StaticRouterModService.d.ts b/Faupi-HideoutMod/Project/src/server/types/services/mod/staticRouter/StaticRouterModService.d.ts new file mode 100644 index 0000000..f28fd45 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/services/mod/staticRouter/StaticRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class StaticRouterModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/App.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/App.d.ts new file mode 100644 index 0000000..34c141e --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/App.d.ts @@ -0,0 +1,14 @@ +import { TimeUtil } from "./TimeUtil"; +import { OnLoad } from "../di/OnLoad"; +import { OnUpdate } from "../di/OnUpdate"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class App { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected onLoadComponents: OnLoad[]; + protected onUpdateComponents: OnUpdate[]; + protected onUpdateLastRun: {}; + constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]); + load(): void; + protected update(onUpdateComponents: OnUpdate[]): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/AyncQueue.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/AyncQueue.d.ts new file mode 100644 index 0000000..da6ab18 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/AyncQueue.d.ts @@ -0,0 +1,7 @@ +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { ICommand } from "../models/spt/utils/ICommand"; +export declare class AsyncQueue implements IAsyncQueue { + protected commandsQueue: ICommand[]; + constructor(); + waitFor(command: ICommand): Promise; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/DatabaseImporter.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/DatabaseImporter.d.ts new file mode 100644 index 0000000..0857b67 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/DatabaseImporter.d.ts @@ -0,0 +1,18 @@ +import { VFS } from "./VFS"; +import { JsonUtil } from "./JsonUtil"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ImageRouter } from "../routers/ImageRouter"; +import { OnLoad } from "../di/OnLoad"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class DatabaseImporter extends OnLoad { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected imageRouter: ImageRouter; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter); + onLoad(): void; + getRoute(): string; + loadRecursive(filepath: string): any; + loadImages(filepath: string): void; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/HashUtil.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/HashUtil.d.ts new file mode 100644 index 0000000..bacbf2a --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/HashUtil.d.ts @@ -0,0 +1,11 @@ +/// +import crypto from "crypto"; +import { TimeUtil } from "./TimeUtil"; +export declare class HashUtil { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + generate(): string; + generateMd5ForData(data: string): string; + generateSha1ForData(data: string): string; + generateHashForData(algorithm: string, data: crypto.BinaryLike): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/HttpResponseUtil.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/HttpResponseUtil.d.ts new file mode 100644 index 0000000..29502be --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/HttpResponseUtil.d.ts @@ -0,0 +1,16 @@ +import { JsonUtil } from "./JsonUtil"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class HttpResponseUtil { + protected jsonUtil: JsonUtil; + constructor(jsonUtil: JsonUtil); + protected clearString(s: string): any; + noBody(data: any): any; + getBody(data: T, err?: number, errmsg?: any): IGetBodyResponseData; + getUnclearedBody(data: any, err?: number, errmsg?: any): string; + emptyResponse(): IGetBodyResponseData; + nullResponse(): INullResponseData; + emptyArrayResponse(): IGetBodyResponseData; + appendErrorToOutput(output: IItemEventRouterResponse, message?: string, title?: string): IItemEventRouterResponse; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/JsonUtil.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/JsonUtil.d.ts new file mode 100644 index 0000000..71e95f6 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/JsonUtil.d.ts @@ -0,0 +1,25 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "./HashUtil"; +import { VFS } from "./VFS"; +export declare class JsonUtil { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected fileHashes: any; + constructor(vfs: VFS, hashUtil: HashUtil, logger: ILogger); + /** + * From object to string + * @param data object to turn into JSON + * @param prettify Should output be prettified? + * @returns string + */ + serialize(data: any, prettify?: boolean): string; + /** + * From string to object + * @param jsonString json string to turn into object + * @returns object + */ + deserialize(jsonString: string): any; + deserializeWithCacheCheck(jsonString: string, filePath: string): string; + clone(data: T): T; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/Logger.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/Logger.d.ts new file mode 100644 index 0000000..f5b774b --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/Logger.d.ts @@ -0,0 +1,51 @@ +/// +import { Daum } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ILogger } from "../models/spt/utils/ILogger"; +import winston from "winston"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +import fs from "fs"; +interface SptLogger { + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} +export declare class WinstonLogger implements ILogger { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + protected showDebugInConsole: boolean; + protected folderPath: string; + protected file: string; + protected filePath: string; + protected logLevels: { + levels: { + error: number; + warn: number; + succ: number; + info: number; + custom: number; + debug: number; + }; + colors: { + error: string; + warn: string; + succ: string; + info: string; + custom: string; + debug: string; + }; + }; + protected logger: winston.Logger & SptLogger; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + writeToLogFile(data: string | Daum): Promise; + log(data: string | Error | Record, color: string): Promise; + error(data: string | Record): Promise; + warning(data: string | Record): Promise; + success(data: string | Record): Promise; + info(data: string | Record): Promise; + debug(data: string | Record, onlyShowInConsole?: boolean): Promise; +} +export {}; diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/MathUtil.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/MathUtil.d.ts new file mode 100644 index 0000000..ea5fd69 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/MathUtil.d.ts @@ -0,0 +1,53 @@ +export declare class MathUtil { + /** + * Helper to create the sum of all array elements + * @param {array} values The array with numbers of which to calculate the sum + * @return {number} sum(values) + */ + arraySum(values: number[]): number; + /** + * Helper to create the cumulative sum of all array elements + * arrayCumsum([1, 2, 3, 4]) = [1, 3, 6, 10] + * @param {array} values The array with numbers of which to calculate the cumulative sum + * @return {array} cumsum(values) + */ + arrayCumsum(values: number[]): number[]; + /** + * Helper to create the product of each element times factor + * @param {array} values The array of numbers which shall be multiplied by the factor + * @return {array} array times factor + */ + arrayProd(values: number[], factor: number): number[]; + /** + * Helper to add a constant to all array elements + * @param {array} values The array of numbers to which the summand should be added + * @return {array} array plus summand + */ + arrayAdd(values: number[], summand: number): number[]; + /** + * Map a value from an input range to an output range linearly + * + * Example: + * a_min = 0; a_max=1; + * b_min = 1; b_max=3; + * MathUtil.mapToRange(0.5, a_min, a_max, b_min, b_max) // returns 2 + * + * @param {number} x The value from input range to be mapped to output range + * @param {number} minIn min of input range + * @param {number} maxIn max of input range + * @param {number} minOut min of output range + * @param {number} maxOut max of outout range + * @return {number} the result of the mapping + */ + mapToRange(x: number, minIn: number, maxIn: number, minOut: number, maxOut: number): number; + /** + * Linear interpolation + * e.g. used to do a continuous integration for quest rewards which are defined for specific support centers of pmcLevel + * + * @param {string} xp the point of x at which to interpolate + * @param {array} x support points in x (of same length as y) + * @param {array} y support points in y (of same length as x) + * @return {number} y(xp) + */ + interp1(xp: number, x: number[], y: number[]): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/ObjectId.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/ObjectId.d.ts new file mode 100644 index 0000000..03aae56 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/ObjectId.d.ts @@ -0,0 +1,14 @@ +/// +import { TimeUtil } from "./TimeUtil"; +export declare class ObjectId { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + protected randomBytes: Buffer; + protected constglobalCounter: number; + protected consttime: number; + protected globalCounter: number; + protected time: number; + incGlobalCounter(): number; + toHexString(byteArray: string | any[] | Buffer): string; + generate(): string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/RandomUtil.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/RandomUtil.d.ts new file mode 100644 index 0000000..c24dd60 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/RandomUtil.d.ts @@ -0,0 +1,153 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "./JsonUtil"; +import { MathUtil } from "./MathUtil"; +/** + * Array of ProbabilityObjectArray which allow to randomly draw of the contained objects + * based on the relative probability of each of its elements. + * The probabilities of the contained element is not required to be normalized. + * + * Example: + * po = new ProbabilityObjectArray( + * new ProbabilityObject("a", 5), + * new ProbabilityObject("b", 1), + * new ProbabilityObject("c", 1) + * ); + * res = po.draw(10000); + * // count the elements which should be distributed according to the relative probabilities + * res.filter(x => x==="b").reduce((sum, x) => sum + 1 , 0) + */ +export declare class ProbabilityObjectArray extends Array> { + private mathUtil; + constructor(mathUtil: MathUtil, ...items: ProbabilityObject[]); + filter(callbackfn: (value: ProbabilityObject, index: number, array: ProbabilityObject[]) => any): ProbabilityObjectArray; + /** + * Calculates the normalized cumulative probability of the ProbabilityObjectArray's elements normalized to 1 + * @param {array} probValues The relative probability values of which to calculate the normalized cumulative sum + * @returns {array} Cumulative Sum normalized to 1 + */ + cumulativeProbability(probValues: number[]): number[]; + /** + * Clone this ProbabilitObjectArray + * @returns {ProbabilityObjectArray} Deep Copy of this ProbabilityObjectArray + */ + clone(): ProbabilityObjectArray; + /** + * Drop an element from the ProbabilityObjectArray + * + * @param {string} key The key of the element to drop + * @returns {ProbabilityObjectArray} ProbabilityObjectArray without the dropped element + */ + drop(key: K): ProbabilityObjectArray; + /** + * Return the data field of a element of the ProbabilityObjectArray + * @param {string} key The key of the element whose data shall be retrieved + * @returns {object} The data object + */ + data(key: K): V; + /** + * Get the relative probability of an element by its key + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @param {string} key The key of the element whose relative probability shall be retrieved + * @return {number} The relative probability + */ + probability(key: K): number; + /** + * Get the maximum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @return {number} the maximum value of all relative probabilities in this ProbabilityObjectArray + */ + maxProbability(): number; + /** + * Get the minimum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.minProbability() // returns 1 + * + * @return {number} the minimum value of all relative probabilities in this ProbabilityObjectArray + */ + minProbability(): number; + /** + * Draw random element of the ProbabilityObject N times to return an array of N keys. + * Drawing can be with or without replacement + * + * @param {integer} count The number of times we want to draw + * @param {boolean} replacement Draw with or without replacement from the input dict + * @param {array} locklist list keys which shall be replaced even if drawing without replacement + * @return {array} Array consisting of N random keys for this ProbabilityObjectArray + */ + draw(count?: number, replacement?: boolean, locklist?: Array): K[]; +} +/** + * A ProbabilityObject which is use as an element to the ProbabilityObjectArray array + * It contains a key, the relative probability as well as optional data. + */ +export declare class ProbabilityObject { + key: K; + relativeProbability: number; + data: V; + /** + * Constructor for the ProbabilityObject + * @param {string} key The key of the element + * @param {number} relativeProbability The relative probability of this element + * @param {any} data Optional data attached to the element + */ + constructor(key: K, relativeProbability: number, data?: V); +} +export declare class RandomUtil { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + constructor(jsonUtil: JsonUtil, logger: ILogger); + getInt(min: number, max: number): number; + getIntEx(max: number): number; + getFloat(min: number, max: number): number; + getBool(): boolean; + getStringArrayValue(arr: string[]): string; + getArrayValue(arr: T[]): T; + getKey(node: any): string; + getKeyValue(node: { + [x: string]: any; + }): any; + /** + * Draw from normal distribution + * @param {number} mu Mean of the normal distribution + * @param {number} sigma Standard deviation of the normal distribution + * @returns {number} The value drawn + */ + randn(mu: number, sigma: number): number; + /** + * Draw Random integer low inclusive, high exclusive + * if high is not set we draw from 0 to low (exclusive) + * @param {integer} low Lower bound inclusive, when high is not set, this is high + * @param {integer} high Higher bound exclusive + * @returns {integer} The random integer in [low, high) + */ + randInt(low: number, high?: number): number; + /** + * Draw a random element of the provided list N times to return an array of N random elements + * 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 + * @return {array} Array consisting of N random elements + */ + drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; + /** + * Draw a random (top level) element of the provided dictionary N times to return an array of N random dictionary keys + * Drawing can be with or without replacement + * @param {any} dict The dictionary 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 dict + * @return {array} Array consisting of N random keys of the dictionary + */ + drawRandomFromDict(dict: any, count?: number, replacement?: boolean): any[]; + getBiasedRandomNumber(min: number, max: number, shift: number, n: number): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/TimeUtil.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/TimeUtil.d.ts new file mode 100644 index 0000000..9733be9 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/TimeUtil.d.ts @@ -0,0 +1,8 @@ +export declare class TimeUtil { + static readonly oneHourAsSeconds = 3600; + formatTime(date: Date): string; + formatDate(date: Date): string; + getDate(): string; + getTime(): string; + getTimestamp(): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/UUidGenerator.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/UUidGenerator.d.ts new file mode 100644 index 0000000..000b719 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/UUidGenerator.d.ts @@ -0,0 +1,4 @@ +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class UUidGenerator implements IUUidGenerator { + generate: () => string; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/VFS.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/VFS.d.ts new file mode 100644 index 0000000..e5eaf02 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/VFS.d.ts @@ -0,0 +1,55 @@ +/// +/// +import "reflect-metadata"; +import fs from "fs"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class VFS { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; + copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; + mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { + recursive: true; + }) => Promise; + readFilePromisify: (path: fs.PathLike) => Promise; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + readdirPromisify: (path: fs.PathLike, options?: BufferEncoding | { + encoding: BufferEncoding; + withFileTypes?: false; + }) => Promise; + statPromisify: (path: fs.PathLike, options?: fs.StatOptions & { + bigint?: false; + }) => Promise; + unlinkPromisify: (path: fs.PathLike) => Promise; + rmdirPromisify: (path: fs.PathLike) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + exists(filepath: fs.PathLike): boolean; + existsAsync(filepath: fs.PathLike): Promise; + copyFile(filepath: fs.PathLike, target: fs.PathLike): void; + copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise; + createDir(filepath: string): void; + createDirAsync(filepath: string): Promise; + copyDir(filepath: string, target: string, fileExtensions?: string | string[]): void; + copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise; + readFile(filepath: string): any; + readFileAsync(filepath: string): Promise; + writeFile(filepath: any, data?: string, append?: boolean, atomic?: boolean): void; + writeFileAsync(filepath: any, data?: string, append?: boolean, atomic?: boolean): Promise; + getFiles(filepath: string): string[]; + getFilesAsync(filepath: string): Promise; + getDirs(filepath: string): string[]; + getDirsAsync(filepath: string): Promise; + removeFile(filepath: string): void; + removeFileAsync(filepath: string): Promise; + removeDir(filepath: string): void; + removeDirAsync(filepath: string): Promise; + private lockFileSync; + private checkFileSync; + private unlockFileSync; + getFileExtension(filepath: string): string; + stripExtension(filepath: string): string; + minifyAllJsonInDirRecursive(filepath: string): Promise; + minifyAllJsonInDirRecursiveAsync(filepath: string): Promise; + getFilesOfType(directory: string, fileType: string, files?: string[]): string[]; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/Watermark.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/Watermark.d.ts new file mode 100644 index 0000000..111bdd0 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/Watermark.d.ts @@ -0,0 +1,41 @@ +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WatermarkLocale { + protected locales: { + "en-US": { + description: string[]; + warning: string[]; + modding: string[]; + }; + "zh-CN": { + description: string[]; + warning: string[]; + modding: string[]; + }; + }; + getLocale(): string; + getDescription(): string[]; + getWarning(): string[]; + getModding(): string[]; +} +export declare class Watermark { + protected logger: ILogger; + protected configServer: ConfigServer; + protected watermarkLocale?: WatermarkLocale; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale); + protected text: string[]; + protected versionLabel: string; + initialize(): void; + getVersionTag(): string; + getVersionLabel(): string; + /** Set window title */ + setTitle(): void; + /** Reset console cursor to top */ + resetCursor(): void; + /** Draw the watermark */ + draw(): void; + /** Caculate text length */ + protected textLength(s: string): number; +} diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/decorators/Singleton.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/decorators/Singleton.d.ts new file mode 100644 index 0000000..7e89026 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/decorators/Singleton.d.ts @@ -0,0 +1,4 @@ +import type constructor from "./constructor"; +import { InjectionToken } from "tsyringe"; +declare function singleton(token?: InjectionToken): (target: constructor) => void; +export default singleton; diff --git a/Faupi-HideoutMod/Project/src/server/types/utils/decorators/constructor.d.ts b/Faupi-HideoutMod/Project/src/server/types/utils/decorators/constructor.d.ts new file mode 100644 index 0000000..416f354 --- /dev/null +++ b/Faupi-HideoutMod/Project/src/server/types/utils/decorators/constructor.d.ts @@ -0,0 +1,4 @@ +declare type constructor = { + new (...args: any[]): T; +}; +export default constructor; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/bepInEx/plugins/Faupi-MunitionsExpert.dll b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/bepInEx/plugins/Faupi-MunitionsExpert.dll index 3a2828dfb9afa2c8825ff75b4c75862838378656..8e0645706ac11a5d51e93634e50610c1771bd058 100644 GIT binary patch delta 1626 zcmXw3Yitx%6h7zfymn@~otbUB-7e7GE=}3K*oBr-6sUy=6$ms)bj1ew0od^BLy+>2 zt;7anMK@QBA(ThV8XhIFY(&c=fS^ee(JTp%DiAirm=Y0b(jO{B&urJ3%y-Xs9^XCp z&Yg+1#o9jJE9AFzrQ^L5@NE3}E4Y>;mWf9e0nFq9R>`AShL?CZ?#2TgnOnT$2SA>x zuH(y?3#TPlu?-C8@E-)9G>0M`_jpQhpB95?HV~C|_yB|*5dgKfAz33mbznm>qBbK| zCHH7+aMmX(K=2&^&;SnVWG{cKqjl4|PV&G(55RnZd@Gj2ebO<=7hJHSX+DjA`gloB zIWFQ$a(;OU$)Um(xkRzx8}Sa4;2u0Cyf6NtN^njaRU~*0N0kB?(2B|Pfpb(T0@c~9 z7eN7`1daHZSy0XRHrIrT3ouGTr6lwb^po~U_>oY8hk`A)PPMUya1w3NMOP^2oOVwr zfr)~f{8#yytJZZLjyNSarPw+_#%Jc1U_W1(8>~0=CP2FF#q=oSOdxJRwbRtw$&#TP z4QSMCCWA8*Gj)@Hom-2O`J>#GIEyzKweDej6ANG&vvD)n*u&$-)SUgm8A2I;MtFu_ zGrZWse=|bZ%1twc^Y{a^4j*uzX5muwEu{u-xe#R5P7lj%K z;4a5(QroFV2}hJwFo3=KT8M*Pl}ES}263HjYBY|RTKW}s77S#m0KBw2oB>R zzCUlvZZCeSCa@W~b^@b#mae)k0U@x%qN)F+-S`KSs3DsoHgkE+$4+g|y z7Gfj=Xf08I%(xl5=JYcwmU5Y~8(a&O77tso zVTX)N&bPKOtA&Yvh7$@c0~yP=VrjlKREZ;eXJ|>@pd3a-V-g4|T9u+7tXLnv8>-xW z6m?mmWE#f@SC+bzjMt1MoZ|tq$Y@2YMWoi;z$D!vSy5ej&(m3!sOW_PLC9pX>Q*BFEL)E8{HEJ&2k*H+BHKHgX1 z!$fkh;vdXUZ~gtL{kbuE_R({je)zZfP*u?QwYPJnYwF~NQ!9FgF}d*xe_FNO+PBzF l9>0#+wm%*yzyry{)tiwwppkTi{}$Q#=ac4)#~2UG{{dGQdh!4O delta 1684 zcmYjSe@v8h7=NDcy}$0>m*eg|;5ZODU=EJoCm>)Zp`@{3>6983BU@Ay^B3YmGY(zl zQq$X4%Pn(J!wG7Mr{y)7u_ULNi7uHYPNq%SM3RmE$eKOh?QWI@P$=@Bbvy%h&_u8<0H<}oCmZS2KY0DdJDYB z1S^iRRkX1Nlt$S;USTFLu7xS`)kJ-}VHgZp9%UO)#9ocE?@+`7QKm7$8nUMQV1q^2mkAk+^Hf(6p5V(|?HzvX zwxvNiAwn~X8qJa1V8r9YMN%>NaFgXps%8Q0d4hM(BFu^zeJi!1PZQh8XD zaTL?oYReR9d-ZS87s>OpmGZCHi6zEWti;X64Z>F2ZCrz|SjMPZwPl>_YdX@wN|MJ& zIbs1;$^OzMR?SXnF@zWO7`Bvk+nlVP(8GG-pifR^E7(^u((qfYd8{38hdzx@Lv-_S zLK`;l0{3&6$2;6rd??Y)@4ByB7cXpC(c0?w7xB}H>;A|5o(f*)iRZgK)|ir_5{T*w z%lK!W8p@7OD2@7N7nYa7y!qvgjsC*MGJYx16PlBhYgHDswX`&?3%#82jO<8vf1T!E z^mt*v9C)hgR=AiS&&u@fQM`y|;Dn^2S*rn=dz^tGtCyL9-|Wu7HU21TR_cfu7_q3x z)OfRvnGH<#GMtfUI*_q=Gw=tm@a5t-Z}HW}^{a)5=$HwT4b5EH3ud5;|KiK-=te_T zNKE(Xn>|YHTEy!N^jN0@WRcN~W`j(lxqvB#MKS9QRn=0=Kp(Sfj8RUfm1Yf!b4>3% z7f6a3I3g=TAp_GiO$Es=E}Gjg)M`a@2Et}8W9BABta89EhU-j;kS>h~#VuZ7wnE0l z0vt0@wXsMNxowfH8KgWuknK?iot-{sXC5ETZgTXC)&l|tC580-`J6e}#dqW+V^63j z=Ml!AyE}YKJdO0;g^%fbkNz(1@o-*-WBB&=1IO22sO>%a@XqD?^H1~pc^l0AH9|an gofNh=n3jOOp`H1wFk~{})\" && node -e \"require('fs').rmdir('./dist/',{recursive:true},()=>{})\"" + }, + "devDependencies": { + "@types/node": "^14.15.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "copyfiles": "2.4.1", + "eslint": "7.26.0", + "tsyringe": "4.6.0", + "typescript": "4.6.4", + "bestzip": "2.2.1" + } +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/src/MunitionsExpert.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/src/MunitionsExpert.ts index d4fd700..9a3a9d7 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/src/MunitionsExpert.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/src/MunitionsExpert.ts @@ -1,12 +1,11 @@ import type { DependencyContainer } from "tsyringe"; -import { IMod } from "../types/models/external/mod"; -import { ILogger } from "../types/models/spt/utils/ILogger"; -import { DynamicRouterModService } from "../types/services/mod/dynamicRouter/DynamicRouterModService" -import { DatabaseServer } from "../types/servers/DatabaseServer" -import { JsonUtil } from "../types/utils/JsonUtil" -import { InitialModLoader } from "../types/loaders/InitialModLoader" -const path = require('path'); -const cfg = require("./config.json"); +import { IMod } from "@spt-aki/models/external/mod"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; +import { DynamicRouterModService } from "@spt-aki/services/mod/dynamicRouter/DynamicRouterModService" +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer" +import { JsonUtil } from "@spt-aki/utils/JsonUtil" +import { InitialModLoader } from "@spt-aki/loaders/InitialModLoader" +import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; class MunitionsExpert implements IMod { @@ -15,11 +14,13 @@ class MunitionsExpert implements IMod private router: DynamicRouterModService; private json: JsonUtil; private modLoader: InitialModLoader; - private table; - private globalLocale; - private mod; - private translations; - private items; + private table: IDatabaseTables; + private globalLocale: { [x: string]: { interface: { [x: string]: any; }; }; }; + private mod: { name: string; version: any; }; + private translations: { [x: string]: any; }; + private items: { [x: string]: any; }; + private path: { resolve: (arg0: string) => any; }; + private cfg: { BulletBackgroundColours: boolean; }; public load(container: DependencyContainer) { @@ -29,6 +30,8 @@ class MunitionsExpert implements IMod this.mod = require("../package.json"); this.translations = require("../res/translations.json"); this.logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); + this.path = require("path"); + this.cfg = require("./config.json"); this.hookRoutes(); } @@ -45,12 +48,17 @@ class MunitionsExpert implements IMod private updateLocalization() { - for(let language in this.translations){ - if(!(language in this.globalLocale)) continue; + for (const language in this.translations) + { + if (!(language in this.globalLocale)) + { + continue; + } - let attrKvPair = this.translations[language]; - for(let attrKey in attrKvPair){ - let attrValue = attrKvPair[attrKey]; + const attrKvPair = this.translations[language]; + for (const attrKey in attrKvPair) + { + const attrValue = attrKvPair[attrKey]; this.globalLocale[language].interface[attrKey] = attrValue; } @@ -74,14 +82,14 @@ class MunitionsExpert implements IMod ) } - getModInfo(url, info, sessionID, output) + getModInfo(url: string, info: any, sessionID: string, output: string) { - var modOutput = { + const modOutput = { status: 1, data: null }; - modOutput.data = {...this.mod, ...{path: path.resolve(this.modLoader.getModPath(this.mod.name))}}; + modOutput.data = {...this.mod, ...{path: this.path.resolve(this.modLoader.getModPath(this.mod.name))}}; modOutput.status = 0; return this.json.serialize(modOutput); @@ -89,14 +97,16 @@ class MunitionsExpert implements IMod changeBulletColour() { - if(cfg.BulletBackgroundColours === true) + if (this.cfg.BulletBackgroundColours === true) { - for (const i in this.items) { - let item = this.items[i] + for (const i in this.items) + { + const item = this.items[i] //set baground colour of ammo depending on pen - if (item._parent === "5485a8684bdc2da71d8b4567") { - let pen = item._props.PenetrationPower + if (item._parent === "5485a8684bdc2da71d8b4567") + { + const pen = item._props.PenetrationPower let colour = "" pen > 60 ? colour = "red" : //SuperHighPen diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/BotCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/BotCallbacks.d.ts index 9602975..2db60dc 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/BotCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/BotCallbacks.d.ts @@ -5,8 +5,8 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class BotCallbacks { - private botController; - private httpResponse; + protected botController: BotController; + protected httpResponse: HttpResponseUtil; constructor(botController: BotController, httpResponse: HttpResponseUtil); getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/BundleCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/BundleCallbacks.d.ts index b007ab8..b28abe1 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/BundleCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/BundleCallbacks.d.ts @@ -1,15 +1,16 @@ import { BundleLoader } from "../loaders/BundleLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class BundleCallbacks { - private logger; - private httpResponse; - private httpServer; - private bundleLoader; - private configServer; - private httpConfig; + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, bundleLoader: BundleLoader, configServer: ConfigServer); sendBundle(sessionID: string, req: any, resp: any, body: any): any; getBundles(url: string, info: any, sessionID: string): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/CustomizationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/CustomizationCallbacks.d.ts index 918b8b6..3bab8c0 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/CustomizationCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/CustomizationCallbacks.d.ts @@ -9,9 +9,9 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { SaveServer } from "../servers/SaveServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class CustomizationCallbacks { - private customizationController; - private saveServer; - private httpResponse; + protected customizationController: CustomizationController; + protected saveServer: SaveServer; + protected httpResponse: HttpResponseUtil; constructor(customizationController: CustomizationController, saveServer: SaveServer, httpResponse: HttpResponseUtil); getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<{ _id: string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/DataCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/DataCallbacks.d.ts index 018420e..cfb1c16 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/DataCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/DataCallbacks.d.ts @@ -12,8 +12,8 @@ import { ISettingsBase } from "../models/spt/server/ISettingsBase"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class DataCallbacks { - private httpResponse; - private databaseServer; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer); getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/DialogueCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/DialogueCallbacks.d.ts index 3b6fbd1..634f90b 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/DialogueCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/DialogueCallbacks.d.ts @@ -21,10 +21,10 @@ import { HashUtil } from "../utils/HashUtil"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class DialogueCallbacks extends OnUpdate { - private hashUtil; - private timeUtil; - private httpResponse; - private dialogueController; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected dialogueController: DialogueController; constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController); getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/GameCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/GameCallbacks.d.ts index 44a30ea..d5cad76 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/GameCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/GameCallbacks.d.ts @@ -8,9 +8,9 @@ import { INullResponseData } from "../models/eft/httpResponse/INullResponseData" import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { Watermark } from "../utils/Watermark"; declare class GameCallbacks { - private httpResponse; - private watermark; - private gameController; + protected httpResponse: HttpResponseUtil; + protected watermark: Watermark; + protected gameController: GameController; constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController); versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HandbookCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HandbookCallbacks.d.ts index 0db5fec..891e375 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HandbookCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HandbookCallbacks.d.ts @@ -1,7 +1,7 @@ import { HandbookController } from "../controllers/HandbookController"; import { OnLoad } from "../di/OnLoad"; export declare class HandbookCallbacks extends OnLoad { - private handbookController; + protected handbookController: HandbookController; constructor(handbookController: HandbookController); onLoad(): void; getRoute(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HealthCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HealthCallbacks.d.ts index a50dd42..8f7b89d 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HealthCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HealthCallbacks.d.ts @@ -9,9 +9,9 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class HealthCallbacks { - private httpResponse; - private profileHelper; - private healthController; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected healthController: HealthController; constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController); syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData; offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HideoutCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HideoutCallbacks.d.ts index 3698176..99ab4c9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HideoutCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HideoutCallbacks.d.ts @@ -11,11 +11,12 @@ import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutTog import { IHideoutUpgradeCompleteRequestData } from "../models/eft/hideout/IHideoutUpgradeCompleteRequestData"; import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; import { ConfigServer } from "../servers/ConfigServer"; export declare class HideoutCallbacks extends OnUpdate { - private hideoutController; - private configServer; - private hideoutConfig; + protected hideoutController: HideoutController; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; constructor(hideoutController: HideoutController, // TODO: delay needed configServer: ConfigServer); upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HttpCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HttpCallbacks.d.ts index 9fe387d..94c97bd 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HttpCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/HttpCallbacks.d.ts @@ -1,7 +1,7 @@ import { OnLoad } from "../di/OnLoad"; import { IHttpServer } from "../models/spt/server/IHttpServer"; export declare class HttpCallbacks extends OnLoad { - private httpServer; + protected httpServer: IHttpServer; constructor(httpServer: IHttpServer); onLoad(): void; getRoute(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InraidCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InraidCallbacks.d.ts index 2d53227..05bcce4 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InraidCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InraidCallbacks.d.ts @@ -3,14 +3,16 @@ import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IAirdropConfig } from "../models/spt/config/IAirdropConfig"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class InraidCallbacks { - private inraidController; - private httpResponse; - private configServer; - private airdropConfig; - private inraidConfig; + protected inraidController: InraidController; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected airdropConfig: IAirdropConfig; + protected inraidConfig: IInRaidConfig; constructor(inraidController: InraidController, httpResponse: HttpResponseUtil, configServer: ConfigServer); registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InsuranceCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InsuranceCallbacks.d.ts index 79feb67..520d0eb 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InsuranceCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InsuranceCallbacks.d.ts @@ -5,15 +5,16 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { InsuranceService } from "../services/InsuranceService"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class InsuranceCallbacks extends OnLoadOnUpdate { - private insuranceController; - private insuranceService; - private httpResponse; - private configServer; - private insuranceConfig; + protected insuranceController: InsuranceController; + protected insuranceService: InsuranceService; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer); onLoad(): void; getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InventoryCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InventoryCallbacks.d.ts index 9795aa0..9ab1486 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InventoryCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/InventoryCallbacks.d.ts @@ -18,7 +18,7 @@ import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryT import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; export declare class InventoryCallbacks { - private inventoryController; + protected inventoryController: InventoryController; constructor(inventoryController: InventoryController); moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ItemEventCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ItemEventCallbacks.d.ts index 74e79c4..f4f04f9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ItemEventCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ItemEventCallbacks.d.ts @@ -4,8 +4,8 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { ItemEventRouter } from "../routers/ItemEventRouter"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class ItemEventCallbacks { - private httpResponse; - private itemEventRouter; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter); handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/LauncherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/LauncherCallbacks.d.ts index 4bd5e2c..c022325 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/LauncherCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/LauncherCallbacks.d.ts @@ -8,10 +8,10 @@ import { SaveServer } from "../servers/SaveServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { Watermark } from "../utils/Watermark"; declare class LauncherCallbacks { - private httpResponse; - private launcherController; - private saveServer; - private watermark; + protected httpResponse: HttpResponseUtil; + protected launcherController: LauncherController; + protected saveServer: SaveServer; + protected watermark: Watermark; constructor(httpResponse: HttpResponseUtil, launcherController: LauncherController, saveServer: SaveServer, watermark: Watermark); connect(): string; login(url: string, info: ILoginRequestData, sessionID: string): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/LocationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/LocationCallbacks.d.ts index 5ecab74..cc69369 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/LocationCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/LocationCallbacks.d.ts @@ -6,8 +6,8 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { IGetLocationRequestData } from "../models/eft/location/IGetLocationRequestData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class LocationCallbacks { - private httpResponse; - private locationController; + protected httpResponse: HttpResponseUtil; + protected locationController: LocationController; constructor(httpResponse: HttpResponseUtil, locationController: LocationController); getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/MatchCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/MatchCallbacks.d.ts index 63d38d9..083c1f5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/MatchCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/MatchCallbacks.d.ts @@ -9,10 +9,10 @@ import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class MatchCallbacks { - private httpResponse; - private jsonUtil; - private matchController; - private databaseServer; + protected httpResponse: HttpResponseUtil; + protected jsonUtil: JsonUtil; + protected matchController: MatchController; + protected databaseServer: DatabaseServer; constructor(httpResponse: HttpResponseUtil, jsonUtil: JsonUtil, matchController: MatchController, databaseServer: DatabaseServer); updatePing(url: string, info: any, sessionID: string): INullResponseData; exitMatch(url: string, info: any, sessionID: string): INullResponseData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ModCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ModCallbacks.d.ts index 2011f0e..866abf7 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ModCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ModCallbacks.d.ts @@ -1,16 +1,17 @@ import { OnLoad } from "../di/OnLoad"; import { DelayedModLoader } from "../loaders/DelayedModLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; declare class ModCallbacks extends OnLoad { - private logger; - private httpResponse; - private httpServer; - private modLoader; - private configServer; - private httpConfig; + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected modLoader: DelayedModLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, modLoader: DelayedModLoader, configServer: ConfigServer); onLoad(): void; getRoute(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/NoteCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/NoteCallbacks.d.ts index fd7c5ca..d39d400 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/NoteCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/NoteCallbacks.d.ts @@ -3,7 +3,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { INoteActionData } from "../models/eft/notes/INoteActionData"; export declare class NoteCallbacks { - private noteController; + protected noteController: NoteController; constructor(noteController: NoteController); addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/NotifierCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/NotifierCallbacks.d.ts index 416e6a3..cd1e736 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/NotifierCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/NotifierCallbacks.d.ts @@ -6,9 +6,9 @@ import { INotifierChannel } from "../models/eft/notifier/INotifier"; import { ISelectProfileRequestData } from "../models/eft/notifier/ISelectProfileRequestData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class NotifierCallbacks { - private httpServerHelper; - private httpResponse; - private notifierController; + protected httpServerHelper: HttpServerHelper; + protected httpResponse: HttpResponseUtil; + protected notifierController: NotifierController; constructor(httpServerHelper: HttpServerHelper, httpResponse: HttpResponseUtil, notifierController: NotifierController); /** * If we don't have anything to send, it's ok to not send anything back @@ -16,7 +16,7 @@ export declare class NotifierCallbacks { * until we actually have something to send because otherwise we'd spam the client * and the client would abort the connection due to spam. */ - sendNotification(sessionID: string, req: any, resp: any, data: any): void; + sendNotification(_sessionID: string, req: any, resp: any, _data: any): void; getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/PresetBuildCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/PresetBuildCallbacks.d.ts index 639c33f..8a0c155 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/PresetBuildCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/PresetBuildCallbacks.d.ts @@ -6,8 +6,8 @@ import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPreset import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class PresetBuildCallbacks { - private httpResponse; - private presetBuildController; + protected httpResponse: HttpResponseUtil; + protected presetBuildController: PresetBuildController; constructor(httpResponse: HttpResponseUtil, presetBuildController: PresetBuildController); getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/PresetCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/PresetCallbacks.d.ts index f62afd6..4553f8f 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/PresetCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/PresetCallbacks.d.ts @@ -1,7 +1,7 @@ import { PresetController } from "../controllers/PresetController"; import { OnLoad } from "../di/OnLoad"; export declare class PresetCallbacks extends OnLoad { - private presetController; + protected presetController: PresetController; constructor(presetController: PresetController); onLoad(): void; getRoute(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ProfileCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ProfileCallbacks.d.ts index efce47d..116e7c5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ProfileCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/ProfileCallbacks.d.ts @@ -12,9 +12,9 @@ import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNic import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class ProfileCallbacks { - private httpResponse; - private timeUtil; - private profileController; + protected httpResponse: HttpResponseUtil; + protected timeUtil: TimeUtil; + protected profileController: ProfileController; constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, profileController: ProfileController); createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/QuestCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/QuestCallbacks.d.ts index f742096..559c29e 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/QuestCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/QuestCallbacks.d.ts @@ -13,9 +13,9 @@ import { IListQuestsRequestData } from "../models/eft/quests/IListQuestsRequestD import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class QuestCallbacks { - private httpResponse; - private questController; - private repeatableQuestController; + protected httpResponse: HttpResponseUtil; + protected questController: QuestController; + protected repeatableQuestController: RepeatableQuestController; constructor(httpResponse: HttpResponseUtil, questController: QuestController, repeatableQuestController: RepeatableQuestController); changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/RagfairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/RagfairCallbacks.d.ts index 152475f..d5bab8b 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/RagfairCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/RagfairCallbacks.d.ts @@ -3,6 +3,7 @@ import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { IPmcData } from "../models/eft/common/IPmcData"; import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IAddOfferRequestData } from "../models/eft/ragfair/IAddOfferRequestData"; import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; @@ -10,19 +11,20 @@ import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; import { IRemoveOfferRequestData } from "../models/eft/ragfair/IRemoveOfferRequestData"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { RagfairServer } from "../servers/RagfairServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class RagfairCallbacks extends OnLoadOnUpdate { - private httpResponse; - private logger; - private jsonUtil; - private ragfairServer; - private ragfairController; - private configServer; - private ragfairConfig; + protected httpResponse: HttpResponseUtil; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected ragfairServer: RagfairServer; + protected ragfairController: RagfairController; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(httpResponse: HttpResponseUtil, logger: ILogger, jsonUtil: JsonUtil, ragfairServer: RagfairServer, ragfairController: RagfairController, configServer: ConfigServer); onLoad(): void; getRoute(): string; @@ -33,4 +35,5 @@ export declare class RagfairCallbacks extends OnLoadOnUpdate { removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; onUpdate(timeSinceLastRun: number): boolean; + sendReport(url: string, info: any, sessionID: string): INullResponseData; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/RepairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/RepairCallbacks.d.ts index f63ec18..63733fa 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/RepairCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/RepairCallbacks.d.ts @@ -4,7 +4,7 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; export declare class RepairCallbacks { - private repairController; + protected repairController: RepairController; constructor(repairController: RepairController); traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/SaveCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/SaveCallbacks.d.ts index b7219a0..bbb6e53 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/SaveCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/SaveCallbacks.d.ts @@ -1,7 +1,7 @@ import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; import { SaveServer } from "../servers/SaveServer"; export declare class SaveCallbacks extends OnLoadOnUpdate { - private saveServer; + protected saveServer: SaveServer; constructor(saveServer: SaveServer); onLoad(): void; getRoute(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/TradeCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/TradeCallbacks.d.ts index 9928951..272ae46 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/TradeCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/TradeCallbacks.d.ts @@ -4,7 +4,7 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; export declare class TradeCallbacks { - private tradeController; + protected tradeController: TradeController; constructor(tradeController: TradeController); processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/TraderCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/TraderCallbacks.d.ts index 2a8af7f..128d9b2 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/TraderCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/TraderCallbacks.d.ts @@ -5,8 +5,8 @@ import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class TraderCallbacks extends OnLoadOnUpdate { - private httpResponse; - private traderController; + protected httpResponse: HttpResponseUtil; + protected traderController: TraderController; constructor(httpResponse: HttpResponseUtil, traderController: TraderController); onLoad(): void; getRoute(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/WeatherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/WeatherCallbacks.d.ts index e40ab3e..ae784c8 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/WeatherCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/WeatherCallbacks.d.ts @@ -3,8 +3,8 @@ import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class WeatherCallbacks { - private httpResponse; - private weatherController; + protected httpResponse: HttpResponseUtil; + protected weatherController: WeatherController; constructor(httpResponse: HttpResponseUtil, weatherController: WeatherController); getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/WishlistCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/WishlistCallbacks.d.ts index e0249fd..c2cc2a8 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/WishlistCallbacks.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/callbacks/WishlistCallbacks.d.ts @@ -3,7 +3,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; export declare class WishlistCallbacks { - private wishlistController; + protected wishlistController: WishlistController; constructor(wishlistController: WishlistController); addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/BotController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/BotController.d.ts index d7dc36d..09a1788 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/BotController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/BotController.d.ts @@ -1,20 +1,35 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { Difficulty } from "../models/eft/common/tables/IBotType"; +import { BotGenerator } from "../generators/BotGenerator"; +import { BotHelper } from "../helpers/BotHelper"; import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; 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 { ConfigServer } from "../servers/ConfigServer"; -import { BotHelper } from "../helpers/BotHelper"; -import { BotGenerator } from "../generators/BotGenerator"; +import { DatabaseServer } from "../servers/DatabaseServer"; export declare class BotController { - private databaseServer; - private botGenerator; - private botHelper; - private configServer; - private botConfig; + protected databaseServer: DatabaseServer; + protected botGenerator: BotGenerator; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); - getBotLimit(type: string): number; - getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; + /** + * Return the number of bot loadout varieties to be generated + * @param type bot Type we want the loadout gen count for + * @returns + */ + getBotPresetGenerationLimit(type: string): number; + getBotCoreDifficulty(): IBotCore; + /** + * Get bot difficulty settings + * adjust PMC settings to ensure they engage the correct bot types + * @param type what bot the server is requesting settings for + * @param difficulty difficulty level server requested settings for + * @returns Difficulty object + */ + getBotDifficulty(type: string, difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; getBotCap(): number; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/CustomizationController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/CustomizationController.d.ts index 6fd3b12..a6c4730 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/CustomizationController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/CustomizationController.d.ts @@ -1,22 +1,22 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { SaveServer } from "../servers/SaveServer"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; -import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; export declare class CustomizationController { - private logger; - private itemEventRouter; - private databaseServer; - private saveServer; - private profileHelper; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper); getTraderSuits(traderID: string, sessionID: string): ISuit[]; wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; - private getAllTraderSuits; + protected getAllTraderSuits(sessionID: string): ISuit[]; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/DialogueController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/DialogueController.d.ts index 8095666..b15c4b6 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/DialogueController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/DialogueController.d.ts @@ -1,15 +1,15 @@ -import { SaveServer } from "../servers/SaveServer"; import { DialogueHelper } from "../helpers/DialogueHelper"; -import { DialogueInfo } from "../models/eft/profile/IAkiProfile"; -import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; -import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { DialogueInfo, Message } from "../models/eft/profile/IAkiProfile"; +import { SaveServer } from "../servers/SaveServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class DialogueController { - private httpResponse; - private saveServer; - private dialogueHelper; + protected httpResponse: HttpResponseUtil; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; constructor(httpResponse: HttpResponseUtil, saveServer: SaveServer, dialogueHelper: DialogueHelper); getFriendList(sessionID: string): IGetFriendListDataResponse; generateDialogueList(sessionID: string): IGetBodyResponseData; @@ -19,6 +19,7 @@ export declare class DialogueController { setDialoguePin(dialogueID: string, shouldPin: boolean, sessionID: string): void; setRead(dialogueIDs: string[], sessionID: string): void; getAllAttachments(dialogueID: string, sessionID: string): IGetAllAttachmentsResponse; - private removeExpiredItems; + protected messagesHaveUncollectedRewards(messages: Message[]): boolean; + protected removeExpiredItems(sessionID: string): void; update(): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/GameController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/GameController.d.ts index 5c9a464..b9067fa 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/GameController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/GameController.d.ts @@ -1,20 +1,32 @@ import { HttpServerHelper } from "../helpers/HttpServerHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcDataRepeatableQuest, IRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { Watermark } from "../utils/Watermark"; export declare class GameController { - private logger; - private watermark; - private httpServerHelper; - private profileHelper; - private configServer; - private httpConfig; + protected logger: ILogger; + protected watermark: Watermark; + protected httpServerHelper: HttpServerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; constructor(logger: ILogger, watermark: Watermark, httpServerHelper: HttpServerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); - gameStart(url: string, info: IEmptyRequestData, sessionID: string): void; + gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void; + protected addMissingBonusesProperty(pmcProfile: IPmcData): void; + protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void; + protected addMissingWeaponRepairSkill(pmcProfile: IPmcData): void; + protected addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void; + protected addMissingArmorRepairSkill(pmcProfile: IPmcData): void; + protected fixNullTraderSalesSums(pmcProfile: IPmcData): void; + protected removeDanglingConditionCounters(pmcProfile: IPmcData): void; + protected removeDanglingBackendCounters(pmcProfile: IPmcData): void; getGameConfig(sessionID: string): IGameConfigResponse; getServer(): any[]; - private getActiveRepeatableQuests; + protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[]; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HandbookController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HandbookController.d.ts index 5a55e89..52d2dd8 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HandbookController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HandbookController.d.ts @@ -1,8 +1,8 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { HandbookHelper } from "../helpers/HandbookHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; export declare class HandbookController { - private databaseServer; - private handbookHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; constructor(databaseServer: DatabaseServer, handbookHelper: HandbookHelper); load(): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HealthController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HealthController.d.ts index ca049f6..aafb8df 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HealthController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HealthController.d.ts @@ -11,12 +11,12 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class HealthController { - private logger; - private itemEventRouter; - private itemHelper; - private paymentService; - private inventoryHelper; - private healthHelper; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected inventoryHelper: InventoryHelper; + protected healthHelper: HealthHelper; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, healthHelper: HealthHelper); saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HideoutController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HideoutController.d.ts index 22b7040..a8bf229 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HideoutController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/HideoutController.d.ts @@ -1,46 +1,47 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { TimeUtil } from "../utils/TimeUtil"; -import { HashUtil } from "../utils/HashUtil"; -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { PlayerService } from "../services/PlayerService"; +import { HideoutHelper } from "../helpers/HideoutHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; import { PresetHelper } from "../helpers/PresetHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; -import { PaymentHelper } from "../helpers/PaymentHelper"; -import { InventoryHelper } from "../helpers/InventoryHelper"; -import { HideoutHelper } from "../helpers/HideoutHelper"; -import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; import { IPmcData } from "../models/eft/common/IPmcData"; import { HideoutUpgradeCompleteRequestData } from "../models/eft/hideout/HideoutUpgradeCompleteRequestData"; -import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; -import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; -import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; -import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; -import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; -import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; export declare class HideoutController { - private logger; - private hashUtil; - private timeUtil; - private databaseServer; - private randomUtil; - private inventoryHelper; - private saveServer; - private playerService; - private presetHelper; - private paymentHelper; - private itemEventRouter; - private httpResponse; - private profileHelper; - private hideoutHelper; - private configServer; - private hideoutConfig; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected inventoryHelper: InventoryHelper; + protected saveServer: SaveServer; + protected playerService: PlayerService; + protected presetHelper: PresetHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected hideoutHelper: HideoutHelper; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, configServer: ConfigServer); upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InraidController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InraidController.d.ts index 1033e5f..7f2036c 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InraidController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InraidController.d.ts @@ -1,29 +1,30 @@ -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ItemHelper } from "../helpers/ItemHelper"; -import { TraderHelper } from "../helpers/TraderHelper"; +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; import { HealthHelper } from "../helpers/HealthHelper"; +import { InRaidHelper } from "../helpers/InRaidHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; import { ConfigServer } from "../servers/ConfigServer"; -import { JsonUtil } from "../utils/JsonUtil"; -import { QuestHelper } from "../helpers/QuestHelper"; -import { InRaidHelper } from "../helpers/InRaidHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; import { InsuranceService } from "../services/InsuranceService"; -import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { JsonUtil } from "../utils/JsonUtil"; export declare class InraidController { - private saveServer; - private jsonUtil; - private databaseServer; - private questHelper; - private itemHelper; - private extendedProfileHelper; - private healthHelper; - private traderHelper; - private insuranceService; - private inRaidHelper; - private configServer; - private inraidConfig; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected itemHelper: ItemHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + protected healthHelper: HealthHelper; + protected traderHelper: TraderHelper; + protected insuranceService: InsuranceService; + protected inRaidHelper: InRaidHelper; + protected configServer: ConfigServer; + protected inraidConfig: IInRaidConfig; constructor(saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, extendedProfileHelper: ExtendedProfileHelper, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer); addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void; saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InsuranceController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InsuranceController.d.ts index 50437a6..db2c567 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InsuranceController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InsuranceController.d.ts @@ -1,33 +1,34 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { TimeUtil } from "../utils/TimeUtil"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { PaymentService } from "../services/PaymentService"; import { DialogueHelper } from "../helpers/DialogueHelper"; -import { ProfileHelper } from "../helpers/ProfileHelper"; import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { InsuranceService } from "../services/InsuranceService"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { PaymentService } from "../services/PaymentService"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; export declare class InsuranceController { - private logger; - private randomUtil; - private itemEventRouter; - private timeUtil; - private saveServer; - private databaseServer; - private itemHelper; - private profileHelper; - private dialogueHelper; - private paymentService; - private insuranceService; - private configServer; - private insuranceConfig; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected itemEventRouter: ItemEventRouter; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected profileHelper: ProfileHelper; + protected dialogueHelper: DialogueHelper; + protected paymentService: PaymentService; + protected insuranceService: InsuranceService; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; constructor(logger: ILogger, randomUtil: RandomUtil, itemEventRouter: ItemEventRouter, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required insuranceService: InsuranceService, configServer: ConfigServer); processReturn(): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InventoryController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InventoryController.d.ts index 8235082..b732aa9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InventoryController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/InventoryController.d.ts @@ -27,15 +27,15 @@ import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class InventoryController { - private logger; - private hashUtil; - private jsonUtil; - private databaseServer; - private presetHelper; - private inventoryHelper; - private profileHelper; - private paymentHelper; - private itemEventRouter; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected presetHelper: PresetHelper; + protected inventoryHelper: InventoryHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter); /** * Move Item diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/LauncherController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/LauncherController.d.ts index d3d8e6a..1af1f56 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/LauncherController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/LauncherController.d.ts @@ -1,25 +1,26 @@ -import { HashUtil } from "../utils/HashUtil"; -import { SaveServer } from "../servers/SaveServer"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { Info } from "../models/eft/profile/IAkiProfile"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; -import { IRegisterData } from "../models/eft/launcher/IRegisterData"; -import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; -import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; -import { Info } from "../models/eft/profile/IAkiProfile"; -import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; export declare class LauncherController { - private hashUtil; - private saveServer; - private httpServerHelper; - private databaseServer; - private configServer; - private coreConfig; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected httpServerHelper: HttpServerHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected coreConfig: ICoreConfig; constructor(hashUtil: HashUtil, saveServer: SaveServer, httpServerHelper: HttpServerHelper, databaseServer: DatabaseServer, configServer: ConfigServer); connect(): any; find(sessionIdKey: string): Info; login(info: ILoginRequestData): string; register(info: IRegisterData): string; - private createAccount; + protected createAccount(info: IRegisterData): string; changeUsername(info: IChangeRequestData): string; changePassword(info: IChangeRequestData): string; wipe(info: IRegisterData): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/LocationController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/LocationController.d.ts index dde270c..90b6d7a 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/LocationController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/LocationController.d.ts @@ -1,16 +1,16 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { LocationGenerator } from "../generators/LocationGenerator"; import { ILocationBase } from "../models/eft/common/ILocationBase"; import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class LocationController { - private jsonUtil; - private logger; - private locationGenerator; - private databaseServer; - private timeUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected locationGenerator: LocationGenerator; + protected databaseServer: DatabaseServer; + protected timeUtil: TimeUtil; constructor(jsonUtil: JsonUtil, logger: ILogger, locationGenerator: LocationGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil); get(location: string): ILocationBase; generate(name: string): ILocationBase; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/MatchController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/MatchController.d.ts index 84abbe3..c322d96 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/MatchController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/MatchController.d.ts @@ -4,21 +4,23 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; import { MatchLocationService } from "../services/MatchLocationService"; export declare class MatchController { - private saveServer; - private profileHelper; - private matchLocationService; - private traderHelper; - private configServer; - private matchConfig; - private inraidConfig; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected matchLocationService: MatchLocationService; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected matchConfig: IMatchConfig; + protected inraidConfig: IInRaidConfig; constructor(saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, configServer: ConfigServer); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; - private getMatch; + protected getMatch(location: any): any; createGroup(sessionID: string, info: any): any; deleteGroup(info: any): void; joinMatch(info: any, sessionID: string): any[]; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/NoteController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/NoteController.d.ts index ecd8001..cc78383 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/NoteController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/NoteController.d.ts @@ -1,9 +1,9 @@ import { IPmcData } from "../models/eft/common/IPmcData"; -import { INoteActionData } from "../models/eft/notes/INoteActionData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; import { ItemEventRouter } from "../routers/ItemEventRouter"; declare class NoteController { - private itemEventRouter; + protected itemEventRouter: ItemEventRouter; constructor(itemEventRouter: ItemEventRouter); addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/NotifierController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/NotifierController.d.ts index 36fef66..31d7bfe 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/NotifierController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/NotifierController.d.ts @@ -3,11 +3,11 @@ import { NotificationService } from "../services/NotificationService"; import { INotifierChannel } from "../models/eft/notifier/INotifier"; import { HttpServerHelper } from "../helpers/HttpServerHelper"; export declare class NotifierController { - private notifierHelper; - private httpServerHelper; - private notificationService; - private pollInterval; - private timeout; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected notificationService: NotificationService; + protected pollInterval: number; + protected timeout: number; constructor(notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, notificationService: NotificationService); /** * Resolve an array of session notifications. diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/PresetBuildController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/PresetBuildController.d.ts index a15b181..adf4084 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/PresetBuildController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/PresetBuildController.d.ts @@ -1,16 +1,16 @@ import { ItemHelper } from "../helpers/ItemHelper"; -import { SaveServer } from "../servers/SaveServer"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; -import { HashUtil } from "../utils/HashUtil"; import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; export declare class PresetBuildController { - private hashUtil; - private itemEventRouter; - private itemHelper; - private saveServer; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; constructor(hashUtil: HashUtil, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, saveServer: SaveServer); getUserBuilds(sessionID: string): WeaponBuild[]; saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/PresetController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/PresetController.d.ts index 6ec8c55..ca1af1a 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/PresetController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/PresetController.d.ts @@ -1,8 +1,8 @@ import { PresetHelper } from "../helpers/PresetHelper"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class PresetController { - private presetHelper; - private databaseServer; + protected presetHelper: PresetHelper; + protected databaseServer: DatabaseServer; constructor(presetHelper: PresetHelper, databaseServer: DatabaseServer); initialize(): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/ProfileController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/ProfileController.d.ts index 46b66d8..9b7a6d5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/ProfileController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/ProfileController.d.ts @@ -1,26 +1,26 @@ -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; +import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; -import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; import { HashUtil } from "../utils/HashUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; -import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; export declare class ProfileController { - private hashUtil; - private timeUtil; - private saveServer; - private databaseServer; - private itemHelper; - private traderHelper; - private extendedProfileHelper; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected traderHelper: TraderHelper; + protected extendedProfileHelper: ExtendedProfileHelper; constructor(hashUtil: HashUtil, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, traderHelper: TraderHelper, extendedProfileHelper: ExtendedProfileHelper); getMiniProfiles(): IMiniProfile[]; getMiniProfile(sessionID: string): any; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/QuestController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/QuestController.d.ts index a964c32..e588de0 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/QuestController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/QuestController.d.ts @@ -1,33 +1,34 @@ -import { TimeUtil } from "../utils/TimeUtil"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { QuestHelper } from "../helpers/QuestHelper"; -import { ItemHelper } from "../helpers/ItemHelper"; import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { QuestConditionHelper } from "../helpers/QuestConditionHelper"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { PlayerService } from "../services/PlayerService"; +import { QuestHelper } from "../helpers/QuestHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; -import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { TimeUtil } from "../utils/TimeUtil"; export declare class QuestController { - private logger; - private timeUtil; - private itemEventRouter; - private databaseServer; - private itemHelper; - private dialogueHelper; - private profileHelper; - private questHelper; - private questConditionHelper; - private playerService; - private configServer; - private questConfig; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected questHelper: QuestHelper; + protected questConditionHelper: QuestConditionHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; constructor(logger: ILogger, timeUtil: TimeUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, questConditionHelper: QuestConditionHelper, playerService: PlayerService, configServer: ConfigServer); getClientQuests(sessionID: string): IQuest[]; acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RagfairController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RagfairController.d.ts index 5b94a95..c758593 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RagfairController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RagfairController.d.ts @@ -20,6 +20,7 @@ import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPric import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -33,30 +34,30 @@ import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsSer import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class RagfairController { - private logger; - private timeUtil; - private httpResponse; - private itemEventRouter; - private ragfairServer; - private ragfairPriceService; - private databaseServer; - private itemHelper; - private saveServer; - private ragfairSellHelper; - private ragfairTaxHelper; - private ragfairSortHelper; - private ragfairOfferHelper; - private profileHelper; - private paymentService; - private handbookHelper; - private paymentHelper; - private inventoryHelper; - private ragfairHelper; - private ragfairOfferService; - private ragfairRequiredItemsService; - private ragfairOfferGenerator; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + protected ragfairServer: RagfairServer; + protected ragfairPriceService: RagfairPriceService; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + protected ragfairSellHelper: RagfairSellHelper; + protected ragfairTaxHelper: RagfairTaxHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairOfferHelper: RagfairOfferHelper; + protected profileHelper: ProfileHelper; + protected paymentService: PaymentService; + protected handbookHelper: HandbookHelper; + protected paymentHelper: PaymentHelper; + protected inventoryHelper: InventoryHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter, ragfairServer: RagfairServer, ragfairPriceService: RagfairPriceService, databaseServer: DatabaseServer, itemHelper: ItemHelper, saveServer: SaveServer, ragfairSellHelper: RagfairSellHelper, ragfairTaxHelper: RagfairTaxHelper, ragfairSortHelper: RagfairSortHelper, ragfairOfferHelper: RagfairOfferHelper, profileHelper: ProfileHelper, paymentService: PaymentService, handbookHelper: HandbookHelper, paymentHelper: PaymentHelper, inventoryHelper: InventoryHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer); getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult; update(): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RepairController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RepairController.d.ts index 3a9f3a2..e9458f6 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RepairController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RepairController.d.ts @@ -1,25 +1,26 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { QuestHelper } from "../helpers/QuestHelper"; -import { TraderHelper } from "../helpers/TraderHelper"; -import { PaymentService } from "../services/PaymentService"; -import { IPmcData } from "../models/eft/common/IPmcData"; -import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; -import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; -import { ConfigServer } from "../servers/ConfigServer"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; import { RepairHelper } from "../helpers/RepairHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; export declare class RepairController { - private logger; - private itemEventRouter; - private databaseServer; - private questHelper; - private traderHelper; - private paymentService; - private repairHelper; - private configServer; - private repairConfig; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected traderHelper: TraderHelper; + protected paymentService: PaymentService; + protected repairHelper: RepairHelper; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, questHelper: QuestHelper, traderHelper: TraderHelper, paymentService: PaymentService, repairHelper: RepairHelper, configServer: ConfigServer); /** * Repair with trader diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RepeatableQuestController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RepeatableQuestController.d.ts index bd5e5a1..ce190aa 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RepeatableQuestController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/RepeatableQuestController.d.ts @@ -8,7 +8,8 @@ import { IPmcData, TraderInfo } from "../models/eft/common/IPmcData"; import { ICompletion, ICompletionAvailableFor, IElimination, IEliminationCondition, IExploration, IExplorationCondition, IPmcDataRepeatableQuest, IRepeatableQuest, IReward, IRewards } from "../models/eft/common/tables/IRepeatableQuests"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; -import { ELocationName, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ELocationName } from "../models/enums/ELocationName"; +import { IQuestConfig, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -47,21 +48,21 @@ export interface ITargetLocation { locations: string[]; } export declare class RepeatableQuestController { - private timeUtil; - private logger; - private randomUtil; - private mathUtil; - private jsonUtil; - private databaseServer; - private itemHelper; - private presetHelper; - private profileHelper; - private ragfairServerHelper; - private itemEventRouter; - private paymentService; - private objectId; - private configServer; - private questConfig; + protected timeUtil: TimeUtil; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected mathUtil: MathUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected itemEventRouter: ItemEventRouter; + protected paymentService: PaymentService; + protected objectId: ObjectId; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, itemEventRouter: ItemEventRouter, paymentService: PaymentService, objectId: ObjectId, configServer: ConfigServer); /** * This is the method reached by the /client/repeatalbeQuests/activityPeriods endpoint @@ -88,7 +89,7 @@ export declare class RepeatableQuestController { * @param {string} sessionId Player's session id * @returns {array} array of "repeatableQuestObjects" as descibed above */ - getClientRepeatableQuests(info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; + getClientRepeatableQuests(_info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; /** * This method is called by GetClientRepeatableQuests and creates one element of quest type format (see assets/database/templates/repeatableQuests.json). * It randomly draws a quest type (currently Elimination, Completion or Exploration) as well as a trader who is providing the quest diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/TradeController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/TradeController.d.ts index f0a177b..c86745c 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/TradeController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/TradeController.d.ts @@ -9,11 +9,11 @@ import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTr import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ILogger } from "../models/spt/utils/ILogger"; declare class TradeController { - private logger; - private itemEventRouter; - private tradeHelper; - private profileHelper; - private ragfairServer; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected tradeHelper: TradeHelper; + protected profileHelper: ProfileHelper; + protected ragfairServer: RagfairServer; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, tradeHelper: TradeHelper, profileHelper: ProfileHelper, ragfairServer: RagfairServer); confirmTrading(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid?: boolean, upd?: Upd): IItemEventRouterResponse; confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/TraderController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/TraderController.d.ts index 36eac75..7bab158 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/TraderController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/TraderController.d.ts @@ -8,14 +8,14 @@ import { TraderAssortService } from "../services/TraderAssortService"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class TraderController { - private logger; - private databaseServer; - private traderAssortHelper; - private profileHelper; - private traderHelper; - private timeUtil; - private traderAssortService; - private jsonUtil; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected traderAssortHelper: TraderAssortHelper; + protected profileHelper: ProfileHelper; + protected traderHelper: TraderHelper; + protected timeUtil: TimeUtil; + protected traderAssortService: TraderAssortService; + protected jsonUtil: JsonUtil; constructor(logger: ILogger, databaseServer: DatabaseServer, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, timeUtil: TimeUtil, traderAssortService: TraderAssortService, jsonUtil: JsonUtil); load(): void; getTrader(traderID: string, sessionID: string): ITraderBase; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/WeatherController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/WeatherController.d.ts index 4f8bcf1..ca7f5eb 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/WeatherController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/WeatherController.d.ts @@ -1,10 +1,11 @@ -import { ConfigServer } from "../servers/ConfigServer"; import { WeatherGenerator } from "../generators/WeatherGenerator"; import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { ConfigServer } from "../servers/ConfigServer"; export declare class WeatherController { - private weatherGenerator; - private configServer; - private weatherConfig; + protected weatherGenerator: WeatherGenerator; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer); generate(): IWeatherData; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/WishlistController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/WishlistController.d.ts index 5ef8df3..a96c522 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/WishlistController.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/controllers/WishlistController.d.ts @@ -3,7 +3,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; export declare class WishlistController { - private itemEvenRouter; + protected itemEvenRouter: ItemEventRouter; constructor(itemEvenRouter: ItemEventRouter); addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotGenerator.d.ts index af7d7d4..88a8014 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotGenerator.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotGenerator.d.ts @@ -1,36 +1,46 @@ -import { HashUtil } from "../utils/HashUtil"; -import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; -import { IBotBase } from "../models/eft/common/tables/IBotBase"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { JsonUtil } from "../utils/JsonUtil"; -import { ConfigServer } from "../servers/ConfigServer"; -import { GameEventHelper } from "../helpers/GameEventHelper"; -import { BotInventoryGenerator } from "./BotInventoryGenerator"; import { BotHelper } from "../helpers/BotHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { Health as PmcHealth } from "../models/eft/common/IPmcData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { Health, Inventory, Skills } 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 { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotInventoryGenerator } from "./BotInventoryGenerator"; +declare namespace BotGenerator { + interface IRandomisedBotLevelResult { + level: number; + exp: number; + } +} export declare class BotGenerator { - private logger; - private hashUtil; - private randomUtil; - private jsonUtil; - private databaseServer; - private botInventoryGenerator; - private botHelper; - private gameEventHelper; - private configServer; - private botConfig; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected botInventoryGenerator: BotInventoryGenerator; + protected botHelper: BotHelper; + protected gameEventHelper: GameEventHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; - private generateBot; - private generateRandomLevel; + protected generateBot(bot: IBotBase, role: string, isPmc: boolean): IBotBase; + protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** Converts health object to the required format */ - private generateHealth; - private generateSkills; - private getPmcRole; - private removeChristmasItemsFromBotInventory; - private generateId; - private generateInventoryID; - private getPMCDifficulty; - private generateDogtag; + protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; + protected generateSkills(skillsObj: Skills): Skills; + protected getPmcRole(pmcSide: string): string; + protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + protected generateId(bot: IBotBase): IBotBase; + protected generateInventoryID(profile: IBotBase): IBotBase; + protected getPMCDifficulty(requestedDifficulty: string): string; + protected generateDogtag(bot: IBotBase): IBotBase; } +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotInventoryGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotInventoryGenerator.d.ts index 0cdbacb..783d0c5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotInventoryGenerator.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotInventoryGenerator.d.ts @@ -1,5 +1,5 @@ import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; -import { Inventory, Chances, Generation } from "../models/eft/common/tables/IBotType"; +import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; @@ -9,16 +9,16 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; export declare class BotInventoryGenerator { - private logger; - private hashUtil; - private randomUtil; - private databaseServer; - private botWeaponGenerator; - private botLootGenerator; - private botGeneratorHelper; - private weightedRandomHelper; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected botWeaponGenerator: BotWeaponGenerator; + 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(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; - private generateEquipment; - private generateInventoryBase; + protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; + protected generateInventoryBase(): PmcInventory; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotLootGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotLootGenerator.d.ts index 3bf1b36..1d91836 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotLootGenerator.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotLootGenerator.d.ts @@ -1,27 +1,29 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { HandbookHelper } from "../helpers/HandbookHelper"; import { PMCLootGenerator } from "../generators/PMCLootGenerator"; +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { HandbookHelper } from "../helpers/HandbookHelper"; import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; import { ItemMinMax, Items } from "../models/eft/common/tables/IBotType"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; export declare class BotLootGenerator { - private jsonUtil; - private hashUtil; - private randomUtil; - private databaseServer; - private handbookHelper; - private botGeneratorHelper; - private pmcLootGenerator; - private configServer; - private botConfig; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected pmcLootGenerator: PMCLootGenerator; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, pmcLootGenerator: PMCLootGenerator, configServer: ConfigServer); generateLoot(lootPool: Items, itemCounts: ItemMinMax, isPmc: boolean, inventory: PmcInventory): void; - private getRandomisedCount; - private addLootFromPool; + protected getRandomisedCount(min: number, max: number, nValue: number): number; + protected addLootFromPool(pool: ITemplateItem[], equipmentSlots: string[], count: number, inventory: PmcInventory, totalValueLimit?: number, useLimits?: boolean): void; /** Compares two item templates by their price to spawn chance ratio */ - private compareByValue; + protected compareByValue(a: ITemplateItem, b: ITemplateItem): number; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotWeaponGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotWeaponGenerator.d.ts index e8f91cb..13fe7df 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotWeaponGenerator.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/BotWeaponGenerator.d.ts @@ -3,22 +3,24 @@ import { ItemHelper } from "../helpers/ItemHelper"; import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; import { MinMax, Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class BotWeaponGenerator { - private logger; - private hashUtil; - private databaseServer; - private itemHelper; - private weightedRandomHelper; - private botGeneratorHelper; - private randomUtil; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected weightedRandomHelper: WeightedRandomHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected randomUtil: RandomUtil; constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil); generateWeapon(equipmentSlot: string, weaponPool: Record, modPool: Mods, modChances: ModsChances, magCounts: MinMax, botRole: string, isPmc: boolean, inventory: PmcInventory): void; /** Checks if all required slots are occupied on a weapon and all it's mods */ - private isWeaponValid; + protected isWeaponValid(itemList: Item[]): boolean; /** * Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets. * Additionally, adds extra bullets to SecuredContainer @@ -29,8 +31,8 @@ export declare class BotWeaponGenerator { * @param {*} ammoTpl * @returns */ - private generateExtraMagazines; - private addBullets; + protected generateExtraMagazines(weaponMods: Item[], weaponTemplate: ITemplateItem, magCounts: MinMax, ammoTpl: string, inventory: PmcInventory): void; + protected addBullets(ammoTpl: string, bulletCount: number, inventory: PmcInventory): void; /** * Finds and returns tpl of ammo that should be used, while making sure it's compatible * @@ -38,7 +40,7 @@ export declare class BotWeaponGenerator { * @param {*} weaponTemplate * @returns */ - private getCompatibleAmmo; + protected getCompatibleAmmo(weaponMods: Item[], weaponTemplate: ITemplateItem): string; /** Fill existing magazines to full, while replacing their contents with specified ammo */ - private fillExistingMagazines; + protected fillExistingMagazines(weaponMods: Item[], magazine: Item, ammoTpl: string): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/LocationGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/LocationGenerator.d.ts index b7ba7c5..bd368b5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/LocationGenerator.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/LocationGenerator.d.ts @@ -1,44 +1,46 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { IStaticContainerProps, IStaticLootDetails, IStaticAmmoDetails, IStaticForcedProps } from "../models/eft/common/tables/ILootBase"; +import { ContainerHelper } from "../helpers/ContainerHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; import { ILooseLoot, SpawnpointTemplate } from "../models/eft/common/ILooseLoot"; import { Item } from "../models/eft/common/tables/IItem"; -import { ItemHelper } from "../helpers/ItemHelper"; -import { GameEventHelper } from "../helpers/GameEventHelper"; -import { ContainerHelper } from "../helpers/ContainerHelper"; -import { PresetHelper } from "../helpers/PresetHelper"; +import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "../models/eft/common/tables/ILootBase"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILocationConfig } from "../models/spt/config/ILocationConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { JsonUtil } from "../utils/JsonUtil"; import { MathUtil } from "../utils/MathUtil"; import { ObjectId } from "../utils/ObjectId"; -import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; -import { ILogger } from "../models/spt/utils/ILogger"; +import { RandomUtil } from "../utils/RandomUtil"; export interface IContainerItem { items: Item[]; width: number; height: number; } export declare class LocationGenerator { - private logger; - private jsonUtil; - private objectId; - private randomUtil; - private ragfairServerHelper; - private itemHelper; - private mathUtil; - private gameEventHelper; - private containerHelper; - private presetHelper; - private configServer; - private locationConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected objectId: ObjectId; + protected randomUtil: RandomUtil; + protected ragfairServerHelper: RagfairServerHelper; + protected itemHelper: ItemHelper; + protected mathUtil: MathUtil; + protected gameEventHelper: GameEventHelper; + protected containerHelper: ContainerHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected locationConfig: ILocationConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, objectId: ObjectId, randomUtil: RandomUtil, ragfairServerHelper: RagfairServerHelper, itemHelper: ItemHelper, mathUtil: MathUtil, gameEventHelper: GameEventHelper, containerHelper: ContainerHelper, presetHelper: PresetHelper, configServer: ConfigServer); generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; - private getLooseLootMultiplerForLocation; - private getStaticLootMultiplerForLocation; + protected getLooseLootMultiplerForLocation(location: string): number; + protected getStaticLootMultiplerForLocation(location: string): number; generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; - private createItem; - private getRandomCompatibleCaliberTemplateId; - private getRandomValidCaliber; - private drawAmmoTpl; - private createRandomMagCartridges; - private createCartidges; + protected createItem(tpl: string, staticAmmoDist: Record, parentId?: string): IContainerItem; + protected getRandomCompatibleCaliberTemplateId(item: ITemplateItem): string; + protected getRandomValidCaliber(magTemplate: ITemplateItem): string; + protected drawAmmoTpl(caliber: string, staticAmmoDist: Record): string; + protected createRandomMagCartridges(magTemplate: ITemplateItem, parentId: string, staticAmmoDist: Record, caliber?: string): Item; + protected createCartidges(parentId: string, ammoTpl: string, stackCount: number): Item; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/PMCLootGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/PMCLootGenerator.d.ts index 601431b..64e6f7f 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/PMCLootGenerator.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/PMCLootGenerator.d.ts @@ -1,13 +1,14 @@ import { ItemHelper } from "../helpers/ItemHelper"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ConfigServer } from "../servers/ConfigServer"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; export declare class PMCLootGenerator { - private itemHelper; - private databaseServer; - private configServer; - private pocketLootPool; - private backpackLootPool; - private botConfig; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected pocketLootPool: string[]; + protected backpackLootPool: string[]; + protected botConfig: IBotConfig; constructor(itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); generatePMCPocketLootPool(): string[]; generatePMCBackpackLootPool(): string[]; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/RagfairAssortGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/RagfairAssortGenerator.d.ts index 8b52a90..cbdd7f2 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/RagfairAssortGenerator.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/RagfairAssortGenerator.d.ts @@ -1,17 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; import { Item } from "../models/eft/common/tables/IItem"; import { DatabaseServer } from "../servers/DatabaseServer"; -import { ItemHelper } from "../helpers/ItemHelper"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class RagfairAssortGenerator { - private jsonUtil; - private hashUtil; - private itemHelper; - private databaseServer; - private generatedAssortItems; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected generatedAssortItems: Item[]; constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + /** + * Get an array of unique items that can be sold on the flea + * @returns array of unique items + */ getAssortItems(): Item[]; - private assortsAreGenerated; - private generateRagfairAssortItems; - private createRagfairAssortItem; + protected assortsAreGenerated(): boolean; + /** + * Generate an array of items the flea can sell + * @returns array of unique items + */ + protected generateRagfairAssortItems(): Item[]; + protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/RagfairOfferGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/RagfairOfferGenerator.d.ts index cb2566c..de53ea9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/RagfairOfferGenerator.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/RagfairOfferGenerator.d.ts @@ -1,49 +1,58 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { SaveServer } from "../servers/SaveServer"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { IBarterScheme } from "../models/eft/common/tables/ITrader"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; -import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { PresetHelper } from "../helpers/PresetHelper"; import { RagfairAssortGenerator } from "./RagfairAssortGenerator"; -import { ItemHelper } from "../helpers/ItemHelper"; -import { RagfairOfferService } from "../services/RagfairOfferService"; -import { RagfairPriceService } from "../services/RagfairPriceService"; -import { FenceService } from "../services/FenceService"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class RagfairOfferGenerator { - private logger; - private jsonUtil; - private hashUtil; - private randomUtil; - private timeUtil; - private databaseServer; - private ragfairServerHelper; - private saveServer; - private presetHelper; - private ragfairAssortGenerator; - private ragfairOfferService; - private ragfairPriceService; - private fenceService; - private itemHelper; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected saveServer: SaveServer; + protected presetHelper: PresetHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairPriceService: RagfairPriceService; + protected fenceService: FenceService; + protected itemHelper: ItemHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer); createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; - private getTraderId; - private getRating; - private getRatingGrowing; - private getOfferEndTime; + protected getTraderId(userID: string): string; + protected getRating(userID: string): number; + protected getRatingGrowing(userID: string): boolean; + protected getOfferEndTime(userID: string, time: number): number; + /** + * Create multiple offers for items by using a unique list of items we've generated previously + * @param expiredOffers + */ generateDynamicOffers(expiredOffers?: Item[]): void; generateTraderOffers(traderID: string): void; - private getItemCondition; - private addMissingCondition; - private getOfferRequirements; + protected getItemCondition(userID: string, items: Item[], itemDetails: ITemplateItem): Item[]; + protected addMissingCondition(item: Item): Item; + protected getOfferRequirements(items: Item[]): { + count: number; + _tpl: string; + }[]; /** * Create a flea offer and store it in the Ragfair server offers array */ diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/WeatherGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/WeatherGenerator.d.ts index b9faa3a..23aa169 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/WeatherGenerator.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/generators/WeatherGenerator.d.ts @@ -1,19 +1,20 @@ import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { ConfigServer } from "../servers/ConfigServer"; import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class WeatherGenerator { - private weightedRandomHelper; - private randomUtil; - private timeUtil; - private configServer; - private weatherConfig; + protected weightedRandomHelper: WeightedRandomHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); calculateTime(data: IWeatherData): IWeatherData; generateWeather(data: IWeatherData): IWeatherData; - private getWeightedFog; - private getWeightedRain; - private getRandomFloat; - private getRandomInt; + protected getWeightedFog(): string; + protected getWeightedRain(): number; + protected getRandomFloat(node: string): number; + protected getRandomInt(node: string): number; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/AssortHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/AssortHelper.d.ts index 33cb5c6..15586b9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/AssortHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/AssortHelper.d.ts @@ -5,12 +5,32 @@ import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemHelper } from "./ItemHelper"; import { QuestHelper } from "./QuestHelper"; export declare class AssortHelper { - private logger; - private itemHelper; - private databaseServer; - private questHelper; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; constructor(logger: ILogger, itemHelper: ItemHelper, databaseServer: DatabaseServer, questHelper: QuestHelper); + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort assort items from a trader + * @returns assort items minus locked quest assorts + */ + stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort traders assorts + * @returns traders assorts minus locked loyality assorts + */ + stripLockedLoyaltyAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove an item from an assort + * @param assort assort to modify + * @param itemID item id to remove from asort + * @returns Modified assort + */ removeItemFromAssort(assort: ITraderAssort, itemID: string): ITraderAssort; - stripQuestAssort(pmcProfile: IPmcData, sessionId: string, traderId: string, assort: ITraderAssort): ITraderAssort; - stripLoyaltyAssort(pmcProfile: IPmcData, sessionId: string, traderId: string, assort: ITraderAssort): ITraderAssort; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/BotGeneratorHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/BotGeneratorHelper.d.ts index 6abdc07..c382fc9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/BotGeneratorHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/BotGeneratorHelper.d.ts @@ -1,8 +1,9 @@ import { DurabilityLimitsHelper } from "../helpers/DurabilityLimitsHelper"; import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; import { Mods, ModsChances } from "../models/eft/common/tables/IBotType"; -import { Item, Upd } from "../models/eft/common/tables/IItem"; -import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { Item, Repairable, Upd } from "../models/eft/common/tables/IItem"; +import { Grid, ITemplateItem, Slot } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -12,18 +13,18 @@ import { RandomUtil } from "../utils/RandomUtil"; import { ContainerHelper } from "./ContainerHelper"; import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; -declare class BotGeneratorHelper { - private logger; - private jsonUtil; - private hashUtil; - private randomUtil; - private databaseServer; - private durabilityLimitsHelper; - private itemHelper; - private inventoryHelper; - private containerHelper; - private configServer; - private botConfig; +export declare class BotGeneratorHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected durabilityLimitsHelper: DurabilityLimitsHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected containerHelper: ContainerHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, configServer: ConfigServer); generateModsForItem(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, isPmc?: boolean): Item[]; /** @@ -37,16 +38,50 @@ declare class BotGeneratorHelper { * @param {string} parentId The CylinderMagazine's UID * @param {object} parentTemplate The CylinderMagazine's template */ - private fillCamora; + protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void; generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): { - "upd"?: Upd; + upd?: Upd; }; - private getModTplFromItemDb; + /** + * Create a repairable object for a weapon that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + /** + * Create a repairable object for an armor that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string; + /** + * Sort by spawn chance, highest to lowest, higher is more common + * @param unsortedModArray String array to sort + * @returns Sorted string array + */ + protected sortModArray(unsortedModArray: string[]): string[]; + /** + * Can an item be added to an item without issue + * @param items + * @param tplToCheck + * @param equipmentSlot + * @returns true if possible + */ isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean; - /** Adds an item with all its childern into specified equipmentSlots, wherever it fits. - * Returns a `boolean` indicating success. */ + /** + * Adds an item with all its childern into specified equipmentSlots, wherever it fits. + * @param equipmentSlots + * @param parentId + * @param parentTpl + * @param itemWithChildren + * @param inventory + * @returns a `boolean` indicating item was added + */ addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: PmcInventory): boolean; - private itemAllowedInContainer; + protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean; } export declare class ExhaustableArray { private itemPool; @@ -58,22 +93,3 @@ export declare class ExhaustableArray { getFirstValue(): T; hasValues(): boolean; } -declare namespace BotGeneratorHelper { - enum EquipmentSlots { - HEADWEAR = "Headwear", - EARPIECE = "Earpiece", - FACE_COVER = "FaceCover", - ARMOR_VEST = "ArmorVest", - EYEWEAR = "Eyewear", - ARM_BAND = "ArmBand", - TACTICAL_VEST = "TacticalVest", - POCKETS = "Pockets", - BACKPACK = "Backpack", - SECURED_CONTAINER = "SecuredContainer", - FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", - SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", - HOLSTER = "Holster", - SCABBARD = "Scabbard" - } -} -export { BotGeneratorHelper }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/BotHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/BotHelper.d.ts index 032218b..0cb1227 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/BotHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/BotHelper.d.ts @@ -1,22 +1,44 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; 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 { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class BotHelper { - private logger; - private jsonUtil; - private databaseServer; - private randomUtil; - private configServer; - private botConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); getBotDifficultySettings(type: string, difficulty: string): Difficulty; getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Randomise the chance the PMC will attack their own side + * @param difficultySettings pmc difficulty settings + */ randomisePmcHostility(difficultySettings: Difficulty): void; isBotPmc(botRole: string): boolean; isBotBoss(botRole: string): boolean; isBotFollower(botRole: string): boolean; + /** + * Add a bot to the FRIENDLY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typeToAdd bot type to add to friendly list + */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; + /** + * Add a bot to the ENEMY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to enemy list + */ + addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Add a bot to the REVENGE_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to revenge list + */ + addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ContainerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ContainerHelper.d.ts index 34cd1e4..3c2ee93 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ContainerHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ContainerHelper.d.ts @@ -6,7 +6,7 @@ export declare class FindSlotResult { constructor(success?: boolean, x?: any, y?: any, rotation?: boolean); } export declare class ContainerHelper { - private locateSlot; + protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean; findSlotForItem(container2D: number[][], itemWidth: number, itemHeight: number): FindSlotResult; fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): any; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/DialogueHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/DialogueHelper.d.ts index d8082e4..9776c6a 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/DialogueHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/DialogueHelper.d.ts @@ -1,17 +1,18 @@ +import { Dialogue, MessageContent, MessagePreview } from "../models/eft/profile/IAkiProfile"; +import { MessageType } from "../models/enums/MessageType"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; -import { ItemHelper } from "./ItemHelper"; -import { Dialogue, MessageContent, MessagePreview, MessageType } from "../models/eft/profile/IAkiProfile"; import { HashUtil } from "../utils/HashUtil"; -import { NotifierHelper } from "./NotifierHelper"; +import { ItemHelper } from "./ItemHelper"; import { NotificationSendHelper } from "./NotificationSendHelper"; +import { NotifierHelper } from "./NotifierHelper"; export declare class DialogueHelper { - private hashUtil; - private saveServer; - private databaseServer; - private notifierHelper; - private notificationSendHelper; - private itemHelper; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected notificationSendHelper: NotificationSendHelper; + protected itemHelper: ItemHelper; constructor(hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, notificationSendHelper: NotificationSendHelper, itemHelper: ItemHelper); createMessageContext(templateId: string, messageType: MessageType, maxStoreTime: number): MessageContent; addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards?: any[]): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/DurabilityLimitsHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/DurabilityLimitsHelper.d.ts index ee8c887..07a5db1 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/DurabilityLimitsHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/DurabilityLimitsHelper.d.ts @@ -1,25 +1,26 @@ -import { ConfigServer } from "../servers/ConfigServer"; import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { RandomUtil } from "../utils/RandomUtil"; import { BotHelper } from "./BotHelper"; export declare class DurabilityLimitsHelper { - private randomUtil; - private botHelper; - private configServer; - private botConfig; + protected randomUtil: RandomUtil; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(randomUtil: RandomUtil, botHelper: BotHelper, configServer: ConfigServer); getRandomisedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number; getRandomisedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number; getRandomisedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; getRandomisedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; - private generateMaxWeaponDurability; - private generateMaxPmcArmorDurability; - private getLowestMaxWeaponFromConfig; - private getHighestMaxWeaponDurabilityFromConfig; - private generateWeaponDurability; - private generateArmorDurability; - private getMinWeaponDeltaFromConfig; - private getMaxWeaponDeltaFromConfig; - private getMinArmorDeltaFromConfig; - private getMaxArmorDeltaFromConfig; + protected generateMaxWeaponDurability(botRole: string): number; + protected generateMaxPmcArmorDurability(itemMaxDurability: number): number; + protected getLowestMaxWeaponFromConfig(botRole: string): number; + protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number; + protected generateWeaponDurability(botRole: string, maxDurability: number): number; + protected generateArmorDurability(botRole: string, maxDurability: number): number; + protected getMinWeaponDeltaFromConfig(botRole: string): number; + protected getMaxWeaponDeltaFromConfig(botRole: string): number; + protected getMinArmorDeltaFromConfig(botRole: string): number; + protected getMaxArmorDeltaFromConfig(botRole: string): number; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ExtendedProfileHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ExtendedProfileHelper.d.ts index 4dd7d3a..d8b754d 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ExtendedProfileHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ExtendedProfileHelper.d.ts @@ -1,5 +1,5 @@ import { BotGenerator } from "../generators/BotGenerator"; -import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcData, Skills, Stats } from "../models/eft/common/IPmcData"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; import { FenceService } from "../services/FenceService"; @@ -9,14 +9,14 @@ import { Watermark } from "../utils/Watermark"; import { ItemHelper } from "./ItemHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class ExtendedProfileHelper extends ProfileHelper { - private botGenerator; + protected botGenerator: BotGenerator; constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService, botGenerator: BotGenerator); generatePlayerScav(sessionID: string): IPmcData; - private getScavSkills; - private removeSecureContainer; - private getDefaultScavSkills; - private getScavStats; - private getScavLevel; - private getScavExperience; - private setScavCooldownTimer; + protected getScavSkills(sessionID: string): Skills; + protected removeSecureContainer(profile: IPmcData): IPmcData; + protected getDefaultScavSkills(): Skills; + protected getScavStats(sessionID: string): Stats; + protected getScavLevel(sessionID: string): number; + protected getScavExperience(sessionID: string): number; + protected setScavCooldownTimer(profile: IPmcData, pmcData: IPmcData): IPmcData; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/GameEventHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/GameEventHelper.d.ts index 8131d31..b2d6377 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/GameEventHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/GameEventHelper.d.ts @@ -1,6 +1,6 @@ import { DatabaseServer } from "../servers/DatabaseServer"; export declare class GameEventHelper { - private databaseServer; + protected databaseServer: DatabaseServer; constructor(databaseServer: DatabaseServer); get EVENT(): Record; get christmasEventItems(): string[]; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HandbookHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HandbookHelper.d.ts index aed6984..b47d466 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HandbookHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HandbookHelper.d.ts @@ -9,7 +9,7 @@ export declare class LookupCollection { constructor(); } export declare class HandbookHelper { - private lookup; + protected lookup: LookupCollection; hydrateLookup(lookup: LookupCollection): void; getTemplatePrice(x: string): number; templatesWithParent(x: string): string[]; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HealthHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HealthHelper.d.ts index fb5bed7..518c23f 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HealthHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HealthHelper.d.ts @@ -1,23 +1,27 @@ -import { SaveServer } from "../servers/SaveServer"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHealthConfig } from "../models/spt/config/IHealthConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class HealthHelper { - private jsonUtil; - private logger; - private timeUtil; - private saveServer; - private configServer; - private healthConfig; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected configServer: ConfigServer; + protected healthConfig: IHealthConfig; constructor(jsonUtil: JsonUtil, logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, configServer: ConfigServer); resetVitality(sessionID: string): IAkiProfile; saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; - private saveHealth; - private saveEffects; - private addEffect; - private isEmpty; + protected saveHealth(pmcData: IPmcData, sessionID: string): void; + protected saveEffects(pmcData: IPmcData, sessionID: string): void; + protected addEffect(pmcData: IPmcData, sessionID: string, effect: { + bodyPart: string; + effectType: string; + }): void; + protected isEmpty(map: any): boolean; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HideoutHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HideoutHelper.d.ts index 5b4a5ad..76b337f 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HideoutHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HideoutHelper.d.ts @@ -1,10 +1,12 @@ -import { IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Common, HideoutArea, IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Upd } from "../models/eft/common/tables/IItem"; import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { StageBonus } from "../models/eft/hideout/IHideoutArea"; import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -17,26 +19,26 @@ import { TimeUtil } from "../utils/TimeUtil"; import { InventoryHelper } from "./InventoryHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class HideoutHelper { - private logger; - private hashUtil; - private timeUtil; - private randomUtil; - private databaseServer; - private itemEventRouter; - private httpResponse; - private profileHelper; - private inventoryHelper; - private playerService; - private configServer; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected inventoryHelper: InventoryHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; static BITCOIN_FARM: string; - private WATER_COLLECTOR; - private BITCOIN; - private EXPEDITIONARY_FUEL_TANK; + protected WATER_COLLECTOR: string; + protected BITCOIN: string; + protected EXPEDITIONARY_FUEL_TANK: string; static NAME_BACKENDCOUNTERS_CRAFTING: string; static SKILL_NAME_HIDEOUT: string; static HOUR_FOR_SKILL_CRAFTING: number; static SKILL_NAME_CRAFITING: string; - private hideoutConfig; + protected hideoutConfig: IHideoutConfig; constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer); registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; /** @@ -46,18 +48,20 @@ export declare class HideoutHelper { initProduction(recipeId: string, productionTime: number): Production; isProductionType(productive: Productive): productive is Production; applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void; - private applySkillXPBoost; + protected applySkillXPBoost(pmcData: IPmcData, bonus: StageBonus): void; updatePlayerHideout(sessionID: string): void; - private updateFuel; - private updateWaterFilters; - private getAreaUpdObject; - private updateAirFilters; - private updateBitcoinFarm; - private getBTCSlots; - private getManagementSkillsSlots; - private hasManagementSkillSlots; - private getHideoutManagementSkill; - private getHideoutManagementConsumptionBonus; + protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void; + protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean; + protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateWaterFilters(waterFilterArea: HideoutArea, pwProd: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea; + protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd; + protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production; + protected getBTCSlots(pmcData: IPmcData): number; + protected getManagementSkillsSlots(): number; + protected hasManagementSkillSlots(pmcData: IPmcData): boolean; + protected getHideoutManagementSkill(pmcData: IPmcData): Common; + protected getHideoutManagementConsumptionBonus(pmcData: IPmcData): number; isProduction(productive: Productive): productive is Production; getBTC(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; getRandomAmountRewardForScavCase(itemToCalculate: ITemplateItem): number; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HttpServerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HttpServerHelper.d.ts index 2e40814..c6e5296 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HttpServerHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/HttpServerHelper.d.ts @@ -1,8 +1,19 @@ +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { ConfigServer } from "../servers/ConfigServer"; export declare class HttpServerHelper { - private configServer; - private httpConfig; - private mime; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + protected mime: { + css: string; + bin: string; + html: string; + jpg: string; + js: string; + json: string; + png: string; + svg: string; + txt: string; + }; constructor(configServer: ConfigServer); getMimeText(key: string): string; buildUrl(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/InRaidHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/InRaidHelper.d.ts index e79d384..05b6fdf 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/InRaidHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/InRaidHelper.d.ts @@ -8,15 +8,15 @@ import { JsonUtil } from "../utils/JsonUtil"; import { InventoryHelper } from "./InventoryHelper"; import { PaymentHelper } from "./PaymentHelper"; export declare class InRaidHelper { - private logger; - private saveServer; - private jsonUtil; - private databaseServer; - private inventoryHelper; - private paymentHelper; + protected logger: ILogger; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); - private removePlayer; - private removeMapAccessKey; + protected removePlayer(sessionID: string): void; + protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void; addUpdToMoneyFromRaid(items: Item[]): void; /** * Add positive karma for PMC kills diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/InventoryHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/InventoryHelper.d.ts index 00e95d3..dc7cbca 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/InventoryHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/InventoryHelper.d.ts @@ -5,6 +5,7 @@ import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMe import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInventoryConfig } from "../models/spt/config/IInventoryConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -25,26 +26,26 @@ export interface OwnerInventoryItems { isMail: boolean; } export declare class InventoryHelper { - private logger; - private jsonUtil; - private hashUtil; - private httpResponse; - private fenceService; - private databaseServer; - private paymentHelper; - private traderAssortHelper; - private dialogueHelper; - private itemHelper; - private containerHelper; - private profileHelper; - private configServer; - private inventoryConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected httpResponse: HttpResponseUtil; + protected fenceService: FenceService; + protected databaseServer: DatabaseServer; + protected paymentHelper: PaymentHelper; + protected traderAssortHelper: TraderAssortHelper; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected containerHelper: ContainerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected inventoryConfig: IInventoryConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, httpResponse: HttpResponseUtil, fenceService: FenceService, databaseServer: DatabaseServer, paymentHelper: PaymentHelper, traderAssortHelper: TraderAssortHelper, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, containerHelper: ContainerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; getItemSize(itemTpl: string, itemID: string, inventoryItem: Item[]): Record; - private getSizeByInventoryItemHash; - private getInventoryItemHash; + protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): Record; + protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash; getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]; /** * Based on the item action, determine whose inventories we should be looking at for from and to. @@ -56,9 +57,9 @@ export declare class InventoryHelper { * @param {string} sessionID * @returns Array */ - private getStashSlotMap; - private getStashType; - private getPlayerStashSize; + protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][]; + protected getStashType(sessionID: string): string; + protected getPlayerStashSize(sessionID: string): Record; /** * Internal helper function to transfer an item from one profile to another. * fromProfileData: Profile of the source. @@ -73,5 +74,12 @@ export declare class InventoryHelper { /** * Internal helper function to handle cartridges in inventory if any of them exist. */ - private handleCartridges; + protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void; } +declare namespace InventoryHelper { + interface InventoryItemHash { + byItemId: Record; + byParentId: Record; + } +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ItemHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ItemHelper.d.ts index 8c1175a..f124cb1 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ItemHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ItemHelper.d.ts @@ -1,15 +1,15 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { InsuredItem, IPmcData } from "../models/eft/common/IPmcData"; -import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; declare class ItemHelper { - private logger; - private hashUtil; - private jsonUtil; - private databaseServer; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer); /** * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash @@ -139,98 +139,9 @@ declare class ItemHelper { getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize; } declare namespace ItemHelper { - enum BaseClasses { - WEAPON = "5422acb9af1c889c16000029", - ARMOR = "5448e54d4bdc2dcc718b4568", - VEST = "5448e5284bdc2dcb718b4567", - BACKPACK = "5448e53e4bdc2d60728b4567", - VISORS = "5448e5724bdc2ddf718b4568", - FOOD = "5448e8d04bdc2ddf718b4569", - DRINK = "5448e8d64bdc2dce718b4568", - BARTER_ITEM = "5448eb774bdc2d0a728b4567", - INFO = "5448ecbe4bdc2d60728b4568", - MEDKIT = "5448f39d4bdc2d0a728b4568", - DRUGS = "5448f3a14bdc2d27728b4569", - STIMULATOR = "5448f3a64bdc2d60728b456a", - MEDICAL = "5448f3ac4bdc2dce718b4569", - MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", - MOD = "5448fe124bdc2da5018b4567", - FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", - FUEL = "5d650c3e815116009f6201d2", - GEAR_MOD = "55802f3e4bdc2de7118b4584", - STOCK = "55818a594bdc2db9688b456a", - FOREGRIP = "55818af64bdc2d5b648b4570", - MASTER_MOD = "55802f4a4bdc2ddb688b4569", - MOUNT = "55818b224bdc2dde698b456f", - MUZZLE = "5448fe394bdc2d0d028b456c", - SIGHTS = "5448fe7a4bdc2d6f028b456b", - MEDS = "543be5664bdc2dd4348b4569", - MONEY = "543be5dd4bdc2deb348b4569", - KEY = "543be5e94bdc2df1348b4568", - KEY_MECHANICAL = "5c99f98d86f7745c314214b3", - KEYCARD = "5c164d2286f774194c5e69fa", - EQUIPMENT = "543be5f84bdc2dd4348b456a", - THROW_WEAPON = "543be6564bdc2df4348b4568", - FOOD_DRINK = "543be6674bdc2df1348b4569", - PISTOL = "5447b5cf4bdc2d65278b4567", - SMG = "5447b5e04bdc2d62278b4567", - ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", - ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", - SHOTGUN = "5447b6094bdc2dc3278b4567", - MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", - SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", - MACHINE_GUN = "5447bed64bdc2d97278b4568", - GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", - SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", - SPEC_ITEM = "5447e0e74bdc2d3c308b4567", - KNIFE = "5447e1d04bdc2dff2f8b4567", - AMMO = "5485a8684bdc2da71d8b4567", - AMMO_BOX = "543be5cb4bdc2deb348b4568", - LOOT_CONTAINER = "566965d44bdc2d814c8b4571", - MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", - SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", - STASH = "566abbb64bdc2d144c8b457d", - SORTING_TABLE = "6050cac987d3f925bf016837", - LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", - SIMPLE_CONTAINER = "5795f317245977243854e041", - INVENTORY = "55d720f24bdc2d88028b456d", - STATIONARY_CONTAINER = "567583764bdc2d98058b456e", - POCKETS = "557596e64bdc2dc2118b4571", - ARMBAND = "5b3f15d486f77432d0509248", - DOG_TAG_USEC = "59f32c3b86f77472a31742f0", - DOG_TAG_BEAR = "59f32bb586f774757e1e8442", - JEWELRY = "57864a3d24597754843f8721", - ELECTRONICS = "57864a66245977548f04a81f", - BUILDING_MATERIAL = "57864ada245977548638de91", - TOOL = "57864bb7245977548b3b66c2", - HOUSEHOLD_GOODS = "57864c322459775490116fbf", - LUBRICANT = "57864e4c24597754843f8723", - BATTERY = "57864ee62459775490116fc1", - ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", - TACTICAL_COMBO = "55818b164bdc2ddc698b456c", - MAGAZINE = "5448bc234bdc2d3c308b4569", - LIGHT_LASER = "55818b0e4bdc2dde698b456e", - FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", - COLLIMATOR = "55818ad54bdc2ddc698b4569", - COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", - COMPENSATOR = "550aa4af4bdc2dd4348b456e", - OPTIC_SCOPE = "55818ae44bdc2dde698b456c", - SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", - OTHER = "590c745b86f7743cc433c5f2", - SILENCER = "550aa4cd4bdc2dd8348b456c", - PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", - ITEM = "54009119af1c881c07000029", - CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" - } interface ItemSize { width: number; height: number; } - enum Money { - ROUBLES = "5449016a4bdc2d6f028b456f", - EUROS = "569668774bdc2da2298b4568", - DOLLARS = "5696686a4bdc2da3298b456a" - } } export { ItemHelper }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/NotificationSendHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/NotificationSendHelper.d.ts index b9298da..34e62d9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/NotificationSendHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/NotificationSendHelper.d.ts @@ -2,8 +2,8 @@ import { INotification } from "../models/eft/notifier/INotifier"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { NotificationService } from "../services/NotificationService"; export declare class NotificationSendHelper { - private httpServer; - private notificationService; + protected httpServer: IHttpServer; + protected notificationService: NotificationService; constructor(httpServer: IHttpServer, notificationService: NotificationService); /** * Send notification message to the appropiate channel diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/NotifierHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/NotifierHelper.d.ts index 0d524e9..738b69a 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/NotifierHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/NotifierHelper.d.ts @@ -2,11 +2,11 @@ import { INotification } from "../models/eft/notifier/INotifier"; import { Message, MessageContentRagfair } from "../models/eft/profile/IAkiProfile"; import { HttpServerHelper } from "./HttpServerHelper"; export declare class NotifierHelper { - private httpServerHelper; + protected httpServerHelper: HttpServerHelper; /** * The default notification sent when waiting times out. */ - private defaultNotification; + protected defaultNotification: INotification; constructor(httpServerHelper: HttpServerHelper); getDefaultNotification(): INotification; /** Creates a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside */ diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/PresetHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/PresetHelper.d.ts index 0a24128..0371886 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/PresetHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/PresetHelper.d.ts @@ -1,8 +1,8 @@ import { Preset } from "../models/eft/common/IGlobals"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class PresetHelper { - private databaseServer; - private lookup; + protected databaseServer: DatabaseServer; + protected lookup: Record; constructor(databaseServer: DatabaseServer); hydratePresetStore(input: Record): void; isPreset(id: string): boolean; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ProfileHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ProfileHelper.d.ts index 508443c..6a64291 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ProfileHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/ProfileHelper.d.ts @@ -28,6 +28,6 @@ export declare class ProfileHelper { getPmcProfile(sessionID: string): IPmcData; getScavProfile(sessionID: string): IPmcData; getDefaultCounters(): Stats; - private isWiped; - private getServerVersion; + protected isWiped(sessionID: string): boolean; + protected getServerVersion(): string; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/QuestConditionHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/QuestConditionHelper.d.ts index 2a0ee94..90ee560 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/QuestConditionHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/QuestConditionHelper.d.ts @@ -3,5 +3,5 @@ export declare class QuestConditionHelper { getQuestConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; getLevelConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; getLoyaltyConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; - private filterConditions; + protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/QuestHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/QuestHelper.d.ts index 9e2dd5e..f32c85c 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/QuestHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/QuestHelper.d.ts @@ -3,6 +3,7 @@ import { AvailableForConditions, AvailableForProps, IQuest, Reward } from "../mo import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -17,20 +18,20 @@ import { ProfileHelper } from "./ProfileHelper"; import { RagfairServerHelper } from "./RagfairServerHelper"; import { TraderHelper } from "./TraderHelper"; export declare class QuestHelper { - private logger; - private jsonUtil; - private timeUtil; - private hashUtil; - private itemHelper; - private itemEventRouter; - private databaseServer; - private ragfairServerHelper; - private dialogueHelper; - private profileHelper; - private paymentHelper; - private traderHelper; - private configServer; - private questConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, traderHelper: TraderHelper, configServer: ConfigServer); static get STATUS(): Record; questStatus(pmcData: IPmcData, questID: string): string; @@ -47,7 +48,7 @@ export declare class QuestHelper { */ dumpQuests(quests: any, label?: any): void; loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean; - private processReward; + protected processReward(reward: Reward): any[]; getQuestRewardItems(quest: IQuest, state: string): Reward[]; addQuestToPMCData(pmcData: IPmcData, quest: Quest, newState: string, acceptedQuest: IAcceptQuestRequestData): void; acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[]; @@ -58,7 +59,7 @@ export declare class QuestHelper { * Get List of All Quests as an array */ questValues(): IQuest[]; - private cleanQuestList; + protected cleanQuestList(quests: IQuest[]): IQuest[]; cleanQuestConditions(quest: IQuest): IQuest; failQuest(pmcData: IPmcData, body: any, sessionID: string): any; getQuestFromDb(questId: string, pmcData: IPmcData): IQuest; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairHelper.d.ts index 8e70bcd..c8bc5ba 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairHelper.d.ts @@ -2,6 +2,7 @@ import { Item } from "../models/eft/common/tables/IItem"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -12,16 +13,16 @@ import { ItemHelper } from "./ItemHelper"; import { TraderAssortHelper } from "./TraderAssortHelper"; import { UtilityHelper } from "./UtilityHelper"; export declare class RagfairHelper { - private logger; - private jsonUtil; - private traderAssortHelper; - private databaseServer; - private handbookHelper; - private itemHelper; - private ragfairLinkedItemService; - private utilityHelper; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected traderAssortHelper: TraderAssortHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected ragfairLinkedItemService: RagfairLinkedItemService; + protected utilityHelper: UtilityHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, traderAssortHelper: TraderAssortHelper, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, ragfairLinkedItemService: RagfairLinkedItemService, utilityHelper: UtilityHelper, configServer: ConfigServer); /** * Gets currency TAG from TPL @@ -31,7 +32,7 @@ export declare class RagfairHelper { getCurrencyTag(currency: string): string; filterCategories(sessionID: string, info: ISearchRequestData): string[]; getDisplayableAssorts(sessionID: string): Record; - private getCategoryList; + protected getCategoryList(handbookId: string): string[]; countCategories(result: IGetOffersResult): void; /** * Merges Root Items diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairOfferHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairOfferHelper.d.ts index 3bf8add..129bc1c 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairOfferHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairOfferHelper.d.ts @@ -1,7 +1,10 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -19,31 +22,31 @@ import { RagfairHelper } from "./RagfairHelper"; import { RagfairServerHelper } from "./RagfairServerHelper"; import { RagfairSortHelper } from "./RagfairSortHelper"; export declare class RagfairOfferHelper { - private logger; - private timeUtil; - private hashUtil; - private itemEventRouter; - private databaseServer; - private saveServer; - private dialogueHelper; - private itemHelper; - private paymentHelper; - private presetHelper; - private profileHelper; - private ragfairServerHelper; - private ragfairSortHelper; - private ragfairHelper; - private ragfairOfferService; - private configServer; - private static TPL_GOODS_SOLD; - private ragfairConfig; - private questConfig; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected paymentHelper: PaymentHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected configServer: ConfigServer; + protected static TPL_GOODS_SOLD: string; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, configServer: ConfigServer); getValidOffers(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; getOffersForBuild(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; processOffers(sessionID: string): boolean; - private getProfileOffers; - private deleteOfferByOfferId; - private completeOffer; + protected getProfileOffers(sessionID: string): IRagfairOffer[]; + protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairSellHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairSellHelper.d.ts index 929d112..6ec004a 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairSellHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairSellHelper.d.ts @@ -1,14 +1,15 @@ import { SellResult } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class RagfairSellHelper { - private logger; - private randomUtil; - private timeUtil; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); calculateSellChance(baseChance: number, offerPrice: number, requirementsPriceInRub: number): number; rollForSale(sellChance: number, count: number): SellResult[]; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairServerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairServerHelper.d.ts index 0f32a66..2cb3ea5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairServerHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairServerHelper.d.ts @@ -1,6 +1,8 @@ -import { MemberCategory } from "../models/eft/common/MemberCategory"; +import { MemberCategory } from "../models/enums/MemberCategory"; import { Item } from "../models/eft/common/tables/IItem"; import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; @@ -11,21 +13,26 @@ import { DialogueHelper } from "./DialogueHelper"; import { ItemHelper } from "./ItemHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class RagfairServerHelper { - private randomUtil; - private hashUtil; - private saveServer; - private databaseServer; - private profileHelper; - private itemHelper; - private dialogueHelper; - private jsonUtil; - private configServer; - private ragfairConfig; - private questConfig; - private static TPL_GOODS_RETURNED; + protected randomUtil: RandomUtil; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected jsonUtil: JsonUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + protected static TPL_GOODS_RETURNED: string; constructor(randomUtil: RandomUtil, hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, profileHelper: ProfileHelper, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, jsonUtil: JsonUtil, configServer: ConfigServer); + /** + * Is item valid / on blacklist / quest item + * @param itemDetails + * @returns boolean + */ isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean; - isItemBlacklisted(itemTemplateId: string): boolean; + protected isItemBlacklisted(itemTemplateId: string): boolean; isTrader(userID: string): boolean; isPlayer(userID: string): boolean; returnItems(sessionID: string, items: any[]): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairSortHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairSortHelper.d.ts index e9d8069..e983569 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairSortHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairSortHelper.d.ts @@ -1,12 +1,12 @@ import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class RagfairSortHelper { - private databaseServer; + protected databaseServer: DatabaseServer; constructor(databaseServer: DatabaseServer); sortOffers(offers: IRagfairOffer[], type: number, direction?: number): IRagfairOffer[]; - private sortOffersByID; - private sortOffersByRating; - private sortOffersByName; - private sortOffersByPrice; - private sortOffersByExpiry; + protected sortOffersByID(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByExpiry(a: IRagfairOffer, b: IRagfairOffer): number; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairTaxHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairTaxHelper.d.ts index e87334f..820facb 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairTaxHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RagfairTaxHelper.d.ts @@ -1,15 +1,16 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { DatabaseServer } from "../servers/DatabaseServer"; import { RagfairPriceService } from "../services/RagfairPriceService"; import { ItemHelper } from "./ItemHelper"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class RagfairTaxHelper { - private logger; - private databaseServer; - private ragfairPriceService; - private itemHelper; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected ragfairPriceService: RagfairPriceService; + protected itemHelper: ItemHelper; constructor(logger: ILogger, databaseServer: DatabaseServer, ragfairPriceService: RagfairPriceService, itemHelper: ItemHelper); calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number; - private calculateItemWorth; + protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem?: boolean): number; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RepairHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RepairHelper.d.ts index d11d0d2..650c1aa 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RepairHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/RepairHelper.d.ts @@ -1,20 +1,22 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { IPmcData } from "../models/eft/common/IPmcData"; import { Item } from "../models/eft/common/tables/IItem"; +import { Props } from "../models/eft/common/tables/ITemplateItem"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class RepairHelper { - private logger; - private jsonUtil; - private randomUtil; - private databaseServer; - private configServer; - private repairConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, configServer: ConfigServer); updateItemDurability(itemToRepairId: string, amountToRepair: number, pmcData: IPmcData, useRepairKit?: boolean): Item; - private getRandomisedArmorRepairDegredationValue; - private getRandomisedWeaponRepairDegredationValue; + protected getRandomisedArmorRepairDegredationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number): number; + protected getRandomisedWeaponRepairDegredationValue(itemProps: Props, isRepairKit: boolean, armorMax: number): number; isWeaponTemplate(tpl: string): boolean; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/SecureContainerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/SecureContainerHelper.d.ts index 8f246b6..9e2bc32 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/SecureContainerHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/SecureContainerHelper.d.ts @@ -7,7 +7,7 @@ export interface OwnerInventoryItems { isMail: boolean; } export declare class SecureContainerHelper { - private itemHelper; + protected itemHelper: ItemHelper; constructor(itemHelper: ItemHelper); getSecureContainerItems(items: Item[]): string[]; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TradeHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TradeHelper.d.ts index a78cd20..975062b 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TradeHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TradeHelper.d.ts @@ -2,7 +2,7 @@ import { InventoryHelper } from "../helpers/InventoryHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { Upd } from "../models/eft/common/tables/IItem"; +import { Item, Upd } from "../models/eft/common/tables/IItem"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; @@ -12,20 +12,33 @@ import { RagfairServer } from "../servers/RagfairServer"; import { FenceService } from "../services/FenceService"; import { PaymentService } from "../services/PaymentService"; export declare class TradeHelper { - private logger; - private itemEventRouter; - private traderHelper; - private itemHelper; - private paymentService; - private fenceService; - private inventoryHelper; - private ragfairServer; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected fenceService: FenceService; + protected inventoryHelper: InventoryHelper; + protected ragfairServer: RagfairServer; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer); + /** + * Buy item from flea or trader + * @param pmcData + * @param buyRequestData data from client + * @param sessionID + * @param foundInRaid + * @param upd optional item details used when buying from flea + * @returns + */ buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse; /** - * Selling item to trader + * Sell item to trader + * @param pmcData + * @param body + * @param sessionID + * @returns */ sellItem(pmcData: IPmcData, body: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse; - private incrementAssortBuyCount; - private checkPurchaseIsWithinTraderItemLimit; + protected incrementAssortBuyCount(assortBeingPurchased: Item, itemsPurchasedCount: number): void; + protected checkPurchaseIsWithinTraderItemLimit(assortBeingPurchased: Item, assortId: string, count: number): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TraderAssortHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TraderAssortHelper.d.ts index d95879c..4f41ac2 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TraderAssortHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TraderAssortHelper.d.ts @@ -1,7 +1,8 @@ -import { ITraderAssort } from "../models/eft/common/tables/ITrader"; -import { ILogger } from "../models/spt/utils/ILogger"; import { RagfairAssortGenerator } from "../generators/RagfairAssortGenerator"; import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { FenceService } from "../services/FenceService"; import { TraderAssortService } from "../services/TraderAssortService"; @@ -9,15 +10,33 @@ import { JsonUtil } from "../utils/JsonUtil"; import { AssortHelper } from "./AssortHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class TraderAssortHelper { - private logger; - private jsonUtil; - private databaseServer; - private profileHelper; - private assortHelper; - private ragfairAssortGenerator; - private ragfairOfferGenerator; - private traderAssortService; - private fenceService; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected assortHelper: AssortHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected traderAssortService: TraderAssortService; + protected fenceService: FenceService; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, profileHelper: ProfileHelper, assortHelper: AssortHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferGenerator: RagfairOfferGenerator, traderAssortService: TraderAssortService, fenceService: FenceService); + /** + * Get a traders assorts + * Can be used for returning ragfair / fence assorts + * @param sessionId session id + * @param traderId trader id + * @returns a traders assorts + */ getAssort(sessionId: string, traderId: string): ITraderAssort; + /** + * Get an array of pristine trader items prior to any alteration by player + * @param traderId trader id + * @returns array of Items + */ + protected getPristineTraderAssorts(traderId: string): Item[]; + /** + * Returns generated ragfair offers in a trader assort format + * @returns Trader assort object + */ + protected getRagfairDataAsTraderAssort(): ITraderAssort; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TraderHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TraderHelper.d.ts index 5440afe..ab4a371 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TraderHelper.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/helpers/TraderHelper.d.ts @@ -1,35 +1,53 @@ -import { SaveServer } from "../servers/SaveServer"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; import { PlayerService } from "../services/PlayerService"; import { HandbookHelper } from "./HandbookHelper"; import { ItemHelper } from "./ItemHelper"; -import { ProfileHelper } from "./ProfileHelper"; import { PaymentHelper } from "./PaymentHelper"; -import { FenceService } from "../services/FenceService"; -import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; -import { IPmcData } from "../models/eft/common/IPmcData"; -import { ConfigServer } from "../servers/ConfigServer"; -import { ILogger } from "../models/spt/utils/ILogger"; +import { ProfileHelper } from "./ProfileHelper"; export declare class TraderHelper { - private logger; - private databaseServer; - private saveServer; - private profileHelper; - private paymentHelper; - private itemHelper; - private handbookHelper; - private playerService; - private fenceService; - private configServer; - private traderConfig; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemHelper: ItemHelper; + protected handbookHelper: HandbookHelper; + protected playerService: PlayerService; + protected fenceService: FenceService; + protected configServer: ConfigServer; + protected traderConfig: ITraderConfig; constructor(logger: ILogger, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemHelper: ItemHelper, handbookHelper: HandbookHelper, playerService: PlayerService, fenceService: FenceService, configServer: ConfigServer); getTrader(traderID: string, sessionID: string): ITraderBase; getTraderAssortsById(traderId: string): ITraderAssort; + /** + * Reset a trader back to its initial state as seen by a level 1 player + * Does NOT take into account different profile levels + * @param sessionID session id + * @param traderID trader id to reset + */ resetTrader(sessionID: string, traderID: string): void; changeTraderDisplay(traderID: string, status: boolean, sessionID: string): void; getPurchasesData(traderID: string, sessionID: string): Record; + /** + * Calculate traders level based on exp amount and increment level if over threshold + * @param traderID trader to process + * @param sessionID session id + */ lvlUp(traderID: string, sessionID: string): void; getTraderUpdateSeconds(traderId: string): number; + /** + * check if an item is allowed to be sold to a trader + * @param traderFilters array of allowed categories + * @param tplToCheck itemTpl of inventory + * @returns boolean + */ traderFilter(traderFilters: string[], tplToCheck: string): boolean; getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/ide/BleedingEdgeEntry.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/ide/BleedingEdgeEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/ide/BleedingEdgeEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/BundleLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/BundleLoader.d.ts index 9abfe9f..06ad698 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/BundleLoader.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/BundleLoader.d.ts @@ -2,18 +2,18 @@ import { HttpServerHelper } from "../helpers/HttpServerHelper"; import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; declare class BundleInfo { - private httpServerHelper; + modPath: string; key: string; path: string; filepath: string; dependencyKeys: string[]; - constructor(modpath: string, bundle: any, httpServerHelper: HttpServerHelper); + constructor(modpath: string, bundle: any, bundlePath: string, bundleFilepath: string); } export declare class BundleLoader { - private httpServerHelper; - private vfs; - private jsonUtil; - private bundles; + protected httpServerHelper: HttpServerHelper; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected bundles: Record; constructor(httpServerHelper: HttpServerHelper, vfs: VFS, jsonUtil: JsonUtil); getBundles(local: boolean): BundleInfo[]; getBundle(key: string, local: boolean): BundleInfo; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/DelayedModLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/DelayedModLoader.d.ts index 7e7d8d0..2a05604 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/DelayedModLoader.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/DelayedModLoader.d.ts @@ -6,17 +6,16 @@ import { VFS } from "../utils/VFS"; import { BundleLoader } from "./BundleLoader"; import { InitialModLoader } from "./InitialModLoader"; export declare class DelayedModLoader implements IModLoader { - private bundleLoader; - private handbookController; - private vfs; - private modCompilerService; - private initialModLoader; + protected bundleLoader: BundleLoader; + protected handbookController: HandbookController; + protected vfs: VFS; + protected modCompilerService: ModCompilerService; + protected initialModLoader: InitialModLoader; constructor(bundleLoader: BundleLoader, handbookController: HandbookController, vfs: VFS, modCompilerService: ModCompilerService, initialModLoader: InitialModLoader); getBundles(local: boolean): string; getBundle(key: string, local: boolean): void; - getImportedModsNames(): string[]; getModPath(mod: string): string; - load(container: DependencyContainer): void; - private executeMods; - private addBundles; + load(): void; + protected executeMods(container: DependencyContainer): void; + protected addBundles(): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/InitialModLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/InitialModLoader.d.ts index a53cce2..68e47fe 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/InitialModLoader.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/loaders/InitialModLoader.d.ts @@ -1,35 +1,64 @@ import { DependencyContainer } from "tsyringe"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ModLoader } from "../models/spt/mod/IMod"; import { IModLoader } from "../models/spt/mod/IModLoader"; +import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { ModCompilerService } from "../services/ModCompilerService"; import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; export declare class InitialModLoader implements IModLoader { - private logger; - private vfs; - private jsonUtil; - private modCompilerService; - private configServer; - private readonly basepath; - private imported; - private onLoad; - private akiConfig; - constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, configServer: ConfigServer); + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected modCompilerService: ModCompilerService; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected static container: DependencyContainer; + protected readonly basepath = "user/mods/"; + protected imported: Record; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer); load(container: DependencyContainer): Promise; getBundles(local: boolean): string; getBundle(key: string, local: boolean): void; + /** + * Returns a list of mods with preserved load order + * @returns Array of mod names in load order + */ getImportedModsNames(): string[]; getModPath(mod: string): string; - private importClass; - private importMods; - private isModCombatibleWithAki; - private executeMods; - private sortModsLoadOrder; - private addMod; - private areModDependenciesFulfilled; - private isModCompatible; - private validMod; - private getLoadOrderRecursive; - private getLoadOrder; + protected importClass(name: string, filepath: string, container: DependencyContainer): void; + protected importMods(): Promise; + /** + * + * @param mods Get an array of broken/invalid mods by name + * @returns Mod names array + */ + protected getBrokenMods(mods: string[]): string[]; + /** + * Get packageJson data for mods + * @param mods mods to get packageJson for + * @returns dictionary + */ + protected getModsPackageData(mods: string[]): Record; + /** + * Does mod have "delayedLoad(" string in its entry class + * @param modFolderName folder name + * @param modToValidate package.json details + * @returns boolean + */ + protected isModSpt300Compatible(modFolderName: string, modToValidate: IPackageJsonData): boolean; + protected isModCombatibleWithAki(mod: IPackageJsonData): boolean; + protected executeMods(container: DependencyContainer): void; + sortModsLoadOrder(): string[]; + protected addMod(mod: string): Promise; + protected areModDependenciesFulfilled(mod: IPackageJsonData, loadedMods: Record): boolean; + protected isModCompatible(mod: IPackageJsonData, loadedMods: Record): boolean; + protected validMod(mod: string): boolean; + protected getLoadOrderRecursive(mod: string, result: Record, visited: Record): void; + protected getLoadOrder(mods: Record): Record; + getContainer(): DependencyContainer; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/ILocationBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/ILocationBase.d.ts index 0d092f6..ad48d32 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/ILocationBase.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/ILocationBase.d.ts @@ -107,6 +107,15 @@ export interface BossLocationSpawn { BossPlayer: boolean; BossZone: string; Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; +} +export interface BossSupport { + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; } export interface BotLocationModifier { AccuracySpeed: number; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/IPmcData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/IPmcData.d.ts index 2360147..adc2aa5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/IPmcData.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/IPmcData.d.ts @@ -1,8 +1,8 @@ import { IRagfairOffer } from "../ragfair/IRagfairOffer"; import { IPmcDataRepeatableQuest } from "./tables/IRepeatableQuests"; import { Item, Upd } from "./tables/IItem"; -import { HideoutAreasEnum } from "../hideout/HideoutAreasEnum"; -import { MemberCategory } from "./MemberCategory"; +import { HideoutAreas } from "../../enums/HideoutAreas"; +import { MemberCategory } from "../../enums/MemberCategory"; export interface IPmcData { _id: string; aid: string; @@ -289,7 +289,7 @@ export interface Production extends Productive { ProductionTime: number; } export interface HideoutArea { - type: HideoutAreasEnum; + type: HideoutAreas; level: number; active: boolean; passiveBonusesEnabled: boolean; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/tables/IBotType.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/tables/IBotType.d.ts index e0f39d9..01be0be 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/tables/IBotType.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/tables/IBotType.d.ts @@ -100,6 +100,8 @@ export interface Generation { export interface ItemMinMax { grenades: MinMax; healing: MinMax; + drugs: MinMax; + stims: MinMax; looseLoot: MinMax; magazines: MinMax; specialItems: MinMax; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/tables/IQuest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/tables/IQuest.d.ts index 1582a2f..e1fc888 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/tables/IQuest.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/common/tables/IQuest.d.ts @@ -44,8 +44,42 @@ export interface AvailableForProps { value?: number; compareMethod?: string; visibilityConditions?: VisibilityCondition[]; - target?: string; + target?: string | string[]; status?: number[]; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; +} +export interface AvailableForCounter { + id: string; + conditions: CounterCondition[]; +} +export interface CounterCondition { + _parent: string; + _props: CounterProps; +} +export interface CounterProps { + id: string; + target: string[] | string; + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; +} +export interface DaytimeCounter { + from: number; + to: number; } export interface VisibilityCondition { id: string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/IGetFriendListDataResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/IGetFriendListDataResponse.d.ts index 41858c9..1d0c0e8 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/IGetFriendListDataResponse.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/IGetFriendListDataResponse.d.ts @@ -1,4 +1,4 @@ -import { MemberCategory } from "../common/MemberCategory"; +import { MemberCategory } from "../../enums/MemberCategory"; export interface IGetFriendListDataResponse { Friends: Friend[]; Ignore: any[]; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts index db45477..43d416e 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts @@ -1,4 +1,4 @@ -import { MessageType } from "../profile/IAkiProfile"; +import { MessageType } from "../../enums/MessageType"; export interface IGetMailDialogViewRequestData { type: MessageType; dialogId: string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/ISendMessageRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/ISendMessageRequest.d.ts index 5f140c7..dd79deb 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/ISendMessageRequest.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/dialog/ISendMessageRequest.d.ts @@ -1,4 +1,4 @@ -import { MessageType } from "../profile/IAkiProfile"; +import { MessageType } from "../../enums/MessageType"; export interface ISendMessageRequest { dialogId: string; type: MessageType; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/profile/IAkiProfile.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/profile/IAkiProfile.d.ts index f95e9a8..3e0b319 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/profile/IAkiProfile.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/profile/IAkiProfile.d.ts @@ -1,3 +1,4 @@ +import { MessageType } from "../../enums/MessageType"; import { IPmcData } from "../common/IPmcData"; import { Item } from "../common/tables/IItem"; export interface IAkiProfile { @@ -43,22 +44,6 @@ export interface DialogueInfo { new: number; attachmentsNew: number; } -export declare enum MessageType { - USER_MESSAGE = 1, - NPC_TRADER = 2, - AUCTION_MESSAGE = 3, - FLEAMARKET_MESSAGE = 4, - ADMIN_MESSAGE = 5, - GROUP_CHAT_MESSAGE = 6, - SYSTEM_MESSAGE = 7, - INSURANCE_RETURN = 8, - GLOBAL_CHAT = 9, - QUEST_START = 10, - QUEST_FAIL = 11, - QUEST_SUCCESS = 12, - MESSAGE_WITH_ITEMS = 13, - INITIAL_SUPPORT = 14 -} export interface Message { _id: string; uid: string; @@ -141,12 +126,16 @@ export interface Chest { export interface Stomach { } export interface LeftArm { + Fracture?: number; } export interface RightArm { + Fracture?: number; } export interface LeftLeg { + Fracture?: number; } export interface RightLeg { + Fracture?: number; } export interface Inraid { location: string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/ragfair/IRagfairOffer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/ragfair/IRagfairOffer.d.ts index 6620a00..63f655e 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/ragfair/IRagfairOffer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/eft/ragfair/IRagfairOffer.d.ts @@ -1,4 +1,4 @@ -import { MemberCategory } from "../common/MemberCategory"; +import { MemberCategory } from "../../enums/MemberCategory"; import { Item } from "../common/tables/IItem"; export interface IRagfairOffer { sellResult?: SellResult[]; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/BaseClasses.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/BaseClasses.d.ts new file mode 100644 index 0000000..e733bca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/BaseClasses.d.ts @@ -0,0 +1,84 @@ +export declare enum BaseClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMOR = "5448e54d4bdc2dcc718b4568", + VEST = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/ConfigTypes.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/ConfigTypes.d.ts new file mode 100644 index 0000000..6bd31e8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/ConfigTypes.d.ts @@ -0,0 +1,18 @@ +export declare enum ConfigTypes { + AIRDROP = "aki-airdrop", + BOT = "aki-bot", + CORE = "aki-core", + HEALTH = "aki-health", + HIDEOUT = "aki-hideout", + HTTP = "aki-http", + IN_RAID = "aki-inraid", + INSURANCE = "aki-insurance", + INVENTORY = "aki-inventory", + LOCATION = "aki-location", + MATCH = "aki-match", + QUEST = "aki-quest", + RAGFAIR = "aki-ragfair", + REPAIR = "aki-repair", + TRADER = "aki-trader", + WEATHER = "aki-weather" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/ELocationName.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/ELocationName.d.ts new file mode 100644 index 0000000..b56cc08 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/ELocationName.d.ts @@ -0,0 +1,11 @@ +export declare enum ELocationName { + FACTORY_DAY = "factory4_day", + BIGMAP = "bigmap", + WOODS = "Woods", + SHORELINE = "Shoreline", + INTERCHANGE = "Interchange", + LIGHTHOUSE = "Lighthouse", + LABORATORY = "laboratory", + RESERVE = "RezervBase", + ANY = "any" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/EquipmentSlots.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/EquipmentSlots.d.ts new file mode 100644 index 0000000..35c18ff --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/EquipmentSlots.d.ts @@ -0,0 +1,16 @@ +export declare enum EquipmentSlots { + HEADWEAR = "Headwear", + EARPIECE = "Earpiece", + FACE_COVER = "FaceCover", + ARMOR_VEST = "ArmorVest", + EYEWEAR = "Eyewear", + ARM_BAND = "ArmBand", + TACTICAL_VEST = "TacticalVest", + POCKETS = "Pockets", + BACKPACK = "Backpack", + SECURED_CONTAINER = "SecuredContainer", + FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", + SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", + HOLSTER = "Holster", + SCABBARD = "Scabbard" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/HideoutAreas.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/HideoutAreas.d.ts new file mode 100644 index 0000000..b44a20a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/HideoutAreas.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreas { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/MemberCategory.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/MessageType.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/MessageType.d.ts new file mode 100644 index 0000000..1b0c649 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/MessageType.d.ts @@ -0,0 +1,16 @@ +export declare enum MessageType { + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/Money.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/Money.d.ts new file mode 100644 index 0000000..0d39613 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/Money.d.ts @@ -0,0 +1,5 @@ +export declare enum Money { + ROUBLES = "5449016a4bdc2d6f028b456f", + EUROS = "569668774bdc2da2298b4568", + DOLLARS = "5696686a4bdc2da3298b456a" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/Traders.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/Traders.d.ts new file mode 100644 index 0000000..163cd71 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/enums/Traders.d.ts @@ -0,0 +1,10 @@ +export declare enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/config/IBotConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/config/IBotConfig.d.ts index f8ea940..5fb9d93 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/config/IBotConfig.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/config/IBotConfig.d.ts @@ -5,6 +5,7 @@ export interface IBotConfig extends IBaseConfig { bosses: string[]; durability: Durability; lootNValue: LootNvalue; + revenge: Record; pmc: PmcConfig; showTypeInNickname: boolean; maxBotCap: number; @@ -97,6 +98,7 @@ export interface PmcConfig { maxPocketLootTotalRub: number; maxVestLootTotalRub: number; types: Types; + enemyTypes: string[]; } export interface DynamicLoot { whitelist: string[]; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/config/IQuestConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/config/IQuestConfig.d.ts index 03dc890..be4a97b 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/config/IQuestConfig.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/config/IQuestConfig.d.ts @@ -1,3 +1,4 @@ +import { ELocationName } from "../../enums/ELocationName"; import { IBaseConfig } from "./IBaseConfig"; export interface IQuestConfig extends IBaseConfig { kind: "aki-quest"; @@ -15,17 +16,6 @@ export interface IRepeatableQuestConfig { traderWhitelist: ITraderWhitelist[]; questConfig: IQuestConfig; } -export declare enum ELocationName { - FACTORY_DAY = "factory4_day", - BIGMAP = "bigmap", - WOODS = "Woods", - SHORELINE = "Shoreline", - INTERCHANGE = "Interchange", - LIGHTHOUSE = "Lighthouse", - LABORATORY = "laboratory", - RESERVE = "RezervBase", - ANY = "any" -} export interface IRewardScaling { levels: number[]; experience: number[]; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/helpers/Traders.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/helpers/Traders.d.ts index 163cd71..e935d29 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/helpers/Traders.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/helpers/Traders.d.ts @@ -1,4 +1,4 @@ -export declare enum Traders { +export declare const enum Traders { PRAPOR = "54cb50c76803fa8b248b4571", THERAPIST = "54cb57776803fa99248b456e", FENCE = "579dc571d53a0658a154fbec", diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/mod/IMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/mod/IMod.d.ts index 623e3dd..e6eec79 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/mod/IMod.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/mod/IMod.d.ts @@ -1,4 +1,4 @@ -declare namespace ModLoader { +export declare namespace ModLoader { interface IMod { name: string; version: string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/mod/IModLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/mod/IModLoader.d.ts index 5398c9b..40a5e19 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/mod/IModLoader.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/mod/IModLoader.d.ts @@ -3,6 +3,5 @@ export interface IModLoader { load(container: DependencyContainer): void; getBundles(local: boolean): string; getBundle(key: string, local: boolean): void; - getImportedModsNames(): string[]; getModPath(mod: string): string; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/server/IHttpServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/server/IHttpServer.d.ts index 50e5c91..c828399 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/server/IHttpServer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/server/IHttpServer.d.ts @@ -1,4 +1,5 @@ /// +/// import http, { ServerResponse } from "http"; import { INotification } from "../../eft/notifier/INotifier"; export interface IHttpServer { diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/server/ILocaleBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/server/ILocaleBase.d.ts index a20084d..8887c06 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/server/ILocaleBase.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/models/spt/server/ILocaleBase.d.ts @@ -1,5 +1,5 @@ export interface ILocaleBase { - global: ILocaleGlobalBase; + global: Record; menu: Record; languages: ILanguageBase[]; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/HttpRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/HttpRouter.d.ts index 44edc0b..f75a47d 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/HttpRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/HttpRouter.d.ts @@ -1,11 +1,16 @@ /// import { IncomingMessage } from "http"; -import { DynamicRouter, StaticRouter } from "../di/Router"; +import { DynamicRouter, Router, StaticRouter } from "../di/Router"; export declare class HttpRouter { - private staticRouters; - private dynamicRoutes; + protected staticRouters: StaticRouter[]; + protected dynamicRoutes: DynamicRouter[]; constructor(staticRouters: StaticRouter[], dynamicRoutes: DynamicRouter[]); - private groupBy; + protected groupBy(list: T[], keyGetter: (t: T) => string): Map; getResponse(req: IncomingMessage, info: any, sessionID: string): string; - private handleRoute; + protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean; } +declare class ResponseWrapper { + output: string; + constructor(output: string); +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/ImageRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/ImageRouter.d.ts index 07a0606..ab03977 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/ImageRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/ImageRouter.d.ts @@ -1,11 +1,12 @@ /// import { IncomingMessage, ServerResponse } from "http"; -import { VFS } from "../utils/VFS"; import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ImageRouteService } from "../services/mod/image/ImageRouteService"; +import { VFS } from "../utils/VFS"; export declare class ImageRouter { - private vfs; - constructor(vfs: VFS); - private onRoute; + protected vfs: VFS; + protected imageRouteService: ImageRouteService; + constructor(vfs: VFS, imageRouteService: ImageRouteService); addRoute(key: string, valueToAdd: string): void; sendImage(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any, httpServer: IHttpServer): void; getImage(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/ItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/ItemEventRouter.d.ts index bb20152..b1ac5d9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/ItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/ItemEventRouter.d.ts @@ -5,13 +5,13 @@ import { ProfileHelper } from "../helpers/ProfileHelper"; import { ItemEventRouterDefinition } from "../di/Router"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class ItemEventRouter { - private logger; - private jsonUtil; - private profileHelper; - private itemEventRouters; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected profileHelper: ProfileHelper; + protected itemEventRouters: ItemEventRouterDefinition[]; constructor(logger: ILogger, jsonUtil: JsonUtil, profileHelper: ProfileHelper, itemEventRouters: ItemEventRouterDefinition[]); - private output; + protected output: IItemEventRouterResponse; handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse; getOutput(sessionID: string): IItemEventRouterResponse; - private resetOutput; + protected resetOutput(sessionID: string): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/BotDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/BotDynamicRouter.d.ts index dd2f68a..6d0ab4b 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/BotDynamicRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/BotDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { BotCallbacks } from "../../callbacks/BotCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class BotDynamicRouter extends DynamicRouter { - private botCallbacks; + protected botCallbacks: BotCallbacks; constructor(botCallbacks: BotCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/BundleDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/BundleDynamicRouter.d.ts index be27008..a765410 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/BundleDynamicRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/BundleDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class BundleDynamicRouter extends DynamicRouter { - private bundleCallbacks; + protected bundleCallbacks: BundleCallbacks; constructor(bundleCallbacks: BundleCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/CustomizationDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/CustomizationDynamicRouter.d.ts index 03a5967..2db7cc5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/CustomizationDynamicRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/CustomizationDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class CustomizationDynamicRouter extends DynamicRouter { - private customizationCallbacks; + protected customizationCallbacks: CustomizationCallbacks; constructor(customizationCallbacks: CustomizationCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/DataDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/DataDynamicRouter.d.ts index c30501a..836ed8d 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/DataDynamicRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/DataDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { DataCallbacks } from "../../callbacks/DataCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class DataDynamicRouter extends DynamicRouter { - private dataCallbacks; + protected dataCallbacks: DataCallbacks; constructor(dataCallbacks: DataCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/HttpDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/HttpDynamicRouter.d.ts index b2933e9..a152b4d 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/HttpDynamicRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/HttpDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { DynamicRouter } from "../../di/Router"; import { ImageRouter } from "../ImageRouter"; export declare class HttpDynamicRouter extends DynamicRouter { - private imageRouter; + protected imageRouter: ImageRouter; constructor(imageRouter: ImageRouter); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/InraidDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/InraidDynamicRouter.d.ts index ea4a9ae..7c0561f 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/InraidDynamicRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/InraidDynamicRouter.d.ts @@ -1,7 +1,7 @@ import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class InraidDynamicRouter extends DynamicRouter { - private inraidCallbacks; + protected inraidCallbacks: InraidCallbacks; constructor(inraidCallbacks: InraidCallbacks); getTopLevelRoute(): string; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/LocationDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/LocationDynamicRouter.d.ts index 30741db..b8e5cdf 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/LocationDynamicRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/LocationDynamicRouter.d.ts @@ -1,7 +1,7 @@ import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class LocationDynamicRouter extends DynamicRouter { - private locationCallbacks; + protected locationCallbacks: LocationCallbacks; constructor(locationCallbacks: LocationCallbacks); getTopLevelRoute(): string; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/NotifierDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/NotifierDynamicRouter.d.ts index 4786817..83c60c5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/NotifierDynamicRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/NotifierDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class NotifierDynamicRouter extends DynamicRouter { - private notifierCallbacks; + protected notifierCallbacks: NotifierCallbacks; constructor(notifierCallbacks: NotifierCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/TraderDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/TraderDynamicRouter.d.ts index a100b4c..5b7cc1b 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/TraderDynamicRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/dynamic/TraderDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class TraderDynamicRouter extends DynamicRouter { - private traderCallbacks; + protected traderCallbacks: TraderCallbacks; constructor(traderCallbacks: TraderCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/CustomizationItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/CustomizationItemEventRouter.d.ts index 3025e2c..e78445e 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/CustomizationItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/CustomizationItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class CustomizationItemEventRouter extends ItemEventRouterDefinition { - private customizationCallbacks; + protected customizationCallbacks: CustomizationCallbacks; constructor(customizationCallbacks: CustomizationCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/HealthItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/HealthItemEventRouter.d.ts index bad9af2..99847c6 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/HealthItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/HealthItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class HealthItemEventRouter extends ItemEventRouterDefinition { - private healthCallbacks; + protected healthCallbacks: HealthCallbacks; constructor(healthCallbacks: HealthCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/HideoutItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/HideoutItemEventRouter.d.ts index 2cec18b..e1e98af 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/HideoutItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/HideoutItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { HideoutCallbacks } from "../../callbacks/HideoutCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class HideoutItemEventRouter extends ItemEventRouterDefinition { - private hideoutCallbacks; + protected hideoutCallbacks: HideoutCallbacks; constructor(hideoutCallbacks: HideoutCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/InsuranceItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/InsuranceItemEventRouter.d.ts index 8efc2c2..a922cc0 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/InsuranceItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/InsuranceItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class InsuranceItemEventRouter extends ItemEventRouterDefinition { - private insuranceCallbacks; + protected insuranceCallbacks: InsuranceCallbacks; constructor(insuranceCallbacks: InsuranceCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/InventoryItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/InventoryItemEventRouter.d.ts index 1d93e7b..2619bb9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/InventoryItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/InventoryItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { InventoryCallbacks } from "../../callbacks/InventoryCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class InventoryItemEventRouter extends ItemEventRouterDefinition { - private inventoryCallbacks; + protected inventoryCallbacks: InventoryCallbacks; constructor(inventoryCallbacks: InventoryCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/NoteItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/NoteItemEventRouter.d.ts index 12af594..59bf598 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/NoteItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/NoteItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { NoteCallbacks } from "../../callbacks/NoteCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class NoteItemEventRouter extends ItemEventRouterDefinition { - private noteCallbacks; + protected noteCallbacks: NoteCallbacks; constructor(noteCallbacks: NoteCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/PresetBuildItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/PresetBuildItemEventRouter.d.ts index 7298c52..277db44 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/PresetBuildItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/PresetBuildItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class PresetBuildItemEventRouter extends ItemEventRouterDefinition { - private presetBuildCallbacks; + protected presetBuildCallbacks: PresetBuildCallbacks; constructor(presetBuildCallbacks: PresetBuildCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/QuestItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/QuestItemEventRouter.d.ts index 9944ae9..db59c25 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/QuestItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/QuestItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class QuestItemEventRouter extends ItemEventRouterDefinition { - private questCallbacks; + protected questCallbacks: QuestCallbacks; constructor(questCallbacks: QuestCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/RagfairItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/RagfairItemEventRouter.d.ts index 88e52ba..9216cc5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/RagfairItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/RagfairItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class RagfairItemEventRouter extends ItemEventRouterDefinition { - private ragfairCallbacks; + protected ragfairCallbacks: RagfairCallbacks; constructor(ragfairCallbacks: RagfairCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/RepairItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/RepairItemEventRouter.d.ts index b292ded..5196ba9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/RepairItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/RepairItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { RepairCallbacks } from "../../callbacks/RepairCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class RepairItemEventRouter extends ItemEventRouterDefinition { - private repairCallbacks; + protected repairCallbacks: RepairCallbacks; constructor(repairCallbacks: RepairCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/TradeItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/TradeItemEventRouter.d.ts index 1bca2b8..a43bb0a 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/TradeItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/TradeItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { TradeCallbacks } from "../../callbacks/TradeCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class TradeItemEventRouter extends ItemEventRouterDefinition { - private tradeCallbacks; + protected tradeCallbacks: TradeCallbacks; constructor(tradeCallbacks: TradeCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/WishlistItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/WishlistItemEventRouter.d.ts index 38831f6..38497fb 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/WishlistItemEventRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/item_events/WishlistItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { WishlistCallbacks } from "../../callbacks/WishlistCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class WishlistItemEventRouter extends ItemEventRouterDefinition { - private wishlistCallbacks; + protected wishlistCallbacks: WishlistCallbacks; constructor(wishlistCallbacks: WishlistCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/BundleSerializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/BundleSerializer.d.ts index 5f275c4..912db83 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/BundleSerializer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/BundleSerializer.d.ts @@ -1,10 +1,10 @@ -import { IHttpServer } from "../../models/spt/server/IHttpServer"; -import { ILogger } from "../../models/spt/utils/ILogger"; import { Serializer } from "../../di/Serializer"; import { BundleLoader } from "../../loaders/BundleLoader"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { ILogger } from "../../models/spt/utils/ILogger"; export declare class BundleSerializer extends Serializer { - private logger; - private bundleLoader; + protected logger: ILogger; + protected bundleLoader: BundleLoader; constructor(logger: ILogger, bundleLoader: BundleLoader); serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; canHandle(route: string): boolean; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/ImageSerializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/ImageSerializer.d.ts index 29340d0..0e040d4 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/ImageSerializer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/ImageSerializer.d.ts @@ -2,7 +2,7 @@ import { IHttpServer } from "../../models/spt/server/IHttpServer"; import { Serializer } from "../../di/Serializer"; import { ImageRouter } from "../ImageRouter"; export declare class ImageSerializer extends Serializer { - private imageRouter; + protected imageRouter: ImageRouter; constructor(imageRouter: ImageRouter); serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; canHandle(route: string): boolean; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/NotifySerializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/NotifySerializer.d.ts index 8be8ac2..1779ac9 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/NotifySerializer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/serializers/NotifySerializer.d.ts @@ -3,9 +3,9 @@ import { Serializer } from "../../di/Serializer"; import { HttpServerHelper } from "../../helpers/HttpServerHelper"; import { IHttpServer } from "../../models/spt/server/IHttpServer"; export declare class NotifySerializer extends Serializer { - private notifierController; - private httpServerHelper; + protected notifierController: NotifierController; + protected httpServerHelper: HttpServerHelper; constructor(notifierController: NotifierController, httpServerHelper: HttpServerHelper); - serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + serialize(_sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; canHandle(route: string): boolean; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/BotStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/BotStaticRouter.d.ts index d8b0bf4..aeea220 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/BotStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/BotStaticRouter.d.ts @@ -1,6 +1,6 @@ import { BotCallbacks } from "../../callbacks/BotCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class BotStaticRouter extends StaticRouter { - private botCallbacks; + protected botCallbacks: BotCallbacks; constructor(botCallbacks: BotCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/BundleStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/BundleStaticRouter.d.ts index 3905b82..fb682fc 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/BundleStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/BundleStaticRouter.d.ts @@ -1,6 +1,6 @@ import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class BundleStaticRouter extends StaticRouter { - private bundleCallbacks; + protected bundleCallbacks: BundleCallbacks; constructor(bundleCallbacks: BundleCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/CustomizationStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/CustomizationStaticRouter.d.ts index 46c71b8..21bc4bb 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/CustomizationStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/CustomizationStaticRouter.d.ts @@ -1,6 +1,6 @@ import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class CustomizationStaticRouter extends StaticRouter { - private customizationCallbacks; + protected customizationCallbacks: CustomizationCallbacks; constructor(customizationCallbacks: CustomizationCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/DataStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/DataStaticRouter.d.ts index a493d3a..84ba7fd 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/DataStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/DataStaticRouter.d.ts @@ -1,6 +1,6 @@ import { DataCallbacks } from "../../callbacks/DataCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class DataStaticRouter extends StaticRouter { - private dataCallbacks; + protected dataCallbacks: DataCallbacks; constructor(dataCallbacks: DataCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/DialogStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/DialogStaticRouter.d.ts index a59fb14..546cdf1 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/DialogStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/DialogStaticRouter.d.ts @@ -1,6 +1,6 @@ import { DialogueCallbacks } from "../../callbacks/DialogueCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class DialogStaticRouter extends StaticRouter { - private dialogueCallbacks; + protected dialogueCallbacks: DialogueCallbacks; constructor(dialogueCallbacks: DialogueCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/GameStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/GameStaticRouter.d.ts index 988b673..a9a7496 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/GameStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/GameStaticRouter.d.ts @@ -1,6 +1,6 @@ import { GameCallbacks } from "../../callbacks/GameCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class GameStaticRouter extends StaticRouter { - private gameCallbacks; + protected gameCallbacks: GameCallbacks; constructor(gameCallbacks: GameCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/HealthStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/HealthStaticRouter.d.ts index e644861..863fd5e 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/HealthStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/HealthStaticRouter.d.ts @@ -1,6 +1,6 @@ import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class HealthStaticRouter extends StaticRouter { - private healthCallbacks; + protected healthCallbacks: HealthCallbacks; constructor(healthCallbacks: HealthCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/InraidStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/InraidStaticRouter.d.ts index 66ed860..b29ad23 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/InraidStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/InraidStaticRouter.d.ts @@ -1,6 +1,6 @@ import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class InraidStaticRouter extends StaticRouter { - private inraidCallbacks; + protected inraidCallbacks: InraidCallbacks; constructor(inraidCallbacks: InraidCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/InsuranceStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/InsuranceStaticRouter.d.ts index 8da26b3..5676499 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/InsuranceStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/InsuranceStaticRouter.d.ts @@ -1,6 +1,6 @@ import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class InsuranceStaticRouter extends StaticRouter { - private insuranceCallbacks; + protected insuranceCallbacks: InsuranceCallbacks; constructor(insuranceCallbacks: InsuranceCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/ItemEventStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/ItemEventStaticRouter.d.ts index 08ba6bb..c30a7fc 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/ItemEventStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/ItemEventStaticRouter.d.ts @@ -1,6 +1,6 @@ import { ItemEventCallbacks } from "../../callbacks/ItemEventCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class ItemEventStaticRouter extends StaticRouter { - private itemEventCallbacks; + protected itemEventCallbacks: ItemEventCallbacks; constructor(itemEventCallbacks: ItemEventCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/LauncherStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/LauncherStaticRouter.d.ts index 9d07f78..0040cbd 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/LauncherStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/LauncherStaticRouter.d.ts @@ -1,6 +1,6 @@ import { LauncherCallbacks } from "../../callbacks/LauncherCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class LauncherStaticRouter extends StaticRouter { - private launcherCallbacks; + protected launcherCallbacks: LauncherCallbacks; constructor(launcherCallbacks: LauncherCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/LocationStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/LocationStaticRouter.d.ts index 9c5c52e..b6de956 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/LocationStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/LocationStaticRouter.d.ts @@ -1,6 +1,6 @@ import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class LocationStaticRouter extends StaticRouter { - private locationCallbacks; + protected locationCallbacks: LocationCallbacks; constructor(locationCallbacks: LocationCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/MatchStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/MatchStaticRouter.d.ts index d746381..9920a92 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/MatchStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/MatchStaticRouter.d.ts @@ -1,6 +1,6 @@ import { MatchCallbacks } from "../../callbacks/MatchCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class MatchStaticRouter extends StaticRouter { - private matchCallbacks; + protected matchCallbacks: MatchCallbacks; constructor(matchCallbacks: MatchCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/NotifierStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/NotifierStaticRouter.d.ts index 1c8566d..8f1f5cc 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/NotifierStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/NotifierStaticRouter.d.ts @@ -1,6 +1,6 @@ import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class NotifierStaticRouter extends StaticRouter { - private notifierCallbacks; + protected notifierCallbacks: NotifierCallbacks; constructor(notifierCallbacks: NotifierCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/PresetStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/PresetStaticRouter.d.ts index 2272f82..a9e7458 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/PresetStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/PresetStaticRouter.d.ts @@ -1,6 +1,6 @@ import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class PresetStaticRouter extends StaticRouter { - private presetCallbacks; + protected presetCallbacks: PresetBuildCallbacks; constructor(presetCallbacks: PresetBuildCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/ProfileStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/ProfileStaticRouter.d.ts index fd787f1..83403f2 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/ProfileStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/ProfileStaticRouter.d.ts @@ -1,6 +1,6 @@ import { ProfileCallbacks } from "../../callbacks/ProfileCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class ProfileStaticRouter extends StaticRouter { - private profileCallbacks; + protected profileCallbacks: ProfileCallbacks; constructor(profileCallbacks: ProfileCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/QuestStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/QuestStaticRouter.d.ts index fda3c23..8f7ca0a 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/QuestStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/QuestStaticRouter.d.ts @@ -1,6 +1,6 @@ import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class QuestStaticRouter extends StaticRouter { - private questCallbacks; + protected questCallbacks: QuestCallbacks; constructor(questCallbacks: QuestCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/RagfairStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/RagfairStaticRouter.d.ts index 618374f..6c41467 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/RagfairStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/RagfairStaticRouter.d.ts @@ -1,6 +1,6 @@ import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class RagfairStaticRouter extends StaticRouter { - private ragfairCallbacks; + protected ragfairCallbacks: RagfairCallbacks; constructor(ragfairCallbacks: RagfairCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/TraderStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/TraderStaticRouter.d.ts index 18f0629..41728a1 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/TraderStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/TraderStaticRouter.d.ts @@ -1,6 +1,6 @@ import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class TraderStaticRouter extends StaticRouter { - private traderCallbacks; + protected traderCallbacks: TraderCallbacks; constructor(traderCallbacks: TraderCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/WeatherStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/WeatherStaticRouter.d.ts index 61b904d..72ed851 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/WeatherStaticRouter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/routers/static/WeatherStaticRouter.d.ts @@ -1,6 +1,6 @@ import { WeatherCallbacks } from "../../callbacks/WeatherCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class WeatherStaticRouter extends StaticRouter { - private weatherCallbacks; + protected weatherCallbacks: WeatherCallbacks; constructor(weatherCallbacks: WeatherCallbacks); } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/ConfigServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/ConfigServer.d.ts index 9c2e114..a079be8 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/ConfigServer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/ConfigServer.d.ts @@ -1,30 +1,14 @@ import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigTypes } from "../models/enums/ConfigTypes"; export declare class ConfigServer { - private logger; - private vfs; - private jsonUtil; - private configs; + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected configs: Record; constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil); getConfig(configType: ConfigTypes): T; + getConfigByString(configType: string): T; initialize(): void; } -export declare const enum ConfigTypes { - AIRDROP = "aki-airdrop", - BOT = "aki-bot", - CORE = "aki-core", - HEALTH = "aki-health", - HIDEOUT = "aki-hideout", - HTTP = "aki-http", - IN_RAID = "aki-inraid", - INSURANCE = "aki-insurance", - INVENTORY = "aki-inventory", - LOCATION = "aki-location", - MATCH = "aki-match", - QUEST = "aki-quest", - RAGFAIR = "aki-ragfair", - REPAIR = "aki-repair", - TRADER = "aki-trader", - WEATHER = "aki-weather" -} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/DatabaseServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/DatabaseServer.d.ts index 521bcf9..aa152d0 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/DatabaseServer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/DatabaseServer.d.ts @@ -1,6 +1,6 @@ import { IDatabaseTables } from "../models/spt/server/IDatabaseTables"; export declare class DatabaseServer { - private tableData; + protected tableData: IDatabaseTables; getTables(): IDatabaseTables; setTables(any: any): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/HttpServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/HttpServer.d.ts index d0db7e4..5234966 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/HttpServer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/HttpServer.d.ts @@ -1,9 +1,11 @@ /// +/// import http, { ServerResponse } from "http"; import { Serializer } from "../di/Serializer"; import { HttpServerHelper } from "../helpers/HttpServerHelper"; import { NotifierHelper } from "../helpers/NotifierHelper"; import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { ILogger } from "../models/spt/utils/ILogger"; import { HttpRouter } from "../routers/HttpRouter"; @@ -13,24 +15,24 @@ import { RandomUtil } from "../utils/RandomUtil"; import { ConfigServer } from "./ConfigServer"; import { DatabaseServer } from "./DatabaseServer"; export declare class HttpServer implements IHttpServer { - private httpRouter; - private logger; - private randomUtil; - private jsonUtil; - private httpResponse; - private databaseServer; - private notifierHelper; - private httpServerHelper; - private serializers; - private configServer; + protected httpRouter: HttpRouter; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected serializers: Serializer[]; + protected configServer: ConfigServer; constructor(httpRouter: HttpRouter, // TODO: delay required logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, serializers: Serializer[], configServer: ConfigServer); - private buffers; - private onReceive; - private onRespond; - private httpConfig; - private webSockets; - private websocketPingHandler; + protected buffers: {}; + protected onReceive: {}; + protected onRespond: {}; + protected httpConfig: IHttpConfig; + protected webSockets: {}; + protected websocketPingHandler: any; getCookies(req: http.IncomingMessage): any; resetBuffer(sessionID: string): void; putInBuffer(sessionID: any, data: any, bufLength: number): boolean; @@ -42,6 +44,6 @@ export declare class HttpServer implements IHttpServer { sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; handleRequest(req: http.IncomingMessage, resp: http.ServerResponse): void; load(): void; - private getRandomisedMessage; + protected getRandomisedMessage(): string; wsOnConnection(ws: any, req: any): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/RagfairServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/RagfairServer.d.ts index d103625..60c92b5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/RagfairServer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/RagfairServer.d.ts @@ -1,38 +1,22 @@ -import { HttpResponseUtil } from "../utils/HttpResponseUtil"; -import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; -import { ProfileHelper } from "../helpers/ProfileHelper"; import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; -import { SaveServer } from "./SaveServer"; -import { RagfairPriceService } from "../services/RagfairPriceService"; -import { RagfairOfferService } from "../services/RagfairOfferService"; -import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; -import { RagfairLinkedItemService } from "../services/RagfairLinkedItemService"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; -import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ConfigServer } from "./ConfigServer"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { ConfigServer } from "./ConfigServer"; export declare class RagfairServer { - private logger; - private ragfairOfferGenerator; - private ragfairServerHelper; - private profileHelper; - private itemEventRouter; - private httpResponse; - private saveServer; - private ragfairPriceService; - private ragfairOfferService; - private ragfairLinkedItemService; - private ragfairCategoriesService; - private ragfairRequiredItemsService; - private configServer; - private ragfairConfig; - constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, saveServer: SaveServer, ragfairPriceService: RagfairPriceService, ragfairOfferService: RagfairOfferService, ragfairLinkedItemService: RagfairLinkedItemService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); + protected logger: ILogger; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairCategoriesService: RagfairCategoriesService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairOfferService: RagfairOfferService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); load(): void; update(): void; - private processExpiredOffer; - returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; getCategories(): Record; /** * Disable/Hide an offer from flea @@ -40,6 +24,7 @@ export declare class RagfairServer { */ hideOffer(offerId: string): void; getOffer(offerID: string): IRagfairOffer; + getOffers(): IRagfairOffer[]; removeOfferStack(offerID: string, amount: number): void; doesOfferExist(offerId: string): boolean; addPlayerOffers(): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/SaveServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/SaveServer.d.ts index fdf92e4..cb28f49 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/SaveServer.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/servers/SaveServer.d.ts @@ -5,15 +5,15 @@ import { VFS } from "../utils/VFS"; import { SaveLoadRouter } from "../di/Router"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class SaveServer { - private vfs; - private saveLoadRouters; - private jsonUtil; - private hashUtil; - private logger; - private profileFilepath; - private profiles; - private onSave; - private saveMd5; + protected vfs: VFS; + protected saveLoadRouters: SaveLoadRouter[]; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected profileFilepath: string; + protected profiles: {}; + protected onSave: {}; + protected saveMd5: {}; constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger); load(): void; save(): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/FenceService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/FenceService.d.ts index eef87b3..12723fb 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/FenceService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/FenceService.d.ts @@ -1,29 +1,30 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { HandbookHelper } from "../helpers/HandbookHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { PresetHelper } from "../helpers/PresetHelper"; import { FenceLevel } from "../models/eft/common/IGlobals"; import { IPmcData } from "../models/eft/common/IPmcData"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class FenceService { - private logger; - private hashUtil; - private jsonUtil; - private randomUtil; - private databaseServer; - private handbookHelper; - private itemHelper; - private presetHelper; - private configServer; - private fenceAssort; - private traderConfig; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected fenceAssort: ITraderAssort; + protected traderConfig: ITraderConfig; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, presetHelper: PresetHelper, configServer: ConfigServer); - private setFenceAssort; + protected setFenceAssort(fenceAssort: ITraderAssort): void; getFenceAssorts(): ITraderAssort; hasExpiredCache(refreshAssort: boolean): boolean; generateFenceAssortCache(pmcData: IPmcData): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/HashCacheService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/HashCacheService.d.ts index c9b0170..5320f28 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/HashCacheService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/HashCacheService.d.ts @@ -3,13 +3,13 @@ import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; export declare class HashCacheService { - private vfs; - private hashUtil; - private jsonUtil; - private logger; - private jsonHashes; - private modHashes; - private readonly modCachePath; + protected vfs: VFS; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected jsonHashes: any; + protected modHashes: any; + protected readonly modCachePath = "./user/cache/modCache.json"; constructor(vfs: VFS, hashUtil: HashUtil, jsonUtil: JsonUtil, logger: ILogger); getStoredModHash(modName: string): string; modContentMatchesStoredHash(modName: string, modContent: string): boolean; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/InsuranceService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/InsuranceService.d.ts index 160faba..0219816 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/InsuranceService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/InsuranceService.d.ts @@ -4,6 +4,7 @@ import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; import { Item } from "../models/eft/common/tables/IItem"; import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -11,18 +12,18 @@ import { SaveServer } from "../servers/SaveServer"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class InsuranceService { - private logger; - private databaseServer; - private secureContainerHelper; - private randomUtil; - private timeUtil; - private saveServer; - private traderHelper; - private dialogueHelper; - private configServer; - private insured; - private templatesById; - private insuranceConfig; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected secureContainerHelper: SecureContainerHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected traderHelper: TraderHelper; + protected dialogueHelper: DialogueHelper; + protected configServer: ConfigServer; + protected insured: Record>; + protected templatesById: {}; + protected insuranceConfig: IInsuranceConfig; constructor(logger: ILogger, databaseServer: DatabaseServer, secureContainerHelper: SecureContainerHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, saveServer: SaveServer, traderHelper: TraderHelper, dialogueHelper: DialogueHelper, configServer: ConfigServer); insuranceExists(sessionId: string): boolean; insuranceTraderArrayExists(sessionId: string, traderId: string): boolean; @@ -36,6 +37,6 @@ export declare class InsuranceService { sendInsuredItems(pmcData: IPmcData, sessionID: string): void; storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; - private addGearToSend; + protected addGearToSend(pmcData: IPmcData, insuredItem: any, actualItem: any, sessionID: string): any; getPremium(pmcData: IPmcData, inventoryItem: Item, traderId: string): number; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/MatchLocationService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/MatchLocationService.d.ts index f7b7d3b..2b5fc0e 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/MatchLocationService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/MatchLocationService.d.ts @@ -1,7 +1,7 @@ import { TimeUtil } from "../utils/TimeUtil"; export declare class MatchLocationService { - private timeUtil; - private locations; + protected timeUtil: TimeUtil; + protected locations: {}; constructor(timeUtil: TimeUtil); createGroup(sessionID: string, info: any): any; deleteGroup(info: any): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/ModCompilerService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/ModCompilerService.d.ts index d316e48..26cb4ac 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/ModCompilerService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/ModCompilerService.d.ts @@ -1,13 +1,20 @@ +import * as ts from "typescript"; import { ILogger } from "../models/spt/utils/ILogger"; import { VFS } from "../utils/VFS"; import { HashCacheService } from "./HashCacheService"; export declare class ModCompilerService { - private logger; - private hashCacheService; - private vfs; + protected logger: ILogger; + protected hashCacheService: HashCacheService; + protected vfs: VFS; constructor(logger: ILogger, hashCacheService: HashCacheService, vfs: VFS); - compileMod(modName: string, path: string, modTypeScriptFiles: string[]): Promise; - private compile; - private areFilesReady; - private delay; + compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise; + protected compile(fileNames: string[], options: ts.CompilerOptions): Promise; + protected buildDepth(depth: number): string; + protected getNodesModulesPath(depth: number): string; + protected getAkiPath(depth: number): string; + protected getAkiFolder(): string; + protected getNodesModulesFolder(): string; + protected calculateDepth(file: string): number; + protected areFilesReady(fileNames: string[]): boolean; + protected delay(ms: number): Promise; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/NotificationService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/NotificationService.d.ts index 9c6c143..7e2a127 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/NotificationService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/NotificationService.d.ts @@ -1,6 +1,6 @@ import { INotification } from "../models/eft/notifier/INotifier"; export declare class NotificationService { - private messageQueue; + protected messageQueue: {}; getMessageQueue(): {}; getMessageFromQueue(sessionId: string): any; updateMessageOnQueue(sessionId: string, value: any[]): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/PaymentService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/PaymentService.d.ts index 0a6c4d6..5834750 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/PaymentService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/PaymentService.d.ts @@ -4,6 +4,7 @@ import { ItemHelper } from "../helpers/ItemHelper"; import { PaymentHelper } from "../helpers/PaymentHelper"; import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; @@ -11,14 +12,14 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class PaymentService { - private logger; - private httpResponse; - private databaseServer; - private handbookHelper; - private traderHelper; - private itemHelper; - private inventoryHelper; - private paymentHelper; + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); /** * Take money and insert items into return to server request @@ -43,6 +44,6 @@ export declare class PaymentService { * inside the stash, that is it has the stash as * ancestor with slotId=hideout */ - private isItemInStash; + protected isItemInStash(pmcData: IPmcData, item: Item): boolean; addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/PlayerService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/PlayerService.d.ts index 99e5986..519b7e5 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/PlayerService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/PlayerService.d.ts @@ -3,8 +3,8 @@ import { IPlayerIncrementSkillLevelRequestData } from "../models/eft/player/IPla import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class PlayerService { - private logger; - private databaseServer; + protected logger: ILogger; + protected databaseServer: DatabaseServer; constructor(logger: ILogger, databaseServer: DatabaseServer); /** * increases the profile skill and updates any output diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairCategoriesService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairCategoriesService.d.ts index fb9efa2..09956cc 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairCategoriesService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairCategoriesService.d.ts @@ -1,7 +1,7 @@ import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; export declare class RagfairCategoriesService { updateCategories(offers: IRagfairOffer[]): void; - private categories; + protected categories: Record; getCategories(): Record; getCategoryByItemId(itemId: string): number; resetCategories(): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairLinkedItemService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairLinkedItemService.d.ts index d5dc58e..6c34ee0 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairLinkedItemService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairLinkedItemService.d.ts @@ -1,9 +1,10 @@ import { DatabaseServer } from "../servers/DatabaseServer"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; export declare class RagfairLinkedItemService { - private databaseServer; - private linkedItemsCache; + protected databaseServer: DatabaseServer; + protected linkedItemsCache: Record>; constructor(databaseServer: DatabaseServer); getLinkedItems(linkedSearchId: string): Iterable; - buildLinkedItemTable(): void; - private getFilters; + protected buildLinkedItemTable(): void; + protected getFilters(item: ITemplateItem, slot: string): string[]; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairOfferService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairOfferService.d.ts index 4e4ae26..7afbf8c 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairOfferService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairOfferService.d.ts @@ -1,20 +1,32 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { Item } from "../models/eft/common/tables/IItem"; -import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; export declare class RagfairOfferService { - private timeUtil; - private databaseServer; - private saveServer; - private configServer; - private playerOffersLoaded; - private toUpdate; - private expiredOffers; - private offers; - private ragfairConfig; - constructor(timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, configServer: ConfigServer); + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected ragfairServerHelper: RagfairServerHelper; + protected profileHelper: ProfileHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected playerOffersLoaded: boolean; + protected toUpdate: Record; + protected expiredOffers: Item[]; + protected offers: IRagfairOffer[]; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, configServer: ConfigServer); getOffers(): IRagfairOffer[]; getOfferByOfferId(offerId: string): IRagfairOffer; getOffersOfType(templateId: string): IRagfairOffer[]; @@ -22,20 +34,13 @@ export declare class RagfairOfferService { addOfferToExpired(offer: Item): void; setTraderUpdateStatus(traderId: string, shouldUpdate: boolean): void; shouldTraderBeUpdated(traderID: string): boolean; - /** - * Get an array of expired offers that are still shown to player - * @returns IRagfairOffer array - */ - getExpiredActiveOffers(): IRagfairOffer[]; getExpiredOfferCount(): number; - getOfferIndexByOfferId(offerId: string): number; /** * Get an array of expired items not yet processed into new offers * @returns items that need to be turned into offers */ getExpiredOffers(): Item[]; resetExpiredOffers(): void; - private isExpired; /** * Does the offer exist on the ragfair * @param offerId offer id to check for @@ -44,9 +49,18 @@ export declare class RagfairOfferService { doesOfferExist(offerId: string): boolean; getTraders(): Record; flagTraderForUpdate(expiredOfferUserId: string): void; - removeOffer(globalOfferIndex: number, countToRemove: number): void; + removeOfferById(offerId: string): void; removeOfferStack(offerID: string, amount: number): void; removeAllOffersByTrader(traderId: string): void; addTradersToUpdateList(): void; addPlayerOffers(): void; + expireStaleOffers(): void; + /** + * Get an array of stale offers that are still shown to player + * @returns IRagfairOffer array + */ + protected getStaleOffers(): IRagfairOffer[]; + protected isStale(offer: IRagfairOffer, time: number): boolean; + protected processStaleOffer(staleOffer: IRagfairOffer): void; + protected returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairPriceService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairPriceService.d.ts index 7cc42f9..5256b99 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairPriceService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairPriceService.d.ts @@ -1,22 +1,24 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; import { HandbookHelper } from "../helpers/HandbookHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { PresetHelper } from "../helpers/PresetHelper"; import { Item } from "../models/eft/common/tables/IItem"; import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { IRagfairServerPrices } from "../models/spt/ragfair/IRagfairServerPrices"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RandomUtil } from "../utils/RandomUtil"; export declare class RagfairPriceService { - private handbookHelper; - private databaseServer; - private logger; - private itemHelper; - private presetHelper; - private randomUtil; - private configServer; - private ragfairConfig; - private prices; + protected handbookHelper: HandbookHelper; + protected databaseServer: DatabaseServer; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected prices: IRagfairServerPrices; constructor(handbookHelper: HandbookHelper, databaseServer: DatabaseServer, logger: ILogger, itemHelper: ItemHelper, presetHelper: PresetHelper, randomUtil: RandomUtil, configServer: ConfigServer); generateStaticPrices(): void; generateDynamicPrices(): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairRequiredItemsService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairRequiredItemsService.d.ts index e4582d0..b05fc65 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairRequiredItemsService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/RagfairRequiredItemsService.d.ts @@ -2,10 +2,10 @@ import { PaymentHelper } from "../helpers/PaymentHelper"; import { RagfairOfferService } from "../services/RagfairOfferService"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class RagfairRequiredItemsService { - private logger; - private paymentHelper; - private ragfairOfferService; - private requiredItemsCache; + protected logger: ILogger; + protected paymentHelper: PaymentHelper; + protected ragfairOfferService: RagfairOfferService; + protected requiredItemsCache: {}; constructor(logger: ILogger, paymentHelper: PaymentHelper, ragfairOfferService: RagfairOfferService); getRequiredItems(searchId: string): any; buildRequiredItemTable(): void; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/TraderAssortService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/TraderAssortService.d.ts index ccb9e45..5ba2d05 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/TraderAssortService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/TraderAssortService.d.ts @@ -1,6 +1,6 @@ import { ITraderAssort } from "../models/eft/common/tables/ITrader"; export declare class TraderAssortService { - private pristineTraderAssorts; + protected pristineTraderAssorts: Record; getPristineTraderAssort(traderId: string): ITraderAssort; setPristineTraderAssort(traderId: string, assort: ITraderAssort): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/image/imageRouteService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/image/imageRouteService.d.ts new file mode 100644 index 0000000..29569b2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/image/imageRouteService.d.ts @@ -0,0 +1,6 @@ +export declare class ImageRouteService { + protected routes: Record; + addRoute(urlKey: string, route: string): void; + getByKey(urlKey: string): string; + existsByKey(urlKey: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/onLoad/OnLoadModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/onLoad/OnLoadModService.d.ts index 89bad14..f402103 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/onLoad/OnLoadModService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/onLoad/OnLoadModService.d.ts @@ -1,6 +1,6 @@ import { DependencyContainer } from "tsyringe"; export declare class OnLoadModService { - private container; + protected container: DependencyContainer; constructor(container: DependencyContainer); registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/onUpdate/OnUpdateModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/onUpdate/OnUpdateModService.d.ts index 32419f4..05d735b 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/onUpdate/OnUpdateModService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/onUpdate/OnUpdateModService.d.ts @@ -1,6 +1,6 @@ import { DependencyContainer } from "tsyringe"; export declare class OnUpdateModService { - private container; + protected container: DependencyContainer; constructor(container: DependencyContainer); registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/staticRouter/StaticRouterModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/staticRouter/StaticRouterModService.d.ts index d4c42aa..f28fd45 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/staticRouter/StaticRouterModService.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/services/mod/staticRouter/StaticRouterModService.d.ts @@ -1,7 +1,7 @@ import { DependencyContainer } from "tsyringe"; import { RouteAction } from "../../../di/Router"; export declare class StaticRouterModService { - private container; + protected container: DependencyContainer; constructor(container: DependencyContainer); registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/App.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/App.d.ts index a11f576..34c141e 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/App.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/App.d.ts @@ -3,12 +3,12 @@ import { OnLoad } from "../di/OnLoad"; import { OnUpdate } from "../di/OnUpdate"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class App { - private logger; - private timeUtil; - private onLoadComponents; - private onUpdateComponents; - private onUpdateLastRun; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected onLoadComponents: OnLoad[]; + protected onUpdateComponents: OnUpdate[]; + protected onUpdateLastRun: {}; constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]); load(): void; - private update; + protected update(onUpdateComponents: OnUpdate[]): void; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/AyncQueue.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/AyncQueue.d.ts index a99aa37..da6ab18 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/AyncQueue.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/AyncQueue.d.ts @@ -1,7 +1,7 @@ import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; import { ICommand } from "../models/spt/utils/ICommand"; export declare class AsyncQueue implements IAsyncQueue { - private commandsQueue; + protected commandsQueue: ICommand[]; constructor(); waitFor(command: ICommand): Promise; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/DatabaseImporter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/DatabaseImporter.d.ts index 97dda30..0857b67 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/DatabaseImporter.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/DatabaseImporter.d.ts @@ -5,11 +5,11 @@ import { ImageRouter } from "../routers/ImageRouter"; import { OnLoad } from "../di/OnLoad"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class DatabaseImporter extends OnLoad { - private logger; - private vfs; - private jsonUtil; - private databaseServer; - private imageRouter; + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected imageRouter: ImageRouter; constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter); onLoad(): void; getRoute(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/HashUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/HashUtil.d.ts index cf92b47..bacbf2a 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/HashUtil.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/HashUtil.d.ts @@ -2,7 +2,7 @@ import crypto from "crypto"; import { TimeUtil } from "./TimeUtil"; export declare class HashUtil { - private timeUtil; + protected timeUtil: TimeUtil; constructor(timeUtil: TimeUtil); generate(): string; generateMd5ForData(data: string): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/HttpResponseUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/HttpResponseUtil.d.ts index 85c28bd..29502be 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/HttpResponseUtil.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/HttpResponseUtil.d.ts @@ -3,9 +3,9 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; export declare class HttpResponseUtil { - private jsonUtil; + protected jsonUtil: JsonUtil; constructor(jsonUtil: JsonUtil); - private clearString; + protected clearString(s: string): any; noBody(data: any): any; getBody(data: T, err?: number, errmsg?: any): IGetBodyResponseData; getUnclearedBody(data: any, err?: number, errmsg?: any): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/JsonUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/JsonUtil.d.ts index 20b7448..71e95f6 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/JsonUtil.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/JsonUtil.d.ts @@ -2,10 +2,10 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { HashUtil } from "./HashUtil"; import { VFS } from "./VFS"; export declare class JsonUtil { - private vfs; - private hashUtil; - private logger; - private fileHashes; + protected vfs: VFS; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected fileHashes: any; constructor(vfs: VFS, hashUtil: HashUtil, logger: ILogger); /** * From object to string diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/Logger.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/Logger.d.ts index 9d5b32a..f5b774b 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/Logger.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/Logger.d.ts @@ -1,18 +1,43 @@ /// import { Daum } from "../models/eft/itemEvent/IItemEventRouterRequest"; import { ILogger } from "../models/spt/utils/ILogger"; +import winston from "winston"; import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; import fs from "fs"; +interface SptLogger { + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} export declare class WinstonLogger implements ILogger { - private asyncQueue; - private uuidGenerator; - private showDebugInConsole; - private folderPath; - private file; - private filePath; - private logLevels; - private logger; + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + protected showDebugInConsole: boolean; + protected folderPath: string; + protected file: string; + protected filePath: string; + protected logLevels: { + levels: { + error: number; + warn: number; + succ: number; + info: number; + custom: number; + debug: number; + }; + colors: { + error: string; + warn: string; + succ: string; + info: string; + custom: string; + debug: string; + }; + }; + protected logger: winston.Logger & SptLogger; writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); writeToLogFile(data: string | Daum): Promise; @@ -23,3 +48,4 @@ export declare class WinstonLogger implements ILogger { info(data: string | Record): Promise; debug(data: string | Record, onlyShowInConsole?: boolean): Promise; } +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/ObjectId.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/ObjectId.d.ts index b100572..03aae56 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/ObjectId.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/ObjectId.d.ts @@ -1,13 +1,13 @@ /// import { TimeUtil } from "./TimeUtil"; export declare class ObjectId { - private timeUtil; + protected timeUtil: TimeUtil; constructor(timeUtil: TimeUtil); - private randomBytes; - private constglobalCounter; - private consttime; - private globalCounter; - private time; + protected randomBytes: Buffer; + protected constglobalCounter: number; + protected consttime: number; + protected globalCounter: number; + protected time: number; incGlobalCounter(): number; toHexString(byteArray: string | any[] | Buffer): string; generate(): string; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/RandomUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/RandomUtil.d.ts index 3a3ecb6..c24dd60 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/RandomUtil.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/RandomUtil.d.ts @@ -103,8 +103,8 @@ export declare class ProbabilityObject { constructor(key: K, relativeProbability: number, data?: V); } export declare class RandomUtil { - private jsonUtil; - private logger; + protected jsonUtil: JsonUtil; + protected logger: ILogger; constructor(jsonUtil: JsonUtil, logger: ILogger); getInt(min: number, max: number): number; getIntEx(max: number): number; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/VFS.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/VFS.d.ts index b064cf4..e5eaf02 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/VFS.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/VFS.d.ts @@ -1,11 +1,12 @@ /// +/// import "reflect-metadata"; import fs from "fs"; import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; export declare class VFS { - private asyncQueue; - private uuidGenerator; + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { @@ -29,7 +30,7 @@ export declare class VFS { copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise; createDir(filepath: string): void; createDirAsync(filepath: string): Promise; - copyDir(filepath: string, target: string, fileExtensions: string | string[]): void; + copyDir(filepath: string, target: string, fileExtensions?: string | string[]): void; copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise; readFile(filepath: string): any; readFileAsync(filepath: string): Promise; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/Watermark.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/Watermark.d.ts index e7b9883..111bdd0 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/Watermark.d.ts +++ b/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/types/utils/Watermark.d.ts @@ -1,19 +1,32 @@ -import { ConfigServer } from "../servers/ConfigServer"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; export declare class WatermarkLocale { - private locales; + protected locales: { + "en-US": { + description: string[]; + warning: string[]; + modding: string[]; + }; + "zh-CN": { + description: string[]; + warning: string[]; + modding: string[]; + }; + }; getLocale(): string; getDescription(): string[]; getWarning(): string[]; + getModding(): string[]; } export declare class Watermark { - private logger; - private configServer; - private watermarkLocale?; - private akiConfig; + protected logger: ILogger; + protected configServer: ConfigServer; + protected watermarkLocale?: WatermarkLocale; + protected akiConfig: ICoreConfig; constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale); - private text; - private versionLabel; + protected text: string[]; + protected versionLabel: string; initialize(): void; getVersionTag(): string; getVersionLabel(): string; @@ -24,5 +37,5 @@ export declare class Watermark { /** Draw the watermark */ draw(): void; /** Caculate text length */ - private textLength; + protected textLength(s: string): number; } diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/client/CachedAttributesPatch.cs b/Faupi-MunitionsExpert/MunitionsExpert/src/client/CachedAttributesPatch.cs index 53acac6..95615a4 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/src/client/CachedAttributesPatch.cs +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/client/CachedAttributesPatch.cs @@ -3,7 +3,7 @@ using EFT.InventoryLogic; using System.Collections.Generic; using System.Linq; using System.Reflection; -using ItemAttributes = GClass2098; +using ItemAttributes = GClass2100; namespace MunitionsExpert { diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/client/MunitionsExpert.cs b/Faupi-MunitionsExpert/MunitionsExpert/src/client/MunitionsExpert.cs index fd6a700..9df0a55 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/src/client/MunitionsExpert.cs +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/client/MunitionsExpert.cs @@ -8,10 +8,9 @@ using System.Threading.Tasks; using BepInEx; using Comfort.Common; -using ItemAttribute = GClass2098; -using ItemAttributeCharacteristic = BulletClass; // left in as commented code uses this class +using ItemAttribute = GClass2100; using static MunitionsExpert.Attributes; -using ServerSettings = GClass1085; +using ServerSettings = GClass1087; namespace MunitionsExpert @@ -118,7 +117,7 @@ namespace MunitionsExpert int ratedClass = 0; if (!Singleton.Instantiated) { return $"CLASS_DATA_MISSING {template.PenetrationPower.ToString()}"; } - ServerSettings.GClass1132.GClass1133[] classes = Singleton.Instance.Armor.ArmorClass; + ServerSettings.GClass1134.GClass1135[] classes = Singleton.Instance.Armor.ArmorClass; for (int i = 0; i < classes.Length; i++) { if (classes[i].Resistance > template.PenetrationPower) continue; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/.eslintignore b/Faupi-MunitionsExpert/MunitionsExpert/src/server/.eslintignore new file mode 100644 index 0000000..9922d9a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/.eslintignore @@ -0,0 +1,9 @@ +# Exclude these folders from linting +node_modules +dist/ +types/ + +# Exclude these filetypes from linting +*.json +*.txt +*.exe \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/.eslintrc.json b/Faupi-MunitionsExpert/MunitionsExpert/src/server/.eslintrc.json new file mode 100644 index 0000000..c505160 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/.eslintrc.json @@ -0,0 +1,75 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-unused-vars": 1, + "@typescript-eslint/no-empty-interface": 0, + "@typescript-eslint/no-namespace": 0, + "@typescript-eslint/comma-dangle": 1, + "@typescript-eslint/func-call-spacing": 2, + "@typescript-eslint/quotes": 1, + "@typescript-eslint/brace-style": [ + "warn", + "allman" + ], + "@typescript-eslint/naming-convention": [ + "warn", + { + "selector": "default", + "format": ["camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "typeLike", + "format": ["PascalCase"] + }, + { + "selector": "objectLiteralProperty", + "format": ["PascalCase", "camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "typeProperty", + "format": ["PascalCase", "camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "enumMember", + "format": ["UPPER_CASE"] + } + ], + "@typescript-eslint/indent": [ + "warn", + 4 + ], + "@typescript-eslint/no-unused-expressions": [ + "warn", + { + "allowShortCircuit": false, + "allowTernary": false + } + ], + "@typescript-eslint/keyword-spacing": [ + "warn", + { + "before": true, + "after": true + } + ], + "@typescript-eslint/explicit-module-boundary-types": [ + "warn", + { + "allowArgumentsExplicitlyTypedAsAny": true + } + ] + } +} \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/LICENSE b/Faupi-MunitionsExpert/MunitionsExpert/src/server/LICENSE new file mode 100644 index 0000000..1dd0454 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/LICENSE @@ -0,0 +1,32 @@ +University of Illinois/NCSA Open Source License Copyright (c) 2021 Faupi. All rights reserved. + +Developed by: + +Faupi + +https://github.com/Faupi-SPTarkov/MunitionsExpert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +with the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimers in the documentation +and/or other materials provided with the distribution. + +* Neither the names of Faupi, nor the names of its contributors may be used +to endorse or promote products derived from this Software without specific prior +written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/ammostats.js b/Faupi-MunitionsExpert/MunitionsExpert/src/server/ammostats.js deleted file mode 100644 index f575caf..0000000 --- a/Faupi-MunitionsExpert/MunitionsExpert/src/server/ammostats.js +++ /dev/null @@ -1,64 +0,0 @@ -/* ammostats.js - * license: NCSA - * copyright: Faupi - * authors: - * - Faupi - */ - -"use strict"; -const path = require('path'); - -class AmmoStats { - constructor() { - this.mod = require("../package.json"); - this.translations = require("../res/translations.json"); - Logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); - - ModLoader.onLoad[this.mod.name] = this.init.bind(this); - } - - init(){ - this.hookRoutes(); - this.updateLocalization(); - } - - updateLocalization(){ - var globalLocale = DatabaseServer.tables.locales.global; - - for(let language in this.translations){ - if(!language in globalLocale) continue; - - let attrKvPair = this.translations[language]; - for(let attrKey in attrKvPair){ - let attrValue = attrKvPair[attrKey]; - - globalLocale[language].interface[attrKey] = attrValue; - } - } - } - - hookRoutes(){ - HttpRouter.onStaticRoute["/MunitionsExpert/GetInfo"] = { - MunitionsExpert: this.getModInfo.bind(this) - }; - } - - getModInfo(url, info, sessionID, output){ - var output = { - status: 1, - data: null - }; - - // Don't mind this pointless try catch - try{ - output.data = {...this.mod, ...{path: path.resolve(ModLoader.getModPath(this.mod.name))}}; - output.status = 0; - }catch(ex){ - throw ex; - } - - return JsonUtil.serialize(output); - } -} - -module.exports = new AmmoStats(); \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/package.json b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/package.json new file mode 100644 index 0000000..f9a5628 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/package.json @@ -0,0 +1,26 @@ +{ + "name": "MunitionsExpert", + "author": "Faupi", + "version": "1.4.1", + "license": "NCSA Open Source", + "main": "./src/MunitionsExpert.js", + "akiVersion": "2.3.1", + "updatedBy": "CWX", + "scripts": { + "setup:environment": "npm i", + "build:unzipped": "copyfiles -e \"./node_modules/**/*.*\" -e \"./dist/**/*.*\" -e \"./package-lock.json\" -e \"./tsconfig.json\" -e \"./README.txt\" -e \"./mod.code-workspace\" ./**/*.* ./dist", + "zip:files": "cd dist/ && bestzip ../mod.zip *", + "build:zip": "npm run clean:environment && npm run build:unzipped && npm run zip:files", + "clean:environment": "node -e \"require('fs').rm('mod.zip', ()=>{})\" && node -e \"require('fs').rmdir('./dist/',{recursive:true},()=>{})\"" + }, + "devDependencies": { + "@types/node": "^14.15.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "copyfiles": "2.4.1", + "eslint": "7.26.0", + "tsyringe": "4.6.0", + "typescript": "4.6.4", + "bestzip": "2.2.1" + } +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/res/armorDamage.png b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/res/armorDamage.png new file mode 100644 index 0000000000000000000000000000000000000000..70d5e40050dba64b28cfe022f12f64f20f67ab61 GIT binary patch literal 701 zcmV;u0z&Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T1P(e{@UAPcY!Jrh^{sD32#+BU&E(Fn17gb87;KGHV3sGEZr7qf1 zY_L)h1Q!-FR?;dpwbeF_Nhg^kQw#uxw9RoehiF`G3S_V#V*Fgrg@n+74A0pFVn+&SWNO-54jwz33E)TrM|vr}x%?#%RUD z(RL`pc35%t`jyN5OZmJJ5s~kUbt@&ea=Yu=UC(vD>b-G0!Ah9|bi{}Cs_zho{TBC=gDf<|357Qsv*R$49Sj+iHCAJE~yZTxG* j0MP*>3C)aeFw6P_)~nJ5EkW<900000NkvXXu0mjfCOPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ940&z)1K~y+Tt&?3y zQ*ju^&+P1bZql-dC|h<>(x?j~C>&3_f#%s#SfDBtO8|Va}Fcen0v11zd3juu^cEtz5wY#GB94ccEhrFpSeDhP76wv zDjA7{zq-!ae4c^ZU6#h?=J7Y9PcFDS`Y?7Gu%dh=jC!!E!ep|U_aCU+Sy@@5HyEn5 zTHPV!t9}FmTRAWk3UZtV5DEj+)Vinv0GpGd(zzMG2dF1uKeg7%bWOFRe z&Mju#-Mz1o-wpDnQdwN(6%YV^@SVA?^F2q7*3_C_jlA%uekZd#fo>U!B$=c^0U=Lpz6{?Tno%f}S(EitxIiqA+qdKTz>u@4#crJ#ADi@C?tPA2NEF3? znlP$C`QW{WuKEV6b^7zv#~ydbedOjrSd`1NCNN{A`6EvinkXQRO0AL4&P=~+Z?k)l zn*&^@psrN^3sEo_%3=s{P-H~0l}(@u90t{3JK(+915Sa?bM2kC5Dx<0ufN_M9%pVh z7kL%11)fy?KnGaGPr!SV1X)QYj5Lzk<8Bd30eD(B0Ge_K`IB5bg761_I=S8<$tpMi O0000 any; }; + private cfg: { BulletBackgroundColours: boolean; }; + + public load(container: DependencyContainer) + { + this.router = container.resolve("DynamicRouterModService"); + this.logger = container.resolve("WinstonLogger"); + this.json = container.resolve("JsonUtil"); + this.mod = require("../package.json"); + this.translations = require("../res/translations.json"); + this.logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); + this.path = require("path"); + this.cfg = require("./config.json"); + this.hookRoutes(); + } + + public delayedLoad(container: DependencyContainer) + { + this.modLoader = container.resolve("InitialModLoader"); + this.database = container.resolve("DatabaseServer"); + this.table = this.database.getTables(); + this.globalLocale = this.table.locales.global; + this.items = this.table.templates.items; + this.updateLocalization(); + this.changeBulletColour(); + } + + private updateLocalization() + { + for (const language in this.translations) + { + if (!(language in this.globalLocale)) + { + continue; + } + + const attrKvPair = this.translations[language]; + for (const attrKey in attrKvPair) + { + const attrValue = attrKvPair[attrKey]; + + this.globalLocale[language].interface[attrKey] = attrValue; + } + } + } + + private hookRoutes() + { + this.router.registerDynamicRouter( + "MunitionsExpert", + [ + { + url: "/MunitionsExpert/GetInfo", + action: (url, info, sessionId, output) => + { + return this.getModInfo(url, info, sessionId, output) + } + } + ], + "MunitionsExpert" + ) + } + + getModInfo(url: string, info: any, sessionID: string, output: string) + { + const modOutput = { + status: 1, + data: null + }; + + modOutput.data = {...this.mod, ...{path: this.path.resolve(this.modLoader.getModPath(this.mod.name))}}; + modOutput.status = 0; + + return this.json.serialize(modOutput); + } + + changeBulletColour() + { + if (this.cfg.BulletBackgroundColours === true) + { + for (const i in this.items) + { + const item = this.items[i] + + //set baground colour of ammo depending on pen + if (item._parent === "5485a8684bdc2da71d8b4567") + { + const pen = item._props.PenetrationPower + let colour = "" + + pen > 60 ? colour = "red" : //SuperHighPen + pen > 50 ? colour = "yellow" : //HighPen + pen > 40 ? colour = "violet" : //MedHighPen + pen > 30 ? colour = "blue" : //MedPen + pen > 20 ? colour = "green" : //LowMedPen + colour = "grey" //LowPen + item._props.BackgroundColor = colour + } + } + } + } +} + +module.exports = { mod: new MunitionsExpert() }; \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/src/config.json b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/src/config.json new file mode 100644 index 0000000..b735cd6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/src/config.json @@ -0,0 +1,3 @@ +{ + "BulletBackgroundColours": true +} \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/Program.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/Program.d.ts new file mode 100644 index 0000000..d4b71b9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/Program.d.ts @@ -0,0 +1,4 @@ +export declare class Program { + constructor(); + start(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/TYPES.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/TYPES.d.ts new file mode 100644 index 0000000..6407c3a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/TYPES.d.ts @@ -0,0 +1,3 @@ +export declare const TYPES: { + [name: string]: symbol; +}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/Utils.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/Utils.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/BotCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/BotCallbacks.d.ts new file mode 100644 index 0000000..2db60dc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/BotCallbacks.d.ts @@ -0,0 +1,15 @@ +import { BotController } from "../controllers/BotController"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BotCallbacks { + protected botController: BotController; + protected httpResponse: HttpResponseUtil; + constructor(botController: BotController, httpResponse: HttpResponseUtil); + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/BundleCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/BundleCallbacks.d.ts new file mode 100644 index 0000000..b28abe1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/BundleCallbacks.d.ts @@ -0,0 +1,18 @@ +import { BundleLoader } from "../loaders/BundleLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BundleCallbacks { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, bundleLoader: BundleLoader, configServer: ConfigServer); + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/CustomizationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/CustomizationCallbacks.d.ts new file mode 100644 index 0000000..3bab8c0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/CustomizationCallbacks.d.ts @@ -0,0 +1,23 @@ +import { CustomizationController } from "../controllers/CustomizationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class CustomizationCallbacks { + protected customizationController: CustomizationController; + protected saveServer: SaveServer; + protected httpResponse: HttpResponseUtil; + constructor(customizationController: CustomizationController, saveServer: SaveServer, httpResponse: HttpResponseUtil); + getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<{ + _id: string; + suites: string[]; + }>; + getTraderSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/DataCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/DataCallbacks.d.ts new file mode 100644 index 0000000..cfb1c16 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/DataCallbacks.d.ts @@ -0,0 +1,32 @@ +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGlobals } from "../models/eft/common/IGlobals"; +import { ICustomizationItem } from "../models/eft/common/tables/ICustomizationItem"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IHideoutArea } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../models/eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../models/eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../models/eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../models/spt/server/ILocaleBase"; +import { ISettingsBase } from "../models/spt/server/ISettingsBase"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DataCallbacks { + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer); + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/DialogueCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/DialogueCallbacks.d.ts new file mode 100644 index 0000000..634f90b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/DialogueCallbacks.d.ts @@ -0,0 +1,45 @@ +import { DialogueController } from "../controllers/DialogueController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../models/eft/dialog/IFriendRequestData"; +import { IGetAllAttachmentsRequestData } from "../models/eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetChatServerListRequestData } from "../models/eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogInfoRequestData } from "../models/eft/dialog/IGetMailDialogInfoRequestData"; +import { IGetMailDialogListRequestData } from "../models/eft/dialog/IGetMailDialogListRequestData"; +import { IGetMailDialogViewRequestData } from "../models/eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IPinDialogRequestData } from "../models/eft/dialog/IPinDialogRequestData"; +import { IRemoveDialogRequestData } from "../models/eft/dialog/IRemoveDialogRequestData"; +import { ISendMessageRequest } from "../models/eft/dialog/ISendMessageRequest"; +import { ISetDialogReadRequestData } from "../models/eft/dialog/ISetDialogReadRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { DialogueInfo } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class DialogueCallbacks extends OnUpdate { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected dialogueController: DialogueController; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController); + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/GameCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/GameCallbacks.d.ts new file mode 100644 index 0000000..d5cad76 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/GameCallbacks.d.ts @@ -0,0 +1,24 @@ +import { GameController } from "../controllers/GameController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IGameEmptyCrcRequestData } from "../models/eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../models/eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class GameCallbacks { + protected httpResponse: HttpResponseUtil; + protected watermark: Watermark; + protected gameController: GameController; + constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController); + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} +export { GameCallbacks }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HandbookCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HandbookCallbacks.d.ts new file mode 100644 index 0000000..891e375 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HandbookCallbacks.d.ts @@ -0,0 +1,8 @@ +import { HandbookController } from "../controllers/HandbookController"; +import { OnLoad } from "../di/OnLoad"; +export declare class HandbookCallbacks extends OnLoad { + protected handbookController: HandbookController; + constructor(handbookController: HandbookController); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HealthCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HealthCallbacks.d.ts new file mode 100644 index 0000000..8f7b89d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HealthCallbacks.d.ts @@ -0,0 +1,20 @@ +import { HealthController } from "../controllers/HealthController"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class HealthCallbacks { + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected healthController: HealthController; + constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController); + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HideoutCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HideoutCallbacks.d.ts new file mode 100644 index 0000000..99ab4c9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HideoutCallbacks.d.ts @@ -0,0 +1,33 @@ +import { HideoutController } from "../controllers/HideoutController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../models/eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HideoutCallbacks extends OnUpdate { + protected hideoutController: HideoutController; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(hideoutController: HideoutController, // TODO: delay needed + configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HttpCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HttpCallbacks.d.ts new file mode 100644 index 0000000..94c97bd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/HttpCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoad } from "../di/OnLoad"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class HttpCallbacks extends OnLoad { + protected httpServer: IHttpServer; + constructor(httpServer: IHttpServer); + onLoad(): void; + getRoute(): string; + getImage(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InraidCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InraidCallbacks.d.ts new file mode 100644 index 0000000..05bcce4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InraidCallbacks.d.ts @@ -0,0 +1,23 @@ +import { InraidController } from "../controllers/InraidController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IAirdropConfig } from "../models/spt/config/IAirdropConfig"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InraidCallbacks { + protected inraidController: InraidController; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected airdropConfig: IAirdropConfig; + protected inraidConfig: IInRaidConfig; + constructor(inraidController: InraidController, httpResponse: HttpResponseUtil, configServer: ConfigServer); + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InsuranceCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InsuranceCallbacks.d.ts new file mode 100644 index 0000000..520d0eb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InsuranceCallbacks.d.ts @@ -0,0 +1,24 @@ +import { InsuranceController } from "../controllers/InsuranceController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InsuranceCallbacks extends OnLoadOnUpdate { + protected insuranceController: InsuranceController; + protected insuranceService: InsuranceService; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer); + onLoad(): void; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(secondsSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InventoryCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InventoryCallbacks.d.ts new file mode 100644 index 0000000..9ab1486 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/InventoryCallbacks.d.ts @@ -0,0 +1,39 @@ +import { InventoryController } from "../controllers/InventoryController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class InventoryCallbacks { + protected inventoryController: InventoryController; + constructor(inventoryController: InventoryController); + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ItemEventCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ItemEventCallbacks.d.ts new file mode 100644 index 0000000..f4f04f9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ItemEventCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class ItemEventCallbacks { + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter); + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/LauncherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/LauncherCallbacks.d.ts new file mode 100644 index 0000000..c022325 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/LauncherCallbacks.d.ts @@ -0,0 +1,28 @@ +import { LauncherController } from "../controllers/LauncherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../models/eft/launcher/IRemoveProfileData"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class LauncherCallbacks { + protected httpResponse: HttpResponseUtil; + protected launcherController: LauncherController; + protected saveServer: SaveServer; + protected watermark: Watermark; + constructor(httpResponse: HttpResponseUtil, launcherController: LauncherController, saveServer: SaveServer, watermark: Watermark); + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getServerVersion(): string; + ping(url: string, info: IEmptyRequestData, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} +export { LauncherCallbacks }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/LocationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/LocationCallbacks.d.ts new file mode 100644 index 0000000..cc69369 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/LocationCallbacks.d.ts @@ -0,0 +1,14 @@ +import { LocationController } from "../controllers/LocationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetLocationRequestData } from "../models/eft/location/IGetLocationRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class LocationCallbacks { + protected httpResponse: HttpResponseUtil; + protected locationController: LocationController; + constructor(httpResponse: HttpResponseUtil, locationController: LocationController); + getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/MatchCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/MatchCallbacks.d.ts new file mode 100644 index 0000000..083c1f5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/MatchCallbacks.d.ts @@ -0,0 +1,35 @@ +import { MatchController } from "../controllers/MatchController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class MatchCallbacks { + protected httpResponse: HttpResponseUtil; + protected jsonUtil: JsonUtil; + protected matchController: MatchController; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, jsonUtil: JsonUtil, matchController: MatchController, databaseServer: DatabaseServer); + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: IGetProfileRequestData, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ModCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ModCallbacks.d.ts new file mode 100644 index 0000000..866abf7 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ModCallbacks.d.ts @@ -0,0 +1,22 @@ +import { OnLoad } from "../di/OnLoad"; +import { DelayedModLoader } from "../loaders/DelayedModLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +declare class ModCallbacks extends OnLoad { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected modLoader: DelayedModLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, modLoader: DelayedModLoader, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} +export { ModCallbacks }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/NoteCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/NoteCallbacks.d.ts new file mode 100644 index 0000000..d39d400 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/NoteCallbacks.d.ts @@ -0,0 +1,11 @@ +import { NoteController } from "../controllers/NoteController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +export declare class NoteCallbacks { + protected noteController: NoteController; + constructor(noteController: NoteController); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/NotifierCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/NotifierCallbacks.d.ts new file mode 100644 index 0000000..cd1e736 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/NotifierCallbacks.d.ts @@ -0,0 +1,24 @@ +import { NotifierController } from "../controllers/NotifierController"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../models/eft/notifier/ISelectProfileRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class NotifierCallbacks { + protected httpServerHelper: HttpServerHelper; + protected httpResponse: HttpResponseUtil; + protected notifierController: NotifierController; + constructor(httpServerHelper: HttpServerHelper, httpResponse: HttpResponseUtil, notifierController: NotifierController); + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(_sessionID: string, req: any, resp: any, _data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/PresetBuildCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/PresetBuildCallbacks.d.ts new file mode 100644 index 0000000..8a0c155 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/PresetBuildCallbacks.d.ts @@ -0,0 +1,15 @@ +import { PresetBuildController } from "../controllers/PresetBuildController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PresetBuildCallbacks { + protected httpResponse: HttpResponseUtil; + protected presetBuildController: PresetBuildController; + constructor(httpResponse: HttpResponseUtil, presetBuildController: PresetBuildController); + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/PresetCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/PresetCallbacks.d.ts new file mode 100644 index 0000000..4553f8f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/PresetCallbacks.d.ts @@ -0,0 +1,8 @@ +import { PresetController } from "../controllers/PresetController"; +import { OnLoad } from "../di/OnLoad"; +export declare class PresetCallbacks extends OnLoad { + protected presetController: PresetController; + constructor(presetController: PresetController); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ProfileCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ProfileCallbacks.d.ts new file mode 100644 index 0000000..116e7c5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/ProfileCallbacks.d.ts @@ -0,0 +1,30 @@ +import { ProfileController } from "../controllers/ProfileController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IGetMiniProfileRequestData } from "../models/eft/launcher/IGetMiniProfileRequestData"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileCallbacks { + protected httpResponse: HttpResponseUtil; + protected timeUtil: TimeUtil; + protected profileController: ProfileController; + constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, profileController: ProfileController); + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/QuestCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/QuestCallbacks.d.ts new file mode 100644 index 0000000..559c29e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/QuestCallbacks.d.ts @@ -0,0 +1,26 @@ +import { QuestController } from "../controllers/QuestController"; +import { RepeatableQuestController } from "../controllers/RepeatableQuestController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IListQuestsRequestData } from "../models/eft/quests/IListQuestsRequestData"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class QuestCallbacks { + protected httpResponse: HttpResponseUtil; + protected questController: QuestController; + protected repeatableQuestController: RepeatableQuestController; + constructor(httpResponse: HttpResponseUtil, questController: QuestController, repeatableQuestController: RepeatableQuestController); + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/RagfairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/RagfairCallbacks.d.ts new file mode 100644 index 0000000..d5bab8b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/RagfairCallbacks.d.ts @@ -0,0 +1,39 @@ +import { RagfairController } from "../controllers/RagfairController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAddOfferRequestData } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IRemoveOfferRequestData } from "../models/eft/ragfair/IRemoveOfferRequestData"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected ragfairServer: RagfairServer; + protected ragfairController: RagfairController; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(httpResponse: HttpResponseUtil, logger: ILogger, jsonUtil: JsonUtil, ragfairServer: RagfairServer, ragfairController: RagfairController, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + sendReport(url: string, info: any, sessionID: string): INullResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/RepairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/RepairCallbacks.d.ts new file mode 100644 index 0000000..63733fa --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/RepairCallbacks.d.ts @@ -0,0 +1,11 @@ +import { RepairController } from "../controllers/RepairController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +export declare class RepairCallbacks { + protected repairController: RepairController; + constructor(repairController: RepairController); + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/SaveCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/SaveCallbacks.d.ts new file mode 100644 index 0000000..bbb6e53 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/SaveCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { SaveServer } from "../servers/SaveServer"; +export declare class SaveCallbacks extends OnLoadOnUpdate { + protected saveServer: SaveServer; + constructor(saveServer: SaveServer); + onLoad(): void; + getRoute(): string; + onUpdate(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/TradeCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/TradeCallbacks.d.ts new file mode 100644 index 0000000..272ae46 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/TradeCallbacks.d.ts @@ -0,0 +1,11 @@ +import { TradeController } from "../controllers/TradeController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +export declare class TradeCallbacks { + protected tradeController: TradeController; + constructor(tradeController: TradeController); + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/TraderCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/TraderCallbacks.d.ts new file mode 100644 index 0000000..128d9b2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/TraderCallbacks.d.ts @@ -0,0 +1,18 @@ +import { TraderController } from "../controllers/TraderController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class TraderCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected traderController: TraderController; + constructor(httpResponse: HttpResponseUtil, traderController: TraderController); + onLoad(): void; + getRoute(): string; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + onUpdate(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/WeatherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/WeatherCallbacks.d.ts new file mode 100644 index 0000000..ae784c8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/WeatherCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WeatherController } from "../controllers/WeatherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class WeatherCallbacks { + protected httpResponse: HttpResponseUtil; + protected weatherController: WeatherController; + constructor(httpResponse: HttpResponseUtil, weatherController: WeatherController); + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/WishlistCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/WishlistCallbacks.d.ts new file mode 100644 index 0000000..c2cc2a8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/callbacks/WishlistCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WishlistController } from "../controllers/WishlistController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +export declare class WishlistCallbacks { + protected wishlistController: WishlistController; + constructor(wishlistController: WishlistController); + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/BotController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/BotController.d.ts new file mode 100644 index 0000000..09a1788 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/BotController.d.ts @@ -0,0 +1,35 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { BotHelper } from "../helpers/BotHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +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 { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class BotController { + protected databaseServer: DatabaseServer; + protected botGenerator: BotGenerator; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + /** + * Return the number of bot loadout varieties to be generated + * @param type bot Type we want the loadout gen count for + * @returns + */ + getBotPresetGenerationLimit(type: string): number; + getBotCoreDifficulty(): IBotCore; + /** + * Get bot difficulty settings + * adjust PMC settings to ensure they engage the correct bot types + * @param type what bot the server is requesting settings for + * @param difficulty difficulty level server requested settings for + * @returns Difficulty object + */ + getBotDifficulty(type: string, difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/CustomizationController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/CustomizationController.d.ts new file mode 100644 index 0000000..a6c4730 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/CustomizationController.d.ts @@ -0,0 +1,22 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +export declare class CustomizationController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper); + getTraderSuits(traderID: string, sessionID: string): ISuit[]; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; + protected getAllTraderSuits(sessionID: string): ISuit[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/DialogueController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/DialogueController.d.ts new file mode 100644 index 0000000..b15c4b6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/DialogueController.d.ts @@ -0,0 +1,25 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { DialogueInfo, Message } from "../models/eft/profile/IAkiProfile"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DialogueController { + protected httpResponse: HttpResponseUtil; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + constructor(httpResponse: HttpResponseUtil, saveServer: SaveServer, dialogueHelper: DialogueHelper); + getFriendList(sessionID: string): IGetFriendListDataResponse; + generateDialogueList(sessionID: string): IGetBodyResponseData; + getDialogueInfo(dialogueID: string, sessionID: string): DialogueInfo; + generateDialogueView(dialogueID: string, sessionID: string): IGetMailDialogViewResponseData; + removeDialogue(dialogueID: string, sessionID: string): void; + setDialoguePin(dialogueID: string, shouldPin: boolean, sessionID: string): void; + setRead(dialogueIDs: string[], sessionID: string): void; + getAllAttachments(dialogueID: string, sessionID: string): IGetAllAttachmentsResponse; + protected messagesHaveUncollectedRewards(messages: Message[]): boolean; + protected removeExpiredItems(sessionID: string): void; + update(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/GameController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/GameController.d.ts new file mode 100644 index 0000000..b9067fa --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/GameController.d.ts @@ -0,0 +1,32 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcDataRepeatableQuest, IRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { Watermark } from "../utils/Watermark"; +export declare class GameController { + protected logger: ILogger; + protected watermark: Watermark; + protected httpServerHelper: HttpServerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, watermark: Watermark, httpServerHelper: HttpServerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void; + protected addMissingBonusesProperty(pmcProfile: IPmcData): void; + protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void; + protected addMissingWeaponRepairSkill(pmcProfile: IPmcData): void; + protected addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void; + protected addMissingArmorRepairSkill(pmcProfile: IPmcData): void; + protected fixNullTraderSalesSums(pmcProfile: IPmcData): void; + protected removeDanglingConditionCounters(pmcProfile: IPmcData): void; + protected removeDanglingBackendCounters(pmcProfile: IPmcData): void; + getGameConfig(sessionID: string): IGameConfigResponse; + getServer(): any[]; + protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HandbookController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HandbookController.d.ts new file mode 100644 index 0000000..52d2dd8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HandbookController.d.ts @@ -0,0 +1,8 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class HandbookController { + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + constructor(databaseServer: DatabaseServer, handbookHelper: HandbookHelper); + load(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HealthController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HealthController.d.ts new file mode 100644 index 0000000..aafb8df --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HealthController.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentService } from "../services/PaymentService"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class HealthController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected inventoryHelper: InventoryHelper; + protected healthHelper: HealthHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, healthHelper: HealthHelper); + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HideoutController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HideoutController.d.ts new file mode 100644 index 0000000..a8bf229 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/HideoutController.d.ts @@ -0,0 +1,57 @@ +import { HideoutHelper } from "../helpers/HideoutHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { HideoutUpgradeCompleteRequestData } from "../models/eft/hideout/HideoutUpgradeCompleteRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HideoutController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected inventoryHelper: InventoryHelper; + protected saveServer: SaveServer; + protected playerService: PlayerService; + protected presetHelper: PresetHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected hideoutHelper: HideoutHelper; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + update(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InraidController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InraidController.d.ts new file mode 100644 index 0000000..7f2036c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InraidController.d.ts @@ -0,0 +1,31 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { InRaidHelper } from "../helpers/InRaidHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InraidController { + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected itemHelper: ItemHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + protected healthHelper: HealthHelper; + protected traderHelper: TraderHelper; + protected insuranceService: InsuranceService; + protected inRaidHelper: InRaidHelper; + protected configServer: ConfigServer; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, extendedProfileHelper: ExtendedProfileHelper, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer); + addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void; + saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InsuranceController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InsuranceController.d.ts new file mode 100644 index 0000000..db2c567 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InsuranceController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { PaymentService } from "../services/PaymentService"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceController { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected itemEventRouter: ItemEventRouter; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected profileHelper: ProfileHelper; + protected dialogueHelper: DialogueHelper; + protected paymentService: PaymentService; + protected insuranceService: InsuranceService; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, itemEventRouter: ItemEventRouter, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required + insuranceService: InsuranceService, configServer: ConfigServer); + processReturn(): void; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + cost(info: IGetInsuranceCostRequestData, sessionID: string): any; + doAbsolutelyNothing(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InventoryController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InventoryController.d.ts new file mode 100644 index 0000000..b732aa9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/InventoryController.d.ts @@ -0,0 +1,107 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InventoryController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected presetHelper: PresetHelper; + protected inventoryHelper: InventoryHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter); + /** + * Move Item + * change location of item with parentId and slotId + * transfers items from one profile to another if fromOwner/toOwner is set in the body. + * otherwise, move is contained within the same profile_f. + */ + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Remove Item from Profile + * Deep tree item deletion, also removes items from insurance list + */ + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Implements functionality "Discard" from Main menu (Stash etc.) + * Removes item from PMC Profile + */ + discardItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Split Item + * spliting 1 item-stack into 2 separate items ... + */ + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Merge Item + * merges 2 items into one, deletes item from `body.item` and adding number of stacks into `body.with` + */ + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Transfer item + * Used to take items from scav inventory into stash or to insert ammo into mags (shotgun ones) and reloading weapon by clicking "Reload" + */ + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Swap Item + * its used for "reload" if you have weapon in hands and magazine is somewhere else in rig or backpack in equipment + */ + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Give Item + * its used for "add" item like gifts etc. + */ + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + /** + * Handles folding of Weapons + */ + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Toggles "Toggleable" items like night vision goggles and face shields. + */ + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles Tagging of items (primary Containers). + */ + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles examining of the item * + */ + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles sorting of Inventory. + */ + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/LauncherController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/LauncherController.d.ts new file mode 100644 index 0000000..1af1f56 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/LauncherController.d.ts @@ -0,0 +1,28 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { Info } from "../models/eft/profile/IAkiProfile"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class LauncherController { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected httpServerHelper: HttpServerHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected coreConfig: ICoreConfig; + constructor(hashUtil: HashUtil, saveServer: SaveServer, httpServerHelper: HttpServerHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + connect(): any; + find(sessionIdKey: string): Info; + login(info: ILoginRequestData): string; + register(info: IRegisterData): string; + protected createAccount(info: IRegisterData): string; + changeUsername(info: IChangeRequestData): string; + changePassword(info: IChangeRequestData): string; + wipe(info: IRegisterData): string; + getCompatibleTarkovVersion(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/LocationController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/LocationController.d.ts new file mode 100644 index 0000000..90b6d7a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/LocationController.d.ts @@ -0,0 +1,18 @@ +import { LocationGenerator } from "../generators/LocationGenerator"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class LocationController { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected locationGenerator: LocationGenerator; + protected databaseServer: DatabaseServer; + protected timeUtil: TimeUtil; + constructor(jsonUtil: JsonUtil, logger: ILogger, locationGenerator: LocationGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil); + get(location: string): ILocationBase; + generate(name: string): ILocationBase; + generateAll(): ILocationsGenerateAllResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/MatchController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/MatchController.d.ts new file mode 100644 index 0000000..c322d96 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/MatchController.d.ts @@ -0,0 +1,30 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { IMatchConfig } from "../models/spt/config/IMatchConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { MatchLocationService } from "../services/MatchLocationService"; +export declare class MatchController { + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected matchLocationService: MatchLocationService; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected matchConfig: IMatchConfig; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, configServer: ConfigServer); + getEnabled(): boolean; + getProfile(info: IGetProfileRequestData): IPmcData[]; + protected getMatch(location: any): any; + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; + joinMatch(info: any, sessionID: string): any[]; + getGroupStatus(info: any): any; + startOfflineRaid(info: IStartOfflineRaidRequestData, sessionID: string): void; + endOfflineRaid(info: IEndOfflineRaidRequestData, sessionID: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/NoteController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/NoteController.d.ts new file mode 100644 index 0000000..cc78383 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/NoteController.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +declare class NoteController { + protected itemEventRouter: ItemEventRouter; + constructor(itemEventRouter: ItemEventRouter); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} +export { NoteController }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/NotifierController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/NotifierController.d.ts new file mode 100644 index 0000000..31d7bfe --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/NotifierController.d.ts @@ -0,0 +1,22 @@ +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { NotificationService } from "../services/NotificationService"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +export declare class NotifierController { + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected notificationService: NotificationService; + protected pollInterval: number; + protected timeout: number; + constructor(notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, notificationService: NotificationService); + /** + * Resolve an array of session notifications. + * + * If no notifications are currently queued then intermittently check for new notifications until either + * one or more appear or when a timeout expires. + * If no notifications are available after the timeout, use a default message. + */ + notifyAsync(sessionID: string): Promise; + getServer(sessionID: string): string; + getChannel(sessionID: string): INotifierChannel; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/PresetBuildController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/PresetBuildController.d.ts new file mode 100644 index 0000000..adf4084 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/PresetBuildController.d.ts @@ -0,0 +1,18 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class PresetBuildController { + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + constructor(hashUtil: HashUtil, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, saveServer: SaveServer); + getUserBuilds(sessionID: string): WeaponBuild[]; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/PresetController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/PresetController.d.ts new file mode 100644 index 0000000..ca1af1a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/PresetController.d.ts @@ -0,0 +1,8 @@ +import { PresetHelper } from "../helpers/PresetHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetController { + protected presetHelper: PresetHelper; + protected databaseServer: DatabaseServer; + constructor(presetHelper: PresetHelper, databaseServer: DatabaseServer); + initialize(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/ProfileController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/ProfileController.d.ts new file mode 100644 index 0000000..9b7a6d5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/ProfileController.d.ts @@ -0,0 +1,34 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileController { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected traderHelper: TraderHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, traderHelper: TraderHelper, extendedProfileHelper: ExtendedProfileHelper); + getMiniProfiles(): IMiniProfile[]; + getMiniProfile(sessionID: string): any; + getCompleteProfile(sessionID: string): IPmcData[]; + createProfile(info: IProfileCreateRequestData, sessionID: string): void; + generatePlayerScav(sessionID: string): IPmcData; + validateNickname(info: IValidateNicknameRequestData, sessionID: string): string; + changeNickname(info: IProfileChangeNicknameRequestData, sessionID: string): string; + changeVoice(info: IProfileChangeVoiceRequestData, sessionID: string): void; + getFriends(info: ISearchFriendRequestData, sessionID: string): ISearchFriendResponse[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/QuestController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/QuestController.d.ts new file mode 100644 index 0000000..e588de0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/QuestController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { QuestConditionHelper } from "../helpers/QuestConditionHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class QuestController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected questHelper: QuestHelper; + protected questConditionHelper: QuestConditionHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, questConditionHelper: QuestConditionHelper, playerService: PlayerService, configServer: ConfigServer); + getClientQuests(sessionID: string): IQuest[]; + acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + acceptRepeatableQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RagfairController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RagfairController.d.ts new file mode 100644 index 0000000..c758593 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RagfairController.d.ts @@ -0,0 +1,70 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairHelper } from "../helpers/RagfairHelper"; +import { RagfairOfferHelper } from "../helpers/RagfairOfferHelper"; +import { RagfairSellHelper } from "../helpers/RagfairSellHelper"; +import { RagfairSortHelper } from "../helpers/RagfairSortHelper"; +import { RagfairTaxHelper } from "../helpers/RagfairTaxHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IAddOfferRequestData, Requirement } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PaymentService } from "../services/PaymentService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + protected ragfairServer: RagfairServer; + protected ragfairPriceService: RagfairPriceService; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + protected ragfairSellHelper: RagfairSellHelper; + protected ragfairTaxHelper: RagfairTaxHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairOfferHelper: RagfairOfferHelper; + protected profileHelper: ProfileHelper; + protected paymentService: PaymentService; + protected handbookHelper: HandbookHelper; + protected paymentHelper: PaymentHelper; + protected inventoryHelper: InventoryHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter, ragfairServer: RagfairServer, ragfairPriceService: RagfairPriceService, databaseServer: DatabaseServer, itemHelper: ItemHelper, saveServer: SaveServer, ragfairSellHelper: RagfairSellHelper, ragfairTaxHelper: RagfairTaxHelper, ragfairSortHelper: RagfairSortHelper, ragfairOfferHelper: RagfairOfferHelper, profileHelper: ProfileHelper, paymentService: PaymentService, handbookHelper: HandbookHelper, paymentHelper: PaymentHelper, inventoryHelper: InventoryHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer); + getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult; + update(): void; + getItemPrice(info: IGetMarketPriceRequestData): IGetItemPriceResult; + addPlayerOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + createPlayerOffer(profile: IAkiProfile, requirements: Requirement[], items: Item[], sellInOnePiece: boolean, amountToSend: number): IRagfairOffer; + getAllFleaPrices(): Record; + removeOffer(offerId: string, sessionID: string): IItemEventRouterResponse; + extendOffer(info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RepairController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RepairController.d.ts new file mode 100644 index 0000000..e9458f6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RepairController.d.ts @@ -0,0 +1,41 @@ +import { QuestHelper } from "../helpers/QuestHelper"; +import { RepairHelper } from "../helpers/RepairHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +export declare class RepairController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected traderHelper: TraderHelper; + protected paymentService: PaymentService; + protected repairHelper: RepairHelper; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, questHelper: QuestHelper, traderHelper: TraderHelper, paymentService: PaymentService, repairHelper: RepairHelper, configServer: ConfigServer); + /** + * Repair with trader + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + /** + * Repair with repair kit + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RepeatableQuestController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RepeatableQuestController.d.ts new file mode 100644 index 0000000..ce190aa --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/RepeatableQuestController.d.ts @@ -0,0 +1,217 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { Exit } from "../models/eft/common/ILocationBase"; +import { IPmcData, TraderInfo } from "../models/eft/common/IPmcData"; +import { ICompletion, ICompletionAvailableFor, IElimination, IEliminationCondition, IExploration, IExplorationCondition, IPmcDataRepeatableQuest, IRepeatableQuest, IReward, IRewards } from "../models/eft/common/tables/IRepeatableQuests"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { ELocationName } from "../models/enums/ELocationName"; +import { IQuestConfig, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { ProbabilityObject, ProbabilityObjectArray, RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export interface IQuestTypePool { + types: string[]; + pool: IQuestPool; +} +export interface IQuestPool { + Exploration: IExplorationPool; + Elimination: IEliminationPool; +} +export interface IExplorationPool { + locations: Partial>; +} +export interface IEliminationPool { + targets: IEliminationTargetPool; +} +export interface IEliminationTargetPool { + Savage?: ITargetLocation; + AnyPmc?: ITargetLocation; + bossBully?: ITargetLocation; + bossGluhar?: ITargetLocation; + bossKilla?: ITargetLocation; + bossSanitar?: ITargetLocation; + bossTagilla?: ITargetLocation; + bossKojaniy?: ITargetLocation; +} +export interface ITargetLocation { + locations: string[]; +} +export declare class RepeatableQuestController { + protected timeUtil: TimeUtil; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected mathUtil: MathUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected itemEventRouter: ItemEventRouter; + protected paymentService: PaymentService; + protected objectId: ObjectId; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, itemEventRouter: ItemEventRouter, paymentService: PaymentService, objectId: ObjectId, configServer: ConfigServer); + /** + * This is the method reached by the /client/repeatalbeQuests/activityPeriods endpoint + * Returns an array of objects in the format of repeatable quests to the client. + * repeatableQuestObject = { + * id: Unique Id, + * name: "Daily", + * endTime: the time when the quests expire + * activeQuests: currently available quests in an array. Each element of quest type format (see assets/database/templates/repeatableQuests.json). + * inactiveQuests: the quests which were previously active (required by client to fail them if they are not completed) + * } + * + * The method checks if the player level requirement for repeatable quests (e.g. daily lvl5, weekly lvl15) is met and if the previously active quests + * are still valid. This ischecked by endTime persisted in profile accordning to the resetTime configured for each repeatable kind (daily, weekly) + * in QuestCondig.js + * + * If the condition is met, new repeatableQuests are created, old quests (which are persisted in the profile.RepeatableQuests[i].activeQuests) are + * moved to profile.RepeatableQuests[i].inactiveQuests. This memory is required to get rid of old repeatable quest data in the profile, otherwise + * they'll litter the profile's Quests field. + * (if the are on "Succeed" but not "Completed" we keep them, to allow the player to complete them and get the rewards) + * The new quests generated are again persisted in profile.RepeatableQuests + * + * + * @param {string} sessionId Player's session id + * @returns {array} array of "repeatableQuestObjects" as descibed above + */ + getClientRepeatableQuests(_info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; + /** + * This method is called by GetClientRepeatableQuests and creates one element of quest type format (see assets/database/templates/repeatableQuests.json). + * It randomly draws a quest type (currently Elimination, Completion or Exploration) as well as a trader who is providing the quest + */ + generateRepeatableQuest(pmcLevel: number, pmcTraderInfo: Record, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest; + /** + * Just for debug reasons. Draws dailies a random assort of dailies extracted from dumps + */ + generateDebugDailies(dailiesPool: any, factory: any, number: any): any; + /** + * Generates the base object of quest type format given as templates in assets/database/templates/repeatableQuests.json + * The templates include Elimination, Completion and Extraction quest types + * + * @param {string} type quest type: "Elimination", "Completion" or "Extraction" + * @param {string} traderId trader from which the quest will be provided + * @returns {object} a object which contains the base elements for repeatable quests of the requests type + * (needs to be filled with reward and conditions by called to make a valid quest) + */ + generateRepeatableTemplate(type: string, traderId: string): IRepeatableQuest; + /** + * Generates a valid Exploration quest + * + * @param {integer} pmcLevel player's level for reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Exploration" (see assets/database/templates/repeatableQuests.json) + */ + generateExplorationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IExploration; + /** + * Generates a valid Completion quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Completion" (see assets/database/templates/repeatableQuests.json) + */ + generateCompletionQuest(pmcLevel: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): ICompletion; + /** + * Generates a valid Elimination quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Elimination" (see assets/database/templates/repeatableQuests.json) + */ + generateEliminationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IElimination; + /** + * Exploration repeatable quests can specify a required extraction point. + * This method creates the according object which will be appended to the conditions array + * + * @param {string} exit The exit name to generate the condition for + * @returns {object} Exit condition + */ + generateExplorationExitCondition(exit: Exit): IExplorationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateCompletionQuest to create a completion condition (of which a completion quest theoretically can have many) + * + * @param {string} targetItemId id of the item to request + * @param {integer} value amount of items of this specific type to request + * @returns {object} object of "Completion"-condition + */ + generateCompletionAvailableForFinish(targetItemId: string, value: number): ICompletionAvailableFor; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a location condition. + * + * @param {string} location the location on which to fulfill the elimination quest + * @returns {object} object of "Elimination"-location-subcondition + */ + generateEliminationLocation(location: string[]): IEliminationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a kill condition. + * + * @param {string} target array of target npcs e.g. "AnyPmc", "Savage" + * @param {array} bodyParts array of body parts with which to kill e.g. ["stomach", "thorax"] + * @param {number} distance distance from which to kill (currently only >= supported) + * @returns {object} object of "Elimination"-kill-subcondition + */ + generateEliminationCondition(target: string, bodyPart: string[], distance: number): IEliminationCondition; + /** + * Used to create a quest pool during each cycle of repeatable quest generation. The pool will be subsequently + * narrowed down during quest generation to avoid duplicate quests. Like duplicate extractions or elimination quests + * where you have to e.g. kill scavs in same locations. + * + * @returns {object} the quest pool + */ + generateQuestPool(repeatableConfig: IRepeatableQuestConfig): IQuestTypePool; + /** + * Generate the reward for a mission. A reward can consist of + * - Experience + * - Money + * - Items + * - Trader Reputation + * + * The reward is dependent on the player level as given by the wiki. The exact mapping of pmcLevel to + * experience / money / items / trader reputation can be defined in QuestConfig.js + * + * There's also a random variation of the reward the spread of which can be also defined in the config. + * + * Additonaly, a scaling factor w.r.t. quest difficulty going from 0.2...1 can be used + * + * @param {integer} pmcLevel player's level + * @param {number} difficulty a reward scaling factor goint from 0.2 to 1 + * @param {string} traderId the trader for reputation gain (and possible in the future filtering of reward item type based on trader) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of "Reward"-type that can be given for a repeatable mission + */ + generateReward(pmcLevel: number, difficulty: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): IRewards; + /** + * Helper to create a reward item structured as required by the client + * + * @param {string} tpl itemId of the rewarded item + * @param {integer} value amount of items to give + * @param {integer} index all rewards will be appended to a list, for unkown reasons the client wants the index + * @returns {object} object of "Reward"-item-type + */ + generateRewardItem(tpl: string, value: number, index: number, preset?: any): IReward; + debugLogRepeatableQuestIds(pmcData: IPmcData): void; + probabilityObjectArray(configArrayInput: ProbabilityObject[]): ProbabilityObjectArray; + changeRepeatableQuest(pmcDataIn: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/TradeController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/TradeController.d.ts new file mode 100644 index 0000000..c86745c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/TradeController.d.ts @@ -0,0 +1,21 @@ +import { RagfairServer } from "../servers/RagfairServer"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TradeHelper } from "../helpers/TradeHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +declare class TradeController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected tradeHelper: TradeHelper; + protected profileHelper: ProfileHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, tradeHelper: TradeHelper, profileHelper: ProfileHelper, ragfairServer: RagfairServer); + confirmTrading(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid?: boolean, upd?: Upd): IItemEventRouterResponse; + confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} +export { TradeController }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/TraderController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/TraderController.d.ts new file mode 100644 index 0000000..7bab158 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/TraderController.d.ts @@ -0,0 +1,26 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderAssortHelper } from "../helpers/TraderAssortHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class TraderController { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected traderAssortHelper: TraderAssortHelper; + protected profileHelper: ProfileHelper; + protected traderHelper: TraderHelper; + protected timeUtil: TimeUtil; + protected traderAssortService: TraderAssortService; + protected jsonUtil: JsonUtil; + constructor(logger: ILogger, databaseServer: DatabaseServer, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, timeUtil: TimeUtil, traderAssortService: TraderAssortService, jsonUtil: JsonUtil); + load(): void; + getTrader(traderID: string, sessionID: string): ITraderBase; + getAllTraders(sessionID: string): ITraderBase[]; + updateTraders(): boolean; + getAssort(sessionId: string, traderId: string): ITraderAssort; + getPurchasesData(traderID: string, sessionID: string): Record; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/WeatherController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/WeatherController.d.ts new file mode 100644 index 0000000..ca7f5eb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/WeatherController.d.ts @@ -0,0 +1,11 @@ +import { WeatherGenerator } from "../generators/WeatherGenerator"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WeatherController { + protected weatherGenerator: WeatherGenerator; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer); + generate(): IWeatherData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/WishlistController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/WishlistController.d.ts new file mode 100644 index 0000000..a96c522 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/controllers/WishlistController.d.ts @@ -0,0 +1,10 @@ +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class WishlistController { + protected itemEvenRouter: ItemEventRouter; + constructor(itemEvenRouter: ItemEventRouter); + addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Container.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Container.d.ts new file mode 100644 index 0000000..17791b0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Container.d.ts @@ -0,0 +1,14 @@ +import { DependencyContainer } from "tsyringe"; +export declare class Container { + static registerTypes(depContainer: DependencyContainer): void; + static registerListTypes(depContainer: DependencyContainer): void; + private static registerUtils; + private static registerRouters; + private static registerGenerators; + private static registerHelpers; + private static registerLoaders; + private static registerCallbacks; + private static registerServices; + private static registerServers; + private static registerControllers; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnLoad.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnLoad.d.ts new file mode 100644 index 0000000..064d07d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnLoad.d.ts @@ -0,0 +1,4 @@ +export declare class OnLoad { + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnLoadOnUpdate.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnLoadOnUpdate.d.ts new file mode 100644 index 0000000..8bd3dc3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnLoadOnUpdate.d.ts @@ -0,0 +1,7 @@ +import { OnLoad } from "./OnLoad"; +import { OnUpdate } from "./OnUpdate"; +export declare class OnLoadOnUpdate implements OnLoad, OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnUpdate.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnUpdate.d.ts new file mode 100644 index 0000000..7fbbe09 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/OnUpdate.d.ts @@ -0,0 +1,4 @@ +export declare class OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Router.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Router.d.ts new file mode 100644 index 0000000..2fb98e0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Router.d.ts @@ -0,0 +1,40 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +export declare class Router { + private handledRoutes; + getTopLevelRoute(): string; + protected getHandledRoutes(): HandledRoute[]; + private getInternalHandledRoutes; + canHandle(url: string, partialMatch?: boolean): boolean; +} +export declare class StaticRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleStatic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class DynamicRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleDynamic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class ItemEventRouterDefinition extends Router { + constructor(); + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} +export declare class SaveLoadRouter extends Router { + constructor(); + handleLoad(profile: IAkiProfile): IAkiProfile; +} +export declare class HandledRoute { + route: string; + dynamic: boolean; + constructor(route: string, dynamic: boolean); +} +export declare class RouteAction { + url: string; + action: (url: string, info: any, sessionID: string, output: string) => any; + constructor(url: string, action: (url: string, info: any, sessionID: string, output: string) => any); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Serializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Serializer.d.ts new file mode 100644 index 0000000..70aa7c5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/di/Serializer.d.ts @@ -0,0 +1,5 @@ +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class Serializer { + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(something: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotGenerator.d.ts new file mode 100644 index 0000000..88a8014 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { Health as PmcHealth } from "../models/eft/common/IPmcData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { Health, Inventory, Skills } 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 { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotInventoryGenerator } from "./BotInventoryGenerator"; +declare namespace BotGenerator { + interface IRandomisedBotLevelResult { + level: number; + exp: number; + } +} +export declare class BotGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected botInventoryGenerator: BotInventoryGenerator; + protected botHelper: BotHelper; + protected gameEventHelper: GameEventHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + protected generateBot(bot: IBotBase, role: string, isPmc: boolean): IBotBase; + protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** Converts health object to the required format */ + protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; + protected generateSkills(skillsObj: Skills): Skills; + protected getPmcRole(pmcSide: string): string; + protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + protected generateId(bot: IBotBase): IBotBase; + protected generateInventoryID(profile: IBotBase): IBotBase; + protected getPMCDifficulty(requestedDifficulty: string): string; + protected generateDogtag(bot: IBotBase): IBotBase; +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotInventoryGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotInventoryGenerator.d.ts new file mode 100644 index 0000000..783d0c5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotInventoryGenerator.d.ts @@ -0,0 +1,24 @@ +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +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"; +export declare class BotInventoryGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected botWeaponGenerator: BotWeaponGenerator; + 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(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; + protected generateInventoryBase(): PmcInventory; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotLootGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotLootGenerator.d.ts new file mode 100644 index 0000000..1d91836 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotLootGenerator.d.ts @@ -0,0 +1,29 @@ +import { PMCLootGenerator } from "../generators/PMCLootGenerator"; +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { ItemMinMax, Items } from "../models/eft/common/tables/IBotType"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotLootGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected pmcLootGenerator: PMCLootGenerator; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, pmcLootGenerator: PMCLootGenerator, configServer: ConfigServer); + generateLoot(lootPool: Items, itemCounts: ItemMinMax, isPmc: boolean, inventory: PmcInventory): void; + protected getRandomisedCount(min: number, max: number, nValue: number): number; + protected addLootFromPool(pool: ITemplateItem[], equipmentSlots: string[], count: number, inventory: PmcInventory, totalValueLimit?: number, useLimits?: boolean): void; + /** Compares two item templates by their price to spawn chance ratio */ + protected compareByValue(a: ITemplateItem, b: ITemplateItem): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotWeaponGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotWeaponGenerator.d.ts new file mode 100644 index 0000000..13fe7df --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/BotWeaponGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { MinMax, Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotWeaponGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected weightedRandomHelper: WeightedRandomHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected randomUtil: RandomUtil; + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil); + generateWeapon(equipmentSlot: string, weaponPool: Record, modPool: Mods, modChances: ModsChances, magCounts: MinMax, botRole: string, isPmc: boolean, inventory: PmcInventory): void; + /** Checks if all required slots are occupied on a weapon and all it's mods */ + protected isWeaponValid(itemList: Item[]): boolean; + /** + * Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets. + * Additionally, adds extra bullets to SecuredContainer + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @param {*} magCounts + * @param {*} ammoTpl + * @returns + */ + protected generateExtraMagazines(weaponMods: Item[], weaponTemplate: ITemplateItem, magCounts: MinMax, ammoTpl: string, inventory: PmcInventory): void; + protected addBullets(ammoTpl: string, bulletCount: number, inventory: PmcInventory): void; + /** + * Finds and returns tpl of ammo that should be used, while making sure it's compatible + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @returns + */ + protected getCompatibleAmmo(weaponMods: Item[], weaponTemplate: ITemplateItem): string; + /** Fill existing magazines to full, while replacing their contents with specified ammo */ + protected fillExistingMagazines(weaponMods: Item[], magazine: Item, ammoTpl: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/LocationGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/LocationGenerator.d.ts new file mode 100644 index 0000000..bd368b5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/LocationGenerator.d.ts @@ -0,0 +1,46 @@ +import { ContainerHelper } from "../helpers/ContainerHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { ILooseLoot, SpawnpointTemplate } from "../models/eft/common/ILooseLoot"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "../models/eft/common/tables/ILootBase"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILocationConfig } from "../models/spt/config/ILocationConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { RandomUtil } from "../utils/RandomUtil"; +export interface IContainerItem { + items: Item[]; + width: number; + height: number; +} +export declare class LocationGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected objectId: ObjectId; + protected randomUtil: RandomUtil; + protected ragfairServerHelper: RagfairServerHelper; + protected itemHelper: ItemHelper; + protected mathUtil: MathUtil; + protected gameEventHelper: GameEventHelper; + protected containerHelper: ContainerHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected locationConfig: ILocationConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, objectId: ObjectId, randomUtil: RandomUtil, ragfairServerHelper: RagfairServerHelper, itemHelper: ItemHelper, mathUtil: MathUtil, gameEventHelper: GameEventHelper, containerHelper: ContainerHelper, presetHelper: PresetHelper, configServer: ConfigServer); + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + protected getLooseLootMultiplerForLocation(location: string): number; + protected getStaticLootMultiplerForLocation(location: string): number; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; + protected createItem(tpl: string, staticAmmoDist: Record, parentId?: string): IContainerItem; + protected getRandomCompatibleCaliberTemplateId(item: ITemplateItem): string; + protected getRandomValidCaliber(magTemplate: ITemplateItem): string; + protected drawAmmoTpl(caliber: string, staticAmmoDist: Record): string; + protected createRandomMagCartridges(magTemplate: ITemplateItem, parentId: string, staticAmmoDist: Record, caliber?: string): Item; + protected createCartidges(parentId: string, ammoTpl: string, stackCount: number): Item; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/PMCLootGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/PMCLootGenerator.d.ts new file mode 100644 index 0000000..64e6f7f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/PMCLootGenerator.d.ts @@ -0,0 +1,15 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +export declare class PMCLootGenerator { + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected pocketLootPool: string[]; + protected backpackLootPool: string[]; + protected botConfig: IBotConfig; + constructor(itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/RagfairAssortGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/RagfairAssortGenerator.d.ts new file mode 100644 index 0000000..cbdd7f2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/RagfairAssortGenerator.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairAssortGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected generatedAssortItems: Item[]; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + /** + * Get an array of unique items that can be sold on the flea + * @returns array of unique items + */ + getAssortItems(): Item[]; + protected assortsAreGenerated(): boolean; + /** + * Generate an array of items the flea can sell + * @returns array of unique items + */ + protected generateRagfairAssortItems(): Item[]; + protected createRagfairAssortItem(tplId: string, id?: string): Item; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/RagfairOfferGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/RagfairOfferGenerator.d.ts new file mode 100644 index 0000000..de53ea9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/RagfairOfferGenerator.d.ts @@ -0,0 +1,60 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { RagfairAssortGenerator } from "./RagfairAssortGenerator"; +export declare class RagfairOfferGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected saveServer: SaveServer; + protected presetHelper: PresetHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairPriceService: RagfairPriceService; + protected fenceService: FenceService; + protected itemHelper: ItemHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer); + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; + protected getTraderId(userID: string): string; + protected getRating(userID: string): number; + protected getRatingGrowing(userID: string): boolean; + protected getOfferEndTime(userID: string, time: number): number; + /** + * Create multiple offers for items by using a unique list of items we've generated previously + * @param expiredOffers + */ + generateDynamicOffers(expiredOffers?: Item[]): void; + generateTraderOffers(traderID: string): void; + protected getItemCondition(userID: string, items: Item[], itemDetails: ITemplateItem): Item[]; + protected addMissingCondition(item: Item): Item; + protected getOfferRequirements(items: Item[]): { + count: number; + _tpl: string; + }[]; + /** + * Create a flea offer and store it in the Ragfair server offers array + */ + createFleaOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/WeatherGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/WeatherGenerator.d.ts new file mode 100644 index 0000000..23aa169 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/generators/WeatherGenerator.d.ts @@ -0,0 +1,20 @@ +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class WeatherGenerator { + protected weightedRandomHelper: WeightedRandomHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateTime(data: IWeatherData): IWeatherData; + generateWeather(data: IWeatherData): IWeatherData; + protected getWeightedFog(): string; + protected getWeightedRain(): number; + protected getRandomFloat(node: string): number; + protected getRandomInt(node: string): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/AssortHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/AssortHelper.d.ts new file mode 100644 index 0000000..15586b9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/AssortHelper.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ItemHelper } from "./ItemHelper"; +import { QuestHelper } from "./QuestHelper"; +export declare class AssortHelper { + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + constructor(logger: ILogger, itemHelper: ItemHelper, databaseServer: DatabaseServer, questHelper: QuestHelper); + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort assort items from a trader + * @returns assort items minus locked quest assorts + */ + stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort traders assorts + * @returns traders assorts minus locked loyality assorts + */ + stripLockedLoyaltyAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove an item from an assort + * @param assort assort to modify + * @param itemID item id to remove from asort + * @returns Modified assort + */ + removeItemFromAssort(assort: ITraderAssort, itemID: string): ITraderAssort; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/BotGeneratorHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/BotGeneratorHelper.d.ts new file mode 100644 index 0000000..c382fc9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/BotGeneratorHelper.d.ts @@ -0,0 +1,95 @@ +import { DurabilityLimitsHelper } from "../helpers/DurabilityLimitsHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item, Repairable, Upd } from "../models/eft/common/tables/IItem"; +import { Grid, ITemplateItem, Slot } from "../models/eft/common/tables/ITemplateItem"; +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { InventoryHelper } from "./InventoryHelper"; +import { ItemHelper } from "./ItemHelper"; +export declare class BotGeneratorHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected durabilityLimitsHelper: DurabilityLimitsHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected containerHelper: ContainerHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, configServer: ConfigServer); + generateModsForItem(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, isPmc?: boolean): Item[]; + /** + * With the shotgun revolver (60db29ce99594040e04c4a27) 12.12 introduced CylinderMagazines. + * Those magazines (e.g. 60dc519adf4c47305f6d410d) have a "Cartridges" entry with a _max_count=0. + * Ammo is not put into the magazine directly but assigned to the magazine's slots: The "camora_xxx" slots. + * This function is a helper called by generateModsForItem for mods with parent type "CylinderMagazine" + * + * @param {object} items The items where the CylinderMagazine's camora are appended to + * @param {object} modPool modPool which should include available cartrigdes + * @param {string} parentId The CylinderMagazine's UID + * @param {object} parentTemplate The CylinderMagazine's template + */ + protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void; + generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): { + upd?: Upd; + }; + /** + * Create a repairable object for a weapon that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + /** + * Create a repairable object for an armor that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string; + /** + * Sort by spawn chance, highest to lowest, higher is more common + * @param unsortedModArray String array to sort + * @returns Sorted string array + */ + protected sortModArray(unsortedModArray: string[]): string[]; + /** + * Can an item be added to an item without issue + * @param items + * @param tplToCheck + * @param equipmentSlot + * @returns true if possible + */ + isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean; + /** + * Adds an item with all its childern into specified equipmentSlots, wherever it fits. + * @param equipmentSlots + * @param parentId + * @param parentTpl + * @param itemWithChildren + * @param inventory + * @returns a `boolean` indicating item was added + */ + addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: PmcInventory): boolean; + protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean; +} +export declare class ExhaustableArray { + private itemPool; + private randomUtil; + private jsonUtil; + private pool; + constructor(itemPool: T[], randomUtil: RandomUtil, jsonUtil: JsonUtil); + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/BotHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/BotHelper.d.ts new file mode 100644 index 0000000..0cb1227 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/BotHelper.d.ts @@ -0,0 +1,44 @@ +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + getBotDifficultySettings(type: string, difficulty: string): Difficulty; + getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Randomise the chance the PMC will attack their own side + * @param difficultySettings pmc difficulty settings + */ + randomisePmcHostility(difficultySettings: Difficulty): void; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + /** + * Add a bot to the FRIENDLY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typeToAdd bot type to add to friendly list + */ + addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; + /** + * Add a bot to the ENEMY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to enemy list + */ + addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Add a bot to the REVENGE_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to revenge list + */ + addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ContainerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ContainerHelper.d.ts new file mode 100644 index 0000000..3c2ee93 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ContainerHelper.d.ts @@ -0,0 +1,12 @@ +export declare class FindSlotResult { + success: boolean; + x: any; + y: any; + rotation: boolean; + constructor(success?: boolean, x?: any, y?: any, rotation?: boolean); +} +export declare class ContainerHelper { + protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean; + findSlotForItem(container2D: number[][], itemWidth: number, itemHeight: number): FindSlotResult; + fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/DialogueHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/DialogueHelper.d.ts new file mode 100644 index 0000000..9776c6a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/DialogueHelper.d.ts @@ -0,0 +1,21 @@ +import { Dialogue, MessageContent, MessagePreview } from "../models/eft/profile/IAkiProfile"; +import { MessageType } from "../models/enums/MessageType"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { ItemHelper } from "./ItemHelper"; +import { NotificationSendHelper } from "./NotificationSendHelper"; +import { NotifierHelper } from "./NotifierHelper"; +export declare class DialogueHelper { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected notificationSendHelper: NotificationSendHelper; + protected itemHelper: ItemHelper; + constructor(hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, notificationSendHelper: NotificationSendHelper, itemHelper: ItemHelper); + createMessageContext(templateId: string, messageType: MessageType, maxStoreTime: number): MessageContent; + addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards?: any[]): void; + getMessagePreview(dialogue: Dialogue): MessagePreview; + getMessageItemContents(messageID: string, sessionID: string): any[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/DurabilityLimitsHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/DurabilityLimitsHelper.d.ts new file mode 100644 index 0000000..07a5db1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/DurabilityLimitsHelper.d.ts @@ -0,0 +1,26 @@ +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotHelper } from "./BotHelper"; +export declare class DurabilityLimitsHelper { + protected randomUtil: RandomUtil; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(randomUtil: RandomUtil, botHelper: BotHelper, configServer: ConfigServer); + getRandomisedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + getRandomisedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + protected generateMaxWeaponDurability(botRole: string): number; + protected generateMaxPmcArmorDurability(itemMaxDurability: number): number; + protected getLowestMaxWeaponFromConfig(botRole: string): number; + protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number; + protected generateWeaponDurability(botRole: string, maxDurability: number): number; + protected generateArmorDurability(botRole: string, maxDurability: number): number; + protected getMinWeaponDeltaFromConfig(botRole: string): number; + protected getMaxWeaponDeltaFromConfig(botRole: string): number; + protected getMinArmorDeltaFromConfig(botRole: string): number; + protected getMaxArmorDeltaFromConfig(botRole: string): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ExtendedProfileHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ExtendedProfileHelper.d.ts new file mode 100644 index 0000000..d8b754d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ExtendedProfileHelper.d.ts @@ -0,0 +1,22 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { IPmcData, Skills, Stats } from "../models/eft/common/IPmcData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class ExtendedProfileHelper extends ProfileHelper { + protected botGenerator: BotGenerator; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService, botGenerator: BotGenerator); + generatePlayerScav(sessionID: string): IPmcData; + protected getScavSkills(sessionID: string): Skills; + protected removeSecureContainer(profile: IPmcData): IPmcData; + protected getDefaultScavSkills(): Skills; + protected getScavStats(sessionID: string): Stats; + protected getScavLevel(sessionID: string): number; + protected getScavExperience(sessionID: string): number; + protected setScavCooldownTimer(profile: IPmcData, pmcData: IPmcData): IPmcData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/GameEventHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/GameEventHelper.d.ts new file mode 100644 index 0000000..b2d6377 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/GameEventHelper.d.ts @@ -0,0 +1,9 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class GameEventHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + get EVENT(): Record; + get christmasEventItems(): string[]; + itemIsChristmasRelated(itemId: string): boolean; + christmasEventEnabled(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HandbookHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HandbookHelper.d.ts new file mode 100644 index 0000000..b47d466 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HandbookHelper.d.ts @@ -0,0 +1,33 @@ +declare class LookupItem { + byId: Record; + byParent: Record; + constructor(); +} +export declare class LookupCollection { + items: LookupItem; + categories: LookupItem; + constructor(); +} +export declare class HandbookHelper { + protected lookup: LookupCollection; + hydrateLookup(lookup: LookupCollection): void; + getTemplatePrice(x: string): number; + templatesWithParent(x: string): string[]; + isCategory(x: string): boolean; + childrenCategories(x: string): string[]; + /** + * Gets Currency to Ruble conversion Value + * @param {number} value + * @param {string} currencyFrom + * @returns number + */ + inRUB(value: number, currencyFrom: string): number; + /** + * Gets Ruble to Currency conversion Value + * @param {number} value + * @param {string} currencyTo + * @returns number + */ + fromRUB(value: number, currencyTo: string): number; +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HealthHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HealthHelper.d.ts new file mode 100644 index 0000000..518c23f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HealthHelper.d.ts @@ -0,0 +1,27 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHealthConfig } from "../models/spt/config/IHealthConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HealthHelper { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected configServer: ConfigServer; + protected healthConfig: IHealthConfig; + constructor(jsonUtil: JsonUtil, logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, configServer: ConfigServer); + resetVitality(sessionID: string): IAkiProfile; + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + protected saveHealth(pmcData: IPmcData, sessionID: string): void; + protected saveEffects(pmcData: IPmcData, sessionID: string): void; + protected addEffect(pmcData: IPmcData, sessionID: string, effect: { + bodyPart: string; + effectType: string; + }): void; + protected isEmpty(map: any): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HideoutHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HideoutHelper.d.ts new file mode 100644 index 0000000..76b337f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HideoutHelper.d.ts @@ -0,0 +1,68 @@ +import { Common, HideoutArea, IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { StageBonus } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class HideoutHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected inventoryHelper: InventoryHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + static BITCOIN_FARM: string; + protected WATER_COLLECTOR: string; + protected BITCOIN: string; + protected EXPEDITIONARY_FUEL_TANK: string; + static NAME_BACKENDCOUNTERS_CRAFTING: string; + static SKILL_NAME_HIDEOUT: string; + static HOUR_FOR_SKILL_CRAFTING: number; + static SKILL_NAME_CRAFITING: string; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer); + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + /** + * This convinience function intialies new Production Object + * with all the constants. + */ + initProduction(recipeId: string, productionTime: number): Production; + isProductionType(productive: Productive): productive is Production; + applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void; + protected applySkillXPBoost(pmcData: IPmcData, bonus: StageBonus): void; + updatePlayerHideout(sessionID: string): void; + protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void; + protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean; + protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateWaterFilters(waterFilterArea: HideoutArea, pwProd: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea; + protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd; + protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production; + protected getBTCSlots(pmcData: IPmcData): number; + protected getManagementSkillsSlots(): number; + protected hasManagementSkillSlots(pmcData: IPmcData): boolean; + protected getHideoutManagementSkill(pmcData: IPmcData): Common; + protected getHideoutManagementConsumptionBonus(pmcData: IPmcData): number; + isProduction(productive: Productive): productive is Production; + getBTC(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + getRandomAmountRewardForScavCase(itemToCalculate: ITemplateItem): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HttpServerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HttpServerHelper.d.ts new file mode 100644 index 0000000..c6e5296 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/HttpServerHelper.d.ts @@ -0,0 +1,23 @@ +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HttpServerHelper { + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + protected mime: { + css: string; + bin: string; + html: string; + jpg: string; + js: string; + json: string; + png: string; + svg: string; + txt: string; + }; + constructor(configServer: ConfigServer); + getMimeText(key: string): string; + buildUrl(): string; + getBackendUrl(): string; + getWebsocketUrl(): string; + sendTextJson(resp: any, output: any): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/InRaidHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/InRaidHelper.d.ts new file mode 100644 index 0000000..05b6fdf --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/InRaidHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Victim } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { PaymentHelper } from "./PaymentHelper"; +export declare class InRaidHelper { + protected logger: ILogger; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + protected removePlayer(sessionID: string): void; + protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void; + addUpdToMoneyFromRaid(items: Item[]): void; + /** + * Add positive karma for PMC kills + * @param {*} existingFenceStanding + * @param {*} victims + */ + calculateFenceStandingChangeFromKills(existingFenceStanding: number, victims: Victim[]): void; + setBaseStats(profileData: IPmcData, offraidData: ISaveProgressRequestData, sessionID: string): IPmcData; + markFoundItems(pmcData: IPmcData, profile: IPmcData, isPlayerScav: boolean): IPmcData; + removeFoundInRaidStatusFromItems(profile: IPmcData): IPmcData; + setInventory(sessionID: string, pmcData: IPmcData, profile: IPmcData): IPmcData; + deleteInventory(pmcData: IPmcData, sessionID: string): IPmcData; + getPlayerGear(items: Item[]): Item[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/InventoryHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/InventoryHelper.d.ts new file mode 100644 index 0000000..dc7cbca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/InventoryHelper.d.ts @@ -0,0 +1,85 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInventoryConfig } from "../models/spt/config/IInventoryConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class InventoryHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected httpResponse: HttpResponseUtil; + protected fenceService: FenceService; + protected databaseServer: DatabaseServer; + protected paymentHelper: PaymentHelper; + protected traderAssortHelper: TraderAssortHelper; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected containerHelper: ContainerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected inventoryConfig: IInventoryConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, httpResponse: HttpResponseUtil, fenceService: FenceService, databaseServer: DatabaseServer, paymentHelper: PaymentHelper, traderAssortHelper: TraderAssortHelper, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, containerHelper: ContainerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + getItemSize(itemTpl: string, itemID: string, inventoryItem: Item[]): Record; + protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): Record; + protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash; + getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]; + /** + * Based on the item action, determine whose inventories we should be looking at for from and to. + */ + getOwnerInventoryItems(body: IInventoryMoveRequestData | IInventorySplitRequestData | IInventoryMergeRequestData, sessionID: string): OwnerInventoryItems; + /** + * Made a 2d array table with 0 - free slot and 1 - used slot + * @param {Object} pmcData + * @param {string} sessionID + * @returns Array + */ + protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][]; + protected getStashType(sessionID: string): string; + protected getPlayerStashSize(sessionID: string): Record; + /** + * Internal helper function to transfer an item from one profile to another. + * fromProfileData: Profile of the source. + * toProfileData: Profile of the destination. + * body: Move request + */ + moveItemToProfile(fromItems: Item[], toItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to move item within the same profile_f. + */ + moveItemInternal(inventoryItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to handle cartridges in inventory if any of them exist. + */ + protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void; +} +declare namespace InventoryHelper { + interface InventoryItemHash { + byItemId: Record; + byParentId: Record; + } +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ItemHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ItemHelper.d.ts new file mode 100644 index 0000000..f124cb1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ItemHelper.d.ts @@ -0,0 +1,147 @@ +import { InsuredItem, IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +declare class ItemHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer); + /** + * Checks if a 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 + */ + isValidItem(tpl: string, invalidBaseTypes?: string[]): boolean; + /** + * Checks if a id is a valid item. Valid meaning that it's an item that may be a reward + * or content of bot loot. Items that are tested as valid may be in a player backpack or stash. + * @param {*} tpl template id of item to check + * @returns boolean: true if item is valid reward + */ + isValidRewardItem(tpl: string): boolean; + /** + * Picks rewardable items from items.json. This means they need to fit into the inventory and they shouldn't be keys (debatable) + * @returns a list of rewardable items [[_tpl, itemTemplate],...] + */ + getRewardableItems(): [string, ITemplateItem][]; + /** + * Check if the tpl / template Id provided is a descendent of the baseclass + * + * @param {string} tpl the item template id to check + * @param {string} baseclassTpl the baseclass to check for + * @return {boolean} is the tpl a descendent? + */ + isOfBaseclass(tpl: string, baseclassTpl: string): any; + /** + * Returns the item price based on the handbook or as a fallback from the prices.json if the item is not + * found in the handbook. If the price can't be found at all return 0 + * + * @param {string} tpl the item template to check + * @returns {integer} The price of the item or 0 if not found + */ + getItemPrice(tpl: string): number; + fixItemStackCount(item: Item): Item; + /** + * AmmoBoxes contain StackSlots which need to be filled for the AmmoBox to have content. + * Here's what a filled AmmoBox looks like: + * { + * "_id": "b1bbe982daa00ac841d4ae4d", + * "_tpl": "57372c89245977685d4159b1", + * "parentId": "5fe49a0e2694b0755a504876", + * "slotId": "hideout", + * "location": { + * "x": 3, + * "y": 4, + * "r": 0 + * }, + * "upd": { + * "StackObjectsCount": 1 + * } + * }, + * { + * "_id": "b997b4117199033afd274a06", + * "_tpl": "56dff061d2720bb5668b4567", + * "parentId": "b1bbe982daa00ac841d4ae4d", + * "slotId": "cartridges", + * "location": 0, + * "upd": { + * "StackObjectsCount": 30 + * } + * } + * Given the AmmoBox Item (first object) this function generates the StackSlot (second object) and returns it. + * StackSlots are only used for AmmoBoxes which only have one element in StackSlots. However, it seems to be generic + * to possibly also have more than one StackSlot. As good as possible, without seeing items having more than one + * StackSlot, this function takes account of this and creates and returns an array of StackSlotItems + * + * @param {object} item The item template of the AmmoBox as given in items.json + * @param {string} parentId The id of the AmmoBox instance these StackSlotItems should be children of + * @returns {array} The array of StackSlotItems + */ + generateStackSlotItems(item: ITemplateItem, parentId: string): StackSlot[]; + getItem(tpl: string): [boolean, ITemplateItem]; + getItemQualityModifier(item: Item): number; + findAndReturnChildrenByItems(items: Item[], itemID: string): string[]; + /** + * A variant of findAndReturnChildren where the output is list of item objects instead of their ids. + */ + findAndReturnChildrenAsItems(items: Item[], baseItemId: string): Item[]; + /** + * find children of the item in a given assort (weapons parts for example, need recursive loop function) + */ + findAndReturnChildrenByAssort(itemIdToFind: string, assort: Item[]): Item[]; + hasBuyRestrictions(itemToCheck: Item): boolean; + /** + * Is Dogtag + * Checks if an item is a dogtag. Used under profile_f.js to modify preparePrice based + * on the level of the dogtag + */ + isDogtag(tpl: string): boolean; + isNotSellable(tpl: string): boolean; + getChildId(item: Item): string; + isItemTplStackable(tpl: string): boolean; + /** + * split item stack if it exceeds StackMaxSize + */ + splitStack(item: Item): Item[]; + /** + * Find Barter items in the inventory + * @param {string} by + * @param {Object} pmcData + * @param {string} barter_itemID + * @returns Array + */ + findBarterItems(by: string, pmcData: IPmcData, barter_itemID: string): any[]; + /** + * @param {Object} pmcData + * @param {Array} items + * @param {Object} fastPanel + * @returns Array + */ + replaceIDs(pmcData: IPmcData, items: Item[], insuredItems?: InsuredItem[], fastPanel?: any): any[]; + /** + * Recursivly loop down through an items hierarchy to see if any of the ids match the supplied list, return true if any do + * @param {string} tpl + * @param {Array} tplsToCheck + * @returns boolean + */ + doesItemOrParentsIdMatch(tpl: string, tplsToCheck: string[]): boolean; + /** + * Return true if item is a quest item + * @param {string} tpl + * @returns boolean + */ + isQuestItem(tpl: string): boolean; + getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize; +} +declare namespace ItemHelper { + interface ItemSize { + width: number; + height: number; + } +} +export { ItemHelper }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/NotificationSendHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/NotificationSendHelper.d.ts new file mode 100644 index 0000000..34e62d9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/NotificationSendHelper.d.ts @@ -0,0 +1,12 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { NotificationService } from "../services/NotificationService"; +export declare class NotificationSendHelper { + protected httpServer: IHttpServer; + protected notificationService: NotificationService; + constructor(httpServer: IHttpServer, notificationService: NotificationService); + /** + * Send notification message to the appropiate channel + */ + sendMessage(sessionID: string, notificationMessage: INotification): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/NotifierHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/NotifierHelper.d.ts new file mode 100644 index 0000000..738b69a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/NotifierHelper.d.ts @@ -0,0 +1,17 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { Message, MessageContentRagfair } from "../models/eft/profile/IAkiProfile"; +import { HttpServerHelper } from "./HttpServerHelper"; +export declare class NotifierHelper { + protected httpServerHelper: HttpServerHelper; + /** + * The default notification sent when waiting times out. + */ + protected defaultNotification: INotification; + constructor(httpServerHelper: HttpServerHelper); + getDefaultNotification(): INotification; + /** Creates a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside */ + createRagfairOfferSoldNotification(dialogueMessage: Message, ragfairData: MessageContentRagfair): INotification; + /** Creates a new notification with the specified dialogueMessage object. */ + createNewMessageNotification(dialogueMessage: Message): INotification; + getWebSocketServer(sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/PaymentHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/PaymentHelper.d.ts new file mode 100644 index 0000000..2d068a4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/PaymentHelper.d.ts @@ -0,0 +1,14 @@ +export declare class PaymentHelper { + /** + * Check whether tpl is Money + * @param {string} tpl + * @returns void + */ + isMoneyTpl(tpl: string): boolean; + /** + * Gets currency TPL from TAG + * @param {string} currency + * @returns string + */ + getCurrency(currency: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/PresetHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/PresetHelper.d.ts new file mode 100644 index 0000000..0371886 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/PresetHelper.d.ts @@ -0,0 +1,14 @@ +import { Preset } from "../models/eft/common/IGlobals"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetHelper { + protected databaseServer: DatabaseServer; + protected lookup: Record; + constructor(databaseServer: DatabaseServer); + hydratePresetStore(input: Record): void; + isPreset(id: string): boolean; + hasPreset(templateId: string): boolean; + getPreset(id: string): Preset; + getPresets(templateId: string): Preset[]; + getDefaultPreset(templateId: string): Preset; + getBaseItemTpl(presetId: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ProfileHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ProfileHelper.d.ts new file mode 100644 index 0000000..6a64291 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/ProfileHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Stats } from "../models/eft/common/IPmcData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +export declare class ProfileHelper { + protected jsonUtil: JsonUtil; + protected watermark: Watermark; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected fenceService: FenceService; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService); + resetProfileQuestCondition(sessionID: string, conditionId: string): void; + getCompleteProfile(sessionID: string): IPmcData[]; + isNicknameTaken(info: IValidateNicknameRequestData, sessionID: string): boolean; + getProfileByPmcId(pmcId: string): IPmcData; + getExperience(level: number): number; + getMaxLevel(): number; + getDefaultAkiDataObject(): any; + getFullProfile(sessionID: string): IAkiProfile; + getPmcProfile(sessionID: string): IPmcData; + getScavProfile(sessionID: string): IPmcData; + getDefaultCounters(): Stats; + protected isWiped(sessionID: string): boolean; + protected getServerVersion(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/QuestConditionHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/QuestConditionHelper.d.ts new file mode 100644 index 0000000..90ee560 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/QuestConditionHelper.d.ts @@ -0,0 +1,7 @@ +import { AvailableForConditions } from "../models/eft/common/tables/IQuest"; +export declare class QuestConditionHelper { + getQuestConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLevelConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLoyaltyConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/QuestHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/QuestHelper.d.ts new file mode 100644 index 0000000..f32c85c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/QuestHelper.d.ts @@ -0,0 +1,69 @@ +import { IPmcData, Quest } from "../models/eft/common/IPmcData"; +import { AvailableForConditions, AvailableForProps, IQuest, Reward } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { TraderHelper } from "./TraderHelper"; +export declare class QuestHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, traderHelper: TraderHelper, configServer: ConfigServer); + static get STATUS(): Record; + questStatus(pmcData: IPmcData, questID: string): string; + /** + * returns true is the condition is satisfied + */ + evaluateLevel(pmcProfile: IPmcData, cond: AvailableForConditions): boolean; + getDeltaQuests(before: IQuest[], after: IQuest[]): IQuest[]; + rewardSkillPoints(sessionID: string, pmcData: IPmcData, output: IItemEventRouterResponse, skillName: string, progress: number): void; + getQuestLocale(questId: string): any; + /** + * Debug Routine for showing some information on the + * quest list in question. + */ + dumpQuests(quests: any, label?: any): void; + loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean; + protected processReward(reward: Reward): any[]; + getQuestRewardItems(quest: IQuest, state: string): Reward[]; + addQuestToPMCData(pmcData: IPmcData, quest: Quest, newState: string, acceptedQuest: IAcceptQuestRequestData): void; + acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[]; + failedUnlocked(failedQuestId: string, sessionID: string): IQuest[]; + applyMoneyBoost(quest: IQuest, moneyBoost: number): IQuest; + changeItemStack(pmcData: IPmcData, id: string, value: number, sessionID: string, output: any): void; + /** + * Get List of All Quests as an array + */ + questValues(): IQuest[]; + protected cleanQuestList(quests: IQuest[]): IQuest[]; + cleanQuestConditions(quest: IQuest): IQuest; + failQuest(pmcData: IPmcData, body: any, sessionID: string): any; + getQuestFromDb(questId: string, pmcData: IPmcData): IQuest; + getQuestLocaleIdFromDb(messageId: string, localisation?: string): string; + applyQuestReward(pmcData: IPmcData, body: ICompleteQuestRequestData, state: string, sessionID: string): any[]; + getFindItemIdForQuestItem(itemTpl: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairHelper.d.ts new file mode 100644 index 0000000..c8bc5ba --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairHelper.d.ts @@ -0,0 +1,44 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairLinkedItemService } from "../services/RagfairLinkedItemService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +import { UtilityHelper } from "./UtilityHelper"; +export declare class RagfairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected traderAssortHelper: TraderAssortHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected ragfairLinkedItemService: RagfairLinkedItemService; + protected utilityHelper: UtilityHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, traderAssortHelper: TraderAssortHelper, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, ragfairLinkedItemService: RagfairLinkedItemService, utilityHelper: UtilityHelper, configServer: ConfigServer); + /** + * Gets currency TAG from TPL + * @param {string} currency + * @returns string + */ + getCurrencyTag(currency: string): string; + filterCategories(sessionID: string, info: ISearchRequestData): string[]; + getDisplayableAssorts(sessionID: string): Record; + protected getCategoryList(handbookId: string): string[]; + countCategories(result: IGetOffersResult): void; + /** + * Merges Root Items + * Ragfair allows abnormally large stacks. + */ + mergeStackable(items: Item[]): Item[]; + getCurrencySymbol(currencyTpl: string): string; + formatCurrency(moneyAmount: number): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairOfferHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairOfferHelper.d.ts new file mode 100644 index 0000000..129bc1c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairOfferHelper.d.ts @@ -0,0 +1,52 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { PresetHelper } from "./PresetHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairHelper } from "./RagfairHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { RagfairSortHelper } from "./RagfairSortHelper"; +export declare class RagfairOfferHelper { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected paymentHelper: PaymentHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected configServer: ConfigServer; + protected static TPL_GOODS_SOLD: string; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, configServer: ConfigServer); + getValidOffers(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + getOffersForBuild(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + processOffers(sessionID: string): boolean; + protected getProfileOffers(sessionID: string): IRagfairOffer[]; + protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; + isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairSellHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairSellHelper.d.ts new file mode 100644 index 0000000..6ec004a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairSellHelper.d.ts @@ -0,0 +1,16 @@ +import { SellResult } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairSellHelper { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateSellChance(baseChance: number, offerPrice: number, requirementsPriceInRub: number): number; + rollForSale(sellChance: number, count: number): SellResult[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairServerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairServerHelper.d.ts new file mode 100644 index 0000000..2cb3ea5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairServerHelper.d.ts @@ -0,0 +1,46 @@ +import { MemberCategory } from "../models/enums/MemberCategory"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class RagfairServerHelper { + protected randomUtil: RandomUtil; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected jsonUtil: JsonUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + protected static TPL_GOODS_RETURNED: string; + constructor(randomUtil: RandomUtil, hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, profileHelper: ProfileHelper, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, jsonUtil: JsonUtil, configServer: ConfigServer); + /** + * Is item valid / on blacklist / quest item + * @param itemDetails + * @returns boolean + */ + isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean; + protected isItemBlacklisted(itemTemplateId: string): boolean; + isTrader(userID: string): boolean; + isPlayer(userID: string): boolean; + returnItems(sessionID: string, items: any[]): void; + calculateDynamicStackCount(tplId: string, isWeaponPreset: boolean): number; + getDynamicOfferCurrency(): string; + getMemberType(userID: string): MemberCategory; + getNickname(userID: string): string; + getPresetItems(item: any): Item[]; + getPresetItemsByTpl(item: Item): Item[]; + reparentPresets(item: Item, preset: Item[]): Item[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairSortHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairSortHelper.d.ts new file mode 100644 index 0000000..e983569 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairSortHelper.d.ts @@ -0,0 +1,12 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class RagfairSortHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + sortOffers(offers: IRagfairOffer[], type: number, direction?: number): IRagfairOffer[]; + protected sortOffersByID(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByExpiry(a: IRagfairOffer, b: IRagfairOffer): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairTaxHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairTaxHelper.d.ts new file mode 100644 index 0000000..820facb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RagfairTaxHelper.d.ts @@ -0,0 +1,16 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { ItemHelper } from "./ItemHelper"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairTaxHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected ragfairPriceService: RagfairPriceService; + protected itemHelper: ItemHelper; + constructor(logger: ILogger, databaseServer: DatabaseServer, ragfairPriceService: RagfairPriceService, itemHelper: ItemHelper); + calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number; + protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem?: boolean): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RepairHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RepairHelper.d.ts new file mode 100644 index 0000000..650c1aa --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/RepairHelper.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { Props } from "../models/eft/common/tables/ITemplateItem"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RepairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, configServer: ConfigServer); + updateItemDurability(itemToRepairId: string, amountToRepair: number, pmcData: IPmcData, useRepairKit?: boolean): Item; + protected getRandomisedArmorRepairDegredationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number): number; + protected getRandomisedWeaponRepairDegredationValue(itemProps: Props, isRepairKit: boolean, armorMax: number): number; + isWeaponTemplate(tpl: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/SecureContainerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/SecureContainerHelper.d.ts new file mode 100644 index 0000000..9e2bc32 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/SecureContainerHelper.d.ts @@ -0,0 +1,13 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ItemHelper } from "./ItemHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class SecureContainerHelper { + protected itemHelper: ItemHelper; + constructor(itemHelper: ItemHelper); + getSecureContainerItems(items: Item[]): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TradeHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TradeHelper.d.ts new file mode 100644 index 0000000..975062b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TradeHelper.d.ts @@ -0,0 +1,44 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item, Upd } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { RagfairServer } from "../servers/RagfairServer"; +import { FenceService } from "../services/FenceService"; +import { PaymentService } from "../services/PaymentService"; +export declare class TradeHelper { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected fenceService: FenceService; + protected inventoryHelper: InventoryHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer); + /** + * Buy item from flea or trader + * @param pmcData + * @param buyRequestData data from client + * @param sessionID + * @param foundInRaid + * @param upd optional item details used when buying from flea + * @returns + */ + buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse; + /** + * Sell item to trader + * @param pmcData + * @param body + * @param sessionID + * @returns + */ + sellItem(pmcData: IPmcData, body: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse; + protected incrementAssortBuyCount(assortBeingPurchased: Item, itemsPurchasedCount: number): void; + protected checkPurchaseIsWithinTraderItemLimit(assortBeingPurchased: Item, assortId: string, count: number): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TraderAssortHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TraderAssortHelper.d.ts new file mode 100644 index 0000000..4f41ac2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TraderAssortHelper.d.ts @@ -0,0 +1,42 @@ +import { RagfairAssortGenerator } from "../generators/RagfairAssortGenerator"; +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { AssortHelper } from "./AssortHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderAssortHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected assortHelper: AssortHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected traderAssortService: TraderAssortService; + protected fenceService: FenceService; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, profileHelper: ProfileHelper, assortHelper: AssortHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferGenerator: RagfairOfferGenerator, traderAssortService: TraderAssortService, fenceService: FenceService); + /** + * Get a traders assorts + * Can be used for returning ragfair / fence assorts + * @param sessionId session id + * @param traderId trader id + * @returns a traders assorts + */ + getAssort(sessionId: string, traderId: string): ITraderAssort; + /** + * Get an array of pristine trader items prior to any alteration by player + * @param traderId trader id + * @returns array of Items + */ + protected getPristineTraderAssorts(traderId: string): Item[]; + /** + * Returns generated ragfair offers in a trader assort format + * @returns Trader assort object + */ + protected getRagfairDataAsTraderAssort(): ITraderAssort; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TraderHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TraderHelper.d.ts new file mode 100644 index 0000000..ab4a371 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/TraderHelper.d.ts @@ -0,0 +1,53 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { PlayerService } from "../services/PlayerService"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemHelper: ItemHelper; + protected handbookHelper: HandbookHelper; + protected playerService: PlayerService; + protected fenceService: FenceService; + protected configServer: ConfigServer; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemHelper: ItemHelper, handbookHelper: HandbookHelper, playerService: PlayerService, fenceService: FenceService, configServer: ConfigServer); + getTrader(traderID: string, sessionID: string): ITraderBase; + getTraderAssortsById(traderId: string): ITraderAssort; + /** + * Reset a trader back to its initial state as seen by a level 1 player + * Does NOT take into account different profile levels + * @param sessionID session id + * @param traderID trader id to reset + */ + resetTrader(sessionID: string, traderID: string): void; + changeTraderDisplay(traderID: string, status: boolean, sessionID: string): void; + getPurchasesData(traderID: string, sessionID: string): Record; + /** + * Calculate traders level based on exp amount and increment level if over threshold + * @param traderID trader to process + * @param sessionID session id + */ + lvlUp(traderID: string, sessionID: string): void; + getTraderUpdateSeconds(traderId: string): number; + /** + * check if an item is allowed to be sold to a trader + * @param traderFilters array of allowed categories + * @param tplToCheck itemTpl of inventory + * @returns boolean + */ + traderFilter(traderFilters: string[], tplToCheck: string): boolean; + getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/UtilityHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/UtilityHelper.d.ts new file mode 100644 index 0000000..5d9f482 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/UtilityHelper.d.ts @@ -0,0 +1,3 @@ +export declare class UtilityHelper { + arrayIntersect(a: T[], b: T[]): T[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/WeightedRandomHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/WeightedRandomHelper.d.ts new file mode 100644 index 0000000..9aa0d29 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/helpers/WeightedRandomHelper.d.ts @@ -0,0 +1,28 @@ +export declare class WeightedRandomHelper { + /** + * Gets a tplId from a weighted dictionary + * @param {tplId: weighting[]} itemArray + * @returns tplId + */ + getWeightedInventoryItem(itemArray: { + [tplId: string]: unknown; + } | ArrayLike): string; + /** + * Picks the random item based on its weight. + * The items with higher weight will be picked more often (with a higher probability). + * + * For example: + * - items = ['banana', 'orange', 'apple'] + * - weights = [0, 0.2, 0.8] + * - weightedRandom(items, weights) in 80% of cases will return 'apple', in 20% of cases will return + * 'orange' and it will never return 'banana' (because probability of picking the banana is 0%) + * + * @param {any[]} items + * @param {number[]} weights + * @returns {{item: any, index: number}} + */ + weightedRandom(items: string | any[], weights: string | any[]): { + item: any; + index: number; + }; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/BleedingEdgeEntry.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/BleedingEdgeEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/BleedingEdgeEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/Compiler.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/Compiler.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/Compiler.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/DebugEntry.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/DebugEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/DebugEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/ReleaseEntry.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/ReleaseEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/ReleaseEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/TestEntry.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/TestEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/ide/TestEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/BundleLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/BundleLoader.d.ts new file mode 100644 index 0000000..06ad698 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/BundleLoader.d.ts @@ -0,0 +1,22 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +declare class BundleInfo { + modPath: string; + key: string; + path: string; + filepath: string; + dependencyKeys: string[]; + constructor(modpath: string, bundle: any, bundlePath: string, bundleFilepath: string); +} +export declare class BundleLoader { + protected httpServerHelper: HttpServerHelper; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected bundles: Record; + constructor(httpServerHelper: HttpServerHelper, vfs: VFS, jsonUtil: JsonUtil); + getBundles(local: boolean): BundleInfo[]; + getBundle(key: string, local: boolean): BundleInfo; + addBundles(modpath: string): void; +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/DelayedModLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/DelayedModLoader.d.ts new file mode 100644 index 0000000..2a05604 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/DelayedModLoader.d.ts @@ -0,0 +1,21 @@ +import { DependencyContainer } from "tsyringe"; +import { HandbookController } from "../controllers/HandbookController"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +import { InitialModLoader } from "./InitialModLoader"; +export declare class DelayedModLoader implements IModLoader { + protected bundleLoader: BundleLoader; + protected handbookController: HandbookController; + protected vfs: VFS; + protected modCompilerService: ModCompilerService; + protected initialModLoader: InitialModLoader; + constructor(bundleLoader: BundleLoader, handbookController: HandbookController, vfs: VFS, modCompilerService: ModCompilerService, initialModLoader: InitialModLoader); + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; + load(): void; + protected executeMods(container: DependencyContainer): void; + protected addBundles(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/InitialModLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/InitialModLoader.d.ts new file mode 100644 index 0000000..68e47fe --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/loaders/InitialModLoader.d.ts @@ -0,0 +1,64 @@ +import { DependencyContainer } from "tsyringe"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ModLoader } from "../models/spt/mod/IMod"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +export declare class InitialModLoader implements IModLoader { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected modCompilerService: ModCompilerService; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected static container: DependencyContainer; + protected readonly basepath = "user/mods/"; + protected imported: Record; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer); + load(container: DependencyContainer): Promise; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + /** + * Returns a list of mods with preserved load order + * @returns Array of mod names in load order + */ + getImportedModsNames(): string[]; + getModPath(mod: string): string; + protected importClass(name: string, filepath: string, container: DependencyContainer): void; + protected importMods(): Promise; + /** + * + * @param mods Get an array of broken/invalid mods by name + * @returns Mod names array + */ + protected getBrokenMods(mods: string[]): string[]; + /** + * Get packageJson data for mods + * @param mods mods to get packageJson for + * @returns dictionary + */ + protected getModsPackageData(mods: string[]): Record; + /** + * Does mod have "delayedLoad(" string in its entry class + * @param modFolderName folder name + * @param modToValidate package.json details + * @returns boolean + */ + protected isModSpt300Compatible(modFolderName: string, modToValidate: IPackageJsonData): boolean; + protected isModCombatibleWithAki(mod: IPackageJsonData): boolean; + protected executeMods(container: DependencyContainer): void; + sortModsLoadOrder(): string[]; + protected addMod(mod: string): Promise; + protected areModDependenciesFulfilled(mod: IPackageJsonData, loadedMods: Record): boolean; + protected isModCompatible(mod: IPackageJsonData, loadedMods: Record): boolean; + protected validMod(mod: string): boolean; + protected getLoadOrderRecursive(mod: string, result: Record, visited: Record): void; + protected getLoadOrder(mods: Record): Record; + getContainer(): DependencyContainer; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts new file mode 100644 index 0000000..c49cef7 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts @@ -0,0 +1,8 @@ +export interface IGenerateBotsRequestData { + conditions: Condition[]; +} +export interface Condition { + Role: string; + Limit: number; + Difficulty: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IEmptyRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IEmptyRequestData.d.ts new file mode 100644 index 0000000..284d16e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IEmptyRequestData.d.ts @@ -0,0 +1,2 @@ +export interface IEmptyRequestData { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IGlobals.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IGlobals.d.ts new file mode 100644 index 0000000..456895c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IGlobals.d.ts @@ -0,0 +1,1176 @@ +import { Item } from "./tables/IItem"; +export interface IGlobals { + time: number; + config: Config; + bot_presets: BotPreset[]; + BotWeaponScatterings: BotWeaponScattering[]; + ItemPresets: Record; +} +export interface Config { + content: Content; + AimPunchMagnitude: number; + WeaponSkillProgressRate: number; + SkillAtrophy: boolean; + exp: Exp; + t_base_looting: number; + t_base_lockpicking: number; + armor: Armor; + SessionsToShowHotKeys: number; + MaxBotsAliveOnMap: number; + SavagePlayCooldown: number; + SavagePlayCooldownNdaFree: number; + MarksmanAccuracy: number; + SavagePlayCooldownDevelop: number; + TODSkyDate: string; + Mastering: Mastering[]; + GlobalItemPriceModifier: number; + TradingUnlimitedItems: boolean; + MaxLoyaltyLevelForAll: boolean; + GlobalLootChanceModifier: number; + TimeBeforeDeploy: number; + TimeBeforeDeployLocal: number; + LoadTimeSpeedProgress: number; + BaseLoadTime: number; + BaseUnloadTime: number; + BaseCheckTime: number; + Customization: Customization; + UncheckOnShot: boolean; + BotsEnabled: boolean; + ArmorMaterials: ArmorMaterials; + LegsOverdamage: number; + HandsOverdamage: number; + StomachOverdamage: number; + Health: Health; + rating: Rating; + tournament: Tournament; + RagFair: RagFair; + handbook: Handbook; + FractureCausedByFalling: Probability; + FractureCausedByBulletHit: Probability; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + Stamina: Stamina; + StaminaRestoration: StaminaRestoration; + StaminaDrain: StaminaDrain; + RequirementReferences: RequirementReferences; + RepairKitSettings: RepairKitSettings; + RestrictionsInRaid: RestrictionsInRaid[]; + SkillMinEffectiveness: number; + SkillFatiguePerPoint: number; + SkillFreshEffectiveness: number; + SkillFreshPoints: number; + SkillPointsBeforeFatigue: number; + SkillFatigueReset: number; + DiscardLimitsEnabled: boolean; + EventType: string[]; + WalkSpeed: xyz; + SprintSpeed: xyz; + SkillEnduranceWeightThreshold: number; + TeamSearchingTimeout: number; + Insurance: Insurance; + SkillExpPerLevel: number; + GameSearchingTimeout: number; + WallContusionAbsorption: xyz; + SkillsSettings: SkillsSettings; + AzimuthPanelShowsPlayerOrientation: boolean; + Aiming: Aiming; + Malfunction: Malfunction; + Overheat: Overheat; + FenceSettings: FenceSettings; + TestValue: number; + Inertia: Inertia; + Ballistic: Ballistic; +} +export interface Content { + ip: string; + port: number; + root: string; +} +export interface Exp { + heal: Heal; + match_end: MatchEnd; + kill: Kill; + level: Level; + loot_attempts: LootAttempt[]; + expForLockedDoorOpen: number; + expForLockedDoorBreach: number; + triggerMult: number; +} +export interface Heal { + expForHeal: number; + expForHydration: number; + expForEnergy: number; +} +export interface MatchEnd { + README: string; + survived_exp_requirement: number; + survived_seconds_requirement: number; + survived_exp_reward: number; + mia_exp_reward: number; + runner_exp_reward: number; + leftMult: number; + miaMult: number; + survivedMult: number; + runnerMult: number; + killedMult: number; +} +export interface Kill { + combo: Combo[]; + victimLevelExp: number; + headShotMult: number; + expOnDamageAllHealth: number; + longShotDistance: number; + bloodLossToLitre: number; + victimBotLevelExp: number; +} +export interface Combo { + percent: number; +} +export interface Level { + exp_table: ExpTable[]; + trade_level: number; + savage_level: number; + clan_level: number; + mastering1: number; + mastering2: number; +} +export interface ExpTable { + exp: number; +} +export interface LootAttempt { + k_exp: number; +} +export interface Armor { + class: Class[]; +} +export interface Class { + resistance: number; +} +export interface Mastering { + Name: string; + Templates: string[]; + Level2: number; + Level3: number; +} +export interface Customization { + SavageHead: SavageHead; + SavageBody: SavageBody; + SavageFeet: SavageFeet; + CustomizationVoice: CustomizationVoice[]; + BodyParts: BodyParts; +} +export interface SavageHead { + wild_head_1: WildHead; + wild_head_2: WildHead; + wild_head_3: WildHead; + Wild_Dealmaker_head: WildHead; + Wild_Killa_head: WildHead; + bear_head: WildHead; + bear_head_1: WildHead; + usec_head_1: WildHead; + Head_BOSS_Glukhar: WildHead; + Wild_Head_nonMesh: WildHead; + Head_BOSS_Sanitar: WildHead; + wild_head_drozd: WildHead; + wild_head_misha: WildHead; + head_cultist_01: WildHead; + head_cultist_02: WildHead; + head_cultist_03: WildHead; + DefaultUsecHead: WildHead; + usec_head_3: WildHead; + usec_head_4: WildHead; + usec_head_5: WildHead; +} +export interface WildHead { + head: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface SavageBody { + wild_body: WildBody; + wild_body_1: WildBody; + wild_body_2: WildBody; + wild_body_3: WildBody; + Wild_Dealmaker_body: WildBody; + wild_security_body_1: WildBody; + wild_security_body_2: WildBody; + wild_Killa_body: WildBody; + wild_pmcBot_body: WildBody; + wild_Shturman_body: WildBody; + wild_Gluhar_body: WildBody; + Tshirt_security_TshirtTatu_01: WildBody; + Tshirt_security_TshirtTatu_02: WildBody; + Top_security_Husky: WildBody; + Top_security_Gorka4: WildBody; + scav_kit_upper_meteor: WildBody; + wild_body_russia1: WildBody; + Top_BOSS_Sanitar: WildBody; + wild_body_motocross: WildBody; + top_cultist_01: WildBody; + top_cultist_02: WildBody; + wild_body_rainparka: WildBody; + wild_body_underarmour: WildBody; + top_boss_tagilla: WildBody; + DefaultUsecBody: WildBody; + usec_upper_acu: WildBody; + usec_upper_commando: WildBody; + usec_upper_aggressor: WildBody; + usec_upper_hoody: WildBody; + usec_upper_pcuironsight: WildBody; + usec_top_beltstaff: WildBody; + usec_upper_flexion: WildBody; + usec_upper_tier3: WildBody; + usec_upper_pcsmulticam: WildBody; + usec_upper_tier_2: WildBody; + usec_upper_infiltrator: WildBody; + user_upper_NightPatrol: WildBody; + wild_body_bomber: WildBody; + wild_top_yellowcoat: WildBody; +} +export interface WildBody { + body: string; + hands: string; + isNotRandom: boolean; +} +export interface SavageFeet { + wild_feet: WildFeet; + wild_feet_1: WildFeet; + wild_feet_2: WildFeet; + Wild_Dealmaker_feet: WildFeet; + wild_security_feet_1: WildFeet; + Wild_Killa_feet: WildFeet; + wild_pmcBot_feet: WildFeet; + Pants_BOSS_Glukhar: WildFeet; + Pants_BOSS_Shturman: WildFeet; + Pants_security_Gorka4: WildFeet; + Pants_security_Flora: WildFeet; + scav_kit_lower_sklon: WildFeet; + Pants_BOSS_Sanitar: WildFeet; + wild_feet_sweatpants: WildFeet; + wild_feet_wasatch: WildFeet; + wild_feet_slimPants: WildFeet; + pants_cultist_01: WildFeet; + pants_cultist_02: WildFeet; + wild_feet_scavelite_taclite: WildFeet; + pants_boss_tagilla: WildFeet; + wild_feet_bomber: WildFeet; + wild_pants_yellowcoat: WildFeet; +} +export interface WildFeet { + feet: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface CustomizationVoice { + voice: string; + side: string[]; + isNotRandom: boolean; +} +export interface BodyParts { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface ArmorMaterials { + UHMWPE: ArmorType; + Aramid: ArmorType; + Combined: ArmorType; + Titan: ArmorType; + Aluminium: ArmorType; + ArmoredSteel: ArmorType; + Ceramic: ArmorType; + Glass: ArmorType; +} +export interface ArmorType { + Destructibility: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + ExplosionDestructibility: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; +} +export interface Health { + Falling: Falling; + Effects: Effects; + HealPrice: HealPrice; + ProfileHealthSettings: ProfileHealthSettings; +} +export interface Falling { + DamagePerMeter: number; + SafeHeight: number; +} +export interface Effects { + Existence: Existence; + Dehydration: Dehydration; + BreakPart: BreakPart; + Contusion: Contusion; + Disorientation: Disorientation; + Exhaustion: Exhaustion; + LowEdgeHealth: LowEdgeHealth; + RadExposure: RadExposure; + Stun: Stun; + Intoxication: Intoxication; + Regeneration: Regeneration; + Wound: Wound; + Berserk: Berserk; + Flash: Flash; + MedEffect: MedEffect; + Pain: Pain; + PainKiller: PainKiller; + SandingScreen: SandingScreen; + Stimulator: Stimulator; + Tremor: Tremor; + ChronicStaminaFatigue: ChronicStaminaFatigue; + Fracture: Fracture2; + HeavyBleeding: HeavyBleeding2; + LightBleeding: LightBleeding2; + BodyTemperature: BodyTemperature; +} +export interface Existence { + EnergyLoopTime: number; + HydrationLoopTime: number; + EnergyDamage: number; + HydrationDamage: number; + DestroyedStomachEnergyTimeFactor: number; + DestroyedStomachHydrationTimeFactor: number; +} +export interface Dehydration { + DefaultDelay: number; + DefaultResidueTime: number; + BleedingHealth: number; + BleedingLoopTime: number; + BleedingLifeTime: number; + DamageOnStrongDehydration: number; + StrongDehydrationLoopTime: number; +} +export interface BreakPart { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface Contusion { + Dummy: number; +} +export interface Disorientation { + Dummy: number; +} +export interface Exhaustion { + DefaultDelay: number; + DefaultResidueTime: number; + Damage: number; + DamageLoopTime: number; +} +export interface LowEdgeHealth { + DefaultDelay: number; + DefaultResidueTime: number; + StartCommonHealth: number; +} +export interface RadExposure { + Damage: number; + DamageLoopTime: number; +} +export interface Stun { + Dummy: number; +} +export interface Intoxication { + DefaultDelay: number; + DefaultResidueTime: number; + DamageHealth: number; + HealthLoopTime: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovedAfterDeath: boolean; + HealExperience: number; + RemovePrice: number; +} +export interface Regeneration { + LoopTime: number; + MinimumHealthPercentage: number; + Energy: number; + Hydration: number; + BodyHealth: BodyHealth; + Influences: Influences; +} +export interface BodyHealth { + Head: BodyHealthValue; + Chest: BodyHealthValue; + Stomach: BodyHealthValue; + LeftArm: BodyHealthValue; + RightArm: BodyHealthValue; + LeftLeg: BodyHealthValue; + RightLeg: BodyHealthValue; +} +export interface BodyHealthValue { + Value: number; +} +export interface Influences { + LightBleeding: Influence; + HeavyBleeding: Influence; + Fracture: Influence; + RadExposure: Influence; + Intoxication: Influence; +} +export interface Influence { + HealthSlowDownPercentage: number; + EnergySlowDownPercentage: number; + HydrationSlowDownPercentage: number; +} +export interface Wound { + WorkingTime: number; + ThresholdMin: number; + ThresholdMax: number; +} +export interface Berserk { + DefaultDelay: number; + WorkingTime: number; + DefaultResidueTime: number; +} +export interface Flash { + Dummy: number; +} +export interface MedEffect { + LoopTime: number; + StartDelay: number; + DrinkStartDelay: number; + FoodStartDelay: number; + DrugsStartDelay: number; + MedKitStartDelay: number; + MedicalStartDelay: number; + StimulatorStartDelay: number; +} +export interface Pain { + TremorDelay: number; + HealExperience: number; +} +export interface PainKiller { + Dummy: number; +} +export interface SandingScreen { + Dummy: number; +} +export interface Stimulator { + BuffLoopTime: number; + Buffs: Buffs; +} +export interface Buffs { + BuffsSJ1TGLabs: Buff[]; + BuffsSJ6TGLabs: Buff[]; + BuffsPropital: Buff[]; + BuffsZagustin: Buff[]; + BuffseTGchange: Buff[]; + BuffsAdrenaline: Buff[]; + BuffsGoldenStarBalm: Buff[]; + Buffs_drink_aquamari: Buff[]; + Buffs_drink_maxenergy: Buff[]; + Buffs_drink_milk: Buff[]; + Buffs_drink_tarcola: Buff[]; + Buffs_drink_hotrod: Buff[]; + Buffs_drink_juice_army: Buff[]; + Buffs_drink_water: Buff[]; + Buffs_food_borodinskiye: Buff[]; + Buffs_food_condensed_milk: Buff[]; + Buffs_food_emelya: Buff[]; + Buffs_food_mayonez: Buff[]; + Buffs_food_mre: Buff[]; + Buffs_food_sugar: Buff[]; + Buffs_drink_vodka: Buff[]; + Buffs_drink_jack: Buff[]; + Buffs_drink_moonshine: Buff[]; + Buffs_drink_purewater: Buff[]; + Buffs_3bTG: Buff[]; + Buffs_AHF1M: Buff[]; + Buffs_L1: Buff[]; + Buffs_MULE: Buff[]; + Buffs_Meldonin: Buff[]; + Buffs_Obdolbos: Buff[]; + Buffs_P22: Buff[]; + Buffs_KultistsToxin: Buff[]; + Buffs_BodyTemperature: Buff[]; + Buffs_Antidote: Buff[]; + Buffs_melee_bleed: Buff[]; + Buffs_melee_blunt: Buff[]; + Buffs_hultafors: Buff[]; + Buffs_drink_vodka_BAD: Buff[]; + Buffs_food_alyonka: Buff[]; + Buffs_food_slippers: Buff[]; + Buffs_knife: Buff[]; +} +export interface Buff { + BuffType: string; + Chance: number; + Delay: number; + Duration: number; + Value: number; + AbsoluteValue: boolean; + SkillName: string; +} +export interface Tremor { + DefaultDelay: number; + DefaultResidueTime: number; +} +export interface ChronicStaminaFatigue { + EnergyRate: number; + WorkingTime: number; + TicksEvery: number; + EnergyRatePerStack: number; +} +export interface Fracture2 { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface HeavyBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface Probability { + FunctionType: string; + K: number; + B: number; + Threshold: number; +} +export interface LightBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface BodyTemperature { + DefaultBuildUpTime: number; + DefaultResidueTime: number; + LoopTime: number; +} +export interface HealPrice { + HealthPointPrice: number; + HydrationPointPrice: number; + EnergyPointPrice: number; + TrialLevels: number; + TrialRaids: number; +} +export interface ProfileHealthSettings { + BodyPartsSettings: BodyPartsSettings; + HealthFactorsSettings: HealthFactorsSettings; +} +export interface BodyPartsSettings { + Head: BodyPartsSetting; + Chest: BodyPartsSetting; + Stomach: BodyPartsSetting; + LeftArm: BodyPartsSetting; + RightArm: BodyPartsSetting; + LeftLeg: BodyPartsSetting; + RightLeg: BodyPartsSetting; +} +export interface BodyPartsSetting { + Minimum: number; + Maximum: number; + Default: number; + OverDamageReceivedMultiplier: number; +} +export interface HealthFactorsSettings { + Energy: HealthFactorSetting; + Hydration: HealthFactorSetting; + Temperature: HealthFactorSetting; + Poisoning: HealthFactorSetting; + Radiation: HealthFactorSetting; +} +export interface HealthFactorSetting { + Minimum: number; + Maximum: number; + Default: number; +} +export interface Rating { + levelRequired: number; + limit: number; + categories: Categories; +} +export interface Categories { + experience: boolean; + kd: boolean; + surviveRatio: boolean; + avgEarnings: boolean; + kills: boolean; + raidCount: boolean; + longestShot: boolean; + timeOnline: boolean; + inventoryFullCost: boolean; + ragFairStanding: boolean; +} +export interface Tournament { + categories: Categories2; + limit: number; + levelRequired: number; +} +export interface Categories2 { + dogtags: boolean; +} +export interface RagFair { + enabled: boolean; + priceStabilizerEnabled: boolean; + includePveTraderSales: boolean; + priceStabilizerStartIntervalInHours: number; + minUserLevel: number; + communityTax: number; + communityItemTax: number; + communityRequirementTax: number; + offerPriorityCost: number; + offerDurationTimeInHour: number; + offerDurationTimeInHourAfterRemove: number; + priorityTimeModifier: number; + maxRenewOfferTimeInHour: number; + renewPricePerHour: number; + maxActiveOfferCount: MaxActiveOfferCount[]; + balancerRemovePriceCoefficient: number; + balancerMinPriceCount: number; + balancerAveragePriceCoefficient: number; + delaySinceOfferAdd: number; + uniqueBuyerTimeoutInDays: number; + ratingSumForIncrease: number; + ratingIncreaseCount: number; + ratingSumForDecrease: number; + ratingDecreaseCount: number; + maxSumForIncreaseRatingPerOneSale: number; + maxSumForDecreaseRatingPerOneSale: number; + maxSumForRarity: MaxSumForRarity; + ChangePriceCoef: number; + balancerUserItemSaleCooldownEnabled: boolean; + balancerUserItemSaleCooldown: number; + youSellOfferMaxStorageTimeInHour: number; + yourOfferDidNotSellMaxStorageTimeInHour: number; + isOnlyFoundInRaidAllowed: boolean; + sellInOnePiece: number; +} +export interface MaxActiveOfferCount { + from: number; + to: number; + count: number; +} +export interface MaxSumForRarity { + Common: RarityMaxSum; + Rare: RarityMaxSum; + Superrare: RarityMaxSum; + Not_exist: RarityMaxSum; +} +export interface RarityMaxSum { + value: number; +} +export interface Handbook { + defaultCategory: string; +} +export interface Stamina { + Capacity: number; + SprintDrainRate: number; + BaseRestorationRate: number; + JumpConsumption: number; + GrenadeHighThrow: number; + GrenadeLowThrow: number; + AimDrainRate: number; + AimRangeFinderDrainRate: number; + OxygenCapacity: number; + OxygenRestoration: number; + WalkOverweightLimits: xyz; + BaseOverweightLimits: xyz; + SprintOverweightLimits: xyz; + WalkSpeedOverweightLimits: xyz; + CrouchConsumption: xyz; + WalkConsumption: xyz; + StandupConsumption: xyz; + TransitionSpeed: xyz; + SprintAccelerationLowerLimit: number; + SprintSpeedLowerLimit: number; + SprintSensitivityLowerLimit: number; + AimConsumptionByPose: xyz; + RestorationMultiplierByPose: xyz; + OverweightConsumptionByPose: xyz; + AimingSpeedMultiplier: number; + WalkVisualEffectMultiplier: number; + HandsCapacity: number; + HandsRestoration: number; + ProneConsumption: number; + BaseHoldBreathConsumption: number; + SoundRadius: xyz; + ExhaustedMeleeSpeed: number; + FatigueRestorationRate: number; + FatigueAmountToCreateEffect: number; + ExhaustedMeleeDamageMultiplier: number; + FallDamageMultiplier: number; + SafeHeightOverweight: number; + SitToStandConsumption: number; + StaminaExhaustionCausesJiggle: boolean; + StaminaExhaustionStartsBreathSound: boolean; + StaminaExhaustionRocksCamera: boolean; + HoldBreathStaminaMultiplier: xyz; + PoseLevelIncreaseSpeed: xyz; + PoseLevelDecreaseSpeed: xyz; + PoseLevelConsumptionPerNotch: xyz; +} +export interface StaminaRestoration { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface StaminaDrain { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface RequirementReferences { + Alpinist: Alpinist[]; +} +export interface Alpinist { + Requirement: string; + Id: string; + Count: number; + RequiredSlot: string; + RequirementTip: string; +} +export interface RestrictionsInRaid { + TemplateId: string; + Value: number; +} +export interface Insurance { + MaxStorageTimeInHour: number; +} +export interface SkillsSettings { + SkillProgressRate: number; + WeaponSkillProgressRate: number; + WeaponSkillRecoilBonusPerLevel: number; + HideoutManagement: HideoutManagement; + Crafting: Crafting; + Metabolism: Metabolism; + Immunity: Immunity; + Endurance: Endurance; + Strength: Strength; + Vitality: Vitality; + Health: Health2; + StressResistance: StressResistance; + Throwing: Throwing; + RecoilControl: RecoilControl; + Pistol: WeaponSkills; + Revolver: WeaponSkills; + SMG: any[]; + Assault: WeaponSkills; + Shotgun: WeaponSkills; + Sniper: WeaponSkills; + LMG: any[]; + HMG: any[]; + Launcher: any[]; + AttachedLauncher: any[]; + Melee: any[]; + DMR: WeaponSkills; + BearAssaultoperations: any[]; + BearAuthority: any[]; + BearAksystems: any[]; + BearHeavycaliber: any[]; + BearRawpower: any[]; + UsecArsystems: any[]; + UsecDeepweaponmodding_Settings: any[]; + UsecLongrangeoptics_Settings: any[]; + UsecNegotiations: any[]; + UsecTactics: any[]; + BotReload: any[]; + CovertMovement: CovertMovement; + FieldMedicine: any[]; + Search: Search; + Sniping: any[]; + ProneMovement: any[]; + FirstAid: any[]; + LightVests: ArmorSkills; + HeavyVests: ArmorSkills; + WeaponModding: any[]; + AdvancedModding: any[]; + NightOps: any[]; + SilentOps: any[]; + Lockpicking: any[]; + WeaponTreatment: WeaponTreatment; + MagDrills: MagDrills; + Freetrading: any[]; + Auctions: any[]; + Cleanoperations: any[]; + Barter: any[]; + Shadowconnections: any[]; + Taskperformance: any[]; + Perception: Perception; + Intellect: Intellect; + Attention: Attention; + Charisma: Charisma; + Memory: Memory; + Surgery: Surgery; + AimDrills: AimDrills; + BotSound: any[]; + TroubleShooting: TroubleShooting; +} +export interface ArmorSkills { + WearAmountRepairLVestsReducePerLevel: number; + WearChanceRepairLVestsReduceEliteLevel: number; +} +export interface HideoutManagement { + SkillPointsPerAreaUpgrade: number; + SkillPointsPerCraft: number; + ConsumptionReductionPerLevel: number; + SkillBoostPercent: number; + SkillPointsRate: SkillPointsRate; + EliteSlots: EliteSlots; +} +export interface SkillPointsRate { + Generator: Generator; + AirFilteringUnit: SkillPointRate; + WaterCollector: SkillPointRate; + SolarPower: SkillPointRate; +} +export interface SkillPointRate { + ResourceSpent: number; + PointsGained: number; +} +export interface EliteSlots { + Generator: EliteSlot; + AirFilteringUnit: EliteSlot; + WaterCollector: EliteSlot; + BitcoinFarm: EliteSlot; +} +export interface EliteSlot { + Slots: number; + Container: number; +} +export interface Crafting { + PointsPerCraftingCycle: number; + CraftingCycleHours: number; + PointsPerUniqueCraftCycle: number; + UniqueCraftsPerCycle: number; + CraftTimeReductionPerLevel: number; + ProductionTimeReductionPerLevel: number; + EliteExtraProductions: number; + CraftingPointsToInteligence: number; +} +export interface Metabolism { + HydrationRecoveryRate: number; + EnergyRecoveryRate: number; + IncreasePositiveEffectDurationRate: number; + DecreaseNegativeEffectDurationRate: number; + DecreasePoisonDurationRate: number; +} +export interface Immunity { + ImmunityMiscEffects: number; + ImmunityPoisonBuff: number; + ImmunityPainKiller: number; + HealthNegativeEffect: number; + StimulatorNegativeBuff: number; +} +export interface Endurance { + MovementAction: number; + SprintAction: number; + GainPerFatigueStack: number; +} +export interface Strength { + SprintActionMin: number; + SprintActionMax: number; + MovementActionMin: number; + MovementActionMax: number; + PushUpMin: number; + PushUpMax: number; + FistfightAction: number; + ThrowAction: number; +} +export interface Vitality { + DamageTakenAction: number; + HealthNegativeEffect: number; +} +export interface Health2 { + SkillProgress: number; +} +export interface StressResistance { + HealthNegativeEffect: number; + LowHPDuration: number; +} +export interface Throwing { + ThrowAction: number; +} +export interface RecoilControl { + RecoilAction: number; + RecoilBonusPerLevel: number; +} +export interface WeaponSkills { + WeaponReloadAction: number; + WeaponShotAction: number; + WeaponFixAction: number; + WeaponChamberAction: number; +} +export interface CovertMovement { + MovementAction: number; +} +export interface Search { + SearchAction: number; + FindAction: number; +} +export interface WeaponTreatment { + DurLossReducePerLevel: number; + SkillPointsPerRepair: number; + Filter: any[]; + WearAmountRepairGunsReducePerLevel: number; + WearChanceRepairGunsReduceEliteLevel: number; +} +export interface MagDrills { + RaidLoadedAmmoAction: number; + RaidUnloadedAmmoAction: number; + MagazineCheckAction: number; +} +export interface Perception { + OnlineAction: number; + UniqueLoot: number; +} +export interface Intellect { + ExamineAction: number; + SkillProgress: number; + RepairAction: number; + WearAmountReducePerLevel: number; + WearChanceReduceEliteLevel: number; + RepairPointsCostReduction: number; +} +export interface Attention { + ExamineWithInstruction: number; + FindActionFalse: number; + FindActionTrue: number; +} +export interface Charisma { + SkillProgressInt: number; + SkillProgressAtn: number; + SkillProgressPer: number; +} +export interface Memory { + AnySkillUp: number; + SkillProgress: number; +} +export interface Surgery { + SurgeryAction: number; + SkillProgress: number; +} +export interface AimDrills { + WeaponShotAction: number; +} +export interface TroubleShooting { + MalfRepairSpeedBonusPerLevel: number; + SkillPointsPerMalfFix: number; + EliteDurabilityChanceReduceMult: number; + EliteAmmoChanceReduceMult: number; + EliteMagChanceReduceMult: number; +} +export interface Aiming { + ProceduralIntensityByPose: xyz; + AimProceduralIntensity: number; + HeavyWeight: number; + LightWeight: number; + MaxTimeHeavy: number; + MinTimeHeavy: number; + MaxTimeLight: number; + MinTimeLight: number; + RecoilScaling: number; + RecoilDamping: number; + CameraSnapGlobalMult: number; + RecoilXIntensityByPose: xyz; + RecoilYIntensityByPose: xyz; + RecoilZIntensityByPose: xyz; + RecoilCrank: boolean; + RecoilHandDamping: number; + RecoilConvergenceMult: number; + RecoilVertBonus: number; + RecoilBackBonus: number; +} +export interface Malfunction { + AmmoMalfChanceMult: number; + MagazineMalfChanceMult: number; + MalfRepairHardSlideMult: number; + MalfRepairOneHandBrokenMult: number; + MalfRepairTwoHandsBrokenMult: number; + AllowMalfForBots: boolean; + ShowGlowAttemptsCount: number; + OutToIdleSpeedMultForPistol: number; + IdleToOutSpeedMultOnMalf: number; + TimeToQuickdrawPistol: number; + DurRangeToIgnoreMalfs: xyz; + DurFeedWt: number; + DurMisfireWt: number; + DurJamWt: number; + DurSoftSlideWt: number; + DurHardSlideMinWt: number; + DurHardSlideMaxWt: number; + AmmoMisfireWt: number; + AmmoFeedWt: number; + AmmoJamWt: number; + OverheatFeedWt: number; + OverheatJamWt: number; + OverheatSoftSlideWt: number; + OverheatHardSlideMinWt: number; + OverheatHardSlideMaxWt: number; +} +export interface Overheat { + MinOverheat: number; + MaxOverheat: number; + OverheatProblemsStart: number; + ModHeatFactor: number; + ModCoolFactor: number; + MinWearOnOverheat: number; + MaxWearOnOverheat: number; + MinWearOnMaxOverheat: number; + MaxWearOnMaxOverheat: number; + OverheatWearLimit: number; + MaxCOIIncreaseMult: number; + MinMalfChance: number; + MaxMalfChance: number; + DurReduceMinMult: number; + DurReduceMaxMult: number; + BarrelMoveRndDuration: number; + BarrelMoveMaxMult: number; + FireratePitchMult: number; + FirerateReduceMinMult: number; + FirerateReduceMaxMult: number; + FirerateOverheatBorder: number; + EnableSlideOnMaxOverheat: boolean; + StartSlideOverheat: number; + FixSlideOverheat: number; + AutoshotMinOverheat: number; + AutoshotChance: number; + AutoshotPossibilityDuration: number; + MaxOverheatCoolCoef: number; +} +export interface FenceSettings { + FenceId: string; + Levels: Record; + paidExitStandingNumerator: number; +} +export interface FenceLevel { + SavageCooldownModifier: number; + ScavCaseTimeModifier: number; + PaidExitCostModifier: number; + BotFollowChance: number; + ScavEquipmentSpawnChanceModifier: number; + PriceModifier: number; + HostileBosses: boolean; + HostileScavs: boolean; + ScavAttackSupport: boolean; + ExfiltrationPriceModifier: number; + AvailableExits: number; +} +export interface Inertia { + InertiaLimits: xyz; + InertiaLimitsStep: number; + ExitMovementStateSpeedThreshold: xyz; + WalkInertia: xyz; + FallThreshold: number; + SpeedLimitAfterFallMin: xyz; + SpeedLimitAfterFallMax: xyz; + SpeedLimitDurationMin: xyz; + SpeedLimitDurationMax: xyz; + SpeedInertiaAfterJump: xyz; + BaseJumpPenaltyDuration: number; + DurationPower: number; + BaseJumpPenalty: number; + PenaltyPower: number; + InertiaTiltCurveMin: xyz; + InertiaTiltCurveMax: xyz; + InertiaBackwardCoef: xyz; + TiltInertiaMaxSpeed: xyz; + TiltStartSideBackSpeed: xyz; + TiltMaxSideBackSpeed: xyz; + TiltAcceleration: xyz; + AverageRotationFrameSpan: number; + SprintSpeedInertiaCurveMin: xyz; + SprintSpeedInertiaCurveMax: xyz; + SprintBrakeInertia: xyz; + SprintTransitionMotionPreservation: xyz; + WeaponFlipSpeed: xyz; + PreSprintAccelerationLimits: xyz; + SprintAccelerationLimits: xyz; + SideTime: xyz; + DiagonalTime: xyz; + MinDirectionBlendTime: number; + MoveTime: number; + MinMovementAccelerationRangeRight: xyz; + MaxMovementAccelerationRangeRight: xyz; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Ballistic { + GlobalDamageDegradationCoefficient: number; +} +export interface RepairKitSettings { + armorClassDivisor: number; + durabilityPointCostArmor: number; + durabilityPointCostGuns: number; +} +export interface BotPreset { + UseThis: boolean; + Role: string; + BotDifficulty: string; + VisibleAngle: number; + VisibleDistance: number; + ScatteringPerMeter: number; + HearingSense: number; + SCATTERING_DIST_MODIF: number; + MAX_AIMING_UPGRADE_BY_TIME: number; + FIRST_CONTACT_ADD_SEC: number; + COEF_IF_MOVE: number; +} +export interface BotWeaponScattering { + Name: string; + PriorityScatter1meter: number; + PriorityScatter10meter: number; + PriorityScatter100meter: number; +} +export interface Preset { + _id: string; + _type: string; + _changeWeaponName: boolean; + _name: string; + _parent: string; + _items: Item[]; + _encyclopedia?: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocation.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocation.d.ts new file mode 100644 index 0000000..42fac06 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocation.d.ts @@ -0,0 +1,6 @@ +import { ILocationBase } from "./ILocationBase"; +import { ILooseLoot } from "./ILooseLoot"; +export interface ILocation { + base: ILocationBase; + looseLoot: ILooseLoot; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocationBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocationBase.d.ts new file mode 100644 index 0000000..ad48d32 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocationBase.d.ts @@ -0,0 +1,198 @@ +export interface ILocationBase { + AccessKeys: string[]; + AirdropParameters: AirdropParameter[]; + Area: number; + AveragePlayTime: number; + AveragePlayerLevel: number; + Banners: Banner[]; + BossLocationSpawn: BossLocationSpawn[]; + BotAssault: number; + BotEasy: number; + BotHard: number; + BotImpossible: number; + BotLocationModifier: BotLocationModifier; + BotMarksman: number; + BotMax: number; + BotMaxPlayer: number; + BotMaxTimePlayer: number; + BotNormal: number; + BotSpawnTimeOffMax: number; + BotSpawnTimeOffMin: number; + BotSpawnTimeOnMax: number; + BotSpawnTimeOnMin: number; + BotStart: number; + BotStop: number; + Description: string; + DisabledForScav: boolean; + DisabledScavExits: string; + Enabled: boolean; + GlobalLootChanceModifier: number; + IconX: number; + IconY: number; + Id: string; + Insurance: boolean; + IsSecret: boolean; + Locked: boolean; + Loot: any[]; + MaxBotPerZone: number; + MaxDistToFreePoint: number; + MaxPlayers: number; + MinDistToExitPoint: number; + MinDistToFreePoint: number; + MinMaxBots: MinMaxBot[]; + MinPlayers: number; + Name: string; + NewSpawn: boolean; + OcculsionCullingEnabled: boolean; + OldSpawn: boolean; + OpenZones: string; + Preview: Preview; + RequiredPlayerLevel: number; + Rules: string; + SafeLocation: boolean; + Scene: Scene; + SpawnPointParams: SpawnPointParam[]; + UnixDateTime: number; + _Id: string; + doors: any[]; + escape_time_limit: number; + exit_access_time: number; + exit_count: number; + exit_time: number; + exits: Exit[]; + filter_ex: string[]; + limits: ILimit[]; + matching_min_seconds: number; + maxItemCountInLocation: MaxItemCountInLocation[]; + sav_summon_seconds: number; + tmp_location_field_remove_me: number; + users_gather_seconds: number; + users_spawn_seconds_n: number; + users_spawn_seconds_n2: number; + users_summon_seconds: number; + waves: Wave[]; +} +export interface ILimit { + min: number; + max: number; + items: any[]; +} +export interface AirdropParameter { + AirdropPointDeactivateDistance: number; + MinPlayersCountToSpawnAirdrop: number; + PlaneAirdropChance: number; + PlaneAirdropCooldownMax: number; + PlaneAirdropCooldownMin: number; + PlaneAirdropEnd: number; + PlaneAirdropMax: number; + PlaneAirdropStartMax: number; + PlaneAirdropStartMin: number; + UnsuccessfulTryPenalty: number; +} +export interface Banner { + id: string; + pic: Pic; +} +export interface Pic { + path: string; + rcid: string; +} +export interface BossLocationSpawn { + BossChance: number; + BossDifficult: string; + BossEscortAmount: string; + BossEscortDifficult: string; + BossEscortType: string; + BossName: string; + BossPlayer: boolean; + BossZone: string; + Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; +} +export interface BossSupport { + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; +} +export interface BotLocationModifier { + AccuracySpeed: number; + DistToActivate: number; + DistToPersueAxemanCoef: number; + DistToSleep: number; + GainSight: number; + KhorovodChance: number; + MagnetPower: number; + MarksmanAccuratyCoef: number; + Scattering: number; + VisibleDistance: number; +} +export interface MinMaxBot { + WildSpawnType: string; + max: number; + min: number; +} +export interface Preview { + path: string; + rcid: string; +} +export interface Scene { + path: string; + rcid: string; +} +export interface SpawnPointParam { + BotZoneName: string; + Categories: string[]; + ColliderParams: ColliderParams; + DelayToCanSpawnSec: number; + Id: string; + Infiltration: string; + Position: xyz; + Rotation: number; + Sides: string[]; +} +export interface ColliderParams { + _parent: string; + _props: Props; +} +export interface Props { + Center: xyz; + Radius: number; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Exit { + Chance: number; + Count: number; + EntryPoints: string; + ExfiltrationTime: number; + ExfiltrationType: string; + Id: string; + MaxTime: number; + MinTime: number; + Name: string; + PassageRequirement: string; + PlayersCount: number; + RequirementTip: string; +} +export interface MaxItemCountInLocation { + TemplateId: string; + Value: number; +} +export interface Wave { + BotPreset: string; + BotSide: string; + SpawnPoints: string; + WildSpawnType: string; + isPlayers: boolean; + number: number; + slots_max: number; + slots_min: number; + time_max: number; + time_min: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts new file mode 100644 index 0000000..7f8d915 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts @@ -0,0 +1,9 @@ +import { ILocations } from "../../spt/server/ILocations"; +export interface ILocationsGenerateAllResponse { + locations: ILocations; + paths: Path[]; +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILooseLoot.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILooseLoot.d.ts new file mode 100644 index 0000000..14b795e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/ILooseLoot.d.ts @@ -0,0 +1,45 @@ +export interface ILooseLoot { + spawnpointCount: SpawnpointCount; + spawnpointsForced: SpawnpointsForced[]; + spawnpoints: Spawnpoint[]; +} +export interface SpawnpointCount { + mean: number; + std: number; +} +export interface SpawnpointsForced { + locationId: string; + probability: number; + template: SpawnpointTemplate; +} +export interface SpawnpointTemplate { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: Item[]; +} +export interface Item { + _id: string; + _tpl?: string; +} +export interface Spawnpoint { + locationId: string; + probability: number; + template: SpawnpointTemplate; + itemDistribution: ItemDistribution[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IMetricsTableData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IMetricsTableData.d.ts new file mode 100644 index 0000000..873ef82 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IMetricsTableData.d.ts @@ -0,0 +1,7 @@ +export interface IMetricsTableData { + Keys: number[]; + NetProcessingBins: number[]; + RenderBins: number[]; + GameUpdateBins: number[]; + MemoryMeasureInterval: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IPmcData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IPmcData.d.ts new file mode 100644 index 0000000..adc2aa5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/IPmcData.d.ts @@ -0,0 +1,341 @@ +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +import { IPmcDataRepeatableQuest } from "./tables/IRepeatableQuests"; +import { Item, Upd } from "./tables/IItem"; +import { HideoutAreas } from "../../enums/HideoutAreas"; +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IPmcData { + _id: string; + aid: string; + savage: string; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: Record; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: InsuredItem[]; + Hideout: Hideout; + Bonuses: Bonus[]; + Notes: Notes; + Quests: Quest[]; + TradersInfo: Record; + RagfairInfo: RagfairInfo; + WishList: string[]; + RepeatableQuests: IPmcDataRepeatableQuest[]; + CarExtractCounts: CarExtractCounts; + SurvivorClass: SurvivorClass; +} +export declare enum SurvivorClass { + Unknown = 0, + Neutralizer = 1, + Marauder = 2, + Paramedic = 3, + Survivor = 4 +} +export interface Info { + EntryPoint: string; + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: MemberCategory; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + IsStreamerModeAvailable: boolean; + Bans: IBan[]; + BannedState: boolean; + BannedUntil: number; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface IBan { + type: BanType; + dateTime: number; +} +export declare enum BanType { + Chat = 0, + RagFair = 1, + Voip = 2, + Trading = 3, + Online = 4, + Friends = 5, + ChangeNickname = 6 +} +export interface Notes { + Notes: Note[]; +} +export interface Note { + Time: number; + Text: string; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { + Hydration: CurrentMax; + Energy: CurrentMax; + Temperature: CurrentMax; + BodyParts: BodyPartsHealth; + UpdateTime: number; +} +export interface BodyPartsHealth { + Head: BodyPartHealth; + Chest: BodyPartHealth; + Stomach: BodyPartHealth; + LeftArm: BodyPartHealth; + RightArm: BodyPartHealth; + LeftLeg: BodyPartHealth; + RightLeg: BodyPartHealth; +} +export interface BodyPartHealth { + Health: CurrentMax; + Effects?: Record; +} +export interface CurrentMax { + Current: number; + Maximum: number; +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: Common[]; + Mastering: Mastering[]; + Bonuses?: any[]; + Points: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession: number; + LastAccess: number; +} +export interface Mastering { + Id: string; + Progress: number; +} +export interface Stats { + CarriedQuestItems: string[]; + Victims: Victim[]; + TotalSessionExperience: number; + LastSessionDate: number; + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; + SessionExperienceMult?: number; + ExperienceBonusMult?: number; + Aggressor?: Aggressor; + DroppedItems?: IDroppedItem[]; + FoundInRaidItems?: FoundInRaidItem[]; + DamageHistory?: DamageHistory; + DeathCause?: DeathCause; + LastPlayerState?: LastPlayerState; + TotalInGameTime: number; + SurvivorClass?: string; +} +export interface IDroppedItem { + QuestId: string; + ItemId: string; + ZoneId: string; +} +export interface FoundInRaidItem { + QuestId: string; + ItemId: string; +} +export interface Victim { + AccountId: string; + ProfileId: string; + Name: string; + Side: string; + BodyPart: string; + Time: string; + Distance: number; + Level: number; + Weapon: string; + Role: string; +} +export interface SessionCounters { + Items: CounterKeyValue[]; +} +export interface OverallCounters { + Items: CounterKeyValue[]; +} +export interface CounterKeyValue { + Key: string[]; + Value: number; +} +export interface Aggressor { + AccountId: string; + ProfileId: string; + MainProfileNickname: string; + Name: string; + Side: string; + BodyPart: string; + HeadSegment: string; + WeaponName: string; + Category: string; +} +export interface DamageHistory { + LethalDamagePart: string; + LethalDamage: LethalDamage; + BodyParts: BodyPartsDamageHistory; +} +export interface LethalDamage { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface BodyPartsDamageHistory { + Head: DamageStats[]; + Chest: DamageStats[]; + Stomach: DamageStats[]; + LeftArm: DamageStats[]; + RightArm: DamageStats[]; + LeftLeg: DamageStats[]; + RightLeg: DamageStats[]; + Common: DamageStats[]; +} +export interface DamageStats { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface DeathCause { + DamageType: string; + Side: string; + Role: string; + WeaponId: string; +} +export interface LastPlayerState { + Info: LastPlayerStateInfo; + Customization: Record; + Equipment: any; +} +export interface LastPlayerStateInfo { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; +} +export interface ConditionCounters { + Counters: Counter[]; +} +export interface Counter { + id: string; + value: number; + qid: string; +} +export interface BackendCounter { + id: string; + qid?: string; + value: number; +} +export interface InsuredItem { + tid: string; + itemId: string; +} +export interface Hideout { + Production: Record; + Areas: HideoutArea[]; +} +export interface Productive { + Products: Product[]; + Progress?: number; + inProgress?: boolean; + StartTimestamp?: number; +} +export interface Product { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface ScavCase extends Productive { +} +export interface Production extends Productive { + RecipeId: string; + SkipTime: number; + ProductionTime: number; +} +export interface HideoutArea { + type: HideoutAreas; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: HideoutSlot[]; + lastRecipe: string; +} +export interface HideoutSlot { + item: HideoutItem[]; +} +export interface HideoutItem { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface Bonus { + type: string; + templateId?: string; + passive?: boolean; + production?: boolean; + visible?: boolean; + value?: number; + icon?: string; +} +export interface Quest { + qid: string; + startTime: number; + status: string; + statusTimers?: StatusTimer; + completedConditions?: string[]; +} +export interface StatusTimer { + AvailableForStart?: number; +} +export interface TraderInfo { + loyaltyLevel: number; + salesSum: number; + standing: number; + nextResupply: number; + unlocked: boolean; +} +export interface RagfairInfo { + rating: number; + isRatingGrowing: boolean; + offers: IRagfairOffer[]; +} +export interface CarExtractCounts { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/MemberCategory.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts new file mode 100644 index 0000000..7303275 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts @@ -0,0 +1,9 @@ +export interface IBaseInteractionRequestData { + Action: string; + fromOwner?: OwnerInfo; + toOwner?: OwnerInfo; +} +export interface OwnerInfo { + id: string; + type: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotBase.d.ts new file mode 100644 index 0000000..677fd49 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotBase.d.ts @@ -0,0 +1,101 @@ +import { BackendCounter, Bonus } from "../IPmcData"; +import { Item } from "./IItem"; +export interface IBotBase { + _id: string; + aid: string; + savage: any; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: any; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: any[]; + Hideout: Hideout; + Bonuses: Bonus[]; +} +export interface Info { + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: number; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + NeedWipeOptions: any[]; + lastCompletedWipe: any; + BannedState: boolean; + BannedUntil: number; + IsStreamerModeAvailable: boolean; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: any[]; + Mastering: any[]; + Points: number; +} +export interface Stats { + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; +} +export interface SessionCounters { + Items: any[]; +} +export interface OverallCounters { + Items: any[]; +} +export interface ConditionCounters { + Counters: any[]; +} +export interface Hideout { + Production: Production; + Areas: Area[]; +} +export interface Production { +} +export interface Area { + type: number; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: any[]; + lastRecipe: any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotCore.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotCore.d.ts new file mode 100644 index 0000000..16a782d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotCore.d.ts @@ -0,0 +1,133 @@ +export interface IBotCore { + SAVAGE_KILL_DIST: number; + SOUND_DOOR_BREACH_METERS: number; + SOUND_DOOR_OPEN_METERS: number; + STEP_NOISE_DELTA: number; + JUMP_NOISE_DELTA: number; + GUNSHOT_SPREAD: number; + GUNSHOT_SPREAD_SILENCE: number; + BASE_WALK_SPEREAD2: number; + MOVE_SPEED_COEF_MAX: number; + SPEED_SERV_SOUND_COEF_A: number; + SPEED_SERV_SOUND_COEF_B: number; + G: number; + STAY_COEF: number; + SIT_COEF: number; + LAY_COEF: number; + MAX_ITERATIONS: number; + START_DIST_TO_COV: number; + MAX_DIST_TO_COV: number; + STAY_HEIGHT: number; + CLOSE_POINTS: number; + COUNT_TURNS: number; + SIMPLE_POINT_LIFE_TIME_SEC: number; + DANGER_POINT_LIFE_TIME_SEC: number; + DANGER_POWER: number; + COVER_DIST_CLOSE: number; + GOOD_DIST_TO_POINT: number; + COVER_TOOFAR_FROM_BOSS: number; + COVER_TOOFAR_FROM_BOSS_SQRT: number; + MAX_Y_DIFF_TO_PROTECT: number; + FLARE_POWER: number; + MOVE_COEF: number; + PRONE_POSE: number; + LOWER_POSE: number; + MAX_POSE: number; + FLARE_TIME: number; + MAX_REQUESTS__PER_GROUP: number; + UPDATE_GOAL_TIMER_SEC: number; + DIST_NOT_TO_GROUP: number; + DIST_NOT_TO_GROUP_SQR: number; + LAST_SEEN_POS_LIFETIME: number; + DELTA_GRENADE_START_TIME: number; + DELTA_GRENADE_END_TIME: number; + DELTA_GRENADE_RUN_DIST: number; + DELTA_GRENADE_RUN_DIST_SQRT: number; + PATROL_MIN_LIGHT_DIST: number; + HOLD_MIN_LIGHT_DIST: number; + STANDART_BOT_PAUSE_DOOR: number; + ARMOR_CLASS_COEF: number; + SHOTGUN_POWER: number; + RIFLE_POWER: number; + PISTOL_POWER: number; + SMG_POWER: number; + SNIPE_POWER: number; + GESTUS_PERIOD_SEC: number; + GESTUS_AIMING_DELAY: number; + GESTUS_REQUEST_LIFETIME: number; + GESTUS_FIRST_STAGE_MAX_TIME: number; + GESTUS_SECOND_STAGE_MAX_TIME: number; + GESTUS_MAX_ANSWERS: number; + GESTUS_FUCK_TO_SHOOT: number; + GESTUS_DIST_ANSWERS: number; + GESTUS_DIST_ANSWERS_SQRT: number; + GESTUS_ANYWAY_CHANCE: number; + TALK_DELAY: number; + CAN_SHOOT_TO_HEAD: boolean; + CAN_TILT: boolean; + TILT_CHANCE: number; + MIN_BLOCK_DIST: number; + MIN_BLOCK_TIME: number; + COVER_SECONDS_AFTER_LOSE_VISION: number; + MIN_ARG_COEF: number; + MAX_ARG_COEF: number; + DEAD_AGR_DIST: number; + MAX_DANGER_CARE_DIST_SQRT: number; + MAX_DANGER_CARE_DIST: number; + MIN_MAX_PERSON_SEARCH: number; + PERCENT_PERSON_SEARCH: number; + LOOK_ANYSIDE_BY_WALL_SEC_OF_ENEMY: number; + CLOSE_TO_WALL_ROTATE_BY_WALL_SQRT: number; + SHOOT_TO_CHANGE_RND_PART_MIN: number; + SHOOT_TO_CHANGE_RND_PART_MAX: number; + SHOOT_TO_CHANGE_RND_PART_DELTA: number; + FORMUL_COEF_DELTA_DIST: number; + FORMUL_COEF_DELTA_SHOOT: number; + FORMUL_COEF_DELTA_FRIEND_COVER: number; + SUSPETION_POINT_DIST_CHECK: number; + MAX_BASE_REQUESTS_PER_PLAYER: number; + MAX_HOLD_REQUESTS_PER_PLAYER: number; + MAX_GO_TO_REQUESTS_PER_PLAYER: number; + MAX_COME_WITH_ME_REQUESTS_PER_PLAYER: number; + CORE_POINT_MAX_VALUE: number; + CORE_POINTS_MAX: number; + CORE_POINTS_MIN: number; + BORN_POISTS_FREE_ONLY_FAREST_BOT: boolean; + BORN_POINSTS_FREE_ONLY_FAREST_PLAYER: boolean; + SCAV_GROUPS_TOGETHER: boolean; + LAY_DOWN_ANG_SHOOT: number; + HOLD_REQUEST_TIME_SEC: number; + TRIGGERS_DOWN_TO_RUN_WHEN_MOVE: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING_OTHER_ENEMIS: number; + MIN_DIST_TO_STOP_RUN: number; + JUMP_SPREAD_DIST: number; + LOOK_TIMES_TO_KILL: number; + COME_INSIDE_TIMES: number; + TOTAL_TIME_KILL: number; + TOTAL_TIME_KILL_AFTER_WARN: number; + MOVING_AIM_COEF: number; + VERTICAL_DIST_TO_IGNORE_SOUND: number; + DEFENCE_LEVEL_SHIFT: number; + MIN_DIST_CLOSE_DEF: number; + USE_ID_PRIOR_WHO_GO: boolean; + SMOKE_GRENADE_RADIUS_COEF: number; + GRENADE_PRECISION: number; + MAX_WARNS_BEFORE_KILL: number; + CARE_ENEMY_ONLY_TIME: number; + MIDDLE_POINT_COEF: number; + MAIN_TACTIC_ONLY_ATTACK: boolean; + LAST_DAMAGE_ACTIVE: number; + SHALL_DIE_IF_NOT_INITED: boolean; + CHECK_BOT_INIT_TIME_SEC: number; + WEAPON_ROOT_Y_OFFSET: number; + DELTA_SUPRESS_DISTANCE_SQRT: number; + DELTA_SUPRESS_DISTANCE: number; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + WAVE_ONLY_AS_ONLINE: boolean; + LOCAL_BOTS_COUNT: number; + AXE_MAN_KILLS_END: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotType.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotType.d.ts new file mode 100644 index 0000000..01be0be --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IBotType.d.ts @@ -0,0 +1,176 @@ +export interface IBotType { + appearance: Appearance; + chances: Chances; + difficulty: Difficulties; + experience: Experience; + firstName: string[]; + generation: Generation; + health: Health; + inventory: Inventory; + lastName: string[]; + skills: Skills; +} +export interface Appearance { + body: string[]; + feet: string[]; + hands: string[]; + head: string[]; + voice: string[]; +} +export interface Chances { + equipment: EquipmentChances; + mods: ModsChances; +} +export interface EquipmentChances { + ArmBand: number; + ArmorVest: number; + Backpack: number; + Earpiece: number; + Eyewear: number; + FaceCover: number; + FirstPrimaryWeapon: number; + Headwear: number; + Holster: number; + Pockets: number; + Scabbard: number; + SecondPrimaryWeapon: number; + SecuredContainer: number; + TacticalVest: number; +} +export interface ModsChances { + mod_charge: number; + mod_equipment: number; + mod_equipment_000: number; + mod_equipment_001: number; + mod_equipment_002: number; + mod_flashlight: number; + mod_foregrip: number; + mod_launcher: number; + mod_magazine: number; + mod_mount: number; + mod_mount_000: number; + mod_mount_001: number; + mod_muzzle: number; + mod_nvg: number; + mod_pistol_grip: number; + mod_reciever: number; + mod_scope: number; + mod_sight_front: number; + mod_sight_rear: number; + mod_stock: number; + mod_stock_000: number; + mod_stock_akms: number; + mod_tactical: number; + mod_tactical_000: number; + mod_tactical_001: number; + mod_tactical_002: number; + mod_tactical_003: number; +} +export interface Difficulties { + easy: Difficulty; + normal: Difficulty; + hard: Difficulty; + impossible: Difficulty; +} +export interface Difficulty { + Aiming: Record; + Boss: Record; + Change: Record; + Core: Record; + Cover: Record; + Grenade: Record; + Hearing: Record; + Lay: Record; + Look: Record; + Mind: Record; + Move: Record; + Patrol: Record; + Scattering: Record; + Shoot: Record; +} +export interface Experience { + aggressorBonus: number; + level: MinMax; + reward: MinMax; + standingForKill: number; +} +export interface Generation { + items: ItemMinMax; +} +export interface ItemMinMax { + grenades: MinMax; + healing: MinMax; + drugs: MinMax; + stims: MinMax; + looseLoot: MinMax; + magazines: MinMax; + specialItems: MinMax; +} +export interface Health { + BodyParts: BodyPart[]; + Energy: MinMax; + Hydration: MinMax; + Temperature: MinMax; +} +export interface BodyPart { + Chest: MinMax; + Head: MinMax; + LeftArm: MinMax; + LeftLeg: MinMax; + RightArm: MinMax; + RightLeg: MinMax; + Stomach: MinMax; +} +export interface MinMax { + max: number; + min: number; +} +export interface Inventory { + equipment: Equipment; + items: Items; + mods: Mods; +} +export interface Equipment { + ArmBand: Record; + ArmorVest: Record; + Backpack: Record; + Earpiece: Record; + Eyewear: Record; + FaceCover: Record; + FirstPrimaryWeapon: Record; + Headwear: Record; + Holster: Record; + Pockets: Record; + Scabbard: Record; + SecondPrimaryWeapon: Record; + SecuredContainer: Record; + TacticalVest: Record; +} +export interface Items { + Backpack: string[]; + Pockets: string[]; + SecuredContainer: string[]; + SpecialLoot: string[]; + TacticalVest: string[]; +} +export declare type Mods = Record>; +export interface Skills { + Common: Common[]; + Bonuses?: any; + Mastering: Mastering[]; + Points: number; +} +export interface Mastering { + Id: string; + Progress: number; + max?: number; + min?: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession?: number; + LastAccess?: number; + max?: number; + min?: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts new file mode 100644 index 0000000..8bfeece --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts @@ -0,0 +1,33 @@ +export interface ICustomizationItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Side: string[]; + BodyPart: string; + AvailableAsDefault?: boolean; + Body: string; + Hands: string; + Feet: string; + Prefab: Prefab; + WatchPrefab: Prefab; + IntegratedArmorVest: boolean; + WatchPosition: Xyz; + WatchRotation: Xyz; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Xyz { + x: number; + y: number; + z: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts new file mode 100644 index 0000000..7d7db07 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts @@ -0,0 +1,16 @@ +export interface IHandbookBase { + Categories: Category[]; + Items: HandbookItem[]; +} +export interface Category { + Id: string; + ParentId?: string; + Icon: string; + Color: string; + Order: string; +} +export interface HandbookItem { + Id: string; + ParentId: string; + Price: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IItem.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IItem.d.ts new file mode 100644 index 0000000..2dd2c03 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IItem.d.ts @@ -0,0 +1,108 @@ +export interface Item { + _id: string; + _tpl: string; + parentId?: string; + slotId?: string; + location?: Location | number; + upd?: Upd; +} +export interface Upd { + OriginalStackObjectsCount?: number; + Togglable?: Togglable; + Map?: Map; + Tag?: Tag; + sptPresetId?: string; + FaceShield?: FaceShield; + StackObjectsCount?: number; + UnlimitedCount?: boolean; + Repairable?: Repairable; + FireMode?: FireMode; + SpawnedInSession?: boolean; + Light?: Light; + Key?: Key; + Resource?: Resource; + Sight?: Sight; + MedKit?: MedKit; + FoodDrink?: FoodDrink; + Dogtag?: Dogtag; + BuyRestrictionMax?: number; + BuyRestrictionCurrent?: number; + Foldable?: Foldable; + SideEffect?: SideEffect; + RepairKit?: RepairKit; +} +export interface Togglable { + On: boolean; +} +export interface Map { + Markers: MapMarker[]; +} +export interface MapMarker { + X: number; + Y: number; +} +export interface Tag { + Color: number; + Name: string; +} +export interface FaceShield { + Hits: number; +} +export interface Repairable { + Durability: number; + MaxDurability: number; +} +export interface MedKit { + HpResource: number; +} +export interface Sight { + ScopesCurrentCalibPointIndexes: number[]; + ScopesSelectedModes: number[]; + SelectedScope: number; +} +export interface Foldable { + Folded: boolean; +} +export interface FireMode { + FireMode: string; +} +export interface FoodDrink { + HpPercent: number; +} +export interface Key { + NumberOfUsages: number; +} +export interface Resource { + Value: number; + UnitsConsumed: number; +} +export interface Light { + IsActive: boolean; + SelectedMode: number; +} +export interface Dogtag { + AccountId: string; + ProfileId: string; + Nickname: string; + Side: string; + Level: number; + Time: string; + Status: string; + KillerAccountId: string; + KillerProfileId: string; + KillerName: string; + WeaponName: string; +} +export interface Location { + x: number; + y: number; + r: string | number; + isSearched?: boolean; + rotation?: string; +} +export interface SideEffect { + Value: number; +} +export interface RepairKit { + Resource: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts new file mode 100644 index 0000000..2c96af3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts @@ -0,0 +1,10 @@ +export interface ILocationsBase { + locations: Locations; + paths: Path[]; +} +export interface Locations { +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ILootBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ILootBase.d.ts new file mode 100644 index 0000000..e4baac5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ILootBase.d.ts @@ -0,0 +1,64 @@ +import { Item } from "./IItem"; +export interface ILootBase { + staticAmmo: Record; + staticContainers: Record; + staticLoot: Record; +} +export interface IStaticAmmoDetails { + tpl: string; + relativeProbability: number; +} +export interface IStaticContainerDetails { + staticWeapons: IStaticWeaponProps[]; + staticContainers: IStaticContainerProps[]; + staticForced: IStaticForcedProps[]; +} +export interface IStaticWeaponProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: string; + Items: Item[]; +} +export interface IStaticContainerProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: StaticItem[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StaticItem { + _id: any; + _tpl: string; +} +export interface IStaticForcedProps { + containerId: string; + itemTpl: string; +} +export interface IStaticLootDetails { + itemcountDistribution: ItemCountDistribution[]; + itemDistribution: ItemDistribution[]; +} +export interface ItemCountDistribution { + count: number; + relativeProbability: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IQuest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IQuest.d.ts new file mode 100644 index 0000000..e1fc888 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IQuest.d.ts @@ -0,0 +1,110 @@ +import { Item } from "./IItem"; +export interface IQuest { + QuestName: string; + _id: string; + canShowNotificationsInGame: boolean; + conditions: Conditions; + description: string; + failMessageText: string; + name: string; + note: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + startedMessageText: string; + successMessageText: string; + templateId: string; + rewards: Rewards; + status: string; + KeyQuest: boolean; + changeQuestMessageText: string; +} +export interface Conditions { + Started: AvailableForConditions[]; + AvailableForFinish: AvailableForConditions[]; + AvailableForStart: AvailableForConditions[]; + Success: AvailableForConditions[]; + Fail: AvailableForConditions[]; +} +export interface AvailableForConditions { + _parent: string; + _props: AvailableForProps; + dynamicLocale: boolean; +} +export interface AvailableForProps { + id: string; + index: number; + parentId: string; + dynamicLocale: boolean; + value?: number; + compareMethod?: string; + visibilityConditions?: VisibilityCondition[]; + target?: string | string[]; + status?: number[]; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; +} +export interface AvailableForCounter { + id: string; + conditions: CounterCondition[]; +} +export interface CounterCondition { + _parent: string; + _props: CounterProps; +} +export interface CounterProps { + id: string; + target: string[] | string; + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; +} +export interface DaytimeCounter { + from: number; + to: number; +} +export interface VisibilityCondition { + id: string; + value: number; + dynamicLocale: boolean; + oneSessionOnly: boolean; +} +export interface Rewards { + AvailableForStart: Reward[]; + AvailableForFinish: Reward[]; + Started: Reward[]; + Success: Reward[]; + Fail: Reward[]; + FailRestartable: Reward[]; + Expired: Reward[]; +} +export interface Reward { + value?: string; + id: string; + type: string; + index: number; + target?: string; + items?: Item[]; + loyaltyLevel?: number; + traderId?: string; + unknown?: boolean; + findInRaid?: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts new file mode 100644 index 0000000..e23ec73 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts @@ -0,0 +1,219 @@ +import { Item } from "./IItem"; +export interface IReward { + index: number; + type: string; + value: number; + target?: string; + items?: Item[]; +} +export interface IRepeatableQuestDatabase { + templates: ITemplates; + rewards: IRewardOptions; + data: IOptions; + samples: ISampleQuests[]; +} +export interface ITemplates { + Elimination: IRepeatableQuest; + Completion: IRepeatableQuest; + Exploration: IRepeatableQuest; +} +export interface IPmcDataRepeatableQuest { + id?: string; + name: string; + activeQuests: IRepeatableQuest[]; + inactiveQuests: IRepeatableQuest[]; + endTime: number; + changeRequirement: TChangeRequirementRecord; +} +export declare type TChangeRequirementRecord = Record; +export interface IChangeRequirement { + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IChangeCost { + templateId: string; + count: number; +} +export interface IRepeatableQuest { + _id: any; + traderId: string; + location: any; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + changeQuestMessageText: string; + templateId: string; + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IRewards { + Started: IReward[]; + Success: IReward[]; + Fail: IReward[]; +} +export interface IConditions { + AvailableForStart: any[]; + AvailableForFinish: IAvailableFor[]; + Fail: any[]; +} +export interface IAvailableFor { + _props: IAvailableForProps; + _parent: string; + dynamicLocale: boolean; +} +export interface IAvailableForProps { + id: string; + parentId: string; + dynamicLocale: boolean; + index: number; + visibilityConditions: IVisibilityCondition[]; + value: number; +} +export interface IVisibilityCondition { + id: string; + oneSessionOnly: boolean; + value: number; + index: number; + dynamicLocale: boolean; +} +export interface IAvailableForPropsCounter extends IAvailableForProps { + type: string; + oneSessionOnly: boolean; + doNotResetIfCounterCompleted: boolean; + counter: ICounter; +} +export interface ICounter { + id: string; + conditions: ICondition[]; +} +export interface ICondition { + _props: IConditionProps; + _parent: string; +} +export interface IConditionProps { + id: string; + dynamicLocale: boolean; +} +export interface IElimination extends IRepeatableQuest { + conditions: IEliminationConditions; +} +export interface IEliminationConditions extends IConditions { + AvailableForFinish: IEliminationAvailableFor[]; +} +export interface IEliminationAvailableFor extends IAvailableFor { + _props: IEliminationAvailableForProps; +} +export interface IEliminationAvailableForProps extends IAvailableForPropsCounter { + counter: IEliminationCounter; +} +export interface IEliminationCounter extends ICounter { + conditions: IEliminationCondition[]; +} +export interface IEliminationCondition extends ICondition { + _props: ILocationConditionProps | IKillConditionProps; +} +export interface IExploration extends IRepeatableQuest { + conditions: IExplorationConditions; +} +export interface IExplorationConditions extends IConditions { + AvailableForFinish: IExplorationAvailableFor[]; +} +export interface IExplorationAvailableFor extends IAvailableFor { + _props: IExplorationAvailableForProps; +} +export interface IExplorationAvailableForProps extends IAvailableForPropsCounter { + counter: IExplorationCounter; +} +export interface IExplorationCounter extends ICounter { + conditions: IExplorationCondition[]; +} +export interface IExplorationCondition extends ICondition { + _props: ILocationConditionProps | IExitStatusConditionProps | IExitNameConditionProps; +} +export interface ICompletion extends IRepeatableQuest { + conditions: ICompletionConditions; +} +export interface ICompletionConditions extends IConditions { + AvailableForFinish: ICompletionAvailableFor[]; +} +export interface ICompletionAvailableFor extends IAvailableFor { + _props: ICompletionAvailableForProps; +} +export interface ICompletionAvailableForProps extends IAvailableForProps { + target: string[]; + minDurability: number; + maxDurability: number; + dogtagLevel: number; + onlyFoundInRaid: boolean; +} +export interface ILocationConditionProps extends IConditionProps { + target: string[]; +} +export interface IKillConditionProps extends IConditionProps { + target: string; + value: number; + savageRole?: string[]; + bodyPart?: string[]; + distance?: IDistanceCheck; +} +export interface IDistanceCheck { + compareMethod: string; + value: number; +} +export interface IExitStatusConditionProps extends IConditionProps { + status: string[]; +} +export interface IExitNameConditionProps extends IConditionProps { + exitName: string; +} +export interface IRewardOptions { + itemsBlacklist: string[]; +} +export interface IOptions { + Completion: ICompletionFilter; +} +export interface ICompletionFilter { + itemsBlacklist: ItemsBlacklist[]; + itemsWhitelist: ItemsWhitelist[]; +} +export interface ItemsBlacklist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ItemsWhitelist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ISampleQuests { + _id: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + templateId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts new file mode 100644 index 0000000..c2ba762 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts @@ -0,0 +1,401 @@ +export interface ITemplateItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Weight: number; + BackgroundColor: string; + Width: number; + Height: number; + StackMaxSize: number; + Rarity?: string; + SpawnChance?: number; + CreditsPrice?: number; + ItemSound: string; + Prefab: Prefab; + UsePrefab: Prefab; + StackObjectsCount: number; + NotShownInSlot: boolean; + ExaminedByDefault: boolean; + ExamineTime: number; + IsUndiscardable: boolean; + IsUnsaleable: boolean; + IsUnbuyable: boolean; + IsUngivable: boolean; + IsLockedafterEquip: boolean; + QuestItem: boolean; + LootExperience: number; + ExamineExperience: number; + HideEntrails: boolean; + RepairCost: number; + RepairSpeed: number; + ExtraSizeLeft: number; + ExtraSizeRight: number; + ExtraSizeUp: number; + ExtraSizeDown: number; + ExtraSizeForceAdd: boolean; + MergesWithChildren: boolean; + CanSellOnRagfair: boolean; + CanRequireOnRagfair: boolean; + ConflictingItems: string[]; + DiscardLimit: number; + Unlootable: boolean; + UnlootableFromSlot: string; + UnlootableFromSide: string[]; + AnimationVariantsNumber: number; + DiscardingBlock: boolean; + RagFairCommissionModifier: number; + IsAlwaysAvailableForInsurance: boolean; + Grids: Grid[]; + Slots: Slot[]; + CanPutIntoDuringTheRaid: boolean; + CantRemoveFromSlotsDuringRaid: string[]; + weapClass: string; + weapUseType: string; + ammoCaliber: string; + Durability: number; + MaxDurability: number; + OperatingResource: number; + RepairComplexity: number; + durabSpawnMin: number; + durabSpawnMax: number; + isFastReload: boolean; + RecoilForceUp: number; + RecoilForceBack: number; + Convergence: number; + RecoilAngle: number; + weapFireType: string[]; + RecolDispersion: number; + SingleFireRate: number; + CanQueueSecondShot: boolean; + bFirerate: number; + Ergonomics: number; + Velocity: number; + bEffDist: number; + bHearDist: number; + isChamberLoad: boolean; + chamberAmmoCount: number; + isBoltCatch: boolean; + defMagType: string; + defAmmo: string; + AdjustCollimatorsToTrajectory: boolean; + shotgunDispersion: number; + Chambers: Chamber[]; + CameraRecoil: number; + CameraSnap: number; + ReloadMode: string; + CenterOfImpact: number; + AimPlane: number; + DeviationCurve: number; + DeviationMax: number; + Foldable: boolean; + Retractable: boolean; + TacticalReloadStiffnes: Xyz; + TacticalReloadFixation: number; + RecoilCenter: Xyz; + RotationCenter: Xyz; + RotationCenterNoStock: Xyz; + SizeReduceRight: number; + FoldedSlot: string; + CompactHandling: boolean; + SightingRange: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; + IronSightRange: number; + MustBoltBeOpennedForExternalReload: boolean; + MustBoltBeOpennedForInternalReload: boolean; + BoltAction: boolean; + HipAccuracyRestorationDelay: number; + HipAccuracyRestorationSpeed: number; + HipInnaccuracyGain: number; + ManualBoltCatch: boolean; + BurstShotsCount: number; + BaseMalfunctionChance: number; + AllowJam: boolean; + AllowFeed: boolean; + AllowMisfire: boolean; + AllowSlide: boolean; + DurabilityBurnRatio: number; + HeatFactorGun: number; + CoolFactorGun: number; + CoolFactorGunMods: number; + HeatFactorByShot: number; + AllowOverheat: boolean; + DoubleActionAccuracyPenalty: number; + RecoilPosZMult: number; + ShotgunDispersion: number; + StackMinRandom: number; + StackMaxRandom: number; + StackSlots: StackSlot[]; + SearchSound: string; + BlocksArmorVest: boolean; + RigLayoutName: string; + armorZone: string[]; + armorClass: number; + speedPenaltyPercent: number; + mousePenalty: number; + weaponErgonomicPenalty: number; + BluntThroughput: number; + ArmorMaterial: string; + medUseTime: number; + medEffectType: string; + MaxHpResource: number; + hpResourceRate: number; + StimulatorBuffs: string; + effects_health: EffectsHealth; + effects_damage: EffectsDamage; + knifeHitDelay: number; + knifeHitSlashRate: number; + knifeHitStabRate: number; + knifeHitRadius: number; + knifeHitSlashDam: number; + knifeHitStabDam: number; + knifeDurab: number; + PrimaryDistance: number; + SecondryDistance: number; + SlashPenetration: number; + StabPenetration: number; + PrimaryConsumption: number; + SecondryConsumption: number; + DeflectionConsumption: number; + MaxResource: number; + AppliedTrunkRotation: Xyz; + AppliedHeadRotation: Xyz; + DisplayOnModel: boolean; + AdditionalAnimationLayer: number; + StaminaBurnRate: number; + ColliderScaleMultiplier: Xyz; + ammoType: string; + InitialSpeed: number; + BallisticCoeficient: number; + BulletMassGram: number; + BulletDiameterMilimeters: number; + Damage: number; + ammoAccr: number; + ammoRec: number; + ammoDist: number; + buckshotBullets: number; + PenetrationPower: number; + PenetrationPowerDiviation: number; + ammoHear: number; + ammoSfx: string; + MisfireChance: number; + MinFragmentsCount: number; + MaxFragmentsCount: number; + ammoShiftChance: number; + casingName: string; + casingEjectPower: number; + casingMass: number; + casingSounds: string; + ProjectileCount: number; + PenetrationChance: number; + RicochetChance: number; + FragmentationChance: number; + Deterioration: number; + SpeedRetardation: number; + Tracer: boolean; + TracerColor: string; + TracerDistance: number; + ArmorDamage: number; + Caliber: string; + StaminaBurnPerDamage: number; + HeavyBleedingDelta: number; + LightBleedingDelta: number; + ShowBullet: boolean; + HasGrenaderComponent: boolean; + FuzeArmTimeSec: number; + ExplosionStrength: number; + MinExplosionDistance: number; + MaxExplosionDistance: number; + FragmentsCount: number; + FragmentType: string; + ShowHitEffectOnExplode: boolean; + ExplosionType: string; + AmmoLifeTimeSec: number; + Contusion: Contusion; + ArmorDistanceDistanceDamage: Xyz; + Blindness: Xyz; + IsLightAndSoundShot: boolean; + LightAndSoundShotAngle: number; + LightAndSoundShotSelfContusionTime: number; + LightAndSoundShotSelfContusionStrength: number; + MalfMisfireChance: number; + DurabilityBurnModificator: number; + HeatFactor: number; + MalfFeedChance: number; + Accuracy: number; + Recoil: number; + Loudness: number; + EffectiveDistance: number; + RaidModdable: boolean; + ToolModdable: boolean; + BlocksFolding: boolean; + BlocksCollapsible: boolean; + IsAnimated: boolean; + HasShoulderContact: boolean; + DoubleActionAccuracyPenaltyMult: number; + magAnimationIndex: number; + Cartridges: Cartridge[]; + CanFast: boolean; + CanHit: boolean; + CanAdmin: boolean; + LoadUnloadModifier: number; + CheckTimeModifier: number; + CheckOverride: number; + ReloadMagType: string; + VisibleAmmoRangesString: string; + MalfunctionChance: number; + TagColor: number; + TagName: string; + MaximumNumberOfUsage: number; + CustomAimPlane: string; + sightModType: string; + aimingSensitivity: number; + SightModesCount: number; + OpticCalibrationDistances: number[]; + ScopesCount: number; + AimSensitivity: number[][]; + ModesCount: number[]; + Zooms: number[][]; + CalibrationDistances: number[][]; + Intensity: number; + Mask: string; + MaskSize: number; + NoiseIntensity: number; + NoiseScale: number; + Color: Color; + DiffuseIntensity: number; + HasHinge: boolean; + Resource?: number; + CoolFactor?: number; + foodUseTime?: number; + foodEffectType?: string; + MaxRepairResource: number; + RepairQuality: number; + RepairType: string; + TargetItemFilter: string[]; + apResource: number; + krResource: number; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Grid { + _name: string; + _id: string; + _parent: string; + _props: GridProps; + _proto: string; +} +export interface GridProps { + filters: GridFilter[]; + cellsH: number; + cellsV: number; + minCount: number; + maxCount: number; + maxWeight: number; + isSortingTable: boolean; +} +export interface GridFilter { + Filter: string[]; + ExcludedFilter: string[]; +} +export interface Slot { + _name: string; + _id: string; + _parent: string; + _props: SlotProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface SlotProps { + filters: Filter[]; +} +export interface Chamber { + _name: string; + _id: string; + _parent: string; + _props: ChamberProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface ChamberProps { + filters: FilterProps[]; +} +export interface FilterProps { + Filter: string[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StackSlot { + _name?: string; + _id: string; + _sptTpl: string; + parent: string; + location: any; + slotId: string; + _max_count: number; + _props?: StackSlotProps; + _proto?: string; + upd: any; +} +export interface StackSlotProps { + filters: Filter[]; +} +export interface EffectsHealth { + Hydration: Hydration; +} +export interface Hydration { + value: number; +} +export interface EffectsDamage { + Pain: Pain; + Contusion: Contusion; +} +export interface Pain { + delay: number; + duration: number; + fadeOut: number; +} +export interface Contusion { + delay: number; + duration: number; + fadeOut: number; +} +export interface Cartridge { + _name: string; + _id: string; + _parent: string; + _max_count: number; + _props: CartridgeProps; + _proto: string; +} +export interface CartridgeProps { + filters: Filter[]; +} +export interface Filter { + Shift?: number; + Filter: string[]; + AnimationIndex?: number; +} +export interface Color { + r: number; + g: number; + b: number; + a: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ITrader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ITrader.d.ts new file mode 100644 index 0000000..f0fe2b5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/common/tables/ITrader.d.ts @@ -0,0 +1,90 @@ +import { Item } from "./IItem"; +export interface ITrader { + assort: ITraderAssort; + base: ITraderBase; + dialogue?: Record; + questassort: Record>; + suits?: ISuit[]; +} +export interface ITraderBase { + refreshAssort: boolean; + _id: string; + avatar: string; + balance_dol: number; + balance_eur: number; + balance_rub: number; + buyer_up: boolean; + currency: string; + customization_seller: boolean; + discount: number; + discount_end: number; + gridHeight: number; + insurance: Insurance; + location: string; + loyaltyLevels: LoyaltyLevel[]; + medic: boolean; + name: string; + nextResupply: number; + nickname: string; + repair: Repair; + sell_category: string[]; + surname: string; + unlockedByDefault: boolean; +} +export interface Insurance { + availability: boolean; + excluded_category: string[]; + max_return_hour: number; + max_storage_time: number; + min_payment: number; + min_return_hour: number; +} +export interface LoyaltyLevel { + buy_price_coef: number; + exchange_price_coef: number; + heal_price_coef: number; + insurance_price_coef: number; + minLevel: number; + minSalesSum: number; + minStanding: number; + repair_price_coef: number; +} +export interface Repair { + availability: boolean; + currency: string; + currency_coefficient: number; + excluded_category: string[]; + excluded_id_list: any[]; + quality: string; +} +export interface ITraderAssort { + nextResupply?: number; + items: Item[]; + barter_scheme: Record; + loyal_level_items: Record; +} +export interface IBarterScheme { + count: number; + _tpl: string; + onlyFunctional?: boolean; +} +export interface ISuit { + _id: string; + tid: string; + suiteId: string; + isActive: boolean; + requirements: Requirements; +} +export interface Requirements { + loyaltyLevel: number; + profileLevel: number; + standing: number; + skillRequirements: string[]; + questRequirements: string[]; + itemRequirements: ItemRequirement[]; +} +export interface ItemRequirement { + count: number; + _tpl: string; + onlyFunctional: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts new file mode 100644 index 0000000..d19b70d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IBuyClothingRequestData { + Action: "CustomizationBuy"; + offer: string; + items: ClothingItem[]; +} +export interface ClothingItem { + del: boolean; + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts new file mode 100644 index 0000000..122d9cf --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IWearClothingRequestData { + Action: "CustomizationWear"; + suites: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts new file mode 100644 index 0000000..9c326ac --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IFriendRequestData { + to: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts new file mode 100644 index 0000000..53d8289 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetAllAttachmentsRequestData { + dialogId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts new file mode 100644 index 0000000..076d414 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts @@ -0,0 +1,6 @@ +import { Message } from "../profile/IAkiProfile"; +export interface IGetAllAttachmentsResponse { + messages: Message[]; + profiles: any[]; + hasMessagesWithRewards: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts new file mode 100644 index 0000000..8f1beac --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetChatServerListRequestData { + VersionId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts new file mode 100644 index 0000000..1d0c0e8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts @@ -0,0 +1,16 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IGetFriendListDataResponse { + Friends: Friend[]; + Ignore: any[]; + InIgnoreList: any[]; +} +export interface Friend { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; + MemberCategory: MemberCategory; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts new file mode 100644 index 0000000..eed84b1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMailDialogInfoRequestData { + dialogId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts new file mode 100644 index 0000000..f8fbf5d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMailDialogListRequestData { + limit: number; + offset: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts new file mode 100644 index 0000000..43d416e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface IGetMailDialogViewRequestData { + type: MessageType; + dialogId: string; + limit: number; + time: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts new file mode 100644 index 0000000..4f8b946 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../common/IPmcData"; +import { Message } from "../profile/IAkiProfile"; +export interface IGetMailDialogViewResponseData { + messages: Message[]; + profiles: IPmcData[]; + hasMessagesWithRewards: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts new file mode 100644 index 0000000..57b8a00 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IPinDialogRequestData { + dialogId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts new file mode 100644 index 0000000..874b828 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IRemoveDialogRequestData { + dialogId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts new file mode 100644 index 0000000..dd79deb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface ISendMessageRequest { + dialogId: string; + type: MessageType; + text: string; + replyTo: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts new file mode 100644 index 0000000..2076232 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISetDialogReadRequestData { + dialogs: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IGameConfigResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IGameConfigResponse.d.ts new file mode 100644 index 0000000..eb37a39 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IGameConfigResponse.d.ts @@ -0,0 +1,19 @@ +export interface IGameConfigResponse { + aid: string; + lang: string; + languages: Record; + ndaFree: boolean; + taxonomy: number; + activeProfileId: string; + backend: Backend; + utc_time: number; + totalInGame: number; + reportAvailable: boolean; + twitchEventMember: boolean; +} +export interface Backend { + Trading: string; + Messaging: string; + Main: string; + RagFair: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts new file mode 100644 index 0000000..a3ecad9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGameEmptyCrcRequestData { + crc: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts new file mode 100644 index 0000000..0aa0fed --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts @@ -0,0 +1,11 @@ +export interface IVersionValidateRequestData { + version: Version; + develop: boolean; +} +export interface Version { + major: string; + minor: string; + game: string; + backend: string; + taxonomy: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts new file mode 100644 index 0000000..7fb80a8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts @@ -0,0 +1,29 @@ +export interface IHealthTreatmentRequestData { + Action: "RestoreHealth"; + trader: string; + items: Item[]; + difference: Difference; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} +export interface Difference { + BodyParts: BodyParts; + Energy: number; + Hydration: number; +} +export interface BodyParts { + Head: BodyPart; + Chest: BodyPart; + Stomach: BodyPart; + LeftArm: BodyPart; + RightArm: BodyPart; + LeftLeg: BodyPart; + RightLeg: BodyPart; +} +export interface BodyPart { + Health: number; + Effects: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts new file mode 100644 index 0000000..8e2b6c3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts @@ -0,0 +1,7 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidEatRequestData extends IBaseInteractionRequestData { + Action: "Eat"; + item: string; + count: number; + time: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts new file mode 100644 index 0000000..c242300 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts @@ -0,0 +1,18 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidHealRequestData extends IBaseInteractionRequestData { + Action: "Heal"; + item: string; + part: BodyPart; + count: number; + time: number; +} +export declare enum BodyPart { + Head = 0, + Chest = 1, + Stomach = 2, + LeftArm = 3, + RightArm = 4, + LeftLeg = 5, + RightLeg = 6, + Common = 7 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts new file mode 100644 index 0000000..20e32f6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts @@ -0,0 +1,21 @@ +export interface ISyncHealthRequestData { + Health: Health; + IsAlive: boolean; + Hydration?: number; + Energy?: number; + Temperature?: number; +} +export interface Health { + Head?: BodyPartHealth; + Chest?: BodyPartHealth; + Stomach?: BodyPartHealth; + LeftArm?: BodyPartHealth; + RightArm?: BodyPartHealth; + LeftLeg?: BodyPartHealth; + RightLeg?: BodyPartHealth; +} +export interface BodyPartHealth { + Maximum: number; + Current: number; + Effects: Record; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts new file mode 100644 index 0000000..10f851b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreasEnum { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..8583e8d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface HideoutUpgradeCompleteRequestData { + Action: string; + areaType: number; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutArea.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutArea.d.ts new file mode 100644 index 0000000..d9fd2bf --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutArea.d.ts @@ -0,0 +1,40 @@ +export interface IHideoutArea { + _id: string; + type: number; + enabled: boolean; + needsFuel: boolean; + takeFromSlotLocked: boolean; + craftGivesExp: boolean; + stages: Record; +} +export interface Stage { + requirements: Requirement[]; + bonuses: StageBonus[]; + slots: number; + constructionTime: number; + description: string; +} +export interface Requirement { + areaType?: number; + requiredLevel?: number; + type: string; + templateId?: string; + count?: number; + isFunctional?: boolean; + traderId?: string; + loyaltyLevel?: number; + skillName?: string; + skillLevel?: number; +} +export interface StageBonus { + value: number; + passive: boolean; + production: boolean; + visible: boolean; + skillType?: string; + type: string; + filter?: string[]; + icon?: string; + id?: string; + templateId?: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts new file mode 100644 index 0000000..dba83eb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutContinousProductionStartRequestData { + Action: "HideoutContinuousProductionStart"; + recipeId: string; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts new file mode 100644 index 0000000..ce878be --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts @@ -0,0 +1,20 @@ +export interface IHideoutProduction { + _id: string; + areaType: number; + requirements: Requirement[]; + productionTime: number; + boosters: any; + endProduct: string; + continuous: boolean; + count: number; + productionLimitCount: number; +} +export interface Requirement { + templateId?: string; + count?: number; + isFunctional?: boolean; + type: string; + areaType?: number; + requiredLevel?: number; + resource?: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts new file mode 100644 index 0000000..8326c55 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutPutItemInRequestData { + Action: "HideoutPutItemsInAreaSlots"; + areaType: number; + items: Record; + timestamp: number; +} +export interface ItemDetails { + count: number; + id: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts new file mode 100644 index 0000000..25abcf3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts @@ -0,0 +1,21 @@ +export interface IHideoutScavCase { + _id: string; + ProductionTime: number; + Requirements: Requirement[]; + EndProducts: EndProducts; +} +export interface Requirement { + templateId: string; + count: number; + isFunctional: boolean; + type: string; +} +export interface EndProducts { + Common: MinMax; + Rare: MinMax; + Superrare: MinMax; +} +export interface MinMax { + min: string; + max: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts new file mode 100644 index 0000000..72fda86 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts @@ -0,0 +1,15 @@ +export interface IHideoutScavCaseStartRequestData { + Action: "HideoutScavCaseProductionStart"; + recipeId: string; + items: HideoutItem[]; + tools: Tool[]; + timestamp: number; +} +export interface HideoutItem { + id: string; + count: number; +} +export interface Tool { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts new file mode 100644 index 0000000..8e45939 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutSettingsBase { + generatorSpeedWithoutFuel: number; + generatorFuelFlowRate: number; + airFilterUnitFlowRate: number; + gpuBoostRate: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts new file mode 100644 index 0000000..1ed542a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutSingleProductionStartRequestData { + Action: "HideoutSingleProductionStart"; + recipeId: string; + items: Item[]; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts new file mode 100644 index 0000000..83a740a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutTakeItemOutRequestData { + Action: "HideoutTakeItemsFromAreaSlots"; + areaType: number; + slots: number[]; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts new file mode 100644 index 0000000..a6847ef --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutTakeProductionRequestData { + Action: "HideoutTakeProduction"; + recipeId: string; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts new file mode 100644 index 0000000..cdea513 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutToggleAreaRequestData { + Action: "HideoutToggleArea"; + areaType: number; + enabled: boolean; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..545311e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutUpgradeCompleteRequestData { + Action: "HideoutUpgradeComplete"; + areaType: number; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts new file mode 100644 index 0000000..dfbfdca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutUpgradeRequestData { + Action: "HideoutUpgrade"; + areaType: number; + items: HideoutItem[]; + timestamp: number; +} +export interface HideoutItem { + count: number; + id: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts new file mode 100644 index 0000000..b5dc5c1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts @@ -0,0 +1,5 @@ +export interface IGetBodyResponseData { + err: number; + errmsg: any; + (data: Type): Type; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts new file mode 100644 index 0000000..a3ae838 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts @@ -0,0 +1,5 @@ +export interface INullResponseData { + err: number; + errmsg: any; + data: null; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts new file mode 100644 index 0000000..e2d9cf1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IRegisterPlayerRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts new file mode 100644 index 0000000..6930261 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../common/IPmcData"; +import { ISyncHealthRequestData } from "../health/ISyncHealthRequestData"; +export interface ISaveProgressRequestData { + exit: string; + profile: IPmcData; + isPlayerScav: boolean; + health: ISyncHealthRequestData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts new file mode 100644 index 0000000..0e32e96 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetInsuranceCostRequestData { + traders: string[]; + items: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts new file mode 100644 index 0000000..f657bb7 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts @@ -0,0 +1,6 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInsureRequestData extends IBaseInteractionRequestData { + Action: "Insure"; + tid: string; + items: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts new file mode 100644 index 0000000..53db97a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IAddItemRequestData { + tid: string; + items: any[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts new file mode 100644 index 0000000..462e0de --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts @@ -0,0 +1,6 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryAddRequestData extends IInventoryBaseActionRequestData { + Action: "Add"; + item: string; + container: Container; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts new file mode 100644 index 0000000..b45e459 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts @@ -0,0 +1,27 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInventoryBaseActionRequestData extends IBaseInteractionRequestData { +} +export interface To { + id: string; + container: string; + location?: ToLocation | number; +} +export interface ToLocation { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} +export interface Container { + id: string; + container: string; + location: Location | number; +} +export interface Location { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts new file mode 100644 index 0000000..ff35066 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryBindRequestData extends IInventoryBaseActionRequestData { + Action: "Bind"; + item: string; + index: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts new file mode 100644 index 0000000..1e1ecef --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts @@ -0,0 +1,12 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryCreateMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "CreateMapMarker"; + item: string; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts new file mode 100644 index 0000000..0657e1b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryDeleteMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "DeleteMapMarker"; + item: string; + X: number; + Y: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts new file mode 100644 index 0000000..e2857e1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts @@ -0,0 +1,14 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryEditMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "EditMapMarker"; + item: string; + X: number; + Y: number; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts new file mode 100644 index 0000000..614711f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts @@ -0,0 +1,10 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryExamineRequestData extends IInventoryBaseActionRequestData { + Action: "Examine"; + item: string; + fromOwner: IFromOwner; +} +export interface IFromOwner { + id: string; + type: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts new file mode 100644 index 0000000..a5fb2a1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryFoldRequestData extends IInventoryBaseActionRequestData { + Action: "Fold"; + item: string; + value: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts new file mode 100644 index 0000000..3fcfa35 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMergeRequestData extends IInventoryBaseActionRequestData { + Action: "Merge"; + item: string; + with: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts new file mode 100644 index 0000000..b767908 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMoveRequestData extends IInventoryBaseActionRequestData { + Action: "Move"; + item: string; + to: To; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts new file mode 100644 index 0000000..5487b20 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryReadEncyclopediaRequestData extends IInventoryBaseActionRequestData { + Action: "ReadEncyclopedia"; + ids: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts new file mode 100644 index 0000000..07d1a52 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryRemoveRequestData extends IInventoryBaseActionRequestData { + Action: "Remove"; + item: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts new file mode 100644 index 0000000..a0b7928 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts @@ -0,0 +1,20 @@ +import { Upd } from "../common/tables/IItem"; +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySortRequestData extends IInventoryBaseActionRequestData { + Action: "ApplyInventoryChanges"; + changedItems: ChangedItem[]; +} +export interface ChangedItem { + _id: string; + _tpl: string; + parentId: string; + slotId: string; + location: Location; + upd: Upd; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts new file mode 100644 index 0000000..730ae71 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts @@ -0,0 +1,7 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySplitRequestData extends IInventoryBaseActionRequestData { + Action: "Split"; + item: string; + container: Container; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts new file mode 100644 index 0000000..1b0464d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts @@ -0,0 +1,11 @@ +import { OwnerInfo } from "../common/request/IBaseInteractionRequestData"; +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventorySwapRequestData extends IInventoryBaseActionRequestData { + Action: "Swap"; + item: string; + to: To; + item2: string; + to2: To; + fromOwner2: OwnerInfo; + toOwner2: OwnerInfo; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts new file mode 100644 index 0000000..f021661 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTagRequestData extends IInventoryBaseActionRequestData { + Action: "Tag"; + item: string; + TagName: string; + TagColor: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts new file mode 100644 index 0000000..0955440 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryToggleRequestData extends IInventoryBaseActionRequestData { + Action: "Toggle"; + item: string; + value: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts new file mode 100644 index 0000000..cf4391b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTransferRequestData extends IInventoryBaseActionRequestData { + Action: "Transfer"; + item: string; + with: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts new file mode 100644 index 0000000..689fe75 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts @@ -0,0 +1,4 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IEmptyItemEventRouterResponse extends IItemEventRouterBase { + profileChanges: ""; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts new file mode 100644 index 0000000..31e62fe --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts @@ -0,0 +1,67 @@ +import { Skills } from "../common/IPmcData"; +import { Item, Upd } from "../common/tables/IItem"; +import { IQuest } from "../common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../common/tables/IRepeatableQuests"; +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +export interface IItemEventRouterBase { + warnings: Warning[]; + profileChanges: TProfileChanges | ""; +} +export declare type TProfileChanges = Record; +export interface Warning { + index: number; + err: string; + errmsg: string; +} +export interface ProfileChange { + _id: string; + experience: number; + quests: IQuest[]; + ragFairOffers: IRagfairOffer[]; + builds: BuildChange[]; + items: ItemChanges; + production: Record; + skills: Skills; + traderRelations: Record; + repeatableQuests?: IPmcDataRepeatableQuest[]; +} +export interface BuildChange { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface ItemChanges { + new: Product[]; + change: Product[]; + del: Product[]; +} +export interface Production { + Progress: number; + StartTimestamp: number; + ProductionTime: number; + inProgress: boolean; + RecipeId: string; + Products: Product[]; +} +export interface Product { + _id: string; + _tpl?: string; + parentId?: string; + slotId?: string; + location?: ItemChangeLocation; + upd?: Upd; +} +export interface ItemChangeLocation { + x: number; + y: number; + r: number; + isSearched?: boolean; +} +export interface TraderRelations { + salesSum?: number; + standing?: number; + loyalty?: number; + unlocked?: boolean; + disabled?: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts new file mode 100644 index 0000000..515b49a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts @@ -0,0 +1,21 @@ +export interface IItemEventRouterRequest { + data: Daum[]; + tm: number; + reload: number; +} +export interface Daum { + Action: string; + item: string; + to: To; +} +export interface To { + id: string; + container: string; + location?: Location; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts new file mode 100644 index 0000000..72a9b5b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts @@ -0,0 +1,3 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IItemEventRouterResponse extends IItemEventRouterBase { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts new file mode 100644 index 0000000..f0a7838 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IChangeRequestData extends ILoginRequestData { + change: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts new file mode 100644 index 0000000..a14c7c9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMiniProfileRequestData { + username: string; + password: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts new file mode 100644 index 0000000..e965813 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts @@ -0,0 +1,4 @@ +export interface ILoginRequestData { + username: string; + password: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IMiniProfile.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IMiniProfile.d.ts new file mode 100644 index 0000000..c12661a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IMiniProfile.d.ts @@ -0,0 +1,14 @@ +export interface IMiniProfile { + username: string; + nickname: string; + side: string; + currlvl: number; + currexp: number; + prevexp: number; + nextlvl: number; + maxlvl: number; + akiData: AkiData; +} +export interface AkiData { + version: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IRegisterData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IRegisterData.d.ts new file mode 100644 index 0000000..61a8bbe --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IRegisterData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IRegisterData extends ILoginRequestData { + edition: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts new file mode 100644 index 0000000..d31c9ac --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts @@ -0,0 +1,2 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export declare type IRemoveProfileData = ILoginRequestData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts new file mode 100644 index 0000000..04e84d9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IGetLocationRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts new file mode 100644 index 0000000..811e9a2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IEndOfflineRaidRequestData { + crc: number; + exitStatus: string; + exitName: any; + raidSeconds: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts new file mode 100644 index 0000000..86b5bbd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetProfileRequestData { + profileId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts new file mode 100644 index 0000000..84bccc8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts @@ -0,0 +1,27 @@ +export interface IStartOfflineRaidRequestData { + locationName: string; + entryPoint: string; + startTime: number; + dateTime: string; + gameSettings: GameSettings; +} +export interface GameSettings { + timeAndWeatherSettings: TimeAndWeatherSettings; + botsSettings: BotsSettings; + wavesSettings: WavesSettings; +} +export interface TimeAndWeatherSettings { + isRandomTime: boolean; + isRandomWeather: boolean; +} +export interface BotsSettings { + isEnabled: boolean; + isScavWars: boolean; + botAmount: string; +} +export interface WavesSettings { + botDifficulty: string; + isBosses: boolean; + isTaggedAndCursed: boolean; + wavesBotAmount: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notes/INoteActionData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notes/INoteActionData.d.ts new file mode 100644 index 0000000..610657f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notes/INoteActionData.d.ts @@ -0,0 +1,10 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface INoteActionData extends IBaseInteractionRequestData { + Action: string; + index: number; + note: INote; +} +export interface INote { + Time: number; + Text: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notifier/INotifier.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notifier/INotifier.d.ts new file mode 100644 index 0000000..8c48260 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notifier/INotifier.d.ts @@ -0,0 +1,14 @@ +export interface INotifierChannel { + "server": string; + "channel_id": string; + "url": string; + "notifierServer": string; + "ws": string; +} +import { Message } from "../profile/IAkiProfile"; +export interface INotification { + type: "RagfairOfferSold" | "new_message" | "ping"; + eventId: string; + dialogId?: string; + message?: Message; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts new file mode 100644 index 0000000..2bc3d1e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISelectProfileRequestData { + uid: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts new file mode 100644 index 0000000..dcd14a2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts @@ -0,0 +1,21 @@ +import { Skills } from "../common/IPmcData"; +export interface IPlayerIncrementSkillLevelRequestData { + _id: string; + experience: number; + quests: any[]; + ragFairOffers: any[]; + builds: any[]; + items: Items; + production: Production; + skills: Skills; + traderRelations: TraderRelations; +} +export interface Items { + new: any[]; + change: any[]; + del: any[]; +} +export interface Production { +} +export interface TraderRelations { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts new file mode 100644 index 0000000..99c61f1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts @@ -0,0 +1,25 @@ +export interface IPresetBuildActionRequestData { + Action: string; + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Item { + _id: string; + _tpl: string; + upd?: Upd; + parentId?: string; + slotId?: string; +} +export interface Upd { + Repairable: Repairable; + FireMode: FireMode; +} +export interface Repairable { + MaxDurability: number; + Durability: number; +} +export interface FireMode { + FireMode: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IAkiProfile.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IAkiProfile.d.ts new file mode 100644 index 0000000..3e0b319 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IAkiProfile.d.ts @@ -0,0 +1,167 @@ +import { MessageType } from "../../enums/MessageType"; +import { IPmcData } from "../common/IPmcData"; +import { Item } from "../common/tables/IItem"; +export interface IAkiProfile { + info: Info; + characters: Characters; + suits: string[]; + weaponbuilds: WeaponBuild[]; + dialogues: Record; + aki: Aki; + vitality: Vitality; + inraid: Inraid; + insurance: Insurance[]; +} +export interface Info { + id: string; + username: string; + password: string; + wipe: boolean; + edition: string; +} +export interface Characters { + pmc: IPmcData; + scav: IPmcData; +} +export interface WeaponBuild { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Dialogue { + _id: string; + messages: Message[]; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface DialogueInfo { + _id: string; + type: MessageType; + message: MessagePreview; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface Message { + _id: string; + uid: string; + type: MessageType; + dt: number; + localDateTime: number; + UtcDateTime?: number; + Member?: IUpdatableChatMember; + templateId: string; + text?: string; + hasRewards: boolean; + rewardCollected: boolean; + items: Items; + maxStorageTime?: number; + systemData?: ISystemData; +} +export interface MessagePreview { + uid: string; + type: MessageType; + dt: number; + templateId: string; + text?: string; +} +export interface Items { + stash?: string; + data?: Item[]; +} +export interface ISystemData { + date?: string; + time?: string; + location?: string; + buyerNickname?: string; + soldItem?: string; + itemCount?: number; +} +export interface IUpdatableChatMember { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; + Ignored: boolean; + Banned: boolean; +} +export interface DateTime { + date: string; + time: string; +} +export interface Aki { + version: string; +} +export interface Vitality { + health: Health; + effects: Effects; +} +export interface Health { + Hydration: number; + Energy: number; + Temperature: number; + Head: number; + Chest: number; + Stomach: number; + LeftArm: number; + RightArm: number; + LeftLeg: number; + RightLeg: number; +} +export interface Effects { + Head: Head; + Chest: Chest; + Stomach: Stomach; + LeftArm: LeftArm; + RightArm: RightArm; + LeftLeg: LeftLeg; + RightLeg: RightLeg; +} +export interface Head { +} +export interface Chest { +} +export interface Stomach { +} +export interface LeftArm { + Fracture?: number; +} +export interface RightArm { + Fracture?: number; +} +export interface LeftLeg { + Fracture?: number; +} +export interface RightLeg { + Fracture?: number; +} +export interface Inraid { + location: string; + character: string; +} +export interface Insurance { + scheduledTime: number; + traderId: string; + messageContent: MessageContent; + items: Item[]; +} +export interface MessageContent { + ragfair?: MessageContentRagfair; + text?: string; + templateId: string; + type: MessageType; + maxStorageTime?: number; + systemData?: MessageContentData; +} +export interface MessageContentRagfair { + offerId: string; + count: number; + handbookId: string; +} +export interface MessageContentData { + date: string; + time: string; + location: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts new file mode 100644 index 0000000..4a61196 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeNicknameRequestData { + nickname: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts new file mode 100644 index 0000000..91058ce --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeVoiceRequestData { + voice: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts new file mode 100644 index 0000000..93cc656 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IProfileCreateRequestData { + side: string; + nickname: string; + headId: string; + voiceId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts new file mode 100644 index 0000000..e63e386 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISearchFriendRequestData { + nickname: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts new file mode 100644 index 0000000..96d88b2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts @@ -0,0 +1,9 @@ +export interface ISearchFriendResponse { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts new file mode 100644 index 0000000..9cca7e7 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IValidateNicknameRequestData { + nickname: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts new file mode 100644 index 0000000..0e4821a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IAcceptQuestRequestData { + Action: "QuestAccept"; + qid: string; + type: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts new file mode 100644 index 0000000..cc67404 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface ICompleteQuestRequestData { + Action: string; + qid: string; + removeExcessItems: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts new file mode 100644 index 0000000..63f10a8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHandoverQuestRequestData { + Action: "QuestHandover"; + qid: string; + conditionId: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts new file mode 100644 index 0000000..91f0b8c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IListQuestsRequestData { + completed: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts new file mode 100644 index 0000000..015f58e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts @@ -0,0 +1,4 @@ +export interface IRepeatableQuestChangeRequest { + Action: "RepeatableQuestChange"; + qid: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts new file mode 100644 index 0000000..465ee02 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IAddOfferRequestData { + Action: string; + sellInOnePiece: boolean; + items: string[]; + requirements: Requirement[]; +} +export interface Requirement { + _tpl: string; + count: number; + level: number; + side: number; + onlyFunctional: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts new file mode 100644 index 0000000..2a4a876 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IExtendOfferRequestData { + offerId: string; + renewalTime: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts new file mode 100644 index 0000000..676322a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts @@ -0,0 +1,5 @@ +export interface IGetItemPriceResult { + avg: number; + min: number; + max: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts new file mode 100644 index 0000000..00f8f17 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMarketPriceRequestData { + templateId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts new file mode 100644 index 0000000..1c11422 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts @@ -0,0 +1,7 @@ +import { IRagfairOffer } from "./IRagfairOffer"; +export interface IGetOffersResult { + categories: Record; + offers: IRagfairOffer[]; + offersCount: number; + selectedCategory: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts new file mode 100644 index 0000000..63f655e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts @@ -0,0 +1,42 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +import { Item } from "../common/tables/IItem"; +export interface IRagfairOffer { + sellResult?: SellResult[]; + _id: string; + items: Item[]; + requirements: OfferRequirement[]; + root: string; + intId: number; + itemsCost: number; + requirementsCost: number; + startTime: number; + endTime: number; + sellInOnePiece: boolean; + name?: string; + shortName?: string; + loyaltyLevel: number; + locked: boolean; + unlimitedCount: boolean; + summaryCost: number; + user: IRagfairOfferUser; + notAvailable: boolean; + CurrentItemCount: number; + priority: boolean; +} +export interface OfferRequirement { + _tpl: string; + count: number; + onlyFunctional: boolean; +} +export interface IRagfairOfferUser { + id: string; + nickname: string; + rating: number; + memberType: MemberCategory; + avatar: string; + isRatingGrowing: boolean; +} +export interface SellResult { + sellTime: number; + amount: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts new file mode 100644 index 0000000..d926615 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IRemoveOfferRequestData { + Action: string; + offerId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts new file mode 100644 index 0000000..08e7fd3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts @@ -0,0 +1,32 @@ +export interface ISearchRequestData { + page: number; + limit: number; + sortType: number; + sortDirection: number; + currency: number; + priceFrom: number; + priceTo: number; + quantityFrom: number; + quantityTo: number; + conditionFrom: number; + conditionTo: number; + oneHourExpiration: boolean; + removeBartering: boolean; + offerOwnerType: OfferOwnerType; + onlyFunctional: boolean; + updateOfferCount: boolean; + handbookId: string; + linkedSearchId: string; + neededSearchId: string; + buildItems: BuildItems; + buildCount: number; + tm: number; + reload: number; +} +export declare enum OfferOwnerType { + ANYOWNERTYPE = 0, + TRADEROWNERTYPE = 1, + PLAYEROWNERTYPE = 2 +} +export interface BuildItems { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e645fb3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts @@ -0,0 +1,3 @@ +export interface IBaseRepairActionDataRequest { + Action: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts new file mode 100644 index 0000000..263d400 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface IRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "Repair"; + repairKitsInfo: RepairKitsInfo[]; + target: string; +} +export interface RepairKitsInfo { + _id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e3d469d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface ITraderRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "TraderRepair"; + tid: string; + repairItems: RepairItem[]; +} +export interface RepairItem { + _id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts new file mode 100644 index 0000000..a9ef757 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IProcessBaseTradeRequestData { + Action: string; + type: string; + tid: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts new file mode 100644 index 0000000..a9e4c17 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts @@ -0,0 +1,14 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData { + Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | ""; + type: string; + tid: string; + item_id: string; + count: number; + scheme_id: number; + scheme_items: SchemeItem[]; +} +export interface SchemeItem { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts new file mode 100644 index 0000000..889dfd1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IProcessRagfairTradeRequestData { + Action: string; + offers: Offer[]; +} +export interface Offer { + id: string; + count: number; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts new file mode 100644 index 0000000..f1d555f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts @@ -0,0 +1,12 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessSellTradeRequestData extends IProcessBaseTradeRequestData { + Action: "sell_to_trader"; + type: string; + tid: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; + scheme_id: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/weather/IWeatherData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/weather/IWeatherData.d.ts new file mode 100644 index 0000000..ecc96ce --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/weather/IWeatherData.d.ts @@ -0,0 +1,20 @@ +export interface IWeatherData { + acceleration: number; + time: string; + date: string; + weather: IWeather; +} +export interface IWeather { + pressure: number; + temp: number; + fog: string; + rain_intensity: number; + rain: any; + wind_gustiness: number; + wind_direction: any; + wind_speed: number; + cloud: number; + time: string; + date: string; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts new file mode 100644 index 0000000..9217864 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts @@ -0,0 +1,4 @@ +export interface IWishlistActionData { + Action: string; + templateId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/BaseClasses.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/BaseClasses.d.ts new file mode 100644 index 0000000..e733bca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/BaseClasses.d.ts @@ -0,0 +1,84 @@ +export declare enum BaseClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMOR = "5448e54d4bdc2dcc718b4568", + VEST = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/ConfigTypes.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/ConfigTypes.d.ts new file mode 100644 index 0000000..6bd31e8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/ConfigTypes.d.ts @@ -0,0 +1,18 @@ +export declare enum ConfigTypes { + AIRDROP = "aki-airdrop", + BOT = "aki-bot", + CORE = "aki-core", + HEALTH = "aki-health", + HIDEOUT = "aki-hideout", + HTTP = "aki-http", + IN_RAID = "aki-inraid", + INSURANCE = "aki-insurance", + INVENTORY = "aki-inventory", + LOCATION = "aki-location", + MATCH = "aki-match", + QUEST = "aki-quest", + RAGFAIR = "aki-ragfair", + REPAIR = "aki-repair", + TRADER = "aki-trader", + WEATHER = "aki-weather" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/ELocationName.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/ELocationName.d.ts new file mode 100644 index 0000000..b56cc08 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/ELocationName.d.ts @@ -0,0 +1,11 @@ +export declare enum ELocationName { + FACTORY_DAY = "factory4_day", + BIGMAP = "bigmap", + WOODS = "Woods", + SHORELINE = "Shoreline", + INTERCHANGE = "Interchange", + LIGHTHOUSE = "Lighthouse", + LABORATORY = "laboratory", + RESERVE = "RezervBase", + ANY = "any" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/EquipmentSlots.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/EquipmentSlots.d.ts new file mode 100644 index 0000000..35c18ff --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/EquipmentSlots.d.ts @@ -0,0 +1,16 @@ +export declare enum EquipmentSlots { + HEADWEAR = "Headwear", + EARPIECE = "Earpiece", + FACE_COVER = "FaceCover", + ARMOR_VEST = "ArmorVest", + EYEWEAR = "Eyewear", + ARM_BAND = "ArmBand", + TACTICAL_VEST = "TacticalVest", + POCKETS = "Pockets", + BACKPACK = "Backpack", + SECURED_CONTAINER = "SecuredContainer", + FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", + SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", + HOLSTER = "Holster", + SCABBARD = "Scabbard" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/HideoutAreas.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/HideoutAreas.d.ts new file mode 100644 index 0000000..b44a20a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/HideoutAreas.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreas { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/MemberCategory.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/MessageType.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/MessageType.d.ts new file mode 100644 index 0000000..1b0c649 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/MessageType.d.ts @@ -0,0 +1,16 @@ +export declare enum MessageType { + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/Money.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/Money.d.ts new file mode 100644 index 0000000..0d39613 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/Money.d.ts @@ -0,0 +1,5 @@ +export declare enum Money { + ROUBLES = "5449016a4bdc2d6f028b456f", + EUROS = "569668774bdc2da2298b4568", + DOLLARS = "5696686a4bdc2da3298b456a" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/Traders.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/Traders.d.ts new file mode 100644 index 0000000..163cd71 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/enums/Traders.d.ts @@ -0,0 +1,10 @@ +export declare enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/external/mod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/external/mod.d.ts new file mode 100644 index 0000000..ecef460 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/external/mod.d.ts @@ -0,0 +1,5 @@ +import { DependencyContainer } from "./tsyringe"; +export interface IMod { + load: (container: DependencyContainer) => void; + delayedLoad: (container: DependencyContainer) => void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/external/tsyringe.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/external/tsyringe.d.ts new file mode 100644 index 0000000..56a7e58 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/external/tsyringe.d.ts @@ -0,0 +1,2 @@ +import type { DependencyContainer } from "tsyringe"; +export type { DependencyContainer }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/bindings/Route.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/bindings/Route.d.ts new file mode 100644 index 0000000..1b29d7d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/bindings/Route.d.ts @@ -0,0 +1,3 @@ +export interface IRoute { + aki: any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts new file mode 100644 index 0000000..2c42813 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface IBotCallbacks { + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts new file mode 100644 index 0000000..7e37c6e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IBundleCallbacks { + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts new file mode 100644 index 0000000..d10027f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IBuyClothingRequestData } from "../../eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../../eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISuit } from "../../eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface ICustomizationCallbacks { + getSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + getTraderSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts new file mode 100644 index 0000000..a098560 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts @@ -0,0 +1,26 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGlobals } from "../../eft/common/IGlobals"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../server/ILocaleBase"; +import { ISettingsBase } from "../server/ISettingsBase"; +export interface IDataCallbacks { + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts new file mode 100644 index 0000000..fe2115a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts @@ -0,0 +1,34 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetMailDialogViewRequestData } from "../../eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogInfoRequestData } from "../../eft/dialog/IGetMailDialogInfoRequestData"; +import { IRemoveDialogRequestData } from "../../eft/dialog/IRemoveDialogRequestData"; +import { IGetMailDialogListRequestData } from "../../eft/dialog/IGetMailDialogListRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../../eft/dialog/IFriendRequestData"; +import { IPinDialogRequestData } from "../../eft/dialog/IPinDialogRequestData"; +import { ISetDialogReadRequestData } from "../../eft/dialog/ISetDialogReadRequestData"; +import { IGetAllAttachmentsRequestData } from "../../eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetChatServerListRequestData } from "../../eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../../eft/dialog/IGetFriendListDataResponse"; +import { ISendMessageRequest } from "../../eft/dialog/ISendMessageRequest"; +import { IGetMailDialogViewResponseData } from "../../eft/dialog/IGetMailDialogViewResponseData"; +import { IGetAllAttachmentsResponse } from "../../eft/dialog/IGetAllAttachmentsResponse"; +import { DialogueInfo } from "../../eft/profile/IAkiProfile"; +export interface IDialogueCallbacks { + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts new file mode 100644 index 0000000..38ebc5f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts @@ -0,0 +1,16 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGameEmptyCrcRequestData } from "../../eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../../eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGameConfigResponse } from "../../eft/game/IGameConfigResponse"; +export interface IGameCallbacks { + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts new file mode 100644 index 0000000..5857a3e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IHandbookCallbacks { + load(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts new file mode 100644 index 0000000..d238c7a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts @@ -0,0 +1,13 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { ISyncHealthRequestData } from "../../eft/health/ISyncHealthRequestData"; +import { IOffraidEatRequestData } from "../../eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../../eft/health/IOffraidHealRequestData"; +import { IHealthTreatmentRequestData } from "../../eft/health/IHealthTreatmentRequestData"; +export interface IHealthCallbacks { + onLoad(sessionID: string): IAkiProfile; + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): any; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): any; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): any; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts new file mode 100644 index 0000000..e9badb6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts @@ -0,0 +1,23 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IHideoutUpgradeRequestData } from "../../eft/hideout/IHideoutUpgradeRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../../eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutScavCaseStartRequestData } from "../../eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutPutItemInRequestData } from "../../eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutTakeItemOutRequestData } from "../../eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutToggleAreaRequestData } from "../../eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../../eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../../eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../../eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IHideoutCallbacks { + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts new file mode 100644 index 0000000..3ecd945 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IHttpCallbacks { + load(): void; + sendImage(sessionID: string, req: any, resp: any, body: any): void; + getImage(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts new file mode 100644 index 0000000..e959b98 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts @@ -0,0 +1,14 @@ +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IRegisterPlayerRequestData } from "../../eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../../eft/inRaid/ISaveProgressRequestData"; +export interface IInraidCallbacks { + onLoad(sessionID: string): IAkiProfile; + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts new file mode 100644 index 0000000..082112d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IGetInsuranceCostRequestData } from "../../eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../../eft/insurance/IInsureRequestData"; +export interface IInsuranceCallbacks { + onLoad(sessionID: string): IAkiProfile; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): any; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): any; + update(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts new file mode 100644 index 0000000..e53f7d0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IInventoryFoldRequestData } from "../../eft/inventory/IInventoryFoldRequestData"; +import { IInventorySplitRequestData } from "../../eft/inventory/IInventorySplitRequestData"; +import { IInventoryMoveRequestData } from "../../eft/inventory/IInventoryMoveRequestData"; +import { IInventoryMergeRequestData } from "../../eft/inventory/IInventoryMergeRequestData"; +import { IInventoryRemoveRequestData } from "../../eft/inventory/IInventoryRemoveRequestData"; +import { IInventoryTransferRequestData } from "../../eft/inventory/IInventoryTransferRequestData"; +import { IInventorySwapRequestData } from "../../eft/inventory/IInventorySwapRequestData"; +import { IInventoryToggleRequestData } from "../../eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTagRequestData } from "../../eft/inventory/IInventoryTagRequestData"; +import { IInventoryBindRequestData } from "../../eft/inventory/IInventoryBindRequestData"; +import { IInventoryExamineRequestData } from "../../eft/inventory/IInventoryExamineRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../../eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventorySortRequestData } from "../../eft/inventory/IInventorySortRequestData"; +import { IInventoryCreateMarkerRequestData } from "../../eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../../eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../../eft/inventory/IInventoryEditMarkerRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IInventoryCallbacks { + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts new file mode 100644 index 0000000..59db771 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts @@ -0,0 +1,6 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../../eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IItemEventCallbacks { + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts new file mode 100644 index 0000000..52dfec6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts @@ -0,0 +1,20 @@ +import { IRegisterData } from "../../eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../../eft/launcher/IRemoveProfileData"; +import { ILoginRequestData } from "../../eft/launcher/ILoginRequestData"; +import { IChangeRequestData } from "../../eft/launcher/IChangeRequestData"; +import { IGetMiniProfileRequestData } from "../../eft/launcher/IGetMiniProfileRequestData.js"; +export interface ILauncherCallbacks { + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; + getServerVersion(): string; + ping(url: string, info: any, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts new file mode 100644 index 0000000..71656a4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IGetLocationRequestData } from "../../eft/location/IGetLocationRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILocationsGenerateAllResponse } from "../../eft/common/ILocationsSourceDestinationBase"; +import { ILocationBase } from "../../eft/common/ILocationBase"; +export interface ILocationCallbacks { + getLocationData(url: string, info: any, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts new file mode 100644 index 0000000..fcbf173 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts @@ -0,0 +1,25 @@ +import { IStartOfflineRaidRequestData } from "../../eft/match/IStartOffineRaidRequestData"; +import { IEndOfflineRaidRequestData } from "../../eft/match/IEndOfflineRaidRequestData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IPmcData } from "../../eft/common/IPmcData"; +export interface IMatchCallbacks { + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: any, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts new file mode 100644 index 0000000..1a4cd7b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts @@ -0,0 +1,6 @@ +export interface IModCallbacks { + load(): void; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts new file mode 100644 index 0000000..8453a4f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { INoteActionData } from "../../eft/notes/INoteActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface INoteCallbacks { + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts new file mode 100644 index 0000000..a211310 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts @@ -0,0 +1,17 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../../eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../../eft/notifier/ISelectProfileRequestData"; +export interface INotifierCallbacks { + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(sessionID: string, req: any, resp: any, data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts new file mode 100644 index 0000000..97c6487 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IPresetBuildActionRequestData } from "../../eft/presetBuild/IPresetBuildActionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { WeaponBuild } from "../../eft/profile/IAkiProfile"; +export interface IPresetBuildCallbacks { + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts new file mode 100644 index 0000000..4169857 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IPresetCallbacks { + load(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts new file mode 100644 index 0000000..9d4d2df --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IProfileChangeNicknameRequestData } from "../../eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../../eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../../eft/profile/IProfileCreateRequestData"; +import { IValidateNicknameRequestData } from "../../eft/profile/IValidateNicknameRequestData"; +import { ISearchFriendRequestData } from "../../eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../../eft/profile/ISearchFriendResponse"; +export interface IProfileCallbacks { + onLoad(sessionID: string): any; + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts new file mode 100644 index 0000000..1c4d0c3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts @@ -0,0 +1,19 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAcceptQuestRequestData } from "../../eft/quests/IAcceptQuestRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IListQuestsRequestData } from "../../eft/quests/IListQuestsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { ICompleteQuestRequestData } from "../../eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../../eft/quests/IHandoverQuestRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../../eft/common/tables/IRepeatableQuests"; +import { IRepeatableQuestChangeRequest } from "../../eft/quests/IRepeatableQuestChangeRequest"; +export interface IQuestCallbacks { + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts new file mode 100644 index 0000000..9282bd4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISearchRequestData } from "../../eft/ragfair/ISearchRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetMarketPriceRequestData } from "../../eft/ragfair/IGetMarketPriceRequestData"; +import { IAddOfferRequestData } from "../../eft/ragfair/IAddOfferRequestData"; +import { IRemoveOfferRequestData } from "../../eft/ragfair/IRemoveOfferRequestData"; +import { IExtendOfferRequestData } from "../../eft/ragfair/IExtendOfferRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetItemPriceResult } from "../../eft/ragfair/IGetItemPriceResult"; +export interface IRagfairCallbacks { + load(): void; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; + updatePlayer(timeSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts new file mode 100644 index 0000000..e8183c9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../../eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../../eft/repair/ITraderRepairActionDataRequest"; +export interface IRepairCallbacks { + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts new file mode 100644 index 0000000..1ad3b82 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts @@ -0,0 +1,4 @@ +export interface ISaveCallbacks { + load(): void; + update(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts new file mode 100644 index 0000000..2f41d54 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../../eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../../eft/trade/IProcessBaseTradeRequestData"; +export interface ITradeCallbacks { + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts new file mode 100644 index 0000000..e0d7d06 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../../eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface ITraderCallbacks { + load(): void; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts new file mode 100644 index 0000000..9ac72ae --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts @@ -0,0 +1,5 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +export interface IWeatherCallbacks { + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts new file mode 100644 index 0000000..e5d519c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IWishlistActionData } from "../../eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IWishlistCallbacks { + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IAirdropConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IAirdropConfig.d.ts new file mode 100644 index 0000000..f4aee89 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IAirdropConfig.d.ts @@ -0,0 +1,20 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IAirdropConfig extends IBaseConfig { + kind: "aki-airdrop"; + airdropChancePercent: AirdropChancePercent; + airdropMinOpenHeight: number; + airdropMaxOpenHeight: number; + planeMinFlyHeight: number; + planeMaxFlyHeight: number; + planeVolume: number; + airdropMinStartTimeSeconds: number; + airdropMaxStartTimeSeconds: number; +} +export interface AirdropChancePercent { + bigmap: number; + woods: number; + lighthouse: number; + shoreline: number; + interchange: number; + reserve: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IBaseConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IBaseConfig.d.ts new file mode 100644 index 0000000..8b6ba88 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IBaseConfig.d.ts @@ -0,0 +1,3 @@ +export interface IBaseConfig { + kind: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IBotConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IBotConfig.d.ts new file mode 100644 index 0000000..5fb9d93 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IBotConfig.d.ts @@ -0,0 +1,114 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IBotConfig extends IBaseConfig { + kind: "aki-bot"; + presetBatch: PresetBatch; + bosses: string[]; + durability: Durability; + lootNValue: LootNvalue; + revenge: Record; + pmc: PmcConfig; + showTypeInNickname: boolean; + maxBotCap: number; +} +export interface PresetBatch { + assault: number; + bossBully: number; + bossGluhar: number; + bossKilla: number; + bossKojaniy: number; + bossSanitar: number; + bossTagilla: number; + bossTest: number; + cursedAssault: number; + followerBully: number; + followerGluharAssault: number; + followerGluharScout: number; + followerGluharSecurity: number; + followerGluharSnipe: number; + followerKojaniy: number; + followerSanitar: number; + followerTagilla: number; + followerTest: number; + marksman: number; + pmcBot: number; + sectantPriest: number; + sectantWarrior: number; + gifter: number; + test: number; + exUsec: number; +} +export interface Durability { + default: DefaultDurability; + pmc: PmcDurability; + boss: BotDurability; + follower: BotDurability; + assault: BotDurability; + cursedassault: BotDurability; + marksman: BotDurability; + pmcbot: BotDurability; + exusec: BotDurability; + sectantpriest: BotDurability; + sectantwarrior: BotDurability; +} +export interface DefaultDurability { + armor: DefaultArmor; + weapon: WeaponDurability; +} +export interface DefaultArmor { + maxDelta: number; + minDelta: number; +} +export interface WeaponDurability { + lowestMax: number; + highestMax: number; + maxDelta: number; + minDelta: number; +} +export interface PmcDurability { + armor: PmcDurabilityArmor; + weapon: WeaponDurability; +} +export interface PmcDurabilityArmor { + lowestMaxPercent: number; + highestMaxPercent: number; + maxDelta: number; + minDelta: number; +} +export interface BotDurability { + armor: ArmorDurability; + weapon: WeaponDurability; +} +export interface ArmorDurability { + maxDelta: number; + minDelta: number; +} +export interface LootNvalue { + scav: number; + pmc: number; +} +export interface PmcConfig { + dynamicLoot: DynamicLoot; + cartridgeBlacklist: string[]; + difficulty: string; + isUsec: number; + chanceSameSideIsHostilePercent: number; + usecType: string; + bearType: string; + maxBackpackLootTotalRub: number; + maxPocketLootTotalRub: number; + maxVestLootTotalRub: number; + types: Types; + enemyTypes: string[]; +} +export interface DynamicLoot { + whitelist: string[]; + blacklist: string[]; + spawnLimits: Record; + moneyStackLimits: Record; +} +export interface Types { + assault: number; + cursedAssault: number; + pmcBot: number; + exUsec: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ICoreConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ICoreConfig.d.ts new file mode 100644 index 0000000..cfcaf61 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ICoreConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ICoreConfig extends IBaseConfig { + kind: "aki-core"; + akiVersion: string; + projectName: string; + compatibleTarkovVersion: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHealthConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHealthConfig.d.ts new file mode 100644 index 0000000..fdbf656 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHealthConfig.d.ts @@ -0,0 +1,14 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHealthConfig extends IBaseConfig { + kind: "aki-health"; + healthMultipliers: HealthMultipliers; + save: Save; +} +export interface HealthMultipliers { + death: number; + blacked: number; +} +export interface Save { + health: boolean; + effects: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHideoutConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHideoutConfig.d.ts new file mode 100644 index 0000000..4658fa6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHideoutConfig.d.ts @@ -0,0 +1,27 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHideoutConfig extends IBaseConfig { + kind: "aki-hideout"; + runIntervalSeconds: number; + scavCase: ScavCase; + fuelDrainRateMultipler: number; +} +export interface ScavCase { + rewardParentBlacklist: string[]; + rewardItemBlacklist: any[]; + ammoRewards: AmmoRewards; + moneyRewards: MoneyRewards; +} +export interface AmmoRewards { + giveMultipleOfTen: boolean; + minAmount: number; +} +export interface MoneyRewards { + enabled: boolean; + rub: MinMax; + usd: MinMax; + eur: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHttpConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHttpConfig.d.ts new file mode 100644 index 0000000..c41d035 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IHttpConfig.d.ts @@ -0,0 +1,6 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHttpConfig extends IBaseConfig { + kind: "aki-http"; + ip: string; + port: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInRaidConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInRaidConfig.d.ts new file mode 100644 index 0000000..baaf083 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInRaidConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInRaidConfig extends IBaseConfig { + kind: "aki-inraid"; + MIAOnRaidEnd: boolean; + raidMenuSettings: RaidMenuSettings; + save: Save; + carExtracts: string[]; + carExtractBaseStandingGain: number; + scavExtractGain: number; +} +export interface RaidMenuSettings { + aiAmount: string; + aiDifficulty: string; + bossEnabled: boolean; + scavWars: boolean; + taggedAndCursed: boolean; +} +export interface Save { + loot: boolean; + durability: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInsuranceConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInsuranceConfig.d.ts new file mode 100644 index 0000000..6e9c744 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInsuranceConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInsuranceConfig extends IBaseConfig { + kind: "aki-insurance"; + insuranceMultiplier: Record; + returnChancePercent: Record; + runIntervalSeconds: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInventoryConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInventoryConfig.d.ts new file mode 100644 index 0000000..ffffa41 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IInventoryConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInventoryConfig extends IBaseConfig { + kind: "aki-inventory"; + newItemsMarkedFound: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ILocationConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ILocationConfig.d.ts new file mode 100644 index 0000000..0551d57 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ILocationConfig.d.ts @@ -0,0 +1,24 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ILocationConfig extends IBaseConfig { + kind: "aki-location"; + looseLootMultiplier: LootMultiplier; + staticLootMultiplier: LootMultiplier; +} +export interface LootMultiplier { + bigmap: number; + develop: number; + factory4_day: number; + factory4_night: number; + interchange: number; + laboratory: number; + rezervbase: number; + shoreline: number; + woods: number; + hideout: number; + lighthouse: number; + privatearea: number; + suburbs: number; + tarkovstreets: number; + terminal: number; + town: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IMatchConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IMatchConfig.d.ts new file mode 100644 index 0000000..92c4d77 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IMatchConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IMatchConfig extends IBaseConfig { + kind: "aki-match"; + enabled: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IQuestConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IQuestConfig.d.ts new file mode 100644 index 0000000..be4a97b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IQuestConfig.d.ts @@ -0,0 +1,77 @@ +import { ELocationName } from "../../enums/ELocationName"; +import { IBaseConfig } from "./IBaseConfig"; +export interface IQuestConfig extends IBaseConfig { + kind: "aki-quest"; + redeemTime: number; + repeatableQuests: IRepeatableQuestConfig[]; +} +export interface IRepeatableQuestConfig { + name: string; + types: string[]; + resetTime: number; + numQuests: number; + minPlayerLevel: number; + rewardScaling: IRewardScaling; + locations: Record; + traderWhitelist: ITraderWhitelist[]; + questConfig: IQuestConfig; +} +export interface IRewardScaling { + levels: number[]; + experience: number[]; + roubles: number[]; + items: number[]; + reputation: number[]; + rewardSpread: number; +} +export interface ITraderWhitelist { + traderId: string; + questTypes: string[]; +} +export interface IQuestConfig { + Exploration: IExploration; + Completion: ICompletion; + Elimination: IElimination; +} +export interface IExploration { + maxExtracts: number; + specificExits: ISpecificExits; +} +export interface ISpecificExits { + probability: number; + passageRequirementWhitelist: string[]; +} +export interface ICompletion { + minRequestedAmount: number; + maxRequestedAmount: number; + minRequestedBulletAmount: number; + maxRequestedBulletAmount: number; + useWhitelist: boolean; + useBlacklist: boolean; +} +export interface IElimination { + targets: ITarget[]; + bodyPartProb: number; + bodyParts: IBodyPart[]; + specificLocationProb: number; + distLocationBlacklist: string[]; + distProb: number; + maxDist: number; + minDist: number; + maxKills: number; + minKills: number; +} +export interface IProbabilityObject { + key: string; + relativeProbability: number; + data?: any; +} +export interface ITarget extends IProbabilityObject { + data: IBossInfo; +} +export interface IBossInfo { + isBoss: boolean; +} +export interface IBodyPart extends IProbabilityObject { + data: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IRagfairConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IRagfairConfig.d.ts new file mode 100644 index 0000000..2d151ca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IRagfairConfig.d.ts @@ -0,0 +1,59 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRagfairConfig extends IBaseConfig { + kind: "aki-ragfair"; + runIntervalSeconds: number; + sell: Sell; + traders: Record; + dynamic: Dynamic; +} +export interface Sell { + fees: boolean; + chance: Chance; + time: Time; + reputation: Reputation; +} +export interface Chance { + base: number; + overprices: number; + underpriced: number; +} +export interface Time { + base: number; + min: number; + max: number; +} +export interface Reputation { + gain: number; + loss: number; +} +export interface Dynamic { + expiredOfferThreshold: number; + offerItemCount: MinMax; + price: MinMax; + endTimeSeconds: MinMax; + condition: Condition; + stackablePercent: MinMax; + nonStackableCount: MinMax; + rating: MinMax; + currencies: Record; + showAsSingleStack: string[]; + blacklist: Blacklist; +} +export interface MinMax { + min: number; + max: number; +} +export interface Condition { + conditionChance: number; + min: number; + max: number; +} +export interface Blacklist { + /** + * show/hide trader items that are blacklisted by bsg + */ + traderItems: boolean; + custom: string[]; + enableBsgList: boolean; + enableQuestList: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IRepairConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IRepairConfig.d.ts new file mode 100644 index 0000000..4966eb5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IRepairConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRepairConfig extends IBaseConfig { + kind: "aki-repair"; + priceMultiplier: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ITraderConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ITraderConfig.d.ts new file mode 100644 index 0000000..dab73e3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/ITraderConfig.d.ts @@ -0,0 +1,15 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ITraderConfig extends IBaseConfig { + kind: "aki-trader"; + updateTime: UpdateTime[]; + updateTimeDefault: number; + fenceAssortSize: number; + fenceMaxPresetsCount: number; + fencePresetPriceMult: number; + minDurabilityForSale: number; + fenceItemIgnoreList: string[]; +} +export interface UpdateTime { + traderId: string; + seconds: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IWeatherConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IWeatherConfig.d.ts new file mode 100644 index 0000000..c52cab3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/config/IWeatherConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IWeatherConfig extends IBaseConfig { + kind: "aki-weather"; + acceleration: number; + weather: Weather; +} +export interface Weather { + clouds: MinMax; + windSpeed: MinMax; + windDirection: MinMax; + windGustiness: MinMax; + rain: MinMax; + rainIntensity: MinMax; + fog: MinMax; + temp: MinMax; + pressure: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/controllers/IBotController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/controllers/IBotController.d.ts new file mode 100644 index 0000000..010e208 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/controllers/IBotController.d.ts @@ -0,0 +1,13 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { Difficulty } from "../../eft/common/tables/IBotType"; +export interface IBotController { + getBotLimit(type: string): number; + getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + generate(info: IGenerateBotsRequestData, playerScav: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IBotGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IBotGenerator.d.ts new file mode 100644 index 0000000..f3e8586 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IBotGenerator.d.ts @@ -0,0 +1,10 @@ +import { Inventory as PmcInventory } from "../../eft/common/IPmcData"; +import { Inventory, Chances, Generation } from "../../eft/common/tables/IBotType"; +export interface IBotGenerator { + generateInventory(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; +} +export interface IExhaustableArray { + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/ILocationGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/ILocationGenerator.d.ts new file mode 100644 index 0000000..530ceca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/ILocationGenerator.d.ts @@ -0,0 +1,6 @@ +import { IStaticContainerProps, IStaticLootDetails, IStaticAmmoDetails, IStaticForcedProps } from "../../eft/common/tables/ILootBase"; +import { ILooseLoot, SpawnpointTemplate } from "../../eft/common/ILooseLoot"; +export interface ILocationGenerator { + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts new file mode 100644 index 0000000..a9db89b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts @@ -0,0 +1,4 @@ +export interface IPMCLootGenerator { + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts new file mode 100644 index 0000000..6670540 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts @@ -0,0 +1,4 @@ +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairAssortGenerator { + getAssortItems(): Item[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts new file mode 100644 index 0000000..30b4be5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts @@ -0,0 +1,6 @@ +import { IBarterScheme } from "../../eft/common/tables/ITrader"; +import { IRagfairOffer } from "../../eft/ragfair/IRagfairOffer"; +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairOfferGenerator { + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece: boolean): IRagfairOffer; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/helpers/Traders.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/helpers/Traders.d.ts new file mode 100644 index 0000000..e935d29 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/helpers/Traders.d.ts @@ -0,0 +1,10 @@ +export declare const enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IMod.d.ts new file mode 100644 index 0000000..e6eec79 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IMod.d.ts @@ -0,0 +1,10 @@ +export declare namespace ModLoader { + interface IMod { + name: string; + version: string; + main?: string; + author?: string; + license: string; + dependencies?: Record; + } +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IModLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IModLoader.d.ts new file mode 100644 index 0000000..40a5e19 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IModLoader.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +export interface IModLoader { + load(container: DependencyContainer): void; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IPackageJsonData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IPackageJsonData.d.ts new file mode 100644 index 0000000..09472cd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/mod/IPackageJsonData.d.ts @@ -0,0 +1,11 @@ +export interface IPackageJsonData { + incompatibilities?: string[]; + dependencies?: string[]; + name: string; + author: string; + version: string; + akiVersion: string; + licence: string; + main: string; + contributors: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts new file mode 100644 index 0000000..c7d246a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts @@ -0,0 +1,4 @@ +export interface IRagfairServerPrices { + static: Record; + dynamic: Record; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IDatabaseTables.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IDatabaseTables.d.ts new file mode 100644 index 0000000..dbb71be --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IDatabaseTables.d.ts @@ -0,0 +1,51 @@ +import { IGlobals } from "../../eft/common/IGlobals"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { IBotType } from "../../eft/common/tables/IBotType"; +import { ICustomizationItem } from "../../eft/common/tables/ICustomizationItem"; +import { IHandbookBase } from "../../eft/common/tables/IHandbookBase"; +import { ILootBase } from "../../eft/common/tables/ILootBase"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IRepeatableQuestDatabase } from "../../eft/common/tables/IRepeatableQuests"; +import { ITemplateItem } from "../../eft/common/tables/ITemplateItem"; +import { ITrader } from "../../eft/common/tables/ITrader"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { ILocaleBase } from "./ILocaleBase"; +import { ILocations } from "./ILocations"; +import { IServerBase } from "./IServerBase"; +import { ISettingsBase } from "./ISettingsBase"; +export interface IDatabaseTables { + bots: { + types: Record; + base: IBotBase; + core: IBotCore; + }; + hideout: { + areas: IHideoutArea[]; + production: IHideoutProduction[]; + scavcase: IHideoutScavCase[]; + settings: IHideoutSettingsBase; + }; + locales: ILocaleBase; + locations: ILocations; + loot: ILootBase; + match: any; + templates: { + character: string[]; + items: Record; + quests: IQuest[]; + repeatableQuests: IRepeatableQuestDatabase; + clientItems: Record; + handbook: IHandbookBase; + customization: Record; + profiles: any; + prices: Record; + }; + traders: Record; + globals: IGlobals; + server: IServerBase; + settings: ISettingsBase; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IHttpServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IHttpServer.d.ts new file mode 100644 index 0000000..c828399 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IHttpServer.d.ts @@ -0,0 +1,12 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { INotification } from "../../eft/notifier/INotifier"; +export interface IHttpServer { + load(): void; + getCookies(req: http.IncomingMessage): any; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + sendMessage(sessionID: string, output: INotification): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ILocaleBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ILocaleBase.d.ts new file mode 100644 index 0000000..8887c06 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ILocaleBase.d.ts @@ -0,0 +1,61 @@ +export interface ILocaleBase { + global: Record; + menu: Record; + languages: ILanguageBase[]; +} +export interface ILocaleGlobalBase { + interface: Record; + enum: any[]; + mail: Record; + quest: Record; + preset: Record; + handbook: Record; + season: Record; + customization: Record; + repeatableQuest: Record; + templates: ILocaleTemplateBase; + locations: ILocaleLocationsBase; + banners: ILocaleBannersBase; + trading: ILocaleTradingBase; +} +export interface ILocaleQuest { + name: string; + description: string; + note: string; + failMessageText: string; + startedMessageText: string; + successMessageText: string; + conditions: Record; + location: string; +} +export interface ILocalePreset { + Name: string; +} +export interface ILocaleTemplateBase { + templates: Record; +} +export interface ILocaleLocationsBase { + locations: Record; +} +export interface ILocaleBannersBase { + locations: Record; +} +export interface ILocaleProps { + Name: string; + ShortName: string; + Description: string; +} +export interface ILocaleTradingBase { + locations: Record; +} +export interface ILocaleTradingProps { + FullName: string; + FirstName: string; + Nickname: string; + Location: string; + Description: string; +} +export interface ILanguageBase { + ShortName: string; + Name: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ILocations.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ILocations.d.ts new file mode 100644 index 0000000..18f0262 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ILocations.d.ts @@ -0,0 +1,26 @@ +import { ILocationBase } from "../../eft/common/ILocationBase"; +import { ILooseLoot } from "../../eft/common/ILooseLoot"; +import { ILocationsBase } from "../../eft/common/tables/ILocationsBase"; +export interface ILocations { + bigmap?: ILocationData; + develop?: ILocationData; + factory4_day?: ILocationData; + factory4_night?: ILocationData; + hideout?: ILocationData; + interchange?: ILocationData; + laboratory?: ILocationData; + lighthouse?: ILocationData; + privatearea?: ILocationData; + rezervbase?: ILocationData; + shoreline?: ILocationData; + suburbs?: ILocationData; + tarkovstreets?: ILocationData; + terminal?: ILocationData; + town?: ILocationData; + woods?: ILocationData; + base?: ILocationsBase; +} +export interface ILocationData { + base: ILocationBase; + looseLoot?: ILooseLoot; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IServerBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IServerBase.d.ts new file mode 100644 index 0000000..d033db3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/IServerBase.d.ts @@ -0,0 +1,4 @@ +export interface IServerBase { + ip: string; + port: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ISettingsBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ISettingsBase.d.ts new file mode 100644 index 0000000..c067cda --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/server/ISettingsBase.d.ts @@ -0,0 +1,43 @@ +export interface ISettingsBase { + config: Config; +} +export interface Config { + AFKTimeoutSeconds: number; + AdditionalRandomDelaySeconds: number; + ClientSendRateLimit: number; + CriticalRetriesCount: number; + DefaultRetriesCount: number; + FirstCycleDelaySeconds: number; + FramerateLimit: FramerateLimit; + GroupStatusInterval: number; + KeepAliveInterval: number; + Mark502and504AsNonImportant: boolean; + MemoryManagementSettings: MemoryManagementSettings; + NVidiaHighlights: boolean; + NextCycleDelaySeconds: number; + PingServerResultSendInterval: number; + PingServersInterval: number; + ReleaseProfiler: ReleaseProfiler; + SecondCycleDelaySeconds: number; + TurnOffLogging: boolean; + WeaponOverlapDistanceCulling: number; + WebDiagnosticsEnabled: boolean; +} +export interface FramerateLimit { + MaxFramerateGameLimit: number; + MaxFramerateLobbyLimit: number; + MinFramerateLimit: number; +} +export interface MemoryManagementSettings { + AggressiveGC: boolean; + GigabytesRequiredToDisableGCDuringRaid: number; + HeapPreAllocationEnabled: boolean; + HeapPreAllocationMB: number; + OverrideRamCleanerSettings: boolean; + RamCleanerEnabled: boolean; +} +export interface ReleaseProfiler { + Enabled: boolean; + MaxRecords: number; + RecordTriggerValue: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/IAsyncQueue.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/IAsyncQueue.d.ts new file mode 100644 index 0000000..2be801a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/IAsyncQueue.d.ts @@ -0,0 +1,4 @@ +import { ICommand } from "./ICommand"; +export interface IAsyncQueue { + waitFor(command: ICommand): Promise; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/ICommand.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/ICommand.d.ts new file mode 100644 index 0000000..696bb83 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/ICommand.d.ts @@ -0,0 +1,4 @@ +export interface ICommand { + uuid: string; + cmd: () => Promise; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/ILogger.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/ILogger.d.ts new file mode 100644 index 0000000..c983701 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/ILogger.d.ts @@ -0,0 +1,10 @@ +import { Daum } from "../../eft/itemEvent/IItemEventRouterRequest"; +export interface ILogger { + writeToLogFile(data: string | Daum): void; + log(data: string | Record | Error, color: string): void; + error(data: string): void; + warning(data: string): void; + success(data: string): void; + info(data: string): void; + debug(data: string | Record, onlyShowInConsole?: boolean): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/IUuidGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/IUuidGenerator.d.ts new file mode 100644 index 0000000..3870469 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/models/spt/utils/IUuidGenerator.d.ts @@ -0,0 +1,3 @@ +export interface IUUidGenerator { + generate(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/HttpRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/HttpRouter.d.ts new file mode 100644 index 0000000..f75a47d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/HttpRouter.d.ts @@ -0,0 +1,16 @@ +/// +import { IncomingMessage } from "http"; +import { DynamicRouter, Router, StaticRouter } from "../di/Router"; +export declare class HttpRouter { + protected staticRouters: StaticRouter[]; + protected dynamicRoutes: DynamicRouter[]; + constructor(staticRouters: StaticRouter[], dynamicRoutes: DynamicRouter[]); + protected groupBy(list: T[], keyGetter: (t: T) => string): Map; + getResponse(req: IncomingMessage, info: any, sessionID: string): string; + protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean; +} +declare class ResponseWrapper { + output: string; + constructor(output: string); +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/ImageRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/ImageRouter.d.ts new file mode 100644 index 0000000..ab03977 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/ImageRouter.d.ts @@ -0,0 +1,13 @@ +/// +import { IncomingMessage, ServerResponse } from "http"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ImageRouteService } from "../services/mod/image/ImageRouteService"; +import { VFS } from "../utils/VFS"; +export declare class ImageRouter { + protected vfs: VFS; + protected imageRouteService: ImageRouteService; + constructor(vfs: VFS, imageRouteService: ImageRouteService); + addRoute(key: string, valueToAdd: string): void; + sendImage(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any, httpServer: IHttpServer): void; + getImage(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/ItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/ItemEventRouter.d.ts new file mode 100644 index 0000000..b1ac5d9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/ItemEventRouter.d.ts @@ -0,0 +1,17 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { ItemEventRouterDefinition } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class ItemEventRouter { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected profileHelper: ProfileHelper; + protected itemEventRouters: ItemEventRouterDefinition[]; + constructor(logger: ILogger, jsonUtil: JsonUtil, profileHelper: ProfileHelper, itemEventRouters: ItemEventRouterDefinition[]); + protected output: IItemEventRouterResponse; + handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse; + getOutput(sessionID: string): IItemEventRouterResponse; + protected resetOutput(sessionID: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts new file mode 100644 index 0000000..6d0ab4b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BotDynamicRouter extends DynamicRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts new file mode 100644 index 0000000..a765410 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BundleDynamicRouter extends DynamicRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts new file mode 100644 index 0000000..2db7cc5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class CustomizationDynamicRouter extends DynamicRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts new file mode 100644 index 0000000..836ed8d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class DataDynamicRouter extends DynamicRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts new file mode 100644 index 0000000..a152b4d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter } from "../../di/Router"; +import { ImageRouter } from "../ImageRouter"; +export declare class HttpDynamicRouter extends DynamicRouter { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts new file mode 100644 index 0000000..7c0561f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class InraidDynamicRouter extends DynamicRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); + getTopLevelRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts new file mode 100644 index 0000000..b8e5cdf --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class LocationDynamicRouter extends DynamicRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); + getTopLevelRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts new file mode 100644 index 0000000..83c60c5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class NotifierDynamicRouter extends DynamicRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts new file mode 100644 index 0000000..5b7cc1b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class TraderDynamicRouter extends DynamicRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts new file mode 100644 index 0000000..e78445e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class CustomizationItemEventRouter extends ItemEventRouterDefinition { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts new file mode 100644 index 0000000..99847c6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HealthItemEventRouter extends ItemEventRouterDefinition { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts new file mode 100644 index 0000000..e1e98af --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HideoutCallbacks } from "../../callbacks/HideoutCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HideoutItemEventRouter extends ItemEventRouterDefinition { + protected hideoutCallbacks: HideoutCallbacks; + constructor(hideoutCallbacks: HideoutCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts new file mode 100644 index 0000000..a922cc0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InsuranceItemEventRouter extends ItemEventRouterDefinition { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts new file mode 100644 index 0000000..2619bb9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InventoryCallbacks } from "../../callbacks/InventoryCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InventoryItemEventRouter extends ItemEventRouterDefinition { + protected inventoryCallbacks: InventoryCallbacks; + constructor(inventoryCallbacks: InventoryCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts new file mode 100644 index 0000000..59bf598 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { NoteCallbacks } from "../../callbacks/NoteCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class NoteItemEventRouter extends ItemEventRouterDefinition { + protected noteCallbacks: NoteCallbacks; + constructor(noteCallbacks: NoteCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts new file mode 100644 index 0000000..277db44 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class PresetBuildItemEventRouter extends ItemEventRouterDefinition { + protected presetBuildCallbacks: PresetBuildCallbacks; + constructor(presetBuildCallbacks: PresetBuildCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts new file mode 100644 index 0000000..db59c25 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class QuestItemEventRouter extends ItemEventRouterDefinition { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts new file mode 100644 index 0000000..9216cc5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RagfairItemEventRouter extends ItemEventRouterDefinition { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts new file mode 100644 index 0000000..5196ba9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RepairCallbacks } from "../../callbacks/RepairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RepairItemEventRouter extends ItemEventRouterDefinition { + protected repairCallbacks: RepairCallbacks; + constructor(repairCallbacks: RepairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts new file mode 100644 index 0000000..a43bb0a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { TradeCallbacks } from "../../callbacks/TradeCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class TradeItemEventRouter extends ItemEventRouterDefinition { + protected tradeCallbacks: TradeCallbacks; + constructor(tradeCallbacks: TradeCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts new file mode 100644 index 0000000..38497fb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { WishlistCallbacks } from "../../callbacks/WishlistCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class WishlistItemEventRouter extends ItemEventRouterDefinition { + protected wishlistCallbacks: WishlistCallbacks; + constructor(wishlistCallbacks: WishlistCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts new file mode 100644 index 0000000..114f5b2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class HealthSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts new file mode 100644 index 0000000..4c00b40 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InraidSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts new file mode 100644 index 0000000..30ce98e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InsuranceSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts new file mode 100644 index 0000000..16c7619 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class ProfileSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/BundleSerializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/BundleSerializer.d.ts new file mode 100644 index 0000000..912db83 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/BundleSerializer.d.ts @@ -0,0 +1,11 @@ +import { Serializer } from "../../di/Serializer"; +import { BundleLoader } from "../../loaders/BundleLoader"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { ILogger } from "../../models/spt/utils/ILogger"; +export declare class BundleSerializer extends Serializer { + protected logger: ILogger; + protected bundleLoader: BundleLoader; + constructor(logger: ILogger, bundleLoader: BundleLoader); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/ImageSerializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/ImageSerializer.d.ts new file mode 100644 index 0000000..0e040d4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/ImageSerializer.d.ts @@ -0,0 +1,9 @@ +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { Serializer } from "../../di/Serializer"; +import { ImageRouter } from "../ImageRouter"; +export declare class ImageSerializer extends Serializer { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/NotifySerializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/NotifySerializer.d.ts new file mode 100644 index 0000000..1779ac9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/serializers/NotifySerializer.d.ts @@ -0,0 +1,11 @@ +import { NotifierController } from "../../controllers/NotifierController"; +import { Serializer } from "../../di/Serializer"; +import { HttpServerHelper } from "../../helpers/HttpServerHelper"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +export declare class NotifySerializer extends Serializer { + protected notifierController: NotifierController; + protected httpServerHelper: HttpServerHelper; + constructor(notifierController: NotifierController, httpServerHelper: HttpServerHelper); + serialize(_sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/BotStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/BotStaticRouter.d.ts new file mode 100644 index 0000000..aeea220 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/BotStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BotStaticRouter extends StaticRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/BundleStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/BundleStaticRouter.d.ts new file mode 100644 index 0000000..fb682fc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/BundleStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BundleStaticRouter extends StaticRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/CustomizationStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/CustomizationStaticRouter.d.ts new file mode 100644 index 0000000..21bc4bb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/CustomizationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class CustomizationStaticRouter extends StaticRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/DataStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/DataStaticRouter.d.ts new file mode 100644 index 0000000..84ba7fd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/DataStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DataStaticRouter extends StaticRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/DialogStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/DialogStaticRouter.d.ts new file mode 100644 index 0000000..546cdf1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/DialogStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DialogueCallbacks } from "../../callbacks/DialogueCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DialogStaticRouter extends StaticRouter { + protected dialogueCallbacks: DialogueCallbacks; + constructor(dialogueCallbacks: DialogueCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/GameStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/GameStaticRouter.d.ts new file mode 100644 index 0000000..a9a7496 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/GameStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { GameCallbacks } from "../../callbacks/GameCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class GameStaticRouter extends StaticRouter { + protected gameCallbacks: GameCallbacks; + constructor(gameCallbacks: GameCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/HealthStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/HealthStaticRouter.d.ts new file mode 100644 index 0000000..863fd5e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/HealthStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class HealthStaticRouter extends StaticRouter { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/InraidStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/InraidStaticRouter.d.ts new file mode 100644 index 0000000..b29ad23 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/InraidStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InraidStaticRouter extends StaticRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/InsuranceStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/InsuranceStaticRouter.d.ts new file mode 100644 index 0000000..5676499 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/InsuranceStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InsuranceStaticRouter extends StaticRouter { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/ItemEventStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/ItemEventStaticRouter.d.ts new file mode 100644 index 0000000..c30a7fc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/ItemEventStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ItemEventCallbacks } from "../../callbacks/ItemEventCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ItemEventStaticRouter extends StaticRouter { + protected itemEventCallbacks: ItemEventCallbacks; + constructor(itemEventCallbacks: ItemEventCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/LauncherStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/LauncherStaticRouter.d.ts new file mode 100644 index 0000000..0040cbd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/LauncherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LauncherCallbacks } from "../../callbacks/LauncherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LauncherStaticRouter extends StaticRouter { + protected launcherCallbacks: LauncherCallbacks; + constructor(launcherCallbacks: LauncherCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/LocationStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/LocationStaticRouter.d.ts new file mode 100644 index 0000000..b6de956 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/LocationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LocationStaticRouter extends StaticRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/MatchStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/MatchStaticRouter.d.ts new file mode 100644 index 0000000..9920a92 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/MatchStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { MatchCallbacks } from "../../callbacks/MatchCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class MatchStaticRouter extends StaticRouter { + protected matchCallbacks: MatchCallbacks; + constructor(matchCallbacks: MatchCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/NotifierStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/NotifierStaticRouter.d.ts new file mode 100644 index 0000000..8f1f5cc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/NotifierStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class NotifierStaticRouter extends StaticRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/PresetStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/PresetStaticRouter.d.ts new file mode 100644 index 0000000..a9e7458 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/PresetStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class PresetStaticRouter extends StaticRouter { + protected presetCallbacks: PresetBuildCallbacks; + constructor(presetCallbacks: PresetBuildCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/ProfileStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/ProfileStaticRouter.d.ts new file mode 100644 index 0000000..83403f2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/ProfileStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ProfileCallbacks } from "../../callbacks/ProfileCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ProfileStaticRouter extends StaticRouter { + protected profileCallbacks: ProfileCallbacks; + constructor(profileCallbacks: ProfileCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/QuestStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/QuestStaticRouter.d.ts new file mode 100644 index 0000000..8f7ca0a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/QuestStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class QuestStaticRouter extends StaticRouter { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/RagfairStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/RagfairStaticRouter.d.ts new file mode 100644 index 0000000..6c41467 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/RagfairStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class RagfairStaticRouter extends StaticRouter { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/TraderStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/TraderStaticRouter.d.ts new file mode 100644 index 0000000..41728a1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/TraderStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class TraderStaticRouter extends StaticRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/WeatherStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/WeatherStaticRouter.d.ts new file mode 100644 index 0000000..72ed851 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/routers/static/WeatherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { WeatherCallbacks } from "../../callbacks/WeatherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class WeatherStaticRouter extends StaticRouter { + protected weatherCallbacks: WeatherCallbacks; + constructor(weatherCallbacks: WeatherCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/ConfigServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/ConfigServer.d.ts new file mode 100644 index 0000000..a079be8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/ConfigServer.d.ts @@ -0,0 +1,14 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigTypes } from "../models/enums/ConfigTypes"; +export declare class ConfigServer { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected configs: Record; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil); + getConfig(configType: ConfigTypes): T; + getConfigByString(configType: string): T; + initialize(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/DatabaseServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/DatabaseServer.d.ts new file mode 100644 index 0000000..aa152d0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/DatabaseServer.d.ts @@ -0,0 +1,6 @@ +import { IDatabaseTables } from "../models/spt/server/IDatabaseTables"; +export declare class DatabaseServer { + protected tableData: IDatabaseTables; + getTables(): IDatabaseTables; + setTables(any: any): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/HttpServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/HttpServer.d.ts new file mode 100644 index 0000000..5234966 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/HttpServer.d.ts @@ -0,0 +1,49 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { Serializer } from "../di/Serializer"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { HttpRouter } from "../routers/HttpRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ConfigServer } from "./ConfigServer"; +import { DatabaseServer } from "./DatabaseServer"; +export declare class HttpServer implements IHttpServer { + protected httpRouter: HttpRouter; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected serializers: Serializer[]; + protected configServer: ConfigServer; + constructor(httpRouter: HttpRouter, // TODO: delay required + logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, serializers: Serializer[], configServer: ConfigServer); + protected buffers: {}; + protected onReceive: {}; + protected onRespond: {}; + protected httpConfig: IHttpConfig; + protected webSockets: {}; + protected websocketPingHandler: any; + getCookies(req: http.IncomingMessage): any; + resetBuffer(sessionID: string): void; + putInBuffer(sessionID: any, data: any, bufLength: number): boolean; + getFromBuffer(sessionID: string): any; + sendZlibJson(resp: any, output: any, sessionID: string): void; + sendMessage(sessionID: string, output: INotification): void; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + handleRequest(req: http.IncomingMessage, resp: http.ServerResponse): void; + load(): void; + protected getRandomisedMessage(): string; + wsOnConnection(ws: any, req: any): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/RagfairServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/RagfairServer.d.ts new file mode 100644 index 0000000..60c92b5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/RagfairServer.d.ts @@ -0,0 +1,31 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { ConfigServer } from "./ConfigServer"; +export declare class RagfairServer { + protected logger: ILogger; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairCategoriesService: RagfairCategoriesService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairOfferService: RagfairOfferService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); + load(): void; + update(): void; + getCategories(): Record; + /** + * Disable/Hide an offer from flea + * @param offerId + */ + hideOffer(offerId: string): void; + getOffer(offerID: string): IRagfairOffer; + getOffers(): IRagfairOffer[]; + removeOfferStack(offerID: string, amount: number): void; + doesOfferExist(offerId: string): boolean; + addPlayerOffers(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/SaveServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/SaveServer.d.ts new file mode 100644 index 0000000..cb28f49 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/servers/SaveServer.d.ts @@ -0,0 +1,28 @@ +import { IAkiProfile, Info } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { SaveLoadRouter } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class SaveServer { + protected vfs: VFS; + protected saveLoadRouters: SaveLoadRouter[]; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected profileFilepath: string; + protected profiles: {}; + protected onSave: {}; + protected saveMd5: {}; + constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger); + load(): void; + save(): void; + getProfile(sessionId: string): IAkiProfile; + getProfiles(): Record; + deleteProfileById(sessionID: string): boolean; + createProfile(profileInfo: Info): void; + addProfile(profileDetails: IAkiProfile): void; + loadProfile(sessionID: string): void; + saveProfile(sessionID: string): void; + removeProfile(sessionID: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/FenceService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/FenceService.d.ts new file mode 100644 index 0000000..12723fb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/FenceService.d.ts @@ -0,0 +1,39 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { FenceLevel } from "../models/eft/common/IGlobals"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class FenceService { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected fenceAssort: ITraderAssort; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, presetHelper: PresetHelper, configServer: ConfigServer); + protected setFenceAssort(fenceAssort: ITraderAssort): void; + getFenceAssorts(): ITraderAssort; + hasExpiredCache(refreshAssort: boolean): boolean; + generateFenceAssortCache(pmcData: IPmcData): void; + /** + * + * @param pmcData Get the fence level the passed in profile has + * @returns FenceLevel + */ + getFenceInfo(pmcData: IPmcData): FenceLevel; + removeFenceOffer(assortIdToRemove: string): void; + updateFenceOffers(pmcData: IPmcData): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/HashCacheService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/HashCacheService.d.ts new file mode 100644 index 0000000..5320f28 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/HashCacheService.d.ts @@ -0,0 +1,19 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +export declare class HashCacheService { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected jsonHashes: any; + protected modHashes: any; + protected readonly modCachePath = "./user/cache/modCache.json"; + constructor(vfs: VFS, hashUtil: HashUtil, jsonUtil: JsonUtil, logger: ILogger); + getStoredModHash(modName: string): string; + modContentMatchesStoredHash(modName: string, modContent: string): boolean; + hashMatchesStoredHash(modName: string, modHash: string): boolean; + storeModContent(modName: string, modContent: string): void; + storeModHash(modName: string, modHash: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/InsuranceService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/InsuranceService.d.ts new file mode 100644 index 0000000..0219816 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/InsuranceService.d.ts @@ -0,0 +1,42 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { SecureContainerHelper } from "../helpers/SecureContainerHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected secureContainerHelper: SecureContainerHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected traderHelper: TraderHelper; + protected dialogueHelper: DialogueHelper; + protected configServer: ConfigServer; + protected insured: Record>; + protected templatesById: {}; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, secureContainerHelper: SecureContainerHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, saveServer: SaveServer, traderHelper: TraderHelper, dialogueHelper: DialogueHelper, configServer: ConfigServer); + insuranceExists(sessionId: string): boolean; + insuranceTraderArrayExists(sessionId: string, traderId: string): boolean; + getInsurance(sessionId: string): Record; + getInsuranceItems(sessionId: string, traderId: string): any[]; + resetInsurance(sessionId: string): void; + resetInsuranceTraderArray(sessionId: string, traderId: string): void; + addInsuranceItemToArray(sessionId: string, traderId: string, itemToAdd: any): void; + getItemPrice(_tpl: string): number; + generateTemplatesById(): void; + sendInsuredItems(pmcData: IPmcData, sessionID: string): void; + storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + protected addGearToSend(pmcData: IPmcData, insuredItem: any, actualItem: any, sessionID: string): any; + getPremium(pmcData: IPmcData, inventoryItem: Item, traderId: string): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/MatchLocationService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/MatchLocationService.d.ts new file mode 100644 index 0000000..2b5fc0e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/MatchLocationService.d.ts @@ -0,0 +1,8 @@ +import { TimeUtil } from "../utils/TimeUtil"; +export declare class MatchLocationService { + protected timeUtil: TimeUtil; + protected locations: {}; + constructor(timeUtil: TimeUtil); + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/ModCompilerService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/ModCompilerService.d.ts new file mode 100644 index 0000000..26cb4ac --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/ModCompilerService.d.ts @@ -0,0 +1,20 @@ +import * as ts from "typescript"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { VFS } from "../utils/VFS"; +import { HashCacheService } from "./HashCacheService"; +export declare class ModCompilerService { + protected logger: ILogger; + protected hashCacheService: HashCacheService; + protected vfs: VFS; + constructor(logger: ILogger, hashCacheService: HashCacheService, vfs: VFS); + compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise; + protected compile(fileNames: string[], options: ts.CompilerOptions): Promise; + protected buildDepth(depth: number): string; + protected getNodesModulesPath(depth: number): string; + protected getAkiPath(depth: number): string; + protected getAkiFolder(): string; + protected getNodesModulesFolder(): string; + protected calculateDepth(file: string): number; + protected areFilesReady(fileNames: string[]): boolean; + protected delay(ms: number): Promise; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/NotificationService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/NotificationService.d.ts new file mode 100644 index 0000000..7e2a127 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/NotificationService.d.ts @@ -0,0 +1,21 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +export declare class NotificationService { + protected messageQueue: {}; + getMessageQueue(): {}; + getMessageFromQueue(sessionId: string): any; + updateMessageOnQueue(sessionId: string, value: any[]): void; + has(sessionID: string): boolean; + /** + * Pop first message from queue. + */ + pop(sessionID: string): any; + /** + * Add message to queue + */ + add(sessionID: string, message: INotification): void; + /** + * Get message queue for session + * @param sessionID + */ + get(sessionID: string): any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/PaymentService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/PaymentService.d.ts new file mode 100644 index 0000000..5834750 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/PaymentService.d.ts @@ -0,0 +1,49 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PaymentService { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + /** + * Take money and insert items into return to server request + * @param {Object} pmcData + * @param {Object} body + * @param {string} sessionID + * @returns Object + */ + payMoney(pmcData: IPmcData, body: IProcessBuyTradeRequestData, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Receive money back after selling + * @param {IPmcData} pmcData + * @param {number} amount + * @param {IProcessSellTradeRequestData} body + * @param {IItemEventRouterResponse} output + * @param {string} sessionID + * @returns IItemEventRouterResponse + */ + getMoney(pmcData: IPmcData, amount: number, body: IProcessSellTradeRequestData, output: IItemEventRouterResponse, sessionID: string): IItemEventRouterResponse; + /** + * Recursively checks if the given item is + * inside the stash, that is it has the stash as + * ancestor with slotId=hideout + */ + protected isItemInStash(pmcData: IPmcData, item: Item): boolean; + addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/PlayerService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/PlayerService.d.ts new file mode 100644 index 0000000..519b7e5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/PlayerService.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPlayerIncrementSkillLevelRequestData } from "../models/eft/player/IPlayerIncrementSkillLevelRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PlayerService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, databaseServer: DatabaseServer); + /** + * increases the profile skill and updates any output + * @param {Object} pmcData + * @param {Object} output + * @param {String} skillName + * @param {Number} amount + */ + incrementSkillLevel(pmcData: IPmcData, output: IPlayerIncrementSkillLevelRequestData, skillName: string, amount: number): void; + /** + * @param {Object} pmcData + * @returns number + */ + calculateLevel(pmcData: IPmcData): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairCategoriesService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairCategoriesService.d.ts new file mode 100644 index 0000000..09956cc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairCategoriesService.d.ts @@ -0,0 +1,10 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +export declare class RagfairCategoriesService { + updateCategories(offers: IRagfairOffer[]): void; + protected categories: Record; + getCategories(): Record; + getCategoryByItemId(itemId: string): number; + resetCategories(): void; + setCategoryValue(itemId: string, newValue: number): void; + incrementCategory(itemId: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairLinkedItemService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairLinkedItemService.d.ts new file mode 100644 index 0000000..6c34ee0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairLinkedItemService.d.ts @@ -0,0 +1,10 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +export declare class RagfairLinkedItemService { + protected databaseServer: DatabaseServer; + protected linkedItemsCache: Record>; + constructor(databaseServer: DatabaseServer); + getLinkedItems(linkedSearchId: string): Iterable; + protected buildLinkedItemTable(): void; + protected getFilters(item: ITemplateItem, slot: string): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairOfferService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairOfferService.d.ts new file mode 100644 index 0000000..7afbf8c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairOfferService.d.ts @@ -0,0 +1,66 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairOfferService { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected ragfairServerHelper: RagfairServerHelper; + protected profileHelper: ProfileHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected playerOffersLoaded: boolean; + protected toUpdate: Record; + protected expiredOffers: Item[]; + protected offers: IRagfairOffer[]; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, configServer: ConfigServer); + getOffers(): IRagfairOffer[]; + getOfferByOfferId(offerId: string): IRagfairOffer; + getOffersOfType(templateId: string): IRagfairOffer[]; + addOffer(offer: IRagfairOffer): void; + addOfferToExpired(offer: Item): void; + setTraderUpdateStatus(traderId: string, shouldUpdate: boolean): void; + shouldTraderBeUpdated(traderID: string): boolean; + getExpiredOfferCount(): number; + /** + * Get an array of expired items not yet processed into new offers + * @returns items that need to be turned into offers + */ + getExpiredOffers(): Item[]; + resetExpiredOffers(): void; + /** + * Does the offer exist on the ragfair + * @param offerId offer id to check for + * @returns offer exists - true + */ + doesOfferExist(offerId: string): boolean; + getTraders(): Record; + flagTraderForUpdate(expiredOfferUserId: string): void; + removeOfferById(offerId: string): void; + removeOfferStack(offerID: string, amount: number): void; + removeAllOffersByTrader(traderId: string): void; + addTradersToUpdateList(): void; + addPlayerOffers(): void; + expireStaleOffers(): void; + /** + * Get an array of stale offers that are still shown to player + * @returns IRagfairOffer array + */ + protected getStaleOffers(): IRagfairOffer[]; + protected isStale(offer: IRagfairOffer, time: number): boolean; + protected processStaleOffer(staleOffer: IRagfairOffer): void; + protected returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairPriceService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairPriceService.d.ts new file mode 100644 index 0000000..5256b99 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairPriceService.d.ts @@ -0,0 +1,32 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { IRagfairServerPrices } from "../models/spt/ragfair/IRagfairServerPrices"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RagfairPriceService { + protected handbookHelper: HandbookHelper; + protected databaseServer: DatabaseServer; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected prices: IRagfairServerPrices; + constructor(handbookHelper: HandbookHelper, databaseServer: DatabaseServer, logger: ILogger, itemHelper: ItemHelper, presetHelper: PresetHelper, randomUtil: RandomUtil, configServer: ConfigServer); + generateStaticPrices(): void; + generateDynamicPrices(): void; + hasDynamicPrices(): boolean; + getDynamicPrice(itemTpl: string): number; + getAllFleaPrices(): Record; + getFleaPriceForItem(tplId: string): number; + getBarterPrice(barterScheme: IBarterScheme[]): number; + getDynamicOfferPrice(items: Item[], desiredCurrency: string): number; + getWeaponPresetPrice(item: Item, items: Item[], existingPrice: number): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairRequiredItemsService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairRequiredItemsService.d.ts new file mode 100644 index 0000000..b05fc65 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/RagfairRequiredItemsService.d.ts @@ -0,0 +1,12 @@ +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairRequiredItemsService { + protected logger: ILogger; + protected paymentHelper: PaymentHelper; + protected ragfairOfferService: RagfairOfferService; + protected requiredItemsCache: {}; + constructor(logger: ILogger, paymentHelper: PaymentHelper, ragfairOfferService: RagfairOfferService); + getRequiredItems(searchId: string): any; + buildRequiredItemTable(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/TraderAssortService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/TraderAssortService.d.ts new file mode 100644 index 0000000..5ba2d05 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/TraderAssortService.d.ts @@ -0,0 +1,6 @@ +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +export declare class TraderAssortService { + protected pristineTraderAssorts: Record; + getPristineTraderAssort(traderId: string): ITraderAssort; + setPristineTraderAssort(traderId: string, assort: ITraderAssort): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts new file mode 100644 index 0000000..abfe237 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter, RouteAction } from "../../../di/Router"; +export declare class DynamicRouterMod extends DynamicRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts new file mode 100644 index 0000000..6742fc6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class DynamicRouterModService { + private container; + constructor(container: DependencyContainer); + registerDynamicRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/image/imageRouteService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/image/imageRouteService.d.ts new file mode 100644 index 0000000..29569b2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/image/imageRouteService.d.ts @@ -0,0 +1,6 @@ +export declare class ImageRouteService { + protected routes: Record; + addRoute(urlKey: string, route: string): void; + getByKey(urlKey: string): string; + existsByKey(urlKey: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts new file mode 100644 index 0000000..53fb062 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts @@ -0,0 +1,8 @@ +import { OnLoad } from "../../../di/OnLoad"; +export declare class OnLoadMod extends OnLoad { + private onLoadOverride; + private getRouteOverride; + constructor(onLoadOverride: () => void, getRouteOverride: () => string); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts new file mode 100644 index 0000000..f402103 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnLoadModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts new file mode 100644 index 0000000..ee89043 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts @@ -0,0 +1,8 @@ +import { OnUpdate } from "../../../di/OnUpdate"; +export declare class OnUpdateMod extends OnUpdate { + private onUpdateOverride; + private getRouteOverride; + constructor(onUpdateOverride: (timeSinceLastRun: number) => boolean, getRouteOverride: () => string); + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts new file mode 100644 index 0000000..05d735b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnUpdateModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts new file mode 100644 index 0000000..1e62747 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts @@ -0,0 +1,6 @@ +import { RouteAction, StaticRouter } from "../../../di/Router"; +export declare class StaticRouterMod extends StaticRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts new file mode 100644 index 0000000..f28fd45 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class StaticRouterModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/App.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/App.d.ts new file mode 100644 index 0000000..34c141e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/App.d.ts @@ -0,0 +1,14 @@ +import { TimeUtil } from "./TimeUtil"; +import { OnLoad } from "../di/OnLoad"; +import { OnUpdate } from "../di/OnUpdate"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class App { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected onLoadComponents: OnLoad[]; + protected onUpdateComponents: OnUpdate[]; + protected onUpdateLastRun: {}; + constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]); + load(): void; + protected update(onUpdateComponents: OnUpdate[]): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/AyncQueue.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/AyncQueue.d.ts new file mode 100644 index 0000000..da6ab18 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/AyncQueue.d.ts @@ -0,0 +1,7 @@ +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { ICommand } from "../models/spt/utils/ICommand"; +export declare class AsyncQueue implements IAsyncQueue { + protected commandsQueue: ICommand[]; + constructor(); + waitFor(command: ICommand): Promise; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/DatabaseImporter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/DatabaseImporter.d.ts new file mode 100644 index 0000000..0857b67 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/DatabaseImporter.d.ts @@ -0,0 +1,18 @@ +import { VFS } from "./VFS"; +import { JsonUtil } from "./JsonUtil"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ImageRouter } from "../routers/ImageRouter"; +import { OnLoad } from "../di/OnLoad"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class DatabaseImporter extends OnLoad { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected imageRouter: ImageRouter; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter); + onLoad(): void; + getRoute(): string; + loadRecursive(filepath: string): any; + loadImages(filepath: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/HashUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/HashUtil.d.ts new file mode 100644 index 0000000..bacbf2a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/HashUtil.d.ts @@ -0,0 +1,11 @@ +/// +import crypto from "crypto"; +import { TimeUtil } from "./TimeUtil"; +export declare class HashUtil { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + generate(): string; + generateMd5ForData(data: string): string; + generateSha1ForData(data: string): string; + generateHashForData(algorithm: string, data: crypto.BinaryLike): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/HttpResponseUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/HttpResponseUtil.d.ts new file mode 100644 index 0000000..29502be --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/HttpResponseUtil.d.ts @@ -0,0 +1,16 @@ +import { JsonUtil } from "./JsonUtil"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class HttpResponseUtil { + protected jsonUtil: JsonUtil; + constructor(jsonUtil: JsonUtil); + protected clearString(s: string): any; + noBody(data: any): any; + getBody(data: T, err?: number, errmsg?: any): IGetBodyResponseData; + getUnclearedBody(data: any, err?: number, errmsg?: any): string; + emptyResponse(): IGetBodyResponseData; + nullResponse(): INullResponseData; + emptyArrayResponse(): IGetBodyResponseData; + appendErrorToOutput(output: IItemEventRouterResponse, message?: string, title?: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/JsonUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/JsonUtil.d.ts new file mode 100644 index 0000000..71e95f6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/JsonUtil.d.ts @@ -0,0 +1,25 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "./HashUtil"; +import { VFS } from "./VFS"; +export declare class JsonUtil { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected fileHashes: any; + constructor(vfs: VFS, hashUtil: HashUtil, logger: ILogger); + /** + * From object to string + * @param data object to turn into JSON + * @param prettify Should output be prettified? + * @returns string + */ + serialize(data: any, prettify?: boolean): string; + /** + * From string to object + * @param jsonString json string to turn into object + * @returns object + */ + deserialize(jsonString: string): any; + deserializeWithCacheCheck(jsonString: string, filePath: string): string; + clone(data: T): T; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/Logger.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/Logger.d.ts new file mode 100644 index 0000000..f5b774b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/Logger.d.ts @@ -0,0 +1,51 @@ +/// +import { Daum } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ILogger } from "../models/spt/utils/ILogger"; +import winston from "winston"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +import fs from "fs"; +interface SptLogger { + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} +export declare class WinstonLogger implements ILogger { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + protected showDebugInConsole: boolean; + protected folderPath: string; + protected file: string; + protected filePath: string; + protected logLevels: { + levels: { + error: number; + warn: number; + succ: number; + info: number; + custom: number; + debug: number; + }; + colors: { + error: string; + warn: string; + succ: string; + info: string; + custom: string; + debug: string; + }; + }; + protected logger: winston.Logger & SptLogger; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + writeToLogFile(data: string | Daum): Promise; + log(data: string | Error | Record, color: string): Promise; + error(data: string | Record): Promise; + warning(data: string | Record): Promise; + success(data: string | Record): Promise; + info(data: string | Record): Promise; + debug(data: string | Record, onlyShowInConsole?: boolean): Promise; +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/MathUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/MathUtil.d.ts new file mode 100644 index 0000000..ea5fd69 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/MathUtil.d.ts @@ -0,0 +1,53 @@ +export declare class MathUtil { + /** + * Helper to create the sum of all array elements + * @param {array} values The array with numbers of which to calculate the sum + * @return {number} sum(values) + */ + arraySum(values: number[]): number; + /** + * Helper to create the cumulative sum of all array elements + * arrayCumsum([1, 2, 3, 4]) = [1, 3, 6, 10] + * @param {array} values The array with numbers of which to calculate the cumulative sum + * @return {array} cumsum(values) + */ + arrayCumsum(values: number[]): number[]; + /** + * Helper to create the product of each element times factor + * @param {array} values The array of numbers which shall be multiplied by the factor + * @return {array} array times factor + */ + arrayProd(values: number[], factor: number): number[]; + /** + * Helper to add a constant to all array elements + * @param {array} values The array of numbers to which the summand should be added + * @return {array} array plus summand + */ + arrayAdd(values: number[], summand: number): number[]; + /** + * Map a value from an input range to an output range linearly + * + * Example: + * a_min = 0; a_max=1; + * b_min = 1; b_max=3; + * MathUtil.mapToRange(0.5, a_min, a_max, b_min, b_max) // returns 2 + * + * @param {number} x The value from input range to be mapped to output range + * @param {number} minIn min of input range + * @param {number} maxIn max of input range + * @param {number} minOut min of output range + * @param {number} maxOut max of outout range + * @return {number} the result of the mapping + */ + mapToRange(x: number, minIn: number, maxIn: number, minOut: number, maxOut: number): number; + /** + * Linear interpolation + * e.g. used to do a continuous integration for quest rewards which are defined for specific support centers of pmcLevel + * + * @param {string} xp the point of x at which to interpolate + * @param {array} x support points in x (of same length as y) + * @param {array} y support points in y (of same length as x) + * @return {number} y(xp) + */ + interp1(xp: number, x: number[], y: number[]): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/ObjectId.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/ObjectId.d.ts new file mode 100644 index 0000000..03aae56 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/ObjectId.d.ts @@ -0,0 +1,14 @@ +/// +import { TimeUtil } from "./TimeUtil"; +export declare class ObjectId { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + protected randomBytes: Buffer; + protected constglobalCounter: number; + protected consttime: number; + protected globalCounter: number; + protected time: number; + incGlobalCounter(): number; + toHexString(byteArray: string | any[] | Buffer): string; + generate(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/RandomUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/RandomUtil.d.ts new file mode 100644 index 0000000..c24dd60 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/RandomUtil.d.ts @@ -0,0 +1,153 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "./JsonUtil"; +import { MathUtil } from "./MathUtil"; +/** + * Array of ProbabilityObjectArray which allow to randomly draw of the contained objects + * based on the relative probability of each of its elements. + * The probabilities of the contained element is not required to be normalized. + * + * Example: + * po = new ProbabilityObjectArray( + * new ProbabilityObject("a", 5), + * new ProbabilityObject("b", 1), + * new ProbabilityObject("c", 1) + * ); + * res = po.draw(10000); + * // count the elements which should be distributed according to the relative probabilities + * res.filter(x => x==="b").reduce((sum, x) => sum + 1 , 0) + */ +export declare class ProbabilityObjectArray extends Array> { + private mathUtil; + constructor(mathUtil: MathUtil, ...items: ProbabilityObject[]); + filter(callbackfn: (value: ProbabilityObject, index: number, array: ProbabilityObject[]) => any): ProbabilityObjectArray; + /** + * Calculates the normalized cumulative probability of the ProbabilityObjectArray's elements normalized to 1 + * @param {array} probValues The relative probability values of which to calculate the normalized cumulative sum + * @returns {array} Cumulative Sum normalized to 1 + */ + cumulativeProbability(probValues: number[]): number[]; + /** + * Clone this ProbabilitObjectArray + * @returns {ProbabilityObjectArray} Deep Copy of this ProbabilityObjectArray + */ + clone(): ProbabilityObjectArray; + /** + * Drop an element from the ProbabilityObjectArray + * + * @param {string} key The key of the element to drop + * @returns {ProbabilityObjectArray} ProbabilityObjectArray without the dropped element + */ + drop(key: K): ProbabilityObjectArray; + /** + * Return the data field of a element of the ProbabilityObjectArray + * @param {string} key The key of the element whose data shall be retrieved + * @returns {object} The data object + */ + data(key: K): V; + /** + * Get the relative probability of an element by its key + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @param {string} key The key of the element whose relative probability shall be retrieved + * @return {number} The relative probability + */ + probability(key: K): number; + /** + * Get the maximum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @return {number} the maximum value of all relative probabilities in this ProbabilityObjectArray + */ + maxProbability(): number; + /** + * Get the minimum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.minProbability() // returns 1 + * + * @return {number} the minimum value of all relative probabilities in this ProbabilityObjectArray + */ + minProbability(): number; + /** + * Draw random element of the ProbabilityObject N times to return an array of N keys. + * Drawing can be with or without replacement + * + * @param {integer} count The number of times we want to draw + * @param {boolean} replacement Draw with or without replacement from the input dict + * @param {array} locklist list keys which shall be replaced even if drawing without replacement + * @return {array} Array consisting of N random keys for this ProbabilityObjectArray + */ + draw(count?: number, replacement?: boolean, locklist?: Array): K[]; +} +/** + * A ProbabilityObject which is use as an element to the ProbabilityObjectArray array + * It contains a key, the relative probability as well as optional data. + */ +export declare class ProbabilityObject { + key: K; + relativeProbability: number; + data: V; + /** + * Constructor for the ProbabilityObject + * @param {string} key The key of the element + * @param {number} relativeProbability The relative probability of this element + * @param {any} data Optional data attached to the element + */ + constructor(key: K, relativeProbability: number, data?: V); +} +export declare class RandomUtil { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + constructor(jsonUtil: JsonUtil, logger: ILogger); + getInt(min: number, max: number): number; + getIntEx(max: number): number; + getFloat(min: number, max: number): number; + getBool(): boolean; + getStringArrayValue(arr: string[]): string; + getArrayValue(arr: T[]): T; + getKey(node: any): string; + getKeyValue(node: { + [x: string]: any; + }): any; + /** + * Draw from normal distribution + * @param {number} mu Mean of the normal distribution + * @param {number} sigma Standard deviation of the normal distribution + * @returns {number} The value drawn + */ + randn(mu: number, sigma: number): number; + /** + * Draw Random integer low inclusive, high exclusive + * if high is not set we draw from 0 to low (exclusive) + * @param {integer} low Lower bound inclusive, when high is not set, this is high + * @param {integer} high Higher bound exclusive + * @returns {integer} The random integer in [low, high) + */ + randInt(low: number, high?: number): number; + /** + * Draw a random element of the provided list N times to return an array of N random elements + * 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 + * @return {array} Array consisting of N random elements + */ + drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; + /** + * Draw a random (top level) element of the provided dictionary N times to return an array of N random dictionary keys + * Drawing can be with or without replacement + * @param {any} dict The dictionary 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 dict + * @return {array} Array consisting of N random keys of the dictionary + */ + drawRandomFromDict(dict: any, count?: number, replacement?: boolean): any[]; + getBiasedRandomNumber(min: number, max: number, shift: number, n: number): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/TimeUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/TimeUtil.d.ts new file mode 100644 index 0000000..9733be9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/TimeUtil.d.ts @@ -0,0 +1,8 @@ +export declare class TimeUtil { + static readonly oneHourAsSeconds = 3600; + formatTime(date: Date): string; + formatDate(date: Date): string; + getDate(): string; + getTime(): string; + getTimestamp(): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/UUidGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/UUidGenerator.d.ts new file mode 100644 index 0000000..000b719 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/UUidGenerator.d.ts @@ -0,0 +1,4 @@ +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class UUidGenerator implements IUUidGenerator { + generate: () => string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/VFS.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/VFS.d.ts new file mode 100644 index 0000000..e5eaf02 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/VFS.d.ts @@ -0,0 +1,55 @@ +/// +/// +import "reflect-metadata"; +import fs from "fs"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class VFS { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; + copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; + mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { + recursive: true; + }) => Promise; + readFilePromisify: (path: fs.PathLike) => Promise; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + readdirPromisify: (path: fs.PathLike, options?: BufferEncoding | { + encoding: BufferEncoding; + withFileTypes?: false; + }) => Promise; + statPromisify: (path: fs.PathLike, options?: fs.StatOptions & { + bigint?: false; + }) => Promise; + unlinkPromisify: (path: fs.PathLike) => Promise; + rmdirPromisify: (path: fs.PathLike) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + exists(filepath: fs.PathLike): boolean; + existsAsync(filepath: fs.PathLike): Promise; + copyFile(filepath: fs.PathLike, target: fs.PathLike): void; + copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise; + createDir(filepath: string): void; + createDirAsync(filepath: string): Promise; + copyDir(filepath: string, target: string, fileExtensions?: string | string[]): void; + copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise; + readFile(filepath: string): any; + readFileAsync(filepath: string): Promise; + writeFile(filepath: any, data?: string, append?: boolean, atomic?: boolean): void; + writeFileAsync(filepath: any, data?: string, append?: boolean, atomic?: boolean): Promise; + getFiles(filepath: string): string[]; + getFilesAsync(filepath: string): Promise; + getDirs(filepath: string): string[]; + getDirsAsync(filepath: string): Promise; + removeFile(filepath: string): void; + removeFileAsync(filepath: string): Promise; + removeDir(filepath: string): void; + removeDirAsync(filepath: string): Promise; + private lockFileSync; + private checkFileSync; + private unlockFileSync; + getFileExtension(filepath: string): string; + stripExtension(filepath: string): string; + minifyAllJsonInDirRecursive(filepath: string): Promise; + minifyAllJsonInDirRecursiveAsync(filepath: string): Promise; + getFilesOfType(directory: string, fileType: string, files?: string[]): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/Watermark.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/Watermark.d.ts new file mode 100644 index 0000000..111bdd0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/Watermark.d.ts @@ -0,0 +1,41 @@ +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WatermarkLocale { + protected locales: { + "en-US": { + description: string[]; + warning: string[]; + modding: string[]; + }; + "zh-CN": { + description: string[]; + warning: string[]; + modding: string[]; + }; + }; + getLocale(): string; + getDescription(): string[]; + getWarning(): string[]; + getModding(): string[]; +} +export declare class Watermark { + protected logger: ILogger; + protected configServer: ConfigServer; + protected watermarkLocale?: WatermarkLocale; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale); + protected text: string[]; + protected versionLabel: string; + initialize(): void; + getVersionTag(): string; + getVersionLabel(): string; + /** Set window title */ + setTitle(): void; + /** Reset console cursor to top */ + resetCursor(): void; + /** Draw the watermark */ + draw(): void; + /** Caculate text length */ + protected textLength(s: string): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/decorators/Singleton.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/decorators/Singleton.d.ts new file mode 100644 index 0000000..7e89026 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/decorators/Singleton.d.ts @@ -0,0 +1,4 @@ +import type constructor from "./constructor"; +import { InjectionToken } from "tsyringe"; +declare function singleton(token?: InjectionToken): (target: constructor) => void; +export default singleton; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/decorators/constructor.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/decorators/constructor.d.ts new file mode 100644 index 0000000..416f354 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/dist/types/utils/decorators/constructor.d.ts @@ -0,0 +1,4 @@ +declare type constructor = { + new (...args: any[]): T; +}; +export default constructor; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/mod.code-workspace b/Faupi-MunitionsExpert/MunitionsExpert/src/server/mod.code-workspace new file mode 100644 index 0000000..6732c67 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/mod.code-workspace @@ -0,0 +1,12 @@ +{ + "folders": [ + { + "path": "." + } + ], + "extensions": { + "recommendations": [ + "dbaeumer.vscode-eslint" + ] + } +} \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/package.json b/Faupi-MunitionsExpert/MunitionsExpert/src/server/package.json new file mode 100644 index 0000000..e6e61db --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/package.json @@ -0,0 +1,26 @@ +{ + "name": "MunitionsExpert", + "author": "Faupi", + "version": "1.4.1", + "license": "NCSA Open Source", + "main": "./src/MunitionsExpert.js", + "akiVersion": "3.0.0", + "updatedBy": "CWX", + "scripts": { + "setup:environment": "npm i", + "build:unzipped": "copyfiles -e \"./node_modules/**/*.*\" -e \"./dist/**/*.*\" -e \"./package-lock.json\" -e \"./tsconfig.json\" -e \"./README.txt\" -e \"./mod.code-workspace\" ./**/*.* ./dist", + "zip:files": "cd dist/ && bestzip ../mod.zip *", + "build:zip": "npm run clean:environment && npm run build:unzipped && npm run zip:files", + "clean:environment": "node -e \"require('fs').rm('mod.zip', ()=>{})\" && node -e \"require('fs').rmdir('./dist/',{recursive:true},()=>{})\"" + }, + "devDependencies": { + "@types/node": "^14.15.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "copyfiles": "2.4.1", + "eslint": "7.26.0", + "tsyringe": "4.6.0", + "typescript": "4.6.4", + "bestzip": "2.2.1" + } +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/res/armorDamage.png b/Faupi-MunitionsExpert/MunitionsExpert/src/server/res/armorDamage.png new file mode 100644 index 0000000000000000000000000000000000000000..70d5e40050dba64b28cfe022f12f64f20f67ab61 GIT binary patch literal 701 zcmV;u0z&Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T1P(e{@UAPcY!Jrh^{sD32#+BU&E(Fn17gb87;KGHV3sGEZr7qf1 zY_L)h1Q!-FR?;dpwbeF_Nhg^kQw#uxw9RoehiF`G3S_V#V*Fgrg@n+74A0pFVn+&SWNO-54jwz33E)TrM|vr}x%?#%RUD z(RL`pc35%t`jyN5OZmJJ5s~kUbt@&ea=Yu=UC(vD>b-G0!Ah9|bi{}Cs_zho{TBC=gDf<|357Qsv*R$49Sj+iHCAJE~yZTxG* j0MP*>3C)aeFw6P_)~nJ5EkW<900000NkvXXu0mjfCOPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ940&z)1K~y+Tt&?3y zQ*ju^&+P1bZql-dC|h<>(x?j~C>&3_f#%s#SfDBtO8|Va}Fcen0v11zd3juu^cEtz5wY#GB94ccEhrFpSeDhP76wv zDjA7{zq-!ae4c^ZU6#h?=J7Y9PcFDS`Y?7Gu%dh=jC!!E!ep|U_aCU+Sy@@5HyEn5 zTHPV!t9}FmTRAWk3UZtV5DEj+)Vinv0GpGd(zzMG2dF1uKeg7%bWOFRe z&Mju#-Mz1o-wpDnQdwN(6%YV^@SVA?^F2q7*3_C_jlA%uekZd#fo>U!B$=c^0U=Lpz6{?Tno%f}S(EitxIiqA+qdKTz>u@4#crJ#ADi@C?tPA2NEF3? znlP$C`QW{WuKEV6b^7zv#~ydbedOjrSd`1NCNN{A`6EvinkXQRO0AL4&P=~+Z?k)l zn*&^@psrN^3sEo_%3=s{P-H~0l}(@u90t{3JK(+915Sa?bM2kC5Dx<0ufN_M9%pVh z7kL%11)fy?KnGaGPr!SV1X)QYj5Lzk<8Bd30eD(B0Ge_K`IB5bg761_I=S8<$tpMi O0000 any; }; + private cfg: { BulletBackgroundColours: boolean; }; + + public load(container: DependencyContainer) + { + this.router = container.resolve("DynamicRouterModService"); + this.logger = container.resolve("WinstonLogger"); + this.json = container.resolve("JsonUtil"); + this.mod = require("../package.json"); + this.translations = require("../res/translations.json"); + this.logger.info(`Loading: ${this.mod.name} ${this.mod.version}`); + this.path = require("path"); + this.cfg = require("./config.json"); + this.hookRoutes(); + } + + public delayedLoad(container: DependencyContainer) + { + this.modLoader = container.resolve("InitialModLoader"); + this.database = container.resolve("DatabaseServer"); + this.table = this.database.getTables(); + this.globalLocale = this.table.locales.global; + this.items = this.table.templates.items; + this.updateLocalization(); + this.changeBulletColour(); + } + + private updateLocalization() + { + for (const language in this.translations) + { + if (!(language in this.globalLocale)) + { + continue; + } + + const attrKvPair = this.translations[language]; + for (const attrKey in attrKvPair) + { + const attrValue = attrKvPair[attrKey]; + + this.globalLocale[language].interface[attrKey] = attrValue; + } + } + } + + private hookRoutes() + { + this.router.registerDynamicRouter( + "MunitionsExpert", + [ + { + url: "/MunitionsExpert/GetInfo", + action: (url, info, sessionId, output) => + { + return this.getModInfo(url, info, sessionId, output) + } + } + ], + "MunitionsExpert" + ) + } + + getModInfo(url: string, info: any, sessionID: string, output: string) + { + const modOutput = { + status: 1, + data: null + }; + + modOutput.data = {...this.mod, ...{path: this.path.resolve(this.modLoader.getModPath(this.mod.name))}}; + modOutput.status = 0; + + return this.json.serialize(modOutput); + } + + changeBulletColour() + { + if (this.cfg.BulletBackgroundColours === true) + { + for (const i in this.items) + { + const item = this.items[i] + + //set baground colour of ammo depending on pen + if (item._parent === "5485a8684bdc2da71d8b4567") + { + const pen = item._props.PenetrationPower + let colour = "" + + pen > 60 ? colour = "red" : //SuperHighPen + pen > 50 ? colour = "yellow" : //HighPen + pen > 40 ? colour = "violet" : //MedHighPen + pen > 30 ? colour = "blue" : //MedPen + pen > 20 ? colour = "green" : //LowMedPen + colour = "grey" //LowPen + item._props.BackgroundColor = colour + } + } + } + } +} + +module.exports = { mod: new MunitionsExpert() }; \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/src/config.json b/Faupi-MunitionsExpert/MunitionsExpert/src/server/src/config.json new file mode 100644 index 0000000..b735cd6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/src/config.json @@ -0,0 +1,3 @@ +{ + "BulletBackgroundColours": true +} \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/tsconfig.json b/Faupi-MunitionsExpert/MunitionsExpert/src/server/tsconfig.json similarity index 72% rename from KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/tsconfig.json rename to Faupi-MunitionsExpert/MunitionsExpert/src/server/tsconfig.json index 8ba3117..8151310 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/tsconfig.json +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/tsconfig.json @@ -8,8 +8,12 @@ "downlevelIteration": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "resolveJsonModule": true, - "outDir": "out" + "resolveJsonModule": true, + "outDir": "tmp", + "baseUrl": ".", + "paths": { + "@spt-aki/*": ["./types/*"] + } }, "lib": [ "es2020" diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/Program.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/Program.d.ts new file mode 100644 index 0000000..d4b71b9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/Program.d.ts @@ -0,0 +1,4 @@ +export declare class Program { + constructor(); + start(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/TYPES.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/TYPES.d.ts new file mode 100644 index 0000000..6407c3a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/TYPES.d.ts @@ -0,0 +1,3 @@ +export declare const TYPES: { + [name: string]: symbol; +}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/Utils.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/Utils.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/BotCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/BotCallbacks.d.ts new file mode 100644 index 0000000..2db60dc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/BotCallbacks.d.ts @@ -0,0 +1,15 @@ +import { BotController } from "../controllers/BotController"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BotCallbacks { + protected botController: BotController; + protected httpResponse: HttpResponseUtil; + constructor(botController: BotController, httpResponse: HttpResponseUtil); + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/BundleCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/BundleCallbacks.d.ts new file mode 100644 index 0000000..b28abe1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/BundleCallbacks.d.ts @@ -0,0 +1,18 @@ +import { BundleLoader } from "../loaders/BundleLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BundleCallbacks { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, bundleLoader: BundleLoader, configServer: ConfigServer); + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/CustomizationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/CustomizationCallbacks.d.ts new file mode 100644 index 0000000..3bab8c0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/CustomizationCallbacks.d.ts @@ -0,0 +1,23 @@ +import { CustomizationController } from "../controllers/CustomizationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class CustomizationCallbacks { + protected customizationController: CustomizationController; + protected saveServer: SaveServer; + protected httpResponse: HttpResponseUtil; + constructor(customizationController: CustomizationController, saveServer: SaveServer, httpResponse: HttpResponseUtil); + getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<{ + _id: string; + suites: string[]; + }>; + getTraderSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/DataCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/DataCallbacks.d.ts new file mode 100644 index 0000000..cfb1c16 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/DataCallbacks.d.ts @@ -0,0 +1,32 @@ +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGlobals } from "../models/eft/common/IGlobals"; +import { ICustomizationItem } from "../models/eft/common/tables/ICustomizationItem"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IHideoutArea } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../models/eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../models/eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../models/eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../models/spt/server/ILocaleBase"; +import { ISettingsBase } from "../models/spt/server/ISettingsBase"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DataCallbacks { + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer); + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/DialogueCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/DialogueCallbacks.d.ts new file mode 100644 index 0000000..634f90b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/DialogueCallbacks.d.ts @@ -0,0 +1,45 @@ +import { DialogueController } from "../controllers/DialogueController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../models/eft/dialog/IFriendRequestData"; +import { IGetAllAttachmentsRequestData } from "../models/eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetChatServerListRequestData } from "../models/eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogInfoRequestData } from "../models/eft/dialog/IGetMailDialogInfoRequestData"; +import { IGetMailDialogListRequestData } from "../models/eft/dialog/IGetMailDialogListRequestData"; +import { IGetMailDialogViewRequestData } from "../models/eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IPinDialogRequestData } from "../models/eft/dialog/IPinDialogRequestData"; +import { IRemoveDialogRequestData } from "../models/eft/dialog/IRemoveDialogRequestData"; +import { ISendMessageRequest } from "../models/eft/dialog/ISendMessageRequest"; +import { ISetDialogReadRequestData } from "../models/eft/dialog/ISetDialogReadRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { DialogueInfo } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class DialogueCallbacks extends OnUpdate { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected dialogueController: DialogueController; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController); + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/GameCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/GameCallbacks.d.ts new file mode 100644 index 0000000..d5cad76 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/GameCallbacks.d.ts @@ -0,0 +1,24 @@ +import { GameController } from "../controllers/GameController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IGameEmptyCrcRequestData } from "../models/eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../models/eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class GameCallbacks { + protected httpResponse: HttpResponseUtil; + protected watermark: Watermark; + protected gameController: GameController; + constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController); + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} +export { GameCallbacks }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HandbookCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HandbookCallbacks.d.ts new file mode 100644 index 0000000..891e375 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HandbookCallbacks.d.ts @@ -0,0 +1,8 @@ +import { HandbookController } from "../controllers/HandbookController"; +import { OnLoad } from "../di/OnLoad"; +export declare class HandbookCallbacks extends OnLoad { + protected handbookController: HandbookController; + constructor(handbookController: HandbookController); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HealthCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HealthCallbacks.d.ts new file mode 100644 index 0000000..8f7b89d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HealthCallbacks.d.ts @@ -0,0 +1,20 @@ +import { HealthController } from "../controllers/HealthController"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class HealthCallbacks { + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected healthController: HealthController; + constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController); + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HideoutCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HideoutCallbacks.d.ts new file mode 100644 index 0000000..99ab4c9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HideoutCallbacks.d.ts @@ -0,0 +1,33 @@ +import { HideoutController } from "../controllers/HideoutController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../models/eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HideoutCallbacks extends OnUpdate { + protected hideoutController: HideoutController; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(hideoutController: HideoutController, // TODO: delay needed + configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HttpCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HttpCallbacks.d.ts new file mode 100644 index 0000000..94c97bd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/HttpCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoad } from "../di/OnLoad"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class HttpCallbacks extends OnLoad { + protected httpServer: IHttpServer; + constructor(httpServer: IHttpServer); + onLoad(): void; + getRoute(): string; + getImage(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InraidCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InraidCallbacks.d.ts new file mode 100644 index 0000000..05bcce4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InraidCallbacks.d.ts @@ -0,0 +1,23 @@ +import { InraidController } from "../controllers/InraidController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IAirdropConfig } from "../models/spt/config/IAirdropConfig"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InraidCallbacks { + protected inraidController: InraidController; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected airdropConfig: IAirdropConfig; + protected inraidConfig: IInRaidConfig; + constructor(inraidController: InraidController, httpResponse: HttpResponseUtil, configServer: ConfigServer); + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InsuranceCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InsuranceCallbacks.d.ts new file mode 100644 index 0000000..520d0eb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InsuranceCallbacks.d.ts @@ -0,0 +1,24 @@ +import { InsuranceController } from "../controllers/InsuranceController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InsuranceCallbacks extends OnLoadOnUpdate { + protected insuranceController: InsuranceController; + protected insuranceService: InsuranceService; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer); + onLoad(): void; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(secondsSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InventoryCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InventoryCallbacks.d.ts new file mode 100644 index 0000000..9ab1486 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/InventoryCallbacks.d.ts @@ -0,0 +1,39 @@ +import { InventoryController } from "../controllers/InventoryController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class InventoryCallbacks { + protected inventoryController: InventoryController; + constructor(inventoryController: InventoryController); + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ItemEventCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ItemEventCallbacks.d.ts new file mode 100644 index 0000000..f4f04f9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ItemEventCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class ItemEventCallbacks { + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter); + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/LauncherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/LauncherCallbacks.d.ts new file mode 100644 index 0000000..c022325 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/LauncherCallbacks.d.ts @@ -0,0 +1,28 @@ +import { LauncherController } from "../controllers/LauncherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../models/eft/launcher/IRemoveProfileData"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class LauncherCallbacks { + protected httpResponse: HttpResponseUtil; + protected launcherController: LauncherController; + protected saveServer: SaveServer; + protected watermark: Watermark; + constructor(httpResponse: HttpResponseUtil, launcherController: LauncherController, saveServer: SaveServer, watermark: Watermark); + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getServerVersion(): string; + ping(url: string, info: IEmptyRequestData, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} +export { LauncherCallbacks }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/LocationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/LocationCallbacks.d.ts new file mode 100644 index 0000000..cc69369 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/LocationCallbacks.d.ts @@ -0,0 +1,14 @@ +import { LocationController } from "../controllers/LocationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetLocationRequestData } from "../models/eft/location/IGetLocationRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class LocationCallbacks { + protected httpResponse: HttpResponseUtil; + protected locationController: LocationController; + constructor(httpResponse: HttpResponseUtil, locationController: LocationController); + getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/MatchCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/MatchCallbacks.d.ts new file mode 100644 index 0000000..083c1f5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/MatchCallbacks.d.ts @@ -0,0 +1,35 @@ +import { MatchController } from "../controllers/MatchController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class MatchCallbacks { + protected httpResponse: HttpResponseUtil; + protected jsonUtil: JsonUtil; + protected matchController: MatchController; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, jsonUtil: JsonUtil, matchController: MatchController, databaseServer: DatabaseServer); + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: IGetProfileRequestData, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ModCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ModCallbacks.d.ts new file mode 100644 index 0000000..866abf7 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ModCallbacks.d.ts @@ -0,0 +1,22 @@ +import { OnLoad } from "../di/OnLoad"; +import { DelayedModLoader } from "../loaders/DelayedModLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +declare class ModCallbacks extends OnLoad { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected modLoader: DelayedModLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, modLoader: DelayedModLoader, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} +export { ModCallbacks }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/NoteCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/NoteCallbacks.d.ts new file mode 100644 index 0000000..d39d400 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/NoteCallbacks.d.ts @@ -0,0 +1,11 @@ +import { NoteController } from "../controllers/NoteController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +export declare class NoteCallbacks { + protected noteController: NoteController; + constructor(noteController: NoteController); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/NotifierCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/NotifierCallbacks.d.ts new file mode 100644 index 0000000..cd1e736 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/NotifierCallbacks.d.ts @@ -0,0 +1,24 @@ +import { NotifierController } from "../controllers/NotifierController"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../models/eft/notifier/ISelectProfileRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class NotifierCallbacks { + protected httpServerHelper: HttpServerHelper; + protected httpResponse: HttpResponseUtil; + protected notifierController: NotifierController; + constructor(httpServerHelper: HttpServerHelper, httpResponse: HttpResponseUtil, notifierController: NotifierController); + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(_sessionID: string, req: any, resp: any, _data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/PresetBuildCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/PresetBuildCallbacks.d.ts new file mode 100644 index 0000000..8a0c155 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/PresetBuildCallbacks.d.ts @@ -0,0 +1,15 @@ +import { PresetBuildController } from "../controllers/PresetBuildController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PresetBuildCallbacks { + protected httpResponse: HttpResponseUtil; + protected presetBuildController: PresetBuildController; + constructor(httpResponse: HttpResponseUtil, presetBuildController: PresetBuildController); + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/PresetCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/PresetCallbacks.d.ts new file mode 100644 index 0000000..4553f8f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/PresetCallbacks.d.ts @@ -0,0 +1,8 @@ +import { PresetController } from "../controllers/PresetController"; +import { OnLoad } from "../di/OnLoad"; +export declare class PresetCallbacks extends OnLoad { + protected presetController: PresetController; + constructor(presetController: PresetController); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ProfileCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ProfileCallbacks.d.ts new file mode 100644 index 0000000..116e7c5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/ProfileCallbacks.d.ts @@ -0,0 +1,30 @@ +import { ProfileController } from "../controllers/ProfileController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IGetMiniProfileRequestData } from "../models/eft/launcher/IGetMiniProfileRequestData"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileCallbacks { + protected httpResponse: HttpResponseUtil; + protected timeUtil: TimeUtil; + protected profileController: ProfileController; + constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, profileController: ProfileController); + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/QuestCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/QuestCallbacks.d.ts new file mode 100644 index 0000000..559c29e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/QuestCallbacks.d.ts @@ -0,0 +1,26 @@ +import { QuestController } from "../controllers/QuestController"; +import { RepeatableQuestController } from "../controllers/RepeatableQuestController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IListQuestsRequestData } from "../models/eft/quests/IListQuestsRequestData"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class QuestCallbacks { + protected httpResponse: HttpResponseUtil; + protected questController: QuestController; + protected repeatableQuestController: RepeatableQuestController; + constructor(httpResponse: HttpResponseUtil, questController: QuestController, repeatableQuestController: RepeatableQuestController); + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/RagfairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/RagfairCallbacks.d.ts new file mode 100644 index 0000000..d5bab8b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/RagfairCallbacks.d.ts @@ -0,0 +1,39 @@ +import { RagfairController } from "../controllers/RagfairController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAddOfferRequestData } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IRemoveOfferRequestData } from "../models/eft/ragfair/IRemoveOfferRequestData"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected ragfairServer: RagfairServer; + protected ragfairController: RagfairController; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(httpResponse: HttpResponseUtil, logger: ILogger, jsonUtil: JsonUtil, ragfairServer: RagfairServer, ragfairController: RagfairController, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + sendReport(url: string, info: any, sessionID: string): INullResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/RepairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/RepairCallbacks.d.ts new file mode 100644 index 0000000..63733fa --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/RepairCallbacks.d.ts @@ -0,0 +1,11 @@ +import { RepairController } from "../controllers/RepairController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +export declare class RepairCallbacks { + protected repairController: RepairController; + constructor(repairController: RepairController); + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/SaveCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/SaveCallbacks.d.ts new file mode 100644 index 0000000..bbb6e53 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/SaveCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { SaveServer } from "../servers/SaveServer"; +export declare class SaveCallbacks extends OnLoadOnUpdate { + protected saveServer: SaveServer; + constructor(saveServer: SaveServer); + onLoad(): void; + getRoute(): string; + onUpdate(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/TradeCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/TradeCallbacks.d.ts new file mode 100644 index 0000000..272ae46 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/TradeCallbacks.d.ts @@ -0,0 +1,11 @@ +import { TradeController } from "../controllers/TradeController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +export declare class TradeCallbacks { + protected tradeController: TradeController; + constructor(tradeController: TradeController); + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/TraderCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/TraderCallbacks.d.ts new file mode 100644 index 0000000..128d9b2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/TraderCallbacks.d.ts @@ -0,0 +1,18 @@ +import { TraderController } from "../controllers/TraderController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class TraderCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected traderController: TraderController; + constructor(httpResponse: HttpResponseUtil, traderController: TraderController); + onLoad(): void; + getRoute(): string; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + onUpdate(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/WeatherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/WeatherCallbacks.d.ts new file mode 100644 index 0000000..ae784c8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/WeatherCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WeatherController } from "../controllers/WeatherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class WeatherCallbacks { + protected httpResponse: HttpResponseUtil; + protected weatherController: WeatherController; + constructor(httpResponse: HttpResponseUtil, weatherController: WeatherController); + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/WishlistCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/WishlistCallbacks.d.ts new file mode 100644 index 0000000..c2cc2a8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/callbacks/WishlistCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WishlistController } from "../controllers/WishlistController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +export declare class WishlistCallbacks { + protected wishlistController: WishlistController; + constructor(wishlistController: WishlistController); + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/BotController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/BotController.d.ts new file mode 100644 index 0000000..09a1788 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/BotController.d.ts @@ -0,0 +1,35 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { BotHelper } from "../helpers/BotHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +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 { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class BotController { + protected databaseServer: DatabaseServer; + protected botGenerator: BotGenerator; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + /** + * Return the number of bot loadout varieties to be generated + * @param type bot Type we want the loadout gen count for + * @returns + */ + getBotPresetGenerationLimit(type: string): number; + getBotCoreDifficulty(): IBotCore; + /** + * Get bot difficulty settings + * adjust PMC settings to ensure they engage the correct bot types + * @param type what bot the server is requesting settings for + * @param difficulty difficulty level server requested settings for + * @returns Difficulty object + */ + getBotDifficulty(type: string, difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/CustomizationController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/CustomizationController.d.ts new file mode 100644 index 0000000..a6c4730 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/CustomizationController.d.ts @@ -0,0 +1,22 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +export declare class CustomizationController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper); + getTraderSuits(traderID: string, sessionID: string): ISuit[]; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; + protected getAllTraderSuits(sessionID: string): ISuit[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/DialogueController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/DialogueController.d.ts new file mode 100644 index 0000000..b15c4b6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/DialogueController.d.ts @@ -0,0 +1,25 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { DialogueInfo, Message } from "../models/eft/profile/IAkiProfile"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DialogueController { + protected httpResponse: HttpResponseUtil; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + constructor(httpResponse: HttpResponseUtil, saveServer: SaveServer, dialogueHelper: DialogueHelper); + getFriendList(sessionID: string): IGetFriendListDataResponse; + generateDialogueList(sessionID: string): IGetBodyResponseData; + getDialogueInfo(dialogueID: string, sessionID: string): DialogueInfo; + generateDialogueView(dialogueID: string, sessionID: string): IGetMailDialogViewResponseData; + removeDialogue(dialogueID: string, sessionID: string): void; + setDialoguePin(dialogueID: string, shouldPin: boolean, sessionID: string): void; + setRead(dialogueIDs: string[], sessionID: string): void; + getAllAttachments(dialogueID: string, sessionID: string): IGetAllAttachmentsResponse; + protected messagesHaveUncollectedRewards(messages: Message[]): boolean; + protected removeExpiredItems(sessionID: string): void; + update(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/GameController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/GameController.d.ts new file mode 100644 index 0000000..b9067fa --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/GameController.d.ts @@ -0,0 +1,32 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcDataRepeatableQuest, IRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { Watermark } from "../utils/Watermark"; +export declare class GameController { + protected logger: ILogger; + protected watermark: Watermark; + protected httpServerHelper: HttpServerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, watermark: Watermark, httpServerHelper: HttpServerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void; + protected addMissingBonusesProperty(pmcProfile: IPmcData): void; + protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void; + protected addMissingWeaponRepairSkill(pmcProfile: IPmcData): void; + protected addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void; + protected addMissingArmorRepairSkill(pmcProfile: IPmcData): void; + protected fixNullTraderSalesSums(pmcProfile: IPmcData): void; + protected removeDanglingConditionCounters(pmcProfile: IPmcData): void; + protected removeDanglingBackendCounters(pmcProfile: IPmcData): void; + getGameConfig(sessionID: string): IGameConfigResponse; + getServer(): any[]; + protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HandbookController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HandbookController.d.ts new file mode 100644 index 0000000..52d2dd8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HandbookController.d.ts @@ -0,0 +1,8 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class HandbookController { + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + constructor(databaseServer: DatabaseServer, handbookHelper: HandbookHelper); + load(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HealthController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HealthController.d.ts new file mode 100644 index 0000000..aafb8df --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HealthController.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentService } from "../services/PaymentService"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class HealthController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected inventoryHelper: InventoryHelper; + protected healthHelper: HealthHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, healthHelper: HealthHelper); + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HideoutController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HideoutController.d.ts new file mode 100644 index 0000000..a8bf229 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/HideoutController.d.ts @@ -0,0 +1,57 @@ +import { HideoutHelper } from "../helpers/HideoutHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { HideoutUpgradeCompleteRequestData } from "../models/eft/hideout/HideoutUpgradeCompleteRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HideoutController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected inventoryHelper: InventoryHelper; + protected saveServer: SaveServer; + protected playerService: PlayerService; + protected presetHelper: PresetHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected hideoutHelper: HideoutHelper; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + update(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InraidController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InraidController.d.ts new file mode 100644 index 0000000..7f2036c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InraidController.d.ts @@ -0,0 +1,31 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { InRaidHelper } from "../helpers/InRaidHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InraidController { + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected itemHelper: ItemHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + protected healthHelper: HealthHelper; + protected traderHelper: TraderHelper; + protected insuranceService: InsuranceService; + protected inRaidHelper: InRaidHelper; + protected configServer: ConfigServer; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, extendedProfileHelper: ExtendedProfileHelper, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer); + addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void; + saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InsuranceController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InsuranceController.d.ts new file mode 100644 index 0000000..db2c567 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InsuranceController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { PaymentService } from "../services/PaymentService"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceController { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected itemEventRouter: ItemEventRouter; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected profileHelper: ProfileHelper; + protected dialogueHelper: DialogueHelper; + protected paymentService: PaymentService; + protected insuranceService: InsuranceService; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, itemEventRouter: ItemEventRouter, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required + insuranceService: InsuranceService, configServer: ConfigServer); + processReturn(): void; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + cost(info: IGetInsuranceCostRequestData, sessionID: string): any; + doAbsolutelyNothing(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InventoryController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InventoryController.d.ts new file mode 100644 index 0000000..b732aa9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/InventoryController.d.ts @@ -0,0 +1,107 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InventoryController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected presetHelper: PresetHelper; + protected inventoryHelper: InventoryHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter); + /** + * Move Item + * change location of item with parentId and slotId + * transfers items from one profile to another if fromOwner/toOwner is set in the body. + * otherwise, move is contained within the same profile_f. + */ + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Remove Item from Profile + * Deep tree item deletion, also removes items from insurance list + */ + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Implements functionality "Discard" from Main menu (Stash etc.) + * Removes item from PMC Profile + */ + discardItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Split Item + * spliting 1 item-stack into 2 separate items ... + */ + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Merge Item + * merges 2 items into one, deletes item from `body.item` and adding number of stacks into `body.with` + */ + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Transfer item + * Used to take items from scav inventory into stash or to insert ammo into mags (shotgun ones) and reloading weapon by clicking "Reload" + */ + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Swap Item + * its used for "reload" if you have weapon in hands and magazine is somewhere else in rig or backpack in equipment + */ + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Give Item + * its used for "add" item like gifts etc. + */ + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + /** + * Handles folding of Weapons + */ + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Toggles "Toggleable" items like night vision goggles and face shields. + */ + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles Tagging of items (primary Containers). + */ + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles examining of the item * + */ + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles sorting of Inventory. + */ + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/LauncherController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/LauncherController.d.ts new file mode 100644 index 0000000..1af1f56 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/LauncherController.d.ts @@ -0,0 +1,28 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { Info } from "../models/eft/profile/IAkiProfile"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class LauncherController { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected httpServerHelper: HttpServerHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected coreConfig: ICoreConfig; + constructor(hashUtil: HashUtil, saveServer: SaveServer, httpServerHelper: HttpServerHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + connect(): any; + find(sessionIdKey: string): Info; + login(info: ILoginRequestData): string; + register(info: IRegisterData): string; + protected createAccount(info: IRegisterData): string; + changeUsername(info: IChangeRequestData): string; + changePassword(info: IChangeRequestData): string; + wipe(info: IRegisterData): string; + getCompatibleTarkovVersion(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/LocationController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/LocationController.d.ts new file mode 100644 index 0000000..90b6d7a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/LocationController.d.ts @@ -0,0 +1,18 @@ +import { LocationGenerator } from "../generators/LocationGenerator"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class LocationController { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected locationGenerator: LocationGenerator; + protected databaseServer: DatabaseServer; + protected timeUtil: TimeUtil; + constructor(jsonUtil: JsonUtil, logger: ILogger, locationGenerator: LocationGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil); + get(location: string): ILocationBase; + generate(name: string): ILocationBase; + generateAll(): ILocationsGenerateAllResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/MatchController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/MatchController.d.ts new file mode 100644 index 0000000..c322d96 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/MatchController.d.ts @@ -0,0 +1,30 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { IMatchConfig } from "../models/spt/config/IMatchConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { MatchLocationService } from "../services/MatchLocationService"; +export declare class MatchController { + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected matchLocationService: MatchLocationService; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected matchConfig: IMatchConfig; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, configServer: ConfigServer); + getEnabled(): boolean; + getProfile(info: IGetProfileRequestData): IPmcData[]; + protected getMatch(location: any): any; + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; + joinMatch(info: any, sessionID: string): any[]; + getGroupStatus(info: any): any; + startOfflineRaid(info: IStartOfflineRaidRequestData, sessionID: string): void; + endOfflineRaid(info: IEndOfflineRaidRequestData, sessionID: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/NoteController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/NoteController.d.ts new file mode 100644 index 0000000..cc78383 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/NoteController.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +declare class NoteController { + protected itemEventRouter: ItemEventRouter; + constructor(itemEventRouter: ItemEventRouter); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} +export { NoteController }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/NotifierController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/NotifierController.d.ts new file mode 100644 index 0000000..31d7bfe --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/NotifierController.d.ts @@ -0,0 +1,22 @@ +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { NotificationService } from "../services/NotificationService"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +export declare class NotifierController { + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected notificationService: NotificationService; + protected pollInterval: number; + protected timeout: number; + constructor(notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, notificationService: NotificationService); + /** + * Resolve an array of session notifications. + * + * If no notifications are currently queued then intermittently check for new notifications until either + * one or more appear or when a timeout expires. + * If no notifications are available after the timeout, use a default message. + */ + notifyAsync(sessionID: string): Promise; + getServer(sessionID: string): string; + getChannel(sessionID: string): INotifierChannel; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/PresetBuildController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/PresetBuildController.d.ts new file mode 100644 index 0000000..adf4084 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/PresetBuildController.d.ts @@ -0,0 +1,18 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class PresetBuildController { + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + constructor(hashUtil: HashUtil, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, saveServer: SaveServer); + getUserBuilds(sessionID: string): WeaponBuild[]; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/PresetController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/PresetController.d.ts new file mode 100644 index 0000000..ca1af1a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/PresetController.d.ts @@ -0,0 +1,8 @@ +import { PresetHelper } from "../helpers/PresetHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetController { + protected presetHelper: PresetHelper; + protected databaseServer: DatabaseServer; + constructor(presetHelper: PresetHelper, databaseServer: DatabaseServer); + initialize(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/ProfileController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/ProfileController.d.ts new file mode 100644 index 0000000..9b7a6d5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/ProfileController.d.ts @@ -0,0 +1,34 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileController { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected traderHelper: TraderHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, traderHelper: TraderHelper, extendedProfileHelper: ExtendedProfileHelper); + getMiniProfiles(): IMiniProfile[]; + getMiniProfile(sessionID: string): any; + getCompleteProfile(sessionID: string): IPmcData[]; + createProfile(info: IProfileCreateRequestData, sessionID: string): void; + generatePlayerScav(sessionID: string): IPmcData; + validateNickname(info: IValidateNicknameRequestData, sessionID: string): string; + changeNickname(info: IProfileChangeNicknameRequestData, sessionID: string): string; + changeVoice(info: IProfileChangeVoiceRequestData, sessionID: string): void; + getFriends(info: ISearchFriendRequestData, sessionID: string): ISearchFriendResponse[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/QuestController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/QuestController.d.ts new file mode 100644 index 0000000..e588de0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/QuestController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { QuestConditionHelper } from "../helpers/QuestConditionHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class QuestController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected questHelper: QuestHelper; + protected questConditionHelper: QuestConditionHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, questConditionHelper: QuestConditionHelper, playerService: PlayerService, configServer: ConfigServer); + getClientQuests(sessionID: string): IQuest[]; + acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + acceptRepeatableQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RagfairController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RagfairController.d.ts new file mode 100644 index 0000000..c758593 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RagfairController.d.ts @@ -0,0 +1,70 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairHelper } from "../helpers/RagfairHelper"; +import { RagfairOfferHelper } from "../helpers/RagfairOfferHelper"; +import { RagfairSellHelper } from "../helpers/RagfairSellHelper"; +import { RagfairSortHelper } from "../helpers/RagfairSortHelper"; +import { RagfairTaxHelper } from "../helpers/RagfairTaxHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IAddOfferRequestData, Requirement } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PaymentService } from "../services/PaymentService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + protected ragfairServer: RagfairServer; + protected ragfairPriceService: RagfairPriceService; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + protected ragfairSellHelper: RagfairSellHelper; + protected ragfairTaxHelper: RagfairTaxHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairOfferHelper: RagfairOfferHelper; + protected profileHelper: ProfileHelper; + protected paymentService: PaymentService; + protected handbookHelper: HandbookHelper; + protected paymentHelper: PaymentHelper; + protected inventoryHelper: InventoryHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter, ragfairServer: RagfairServer, ragfairPriceService: RagfairPriceService, databaseServer: DatabaseServer, itemHelper: ItemHelper, saveServer: SaveServer, ragfairSellHelper: RagfairSellHelper, ragfairTaxHelper: RagfairTaxHelper, ragfairSortHelper: RagfairSortHelper, ragfairOfferHelper: RagfairOfferHelper, profileHelper: ProfileHelper, paymentService: PaymentService, handbookHelper: HandbookHelper, paymentHelper: PaymentHelper, inventoryHelper: InventoryHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer); + getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult; + update(): void; + getItemPrice(info: IGetMarketPriceRequestData): IGetItemPriceResult; + addPlayerOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + createPlayerOffer(profile: IAkiProfile, requirements: Requirement[], items: Item[], sellInOnePiece: boolean, amountToSend: number): IRagfairOffer; + getAllFleaPrices(): Record; + removeOffer(offerId: string, sessionID: string): IItemEventRouterResponse; + extendOffer(info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RepairController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RepairController.d.ts new file mode 100644 index 0000000..e9458f6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RepairController.d.ts @@ -0,0 +1,41 @@ +import { QuestHelper } from "../helpers/QuestHelper"; +import { RepairHelper } from "../helpers/RepairHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +export declare class RepairController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected traderHelper: TraderHelper; + protected paymentService: PaymentService; + protected repairHelper: RepairHelper; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, questHelper: QuestHelper, traderHelper: TraderHelper, paymentService: PaymentService, repairHelper: RepairHelper, configServer: ConfigServer); + /** + * Repair with trader + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + /** + * Repair with repair kit + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RepeatableQuestController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RepeatableQuestController.d.ts new file mode 100644 index 0000000..ce190aa --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/RepeatableQuestController.d.ts @@ -0,0 +1,217 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { Exit } from "../models/eft/common/ILocationBase"; +import { IPmcData, TraderInfo } from "../models/eft/common/IPmcData"; +import { ICompletion, ICompletionAvailableFor, IElimination, IEliminationCondition, IExploration, IExplorationCondition, IPmcDataRepeatableQuest, IRepeatableQuest, IReward, IRewards } from "../models/eft/common/tables/IRepeatableQuests"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { ELocationName } from "../models/enums/ELocationName"; +import { IQuestConfig, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { ProbabilityObject, ProbabilityObjectArray, RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export interface IQuestTypePool { + types: string[]; + pool: IQuestPool; +} +export interface IQuestPool { + Exploration: IExplorationPool; + Elimination: IEliminationPool; +} +export interface IExplorationPool { + locations: Partial>; +} +export interface IEliminationPool { + targets: IEliminationTargetPool; +} +export interface IEliminationTargetPool { + Savage?: ITargetLocation; + AnyPmc?: ITargetLocation; + bossBully?: ITargetLocation; + bossGluhar?: ITargetLocation; + bossKilla?: ITargetLocation; + bossSanitar?: ITargetLocation; + bossTagilla?: ITargetLocation; + bossKojaniy?: ITargetLocation; +} +export interface ITargetLocation { + locations: string[]; +} +export declare class RepeatableQuestController { + protected timeUtil: TimeUtil; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected mathUtil: MathUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected itemEventRouter: ItemEventRouter; + protected paymentService: PaymentService; + protected objectId: ObjectId; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, itemEventRouter: ItemEventRouter, paymentService: PaymentService, objectId: ObjectId, configServer: ConfigServer); + /** + * This is the method reached by the /client/repeatalbeQuests/activityPeriods endpoint + * Returns an array of objects in the format of repeatable quests to the client. + * repeatableQuestObject = { + * id: Unique Id, + * name: "Daily", + * endTime: the time when the quests expire + * activeQuests: currently available quests in an array. Each element of quest type format (see assets/database/templates/repeatableQuests.json). + * inactiveQuests: the quests which were previously active (required by client to fail them if they are not completed) + * } + * + * The method checks if the player level requirement for repeatable quests (e.g. daily lvl5, weekly lvl15) is met and if the previously active quests + * are still valid. This ischecked by endTime persisted in profile accordning to the resetTime configured for each repeatable kind (daily, weekly) + * in QuestCondig.js + * + * If the condition is met, new repeatableQuests are created, old quests (which are persisted in the profile.RepeatableQuests[i].activeQuests) are + * moved to profile.RepeatableQuests[i].inactiveQuests. This memory is required to get rid of old repeatable quest data in the profile, otherwise + * they'll litter the profile's Quests field. + * (if the are on "Succeed" but not "Completed" we keep them, to allow the player to complete them and get the rewards) + * The new quests generated are again persisted in profile.RepeatableQuests + * + * + * @param {string} sessionId Player's session id + * @returns {array} array of "repeatableQuestObjects" as descibed above + */ + getClientRepeatableQuests(_info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; + /** + * This method is called by GetClientRepeatableQuests and creates one element of quest type format (see assets/database/templates/repeatableQuests.json). + * It randomly draws a quest type (currently Elimination, Completion or Exploration) as well as a trader who is providing the quest + */ + generateRepeatableQuest(pmcLevel: number, pmcTraderInfo: Record, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest; + /** + * Just for debug reasons. Draws dailies a random assort of dailies extracted from dumps + */ + generateDebugDailies(dailiesPool: any, factory: any, number: any): any; + /** + * Generates the base object of quest type format given as templates in assets/database/templates/repeatableQuests.json + * The templates include Elimination, Completion and Extraction quest types + * + * @param {string} type quest type: "Elimination", "Completion" or "Extraction" + * @param {string} traderId trader from which the quest will be provided + * @returns {object} a object which contains the base elements for repeatable quests of the requests type + * (needs to be filled with reward and conditions by called to make a valid quest) + */ + generateRepeatableTemplate(type: string, traderId: string): IRepeatableQuest; + /** + * Generates a valid Exploration quest + * + * @param {integer} pmcLevel player's level for reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Exploration" (see assets/database/templates/repeatableQuests.json) + */ + generateExplorationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IExploration; + /** + * Generates a valid Completion quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Completion" (see assets/database/templates/repeatableQuests.json) + */ + generateCompletionQuest(pmcLevel: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): ICompletion; + /** + * Generates a valid Elimination quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Elimination" (see assets/database/templates/repeatableQuests.json) + */ + generateEliminationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IElimination; + /** + * Exploration repeatable quests can specify a required extraction point. + * This method creates the according object which will be appended to the conditions array + * + * @param {string} exit The exit name to generate the condition for + * @returns {object} Exit condition + */ + generateExplorationExitCondition(exit: Exit): IExplorationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateCompletionQuest to create a completion condition (of which a completion quest theoretically can have many) + * + * @param {string} targetItemId id of the item to request + * @param {integer} value amount of items of this specific type to request + * @returns {object} object of "Completion"-condition + */ + generateCompletionAvailableForFinish(targetItemId: string, value: number): ICompletionAvailableFor; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a location condition. + * + * @param {string} location the location on which to fulfill the elimination quest + * @returns {object} object of "Elimination"-location-subcondition + */ + generateEliminationLocation(location: string[]): IEliminationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a kill condition. + * + * @param {string} target array of target npcs e.g. "AnyPmc", "Savage" + * @param {array} bodyParts array of body parts with which to kill e.g. ["stomach", "thorax"] + * @param {number} distance distance from which to kill (currently only >= supported) + * @returns {object} object of "Elimination"-kill-subcondition + */ + generateEliminationCondition(target: string, bodyPart: string[], distance: number): IEliminationCondition; + /** + * Used to create a quest pool during each cycle of repeatable quest generation. The pool will be subsequently + * narrowed down during quest generation to avoid duplicate quests. Like duplicate extractions or elimination quests + * where you have to e.g. kill scavs in same locations. + * + * @returns {object} the quest pool + */ + generateQuestPool(repeatableConfig: IRepeatableQuestConfig): IQuestTypePool; + /** + * Generate the reward for a mission. A reward can consist of + * - Experience + * - Money + * - Items + * - Trader Reputation + * + * The reward is dependent on the player level as given by the wiki. The exact mapping of pmcLevel to + * experience / money / items / trader reputation can be defined in QuestConfig.js + * + * There's also a random variation of the reward the spread of which can be also defined in the config. + * + * Additonaly, a scaling factor w.r.t. quest difficulty going from 0.2...1 can be used + * + * @param {integer} pmcLevel player's level + * @param {number} difficulty a reward scaling factor goint from 0.2 to 1 + * @param {string} traderId the trader for reputation gain (and possible in the future filtering of reward item type based on trader) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of "Reward"-type that can be given for a repeatable mission + */ + generateReward(pmcLevel: number, difficulty: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): IRewards; + /** + * Helper to create a reward item structured as required by the client + * + * @param {string} tpl itemId of the rewarded item + * @param {integer} value amount of items to give + * @param {integer} index all rewards will be appended to a list, for unkown reasons the client wants the index + * @returns {object} object of "Reward"-item-type + */ + generateRewardItem(tpl: string, value: number, index: number, preset?: any): IReward; + debugLogRepeatableQuestIds(pmcData: IPmcData): void; + probabilityObjectArray(configArrayInput: ProbabilityObject[]): ProbabilityObjectArray; + changeRepeatableQuest(pmcDataIn: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/TradeController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/TradeController.d.ts new file mode 100644 index 0000000..c86745c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/TradeController.d.ts @@ -0,0 +1,21 @@ +import { RagfairServer } from "../servers/RagfairServer"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TradeHelper } from "../helpers/TradeHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +declare class TradeController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected tradeHelper: TradeHelper; + protected profileHelper: ProfileHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, tradeHelper: TradeHelper, profileHelper: ProfileHelper, ragfairServer: RagfairServer); + confirmTrading(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid?: boolean, upd?: Upd): IItemEventRouterResponse; + confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} +export { TradeController }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/TraderController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/TraderController.d.ts new file mode 100644 index 0000000..7bab158 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/TraderController.d.ts @@ -0,0 +1,26 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderAssortHelper } from "../helpers/TraderAssortHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class TraderController { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected traderAssortHelper: TraderAssortHelper; + protected profileHelper: ProfileHelper; + protected traderHelper: TraderHelper; + protected timeUtil: TimeUtil; + protected traderAssortService: TraderAssortService; + protected jsonUtil: JsonUtil; + constructor(logger: ILogger, databaseServer: DatabaseServer, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, timeUtil: TimeUtil, traderAssortService: TraderAssortService, jsonUtil: JsonUtil); + load(): void; + getTrader(traderID: string, sessionID: string): ITraderBase; + getAllTraders(sessionID: string): ITraderBase[]; + updateTraders(): boolean; + getAssort(sessionId: string, traderId: string): ITraderAssort; + getPurchasesData(traderID: string, sessionID: string): Record; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/WeatherController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/WeatherController.d.ts new file mode 100644 index 0000000..ca7f5eb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/WeatherController.d.ts @@ -0,0 +1,11 @@ +import { WeatherGenerator } from "../generators/WeatherGenerator"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WeatherController { + protected weatherGenerator: WeatherGenerator; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer); + generate(): IWeatherData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/WishlistController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/WishlistController.d.ts new file mode 100644 index 0000000..a96c522 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/controllers/WishlistController.d.ts @@ -0,0 +1,10 @@ +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class WishlistController { + protected itemEvenRouter: ItemEventRouter; + constructor(itemEvenRouter: ItemEventRouter); + addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Container.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Container.d.ts new file mode 100644 index 0000000..17791b0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Container.d.ts @@ -0,0 +1,14 @@ +import { DependencyContainer } from "tsyringe"; +export declare class Container { + static registerTypes(depContainer: DependencyContainer): void; + static registerListTypes(depContainer: DependencyContainer): void; + private static registerUtils; + private static registerRouters; + private static registerGenerators; + private static registerHelpers; + private static registerLoaders; + private static registerCallbacks; + private static registerServices; + private static registerServers; + private static registerControllers; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnLoad.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnLoad.d.ts new file mode 100644 index 0000000..064d07d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnLoad.d.ts @@ -0,0 +1,4 @@ +export declare class OnLoad { + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnLoadOnUpdate.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnLoadOnUpdate.d.ts new file mode 100644 index 0000000..8bd3dc3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnLoadOnUpdate.d.ts @@ -0,0 +1,7 @@ +import { OnLoad } from "./OnLoad"; +import { OnUpdate } from "./OnUpdate"; +export declare class OnLoadOnUpdate implements OnLoad, OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnUpdate.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnUpdate.d.ts new file mode 100644 index 0000000..7fbbe09 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/OnUpdate.d.ts @@ -0,0 +1,4 @@ +export declare class OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Router.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Router.d.ts new file mode 100644 index 0000000..2fb98e0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Router.d.ts @@ -0,0 +1,40 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +export declare class Router { + private handledRoutes; + getTopLevelRoute(): string; + protected getHandledRoutes(): HandledRoute[]; + private getInternalHandledRoutes; + canHandle(url: string, partialMatch?: boolean): boolean; +} +export declare class StaticRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleStatic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class DynamicRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleDynamic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class ItemEventRouterDefinition extends Router { + constructor(); + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} +export declare class SaveLoadRouter extends Router { + constructor(); + handleLoad(profile: IAkiProfile): IAkiProfile; +} +export declare class HandledRoute { + route: string; + dynamic: boolean; + constructor(route: string, dynamic: boolean); +} +export declare class RouteAction { + url: string; + action: (url: string, info: any, sessionID: string, output: string) => any; + constructor(url: string, action: (url: string, info: any, sessionID: string, output: string) => any); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Serializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Serializer.d.ts new file mode 100644 index 0000000..70aa7c5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/di/Serializer.d.ts @@ -0,0 +1,5 @@ +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class Serializer { + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(something: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotGenerator.d.ts new file mode 100644 index 0000000..88a8014 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { Health as PmcHealth } from "../models/eft/common/IPmcData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { Health, Inventory, Skills } 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 { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotInventoryGenerator } from "./BotInventoryGenerator"; +declare namespace BotGenerator { + interface IRandomisedBotLevelResult { + level: number; + exp: number; + } +} +export declare class BotGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected botInventoryGenerator: BotInventoryGenerator; + protected botHelper: BotHelper; + protected gameEventHelper: GameEventHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + protected generateBot(bot: IBotBase, role: string, isPmc: boolean): IBotBase; + protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** Converts health object to the required format */ + protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; + protected generateSkills(skillsObj: Skills): Skills; + protected getPmcRole(pmcSide: string): string; + protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + protected generateId(bot: IBotBase): IBotBase; + protected generateInventoryID(profile: IBotBase): IBotBase; + protected getPMCDifficulty(requestedDifficulty: string): string; + protected generateDogtag(bot: IBotBase): IBotBase; +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotInventoryGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotInventoryGenerator.d.ts new file mode 100644 index 0000000..783d0c5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotInventoryGenerator.d.ts @@ -0,0 +1,24 @@ +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +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"; +export declare class BotInventoryGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected botWeaponGenerator: BotWeaponGenerator; + 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(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; + protected generateInventoryBase(): PmcInventory; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotLootGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotLootGenerator.d.ts new file mode 100644 index 0000000..1d91836 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotLootGenerator.d.ts @@ -0,0 +1,29 @@ +import { PMCLootGenerator } from "../generators/PMCLootGenerator"; +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { ItemMinMax, Items } from "../models/eft/common/tables/IBotType"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotLootGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected pmcLootGenerator: PMCLootGenerator; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, pmcLootGenerator: PMCLootGenerator, configServer: ConfigServer); + generateLoot(lootPool: Items, itemCounts: ItemMinMax, isPmc: boolean, inventory: PmcInventory): void; + protected getRandomisedCount(min: number, max: number, nValue: number): number; + protected addLootFromPool(pool: ITemplateItem[], equipmentSlots: string[], count: number, inventory: PmcInventory, totalValueLimit?: number, useLimits?: boolean): void; + /** Compares two item templates by their price to spawn chance ratio */ + protected compareByValue(a: ITemplateItem, b: ITemplateItem): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotWeaponGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotWeaponGenerator.d.ts new file mode 100644 index 0000000..13fe7df --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/BotWeaponGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { MinMax, Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotWeaponGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected weightedRandomHelper: WeightedRandomHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected randomUtil: RandomUtil; + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil); + generateWeapon(equipmentSlot: string, weaponPool: Record, modPool: Mods, modChances: ModsChances, magCounts: MinMax, botRole: string, isPmc: boolean, inventory: PmcInventory): void; + /** Checks if all required slots are occupied on a weapon and all it's mods */ + protected isWeaponValid(itemList: Item[]): boolean; + /** + * Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets. + * Additionally, adds extra bullets to SecuredContainer + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @param {*} magCounts + * @param {*} ammoTpl + * @returns + */ + protected generateExtraMagazines(weaponMods: Item[], weaponTemplate: ITemplateItem, magCounts: MinMax, ammoTpl: string, inventory: PmcInventory): void; + protected addBullets(ammoTpl: string, bulletCount: number, inventory: PmcInventory): void; + /** + * Finds and returns tpl of ammo that should be used, while making sure it's compatible + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @returns + */ + protected getCompatibleAmmo(weaponMods: Item[], weaponTemplate: ITemplateItem): string; + /** Fill existing magazines to full, while replacing their contents with specified ammo */ + protected fillExistingMagazines(weaponMods: Item[], magazine: Item, ammoTpl: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/LocationGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/LocationGenerator.d.ts new file mode 100644 index 0000000..bd368b5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/LocationGenerator.d.ts @@ -0,0 +1,46 @@ +import { ContainerHelper } from "../helpers/ContainerHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { ILooseLoot, SpawnpointTemplate } from "../models/eft/common/ILooseLoot"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "../models/eft/common/tables/ILootBase"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILocationConfig } from "../models/spt/config/ILocationConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { RandomUtil } from "../utils/RandomUtil"; +export interface IContainerItem { + items: Item[]; + width: number; + height: number; +} +export declare class LocationGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected objectId: ObjectId; + protected randomUtil: RandomUtil; + protected ragfairServerHelper: RagfairServerHelper; + protected itemHelper: ItemHelper; + protected mathUtil: MathUtil; + protected gameEventHelper: GameEventHelper; + protected containerHelper: ContainerHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected locationConfig: ILocationConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, objectId: ObjectId, randomUtil: RandomUtil, ragfairServerHelper: RagfairServerHelper, itemHelper: ItemHelper, mathUtil: MathUtil, gameEventHelper: GameEventHelper, containerHelper: ContainerHelper, presetHelper: PresetHelper, configServer: ConfigServer); + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + protected getLooseLootMultiplerForLocation(location: string): number; + protected getStaticLootMultiplerForLocation(location: string): number; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; + protected createItem(tpl: string, staticAmmoDist: Record, parentId?: string): IContainerItem; + protected getRandomCompatibleCaliberTemplateId(item: ITemplateItem): string; + protected getRandomValidCaliber(magTemplate: ITemplateItem): string; + protected drawAmmoTpl(caliber: string, staticAmmoDist: Record): string; + protected createRandomMagCartridges(magTemplate: ITemplateItem, parentId: string, staticAmmoDist: Record, caliber?: string): Item; + protected createCartidges(parentId: string, ammoTpl: string, stackCount: number): Item; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/PMCLootGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/PMCLootGenerator.d.ts new file mode 100644 index 0000000..64e6f7f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/PMCLootGenerator.d.ts @@ -0,0 +1,15 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +export declare class PMCLootGenerator { + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected pocketLootPool: string[]; + protected backpackLootPool: string[]; + protected botConfig: IBotConfig; + constructor(itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/RagfairAssortGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/RagfairAssortGenerator.d.ts new file mode 100644 index 0000000..cbdd7f2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/RagfairAssortGenerator.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairAssortGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected generatedAssortItems: Item[]; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + /** + * Get an array of unique items that can be sold on the flea + * @returns array of unique items + */ + getAssortItems(): Item[]; + protected assortsAreGenerated(): boolean; + /** + * Generate an array of items the flea can sell + * @returns array of unique items + */ + protected generateRagfairAssortItems(): Item[]; + protected createRagfairAssortItem(tplId: string, id?: string): Item; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/RagfairOfferGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/RagfairOfferGenerator.d.ts new file mode 100644 index 0000000..de53ea9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/RagfairOfferGenerator.d.ts @@ -0,0 +1,60 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { RagfairAssortGenerator } from "./RagfairAssortGenerator"; +export declare class RagfairOfferGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected saveServer: SaveServer; + protected presetHelper: PresetHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairPriceService: RagfairPriceService; + protected fenceService: FenceService; + protected itemHelper: ItemHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer); + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; + protected getTraderId(userID: string): string; + protected getRating(userID: string): number; + protected getRatingGrowing(userID: string): boolean; + protected getOfferEndTime(userID: string, time: number): number; + /** + * Create multiple offers for items by using a unique list of items we've generated previously + * @param expiredOffers + */ + generateDynamicOffers(expiredOffers?: Item[]): void; + generateTraderOffers(traderID: string): void; + protected getItemCondition(userID: string, items: Item[], itemDetails: ITemplateItem): Item[]; + protected addMissingCondition(item: Item): Item; + protected getOfferRequirements(items: Item[]): { + count: number; + _tpl: string; + }[]; + /** + * Create a flea offer and store it in the Ragfair server offers array + */ + createFleaOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/WeatherGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/WeatherGenerator.d.ts new file mode 100644 index 0000000..23aa169 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/generators/WeatherGenerator.d.ts @@ -0,0 +1,20 @@ +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class WeatherGenerator { + protected weightedRandomHelper: WeightedRandomHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateTime(data: IWeatherData): IWeatherData; + generateWeather(data: IWeatherData): IWeatherData; + protected getWeightedFog(): string; + protected getWeightedRain(): number; + protected getRandomFloat(node: string): number; + protected getRandomInt(node: string): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/AssortHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/AssortHelper.d.ts new file mode 100644 index 0000000..15586b9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/AssortHelper.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ItemHelper } from "./ItemHelper"; +import { QuestHelper } from "./QuestHelper"; +export declare class AssortHelper { + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + constructor(logger: ILogger, itemHelper: ItemHelper, databaseServer: DatabaseServer, questHelper: QuestHelper); + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort assort items from a trader + * @returns assort items minus locked quest assorts + */ + stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort traders assorts + * @returns traders assorts minus locked loyality assorts + */ + stripLockedLoyaltyAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove an item from an assort + * @param assort assort to modify + * @param itemID item id to remove from asort + * @returns Modified assort + */ + removeItemFromAssort(assort: ITraderAssort, itemID: string): ITraderAssort; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/BotGeneratorHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/BotGeneratorHelper.d.ts new file mode 100644 index 0000000..c382fc9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/BotGeneratorHelper.d.ts @@ -0,0 +1,95 @@ +import { DurabilityLimitsHelper } from "../helpers/DurabilityLimitsHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item, Repairable, Upd } from "../models/eft/common/tables/IItem"; +import { Grid, ITemplateItem, Slot } from "../models/eft/common/tables/ITemplateItem"; +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { InventoryHelper } from "./InventoryHelper"; +import { ItemHelper } from "./ItemHelper"; +export declare class BotGeneratorHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected durabilityLimitsHelper: DurabilityLimitsHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected containerHelper: ContainerHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, configServer: ConfigServer); + generateModsForItem(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, isPmc?: boolean): Item[]; + /** + * With the shotgun revolver (60db29ce99594040e04c4a27) 12.12 introduced CylinderMagazines. + * Those magazines (e.g. 60dc519adf4c47305f6d410d) have a "Cartridges" entry with a _max_count=0. + * Ammo is not put into the magazine directly but assigned to the magazine's slots: The "camora_xxx" slots. + * This function is a helper called by generateModsForItem for mods with parent type "CylinderMagazine" + * + * @param {object} items The items where the CylinderMagazine's camora are appended to + * @param {object} modPool modPool which should include available cartrigdes + * @param {string} parentId The CylinderMagazine's UID + * @param {object} parentTemplate The CylinderMagazine's template + */ + protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void; + generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): { + upd?: Upd; + }; + /** + * Create a repairable object for a weapon that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + /** + * Create a repairable object for an armor that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string; + /** + * Sort by spawn chance, highest to lowest, higher is more common + * @param unsortedModArray String array to sort + * @returns Sorted string array + */ + protected sortModArray(unsortedModArray: string[]): string[]; + /** + * Can an item be added to an item without issue + * @param items + * @param tplToCheck + * @param equipmentSlot + * @returns true if possible + */ + isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean; + /** + * Adds an item with all its childern into specified equipmentSlots, wherever it fits. + * @param equipmentSlots + * @param parentId + * @param parentTpl + * @param itemWithChildren + * @param inventory + * @returns a `boolean` indicating item was added + */ + addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: PmcInventory): boolean; + protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean; +} +export declare class ExhaustableArray { + private itemPool; + private randomUtil; + private jsonUtil; + private pool; + constructor(itemPool: T[], randomUtil: RandomUtil, jsonUtil: JsonUtil); + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/BotHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/BotHelper.d.ts new file mode 100644 index 0000000..0cb1227 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/BotHelper.d.ts @@ -0,0 +1,44 @@ +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + getBotDifficultySettings(type: string, difficulty: string): Difficulty; + getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Randomise the chance the PMC will attack their own side + * @param difficultySettings pmc difficulty settings + */ + randomisePmcHostility(difficultySettings: Difficulty): void; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + /** + * Add a bot to the FRIENDLY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typeToAdd bot type to add to friendly list + */ + addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; + /** + * Add a bot to the ENEMY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to enemy list + */ + addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Add a bot to the REVENGE_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to revenge list + */ + addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ContainerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ContainerHelper.d.ts new file mode 100644 index 0000000..3c2ee93 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ContainerHelper.d.ts @@ -0,0 +1,12 @@ +export declare class FindSlotResult { + success: boolean; + x: any; + y: any; + rotation: boolean; + constructor(success?: boolean, x?: any, y?: any, rotation?: boolean); +} +export declare class ContainerHelper { + protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean; + findSlotForItem(container2D: number[][], itemWidth: number, itemHeight: number): FindSlotResult; + fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/DialogueHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/DialogueHelper.d.ts new file mode 100644 index 0000000..9776c6a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/DialogueHelper.d.ts @@ -0,0 +1,21 @@ +import { Dialogue, MessageContent, MessagePreview } from "../models/eft/profile/IAkiProfile"; +import { MessageType } from "../models/enums/MessageType"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { ItemHelper } from "./ItemHelper"; +import { NotificationSendHelper } from "./NotificationSendHelper"; +import { NotifierHelper } from "./NotifierHelper"; +export declare class DialogueHelper { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected notificationSendHelper: NotificationSendHelper; + protected itemHelper: ItemHelper; + constructor(hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, notificationSendHelper: NotificationSendHelper, itemHelper: ItemHelper); + createMessageContext(templateId: string, messageType: MessageType, maxStoreTime: number): MessageContent; + addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards?: any[]): void; + getMessagePreview(dialogue: Dialogue): MessagePreview; + getMessageItemContents(messageID: string, sessionID: string): any[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/DurabilityLimitsHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/DurabilityLimitsHelper.d.ts new file mode 100644 index 0000000..07a5db1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/DurabilityLimitsHelper.d.ts @@ -0,0 +1,26 @@ +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotHelper } from "./BotHelper"; +export declare class DurabilityLimitsHelper { + protected randomUtil: RandomUtil; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(randomUtil: RandomUtil, botHelper: BotHelper, configServer: ConfigServer); + getRandomisedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + getRandomisedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + protected generateMaxWeaponDurability(botRole: string): number; + protected generateMaxPmcArmorDurability(itemMaxDurability: number): number; + protected getLowestMaxWeaponFromConfig(botRole: string): number; + protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number; + protected generateWeaponDurability(botRole: string, maxDurability: number): number; + protected generateArmorDurability(botRole: string, maxDurability: number): number; + protected getMinWeaponDeltaFromConfig(botRole: string): number; + protected getMaxWeaponDeltaFromConfig(botRole: string): number; + protected getMinArmorDeltaFromConfig(botRole: string): number; + protected getMaxArmorDeltaFromConfig(botRole: string): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ExtendedProfileHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ExtendedProfileHelper.d.ts new file mode 100644 index 0000000..d8b754d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ExtendedProfileHelper.d.ts @@ -0,0 +1,22 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { IPmcData, Skills, Stats } from "../models/eft/common/IPmcData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class ExtendedProfileHelper extends ProfileHelper { + protected botGenerator: BotGenerator; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService, botGenerator: BotGenerator); + generatePlayerScav(sessionID: string): IPmcData; + protected getScavSkills(sessionID: string): Skills; + protected removeSecureContainer(profile: IPmcData): IPmcData; + protected getDefaultScavSkills(): Skills; + protected getScavStats(sessionID: string): Stats; + protected getScavLevel(sessionID: string): number; + protected getScavExperience(sessionID: string): number; + protected setScavCooldownTimer(profile: IPmcData, pmcData: IPmcData): IPmcData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/GameEventHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/GameEventHelper.d.ts new file mode 100644 index 0000000..b2d6377 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/GameEventHelper.d.ts @@ -0,0 +1,9 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class GameEventHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + get EVENT(): Record; + get christmasEventItems(): string[]; + itemIsChristmasRelated(itemId: string): boolean; + christmasEventEnabled(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HandbookHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HandbookHelper.d.ts new file mode 100644 index 0000000..b47d466 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HandbookHelper.d.ts @@ -0,0 +1,33 @@ +declare class LookupItem { + byId: Record; + byParent: Record; + constructor(); +} +export declare class LookupCollection { + items: LookupItem; + categories: LookupItem; + constructor(); +} +export declare class HandbookHelper { + protected lookup: LookupCollection; + hydrateLookup(lookup: LookupCollection): void; + getTemplatePrice(x: string): number; + templatesWithParent(x: string): string[]; + isCategory(x: string): boolean; + childrenCategories(x: string): string[]; + /** + * Gets Currency to Ruble conversion Value + * @param {number} value + * @param {string} currencyFrom + * @returns number + */ + inRUB(value: number, currencyFrom: string): number; + /** + * Gets Ruble to Currency conversion Value + * @param {number} value + * @param {string} currencyTo + * @returns number + */ + fromRUB(value: number, currencyTo: string): number; +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HealthHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HealthHelper.d.ts new file mode 100644 index 0000000..518c23f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HealthHelper.d.ts @@ -0,0 +1,27 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHealthConfig } from "../models/spt/config/IHealthConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HealthHelper { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected configServer: ConfigServer; + protected healthConfig: IHealthConfig; + constructor(jsonUtil: JsonUtil, logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, configServer: ConfigServer); + resetVitality(sessionID: string): IAkiProfile; + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + protected saveHealth(pmcData: IPmcData, sessionID: string): void; + protected saveEffects(pmcData: IPmcData, sessionID: string): void; + protected addEffect(pmcData: IPmcData, sessionID: string, effect: { + bodyPart: string; + effectType: string; + }): void; + protected isEmpty(map: any): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HideoutHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HideoutHelper.d.ts new file mode 100644 index 0000000..76b337f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HideoutHelper.d.ts @@ -0,0 +1,68 @@ +import { Common, HideoutArea, IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { StageBonus } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class HideoutHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected inventoryHelper: InventoryHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + static BITCOIN_FARM: string; + protected WATER_COLLECTOR: string; + protected BITCOIN: string; + protected EXPEDITIONARY_FUEL_TANK: string; + static NAME_BACKENDCOUNTERS_CRAFTING: string; + static SKILL_NAME_HIDEOUT: string; + static HOUR_FOR_SKILL_CRAFTING: number; + static SKILL_NAME_CRAFITING: string; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer); + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + /** + * This convinience function intialies new Production Object + * with all the constants. + */ + initProduction(recipeId: string, productionTime: number): Production; + isProductionType(productive: Productive): productive is Production; + applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void; + protected applySkillXPBoost(pmcData: IPmcData, bonus: StageBonus): void; + updatePlayerHideout(sessionID: string): void; + protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void; + protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean; + protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateWaterFilters(waterFilterArea: HideoutArea, pwProd: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea; + protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd; + protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production; + protected getBTCSlots(pmcData: IPmcData): number; + protected getManagementSkillsSlots(): number; + protected hasManagementSkillSlots(pmcData: IPmcData): boolean; + protected getHideoutManagementSkill(pmcData: IPmcData): Common; + protected getHideoutManagementConsumptionBonus(pmcData: IPmcData): number; + isProduction(productive: Productive): productive is Production; + getBTC(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + getRandomAmountRewardForScavCase(itemToCalculate: ITemplateItem): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HttpServerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HttpServerHelper.d.ts new file mode 100644 index 0000000..c6e5296 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/HttpServerHelper.d.ts @@ -0,0 +1,23 @@ +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HttpServerHelper { + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + protected mime: { + css: string; + bin: string; + html: string; + jpg: string; + js: string; + json: string; + png: string; + svg: string; + txt: string; + }; + constructor(configServer: ConfigServer); + getMimeText(key: string): string; + buildUrl(): string; + getBackendUrl(): string; + getWebsocketUrl(): string; + sendTextJson(resp: any, output: any): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/InRaidHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/InRaidHelper.d.ts new file mode 100644 index 0000000..05b6fdf --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/InRaidHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Victim } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { PaymentHelper } from "./PaymentHelper"; +export declare class InRaidHelper { + protected logger: ILogger; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + protected removePlayer(sessionID: string): void; + protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void; + addUpdToMoneyFromRaid(items: Item[]): void; + /** + * Add positive karma for PMC kills + * @param {*} existingFenceStanding + * @param {*} victims + */ + calculateFenceStandingChangeFromKills(existingFenceStanding: number, victims: Victim[]): void; + setBaseStats(profileData: IPmcData, offraidData: ISaveProgressRequestData, sessionID: string): IPmcData; + markFoundItems(pmcData: IPmcData, profile: IPmcData, isPlayerScav: boolean): IPmcData; + removeFoundInRaidStatusFromItems(profile: IPmcData): IPmcData; + setInventory(sessionID: string, pmcData: IPmcData, profile: IPmcData): IPmcData; + deleteInventory(pmcData: IPmcData, sessionID: string): IPmcData; + getPlayerGear(items: Item[]): Item[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/InventoryHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/InventoryHelper.d.ts new file mode 100644 index 0000000..dc7cbca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/InventoryHelper.d.ts @@ -0,0 +1,85 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInventoryConfig } from "../models/spt/config/IInventoryConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class InventoryHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected httpResponse: HttpResponseUtil; + protected fenceService: FenceService; + protected databaseServer: DatabaseServer; + protected paymentHelper: PaymentHelper; + protected traderAssortHelper: TraderAssortHelper; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected containerHelper: ContainerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected inventoryConfig: IInventoryConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, httpResponse: HttpResponseUtil, fenceService: FenceService, databaseServer: DatabaseServer, paymentHelper: PaymentHelper, traderAssortHelper: TraderAssortHelper, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, containerHelper: ContainerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + getItemSize(itemTpl: string, itemID: string, inventoryItem: Item[]): Record; + protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): Record; + protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash; + getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]; + /** + * Based on the item action, determine whose inventories we should be looking at for from and to. + */ + getOwnerInventoryItems(body: IInventoryMoveRequestData | IInventorySplitRequestData | IInventoryMergeRequestData, sessionID: string): OwnerInventoryItems; + /** + * Made a 2d array table with 0 - free slot and 1 - used slot + * @param {Object} pmcData + * @param {string} sessionID + * @returns Array + */ + protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][]; + protected getStashType(sessionID: string): string; + protected getPlayerStashSize(sessionID: string): Record; + /** + * Internal helper function to transfer an item from one profile to another. + * fromProfileData: Profile of the source. + * toProfileData: Profile of the destination. + * body: Move request + */ + moveItemToProfile(fromItems: Item[], toItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to move item within the same profile_f. + */ + moveItemInternal(inventoryItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to handle cartridges in inventory if any of them exist. + */ + protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void; +} +declare namespace InventoryHelper { + interface InventoryItemHash { + byItemId: Record; + byParentId: Record; + } +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ItemHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ItemHelper.d.ts new file mode 100644 index 0000000..f124cb1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ItemHelper.d.ts @@ -0,0 +1,147 @@ +import { InsuredItem, IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +declare class ItemHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer); + /** + * Checks if a 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 + */ + isValidItem(tpl: string, invalidBaseTypes?: string[]): boolean; + /** + * Checks if a id is a valid item. Valid meaning that it's an item that may be a reward + * or content of bot loot. Items that are tested as valid may be in a player backpack or stash. + * @param {*} tpl template id of item to check + * @returns boolean: true if item is valid reward + */ + isValidRewardItem(tpl: string): boolean; + /** + * Picks rewardable items from items.json. This means they need to fit into the inventory and they shouldn't be keys (debatable) + * @returns a list of rewardable items [[_tpl, itemTemplate],...] + */ + getRewardableItems(): [string, ITemplateItem][]; + /** + * Check if the tpl / template Id provided is a descendent of the baseclass + * + * @param {string} tpl the item template id to check + * @param {string} baseclassTpl the baseclass to check for + * @return {boolean} is the tpl a descendent? + */ + isOfBaseclass(tpl: string, baseclassTpl: string): any; + /** + * Returns the item price based on the handbook or as a fallback from the prices.json if the item is not + * found in the handbook. If the price can't be found at all return 0 + * + * @param {string} tpl the item template to check + * @returns {integer} The price of the item or 0 if not found + */ + getItemPrice(tpl: string): number; + fixItemStackCount(item: Item): Item; + /** + * AmmoBoxes contain StackSlots which need to be filled for the AmmoBox to have content. + * Here's what a filled AmmoBox looks like: + * { + * "_id": "b1bbe982daa00ac841d4ae4d", + * "_tpl": "57372c89245977685d4159b1", + * "parentId": "5fe49a0e2694b0755a504876", + * "slotId": "hideout", + * "location": { + * "x": 3, + * "y": 4, + * "r": 0 + * }, + * "upd": { + * "StackObjectsCount": 1 + * } + * }, + * { + * "_id": "b997b4117199033afd274a06", + * "_tpl": "56dff061d2720bb5668b4567", + * "parentId": "b1bbe982daa00ac841d4ae4d", + * "slotId": "cartridges", + * "location": 0, + * "upd": { + * "StackObjectsCount": 30 + * } + * } + * Given the AmmoBox Item (first object) this function generates the StackSlot (second object) and returns it. + * StackSlots are only used for AmmoBoxes which only have one element in StackSlots. However, it seems to be generic + * to possibly also have more than one StackSlot. As good as possible, without seeing items having more than one + * StackSlot, this function takes account of this and creates and returns an array of StackSlotItems + * + * @param {object} item The item template of the AmmoBox as given in items.json + * @param {string} parentId The id of the AmmoBox instance these StackSlotItems should be children of + * @returns {array} The array of StackSlotItems + */ + generateStackSlotItems(item: ITemplateItem, parentId: string): StackSlot[]; + getItem(tpl: string): [boolean, ITemplateItem]; + getItemQualityModifier(item: Item): number; + findAndReturnChildrenByItems(items: Item[], itemID: string): string[]; + /** + * A variant of findAndReturnChildren where the output is list of item objects instead of their ids. + */ + findAndReturnChildrenAsItems(items: Item[], baseItemId: string): Item[]; + /** + * find children of the item in a given assort (weapons parts for example, need recursive loop function) + */ + findAndReturnChildrenByAssort(itemIdToFind: string, assort: Item[]): Item[]; + hasBuyRestrictions(itemToCheck: Item): boolean; + /** + * Is Dogtag + * Checks if an item is a dogtag. Used under profile_f.js to modify preparePrice based + * on the level of the dogtag + */ + isDogtag(tpl: string): boolean; + isNotSellable(tpl: string): boolean; + getChildId(item: Item): string; + isItemTplStackable(tpl: string): boolean; + /** + * split item stack if it exceeds StackMaxSize + */ + splitStack(item: Item): Item[]; + /** + * Find Barter items in the inventory + * @param {string} by + * @param {Object} pmcData + * @param {string} barter_itemID + * @returns Array + */ + findBarterItems(by: string, pmcData: IPmcData, barter_itemID: string): any[]; + /** + * @param {Object} pmcData + * @param {Array} items + * @param {Object} fastPanel + * @returns Array + */ + replaceIDs(pmcData: IPmcData, items: Item[], insuredItems?: InsuredItem[], fastPanel?: any): any[]; + /** + * Recursivly loop down through an items hierarchy to see if any of the ids match the supplied list, return true if any do + * @param {string} tpl + * @param {Array} tplsToCheck + * @returns boolean + */ + doesItemOrParentsIdMatch(tpl: string, tplsToCheck: string[]): boolean; + /** + * Return true if item is a quest item + * @param {string} tpl + * @returns boolean + */ + isQuestItem(tpl: string): boolean; + getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize; +} +declare namespace ItemHelper { + interface ItemSize { + width: number; + height: number; + } +} +export { ItemHelper }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/NotificationSendHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/NotificationSendHelper.d.ts new file mode 100644 index 0000000..34e62d9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/NotificationSendHelper.d.ts @@ -0,0 +1,12 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { NotificationService } from "../services/NotificationService"; +export declare class NotificationSendHelper { + protected httpServer: IHttpServer; + protected notificationService: NotificationService; + constructor(httpServer: IHttpServer, notificationService: NotificationService); + /** + * Send notification message to the appropiate channel + */ + sendMessage(sessionID: string, notificationMessage: INotification): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/NotifierHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/NotifierHelper.d.ts new file mode 100644 index 0000000..738b69a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/NotifierHelper.d.ts @@ -0,0 +1,17 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { Message, MessageContentRagfair } from "../models/eft/profile/IAkiProfile"; +import { HttpServerHelper } from "./HttpServerHelper"; +export declare class NotifierHelper { + protected httpServerHelper: HttpServerHelper; + /** + * The default notification sent when waiting times out. + */ + protected defaultNotification: INotification; + constructor(httpServerHelper: HttpServerHelper); + getDefaultNotification(): INotification; + /** Creates a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside */ + createRagfairOfferSoldNotification(dialogueMessage: Message, ragfairData: MessageContentRagfair): INotification; + /** Creates a new notification with the specified dialogueMessage object. */ + createNewMessageNotification(dialogueMessage: Message): INotification; + getWebSocketServer(sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/PaymentHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/PaymentHelper.d.ts new file mode 100644 index 0000000..2d068a4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/PaymentHelper.d.ts @@ -0,0 +1,14 @@ +export declare class PaymentHelper { + /** + * Check whether tpl is Money + * @param {string} tpl + * @returns void + */ + isMoneyTpl(tpl: string): boolean; + /** + * Gets currency TPL from TAG + * @param {string} currency + * @returns string + */ + getCurrency(currency: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/PresetHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/PresetHelper.d.ts new file mode 100644 index 0000000..0371886 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/PresetHelper.d.ts @@ -0,0 +1,14 @@ +import { Preset } from "../models/eft/common/IGlobals"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetHelper { + protected databaseServer: DatabaseServer; + protected lookup: Record; + constructor(databaseServer: DatabaseServer); + hydratePresetStore(input: Record): void; + isPreset(id: string): boolean; + hasPreset(templateId: string): boolean; + getPreset(id: string): Preset; + getPresets(templateId: string): Preset[]; + getDefaultPreset(templateId: string): Preset; + getBaseItemTpl(presetId: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ProfileHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ProfileHelper.d.ts new file mode 100644 index 0000000..6a64291 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/ProfileHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Stats } from "../models/eft/common/IPmcData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +export declare class ProfileHelper { + protected jsonUtil: JsonUtil; + protected watermark: Watermark; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected fenceService: FenceService; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService); + resetProfileQuestCondition(sessionID: string, conditionId: string): void; + getCompleteProfile(sessionID: string): IPmcData[]; + isNicknameTaken(info: IValidateNicknameRequestData, sessionID: string): boolean; + getProfileByPmcId(pmcId: string): IPmcData; + getExperience(level: number): number; + getMaxLevel(): number; + getDefaultAkiDataObject(): any; + getFullProfile(sessionID: string): IAkiProfile; + getPmcProfile(sessionID: string): IPmcData; + getScavProfile(sessionID: string): IPmcData; + getDefaultCounters(): Stats; + protected isWiped(sessionID: string): boolean; + protected getServerVersion(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/QuestConditionHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/QuestConditionHelper.d.ts new file mode 100644 index 0000000..90ee560 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/QuestConditionHelper.d.ts @@ -0,0 +1,7 @@ +import { AvailableForConditions } from "../models/eft/common/tables/IQuest"; +export declare class QuestConditionHelper { + getQuestConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLevelConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLoyaltyConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/QuestHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/QuestHelper.d.ts new file mode 100644 index 0000000..f32c85c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/QuestHelper.d.ts @@ -0,0 +1,69 @@ +import { IPmcData, Quest } from "../models/eft/common/IPmcData"; +import { AvailableForConditions, AvailableForProps, IQuest, Reward } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { TraderHelper } from "./TraderHelper"; +export declare class QuestHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, traderHelper: TraderHelper, configServer: ConfigServer); + static get STATUS(): Record; + questStatus(pmcData: IPmcData, questID: string): string; + /** + * returns true is the condition is satisfied + */ + evaluateLevel(pmcProfile: IPmcData, cond: AvailableForConditions): boolean; + getDeltaQuests(before: IQuest[], after: IQuest[]): IQuest[]; + rewardSkillPoints(sessionID: string, pmcData: IPmcData, output: IItemEventRouterResponse, skillName: string, progress: number): void; + getQuestLocale(questId: string): any; + /** + * Debug Routine for showing some information on the + * quest list in question. + */ + dumpQuests(quests: any, label?: any): void; + loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean; + protected processReward(reward: Reward): any[]; + getQuestRewardItems(quest: IQuest, state: string): Reward[]; + addQuestToPMCData(pmcData: IPmcData, quest: Quest, newState: string, acceptedQuest: IAcceptQuestRequestData): void; + acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[]; + failedUnlocked(failedQuestId: string, sessionID: string): IQuest[]; + applyMoneyBoost(quest: IQuest, moneyBoost: number): IQuest; + changeItemStack(pmcData: IPmcData, id: string, value: number, sessionID: string, output: any): void; + /** + * Get List of All Quests as an array + */ + questValues(): IQuest[]; + protected cleanQuestList(quests: IQuest[]): IQuest[]; + cleanQuestConditions(quest: IQuest): IQuest; + failQuest(pmcData: IPmcData, body: any, sessionID: string): any; + getQuestFromDb(questId: string, pmcData: IPmcData): IQuest; + getQuestLocaleIdFromDb(messageId: string, localisation?: string): string; + applyQuestReward(pmcData: IPmcData, body: ICompleteQuestRequestData, state: string, sessionID: string): any[]; + getFindItemIdForQuestItem(itemTpl: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairHelper.d.ts new file mode 100644 index 0000000..c8bc5ba --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairHelper.d.ts @@ -0,0 +1,44 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairLinkedItemService } from "../services/RagfairLinkedItemService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +import { UtilityHelper } from "./UtilityHelper"; +export declare class RagfairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected traderAssortHelper: TraderAssortHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected ragfairLinkedItemService: RagfairLinkedItemService; + protected utilityHelper: UtilityHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, traderAssortHelper: TraderAssortHelper, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, ragfairLinkedItemService: RagfairLinkedItemService, utilityHelper: UtilityHelper, configServer: ConfigServer); + /** + * Gets currency TAG from TPL + * @param {string} currency + * @returns string + */ + getCurrencyTag(currency: string): string; + filterCategories(sessionID: string, info: ISearchRequestData): string[]; + getDisplayableAssorts(sessionID: string): Record; + protected getCategoryList(handbookId: string): string[]; + countCategories(result: IGetOffersResult): void; + /** + * Merges Root Items + * Ragfair allows abnormally large stacks. + */ + mergeStackable(items: Item[]): Item[]; + getCurrencySymbol(currencyTpl: string): string; + formatCurrency(moneyAmount: number): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairOfferHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairOfferHelper.d.ts new file mode 100644 index 0000000..129bc1c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairOfferHelper.d.ts @@ -0,0 +1,52 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { PresetHelper } from "./PresetHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairHelper } from "./RagfairHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { RagfairSortHelper } from "./RagfairSortHelper"; +export declare class RagfairOfferHelper { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected paymentHelper: PaymentHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected configServer: ConfigServer; + protected static TPL_GOODS_SOLD: string; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, configServer: ConfigServer); + getValidOffers(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + getOffersForBuild(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + processOffers(sessionID: string): boolean; + protected getProfileOffers(sessionID: string): IRagfairOffer[]; + protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; + isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairSellHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairSellHelper.d.ts new file mode 100644 index 0000000..6ec004a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairSellHelper.d.ts @@ -0,0 +1,16 @@ +import { SellResult } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairSellHelper { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateSellChance(baseChance: number, offerPrice: number, requirementsPriceInRub: number): number; + rollForSale(sellChance: number, count: number): SellResult[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairServerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairServerHelper.d.ts new file mode 100644 index 0000000..2cb3ea5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairServerHelper.d.ts @@ -0,0 +1,46 @@ +import { MemberCategory } from "../models/enums/MemberCategory"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class RagfairServerHelper { + protected randomUtil: RandomUtil; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected jsonUtil: JsonUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + protected static TPL_GOODS_RETURNED: string; + constructor(randomUtil: RandomUtil, hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, profileHelper: ProfileHelper, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, jsonUtil: JsonUtil, configServer: ConfigServer); + /** + * Is item valid / on blacklist / quest item + * @param itemDetails + * @returns boolean + */ + isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean; + protected isItemBlacklisted(itemTemplateId: string): boolean; + isTrader(userID: string): boolean; + isPlayer(userID: string): boolean; + returnItems(sessionID: string, items: any[]): void; + calculateDynamicStackCount(tplId: string, isWeaponPreset: boolean): number; + getDynamicOfferCurrency(): string; + getMemberType(userID: string): MemberCategory; + getNickname(userID: string): string; + getPresetItems(item: any): Item[]; + getPresetItemsByTpl(item: Item): Item[]; + reparentPresets(item: Item, preset: Item[]): Item[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairSortHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairSortHelper.d.ts new file mode 100644 index 0000000..e983569 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairSortHelper.d.ts @@ -0,0 +1,12 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class RagfairSortHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + sortOffers(offers: IRagfairOffer[], type: number, direction?: number): IRagfairOffer[]; + protected sortOffersByID(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByExpiry(a: IRagfairOffer, b: IRagfairOffer): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairTaxHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairTaxHelper.d.ts new file mode 100644 index 0000000..820facb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RagfairTaxHelper.d.ts @@ -0,0 +1,16 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { ItemHelper } from "./ItemHelper"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairTaxHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected ragfairPriceService: RagfairPriceService; + protected itemHelper: ItemHelper; + constructor(logger: ILogger, databaseServer: DatabaseServer, ragfairPriceService: RagfairPriceService, itemHelper: ItemHelper); + calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number; + protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem?: boolean): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RepairHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RepairHelper.d.ts new file mode 100644 index 0000000..650c1aa --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/RepairHelper.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { Props } from "../models/eft/common/tables/ITemplateItem"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RepairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, configServer: ConfigServer); + updateItemDurability(itemToRepairId: string, amountToRepair: number, pmcData: IPmcData, useRepairKit?: boolean): Item; + protected getRandomisedArmorRepairDegredationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number): number; + protected getRandomisedWeaponRepairDegredationValue(itemProps: Props, isRepairKit: boolean, armorMax: number): number; + isWeaponTemplate(tpl: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/SecureContainerHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/SecureContainerHelper.d.ts new file mode 100644 index 0000000..9e2bc32 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/SecureContainerHelper.d.ts @@ -0,0 +1,13 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ItemHelper } from "./ItemHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class SecureContainerHelper { + protected itemHelper: ItemHelper; + constructor(itemHelper: ItemHelper); + getSecureContainerItems(items: Item[]): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TradeHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TradeHelper.d.ts new file mode 100644 index 0000000..975062b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TradeHelper.d.ts @@ -0,0 +1,44 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item, Upd } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { RagfairServer } from "../servers/RagfairServer"; +import { FenceService } from "../services/FenceService"; +import { PaymentService } from "../services/PaymentService"; +export declare class TradeHelper { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected fenceService: FenceService; + protected inventoryHelper: InventoryHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer); + /** + * Buy item from flea or trader + * @param pmcData + * @param buyRequestData data from client + * @param sessionID + * @param foundInRaid + * @param upd optional item details used when buying from flea + * @returns + */ + buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse; + /** + * Sell item to trader + * @param pmcData + * @param body + * @param sessionID + * @returns + */ + sellItem(pmcData: IPmcData, body: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse; + protected incrementAssortBuyCount(assortBeingPurchased: Item, itemsPurchasedCount: number): void; + protected checkPurchaseIsWithinTraderItemLimit(assortBeingPurchased: Item, assortId: string, count: number): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TraderAssortHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TraderAssortHelper.d.ts new file mode 100644 index 0000000..4f41ac2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TraderAssortHelper.d.ts @@ -0,0 +1,42 @@ +import { RagfairAssortGenerator } from "../generators/RagfairAssortGenerator"; +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { AssortHelper } from "./AssortHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderAssortHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected assortHelper: AssortHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected traderAssortService: TraderAssortService; + protected fenceService: FenceService; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, profileHelper: ProfileHelper, assortHelper: AssortHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferGenerator: RagfairOfferGenerator, traderAssortService: TraderAssortService, fenceService: FenceService); + /** + * Get a traders assorts + * Can be used for returning ragfair / fence assorts + * @param sessionId session id + * @param traderId trader id + * @returns a traders assorts + */ + getAssort(sessionId: string, traderId: string): ITraderAssort; + /** + * Get an array of pristine trader items prior to any alteration by player + * @param traderId trader id + * @returns array of Items + */ + protected getPristineTraderAssorts(traderId: string): Item[]; + /** + * Returns generated ragfair offers in a trader assort format + * @returns Trader assort object + */ + protected getRagfairDataAsTraderAssort(): ITraderAssort; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TraderHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TraderHelper.d.ts new file mode 100644 index 0000000..ab4a371 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/TraderHelper.d.ts @@ -0,0 +1,53 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { PlayerService } from "../services/PlayerService"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemHelper: ItemHelper; + protected handbookHelper: HandbookHelper; + protected playerService: PlayerService; + protected fenceService: FenceService; + protected configServer: ConfigServer; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemHelper: ItemHelper, handbookHelper: HandbookHelper, playerService: PlayerService, fenceService: FenceService, configServer: ConfigServer); + getTrader(traderID: string, sessionID: string): ITraderBase; + getTraderAssortsById(traderId: string): ITraderAssort; + /** + * Reset a trader back to its initial state as seen by a level 1 player + * Does NOT take into account different profile levels + * @param sessionID session id + * @param traderID trader id to reset + */ + resetTrader(sessionID: string, traderID: string): void; + changeTraderDisplay(traderID: string, status: boolean, sessionID: string): void; + getPurchasesData(traderID: string, sessionID: string): Record; + /** + * Calculate traders level based on exp amount and increment level if over threshold + * @param traderID trader to process + * @param sessionID session id + */ + lvlUp(traderID: string, sessionID: string): void; + getTraderUpdateSeconds(traderId: string): number; + /** + * check if an item is allowed to be sold to a trader + * @param traderFilters array of allowed categories + * @param tplToCheck itemTpl of inventory + * @returns boolean + */ + traderFilter(traderFilters: string[], tplToCheck: string): boolean; + getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/UtilityHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/UtilityHelper.d.ts new file mode 100644 index 0000000..5d9f482 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/UtilityHelper.d.ts @@ -0,0 +1,3 @@ +export declare class UtilityHelper { + arrayIntersect(a: T[], b: T[]): T[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/WeightedRandomHelper.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/WeightedRandomHelper.d.ts new file mode 100644 index 0000000..9aa0d29 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/helpers/WeightedRandomHelper.d.ts @@ -0,0 +1,28 @@ +export declare class WeightedRandomHelper { + /** + * Gets a tplId from a weighted dictionary + * @param {tplId: weighting[]} itemArray + * @returns tplId + */ + getWeightedInventoryItem(itemArray: { + [tplId: string]: unknown; + } | ArrayLike): string; + /** + * Picks the random item based on its weight. + * The items with higher weight will be picked more often (with a higher probability). + * + * For example: + * - items = ['banana', 'orange', 'apple'] + * - weights = [0, 0.2, 0.8] + * - weightedRandom(items, weights) in 80% of cases will return 'apple', in 20% of cases will return + * 'orange' and it will never return 'banana' (because probability of picking the banana is 0%) + * + * @param {any[]} items + * @param {number[]} weights + * @returns {{item: any, index: number}} + */ + weightedRandom(items: string | any[], weights: string | any[]): { + item: any; + index: number; + }; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/BleedingEdgeEntry.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/BleedingEdgeEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/BleedingEdgeEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/Compiler.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/Compiler.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/Compiler.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/DebugEntry.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/DebugEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/DebugEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/ReleaseEntry.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/ReleaseEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/ReleaseEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/TestEntry.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/TestEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/ide/TestEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/BundleLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/BundleLoader.d.ts new file mode 100644 index 0000000..06ad698 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/BundleLoader.d.ts @@ -0,0 +1,22 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +declare class BundleInfo { + modPath: string; + key: string; + path: string; + filepath: string; + dependencyKeys: string[]; + constructor(modpath: string, bundle: any, bundlePath: string, bundleFilepath: string); +} +export declare class BundleLoader { + protected httpServerHelper: HttpServerHelper; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected bundles: Record; + constructor(httpServerHelper: HttpServerHelper, vfs: VFS, jsonUtil: JsonUtil); + getBundles(local: boolean): BundleInfo[]; + getBundle(key: string, local: boolean): BundleInfo; + addBundles(modpath: string): void; +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/DelayedModLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/DelayedModLoader.d.ts new file mode 100644 index 0000000..2a05604 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/DelayedModLoader.d.ts @@ -0,0 +1,21 @@ +import { DependencyContainer } from "tsyringe"; +import { HandbookController } from "../controllers/HandbookController"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +import { InitialModLoader } from "./InitialModLoader"; +export declare class DelayedModLoader implements IModLoader { + protected bundleLoader: BundleLoader; + protected handbookController: HandbookController; + protected vfs: VFS; + protected modCompilerService: ModCompilerService; + protected initialModLoader: InitialModLoader; + constructor(bundleLoader: BundleLoader, handbookController: HandbookController, vfs: VFS, modCompilerService: ModCompilerService, initialModLoader: InitialModLoader); + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; + load(): void; + protected executeMods(container: DependencyContainer): void; + protected addBundles(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/InitialModLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/InitialModLoader.d.ts new file mode 100644 index 0000000..68e47fe --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/loaders/InitialModLoader.d.ts @@ -0,0 +1,64 @@ +import { DependencyContainer } from "tsyringe"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ModLoader } from "../models/spt/mod/IMod"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +export declare class InitialModLoader implements IModLoader { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected modCompilerService: ModCompilerService; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected static container: DependencyContainer; + protected readonly basepath = "user/mods/"; + protected imported: Record; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer); + load(container: DependencyContainer): Promise; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + /** + * Returns a list of mods with preserved load order + * @returns Array of mod names in load order + */ + getImportedModsNames(): string[]; + getModPath(mod: string): string; + protected importClass(name: string, filepath: string, container: DependencyContainer): void; + protected importMods(): Promise; + /** + * + * @param mods Get an array of broken/invalid mods by name + * @returns Mod names array + */ + protected getBrokenMods(mods: string[]): string[]; + /** + * Get packageJson data for mods + * @param mods mods to get packageJson for + * @returns dictionary + */ + protected getModsPackageData(mods: string[]): Record; + /** + * Does mod have "delayedLoad(" string in its entry class + * @param modFolderName folder name + * @param modToValidate package.json details + * @returns boolean + */ + protected isModSpt300Compatible(modFolderName: string, modToValidate: IPackageJsonData): boolean; + protected isModCombatibleWithAki(mod: IPackageJsonData): boolean; + protected executeMods(container: DependencyContainer): void; + sortModsLoadOrder(): string[]; + protected addMod(mod: string): Promise; + protected areModDependenciesFulfilled(mod: IPackageJsonData, loadedMods: Record): boolean; + protected isModCompatible(mod: IPackageJsonData, loadedMods: Record): boolean; + protected validMod(mod: string): boolean; + protected getLoadOrderRecursive(mod: string, result: Record, visited: Record): void; + protected getLoadOrder(mods: Record): Record; + getContainer(): DependencyContainer; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts new file mode 100644 index 0000000..c49cef7 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts @@ -0,0 +1,8 @@ +export interface IGenerateBotsRequestData { + conditions: Condition[]; +} +export interface Condition { + Role: string; + Limit: number; + Difficulty: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IEmptyRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IEmptyRequestData.d.ts new file mode 100644 index 0000000..284d16e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IEmptyRequestData.d.ts @@ -0,0 +1,2 @@ +export interface IEmptyRequestData { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IGlobals.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IGlobals.d.ts new file mode 100644 index 0000000..456895c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IGlobals.d.ts @@ -0,0 +1,1176 @@ +import { Item } from "./tables/IItem"; +export interface IGlobals { + time: number; + config: Config; + bot_presets: BotPreset[]; + BotWeaponScatterings: BotWeaponScattering[]; + ItemPresets: Record; +} +export interface Config { + content: Content; + AimPunchMagnitude: number; + WeaponSkillProgressRate: number; + SkillAtrophy: boolean; + exp: Exp; + t_base_looting: number; + t_base_lockpicking: number; + armor: Armor; + SessionsToShowHotKeys: number; + MaxBotsAliveOnMap: number; + SavagePlayCooldown: number; + SavagePlayCooldownNdaFree: number; + MarksmanAccuracy: number; + SavagePlayCooldownDevelop: number; + TODSkyDate: string; + Mastering: Mastering[]; + GlobalItemPriceModifier: number; + TradingUnlimitedItems: boolean; + MaxLoyaltyLevelForAll: boolean; + GlobalLootChanceModifier: number; + TimeBeforeDeploy: number; + TimeBeforeDeployLocal: number; + LoadTimeSpeedProgress: number; + BaseLoadTime: number; + BaseUnloadTime: number; + BaseCheckTime: number; + Customization: Customization; + UncheckOnShot: boolean; + BotsEnabled: boolean; + ArmorMaterials: ArmorMaterials; + LegsOverdamage: number; + HandsOverdamage: number; + StomachOverdamage: number; + Health: Health; + rating: Rating; + tournament: Tournament; + RagFair: RagFair; + handbook: Handbook; + FractureCausedByFalling: Probability; + FractureCausedByBulletHit: Probability; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + Stamina: Stamina; + StaminaRestoration: StaminaRestoration; + StaminaDrain: StaminaDrain; + RequirementReferences: RequirementReferences; + RepairKitSettings: RepairKitSettings; + RestrictionsInRaid: RestrictionsInRaid[]; + SkillMinEffectiveness: number; + SkillFatiguePerPoint: number; + SkillFreshEffectiveness: number; + SkillFreshPoints: number; + SkillPointsBeforeFatigue: number; + SkillFatigueReset: number; + DiscardLimitsEnabled: boolean; + EventType: string[]; + WalkSpeed: xyz; + SprintSpeed: xyz; + SkillEnduranceWeightThreshold: number; + TeamSearchingTimeout: number; + Insurance: Insurance; + SkillExpPerLevel: number; + GameSearchingTimeout: number; + WallContusionAbsorption: xyz; + SkillsSettings: SkillsSettings; + AzimuthPanelShowsPlayerOrientation: boolean; + Aiming: Aiming; + Malfunction: Malfunction; + Overheat: Overheat; + FenceSettings: FenceSettings; + TestValue: number; + Inertia: Inertia; + Ballistic: Ballistic; +} +export interface Content { + ip: string; + port: number; + root: string; +} +export interface Exp { + heal: Heal; + match_end: MatchEnd; + kill: Kill; + level: Level; + loot_attempts: LootAttempt[]; + expForLockedDoorOpen: number; + expForLockedDoorBreach: number; + triggerMult: number; +} +export interface Heal { + expForHeal: number; + expForHydration: number; + expForEnergy: number; +} +export interface MatchEnd { + README: string; + survived_exp_requirement: number; + survived_seconds_requirement: number; + survived_exp_reward: number; + mia_exp_reward: number; + runner_exp_reward: number; + leftMult: number; + miaMult: number; + survivedMult: number; + runnerMult: number; + killedMult: number; +} +export interface Kill { + combo: Combo[]; + victimLevelExp: number; + headShotMult: number; + expOnDamageAllHealth: number; + longShotDistance: number; + bloodLossToLitre: number; + victimBotLevelExp: number; +} +export interface Combo { + percent: number; +} +export interface Level { + exp_table: ExpTable[]; + trade_level: number; + savage_level: number; + clan_level: number; + mastering1: number; + mastering2: number; +} +export interface ExpTable { + exp: number; +} +export interface LootAttempt { + k_exp: number; +} +export interface Armor { + class: Class[]; +} +export interface Class { + resistance: number; +} +export interface Mastering { + Name: string; + Templates: string[]; + Level2: number; + Level3: number; +} +export interface Customization { + SavageHead: SavageHead; + SavageBody: SavageBody; + SavageFeet: SavageFeet; + CustomizationVoice: CustomizationVoice[]; + BodyParts: BodyParts; +} +export interface SavageHead { + wild_head_1: WildHead; + wild_head_2: WildHead; + wild_head_3: WildHead; + Wild_Dealmaker_head: WildHead; + Wild_Killa_head: WildHead; + bear_head: WildHead; + bear_head_1: WildHead; + usec_head_1: WildHead; + Head_BOSS_Glukhar: WildHead; + Wild_Head_nonMesh: WildHead; + Head_BOSS_Sanitar: WildHead; + wild_head_drozd: WildHead; + wild_head_misha: WildHead; + head_cultist_01: WildHead; + head_cultist_02: WildHead; + head_cultist_03: WildHead; + DefaultUsecHead: WildHead; + usec_head_3: WildHead; + usec_head_4: WildHead; + usec_head_5: WildHead; +} +export interface WildHead { + head: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface SavageBody { + wild_body: WildBody; + wild_body_1: WildBody; + wild_body_2: WildBody; + wild_body_3: WildBody; + Wild_Dealmaker_body: WildBody; + wild_security_body_1: WildBody; + wild_security_body_2: WildBody; + wild_Killa_body: WildBody; + wild_pmcBot_body: WildBody; + wild_Shturman_body: WildBody; + wild_Gluhar_body: WildBody; + Tshirt_security_TshirtTatu_01: WildBody; + Tshirt_security_TshirtTatu_02: WildBody; + Top_security_Husky: WildBody; + Top_security_Gorka4: WildBody; + scav_kit_upper_meteor: WildBody; + wild_body_russia1: WildBody; + Top_BOSS_Sanitar: WildBody; + wild_body_motocross: WildBody; + top_cultist_01: WildBody; + top_cultist_02: WildBody; + wild_body_rainparka: WildBody; + wild_body_underarmour: WildBody; + top_boss_tagilla: WildBody; + DefaultUsecBody: WildBody; + usec_upper_acu: WildBody; + usec_upper_commando: WildBody; + usec_upper_aggressor: WildBody; + usec_upper_hoody: WildBody; + usec_upper_pcuironsight: WildBody; + usec_top_beltstaff: WildBody; + usec_upper_flexion: WildBody; + usec_upper_tier3: WildBody; + usec_upper_pcsmulticam: WildBody; + usec_upper_tier_2: WildBody; + usec_upper_infiltrator: WildBody; + user_upper_NightPatrol: WildBody; + wild_body_bomber: WildBody; + wild_top_yellowcoat: WildBody; +} +export interface WildBody { + body: string; + hands: string; + isNotRandom: boolean; +} +export interface SavageFeet { + wild_feet: WildFeet; + wild_feet_1: WildFeet; + wild_feet_2: WildFeet; + Wild_Dealmaker_feet: WildFeet; + wild_security_feet_1: WildFeet; + Wild_Killa_feet: WildFeet; + wild_pmcBot_feet: WildFeet; + Pants_BOSS_Glukhar: WildFeet; + Pants_BOSS_Shturman: WildFeet; + Pants_security_Gorka4: WildFeet; + Pants_security_Flora: WildFeet; + scav_kit_lower_sklon: WildFeet; + Pants_BOSS_Sanitar: WildFeet; + wild_feet_sweatpants: WildFeet; + wild_feet_wasatch: WildFeet; + wild_feet_slimPants: WildFeet; + pants_cultist_01: WildFeet; + pants_cultist_02: WildFeet; + wild_feet_scavelite_taclite: WildFeet; + pants_boss_tagilla: WildFeet; + wild_feet_bomber: WildFeet; + wild_pants_yellowcoat: WildFeet; +} +export interface WildFeet { + feet: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface CustomizationVoice { + voice: string; + side: string[]; + isNotRandom: boolean; +} +export interface BodyParts { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface ArmorMaterials { + UHMWPE: ArmorType; + Aramid: ArmorType; + Combined: ArmorType; + Titan: ArmorType; + Aluminium: ArmorType; + ArmoredSteel: ArmorType; + Ceramic: ArmorType; + Glass: ArmorType; +} +export interface ArmorType { + Destructibility: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + ExplosionDestructibility: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; +} +export interface Health { + Falling: Falling; + Effects: Effects; + HealPrice: HealPrice; + ProfileHealthSettings: ProfileHealthSettings; +} +export interface Falling { + DamagePerMeter: number; + SafeHeight: number; +} +export interface Effects { + Existence: Existence; + Dehydration: Dehydration; + BreakPart: BreakPart; + Contusion: Contusion; + Disorientation: Disorientation; + Exhaustion: Exhaustion; + LowEdgeHealth: LowEdgeHealth; + RadExposure: RadExposure; + Stun: Stun; + Intoxication: Intoxication; + Regeneration: Regeneration; + Wound: Wound; + Berserk: Berserk; + Flash: Flash; + MedEffect: MedEffect; + Pain: Pain; + PainKiller: PainKiller; + SandingScreen: SandingScreen; + Stimulator: Stimulator; + Tremor: Tremor; + ChronicStaminaFatigue: ChronicStaminaFatigue; + Fracture: Fracture2; + HeavyBleeding: HeavyBleeding2; + LightBleeding: LightBleeding2; + BodyTemperature: BodyTemperature; +} +export interface Existence { + EnergyLoopTime: number; + HydrationLoopTime: number; + EnergyDamage: number; + HydrationDamage: number; + DestroyedStomachEnergyTimeFactor: number; + DestroyedStomachHydrationTimeFactor: number; +} +export interface Dehydration { + DefaultDelay: number; + DefaultResidueTime: number; + BleedingHealth: number; + BleedingLoopTime: number; + BleedingLifeTime: number; + DamageOnStrongDehydration: number; + StrongDehydrationLoopTime: number; +} +export interface BreakPart { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface Contusion { + Dummy: number; +} +export interface Disorientation { + Dummy: number; +} +export interface Exhaustion { + DefaultDelay: number; + DefaultResidueTime: number; + Damage: number; + DamageLoopTime: number; +} +export interface LowEdgeHealth { + DefaultDelay: number; + DefaultResidueTime: number; + StartCommonHealth: number; +} +export interface RadExposure { + Damage: number; + DamageLoopTime: number; +} +export interface Stun { + Dummy: number; +} +export interface Intoxication { + DefaultDelay: number; + DefaultResidueTime: number; + DamageHealth: number; + HealthLoopTime: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovedAfterDeath: boolean; + HealExperience: number; + RemovePrice: number; +} +export interface Regeneration { + LoopTime: number; + MinimumHealthPercentage: number; + Energy: number; + Hydration: number; + BodyHealth: BodyHealth; + Influences: Influences; +} +export interface BodyHealth { + Head: BodyHealthValue; + Chest: BodyHealthValue; + Stomach: BodyHealthValue; + LeftArm: BodyHealthValue; + RightArm: BodyHealthValue; + LeftLeg: BodyHealthValue; + RightLeg: BodyHealthValue; +} +export interface BodyHealthValue { + Value: number; +} +export interface Influences { + LightBleeding: Influence; + HeavyBleeding: Influence; + Fracture: Influence; + RadExposure: Influence; + Intoxication: Influence; +} +export interface Influence { + HealthSlowDownPercentage: number; + EnergySlowDownPercentage: number; + HydrationSlowDownPercentage: number; +} +export interface Wound { + WorkingTime: number; + ThresholdMin: number; + ThresholdMax: number; +} +export interface Berserk { + DefaultDelay: number; + WorkingTime: number; + DefaultResidueTime: number; +} +export interface Flash { + Dummy: number; +} +export interface MedEffect { + LoopTime: number; + StartDelay: number; + DrinkStartDelay: number; + FoodStartDelay: number; + DrugsStartDelay: number; + MedKitStartDelay: number; + MedicalStartDelay: number; + StimulatorStartDelay: number; +} +export interface Pain { + TremorDelay: number; + HealExperience: number; +} +export interface PainKiller { + Dummy: number; +} +export interface SandingScreen { + Dummy: number; +} +export interface Stimulator { + BuffLoopTime: number; + Buffs: Buffs; +} +export interface Buffs { + BuffsSJ1TGLabs: Buff[]; + BuffsSJ6TGLabs: Buff[]; + BuffsPropital: Buff[]; + BuffsZagustin: Buff[]; + BuffseTGchange: Buff[]; + BuffsAdrenaline: Buff[]; + BuffsGoldenStarBalm: Buff[]; + Buffs_drink_aquamari: Buff[]; + Buffs_drink_maxenergy: Buff[]; + Buffs_drink_milk: Buff[]; + Buffs_drink_tarcola: Buff[]; + Buffs_drink_hotrod: Buff[]; + Buffs_drink_juice_army: Buff[]; + Buffs_drink_water: Buff[]; + Buffs_food_borodinskiye: Buff[]; + Buffs_food_condensed_milk: Buff[]; + Buffs_food_emelya: Buff[]; + Buffs_food_mayonez: Buff[]; + Buffs_food_mre: Buff[]; + Buffs_food_sugar: Buff[]; + Buffs_drink_vodka: Buff[]; + Buffs_drink_jack: Buff[]; + Buffs_drink_moonshine: Buff[]; + Buffs_drink_purewater: Buff[]; + Buffs_3bTG: Buff[]; + Buffs_AHF1M: Buff[]; + Buffs_L1: Buff[]; + Buffs_MULE: Buff[]; + Buffs_Meldonin: Buff[]; + Buffs_Obdolbos: Buff[]; + Buffs_P22: Buff[]; + Buffs_KultistsToxin: Buff[]; + Buffs_BodyTemperature: Buff[]; + Buffs_Antidote: Buff[]; + Buffs_melee_bleed: Buff[]; + Buffs_melee_blunt: Buff[]; + Buffs_hultafors: Buff[]; + Buffs_drink_vodka_BAD: Buff[]; + Buffs_food_alyonka: Buff[]; + Buffs_food_slippers: Buff[]; + Buffs_knife: Buff[]; +} +export interface Buff { + BuffType: string; + Chance: number; + Delay: number; + Duration: number; + Value: number; + AbsoluteValue: boolean; + SkillName: string; +} +export interface Tremor { + DefaultDelay: number; + DefaultResidueTime: number; +} +export interface ChronicStaminaFatigue { + EnergyRate: number; + WorkingTime: number; + TicksEvery: number; + EnergyRatePerStack: number; +} +export interface Fracture2 { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface HeavyBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface Probability { + FunctionType: string; + K: number; + B: number; + Threshold: number; +} +export interface LightBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface BodyTemperature { + DefaultBuildUpTime: number; + DefaultResidueTime: number; + LoopTime: number; +} +export interface HealPrice { + HealthPointPrice: number; + HydrationPointPrice: number; + EnergyPointPrice: number; + TrialLevels: number; + TrialRaids: number; +} +export interface ProfileHealthSettings { + BodyPartsSettings: BodyPartsSettings; + HealthFactorsSettings: HealthFactorsSettings; +} +export interface BodyPartsSettings { + Head: BodyPartsSetting; + Chest: BodyPartsSetting; + Stomach: BodyPartsSetting; + LeftArm: BodyPartsSetting; + RightArm: BodyPartsSetting; + LeftLeg: BodyPartsSetting; + RightLeg: BodyPartsSetting; +} +export interface BodyPartsSetting { + Minimum: number; + Maximum: number; + Default: number; + OverDamageReceivedMultiplier: number; +} +export interface HealthFactorsSettings { + Energy: HealthFactorSetting; + Hydration: HealthFactorSetting; + Temperature: HealthFactorSetting; + Poisoning: HealthFactorSetting; + Radiation: HealthFactorSetting; +} +export interface HealthFactorSetting { + Minimum: number; + Maximum: number; + Default: number; +} +export interface Rating { + levelRequired: number; + limit: number; + categories: Categories; +} +export interface Categories { + experience: boolean; + kd: boolean; + surviveRatio: boolean; + avgEarnings: boolean; + kills: boolean; + raidCount: boolean; + longestShot: boolean; + timeOnline: boolean; + inventoryFullCost: boolean; + ragFairStanding: boolean; +} +export interface Tournament { + categories: Categories2; + limit: number; + levelRequired: number; +} +export interface Categories2 { + dogtags: boolean; +} +export interface RagFair { + enabled: boolean; + priceStabilizerEnabled: boolean; + includePveTraderSales: boolean; + priceStabilizerStartIntervalInHours: number; + minUserLevel: number; + communityTax: number; + communityItemTax: number; + communityRequirementTax: number; + offerPriorityCost: number; + offerDurationTimeInHour: number; + offerDurationTimeInHourAfterRemove: number; + priorityTimeModifier: number; + maxRenewOfferTimeInHour: number; + renewPricePerHour: number; + maxActiveOfferCount: MaxActiveOfferCount[]; + balancerRemovePriceCoefficient: number; + balancerMinPriceCount: number; + balancerAveragePriceCoefficient: number; + delaySinceOfferAdd: number; + uniqueBuyerTimeoutInDays: number; + ratingSumForIncrease: number; + ratingIncreaseCount: number; + ratingSumForDecrease: number; + ratingDecreaseCount: number; + maxSumForIncreaseRatingPerOneSale: number; + maxSumForDecreaseRatingPerOneSale: number; + maxSumForRarity: MaxSumForRarity; + ChangePriceCoef: number; + balancerUserItemSaleCooldownEnabled: boolean; + balancerUserItemSaleCooldown: number; + youSellOfferMaxStorageTimeInHour: number; + yourOfferDidNotSellMaxStorageTimeInHour: number; + isOnlyFoundInRaidAllowed: boolean; + sellInOnePiece: number; +} +export interface MaxActiveOfferCount { + from: number; + to: number; + count: number; +} +export interface MaxSumForRarity { + Common: RarityMaxSum; + Rare: RarityMaxSum; + Superrare: RarityMaxSum; + Not_exist: RarityMaxSum; +} +export interface RarityMaxSum { + value: number; +} +export interface Handbook { + defaultCategory: string; +} +export interface Stamina { + Capacity: number; + SprintDrainRate: number; + BaseRestorationRate: number; + JumpConsumption: number; + GrenadeHighThrow: number; + GrenadeLowThrow: number; + AimDrainRate: number; + AimRangeFinderDrainRate: number; + OxygenCapacity: number; + OxygenRestoration: number; + WalkOverweightLimits: xyz; + BaseOverweightLimits: xyz; + SprintOverweightLimits: xyz; + WalkSpeedOverweightLimits: xyz; + CrouchConsumption: xyz; + WalkConsumption: xyz; + StandupConsumption: xyz; + TransitionSpeed: xyz; + SprintAccelerationLowerLimit: number; + SprintSpeedLowerLimit: number; + SprintSensitivityLowerLimit: number; + AimConsumptionByPose: xyz; + RestorationMultiplierByPose: xyz; + OverweightConsumptionByPose: xyz; + AimingSpeedMultiplier: number; + WalkVisualEffectMultiplier: number; + HandsCapacity: number; + HandsRestoration: number; + ProneConsumption: number; + BaseHoldBreathConsumption: number; + SoundRadius: xyz; + ExhaustedMeleeSpeed: number; + FatigueRestorationRate: number; + FatigueAmountToCreateEffect: number; + ExhaustedMeleeDamageMultiplier: number; + FallDamageMultiplier: number; + SafeHeightOverweight: number; + SitToStandConsumption: number; + StaminaExhaustionCausesJiggle: boolean; + StaminaExhaustionStartsBreathSound: boolean; + StaminaExhaustionRocksCamera: boolean; + HoldBreathStaminaMultiplier: xyz; + PoseLevelIncreaseSpeed: xyz; + PoseLevelDecreaseSpeed: xyz; + PoseLevelConsumptionPerNotch: xyz; +} +export interface StaminaRestoration { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface StaminaDrain { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface RequirementReferences { + Alpinist: Alpinist[]; +} +export interface Alpinist { + Requirement: string; + Id: string; + Count: number; + RequiredSlot: string; + RequirementTip: string; +} +export interface RestrictionsInRaid { + TemplateId: string; + Value: number; +} +export interface Insurance { + MaxStorageTimeInHour: number; +} +export interface SkillsSettings { + SkillProgressRate: number; + WeaponSkillProgressRate: number; + WeaponSkillRecoilBonusPerLevel: number; + HideoutManagement: HideoutManagement; + Crafting: Crafting; + Metabolism: Metabolism; + Immunity: Immunity; + Endurance: Endurance; + Strength: Strength; + Vitality: Vitality; + Health: Health2; + StressResistance: StressResistance; + Throwing: Throwing; + RecoilControl: RecoilControl; + Pistol: WeaponSkills; + Revolver: WeaponSkills; + SMG: any[]; + Assault: WeaponSkills; + Shotgun: WeaponSkills; + Sniper: WeaponSkills; + LMG: any[]; + HMG: any[]; + Launcher: any[]; + AttachedLauncher: any[]; + Melee: any[]; + DMR: WeaponSkills; + BearAssaultoperations: any[]; + BearAuthority: any[]; + BearAksystems: any[]; + BearHeavycaliber: any[]; + BearRawpower: any[]; + UsecArsystems: any[]; + UsecDeepweaponmodding_Settings: any[]; + UsecLongrangeoptics_Settings: any[]; + UsecNegotiations: any[]; + UsecTactics: any[]; + BotReload: any[]; + CovertMovement: CovertMovement; + FieldMedicine: any[]; + Search: Search; + Sniping: any[]; + ProneMovement: any[]; + FirstAid: any[]; + LightVests: ArmorSkills; + HeavyVests: ArmorSkills; + WeaponModding: any[]; + AdvancedModding: any[]; + NightOps: any[]; + SilentOps: any[]; + Lockpicking: any[]; + WeaponTreatment: WeaponTreatment; + MagDrills: MagDrills; + Freetrading: any[]; + Auctions: any[]; + Cleanoperations: any[]; + Barter: any[]; + Shadowconnections: any[]; + Taskperformance: any[]; + Perception: Perception; + Intellect: Intellect; + Attention: Attention; + Charisma: Charisma; + Memory: Memory; + Surgery: Surgery; + AimDrills: AimDrills; + BotSound: any[]; + TroubleShooting: TroubleShooting; +} +export interface ArmorSkills { + WearAmountRepairLVestsReducePerLevel: number; + WearChanceRepairLVestsReduceEliteLevel: number; +} +export interface HideoutManagement { + SkillPointsPerAreaUpgrade: number; + SkillPointsPerCraft: number; + ConsumptionReductionPerLevel: number; + SkillBoostPercent: number; + SkillPointsRate: SkillPointsRate; + EliteSlots: EliteSlots; +} +export interface SkillPointsRate { + Generator: Generator; + AirFilteringUnit: SkillPointRate; + WaterCollector: SkillPointRate; + SolarPower: SkillPointRate; +} +export interface SkillPointRate { + ResourceSpent: number; + PointsGained: number; +} +export interface EliteSlots { + Generator: EliteSlot; + AirFilteringUnit: EliteSlot; + WaterCollector: EliteSlot; + BitcoinFarm: EliteSlot; +} +export interface EliteSlot { + Slots: number; + Container: number; +} +export interface Crafting { + PointsPerCraftingCycle: number; + CraftingCycleHours: number; + PointsPerUniqueCraftCycle: number; + UniqueCraftsPerCycle: number; + CraftTimeReductionPerLevel: number; + ProductionTimeReductionPerLevel: number; + EliteExtraProductions: number; + CraftingPointsToInteligence: number; +} +export interface Metabolism { + HydrationRecoveryRate: number; + EnergyRecoveryRate: number; + IncreasePositiveEffectDurationRate: number; + DecreaseNegativeEffectDurationRate: number; + DecreasePoisonDurationRate: number; +} +export interface Immunity { + ImmunityMiscEffects: number; + ImmunityPoisonBuff: number; + ImmunityPainKiller: number; + HealthNegativeEffect: number; + StimulatorNegativeBuff: number; +} +export interface Endurance { + MovementAction: number; + SprintAction: number; + GainPerFatigueStack: number; +} +export interface Strength { + SprintActionMin: number; + SprintActionMax: number; + MovementActionMin: number; + MovementActionMax: number; + PushUpMin: number; + PushUpMax: number; + FistfightAction: number; + ThrowAction: number; +} +export interface Vitality { + DamageTakenAction: number; + HealthNegativeEffect: number; +} +export interface Health2 { + SkillProgress: number; +} +export interface StressResistance { + HealthNegativeEffect: number; + LowHPDuration: number; +} +export interface Throwing { + ThrowAction: number; +} +export interface RecoilControl { + RecoilAction: number; + RecoilBonusPerLevel: number; +} +export interface WeaponSkills { + WeaponReloadAction: number; + WeaponShotAction: number; + WeaponFixAction: number; + WeaponChamberAction: number; +} +export interface CovertMovement { + MovementAction: number; +} +export interface Search { + SearchAction: number; + FindAction: number; +} +export interface WeaponTreatment { + DurLossReducePerLevel: number; + SkillPointsPerRepair: number; + Filter: any[]; + WearAmountRepairGunsReducePerLevel: number; + WearChanceRepairGunsReduceEliteLevel: number; +} +export interface MagDrills { + RaidLoadedAmmoAction: number; + RaidUnloadedAmmoAction: number; + MagazineCheckAction: number; +} +export interface Perception { + OnlineAction: number; + UniqueLoot: number; +} +export interface Intellect { + ExamineAction: number; + SkillProgress: number; + RepairAction: number; + WearAmountReducePerLevel: number; + WearChanceReduceEliteLevel: number; + RepairPointsCostReduction: number; +} +export interface Attention { + ExamineWithInstruction: number; + FindActionFalse: number; + FindActionTrue: number; +} +export interface Charisma { + SkillProgressInt: number; + SkillProgressAtn: number; + SkillProgressPer: number; +} +export interface Memory { + AnySkillUp: number; + SkillProgress: number; +} +export interface Surgery { + SurgeryAction: number; + SkillProgress: number; +} +export interface AimDrills { + WeaponShotAction: number; +} +export interface TroubleShooting { + MalfRepairSpeedBonusPerLevel: number; + SkillPointsPerMalfFix: number; + EliteDurabilityChanceReduceMult: number; + EliteAmmoChanceReduceMult: number; + EliteMagChanceReduceMult: number; +} +export interface Aiming { + ProceduralIntensityByPose: xyz; + AimProceduralIntensity: number; + HeavyWeight: number; + LightWeight: number; + MaxTimeHeavy: number; + MinTimeHeavy: number; + MaxTimeLight: number; + MinTimeLight: number; + RecoilScaling: number; + RecoilDamping: number; + CameraSnapGlobalMult: number; + RecoilXIntensityByPose: xyz; + RecoilYIntensityByPose: xyz; + RecoilZIntensityByPose: xyz; + RecoilCrank: boolean; + RecoilHandDamping: number; + RecoilConvergenceMult: number; + RecoilVertBonus: number; + RecoilBackBonus: number; +} +export interface Malfunction { + AmmoMalfChanceMult: number; + MagazineMalfChanceMult: number; + MalfRepairHardSlideMult: number; + MalfRepairOneHandBrokenMult: number; + MalfRepairTwoHandsBrokenMult: number; + AllowMalfForBots: boolean; + ShowGlowAttemptsCount: number; + OutToIdleSpeedMultForPistol: number; + IdleToOutSpeedMultOnMalf: number; + TimeToQuickdrawPistol: number; + DurRangeToIgnoreMalfs: xyz; + DurFeedWt: number; + DurMisfireWt: number; + DurJamWt: number; + DurSoftSlideWt: number; + DurHardSlideMinWt: number; + DurHardSlideMaxWt: number; + AmmoMisfireWt: number; + AmmoFeedWt: number; + AmmoJamWt: number; + OverheatFeedWt: number; + OverheatJamWt: number; + OverheatSoftSlideWt: number; + OverheatHardSlideMinWt: number; + OverheatHardSlideMaxWt: number; +} +export interface Overheat { + MinOverheat: number; + MaxOverheat: number; + OverheatProblemsStart: number; + ModHeatFactor: number; + ModCoolFactor: number; + MinWearOnOverheat: number; + MaxWearOnOverheat: number; + MinWearOnMaxOverheat: number; + MaxWearOnMaxOverheat: number; + OverheatWearLimit: number; + MaxCOIIncreaseMult: number; + MinMalfChance: number; + MaxMalfChance: number; + DurReduceMinMult: number; + DurReduceMaxMult: number; + BarrelMoveRndDuration: number; + BarrelMoveMaxMult: number; + FireratePitchMult: number; + FirerateReduceMinMult: number; + FirerateReduceMaxMult: number; + FirerateOverheatBorder: number; + EnableSlideOnMaxOverheat: boolean; + StartSlideOverheat: number; + FixSlideOverheat: number; + AutoshotMinOverheat: number; + AutoshotChance: number; + AutoshotPossibilityDuration: number; + MaxOverheatCoolCoef: number; +} +export interface FenceSettings { + FenceId: string; + Levels: Record; + paidExitStandingNumerator: number; +} +export interface FenceLevel { + SavageCooldownModifier: number; + ScavCaseTimeModifier: number; + PaidExitCostModifier: number; + BotFollowChance: number; + ScavEquipmentSpawnChanceModifier: number; + PriceModifier: number; + HostileBosses: boolean; + HostileScavs: boolean; + ScavAttackSupport: boolean; + ExfiltrationPriceModifier: number; + AvailableExits: number; +} +export interface Inertia { + InertiaLimits: xyz; + InertiaLimitsStep: number; + ExitMovementStateSpeedThreshold: xyz; + WalkInertia: xyz; + FallThreshold: number; + SpeedLimitAfterFallMin: xyz; + SpeedLimitAfterFallMax: xyz; + SpeedLimitDurationMin: xyz; + SpeedLimitDurationMax: xyz; + SpeedInertiaAfterJump: xyz; + BaseJumpPenaltyDuration: number; + DurationPower: number; + BaseJumpPenalty: number; + PenaltyPower: number; + InertiaTiltCurveMin: xyz; + InertiaTiltCurveMax: xyz; + InertiaBackwardCoef: xyz; + TiltInertiaMaxSpeed: xyz; + TiltStartSideBackSpeed: xyz; + TiltMaxSideBackSpeed: xyz; + TiltAcceleration: xyz; + AverageRotationFrameSpan: number; + SprintSpeedInertiaCurveMin: xyz; + SprintSpeedInertiaCurveMax: xyz; + SprintBrakeInertia: xyz; + SprintTransitionMotionPreservation: xyz; + WeaponFlipSpeed: xyz; + PreSprintAccelerationLimits: xyz; + SprintAccelerationLimits: xyz; + SideTime: xyz; + DiagonalTime: xyz; + MinDirectionBlendTime: number; + MoveTime: number; + MinMovementAccelerationRangeRight: xyz; + MaxMovementAccelerationRangeRight: xyz; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Ballistic { + GlobalDamageDegradationCoefficient: number; +} +export interface RepairKitSettings { + armorClassDivisor: number; + durabilityPointCostArmor: number; + durabilityPointCostGuns: number; +} +export interface BotPreset { + UseThis: boolean; + Role: string; + BotDifficulty: string; + VisibleAngle: number; + VisibleDistance: number; + ScatteringPerMeter: number; + HearingSense: number; + SCATTERING_DIST_MODIF: number; + MAX_AIMING_UPGRADE_BY_TIME: number; + FIRST_CONTACT_ADD_SEC: number; + COEF_IF_MOVE: number; +} +export interface BotWeaponScattering { + Name: string; + PriorityScatter1meter: number; + PriorityScatter10meter: number; + PriorityScatter100meter: number; +} +export interface Preset { + _id: string; + _type: string; + _changeWeaponName: boolean; + _name: string; + _parent: string; + _items: Item[]; + _encyclopedia?: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocation.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocation.d.ts new file mode 100644 index 0000000..42fac06 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocation.d.ts @@ -0,0 +1,6 @@ +import { ILocationBase } from "./ILocationBase"; +import { ILooseLoot } from "./ILooseLoot"; +export interface ILocation { + base: ILocationBase; + looseLoot: ILooseLoot; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocationBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocationBase.d.ts new file mode 100644 index 0000000..ad48d32 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocationBase.d.ts @@ -0,0 +1,198 @@ +export interface ILocationBase { + AccessKeys: string[]; + AirdropParameters: AirdropParameter[]; + Area: number; + AveragePlayTime: number; + AveragePlayerLevel: number; + Banners: Banner[]; + BossLocationSpawn: BossLocationSpawn[]; + BotAssault: number; + BotEasy: number; + BotHard: number; + BotImpossible: number; + BotLocationModifier: BotLocationModifier; + BotMarksman: number; + BotMax: number; + BotMaxPlayer: number; + BotMaxTimePlayer: number; + BotNormal: number; + BotSpawnTimeOffMax: number; + BotSpawnTimeOffMin: number; + BotSpawnTimeOnMax: number; + BotSpawnTimeOnMin: number; + BotStart: number; + BotStop: number; + Description: string; + DisabledForScav: boolean; + DisabledScavExits: string; + Enabled: boolean; + GlobalLootChanceModifier: number; + IconX: number; + IconY: number; + Id: string; + Insurance: boolean; + IsSecret: boolean; + Locked: boolean; + Loot: any[]; + MaxBotPerZone: number; + MaxDistToFreePoint: number; + MaxPlayers: number; + MinDistToExitPoint: number; + MinDistToFreePoint: number; + MinMaxBots: MinMaxBot[]; + MinPlayers: number; + Name: string; + NewSpawn: boolean; + OcculsionCullingEnabled: boolean; + OldSpawn: boolean; + OpenZones: string; + Preview: Preview; + RequiredPlayerLevel: number; + Rules: string; + SafeLocation: boolean; + Scene: Scene; + SpawnPointParams: SpawnPointParam[]; + UnixDateTime: number; + _Id: string; + doors: any[]; + escape_time_limit: number; + exit_access_time: number; + exit_count: number; + exit_time: number; + exits: Exit[]; + filter_ex: string[]; + limits: ILimit[]; + matching_min_seconds: number; + maxItemCountInLocation: MaxItemCountInLocation[]; + sav_summon_seconds: number; + tmp_location_field_remove_me: number; + users_gather_seconds: number; + users_spawn_seconds_n: number; + users_spawn_seconds_n2: number; + users_summon_seconds: number; + waves: Wave[]; +} +export interface ILimit { + min: number; + max: number; + items: any[]; +} +export interface AirdropParameter { + AirdropPointDeactivateDistance: number; + MinPlayersCountToSpawnAirdrop: number; + PlaneAirdropChance: number; + PlaneAirdropCooldownMax: number; + PlaneAirdropCooldownMin: number; + PlaneAirdropEnd: number; + PlaneAirdropMax: number; + PlaneAirdropStartMax: number; + PlaneAirdropStartMin: number; + UnsuccessfulTryPenalty: number; +} +export interface Banner { + id: string; + pic: Pic; +} +export interface Pic { + path: string; + rcid: string; +} +export interface BossLocationSpawn { + BossChance: number; + BossDifficult: string; + BossEscortAmount: string; + BossEscortDifficult: string; + BossEscortType: string; + BossName: string; + BossPlayer: boolean; + BossZone: string; + Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; +} +export interface BossSupport { + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; +} +export interface BotLocationModifier { + AccuracySpeed: number; + DistToActivate: number; + DistToPersueAxemanCoef: number; + DistToSleep: number; + GainSight: number; + KhorovodChance: number; + MagnetPower: number; + MarksmanAccuratyCoef: number; + Scattering: number; + VisibleDistance: number; +} +export interface MinMaxBot { + WildSpawnType: string; + max: number; + min: number; +} +export interface Preview { + path: string; + rcid: string; +} +export interface Scene { + path: string; + rcid: string; +} +export interface SpawnPointParam { + BotZoneName: string; + Categories: string[]; + ColliderParams: ColliderParams; + DelayToCanSpawnSec: number; + Id: string; + Infiltration: string; + Position: xyz; + Rotation: number; + Sides: string[]; +} +export interface ColliderParams { + _parent: string; + _props: Props; +} +export interface Props { + Center: xyz; + Radius: number; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Exit { + Chance: number; + Count: number; + EntryPoints: string; + ExfiltrationTime: number; + ExfiltrationType: string; + Id: string; + MaxTime: number; + MinTime: number; + Name: string; + PassageRequirement: string; + PlayersCount: number; + RequirementTip: string; +} +export interface MaxItemCountInLocation { + TemplateId: string; + Value: number; +} +export interface Wave { + BotPreset: string; + BotSide: string; + SpawnPoints: string; + WildSpawnType: string; + isPlayers: boolean; + number: number; + slots_max: number; + slots_min: number; + time_max: number; + time_min: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts new file mode 100644 index 0000000..7f8d915 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts @@ -0,0 +1,9 @@ +import { ILocations } from "../../spt/server/ILocations"; +export interface ILocationsGenerateAllResponse { + locations: ILocations; + paths: Path[]; +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILooseLoot.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILooseLoot.d.ts new file mode 100644 index 0000000..14b795e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/ILooseLoot.d.ts @@ -0,0 +1,45 @@ +export interface ILooseLoot { + spawnpointCount: SpawnpointCount; + spawnpointsForced: SpawnpointsForced[]; + spawnpoints: Spawnpoint[]; +} +export interface SpawnpointCount { + mean: number; + std: number; +} +export interface SpawnpointsForced { + locationId: string; + probability: number; + template: SpawnpointTemplate; +} +export interface SpawnpointTemplate { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: Item[]; +} +export interface Item { + _id: string; + _tpl?: string; +} +export interface Spawnpoint { + locationId: string; + probability: number; + template: SpawnpointTemplate; + itemDistribution: ItemDistribution[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IMetricsTableData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IMetricsTableData.d.ts new file mode 100644 index 0000000..873ef82 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IMetricsTableData.d.ts @@ -0,0 +1,7 @@ +export interface IMetricsTableData { + Keys: number[]; + NetProcessingBins: number[]; + RenderBins: number[]; + GameUpdateBins: number[]; + MemoryMeasureInterval: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IPmcData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IPmcData.d.ts new file mode 100644 index 0000000..adc2aa5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/IPmcData.d.ts @@ -0,0 +1,341 @@ +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +import { IPmcDataRepeatableQuest } from "./tables/IRepeatableQuests"; +import { Item, Upd } from "./tables/IItem"; +import { HideoutAreas } from "../../enums/HideoutAreas"; +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IPmcData { + _id: string; + aid: string; + savage: string; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: Record; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: InsuredItem[]; + Hideout: Hideout; + Bonuses: Bonus[]; + Notes: Notes; + Quests: Quest[]; + TradersInfo: Record; + RagfairInfo: RagfairInfo; + WishList: string[]; + RepeatableQuests: IPmcDataRepeatableQuest[]; + CarExtractCounts: CarExtractCounts; + SurvivorClass: SurvivorClass; +} +export declare enum SurvivorClass { + Unknown = 0, + Neutralizer = 1, + Marauder = 2, + Paramedic = 3, + Survivor = 4 +} +export interface Info { + EntryPoint: string; + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: MemberCategory; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + IsStreamerModeAvailable: boolean; + Bans: IBan[]; + BannedState: boolean; + BannedUntil: number; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface IBan { + type: BanType; + dateTime: number; +} +export declare enum BanType { + Chat = 0, + RagFair = 1, + Voip = 2, + Trading = 3, + Online = 4, + Friends = 5, + ChangeNickname = 6 +} +export interface Notes { + Notes: Note[]; +} +export interface Note { + Time: number; + Text: string; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { + Hydration: CurrentMax; + Energy: CurrentMax; + Temperature: CurrentMax; + BodyParts: BodyPartsHealth; + UpdateTime: number; +} +export interface BodyPartsHealth { + Head: BodyPartHealth; + Chest: BodyPartHealth; + Stomach: BodyPartHealth; + LeftArm: BodyPartHealth; + RightArm: BodyPartHealth; + LeftLeg: BodyPartHealth; + RightLeg: BodyPartHealth; +} +export interface BodyPartHealth { + Health: CurrentMax; + Effects?: Record; +} +export interface CurrentMax { + Current: number; + Maximum: number; +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: Common[]; + Mastering: Mastering[]; + Bonuses?: any[]; + Points: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession: number; + LastAccess: number; +} +export interface Mastering { + Id: string; + Progress: number; +} +export interface Stats { + CarriedQuestItems: string[]; + Victims: Victim[]; + TotalSessionExperience: number; + LastSessionDate: number; + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; + SessionExperienceMult?: number; + ExperienceBonusMult?: number; + Aggressor?: Aggressor; + DroppedItems?: IDroppedItem[]; + FoundInRaidItems?: FoundInRaidItem[]; + DamageHistory?: DamageHistory; + DeathCause?: DeathCause; + LastPlayerState?: LastPlayerState; + TotalInGameTime: number; + SurvivorClass?: string; +} +export interface IDroppedItem { + QuestId: string; + ItemId: string; + ZoneId: string; +} +export interface FoundInRaidItem { + QuestId: string; + ItemId: string; +} +export interface Victim { + AccountId: string; + ProfileId: string; + Name: string; + Side: string; + BodyPart: string; + Time: string; + Distance: number; + Level: number; + Weapon: string; + Role: string; +} +export interface SessionCounters { + Items: CounterKeyValue[]; +} +export interface OverallCounters { + Items: CounterKeyValue[]; +} +export interface CounterKeyValue { + Key: string[]; + Value: number; +} +export interface Aggressor { + AccountId: string; + ProfileId: string; + MainProfileNickname: string; + Name: string; + Side: string; + BodyPart: string; + HeadSegment: string; + WeaponName: string; + Category: string; +} +export interface DamageHistory { + LethalDamagePart: string; + LethalDamage: LethalDamage; + BodyParts: BodyPartsDamageHistory; +} +export interface LethalDamage { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface BodyPartsDamageHistory { + Head: DamageStats[]; + Chest: DamageStats[]; + Stomach: DamageStats[]; + LeftArm: DamageStats[]; + RightArm: DamageStats[]; + LeftLeg: DamageStats[]; + RightLeg: DamageStats[]; + Common: DamageStats[]; +} +export interface DamageStats { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface DeathCause { + DamageType: string; + Side: string; + Role: string; + WeaponId: string; +} +export interface LastPlayerState { + Info: LastPlayerStateInfo; + Customization: Record; + Equipment: any; +} +export interface LastPlayerStateInfo { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; +} +export interface ConditionCounters { + Counters: Counter[]; +} +export interface Counter { + id: string; + value: number; + qid: string; +} +export interface BackendCounter { + id: string; + qid?: string; + value: number; +} +export interface InsuredItem { + tid: string; + itemId: string; +} +export interface Hideout { + Production: Record; + Areas: HideoutArea[]; +} +export interface Productive { + Products: Product[]; + Progress?: number; + inProgress?: boolean; + StartTimestamp?: number; +} +export interface Product { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface ScavCase extends Productive { +} +export interface Production extends Productive { + RecipeId: string; + SkipTime: number; + ProductionTime: number; +} +export interface HideoutArea { + type: HideoutAreas; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: HideoutSlot[]; + lastRecipe: string; +} +export interface HideoutSlot { + item: HideoutItem[]; +} +export interface HideoutItem { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface Bonus { + type: string; + templateId?: string; + passive?: boolean; + production?: boolean; + visible?: boolean; + value?: number; + icon?: string; +} +export interface Quest { + qid: string; + startTime: number; + status: string; + statusTimers?: StatusTimer; + completedConditions?: string[]; +} +export interface StatusTimer { + AvailableForStart?: number; +} +export interface TraderInfo { + loyaltyLevel: number; + salesSum: number; + standing: number; + nextResupply: number; + unlocked: boolean; +} +export interface RagfairInfo { + rating: number; + isRatingGrowing: boolean; + offers: IRagfairOffer[]; +} +export interface CarExtractCounts { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/MemberCategory.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts new file mode 100644 index 0000000..7303275 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts @@ -0,0 +1,9 @@ +export interface IBaseInteractionRequestData { + Action: string; + fromOwner?: OwnerInfo; + toOwner?: OwnerInfo; +} +export interface OwnerInfo { + id: string; + type: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotBase.d.ts new file mode 100644 index 0000000..677fd49 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotBase.d.ts @@ -0,0 +1,101 @@ +import { BackendCounter, Bonus } from "../IPmcData"; +import { Item } from "./IItem"; +export interface IBotBase { + _id: string; + aid: string; + savage: any; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: any; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: any[]; + Hideout: Hideout; + Bonuses: Bonus[]; +} +export interface Info { + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: number; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + NeedWipeOptions: any[]; + lastCompletedWipe: any; + BannedState: boolean; + BannedUntil: number; + IsStreamerModeAvailable: boolean; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: any[]; + Mastering: any[]; + Points: number; +} +export interface Stats { + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; +} +export interface SessionCounters { + Items: any[]; +} +export interface OverallCounters { + Items: any[]; +} +export interface ConditionCounters { + Counters: any[]; +} +export interface Hideout { + Production: Production; + Areas: Area[]; +} +export interface Production { +} +export interface Area { + type: number; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: any[]; + lastRecipe: any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotCore.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotCore.d.ts new file mode 100644 index 0000000..16a782d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotCore.d.ts @@ -0,0 +1,133 @@ +export interface IBotCore { + SAVAGE_KILL_DIST: number; + SOUND_DOOR_BREACH_METERS: number; + SOUND_DOOR_OPEN_METERS: number; + STEP_NOISE_DELTA: number; + JUMP_NOISE_DELTA: number; + GUNSHOT_SPREAD: number; + GUNSHOT_SPREAD_SILENCE: number; + BASE_WALK_SPEREAD2: number; + MOVE_SPEED_COEF_MAX: number; + SPEED_SERV_SOUND_COEF_A: number; + SPEED_SERV_SOUND_COEF_B: number; + G: number; + STAY_COEF: number; + SIT_COEF: number; + LAY_COEF: number; + MAX_ITERATIONS: number; + START_DIST_TO_COV: number; + MAX_DIST_TO_COV: number; + STAY_HEIGHT: number; + CLOSE_POINTS: number; + COUNT_TURNS: number; + SIMPLE_POINT_LIFE_TIME_SEC: number; + DANGER_POINT_LIFE_TIME_SEC: number; + DANGER_POWER: number; + COVER_DIST_CLOSE: number; + GOOD_DIST_TO_POINT: number; + COVER_TOOFAR_FROM_BOSS: number; + COVER_TOOFAR_FROM_BOSS_SQRT: number; + MAX_Y_DIFF_TO_PROTECT: number; + FLARE_POWER: number; + MOVE_COEF: number; + PRONE_POSE: number; + LOWER_POSE: number; + MAX_POSE: number; + FLARE_TIME: number; + MAX_REQUESTS__PER_GROUP: number; + UPDATE_GOAL_TIMER_SEC: number; + DIST_NOT_TO_GROUP: number; + DIST_NOT_TO_GROUP_SQR: number; + LAST_SEEN_POS_LIFETIME: number; + DELTA_GRENADE_START_TIME: number; + DELTA_GRENADE_END_TIME: number; + DELTA_GRENADE_RUN_DIST: number; + DELTA_GRENADE_RUN_DIST_SQRT: number; + PATROL_MIN_LIGHT_DIST: number; + HOLD_MIN_LIGHT_DIST: number; + STANDART_BOT_PAUSE_DOOR: number; + ARMOR_CLASS_COEF: number; + SHOTGUN_POWER: number; + RIFLE_POWER: number; + PISTOL_POWER: number; + SMG_POWER: number; + SNIPE_POWER: number; + GESTUS_PERIOD_SEC: number; + GESTUS_AIMING_DELAY: number; + GESTUS_REQUEST_LIFETIME: number; + GESTUS_FIRST_STAGE_MAX_TIME: number; + GESTUS_SECOND_STAGE_MAX_TIME: number; + GESTUS_MAX_ANSWERS: number; + GESTUS_FUCK_TO_SHOOT: number; + GESTUS_DIST_ANSWERS: number; + GESTUS_DIST_ANSWERS_SQRT: number; + GESTUS_ANYWAY_CHANCE: number; + TALK_DELAY: number; + CAN_SHOOT_TO_HEAD: boolean; + CAN_TILT: boolean; + TILT_CHANCE: number; + MIN_BLOCK_DIST: number; + MIN_BLOCK_TIME: number; + COVER_SECONDS_AFTER_LOSE_VISION: number; + MIN_ARG_COEF: number; + MAX_ARG_COEF: number; + DEAD_AGR_DIST: number; + MAX_DANGER_CARE_DIST_SQRT: number; + MAX_DANGER_CARE_DIST: number; + MIN_MAX_PERSON_SEARCH: number; + PERCENT_PERSON_SEARCH: number; + LOOK_ANYSIDE_BY_WALL_SEC_OF_ENEMY: number; + CLOSE_TO_WALL_ROTATE_BY_WALL_SQRT: number; + SHOOT_TO_CHANGE_RND_PART_MIN: number; + SHOOT_TO_CHANGE_RND_PART_MAX: number; + SHOOT_TO_CHANGE_RND_PART_DELTA: number; + FORMUL_COEF_DELTA_DIST: number; + FORMUL_COEF_DELTA_SHOOT: number; + FORMUL_COEF_DELTA_FRIEND_COVER: number; + SUSPETION_POINT_DIST_CHECK: number; + MAX_BASE_REQUESTS_PER_PLAYER: number; + MAX_HOLD_REQUESTS_PER_PLAYER: number; + MAX_GO_TO_REQUESTS_PER_PLAYER: number; + MAX_COME_WITH_ME_REQUESTS_PER_PLAYER: number; + CORE_POINT_MAX_VALUE: number; + CORE_POINTS_MAX: number; + CORE_POINTS_MIN: number; + BORN_POISTS_FREE_ONLY_FAREST_BOT: boolean; + BORN_POINSTS_FREE_ONLY_FAREST_PLAYER: boolean; + SCAV_GROUPS_TOGETHER: boolean; + LAY_DOWN_ANG_SHOOT: number; + HOLD_REQUEST_TIME_SEC: number; + TRIGGERS_DOWN_TO_RUN_WHEN_MOVE: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING_OTHER_ENEMIS: number; + MIN_DIST_TO_STOP_RUN: number; + JUMP_SPREAD_DIST: number; + LOOK_TIMES_TO_KILL: number; + COME_INSIDE_TIMES: number; + TOTAL_TIME_KILL: number; + TOTAL_TIME_KILL_AFTER_WARN: number; + MOVING_AIM_COEF: number; + VERTICAL_DIST_TO_IGNORE_SOUND: number; + DEFENCE_LEVEL_SHIFT: number; + MIN_DIST_CLOSE_DEF: number; + USE_ID_PRIOR_WHO_GO: boolean; + SMOKE_GRENADE_RADIUS_COEF: number; + GRENADE_PRECISION: number; + MAX_WARNS_BEFORE_KILL: number; + CARE_ENEMY_ONLY_TIME: number; + MIDDLE_POINT_COEF: number; + MAIN_TACTIC_ONLY_ATTACK: boolean; + LAST_DAMAGE_ACTIVE: number; + SHALL_DIE_IF_NOT_INITED: boolean; + CHECK_BOT_INIT_TIME_SEC: number; + WEAPON_ROOT_Y_OFFSET: number; + DELTA_SUPRESS_DISTANCE_SQRT: number; + DELTA_SUPRESS_DISTANCE: number; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + WAVE_ONLY_AS_ONLINE: boolean; + LOCAL_BOTS_COUNT: number; + AXE_MAN_KILLS_END: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotType.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotType.d.ts new file mode 100644 index 0000000..01be0be --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IBotType.d.ts @@ -0,0 +1,176 @@ +export interface IBotType { + appearance: Appearance; + chances: Chances; + difficulty: Difficulties; + experience: Experience; + firstName: string[]; + generation: Generation; + health: Health; + inventory: Inventory; + lastName: string[]; + skills: Skills; +} +export interface Appearance { + body: string[]; + feet: string[]; + hands: string[]; + head: string[]; + voice: string[]; +} +export interface Chances { + equipment: EquipmentChances; + mods: ModsChances; +} +export interface EquipmentChances { + ArmBand: number; + ArmorVest: number; + Backpack: number; + Earpiece: number; + Eyewear: number; + FaceCover: number; + FirstPrimaryWeapon: number; + Headwear: number; + Holster: number; + Pockets: number; + Scabbard: number; + SecondPrimaryWeapon: number; + SecuredContainer: number; + TacticalVest: number; +} +export interface ModsChances { + mod_charge: number; + mod_equipment: number; + mod_equipment_000: number; + mod_equipment_001: number; + mod_equipment_002: number; + mod_flashlight: number; + mod_foregrip: number; + mod_launcher: number; + mod_magazine: number; + mod_mount: number; + mod_mount_000: number; + mod_mount_001: number; + mod_muzzle: number; + mod_nvg: number; + mod_pistol_grip: number; + mod_reciever: number; + mod_scope: number; + mod_sight_front: number; + mod_sight_rear: number; + mod_stock: number; + mod_stock_000: number; + mod_stock_akms: number; + mod_tactical: number; + mod_tactical_000: number; + mod_tactical_001: number; + mod_tactical_002: number; + mod_tactical_003: number; +} +export interface Difficulties { + easy: Difficulty; + normal: Difficulty; + hard: Difficulty; + impossible: Difficulty; +} +export interface Difficulty { + Aiming: Record; + Boss: Record; + Change: Record; + Core: Record; + Cover: Record; + Grenade: Record; + Hearing: Record; + Lay: Record; + Look: Record; + Mind: Record; + Move: Record; + Patrol: Record; + Scattering: Record; + Shoot: Record; +} +export interface Experience { + aggressorBonus: number; + level: MinMax; + reward: MinMax; + standingForKill: number; +} +export interface Generation { + items: ItemMinMax; +} +export interface ItemMinMax { + grenades: MinMax; + healing: MinMax; + drugs: MinMax; + stims: MinMax; + looseLoot: MinMax; + magazines: MinMax; + specialItems: MinMax; +} +export interface Health { + BodyParts: BodyPart[]; + Energy: MinMax; + Hydration: MinMax; + Temperature: MinMax; +} +export interface BodyPart { + Chest: MinMax; + Head: MinMax; + LeftArm: MinMax; + LeftLeg: MinMax; + RightArm: MinMax; + RightLeg: MinMax; + Stomach: MinMax; +} +export interface MinMax { + max: number; + min: number; +} +export interface Inventory { + equipment: Equipment; + items: Items; + mods: Mods; +} +export interface Equipment { + ArmBand: Record; + ArmorVest: Record; + Backpack: Record; + Earpiece: Record; + Eyewear: Record; + FaceCover: Record; + FirstPrimaryWeapon: Record; + Headwear: Record; + Holster: Record; + Pockets: Record; + Scabbard: Record; + SecondPrimaryWeapon: Record; + SecuredContainer: Record; + TacticalVest: Record; +} +export interface Items { + Backpack: string[]; + Pockets: string[]; + SecuredContainer: string[]; + SpecialLoot: string[]; + TacticalVest: string[]; +} +export declare type Mods = Record>; +export interface Skills { + Common: Common[]; + Bonuses?: any; + Mastering: Mastering[]; + Points: number; +} +export interface Mastering { + Id: string; + Progress: number; + max?: number; + min?: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession?: number; + LastAccess?: number; + max?: number; + min?: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ICustomizationItem.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ICustomizationItem.d.ts new file mode 100644 index 0000000..8bfeece --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ICustomizationItem.d.ts @@ -0,0 +1,33 @@ +export interface ICustomizationItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Side: string[]; + BodyPart: string; + AvailableAsDefault?: boolean; + Body: string; + Hands: string; + Feet: string; + Prefab: Prefab; + WatchPrefab: Prefab; + IntegratedArmorVest: boolean; + WatchPosition: Xyz; + WatchRotation: Xyz; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Xyz { + x: number; + y: number; + z: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IHandbookBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IHandbookBase.d.ts new file mode 100644 index 0000000..7d7db07 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IHandbookBase.d.ts @@ -0,0 +1,16 @@ +export interface IHandbookBase { + Categories: Category[]; + Items: HandbookItem[]; +} +export interface Category { + Id: string; + ParentId?: string; + Icon: string; + Color: string; + Order: string; +} +export interface HandbookItem { + Id: string; + ParentId: string; + Price: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IItem.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IItem.d.ts new file mode 100644 index 0000000..2dd2c03 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IItem.d.ts @@ -0,0 +1,108 @@ +export interface Item { + _id: string; + _tpl: string; + parentId?: string; + slotId?: string; + location?: Location | number; + upd?: Upd; +} +export interface Upd { + OriginalStackObjectsCount?: number; + Togglable?: Togglable; + Map?: Map; + Tag?: Tag; + sptPresetId?: string; + FaceShield?: FaceShield; + StackObjectsCount?: number; + UnlimitedCount?: boolean; + Repairable?: Repairable; + FireMode?: FireMode; + SpawnedInSession?: boolean; + Light?: Light; + Key?: Key; + Resource?: Resource; + Sight?: Sight; + MedKit?: MedKit; + FoodDrink?: FoodDrink; + Dogtag?: Dogtag; + BuyRestrictionMax?: number; + BuyRestrictionCurrent?: number; + Foldable?: Foldable; + SideEffect?: SideEffect; + RepairKit?: RepairKit; +} +export interface Togglable { + On: boolean; +} +export interface Map { + Markers: MapMarker[]; +} +export interface MapMarker { + X: number; + Y: number; +} +export interface Tag { + Color: number; + Name: string; +} +export interface FaceShield { + Hits: number; +} +export interface Repairable { + Durability: number; + MaxDurability: number; +} +export interface MedKit { + HpResource: number; +} +export interface Sight { + ScopesCurrentCalibPointIndexes: number[]; + ScopesSelectedModes: number[]; + SelectedScope: number; +} +export interface Foldable { + Folded: boolean; +} +export interface FireMode { + FireMode: string; +} +export interface FoodDrink { + HpPercent: number; +} +export interface Key { + NumberOfUsages: number; +} +export interface Resource { + Value: number; + UnitsConsumed: number; +} +export interface Light { + IsActive: boolean; + SelectedMode: number; +} +export interface Dogtag { + AccountId: string; + ProfileId: string; + Nickname: string; + Side: string; + Level: number; + Time: string; + Status: string; + KillerAccountId: string; + KillerProfileId: string; + KillerName: string; + WeaponName: string; +} +export interface Location { + x: number; + y: number; + r: string | number; + isSearched?: boolean; + rotation?: string; +} +export interface SideEffect { + Value: number; +} +export interface RepairKit { + Resource: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ILocationsBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ILocationsBase.d.ts new file mode 100644 index 0000000..2c96af3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ILocationsBase.d.ts @@ -0,0 +1,10 @@ +export interface ILocationsBase { + locations: Locations; + paths: Path[]; +} +export interface Locations { +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ILootBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ILootBase.d.ts new file mode 100644 index 0000000..e4baac5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ILootBase.d.ts @@ -0,0 +1,64 @@ +import { Item } from "./IItem"; +export interface ILootBase { + staticAmmo: Record; + staticContainers: Record; + staticLoot: Record; +} +export interface IStaticAmmoDetails { + tpl: string; + relativeProbability: number; +} +export interface IStaticContainerDetails { + staticWeapons: IStaticWeaponProps[]; + staticContainers: IStaticContainerProps[]; + staticForced: IStaticForcedProps[]; +} +export interface IStaticWeaponProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: string; + Items: Item[]; +} +export interface IStaticContainerProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: StaticItem[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StaticItem { + _id: any; + _tpl: string; +} +export interface IStaticForcedProps { + containerId: string; + itemTpl: string; +} +export interface IStaticLootDetails { + itemcountDistribution: ItemCountDistribution[]; + itemDistribution: ItemDistribution[]; +} +export interface ItemCountDistribution { + count: number; + relativeProbability: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IQuest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IQuest.d.ts new file mode 100644 index 0000000..e1fc888 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IQuest.d.ts @@ -0,0 +1,110 @@ +import { Item } from "./IItem"; +export interface IQuest { + QuestName: string; + _id: string; + canShowNotificationsInGame: boolean; + conditions: Conditions; + description: string; + failMessageText: string; + name: string; + note: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + startedMessageText: string; + successMessageText: string; + templateId: string; + rewards: Rewards; + status: string; + KeyQuest: boolean; + changeQuestMessageText: string; +} +export interface Conditions { + Started: AvailableForConditions[]; + AvailableForFinish: AvailableForConditions[]; + AvailableForStart: AvailableForConditions[]; + Success: AvailableForConditions[]; + Fail: AvailableForConditions[]; +} +export interface AvailableForConditions { + _parent: string; + _props: AvailableForProps; + dynamicLocale: boolean; +} +export interface AvailableForProps { + id: string; + index: number; + parentId: string; + dynamicLocale: boolean; + value?: number; + compareMethod?: string; + visibilityConditions?: VisibilityCondition[]; + target?: string | string[]; + status?: number[]; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; +} +export interface AvailableForCounter { + id: string; + conditions: CounterCondition[]; +} +export interface CounterCondition { + _parent: string; + _props: CounterProps; +} +export interface CounterProps { + id: string; + target: string[] | string; + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; +} +export interface DaytimeCounter { + from: number; + to: number; +} +export interface VisibilityCondition { + id: string; + value: number; + dynamicLocale: boolean; + oneSessionOnly: boolean; +} +export interface Rewards { + AvailableForStart: Reward[]; + AvailableForFinish: Reward[]; + Started: Reward[]; + Success: Reward[]; + Fail: Reward[]; + FailRestartable: Reward[]; + Expired: Reward[]; +} +export interface Reward { + value?: string; + id: string; + type: string; + index: number; + target?: string; + items?: Item[]; + loyaltyLevel?: number; + traderId?: string; + unknown?: boolean; + findInRaid?: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IRepeatableQuests.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IRepeatableQuests.d.ts new file mode 100644 index 0000000..e23ec73 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/IRepeatableQuests.d.ts @@ -0,0 +1,219 @@ +import { Item } from "./IItem"; +export interface IReward { + index: number; + type: string; + value: number; + target?: string; + items?: Item[]; +} +export interface IRepeatableQuestDatabase { + templates: ITemplates; + rewards: IRewardOptions; + data: IOptions; + samples: ISampleQuests[]; +} +export interface ITemplates { + Elimination: IRepeatableQuest; + Completion: IRepeatableQuest; + Exploration: IRepeatableQuest; +} +export interface IPmcDataRepeatableQuest { + id?: string; + name: string; + activeQuests: IRepeatableQuest[]; + inactiveQuests: IRepeatableQuest[]; + endTime: number; + changeRequirement: TChangeRequirementRecord; +} +export declare type TChangeRequirementRecord = Record; +export interface IChangeRequirement { + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IChangeCost { + templateId: string; + count: number; +} +export interface IRepeatableQuest { + _id: any; + traderId: string; + location: any; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + changeQuestMessageText: string; + templateId: string; + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IRewards { + Started: IReward[]; + Success: IReward[]; + Fail: IReward[]; +} +export interface IConditions { + AvailableForStart: any[]; + AvailableForFinish: IAvailableFor[]; + Fail: any[]; +} +export interface IAvailableFor { + _props: IAvailableForProps; + _parent: string; + dynamicLocale: boolean; +} +export interface IAvailableForProps { + id: string; + parentId: string; + dynamicLocale: boolean; + index: number; + visibilityConditions: IVisibilityCondition[]; + value: number; +} +export interface IVisibilityCondition { + id: string; + oneSessionOnly: boolean; + value: number; + index: number; + dynamicLocale: boolean; +} +export interface IAvailableForPropsCounter extends IAvailableForProps { + type: string; + oneSessionOnly: boolean; + doNotResetIfCounterCompleted: boolean; + counter: ICounter; +} +export interface ICounter { + id: string; + conditions: ICondition[]; +} +export interface ICondition { + _props: IConditionProps; + _parent: string; +} +export interface IConditionProps { + id: string; + dynamicLocale: boolean; +} +export interface IElimination extends IRepeatableQuest { + conditions: IEliminationConditions; +} +export interface IEliminationConditions extends IConditions { + AvailableForFinish: IEliminationAvailableFor[]; +} +export interface IEliminationAvailableFor extends IAvailableFor { + _props: IEliminationAvailableForProps; +} +export interface IEliminationAvailableForProps extends IAvailableForPropsCounter { + counter: IEliminationCounter; +} +export interface IEliminationCounter extends ICounter { + conditions: IEliminationCondition[]; +} +export interface IEliminationCondition extends ICondition { + _props: ILocationConditionProps | IKillConditionProps; +} +export interface IExploration extends IRepeatableQuest { + conditions: IExplorationConditions; +} +export interface IExplorationConditions extends IConditions { + AvailableForFinish: IExplorationAvailableFor[]; +} +export interface IExplorationAvailableFor extends IAvailableFor { + _props: IExplorationAvailableForProps; +} +export interface IExplorationAvailableForProps extends IAvailableForPropsCounter { + counter: IExplorationCounter; +} +export interface IExplorationCounter extends ICounter { + conditions: IExplorationCondition[]; +} +export interface IExplorationCondition extends ICondition { + _props: ILocationConditionProps | IExitStatusConditionProps | IExitNameConditionProps; +} +export interface ICompletion extends IRepeatableQuest { + conditions: ICompletionConditions; +} +export interface ICompletionConditions extends IConditions { + AvailableForFinish: ICompletionAvailableFor[]; +} +export interface ICompletionAvailableFor extends IAvailableFor { + _props: ICompletionAvailableForProps; +} +export interface ICompletionAvailableForProps extends IAvailableForProps { + target: string[]; + minDurability: number; + maxDurability: number; + dogtagLevel: number; + onlyFoundInRaid: boolean; +} +export interface ILocationConditionProps extends IConditionProps { + target: string[]; +} +export interface IKillConditionProps extends IConditionProps { + target: string; + value: number; + savageRole?: string[]; + bodyPart?: string[]; + distance?: IDistanceCheck; +} +export interface IDistanceCheck { + compareMethod: string; + value: number; +} +export interface IExitStatusConditionProps extends IConditionProps { + status: string[]; +} +export interface IExitNameConditionProps extends IConditionProps { + exitName: string; +} +export interface IRewardOptions { + itemsBlacklist: string[]; +} +export interface IOptions { + Completion: ICompletionFilter; +} +export interface ICompletionFilter { + itemsBlacklist: ItemsBlacklist[]; + itemsWhitelist: ItemsWhitelist[]; +} +export interface ItemsBlacklist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ItemsWhitelist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ISampleQuests { + _id: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + templateId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ITemplateItem.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ITemplateItem.d.ts new file mode 100644 index 0000000..c2ba762 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ITemplateItem.d.ts @@ -0,0 +1,401 @@ +export interface ITemplateItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Weight: number; + BackgroundColor: string; + Width: number; + Height: number; + StackMaxSize: number; + Rarity?: string; + SpawnChance?: number; + CreditsPrice?: number; + ItemSound: string; + Prefab: Prefab; + UsePrefab: Prefab; + StackObjectsCount: number; + NotShownInSlot: boolean; + ExaminedByDefault: boolean; + ExamineTime: number; + IsUndiscardable: boolean; + IsUnsaleable: boolean; + IsUnbuyable: boolean; + IsUngivable: boolean; + IsLockedafterEquip: boolean; + QuestItem: boolean; + LootExperience: number; + ExamineExperience: number; + HideEntrails: boolean; + RepairCost: number; + RepairSpeed: number; + ExtraSizeLeft: number; + ExtraSizeRight: number; + ExtraSizeUp: number; + ExtraSizeDown: number; + ExtraSizeForceAdd: boolean; + MergesWithChildren: boolean; + CanSellOnRagfair: boolean; + CanRequireOnRagfair: boolean; + ConflictingItems: string[]; + DiscardLimit: number; + Unlootable: boolean; + UnlootableFromSlot: string; + UnlootableFromSide: string[]; + AnimationVariantsNumber: number; + DiscardingBlock: boolean; + RagFairCommissionModifier: number; + IsAlwaysAvailableForInsurance: boolean; + Grids: Grid[]; + Slots: Slot[]; + CanPutIntoDuringTheRaid: boolean; + CantRemoveFromSlotsDuringRaid: string[]; + weapClass: string; + weapUseType: string; + ammoCaliber: string; + Durability: number; + MaxDurability: number; + OperatingResource: number; + RepairComplexity: number; + durabSpawnMin: number; + durabSpawnMax: number; + isFastReload: boolean; + RecoilForceUp: number; + RecoilForceBack: number; + Convergence: number; + RecoilAngle: number; + weapFireType: string[]; + RecolDispersion: number; + SingleFireRate: number; + CanQueueSecondShot: boolean; + bFirerate: number; + Ergonomics: number; + Velocity: number; + bEffDist: number; + bHearDist: number; + isChamberLoad: boolean; + chamberAmmoCount: number; + isBoltCatch: boolean; + defMagType: string; + defAmmo: string; + AdjustCollimatorsToTrajectory: boolean; + shotgunDispersion: number; + Chambers: Chamber[]; + CameraRecoil: number; + CameraSnap: number; + ReloadMode: string; + CenterOfImpact: number; + AimPlane: number; + DeviationCurve: number; + DeviationMax: number; + Foldable: boolean; + Retractable: boolean; + TacticalReloadStiffnes: Xyz; + TacticalReloadFixation: number; + RecoilCenter: Xyz; + RotationCenter: Xyz; + RotationCenterNoStock: Xyz; + SizeReduceRight: number; + FoldedSlot: string; + CompactHandling: boolean; + SightingRange: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; + IronSightRange: number; + MustBoltBeOpennedForExternalReload: boolean; + MustBoltBeOpennedForInternalReload: boolean; + BoltAction: boolean; + HipAccuracyRestorationDelay: number; + HipAccuracyRestorationSpeed: number; + HipInnaccuracyGain: number; + ManualBoltCatch: boolean; + BurstShotsCount: number; + BaseMalfunctionChance: number; + AllowJam: boolean; + AllowFeed: boolean; + AllowMisfire: boolean; + AllowSlide: boolean; + DurabilityBurnRatio: number; + HeatFactorGun: number; + CoolFactorGun: number; + CoolFactorGunMods: number; + HeatFactorByShot: number; + AllowOverheat: boolean; + DoubleActionAccuracyPenalty: number; + RecoilPosZMult: number; + ShotgunDispersion: number; + StackMinRandom: number; + StackMaxRandom: number; + StackSlots: StackSlot[]; + SearchSound: string; + BlocksArmorVest: boolean; + RigLayoutName: string; + armorZone: string[]; + armorClass: number; + speedPenaltyPercent: number; + mousePenalty: number; + weaponErgonomicPenalty: number; + BluntThroughput: number; + ArmorMaterial: string; + medUseTime: number; + medEffectType: string; + MaxHpResource: number; + hpResourceRate: number; + StimulatorBuffs: string; + effects_health: EffectsHealth; + effects_damage: EffectsDamage; + knifeHitDelay: number; + knifeHitSlashRate: number; + knifeHitStabRate: number; + knifeHitRadius: number; + knifeHitSlashDam: number; + knifeHitStabDam: number; + knifeDurab: number; + PrimaryDistance: number; + SecondryDistance: number; + SlashPenetration: number; + StabPenetration: number; + PrimaryConsumption: number; + SecondryConsumption: number; + DeflectionConsumption: number; + MaxResource: number; + AppliedTrunkRotation: Xyz; + AppliedHeadRotation: Xyz; + DisplayOnModel: boolean; + AdditionalAnimationLayer: number; + StaminaBurnRate: number; + ColliderScaleMultiplier: Xyz; + ammoType: string; + InitialSpeed: number; + BallisticCoeficient: number; + BulletMassGram: number; + BulletDiameterMilimeters: number; + Damage: number; + ammoAccr: number; + ammoRec: number; + ammoDist: number; + buckshotBullets: number; + PenetrationPower: number; + PenetrationPowerDiviation: number; + ammoHear: number; + ammoSfx: string; + MisfireChance: number; + MinFragmentsCount: number; + MaxFragmentsCount: number; + ammoShiftChance: number; + casingName: string; + casingEjectPower: number; + casingMass: number; + casingSounds: string; + ProjectileCount: number; + PenetrationChance: number; + RicochetChance: number; + FragmentationChance: number; + Deterioration: number; + SpeedRetardation: number; + Tracer: boolean; + TracerColor: string; + TracerDistance: number; + ArmorDamage: number; + Caliber: string; + StaminaBurnPerDamage: number; + HeavyBleedingDelta: number; + LightBleedingDelta: number; + ShowBullet: boolean; + HasGrenaderComponent: boolean; + FuzeArmTimeSec: number; + ExplosionStrength: number; + MinExplosionDistance: number; + MaxExplosionDistance: number; + FragmentsCount: number; + FragmentType: string; + ShowHitEffectOnExplode: boolean; + ExplosionType: string; + AmmoLifeTimeSec: number; + Contusion: Contusion; + ArmorDistanceDistanceDamage: Xyz; + Blindness: Xyz; + IsLightAndSoundShot: boolean; + LightAndSoundShotAngle: number; + LightAndSoundShotSelfContusionTime: number; + LightAndSoundShotSelfContusionStrength: number; + MalfMisfireChance: number; + DurabilityBurnModificator: number; + HeatFactor: number; + MalfFeedChance: number; + Accuracy: number; + Recoil: number; + Loudness: number; + EffectiveDistance: number; + RaidModdable: boolean; + ToolModdable: boolean; + BlocksFolding: boolean; + BlocksCollapsible: boolean; + IsAnimated: boolean; + HasShoulderContact: boolean; + DoubleActionAccuracyPenaltyMult: number; + magAnimationIndex: number; + Cartridges: Cartridge[]; + CanFast: boolean; + CanHit: boolean; + CanAdmin: boolean; + LoadUnloadModifier: number; + CheckTimeModifier: number; + CheckOverride: number; + ReloadMagType: string; + VisibleAmmoRangesString: string; + MalfunctionChance: number; + TagColor: number; + TagName: string; + MaximumNumberOfUsage: number; + CustomAimPlane: string; + sightModType: string; + aimingSensitivity: number; + SightModesCount: number; + OpticCalibrationDistances: number[]; + ScopesCount: number; + AimSensitivity: number[][]; + ModesCount: number[]; + Zooms: number[][]; + CalibrationDistances: number[][]; + Intensity: number; + Mask: string; + MaskSize: number; + NoiseIntensity: number; + NoiseScale: number; + Color: Color; + DiffuseIntensity: number; + HasHinge: boolean; + Resource?: number; + CoolFactor?: number; + foodUseTime?: number; + foodEffectType?: string; + MaxRepairResource: number; + RepairQuality: number; + RepairType: string; + TargetItemFilter: string[]; + apResource: number; + krResource: number; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Grid { + _name: string; + _id: string; + _parent: string; + _props: GridProps; + _proto: string; +} +export interface GridProps { + filters: GridFilter[]; + cellsH: number; + cellsV: number; + minCount: number; + maxCount: number; + maxWeight: number; + isSortingTable: boolean; +} +export interface GridFilter { + Filter: string[]; + ExcludedFilter: string[]; +} +export interface Slot { + _name: string; + _id: string; + _parent: string; + _props: SlotProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface SlotProps { + filters: Filter[]; +} +export interface Chamber { + _name: string; + _id: string; + _parent: string; + _props: ChamberProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface ChamberProps { + filters: FilterProps[]; +} +export interface FilterProps { + Filter: string[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StackSlot { + _name?: string; + _id: string; + _sptTpl: string; + parent: string; + location: any; + slotId: string; + _max_count: number; + _props?: StackSlotProps; + _proto?: string; + upd: any; +} +export interface StackSlotProps { + filters: Filter[]; +} +export interface EffectsHealth { + Hydration: Hydration; +} +export interface Hydration { + value: number; +} +export interface EffectsDamage { + Pain: Pain; + Contusion: Contusion; +} +export interface Pain { + delay: number; + duration: number; + fadeOut: number; +} +export interface Contusion { + delay: number; + duration: number; + fadeOut: number; +} +export interface Cartridge { + _name: string; + _id: string; + _parent: string; + _max_count: number; + _props: CartridgeProps; + _proto: string; +} +export interface CartridgeProps { + filters: Filter[]; +} +export interface Filter { + Shift?: number; + Filter: string[]; + AnimationIndex?: number; +} +export interface Color { + r: number; + g: number; + b: number; + a: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ITrader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ITrader.d.ts new file mode 100644 index 0000000..f0fe2b5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/common/tables/ITrader.d.ts @@ -0,0 +1,90 @@ +import { Item } from "./IItem"; +export interface ITrader { + assort: ITraderAssort; + base: ITraderBase; + dialogue?: Record; + questassort: Record>; + suits?: ISuit[]; +} +export interface ITraderBase { + refreshAssort: boolean; + _id: string; + avatar: string; + balance_dol: number; + balance_eur: number; + balance_rub: number; + buyer_up: boolean; + currency: string; + customization_seller: boolean; + discount: number; + discount_end: number; + gridHeight: number; + insurance: Insurance; + location: string; + loyaltyLevels: LoyaltyLevel[]; + medic: boolean; + name: string; + nextResupply: number; + nickname: string; + repair: Repair; + sell_category: string[]; + surname: string; + unlockedByDefault: boolean; +} +export interface Insurance { + availability: boolean; + excluded_category: string[]; + max_return_hour: number; + max_storage_time: number; + min_payment: number; + min_return_hour: number; +} +export interface LoyaltyLevel { + buy_price_coef: number; + exchange_price_coef: number; + heal_price_coef: number; + insurance_price_coef: number; + minLevel: number; + minSalesSum: number; + minStanding: number; + repair_price_coef: number; +} +export interface Repair { + availability: boolean; + currency: string; + currency_coefficient: number; + excluded_category: string[]; + excluded_id_list: any[]; + quality: string; +} +export interface ITraderAssort { + nextResupply?: number; + items: Item[]; + barter_scheme: Record; + loyal_level_items: Record; +} +export interface IBarterScheme { + count: number; + _tpl: string; + onlyFunctional?: boolean; +} +export interface ISuit { + _id: string; + tid: string; + suiteId: string; + isActive: boolean; + requirements: Requirements; +} +export interface Requirements { + loyaltyLevel: number; + profileLevel: number; + standing: number; + skillRequirements: string[]; + questRequirements: string[]; + itemRequirements: ItemRequirement[]; +} +export interface ItemRequirement { + count: number; + _tpl: string; + onlyFunctional: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/customization/IBuyClothingRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/customization/IBuyClothingRequestData.d.ts new file mode 100644 index 0000000..d19b70d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/customization/IBuyClothingRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IBuyClothingRequestData { + Action: "CustomizationBuy"; + offer: string; + items: ClothingItem[]; +} +export interface ClothingItem { + del: boolean; + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/customization/IWearClothingRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/customization/IWearClothingRequestData.d.ts new file mode 100644 index 0000000..122d9cf --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/customization/IWearClothingRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IWearClothingRequestData { + Action: "CustomizationWear"; + suites: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IFriendRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IFriendRequestData.d.ts new file mode 100644 index 0000000..9c326ac --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IFriendRequestData { + to: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts new file mode 100644 index 0000000..53d8289 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetAllAttachmentsRequestData { + dialogId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts new file mode 100644 index 0000000..076d414 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts @@ -0,0 +1,6 @@ +import { Message } from "../profile/IAkiProfile"; +export interface IGetAllAttachmentsResponse { + messages: Message[]; + profiles: any[]; + hasMessagesWithRewards: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts new file mode 100644 index 0000000..8f1beac --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetChatServerListRequestData { + VersionId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts new file mode 100644 index 0000000..1d0c0e8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts @@ -0,0 +1,16 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IGetFriendListDataResponse { + Friends: Friend[]; + Ignore: any[]; + InIgnoreList: any[]; +} +export interface Friend { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; + MemberCategory: MemberCategory; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts new file mode 100644 index 0000000..eed84b1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMailDialogInfoRequestData { + dialogId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts new file mode 100644 index 0000000..f8fbf5d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMailDialogListRequestData { + limit: number; + offset: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts new file mode 100644 index 0000000..43d416e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface IGetMailDialogViewRequestData { + type: MessageType; + dialogId: string; + limit: number; + time: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts new file mode 100644 index 0000000..4f8b946 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../common/IPmcData"; +import { Message } from "../profile/IAkiProfile"; +export interface IGetMailDialogViewResponseData { + messages: Message[]; + profiles: IPmcData[]; + hasMessagesWithRewards: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IPinDialogRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IPinDialogRequestData.d.ts new file mode 100644 index 0000000..57b8a00 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IPinDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IPinDialogRequestData { + dialogId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts new file mode 100644 index 0000000..874b828 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IRemoveDialogRequestData { + dialogId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/ISendMessageRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/ISendMessageRequest.d.ts new file mode 100644 index 0000000..dd79deb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/ISendMessageRequest.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface ISendMessageRequest { + dialogId: string; + type: MessageType; + text: string; + replyTo: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts new file mode 100644 index 0000000..2076232 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISetDialogReadRequestData { + dialogs: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IGameConfigResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IGameConfigResponse.d.ts new file mode 100644 index 0000000..eb37a39 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IGameConfigResponse.d.ts @@ -0,0 +1,19 @@ +export interface IGameConfigResponse { + aid: string; + lang: string; + languages: Record; + ndaFree: boolean; + taxonomy: number; + activeProfileId: string; + backend: Backend; + utc_time: number; + totalInGame: number; + reportAvailable: boolean; + twitchEventMember: boolean; +} +export interface Backend { + Trading: string; + Messaging: string; + Main: string; + RagFair: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts new file mode 100644 index 0000000..a3ecad9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGameEmptyCrcRequestData { + crc: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IVersionValidateRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IVersionValidateRequestData.d.ts new file mode 100644 index 0000000..0aa0fed --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/game/IVersionValidateRequestData.d.ts @@ -0,0 +1,11 @@ +export interface IVersionValidateRequestData { + version: Version; + develop: boolean; +} +export interface Version { + major: string; + minor: string; + game: string; + backend: string; + taxonomy: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts new file mode 100644 index 0000000..7fb80a8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts @@ -0,0 +1,29 @@ +export interface IHealthTreatmentRequestData { + Action: "RestoreHealth"; + trader: string; + items: Item[]; + difference: Difference; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} +export interface Difference { + BodyParts: BodyParts; + Energy: number; + Hydration: number; +} +export interface BodyParts { + Head: BodyPart; + Chest: BodyPart; + Stomach: BodyPart; + LeftArm: BodyPart; + RightArm: BodyPart; + LeftLeg: BodyPart; + RightLeg: BodyPart; +} +export interface BodyPart { + Health: number; + Effects: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IOffraidEatRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IOffraidEatRequestData.d.ts new file mode 100644 index 0000000..8e2b6c3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IOffraidEatRequestData.d.ts @@ -0,0 +1,7 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidEatRequestData extends IBaseInteractionRequestData { + Action: "Eat"; + item: string; + count: number; + time: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IOffraidHealRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IOffraidHealRequestData.d.ts new file mode 100644 index 0000000..c242300 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/IOffraidHealRequestData.d.ts @@ -0,0 +1,18 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidHealRequestData extends IBaseInteractionRequestData { + Action: "Heal"; + item: string; + part: BodyPart; + count: number; + time: number; +} +export declare enum BodyPart { + Head = 0, + Chest = 1, + Stomach = 2, + LeftArm = 3, + RightArm = 4, + LeftLeg = 5, + RightLeg = 6, + Common = 7 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/ISyncHealthRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/ISyncHealthRequestData.d.ts new file mode 100644 index 0000000..20e32f6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/health/ISyncHealthRequestData.d.ts @@ -0,0 +1,21 @@ +export interface ISyncHealthRequestData { + Health: Health; + IsAlive: boolean; + Hydration?: number; + Energy?: number; + Temperature?: number; +} +export interface Health { + Head?: BodyPartHealth; + Chest?: BodyPartHealth; + Stomach?: BodyPartHealth; + LeftArm?: BodyPartHealth; + RightArm?: BodyPartHealth; + LeftLeg?: BodyPartHealth; + RightLeg?: BodyPartHealth; +} +export interface BodyPartHealth { + Maximum: number; + Current: number; + Effects: Record; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/HideoutAreasEnum.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/HideoutAreasEnum.d.ts new file mode 100644 index 0000000..10f851b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/HideoutAreasEnum.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreasEnum { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..8583e8d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface HideoutUpgradeCompleteRequestData { + Action: string; + areaType: number; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutArea.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutArea.d.ts new file mode 100644 index 0000000..d9fd2bf --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutArea.d.ts @@ -0,0 +1,40 @@ +export interface IHideoutArea { + _id: string; + type: number; + enabled: boolean; + needsFuel: boolean; + takeFromSlotLocked: boolean; + craftGivesExp: boolean; + stages: Record; +} +export interface Stage { + requirements: Requirement[]; + bonuses: StageBonus[]; + slots: number; + constructionTime: number; + description: string; +} +export interface Requirement { + areaType?: number; + requiredLevel?: number; + type: string; + templateId?: string; + count?: number; + isFunctional?: boolean; + traderId?: string; + loyaltyLevel?: number; + skillName?: string; + skillLevel?: number; +} +export interface StageBonus { + value: number; + passive: boolean; + production: boolean; + visible: boolean; + skillType?: string; + type: string; + filter?: string[]; + icon?: string; + id?: string; + templateId?: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts new file mode 100644 index 0000000..dba83eb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutContinousProductionStartRequestData { + Action: "HideoutContinuousProductionStart"; + recipeId: string; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutProduction.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutProduction.d.ts new file mode 100644 index 0000000..ce878be --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutProduction.d.ts @@ -0,0 +1,20 @@ +export interface IHideoutProduction { + _id: string; + areaType: number; + requirements: Requirement[]; + productionTime: number; + boosters: any; + endProduct: string; + continuous: boolean; + count: number; + productionLimitCount: number; +} +export interface Requirement { + templateId?: string; + count?: number; + isFunctional?: boolean; + type: string; + areaType?: number; + requiredLevel?: number; + resource?: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts new file mode 100644 index 0000000..8326c55 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutPutItemInRequestData { + Action: "HideoutPutItemsInAreaSlots"; + areaType: number; + items: Record; + timestamp: number; +} +export interface ItemDetails { + count: number; + id: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutScavCase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutScavCase.d.ts new file mode 100644 index 0000000..25abcf3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutScavCase.d.ts @@ -0,0 +1,21 @@ +export interface IHideoutScavCase { + _id: string; + ProductionTime: number; + Requirements: Requirement[]; + EndProducts: EndProducts; +} +export interface Requirement { + templateId: string; + count: number; + isFunctional: boolean; + type: string; +} +export interface EndProducts { + Common: MinMax; + Rare: MinMax; + Superrare: MinMax; +} +export interface MinMax { + min: string; + max: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts new file mode 100644 index 0000000..72fda86 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts @@ -0,0 +1,15 @@ +export interface IHideoutScavCaseStartRequestData { + Action: "HideoutScavCaseProductionStart"; + recipeId: string; + items: HideoutItem[]; + tools: Tool[]; + timestamp: number; +} +export interface HideoutItem { + id: string; + count: number; +} +export interface Tool { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts new file mode 100644 index 0000000..8e45939 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutSettingsBase { + generatorSpeedWithoutFuel: number; + generatorFuelFlowRate: number; + airFilterUnitFlowRate: number; + gpuBoostRate: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts new file mode 100644 index 0000000..1ed542a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutSingleProductionStartRequestData { + Action: "HideoutSingleProductionStart"; + recipeId: string; + items: Item[]; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts new file mode 100644 index 0000000..83a740a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutTakeItemOutRequestData { + Action: "HideoutTakeItemsFromAreaSlots"; + areaType: number; + slots: number[]; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts new file mode 100644 index 0000000..a6847ef --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutTakeProductionRequestData { + Action: "HideoutTakeProduction"; + recipeId: string; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts new file mode 100644 index 0000000..cdea513 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutToggleAreaRequestData { + Action: "HideoutToggleArea"; + areaType: number; + enabled: boolean; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..545311e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutUpgradeCompleteRequestData { + Action: "HideoutUpgradeComplete"; + areaType: number; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts new file mode 100644 index 0000000..dfbfdca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutUpgradeRequestData { + Action: "HideoutUpgrade"; + areaType: number; + items: HideoutItem[]; + timestamp: number; +} +export interface HideoutItem { + count: number; + id: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts new file mode 100644 index 0000000..b5dc5c1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts @@ -0,0 +1,5 @@ +export interface IGetBodyResponseData { + err: number; + errmsg: any; + (data: Type): Type; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/httpResponse/INullResponseData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/httpResponse/INullResponseData.d.ts new file mode 100644 index 0000000..a3ae838 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/httpResponse/INullResponseData.d.ts @@ -0,0 +1,5 @@ +export interface INullResponseData { + err: number; + errmsg: any; + data: null; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts new file mode 100644 index 0000000..e2d9cf1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IRegisterPlayerRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts new file mode 100644 index 0000000..6930261 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../common/IPmcData"; +import { ISyncHealthRequestData } from "../health/ISyncHealthRequestData"; +export interface ISaveProgressRequestData { + exit: string; + profile: IPmcData; + isPlayerScav: boolean; + health: ISyncHealthRequestData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts new file mode 100644 index 0000000..0e32e96 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetInsuranceCostRequestData { + traders: string[]; + items: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/insurance/IInsureRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/insurance/IInsureRequestData.d.ts new file mode 100644 index 0000000..f657bb7 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/insurance/IInsureRequestData.d.ts @@ -0,0 +1,6 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInsureRequestData extends IBaseInteractionRequestData { + Action: "Insure"; + tid: string; + items: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IAddItemRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IAddItemRequestData.d.ts new file mode 100644 index 0000000..53db97a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IAddItemRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IAddItemRequestData { + tid: string; + items: any[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts new file mode 100644 index 0000000..462e0de --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts @@ -0,0 +1,6 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryAddRequestData extends IInventoryBaseActionRequestData { + Action: "Add"; + item: string; + container: Container; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts new file mode 100644 index 0000000..b45e459 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts @@ -0,0 +1,27 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInventoryBaseActionRequestData extends IBaseInteractionRequestData { +} +export interface To { + id: string; + container: string; + location?: ToLocation | number; +} +export interface ToLocation { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} +export interface Container { + id: string; + container: string; + location: Location | number; +} +export interface Location { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts new file mode 100644 index 0000000..ff35066 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryBindRequestData extends IInventoryBaseActionRequestData { + Action: "Bind"; + item: string; + index: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts new file mode 100644 index 0000000..1e1ecef --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts @@ -0,0 +1,12 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryCreateMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "CreateMapMarker"; + item: string; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts new file mode 100644 index 0000000..0657e1b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryDeleteMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "DeleteMapMarker"; + item: string; + X: number; + Y: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts new file mode 100644 index 0000000..e2857e1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts @@ -0,0 +1,14 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryEditMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "EditMapMarker"; + item: string; + X: number; + Y: number; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts new file mode 100644 index 0000000..614711f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts @@ -0,0 +1,10 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryExamineRequestData extends IInventoryBaseActionRequestData { + Action: "Examine"; + item: string; + fromOwner: IFromOwner; +} +export interface IFromOwner { + id: string; + type: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts new file mode 100644 index 0000000..a5fb2a1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryFoldRequestData extends IInventoryBaseActionRequestData { + Action: "Fold"; + item: string; + value: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts new file mode 100644 index 0000000..3fcfa35 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMergeRequestData extends IInventoryBaseActionRequestData { + Action: "Merge"; + item: string; + with: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts new file mode 100644 index 0000000..b767908 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMoveRequestData extends IInventoryBaseActionRequestData { + Action: "Move"; + item: string; + to: To; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts new file mode 100644 index 0000000..5487b20 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryReadEncyclopediaRequestData extends IInventoryBaseActionRequestData { + Action: "ReadEncyclopedia"; + ids: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts new file mode 100644 index 0000000..07d1a52 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryRemoveRequestData extends IInventoryBaseActionRequestData { + Action: "Remove"; + item: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySortRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySortRequestData.d.ts new file mode 100644 index 0000000..a0b7928 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySortRequestData.d.ts @@ -0,0 +1,20 @@ +import { Upd } from "../common/tables/IItem"; +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySortRequestData extends IInventoryBaseActionRequestData { + Action: "ApplyInventoryChanges"; + changedItems: ChangedItem[]; +} +export interface ChangedItem { + _id: string; + _tpl: string; + parentId: string; + slotId: string; + location: Location; + upd: Upd; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts new file mode 100644 index 0000000..730ae71 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts @@ -0,0 +1,7 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySplitRequestData extends IInventoryBaseActionRequestData { + Action: "Split"; + item: string; + container: Container; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts new file mode 100644 index 0000000..1b0464d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts @@ -0,0 +1,11 @@ +import { OwnerInfo } from "../common/request/IBaseInteractionRequestData"; +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventorySwapRequestData extends IInventoryBaseActionRequestData { + Action: "Swap"; + item: string; + to: To; + item2: string; + to2: To; + fromOwner2: OwnerInfo; + toOwner2: OwnerInfo; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts new file mode 100644 index 0000000..f021661 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTagRequestData extends IInventoryBaseActionRequestData { + Action: "Tag"; + item: string; + TagName: string; + TagColor: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts new file mode 100644 index 0000000..0955440 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryToggleRequestData extends IInventoryBaseActionRequestData { + Action: "Toggle"; + item: string; + value: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts new file mode 100644 index 0000000..cf4391b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTransferRequestData extends IInventoryBaseActionRequestData { + Action: "Transfer"; + item: string; + with: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts new file mode 100644 index 0000000..689fe75 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts @@ -0,0 +1,4 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IEmptyItemEventRouterResponse extends IItemEventRouterBase { + profileChanges: ""; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts new file mode 100644 index 0000000..31e62fe --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts @@ -0,0 +1,67 @@ +import { Skills } from "../common/IPmcData"; +import { Item, Upd } from "../common/tables/IItem"; +import { IQuest } from "../common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../common/tables/IRepeatableQuests"; +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +export interface IItemEventRouterBase { + warnings: Warning[]; + profileChanges: TProfileChanges | ""; +} +export declare type TProfileChanges = Record; +export interface Warning { + index: number; + err: string; + errmsg: string; +} +export interface ProfileChange { + _id: string; + experience: number; + quests: IQuest[]; + ragFairOffers: IRagfairOffer[]; + builds: BuildChange[]; + items: ItemChanges; + production: Record; + skills: Skills; + traderRelations: Record; + repeatableQuests?: IPmcDataRepeatableQuest[]; +} +export interface BuildChange { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface ItemChanges { + new: Product[]; + change: Product[]; + del: Product[]; +} +export interface Production { + Progress: number; + StartTimestamp: number; + ProductionTime: number; + inProgress: boolean; + RecipeId: string; + Products: Product[]; +} +export interface Product { + _id: string; + _tpl?: string; + parentId?: string; + slotId?: string; + location?: ItemChangeLocation; + upd?: Upd; +} +export interface ItemChangeLocation { + x: number; + y: number; + r: number; + isSearched?: boolean; +} +export interface TraderRelations { + salesSum?: number; + standing?: number; + loyalty?: number; + unlocked?: boolean; + disabled?: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts new file mode 100644 index 0000000..515b49a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts @@ -0,0 +1,21 @@ +export interface IItemEventRouterRequest { + data: Daum[]; + tm: number; + reload: number; +} +export interface Daum { + Action: string; + item: string; + to: To; +} +export interface To { + id: string; + container: string; + location?: Location; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts new file mode 100644 index 0000000..72a9b5b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts @@ -0,0 +1,3 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IItemEventRouterResponse extends IItemEventRouterBase { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IChangeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IChangeRequestData.d.ts new file mode 100644 index 0000000..f0a7838 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IChangeRequestData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IChangeRequestData extends ILoginRequestData { + change: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts new file mode 100644 index 0000000..a14c7c9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMiniProfileRequestData { + username: string; + password: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/ILoginRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/ILoginRequestData.d.ts new file mode 100644 index 0000000..e965813 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/ILoginRequestData.d.ts @@ -0,0 +1,4 @@ +export interface ILoginRequestData { + username: string; + password: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IMiniProfile.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IMiniProfile.d.ts new file mode 100644 index 0000000..c12661a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IMiniProfile.d.ts @@ -0,0 +1,14 @@ +export interface IMiniProfile { + username: string; + nickname: string; + side: string; + currlvl: number; + currexp: number; + prevexp: number; + nextlvl: number; + maxlvl: number; + akiData: AkiData; +} +export interface AkiData { + version: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IRegisterData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IRegisterData.d.ts new file mode 100644 index 0000000..61a8bbe --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IRegisterData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IRegisterData extends ILoginRequestData { + edition: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IRemoveProfileData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IRemoveProfileData.d.ts new file mode 100644 index 0000000..d31c9ac --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/launcher/IRemoveProfileData.d.ts @@ -0,0 +1,2 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export declare type IRemoveProfileData = ILoginRequestData; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/location/IGetLocationRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/location/IGetLocationRequestData.d.ts new file mode 100644 index 0000000..04e84d9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/location/IGetLocationRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IGetLocationRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts new file mode 100644 index 0000000..811e9a2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IEndOfflineRaidRequestData { + crc: number; + exitStatus: string; + exitName: any; + raidSeconds: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IGetProfileRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IGetProfileRequestData.d.ts new file mode 100644 index 0000000..86b5bbd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IGetProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetProfileRequestData { + profileId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts new file mode 100644 index 0000000..84bccc8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts @@ -0,0 +1,27 @@ +export interface IStartOfflineRaidRequestData { + locationName: string; + entryPoint: string; + startTime: number; + dateTime: string; + gameSettings: GameSettings; +} +export interface GameSettings { + timeAndWeatherSettings: TimeAndWeatherSettings; + botsSettings: BotsSettings; + wavesSettings: WavesSettings; +} +export interface TimeAndWeatherSettings { + isRandomTime: boolean; + isRandomWeather: boolean; +} +export interface BotsSettings { + isEnabled: boolean; + isScavWars: boolean; + botAmount: string; +} +export interface WavesSettings { + botDifficulty: string; + isBosses: boolean; + isTaggedAndCursed: boolean; + wavesBotAmount: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notes/INoteActionData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notes/INoteActionData.d.ts new file mode 100644 index 0000000..610657f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notes/INoteActionData.d.ts @@ -0,0 +1,10 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface INoteActionData extends IBaseInteractionRequestData { + Action: string; + index: number; + note: INote; +} +export interface INote { + Time: number; + Text: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notifier/INotifier.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notifier/INotifier.d.ts new file mode 100644 index 0000000..8c48260 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notifier/INotifier.d.ts @@ -0,0 +1,14 @@ +export interface INotifierChannel { + "server": string; + "channel_id": string; + "url": string; + "notifierServer": string; + "ws": string; +} +import { Message } from "../profile/IAkiProfile"; +export interface INotification { + type: "RagfairOfferSold" | "new_message" | "ping"; + eventId: string; + dialogId?: string; + message?: Message; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts new file mode 100644 index 0000000..2bc3d1e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISelectProfileRequestData { + uid: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts new file mode 100644 index 0000000..dcd14a2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts @@ -0,0 +1,21 @@ +import { Skills } from "../common/IPmcData"; +export interface IPlayerIncrementSkillLevelRequestData { + _id: string; + experience: number; + quests: any[]; + ragFairOffers: any[]; + builds: any[]; + items: Items; + production: Production; + skills: Skills; + traderRelations: TraderRelations; +} +export interface Items { + new: any[]; + change: any[]; + del: any[]; +} +export interface Production { +} +export interface TraderRelations { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts new file mode 100644 index 0000000..99c61f1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts @@ -0,0 +1,25 @@ +export interface IPresetBuildActionRequestData { + Action: string; + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Item { + _id: string; + _tpl: string; + upd?: Upd; + parentId?: string; + slotId?: string; +} +export interface Upd { + Repairable: Repairable; + FireMode: FireMode; +} +export interface Repairable { + MaxDurability: number; + Durability: number; +} +export interface FireMode { + FireMode: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IAkiProfile.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IAkiProfile.d.ts new file mode 100644 index 0000000..3e0b319 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IAkiProfile.d.ts @@ -0,0 +1,167 @@ +import { MessageType } from "../../enums/MessageType"; +import { IPmcData } from "../common/IPmcData"; +import { Item } from "../common/tables/IItem"; +export interface IAkiProfile { + info: Info; + characters: Characters; + suits: string[]; + weaponbuilds: WeaponBuild[]; + dialogues: Record; + aki: Aki; + vitality: Vitality; + inraid: Inraid; + insurance: Insurance[]; +} +export interface Info { + id: string; + username: string; + password: string; + wipe: boolean; + edition: string; +} +export interface Characters { + pmc: IPmcData; + scav: IPmcData; +} +export interface WeaponBuild { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Dialogue { + _id: string; + messages: Message[]; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface DialogueInfo { + _id: string; + type: MessageType; + message: MessagePreview; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface Message { + _id: string; + uid: string; + type: MessageType; + dt: number; + localDateTime: number; + UtcDateTime?: number; + Member?: IUpdatableChatMember; + templateId: string; + text?: string; + hasRewards: boolean; + rewardCollected: boolean; + items: Items; + maxStorageTime?: number; + systemData?: ISystemData; +} +export interface MessagePreview { + uid: string; + type: MessageType; + dt: number; + templateId: string; + text?: string; +} +export interface Items { + stash?: string; + data?: Item[]; +} +export interface ISystemData { + date?: string; + time?: string; + location?: string; + buyerNickname?: string; + soldItem?: string; + itemCount?: number; +} +export interface IUpdatableChatMember { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; + Ignored: boolean; + Banned: boolean; +} +export interface DateTime { + date: string; + time: string; +} +export interface Aki { + version: string; +} +export interface Vitality { + health: Health; + effects: Effects; +} +export interface Health { + Hydration: number; + Energy: number; + Temperature: number; + Head: number; + Chest: number; + Stomach: number; + LeftArm: number; + RightArm: number; + LeftLeg: number; + RightLeg: number; +} +export interface Effects { + Head: Head; + Chest: Chest; + Stomach: Stomach; + LeftArm: LeftArm; + RightArm: RightArm; + LeftLeg: LeftLeg; + RightLeg: RightLeg; +} +export interface Head { +} +export interface Chest { +} +export interface Stomach { +} +export interface LeftArm { + Fracture?: number; +} +export interface RightArm { + Fracture?: number; +} +export interface LeftLeg { + Fracture?: number; +} +export interface RightLeg { + Fracture?: number; +} +export interface Inraid { + location: string; + character: string; +} +export interface Insurance { + scheduledTime: number; + traderId: string; + messageContent: MessageContent; + items: Item[]; +} +export interface MessageContent { + ragfair?: MessageContentRagfair; + text?: string; + templateId: string; + type: MessageType; + maxStorageTime?: number; + systemData?: MessageContentData; +} +export interface MessageContentRagfair { + offerId: string; + count: number; + handbookId: string; +} +export interface MessageContentData { + date: string; + time: string; + location: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts new file mode 100644 index 0000000..4a61196 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeNicknameRequestData { + nickname: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts new file mode 100644 index 0000000..91058ce --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeVoiceRequestData { + voice: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileCreateRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileCreateRequestData.d.ts new file mode 100644 index 0000000..93cc656 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IProfileCreateRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IProfileCreateRequestData { + side: string; + nickname: string; + headId: string; + voiceId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/ISearchFriendRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/ISearchFriendRequestData.d.ts new file mode 100644 index 0000000..e63e386 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/ISearchFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISearchFriendRequestData { + nickname: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/ISearchFriendResponse.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/ISearchFriendResponse.d.ts new file mode 100644 index 0000000..96d88b2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/ISearchFriendResponse.d.ts @@ -0,0 +1,9 @@ +export interface ISearchFriendResponse { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts new file mode 100644 index 0000000..9cca7e7 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IValidateNicknameRequestData { + nickname: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts new file mode 100644 index 0000000..0e4821a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IAcceptQuestRequestData { + Action: "QuestAccept"; + qid: string; + type: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts new file mode 100644 index 0000000..cc67404 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface ICompleteQuestRequestData { + Action: string; + qid: string; + removeExcessItems: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts new file mode 100644 index 0000000..63f10a8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHandoverQuestRequestData { + Action: "QuestHandover"; + qid: string; + conditionId: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IListQuestsRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IListQuestsRequestData.d.ts new file mode 100644 index 0000000..91f0b8c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IListQuestsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IListQuestsRequestData { + completed: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts new file mode 100644 index 0000000..015f58e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts @@ -0,0 +1,4 @@ +export interface IRepeatableQuestChangeRequest { + Action: "RepeatableQuestChange"; + qid: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts new file mode 100644 index 0000000..465ee02 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IAddOfferRequestData { + Action: string; + sellInOnePiece: boolean; + items: string[]; + requirements: Requirement[]; +} +export interface Requirement { + _tpl: string; + count: number; + level: number; + side: number; + onlyFunctional: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts new file mode 100644 index 0000000..2a4a876 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IExtendOfferRequestData { + offerId: string; + renewalTime: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts new file mode 100644 index 0000000..676322a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts @@ -0,0 +1,5 @@ +export interface IGetItemPriceResult { + avg: number; + min: number; + max: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts new file mode 100644 index 0000000..00f8f17 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMarketPriceRequestData { + templateId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetOffersResult.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetOffersResult.d.ts new file mode 100644 index 0000000..1c11422 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IGetOffersResult.d.ts @@ -0,0 +1,7 @@ +import { IRagfairOffer } from "./IRagfairOffer"; +export interface IGetOffersResult { + categories: Record; + offers: IRagfairOffer[]; + offersCount: number; + selectedCategory: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IRagfairOffer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IRagfairOffer.d.ts new file mode 100644 index 0000000..63f655e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IRagfairOffer.d.ts @@ -0,0 +1,42 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +import { Item } from "../common/tables/IItem"; +export interface IRagfairOffer { + sellResult?: SellResult[]; + _id: string; + items: Item[]; + requirements: OfferRequirement[]; + root: string; + intId: number; + itemsCost: number; + requirementsCost: number; + startTime: number; + endTime: number; + sellInOnePiece: boolean; + name?: string; + shortName?: string; + loyaltyLevel: number; + locked: boolean; + unlimitedCount: boolean; + summaryCost: number; + user: IRagfairOfferUser; + notAvailable: boolean; + CurrentItemCount: number; + priority: boolean; +} +export interface OfferRequirement { + _tpl: string; + count: number; + onlyFunctional: boolean; +} +export interface IRagfairOfferUser { + id: string; + nickname: string; + rating: number; + memberType: MemberCategory; + avatar: string; + isRatingGrowing: boolean; +} +export interface SellResult { + sellTime: number; + amount: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts new file mode 100644 index 0000000..d926615 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IRemoveOfferRequestData { + Action: string; + offerId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/ISearchRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/ISearchRequestData.d.ts new file mode 100644 index 0000000..08e7fd3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/ragfair/ISearchRequestData.d.ts @@ -0,0 +1,32 @@ +export interface ISearchRequestData { + page: number; + limit: number; + sortType: number; + sortDirection: number; + currency: number; + priceFrom: number; + priceTo: number; + quantityFrom: number; + quantityTo: number; + conditionFrom: number; + conditionTo: number; + oneHourExpiration: boolean; + removeBartering: boolean; + offerOwnerType: OfferOwnerType; + onlyFunctional: boolean; + updateOfferCount: boolean; + handbookId: string; + linkedSearchId: string; + neededSearchId: string; + buildItems: BuildItems; + buildCount: number; + tm: number; + reload: number; +} +export declare enum OfferOwnerType { + ANYOWNERTYPE = 0, + TRADEROWNERTYPE = 1, + PLAYEROWNERTYPE = 2 +} +export interface BuildItems { +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e645fb3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts @@ -0,0 +1,3 @@ +export interface IBaseRepairActionDataRequest { + Action: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/IRepairActionDataRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/IRepairActionDataRequest.d.ts new file mode 100644 index 0000000..263d400 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/IRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface IRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "Repair"; + repairKitsInfo: RepairKitsInfo[]; + target: string; +} +export interface RepairKitsInfo { + _id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e3d469d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface ITraderRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "TraderRepair"; + tid: string; + repairItems: RepairItem[]; +} +export interface RepairItem { + _id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts new file mode 100644 index 0000000..a9ef757 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IProcessBaseTradeRequestData { + Action: string; + type: string; + tid: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts new file mode 100644 index 0000000..a9e4c17 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts @@ -0,0 +1,14 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData { + Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | ""; + type: string; + tid: string; + item_id: string; + count: number; + scheme_id: number; + scheme_items: SchemeItem[]; +} +export interface SchemeItem { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts new file mode 100644 index 0000000..889dfd1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IProcessRagfairTradeRequestData { + Action: string; + offers: Offer[]; +} +export interface Offer { + id: string; + count: number; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts new file mode 100644 index 0000000..f1d555f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts @@ -0,0 +1,12 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessSellTradeRequestData extends IProcessBaseTradeRequestData { + Action: "sell_to_trader"; + type: string; + tid: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; + scheme_id: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/weather/IWeatherData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/weather/IWeatherData.d.ts new file mode 100644 index 0000000..ecc96ce --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/weather/IWeatherData.d.ts @@ -0,0 +1,20 @@ +export interface IWeatherData { + acceleration: number; + time: string; + date: string; + weather: IWeather; +} +export interface IWeather { + pressure: number; + temp: number; + fog: string; + rain_intensity: number; + rain: any; + wind_gustiness: number; + wind_direction: any; + wind_speed: number; + cloud: number; + time: string; + date: string; + timestamp: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/wishlist/IWishlistActionData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/wishlist/IWishlistActionData.d.ts new file mode 100644 index 0000000..9217864 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/eft/wishlist/IWishlistActionData.d.ts @@ -0,0 +1,4 @@ +export interface IWishlistActionData { + Action: string; + templateId: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/BaseClasses.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/BaseClasses.d.ts new file mode 100644 index 0000000..e733bca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/BaseClasses.d.ts @@ -0,0 +1,84 @@ +export declare enum BaseClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMOR = "5448e54d4bdc2dcc718b4568", + VEST = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/ConfigTypes.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/ConfigTypes.d.ts new file mode 100644 index 0000000..6bd31e8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/ConfigTypes.d.ts @@ -0,0 +1,18 @@ +export declare enum ConfigTypes { + AIRDROP = "aki-airdrop", + BOT = "aki-bot", + CORE = "aki-core", + HEALTH = "aki-health", + HIDEOUT = "aki-hideout", + HTTP = "aki-http", + IN_RAID = "aki-inraid", + INSURANCE = "aki-insurance", + INVENTORY = "aki-inventory", + LOCATION = "aki-location", + MATCH = "aki-match", + QUEST = "aki-quest", + RAGFAIR = "aki-ragfair", + REPAIR = "aki-repair", + TRADER = "aki-trader", + WEATHER = "aki-weather" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/ELocationName.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/ELocationName.d.ts new file mode 100644 index 0000000..b56cc08 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/ELocationName.d.ts @@ -0,0 +1,11 @@ +export declare enum ELocationName { + FACTORY_DAY = "factory4_day", + BIGMAP = "bigmap", + WOODS = "Woods", + SHORELINE = "Shoreline", + INTERCHANGE = "Interchange", + LIGHTHOUSE = "Lighthouse", + LABORATORY = "laboratory", + RESERVE = "RezervBase", + ANY = "any" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/EquipmentSlots.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/EquipmentSlots.d.ts new file mode 100644 index 0000000..35c18ff --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/EquipmentSlots.d.ts @@ -0,0 +1,16 @@ +export declare enum EquipmentSlots { + HEADWEAR = "Headwear", + EARPIECE = "Earpiece", + FACE_COVER = "FaceCover", + ARMOR_VEST = "ArmorVest", + EYEWEAR = "Eyewear", + ARM_BAND = "ArmBand", + TACTICAL_VEST = "TacticalVest", + POCKETS = "Pockets", + BACKPACK = "Backpack", + SECURED_CONTAINER = "SecuredContainer", + FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", + SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", + HOLSTER = "Holster", + SCABBARD = "Scabbard" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/HideoutAreas.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/HideoutAreas.d.ts new file mode 100644 index 0000000..b44a20a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/HideoutAreas.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreas { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/MemberCategory.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/MessageType.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/MessageType.d.ts new file mode 100644 index 0000000..1b0c649 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/MessageType.d.ts @@ -0,0 +1,16 @@ +export declare enum MessageType { + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14 +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/Money.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/Money.d.ts new file mode 100644 index 0000000..0d39613 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/Money.d.ts @@ -0,0 +1,5 @@ +export declare enum Money { + ROUBLES = "5449016a4bdc2d6f028b456f", + EUROS = "569668774bdc2da2298b4568", + DOLLARS = "5696686a4bdc2da3298b456a" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/Traders.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/Traders.d.ts new file mode 100644 index 0000000..163cd71 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/enums/Traders.d.ts @@ -0,0 +1,10 @@ +export declare enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/external/mod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/external/mod.d.ts new file mode 100644 index 0000000..ecef460 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/external/mod.d.ts @@ -0,0 +1,5 @@ +import { DependencyContainer } from "./tsyringe"; +export interface IMod { + load: (container: DependencyContainer) => void; + delayedLoad: (container: DependencyContainer) => void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/external/tsyringe.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/external/tsyringe.d.ts new file mode 100644 index 0000000..56a7e58 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/external/tsyringe.d.ts @@ -0,0 +1,2 @@ +import type { DependencyContainer } from "tsyringe"; +export type { DependencyContainer }; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/bindings/Route.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/bindings/Route.d.ts new file mode 100644 index 0000000..1b29d7d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/bindings/Route.d.ts @@ -0,0 +1,3 @@ +export interface IRoute { + aki: any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IBotCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IBotCallbacks.d.ts new file mode 100644 index 0000000..2c42813 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IBotCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface IBotCallbacks { + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IBundleCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IBundleCallbacks.d.ts new file mode 100644 index 0000000..7e37c6e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IBundleCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IBundleCallbacks { + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts new file mode 100644 index 0000000..d10027f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IBuyClothingRequestData } from "../../eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../../eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISuit } from "../../eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface ICustomizationCallbacks { + getSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + getTraderSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IDataCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IDataCallbacks.d.ts new file mode 100644 index 0000000..a098560 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IDataCallbacks.d.ts @@ -0,0 +1,26 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGlobals } from "../../eft/common/IGlobals"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../server/ILocaleBase"; +import { ISettingsBase } from "../server/ISettingsBase"; +export interface IDataCallbacks { + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts new file mode 100644 index 0000000..fe2115a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts @@ -0,0 +1,34 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetMailDialogViewRequestData } from "../../eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogInfoRequestData } from "../../eft/dialog/IGetMailDialogInfoRequestData"; +import { IRemoveDialogRequestData } from "../../eft/dialog/IRemoveDialogRequestData"; +import { IGetMailDialogListRequestData } from "../../eft/dialog/IGetMailDialogListRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../../eft/dialog/IFriendRequestData"; +import { IPinDialogRequestData } from "../../eft/dialog/IPinDialogRequestData"; +import { ISetDialogReadRequestData } from "../../eft/dialog/ISetDialogReadRequestData"; +import { IGetAllAttachmentsRequestData } from "../../eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetChatServerListRequestData } from "../../eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../../eft/dialog/IGetFriendListDataResponse"; +import { ISendMessageRequest } from "../../eft/dialog/ISendMessageRequest"; +import { IGetMailDialogViewResponseData } from "../../eft/dialog/IGetMailDialogViewResponseData"; +import { IGetAllAttachmentsResponse } from "../../eft/dialog/IGetAllAttachmentsResponse"; +import { DialogueInfo } from "../../eft/profile/IAkiProfile"; +export interface IDialogueCallbacks { + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IGameCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IGameCallbacks.d.ts new file mode 100644 index 0000000..38ebc5f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IGameCallbacks.d.ts @@ -0,0 +1,16 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGameEmptyCrcRequestData } from "../../eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../../eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGameConfigResponse } from "../../eft/game/IGameConfigResponse"; +export interface IGameCallbacks { + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts new file mode 100644 index 0000000..5857a3e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IHandbookCallbacks { + load(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHealthCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHealthCallbacks.d.ts new file mode 100644 index 0000000..d238c7a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHealthCallbacks.d.ts @@ -0,0 +1,13 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { ISyncHealthRequestData } from "../../eft/health/ISyncHealthRequestData"; +import { IOffraidEatRequestData } from "../../eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../../eft/health/IOffraidHealRequestData"; +import { IHealthTreatmentRequestData } from "../../eft/health/IHealthTreatmentRequestData"; +export interface IHealthCallbacks { + onLoad(sessionID: string): IAkiProfile; + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): any; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): any; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): any; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts new file mode 100644 index 0000000..e9badb6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts @@ -0,0 +1,23 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IHideoutUpgradeRequestData } from "../../eft/hideout/IHideoutUpgradeRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../../eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutScavCaseStartRequestData } from "../../eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutPutItemInRequestData } from "../../eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutTakeItemOutRequestData } from "../../eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutToggleAreaRequestData } from "../../eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../../eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../../eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../../eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IHideoutCallbacks { + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHttpCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHttpCallbacks.d.ts new file mode 100644 index 0000000..3ecd945 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IHttpCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IHttpCallbacks { + load(): void; + sendImage(sessionID: string, req: any, resp: any, body: any): void; + getImage(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInraidCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInraidCallbacks.d.ts new file mode 100644 index 0000000..e959b98 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInraidCallbacks.d.ts @@ -0,0 +1,14 @@ +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IRegisterPlayerRequestData } from "../../eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../../eft/inRaid/ISaveProgressRequestData"; +export interface IInraidCallbacks { + onLoad(sessionID: string): IAkiProfile; + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts new file mode 100644 index 0000000..082112d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IGetInsuranceCostRequestData } from "../../eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../../eft/insurance/IInsureRequestData"; +export interface IInsuranceCallbacks { + onLoad(sessionID: string): IAkiProfile; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): any; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): any; + update(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts new file mode 100644 index 0000000..e53f7d0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IInventoryFoldRequestData } from "../../eft/inventory/IInventoryFoldRequestData"; +import { IInventorySplitRequestData } from "../../eft/inventory/IInventorySplitRequestData"; +import { IInventoryMoveRequestData } from "../../eft/inventory/IInventoryMoveRequestData"; +import { IInventoryMergeRequestData } from "../../eft/inventory/IInventoryMergeRequestData"; +import { IInventoryRemoveRequestData } from "../../eft/inventory/IInventoryRemoveRequestData"; +import { IInventoryTransferRequestData } from "../../eft/inventory/IInventoryTransferRequestData"; +import { IInventorySwapRequestData } from "../../eft/inventory/IInventorySwapRequestData"; +import { IInventoryToggleRequestData } from "../../eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTagRequestData } from "../../eft/inventory/IInventoryTagRequestData"; +import { IInventoryBindRequestData } from "../../eft/inventory/IInventoryBindRequestData"; +import { IInventoryExamineRequestData } from "../../eft/inventory/IInventoryExamineRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../../eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventorySortRequestData } from "../../eft/inventory/IInventorySortRequestData"; +import { IInventoryCreateMarkerRequestData } from "../../eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../../eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../../eft/inventory/IInventoryEditMarkerRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IInventoryCallbacks { + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts new file mode 100644 index 0000000..59db771 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts @@ -0,0 +1,6 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../../eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IItemEventCallbacks { + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts new file mode 100644 index 0000000..52dfec6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts @@ -0,0 +1,20 @@ +import { IRegisterData } from "../../eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../../eft/launcher/IRemoveProfileData"; +import { ILoginRequestData } from "../../eft/launcher/ILoginRequestData"; +import { IChangeRequestData } from "../../eft/launcher/IChangeRequestData"; +import { IGetMiniProfileRequestData } from "../../eft/launcher/IGetMiniProfileRequestData.js"; +export interface ILauncherCallbacks { + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; + getServerVersion(): string; + ping(url: string, info: any, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ILocationCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ILocationCallbacks.d.ts new file mode 100644 index 0000000..71656a4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ILocationCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IGetLocationRequestData } from "../../eft/location/IGetLocationRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILocationsGenerateAllResponse } from "../../eft/common/ILocationsSourceDestinationBase"; +import { ILocationBase } from "../../eft/common/ILocationBase"; +export interface ILocationCallbacks { + getLocationData(url: string, info: any, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IMatchCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IMatchCallbacks.d.ts new file mode 100644 index 0000000..fcbf173 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IMatchCallbacks.d.ts @@ -0,0 +1,25 @@ +import { IStartOfflineRaidRequestData } from "../../eft/match/IStartOffineRaidRequestData"; +import { IEndOfflineRaidRequestData } from "../../eft/match/IEndOfflineRaidRequestData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IPmcData } from "../../eft/common/IPmcData"; +export interface IMatchCallbacks { + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: any, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IModCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IModCallbacks.d.ts new file mode 100644 index 0000000..1a4cd7b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IModCallbacks.d.ts @@ -0,0 +1,6 @@ +export interface IModCallbacks { + load(): void; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/INoteCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/INoteCallbacks.d.ts new file mode 100644 index 0000000..8453a4f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/INoteCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { INoteActionData } from "../../eft/notes/INoteActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface INoteCallbacks { + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/INotifierCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/INotifierCallbacks.d.ts new file mode 100644 index 0000000..a211310 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/INotifierCallbacks.d.ts @@ -0,0 +1,17 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../../eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../../eft/notifier/ISelectProfileRequestData"; +export interface INotifierCallbacks { + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(sessionID: string, req: any, resp: any, data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts new file mode 100644 index 0000000..97c6487 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IPresetBuildActionRequestData } from "../../eft/presetBuild/IPresetBuildActionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { WeaponBuild } from "../../eft/profile/IAkiProfile"; +export interface IPresetBuildCallbacks { + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IPresetCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IPresetCallbacks.d.ts new file mode 100644 index 0000000..4169857 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IPresetCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IPresetCallbacks { + load(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IProfileCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IProfileCallbacks.d.ts new file mode 100644 index 0000000..9d4d2df --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IProfileCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IProfileChangeNicknameRequestData } from "../../eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../../eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../../eft/profile/IProfileCreateRequestData"; +import { IValidateNicknameRequestData } from "../../eft/profile/IValidateNicknameRequestData"; +import { ISearchFriendRequestData } from "../../eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../../eft/profile/ISearchFriendResponse"; +export interface IProfileCallbacks { + onLoad(sessionID: string): any; + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IQuestCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IQuestCallbacks.d.ts new file mode 100644 index 0000000..1c4d0c3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IQuestCallbacks.d.ts @@ -0,0 +1,19 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAcceptQuestRequestData } from "../../eft/quests/IAcceptQuestRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IListQuestsRequestData } from "../../eft/quests/IListQuestsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { ICompleteQuestRequestData } from "../../eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../../eft/quests/IHandoverQuestRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../../eft/common/tables/IRepeatableQuests"; +import { IRepeatableQuestChangeRequest } from "../../eft/quests/IRepeatableQuestChangeRequest"; +export interface IQuestCallbacks { + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts new file mode 100644 index 0000000..9282bd4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISearchRequestData } from "../../eft/ragfair/ISearchRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetMarketPriceRequestData } from "../../eft/ragfair/IGetMarketPriceRequestData"; +import { IAddOfferRequestData } from "../../eft/ragfair/IAddOfferRequestData"; +import { IRemoveOfferRequestData } from "../../eft/ragfair/IRemoveOfferRequestData"; +import { IExtendOfferRequestData } from "../../eft/ragfair/IExtendOfferRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetItemPriceResult } from "../../eft/ragfair/IGetItemPriceResult"; +export interface IRagfairCallbacks { + load(): void; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; + updatePlayer(timeSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IRepairCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IRepairCallbacks.d.ts new file mode 100644 index 0000000..e8183c9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IRepairCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../../eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../../eft/repair/ITraderRepairActionDataRequest"; +export interface IRepairCallbacks { + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ISaveCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ISaveCallbacks.d.ts new file mode 100644 index 0000000..1ad3b82 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ISaveCallbacks.d.ts @@ -0,0 +1,4 @@ +export interface ISaveCallbacks { + load(): void; + update(secondsSinceLastRun: number): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ITradeCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ITradeCallbacks.d.ts new file mode 100644 index 0000000..2f41d54 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ITradeCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../../eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../../eft/trade/IProcessBaseTradeRequestData"; +export interface ITradeCallbacks { + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ITraderCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ITraderCallbacks.d.ts new file mode 100644 index 0000000..e0d7d06 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/ITraderCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../../eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface ITraderCallbacks { + load(): void; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts new file mode 100644 index 0000000..9ac72ae --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts @@ -0,0 +1,5 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +export interface IWeatherCallbacks { + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts new file mode 100644 index 0000000..e5d519c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IWishlistActionData } from "../../eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IWishlistCallbacks { + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IAirdropConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IAirdropConfig.d.ts new file mode 100644 index 0000000..f4aee89 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IAirdropConfig.d.ts @@ -0,0 +1,20 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IAirdropConfig extends IBaseConfig { + kind: "aki-airdrop"; + airdropChancePercent: AirdropChancePercent; + airdropMinOpenHeight: number; + airdropMaxOpenHeight: number; + planeMinFlyHeight: number; + planeMaxFlyHeight: number; + planeVolume: number; + airdropMinStartTimeSeconds: number; + airdropMaxStartTimeSeconds: number; +} +export interface AirdropChancePercent { + bigmap: number; + woods: number; + lighthouse: number; + shoreline: number; + interchange: number; + reserve: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IBaseConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IBaseConfig.d.ts new file mode 100644 index 0000000..8b6ba88 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IBaseConfig.d.ts @@ -0,0 +1,3 @@ +export interface IBaseConfig { + kind: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IBotConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IBotConfig.d.ts new file mode 100644 index 0000000..5fb9d93 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IBotConfig.d.ts @@ -0,0 +1,114 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IBotConfig extends IBaseConfig { + kind: "aki-bot"; + presetBatch: PresetBatch; + bosses: string[]; + durability: Durability; + lootNValue: LootNvalue; + revenge: Record; + pmc: PmcConfig; + showTypeInNickname: boolean; + maxBotCap: number; +} +export interface PresetBatch { + assault: number; + bossBully: number; + bossGluhar: number; + bossKilla: number; + bossKojaniy: number; + bossSanitar: number; + bossTagilla: number; + bossTest: number; + cursedAssault: number; + followerBully: number; + followerGluharAssault: number; + followerGluharScout: number; + followerGluharSecurity: number; + followerGluharSnipe: number; + followerKojaniy: number; + followerSanitar: number; + followerTagilla: number; + followerTest: number; + marksman: number; + pmcBot: number; + sectantPriest: number; + sectantWarrior: number; + gifter: number; + test: number; + exUsec: number; +} +export interface Durability { + default: DefaultDurability; + pmc: PmcDurability; + boss: BotDurability; + follower: BotDurability; + assault: BotDurability; + cursedassault: BotDurability; + marksman: BotDurability; + pmcbot: BotDurability; + exusec: BotDurability; + sectantpriest: BotDurability; + sectantwarrior: BotDurability; +} +export interface DefaultDurability { + armor: DefaultArmor; + weapon: WeaponDurability; +} +export interface DefaultArmor { + maxDelta: number; + minDelta: number; +} +export interface WeaponDurability { + lowestMax: number; + highestMax: number; + maxDelta: number; + minDelta: number; +} +export interface PmcDurability { + armor: PmcDurabilityArmor; + weapon: WeaponDurability; +} +export interface PmcDurabilityArmor { + lowestMaxPercent: number; + highestMaxPercent: number; + maxDelta: number; + minDelta: number; +} +export interface BotDurability { + armor: ArmorDurability; + weapon: WeaponDurability; +} +export interface ArmorDurability { + maxDelta: number; + minDelta: number; +} +export interface LootNvalue { + scav: number; + pmc: number; +} +export interface PmcConfig { + dynamicLoot: DynamicLoot; + cartridgeBlacklist: string[]; + difficulty: string; + isUsec: number; + chanceSameSideIsHostilePercent: number; + usecType: string; + bearType: string; + maxBackpackLootTotalRub: number; + maxPocketLootTotalRub: number; + maxVestLootTotalRub: number; + types: Types; + enemyTypes: string[]; +} +export interface DynamicLoot { + whitelist: string[]; + blacklist: string[]; + spawnLimits: Record; + moneyStackLimits: Record; +} +export interface Types { + assault: number; + cursedAssault: number; + pmcBot: number; + exUsec: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ICoreConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ICoreConfig.d.ts new file mode 100644 index 0000000..cfcaf61 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ICoreConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ICoreConfig extends IBaseConfig { + kind: "aki-core"; + akiVersion: string; + projectName: string; + compatibleTarkovVersion: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHealthConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHealthConfig.d.ts new file mode 100644 index 0000000..fdbf656 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHealthConfig.d.ts @@ -0,0 +1,14 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHealthConfig extends IBaseConfig { + kind: "aki-health"; + healthMultipliers: HealthMultipliers; + save: Save; +} +export interface HealthMultipliers { + death: number; + blacked: number; +} +export interface Save { + health: boolean; + effects: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHideoutConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHideoutConfig.d.ts new file mode 100644 index 0000000..4658fa6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHideoutConfig.d.ts @@ -0,0 +1,27 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHideoutConfig extends IBaseConfig { + kind: "aki-hideout"; + runIntervalSeconds: number; + scavCase: ScavCase; + fuelDrainRateMultipler: number; +} +export interface ScavCase { + rewardParentBlacklist: string[]; + rewardItemBlacklist: any[]; + ammoRewards: AmmoRewards; + moneyRewards: MoneyRewards; +} +export interface AmmoRewards { + giveMultipleOfTen: boolean; + minAmount: number; +} +export interface MoneyRewards { + enabled: boolean; + rub: MinMax; + usd: MinMax; + eur: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHttpConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHttpConfig.d.ts new file mode 100644 index 0000000..c41d035 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IHttpConfig.d.ts @@ -0,0 +1,6 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHttpConfig extends IBaseConfig { + kind: "aki-http"; + ip: string; + port: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInRaidConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInRaidConfig.d.ts new file mode 100644 index 0000000..baaf083 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInRaidConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInRaidConfig extends IBaseConfig { + kind: "aki-inraid"; + MIAOnRaidEnd: boolean; + raidMenuSettings: RaidMenuSettings; + save: Save; + carExtracts: string[]; + carExtractBaseStandingGain: number; + scavExtractGain: number; +} +export interface RaidMenuSettings { + aiAmount: string; + aiDifficulty: string; + bossEnabled: boolean; + scavWars: boolean; + taggedAndCursed: boolean; +} +export interface Save { + loot: boolean; + durability: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInsuranceConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInsuranceConfig.d.ts new file mode 100644 index 0000000..6e9c744 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInsuranceConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInsuranceConfig extends IBaseConfig { + kind: "aki-insurance"; + insuranceMultiplier: Record; + returnChancePercent: Record; + runIntervalSeconds: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInventoryConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInventoryConfig.d.ts new file mode 100644 index 0000000..ffffa41 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IInventoryConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInventoryConfig extends IBaseConfig { + kind: "aki-inventory"; + newItemsMarkedFound: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ILocationConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ILocationConfig.d.ts new file mode 100644 index 0000000..0551d57 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ILocationConfig.d.ts @@ -0,0 +1,24 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ILocationConfig extends IBaseConfig { + kind: "aki-location"; + looseLootMultiplier: LootMultiplier; + staticLootMultiplier: LootMultiplier; +} +export interface LootMultiplier { + bigmap: number; + develop: number; + factory4_day: number; + factory4_night: number; + interchange: number; + laboratory: number; + rezervbase: number; + shoreline: number; + woods: number; + hideout: number; + lighthouse: number; + privatearea: number; + suburbs: number; + tarkovstreets: number; + terminal: number; + town: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IMatchConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IMatchConfig.d.ts new file mode 100644 index 0000000..92c4d77 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IMatchConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IMatchConfig extends IBaseConfig { + kind: "aki-match"; + enabled: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IQuestConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IQuestConfig.d.ts new file mode 100644 index 0000000..be4a97b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IQuestConfig.d.ts @@ -0,0 +1,77 @@ +import { ELocationName } from "../../enums/ELocationName"; +import { IBaseConfig } from "./IBaseConfig"; +export interface IQuestConfig extends IBaseConfig { + kind: "aki-quest"; + redeemTime: number; + repeatableQuests: IRepeatableQuestConfig[]; +} +export interface IRepeatableQuestConfig { + name: string; + types: string[]; + resetTime: number; + numQuests: number; + minPlayerLevel: number; + rewardScaling: IRewardScaling; + locations: Record; + traderWhitelist: ITraderWhitelist[]; + questConfig: IQuestConfig; +} +export interface IRewardScaling { + levels: number[]; + experience: number[]; + roubles: number[]; + items: number[]; + reputation: number[]; + rewardSpread: number; +} +export interface ITraderWhitelist { + traderId: string; + questTypes: string[]; +} +export interface IQuestConfig { + Exploration: IExploration; + Completion: ICompletion; + Elimination: IElimination; +} +export interface IExploration { + maxExtracts: number; + specificExits: ISpecificExits; +} +export interface ISpecificExits { + probability: number; + passageRequirementWhitelist: string[]; +} +export interface ICompletion { + minRequestedAmount: number; + maxRequestedAmount: number; + minRequestedBulletAmount: number; + maxRequestedBulletAmount: number; + useWhitelist: boolean; + useBlacklist: boolean; +} +export interface IElimination { + targets: ITarget[]; + bodyPartProb: number; + bodyParts: IBodyPart[]; + specificLocationProb: number; + distLocationBlacklist: string[]; + distProb: number; + maxDist: number; + minDist: number; + maxKills: number; + minKills: number; +} +export interface IProbabilityObject { + key: string; + relativeProbability: number; + data?: any; +} +export interface ITarget extends IProbabilityObject { + data: IBossInfo; +} +export interface IBossInfo { + isBoss: boolean; +} +export interface IBodyPart extends IProbabilityObject { + data: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IRagfairConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IRagfairConfig.d.ts new file mode 100644 index 0000000..2d151ca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IRagfairConfig.d.ts @@ -0,0 +1,59 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRagfairConfig extends IBaseConfig { + kind: "aki-ragfair"; + runIntervalSeconds: number; + sell: Sell; + traders: Record; + dynamic: Dynamic; +} +export interface Sell { + fees: boolean; + chance: Chance; + time: Time; + reputation: Reputation; +} +export interface Chance { + base: number; + overprices: number; + underpriced: number; +} +export interface Time { + base: number; + min: number; + max: number; +} +export interface Reputation { + gain: number; + loss: number; +} +export interface Dynamic { + expiredOfferThreshold: number; + offerItemCount: MinMax; + price: MinMax; + endTimeSeconds: MinMax; + condition: Condition; + stackablePercent: MinMax; + nonStackableCount: MinMax; + rating: MinMax; + currencies: Record; + showAsSingleStack: string[]; + blacklist: Blacklist; +} +export interface MinMax { + min: number; + max: number; +} +export interface Condition { + conditionChance: number; + min: number; + max: number; +} +export interface Blacklist { + /** + * show/hide trader items that are blacklisted by bsg + */ + traderItems: boolean; + custom: string[]; + enableBsgList: boolean; + enableQuestList: boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IRepairConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IRepairConfig.d.ts new file mode 100644 index 0000000..4966eb5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IRepairConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRepairConfig extends IBaseConfig { + kind: "aki-repair"; + priceMultiplier: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ITraderConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ITraderConfig.d.ts new file mode 100644 index 0000000..dab73e3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/ITraderConfig.d.ts @@ -0,0 +1,15 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ITraderConfig extends IBaseConfig { + kind: "aki-trader"; + updateTime: UpdateTime[]; + updateTimeDefault: number; + fenceAssortSize: number; + fenceMaxPresetsCount: number; + fencePresetPriceMult: number; + minDurabilityForSale: number; + fenceItemIgnoreList: string[]; +} +export interface UpdateTime { + traderId: string; + seconds: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IWeatherConfig.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IWeatherConfig.d.ts new file mode 100644 index 0000000..c52cab3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/config/IWeatherConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IWeatherConfig extends IBaseConfig { + kind: "aki-weather"; + acceleration: number; + weather: Weather; +} +export interface Weather { + clouds: MinMax; + windSpeed: MinMax; + windDirection: MinMax; + windGustiness: MinMax; + rain: MinMax; + rainIntensity: MinMax; + fog: MinMax; + temp: MinMax; + pressure: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/controllers/IBotController.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/controllers/IBotController.d.ts new file mode 100644 index 0000000..010e208 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/controllers/IBotController.d.ts @@ -0,0 +1,13 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { Difficulty } from "../../eft/common/tables/IBotType"; +export interface IBotController { + getBotLimit(type: string): number; + getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + generate(info: IGenerateBotsRequestData, playerScav: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IBotGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IBotGenerator.d.ts new file mode 100644 index 0000000..f3e8586 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IBotGenerator.d.ts @@ -0,0 +1,10 @@ +import { Inventory as PmcInventory } from "../../eft/common/IPmcData"; +import { Inventory, Chances, Generation } from "../../eft/common/tables/IBotType"; +export interface IBotGenerator { + generateInventory(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; +} +export interface IExhaustableArray { + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/ILocationGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/ILocationGenerator.d.ts new file mode 100644 index 0000000..530ceca --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/ILocationGenerator.d.ts @@ -0,0 +1,6 @@ +import { IStaticContainerProps, IStaticLootDetails, IStaticAmmoDetails, IStaticForcedProps } from "../../eft/common/tables/ILootBase"; +import { ILooseLoot, SpawnpointTemplate } from "../../eft/common/ILooseLoot"; +export interface ILocationGenerator { + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IPMCLootGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IPMCLootGenerator.d.ts new file mode 100644 index 0000000..a9db89b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IPMCLootGenerator.d.ts @@ -0,0 +1,4 @@ +export interface IPMCLootGenerator { + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts new file mode 100644 index 0000000..6670540 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts @@ -0,0 +1,4 @@ +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairAssortGenerator { + getAssortItems(): Item[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts new file mode 100644 index 0000000..30b4be5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts @@ -0,0 +1,6 @@ +import { IBarterScheme } from "../../eft/common/tables/ITrader"; +import { IRagfairOffer } from "../../eft/ragfair/IRagfairOffer"; +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairOfferGenerator { + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece: boolean): IRagfairOffer; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/helpers/Traders.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/helpers/Traders.d.ts new file mode 100644 index 0000000..e935d29 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/helpers/Traders.d.ts @@ -0,0 +1,10 @@ +export declare const enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IMod.d.ts new file mode 100644 index 0000000..e6eec79 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IMod.d.ts @@ -0,0 +1,10 @@ +export declare namespace ModLoader { + interface IMod { + name: string; + version: string; + main?: string; + author?: string; + license: string; + dependencies?: Record; + } +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IModLoader.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IModLoader.d.ts new file mode 100644 index 0000000..40a5e19 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IModLoader.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +export interface IModLoader { + load(container: DependencyContainer): void; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IPackageJsonData.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IPackageJsonData.d.ts new file mode 100644 index 0000000..09472cd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/mod/IPackageJsonData.d.ts @@ -0,0 +1,11 @@ +export interface IPackageJsonData { + incompatibilities?: string[]; + dependencies?: string[]; + name: string; + author: string; + version: string; + akiVersion: string; + licence: string; + main: string; + contributors: string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts new file mode 100644 index 0000000..c7d246a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts @@ -0,0 +1,4 @@ +export interface IRagfairServerPrices { + static: Record; + dynamic: Record; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IDatabaseTables.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IDatabaseTables.d.ts new file mode 100644 index 0000000..dbb71be --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IDatabaseTables.d.ts @@ -0,0 +1,51 @@ +import { IGlobals } from "../../eft/common/IGlobals"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { IBotType } from "../../eft/common/tables/IBotType"; +import { ICustomizationItem } from "../../eft/common/tables/ICustomizationItem"; +import { IHandbookBase } from "../../eft/common/tables/IHandbookBase"; +import { ILootBase } from "../../eft/common/tables/ILootBase"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IRepeatableQuestDatabase } from "../../eft/common/tables/IRepeatableQuests"; +import { ITemplateItem } from "../../eft/common/tables/ITemplateItem"; +import { ITrader } from "../../eft/common/tables/ITrader"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { ILocaleBase } from "./ILocaleBase"; +import { ILocations } from "./ILocations"; +import { IServerBase } from "./IServerBase"; +import { ISettingsBase } from "./ISettingsBase"; +export interface IDatabaseTables { + bots: { + types: Record; + base: IBotBase; + core: IBotCore; + }; + hideout: { + areas: IHideoutArea[]; + production: IHideoutProduction[]; + scavcase: IHideoutScavCase[]; + settings: IHideoutSettingsBase; + }; + locales: ILocaleBase; + locations: ILocations; + loot: ILootBase; + match: any; + templates: { + character: string[]; + items: Record; + quests: IQuest[]; + repeatableQuests: IRepeatableQuestDatabase; + clientItems: Record; + handbook: IHandbookBase; + customization: Record; + profiles: any; + prices: Record; + }; + traders: Record; + globals: IGlobals; + server: IServerBase; + settings: ISettingsBase; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IHttpServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IHttpServer.d.ts new file mode 100644 index 0000000..c828399 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IHttpServer.d.ts @@ -0,0 +1,12 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { INotification } from "../../eft/notifier/INotifier"; +export interface IHttpServer { + load(): void; + getCookies(req: http.IncomingMessage): any; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + sendMessage(sessionID: string, output: INotification): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ILocaleBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ILocaleBase.d.ts new file mode 100644 index 0000000..8887c06 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ILocaleBase.d.ts @@ -0,0 +1,61 @@ +export interface ILocaleBase { + global: Record; + menu: Record; + languages: ILanguageBase[]; +} +export interface ILocaleGlobalBase { + interface: Record; + enum: any[]; + mail: Record; + quest: Record; + preset: Record; + handbook: Record; + season: Record; + customization: Record; + repeatableQuest: Record; + templates: ILocaleTemplateBase; + locations: ILocaleLocationsBase; + banners: ILocaleBannersBase; + trading: ILocaleTradingBase; +} +export interface ILocaleQuest { + name: string; + description: string; + note: string; + failMessageText: string; + startedMessageText: string; + successMessageText: string; + conditions: Record; + location: string; +} +export interface ILocalePreset { + Name: string; +} +export interface ILocaleTemplateBase { + templates: Record; +} +export interface ILocaleLocationsBase { + locations: Record; +} +export interface ILocaleBannersBase { + locations: Record; +} +export interface ILocaleProps { + Name: string; + ShortName: string; + Description: string; +} +export interface ILocaleTradingBase { + locations: Record; +} +export interface ILocaleTradingProps { + FullName: string; + FirstName: string; + Nickname: string; + Location: string; + Description: string; +} +export interface ILanguageBase { + ShortName: string; + Name: string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ILocations.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ILocations.d.ts new file mode 100644 index 0000000..18f0262 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ILocations.d.ts @@ -0,0 +1,26 @@ +import { ILocationBase } from "../../eft/common/ILocationBase"; +import { ILooseLoot } from "../../eft/common/ILooseLoot"; +import { ILocationsBase } from "../../eft/common/tables/ILocationsBase"; +export interface ILocations { + bigmap?: ILocationData; + develop?: ILocationData; + factory4_day?: ILocationData; + factory4_night?: ILocationData; + hideout?: ILocationData; + interchange?: ILocationData; + laboratory?: ILocationData; + lighthouse?: ILocationData; + privatearea?: ILocationData; + rezervbase?: ILocationData; + shoreline?: ILocationData; + suburbs?: ILocationData; + tarkovstreets?: ILocationData; + terminal?: ILocationData; + town?: ILocationData; + woods?: ILocationData; + base?: ILocationsBase; +} +export interface ILocationData { + base: ILocationBase; + looseLoot?: ILooseLoot; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IServerBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IServerBase.d.ts new file mode 100644 index 0000000..d033db3 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/IServerBase.d.ts @@ -0,0 +1,4 @@ +export interface IServerBase { + ip: string; + port: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ISettingsBase.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ISettingsBase.d.ts new file mode 100644 index 0000000..c067cda --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/server/ISettingsBase.d.ts @@ -0,0 +1,43 @@ +export interface ISettingsBase { + config: Config; +} +export interface Config { + AFKTimeoutSeconds: number; + AdditionalRandomDelaySeconds: number; + ClientSendRateLimit: number; + CriticalRetriesCount: number; + DefaultRetriesCount: number; + FirstCycleDelaySeconds: number; + FramerateLimit: FramerateLimit; + GroupStatusInterval: number; + KeepAliveInterval: number; + Mark502and504AsNonImportant: boolean; + MemoryManagementSettings: MemoryManagementSettings; + NVidiaHighlights: boolean; + NextCycleDelaySeconds: number; + PingServerResultSendInterval: number; + PingServersInterval: number; + ReleaseProfiler: ReleaseProfiler; + SecondCycleDelaySeconds: number; + TurnOffLogging: boolean; + WeaponOverlapDistanceCulling: number; + WebDiagnosticsEnabled: boolean; +} +export interface FramerateLimit { + MaxFramerateGameLimit: number; + MaxFramerateLobbyLimit: number; + MinFramerateLimit: number; +} +export interface MemoryManagementSettings { + AggressiveGC: boolean; + GigabytesRequiredToDisableGCDuringRaid: number; + HeapPreAllocationEnabled: boolean; + HeapPreAllocationMB: number; + OverrideRamCleanerSettings: boolean; + RamCleanerEnabled: boolean; +} +export interface ReleaseProfiler { + Enabled: boolean; + MaxRecords: number; + RecordTriggerValue: number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/IAsyncQueue.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/IAsyncQueue.d.ts new file mode 100644 index 0000000..2be801a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/IAsyncQueue.d.ts @@ -0,0 +1,4 @@ +import { ICommand } from "./ICommand"; +export interface IAsyncQueue { + waitFor(command: ICommand): Promise; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/ICommand.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/ICommand.d.ts new file mode 100644 index 0000000..696bb83 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/ICommand.d.ts @@ -0,0 +1,4 @@ +export interface ICommand { + uuid: string; + cmd: () => Promise; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/ILogger.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/ILogger.d.ts new file mode 100644 index 0000000..c983701 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/ILogger.d.ts @@ -0,0 +1,10 @@ +import { Daum } from "../../eft/itemEvent/IItemEventRouterRequest"; +export interface ILogger { + writeToLogFile(data: string | Daum): void; + log(data: string | Record | Error, color: string): void; + error(data: string): void; + warning(data: string): void; + success(data: string): void; + info(data: string): void; + debug(data: string | Record, onlyShowInConsole?: boolean): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/IUuidGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/IUuidGenerator.d.ts new file mode 100644 index 0000000..3870469 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/models/spt/utils/IUuidGenerator.d.ts @@ -0,0 +1,3 @@ +export interface IUUidGenerator { + generate(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/HttpRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/HttpRouter.d.ts new file mode 100644 index 0000000..f75a47d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/HttpRouter.d.ts @@ -0,0 +1,16 @@ +/// +import { IncomingMessage } from "http"; +import { DynamicRouter, Router, StaticRouter } from "../di/Router"; +export declare class HttpRouter { + protected staticRouters: StaticRouter[]; + protected dynamicRoutes: DynamicRouter[]; + constructor(staticRouters: StaticRouter[], dynamicRoutes: DynamicRouter[]); + protected groupBy(list: T[], keyGetter: (t: T) => string): Map; + getResponse(req: IncomingMessage, info: any, sessionID: string): string; + protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean; +} +declare class ResponseWrapper { + output: string; + constructor(output: string); +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/ImageRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/ImageRouter.d.ts new file mode 100644 index 0000000..ab03977 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/ImageRouter.d.ts @@ -0,0 +1,13 @@ +/// +import { IncomingMessage, ServerResponse } from "http"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ImageRouteService } from "../services/mod/image/ImageRouteService"; +import { VFS } from "../utils/VFS"; +export declare class ImageRouter { + protected vfs: VFS; + protected imageRouteService: ImageRouteService; + constructor(vfs: VFS, imageRouteService: ImageRouteService); + addRoute(key: string, valueToAdd: string): void; + sendImage(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any, httpServer: IHttpServer): void; + getImage(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/ItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/ItemEventRouter.d.ts new file mode 100644 index 0000000..b1ac5d9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/ItemEventRouter.d.ts @@ -0,0 +1,17 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { ItemEventRouterDefinition } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class ItemEventRouter { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected profileHelper: ProfileHelper; + protected itemEventRouters: ItemEventRouterDefinition[]; + constructor(logger: ILogger, jsonUtil: JsonUtil, profileHelper: ProfileHelper, itemEventRouters: ItemEventRouterDefinition[]); + protected output: IItemEventRouterResponse; + handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse; + getOutput(sessionID: string): IItemEventRouterResponse; + protected resetOutput(sessionID: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/BotDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/BotDynamicRouter.d.ts new file mode 100644 index 0000000..6d0ab4b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/BotDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BotDynamicRouter extends DynamicRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/BundleDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/BundleDynamicRouter.d.ts new file mode 100644 index 0000000..a765410 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/BundleDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BundleDynamicRouter extends DynamicRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts new file mode 100644 index 0000000..2db7cc5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class CustomizationDynamicRouter extends DynamicRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/DataDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/DataDynamicRouter.d.ts new file mode 100644 index 0000000..836ed8d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/DataDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class DataDynamicRouter extends DynamicRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/HttpDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/HttpDynamicRouter.d.ts new file mode 100644 index 0000000..a152b4d --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/HttpDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter } from "../../di/Router"; +import { ImageRouter } from "../ImageRouter"; +export declare class HttpDynamicRouter extends DynamicRouter { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/InraidDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/InraidDynamicRouter.d.ts new file mode 100644 index 0000000..7c0561f --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/InraidDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class InraidDynamicRouter extends DynamicRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); + getTopLevelRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/LocationDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/LocationDynamicRouter.d.ts new file mode 100644 index 0000000..b8e5cdf --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/LocationDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class LocationDynamicRouter extends DynamicRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); + getTopLevelRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/NotifierDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/NotifierDynamicRouter.d.ts new file mode 100644 index 0000000..83c60c5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/NotifierDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class NotifierDynamicRouter extends DynamicRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/TraderDynamicRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/TraderDynamicRouter.d.ts new file mode 100644 index 0000000..5b7cc1b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/dynamic/TraderDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class TraderDynamicRouter extends DynamicRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/CustomizationItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/CustomizationItemEventRouter.d.ts new file mode 100644 index 0000000..e78445e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/CustomizationItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class CustomizationItemEventRouter extends ItemEventRouterDefinition { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/HealthItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/HealthItemEventRouter.d.ts new file mode 100644 index 0000000..99847c6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/HealthItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HealthItemEventRouter extends ItemEventRouterDefinition { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/HideoutItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/HideoutItemEventRouter.d.ts new file mode 100644 index 0000000..e1e98af --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/HideoutItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HideoutCallbacks } from "../../callbacks/HideoutCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HideoutItemEventRouter extends ItemEventRouterDefinition { + protected hideoutCallbacks: HideoutCallbacks; + constructor(hideoutCallbacks: HideoutCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/InsuranceItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/InsuranceItemEventRouter.d.ts new file mode 100644 index 0000000..a922cc0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/InsuranceItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InsuranceItemEventRouter extends ItemEventRouterDefinition { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/InventoryItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/InventoryItemEventRouter.d.ts new file mode 100644 index 0000000..2619bb9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/InventoryItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InventoryCallbacks } from "../../callbacks/InventoryCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InventoryItemEventRouter extends ItemEventRouterDefinition { + protected inventoryCallbacks: InventoryCallbacks; + constructor(inventoryCallbacks: InventoryCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/NoteItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/NoteItemEventRouter.d.ts new file mode 100644 index 0000000..59bf598 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/NoteItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { NoteCallbacks } from "../../callbacks/NoteCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class NoteItemEventRouter extends ItemEventRouterDefinition { + protected noteCallbacks: NoteCallbacks; + constructor(noteCallbacks: NoteCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts new file mode 100644 index 0000000..277db44 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class PresetBuildItemEventRouter extends ItemEventRouterDefinition { + protected presetBuildCallbacks: PresetBuildCallbacks; + constructor(presetBuildCallbacks: PresetBuildCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/QuestItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/QuestItemEventRouter.d.ts new file mode 100644 index 0000000..db59c25 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/QuestItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class QuestItemEventRouter extends ItemEventRouterDefinition { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/RagfairItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/RagfairItemEventRouter.d.ts new file mode 100644 index 0000000..9216cc5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/RagfairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RagfairItemEventRouter extends ItemEventRouterDefinition { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/RepairItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/RepairItemEventRouter.d.ts new file mode 100644 index 0000000..5196ba9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/RepairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RepairCallbacks } from "../../callbacks/RepairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RepairItemEventRouter extends ItemEventRouterDefinition { + protected repairCallbacks: RepairCallbacks; + constructor(repairCallbacks: RepairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/TradeItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/TradeItemEventRouter.d.ts new file mode 100644 index 0000000..a43bb0a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/TradeItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { TradeCallbacks } from "../../callbacks/TradeCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class TradeItemEventRouter extends ItemEventRouterDefinition { + protected tradeCallbacks: TradeCallbacks; + constructor(tradeCallbacks: TradeCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/WishlistItemEventRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/WishlistItemEventRouter.d.ts new file mode 100644 index 0000000..38497fb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/item_events/WishlistItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { WishlistCallbacks } from "../../callbacks/WishlistCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class WishlistItemEventRouter extends ItemEventRouterDefinition { + protected wishlistCallbacks: WishlistCallbacks; + constructor(wishlistCallbacks: WishlistCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/HealthSaveLoadRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/HealthSaveLoadRouter.d.ts new file mode 100644 index 0000000..114f5b2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/HealthSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class HealthSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/InraidSaveLoadRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/InraidSaveLoadRouter.d.ts new file mode 100644 index 0000000..4c00b40 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/InraidSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InraidSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts new file mode 100644 index 0000000..30ce98e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InsuranceSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts new file mode 100644 index 0000000..16c7619 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class ProfileSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/BundleSerializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/BundleSerializer.d.ts new file mode 100644 index 0000000..912db83 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/BundleSerializer.d.ts @@ -0,0 +1,11 @@ +import { Serializer } from "../../di/Serializer"; +import { BundleLoader } from "../../loaders/BundleLoader"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { ILogger } from "../../models/spt/utils/ILogger"; +export declare class BundleSerializer extends Serializer { + protected logger: ILogger; + protected bundleLoader: BundleLoader; + constructor(logger: ILogger, bundleLoader: BundleLoader); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/ImageSerializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/ImageSerializer.d.ts new file mode 100644 index 0000000..0e040d4 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/ImageSerializer.d.ts @@ -0,0 +1,9 @@ +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { Serializer } from "../../di/Serializer"; +import { ImageRouter } from "../ImageRouter"; +export declare class ImageSerializer extends Serializer { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/NotifySerializer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/NotifySerializer.d.ts new file mode 100644 index 0000000..1779ac9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/serializers/NotifySerializer.d.ts @@ -0,0 +1,11 @@ +import { NotifierController } from "../../controllers/NotifierController"; +import { Serializer } from "../../di/Serializer"; +import { HttpServerHelper } from "../../helpers/HttpServerHelper"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +export declare class NotifySerializer extends Serializer { + protected notifierController: NotifierController; + protected httpServerHelper: HttpServerHelper; + constructor(notifierController: NotifierController, httpServerHelper: HttpServerHelper); + serialize(_sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/BotStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/BotStaticRouter.d.ts new file mode 100644 index 0000000..aeea220 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/BotStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BotStaticRouter extends StaticRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/BundleStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/BundleStaticRouter.d.ts new file mode 100644 index 0000000..fb682fc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/BundleStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BundleStaticRouter extends StaticRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/CustomizationStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/CustomizationStaticRouter.d.ts new file mode 100644 index 0000000..21bc4bb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/CustomizationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class CustomizationStaticRouter extends StaticRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/DataStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/DataStaticRouter.d.ts new file mode 100644 index 0000000..84ba7fd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/DataStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DataStaticRouter extends StaticRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/DialogStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/DialogStaticRouter.d.ts new file mode 100644 index 0000000..546cdf1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/DialogStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DialogueCallbacks } from "../../callbacks/DialogueCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DialogStaticRouter extends StaticRouter { + protected dialogueCallbacks: DialogueCallbacks; + constructor(dialogueCallbacks: DialogueCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/GameStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/GameStaticRouter.d.ts new file mode 100644 index 0000000..a9a7496 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/GameStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { GameCallbacks } from "../../callbacks/GameCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class GameStaticRouter extends StaticRouter { + protected gameCallbacks: GameCallbacks; + constructor(gameCallbacks: GameCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/HealthStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/HealthStaticRouter.d.ts new file mode 100644 index 0000000..863fd5e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/HealthStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class HealthStaticRouter extends StaticRouter { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/InraidStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/InraidStaticRouter.d.ts new file mode 100644 index 0000000..b29ad23 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/InraidStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InraidStaticRouter extends StaticRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/InsuranceStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/InsuranceStaticRouter.d.ts new file mode 100644 index 0000000..5676499 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/InsuranceStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InsuranceStaticRouter extends StaticRouter { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/ItemEventStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/ItemEventStaticRouter.d.ts new file mode 100644 index 0000000..c30a7fc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/ItemEventStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ItemEventCallbacks } from "../../callbacks/ItemEventCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ItemEventStaticRouter extends StaticRouter { + protected itemEventCallbacks: ItemEventCallbacks; + constructor(itemEventCallbacks: ItemEventCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/LauncherStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/LauncherStaticRouter.d.ts new file mode 100644 index 0000000..0040cbd --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/LauncherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LauncherCallbacks } from "../../callbacks/LauncherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LauncherStaticRouter extends StaticRouter { + protected launcherCallbacks: LauncherCallbacks; + constructor(launcherCallbacks: LauncherCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/LocationStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/LocationStaticRouter.d.ts new file mode 100644 index 0000000..b6de956 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/LocationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LocationStaticRouter extends StaticRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/MatchStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/MatchStaticRouter.d.ts new file mode 100644 index 0000000..9920a92 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/MatchStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { MatchCallbacks } from "../../callbacks/MatchCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class MatchStaticRouter extends StaticRouter { + protected matchCallbacks: MatchCallbacks; + constructor(matchCallbacks: MatchCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/NotifierStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/NotifierStaticRouter.d.ts new file mode 100644 index 0000000..8f1f5cc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/NotifierStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class NotifierStaticRouter extends StaticRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/PresetStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/PresetStaticRouter.d.ts new file mode 100644 index 0000000..a9e7458 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/PresetStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class PresetStaticRouter extends StaticRouter { + protected presetCallbacks: PresetBuildCallbacks; + constructor(presetCallbacks: PresetBuildCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/ProfileStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/ProfileStaticRouter.d.ts new file mode 100644 index 0000000..83403f2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/ProfileStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ProfileCallbacks } from "../../callbacks/ProfileCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ProfileStaticRouter extends StaticRouter { + protected profileCallbacks: ProfileCallbacks; + constructor(profileCallbacks: ProfileCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/QuestStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/QuestStaticRouter.d.ts new file mode 100644 index 0000000..8f7ca0a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/QuestStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class QuestStaticRouter extends StaticRouter { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/RagfairStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/RagfairStaticRouter.d.ts new file mode 100644 index 0000000..6c41467 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/RagfairStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class RagfairStaticRouter extends StaticRouter { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/TraderStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/TraderStaticRouter.d.ts new file mode 100644 index 0000000..41728a1 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/TraderStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class TraderStaticRouter extends StaticRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/WeatherStaticRouter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/WeatherStaticRouter.d.ts new file mode 100644 index 0000000..72ed851 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/routers/static/WeatherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { WeatherCallbacks } from "../../callbacks/WeatherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class WeatherStaticRouter extends StaticRouter { + protected weatherCallbacks: WeatherCallbacks; + constructor(weatherCallbacks: WeatherCallbacks); +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/ConfigServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/ConfigServer.d.ts new file mode 100644 index 0000000..a079be8 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/ConfigServer.d.ts @@ -0,0 +1,14 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigTypes } from "../models/enums/ConfigTypes"; +export declare class ConfigServer { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected configs: Record; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil); + getConfig(configType: ConfigTypes): T; + getConfigByString(configType: string): T; + initialize(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/DatabaseServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/DatabaseServer.d.ts new file mode 100644 index 0000000..aa152d0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/DatabaseServer.d.ts @@ -0,0 +1,6 @@ +import { IDatabaseTables } from "../models/spt/server/IDatabaseTables"; +export declare class DatabaseServer { + protected tableData: IDatabaseTables; + getTables(): IDatabaseTables; + setTables(any: any): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/HttpServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/HttpServer.d.ts new file mode 100644 index 0000000..5234966 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/HttpServer.d.ts @@ -0,0 +1,49 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { Serializer } from "../di/Serializer"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { HttpRouter } from "../routers/HttpRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ConfigServer } from "./ConfigServer"; +import { DatabaseServer } from "./DatabaseServer"; +export declare class HttpServer implements IHttpServer { + protected httpRouter: HttpRouter; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected serializers: Serializer[]; + protected configServer: ConfigServer; + constructor(httpRouter: HttpRouter, // TODO: delay required + logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, serializers: Serializer[], configServer: ConfigServer); + protected buffers: {}; + protected onReceive: {}; + protected onRespond: {}; + protected httpConfig: IHttpConfig; + protected webSockets: {}; + protected websocketPingHandler: any; + getCookies(req: http.IncomingMessage): any; + resetBuffer(sessionID: string): void; + putInBuffer(sessionID: any, data: any, bufLength: number): boolean; + getFromBuffer(sessionID: string): any; + sendZlibJson(resp: any, output: any, sessionID: string): void; + sendMessage(sessionID: string, output: INotification): void; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + handleRequest(req: http.IncomingMessage, resp: http.ServerResponse): void; + load(): void; + protected getRandomisedMessage(): string; + wsOnConnection(ws: any, req: any): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/RagfairServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/RagfairServer.d.ts new file mode 100644 index 0000000..60c92b5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/RagfairServer.d.ts @@ -0,0 +1,31 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { ConfigServer } from "./ConfigServer"; +export declare class RagfairServer { + protected logger: ILogger; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairCategoriesService: RagfairCategoriesService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairOfferService: RagfairOfferService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); + load(): void; + update(): void; + getCategories(): Record; + /** + * Disable/Hide an offer from flea + * @param offerId + */ + hideOffer(offerId: string): void; + getOffer(offerID: string): IRagfairOffer; + getOffers(): IRagfairOffer[]; + removeOfferStack(offerID: string, amount: number): void; + doesOfferExist(offerId: string): boolean; + addPlayerOffers(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/SaveServer.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/SaveServer.d.ts new file mode 100644 index 0000000..cb28f49 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/servers/SaveServer.d.ts @@ -0,0 +1,28 @@ +import { IAkiProfile, Info } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { SaveLoadRouter } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class SaveServer { + protected vfs: VFS; + protected saveLoadRouters: SaveLoadRouter[]; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected profileFilepath: string; + protected profiles: {}; + protected onSave: {}; + protected saveMd5: {}; + constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger); + load(): void; + save(): void; + getProfile(sessionId: string): IAkiProfile; + getProfiles(): Record; + deleteProfileById(sessionID: string): boolean; + createProfile(profileInfo: Info): void; + addProfile(profileDetails: IAkiProfile): void; + loadProfile(sessionID: string): void; + saveProfile(sessionID: string): void; + removeProfile(sessionID: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/FenceService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/FenceService.d.ts new file mode 100644 index 0000000..12723fb --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/FenceService.d.ts @@ -0,0 +1,39 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { FenceLevel } from "../models/eft/common/IGlobals"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class FenceService { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected fenceAssort: ITraderAssort; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, presetHelper: PresetHelper, configServer: ConfigServer); + protected setFenceAssort(fenceAssort: ITraderAssort): void; + getFenceAssorts(): ITraderAssort; + hasExpiredCache(refreshAssort: boolean): boolean; + generateFenceAssortCache(pmcData: IPmcData): void; + /** + * + * @param pmcData Get the fence level the passed in profile has + * @returns FenceLevel + */ + getFenceInfo(pmcData: IPmcData): FenceLevel; + removeFenceOffer(assortIdToRemove: string): void; + updateFenceOffers(pmcData: IPmcData): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/HashCacheService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/HashCacheService.d.ts new file mode 100644 index 0000000..5320f28 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/HashCacheService.d.ts @@ -0,0 +1,19 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +export declare class HashCacheService { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected jsonHashes: any; + protected modHashes: any; + protected readonly modCachePath = "./user/cache/modCache.json"; + constructor(vfs: VFS, hashUtil: HashUtil, jsonUtil: JsonUtil, logger: ILogger); + getStoredModHash(modName: string): string; + modContentMatchesStoredHash(modName: string, modContent: string): boolean; + hashMatchesStoredHash(modName: string, modHash: string): boolean; + storeModContent(modName: string, modContent: string): void; + storeModHash(modName: string, modHash: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/InsuranceService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/InsuranceService.d.ts new file mode 100644 index 0000000..0219816 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/InsuranceService.d.ts @@ -0,0 +1,42 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { SecureContainerHelper } from "../helpers/SecureContainerHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected secureContainerHelper: SecureContainerHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected traderHelper: TraderHelper; + protected dialogueHelper: DialogueHelper; + protected configServer: ConfigServer; + protected insured: Record>; + protected templatesById: {}; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, secureContainerHelper: SecureContainerHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, saveServer: SaveServer, traderHelper: TraderHelper, dialogueHelper: DialogueHelper, configServer: ConfigServer); + insuranceExists(sessionId: string): boolean; + insuranceTraderArrayExists(sessionId: string, traderId: string): boolean; + getInsurance(sessionId: string): Record; + getInsuranceItems(sessionId: string, traderId: string): any[]; + resetInsurance(sessionId: string): void; + resetInsuranceTraderArray(sessionId: string, traderId: string): void; + addInsuranceItemToArray(sessionId: string, traderId: string, itemToAdd: any): void; + getItemPrice(_tpl: string): number; + generateTemplatesById(): void; + sendInsuredItems(pmcData: IPmcData, sessionID: string): void; + storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + protected addGearToSend(pmcData: IPmcData, insuredItem: any, actualItem: any, sessionID: string): any; + getPremium(pmcData: IPmcData, inventoryItem: Item, traderId: string): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/MatchLocationService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/MatchLocationService.d.ts new file mode 100644 index 0000000..2b5fc0e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/MatchLocationService.d.ts @@ -0,0 +1,8 @@ +import { TimeUtil } from "../utils/TimeUtil"; +export declare class MatchLocationService { + protected timeUtil: TimeUtil; + protected locations: {}; + constructor(timeUtil: TimeUtil); + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/ModCompilerService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/ModCompilerService.d.ts new file mode 100644 index 0000000..26cb4ac --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/ModCompilerService.d.ts @@ -0,0 +1,20 @@ +import * as ts from "typescript"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { VFS } from "../utils/VFS"; +import { HashCacheService } from "./HashCacheService"; +export declare class ModCompilerService { + protected logger: ILogger; + protected hashCacheService: HashCacheService; + protected vfs: VFS; + constructor(logger: ILogger, hashCacheService: HashCacheService, vfs: VFS); + compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise; + protected compile(fileNames: string[], options: ts.CompilerOptions): Promise; + protected buildDepth(depth: number): string; + protected getNodesModulesPath(depth: number): string; + protected getAkiPath(depth: number): string; + protected getAkiFolder(): string; + protected getNodesModulesFolder(): string; + protected calculateDepth(file: string): number; + protected areFilesReady(fileNames: string[]): boolean; + protected delay(ms: number): Promise; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/NotificationService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/NotificationService.d.ts new file mode 100644 index 0000000..7e2a127 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/NotificationService.d.ts @@ -0,0 +1,21 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +export declare class NotificationService { + protected messageQueue: {}; + getMessageQueue(): {}; + getMessageFromQueue(sessionId: string): any; + updateMessageOnQueue(sessionId: string, value: any[]): void; + has(sessionID: string): boolean; + /** + * Pop first message from queue. + */ + pop(sessionID: string): any; + /** + * Add message to queue + */ + add(sessionID: string, message: INotification): void; + /** + * Get message queue for session + * @param sessionID + */ + get(sessionID: string): any; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/PaymentService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/PaymentService.d.ts new file mode 100644 index 0000000..5834750 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/PaymentService.d.ts @@ -0,0 +1,49 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PaymentService { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + /** + * Take money and insert items into return to server request + * @param {Object} pmcData + * @param {Object} body + * @param {string} sessionID + * @returns Object + */ + payMoney(pmcData: IPmcData, body: IProcessBuyTradeRequestData, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Receive money back after selling + * @param {IPmcData} pmcData + * @param {number} amount + * @param {IProcessSellTradeRequestData} body + * @param {IItemEventRouterResponse} output + * @param {string} sessionID + * @returns IItemEventRouterResponse + */ + getMoney(pmcData: IPmcData, amount: number, body: IProcessSellTradeRequestData, output: IItemEventRouterResponse, sessionID: string): IItemEventRouterResponse; + /** + * Recursively checks if the given item is + * inside the stash, that is it has the stash as + * ancestor with slotId=hideout + */ + protected isItemInStash(pmcData: IPmcData, item: Item): boolean; + addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/PlayerService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/PlayerService.d.ts new file mode 100644 index 0000000..519b7e5 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/PlayerService.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPlayerIncrementSkillLevelRequestData } from "../models/eft/player/IPlayerIncrementSkillLevelRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PlayerService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, databaseServer: DatabaseServer); + /** + * increases the profile skill and updates any output + * @param {Object} pmcData + * @param {Object} output + * @param {String} skillName + * @param {Number} amount + */ + incrementSkillLevel(pmcData: IPmcData, output: IPlayerIncrementSkillLevelRequestData, skillName: string, amount: number): void; + /** + * @param {Object} pmcData + * @returns number + */ + calculateLevel(pmcData: IPmcData): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairCategoriesService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairCategoriesService.d.ts new file mode 100644 index 0000000..09956cc --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairCategoriesService.d.ts @@ -0,0 +1,10 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +export declare class RagfairCategoriesService { + updateCategories(offers: IRagfairOffer[]): void; + protected categories: Record; + getCategories(): Record; + getCategoryByItemId(itemId: string): number; + resetCategories(): void; + setCategoryValue(itemId: string, newValue: number): void; + incrementCategory(itemId: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairLinkedItemService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairLinkedItemService.d.ts new file mode 100644 index 0000000..6c34ee0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairLinkedItemService.d.ts @@ -0,0 +1,10 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +export declare class RagfairLinkedItemService { + protected databaseServer: DatabaseServer; + protected linkedItemsCache: Record>; + constructor(databaseServer: DatabaseServer); + getLinkedItems(linkedSearchId: string): Iterable; + protected buildLinkedItemTable(): void; + protected getFilters(item: ITemplateItem, slot: string): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairOfferService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairOfferService.d.ts new file mode 100644 index 0000000..7afbf8c --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairOfferService.d.ts @@ -0,0 +1,66 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairOfferService { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected ragfairServerHelper: RagfairServerHelper; + protected profileHelper: ProfileHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected playerOffersLoaded: boolean; + protected toUpdate: Record; + protected expiredOffers: Item[]; + protected offers: IRagfairOffer[]; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, configServer: ConfigServer); + getOffers(): IRagfairOffer[]; + getOfferByOfferId(offerId: string): IRagfairOffer; + getOffersOfType(templateId: string): IRagfairOffer[]; + addOffer(offer: IRagfairOffer): void; + addOfferToExpired(offer: Item): void; + setTraderUpdateStatus(traderId: string, shouldUpdate: boolean): void; + shouldTraderBeUpdated(traderID: string): boolean; + getExpiredOfferCount(): number; + /** + * Get an array of expired items not yet processed into new offers + * @returns items that need to be turned into offers + */ + getExpiredOffers(): Item[]; + resetExpiredOffers(): void; + /** + * Does the offer exist on the ragfair + * @param offerId offer id to check for + * @returns offer exists - true + */ + doesOfferExist(offerId: string): boolean; + getTraders(): Record; + flagTraderForUpdate(expiredOfferUserId: string): void; + removeOfferById(offerId: string): void; + removeOfferStack(offerID: string, amount: number): void; + removeAllOffersByTrader(traderId: string): void; + addTradersToUpdateList(): void; + addPlayerOffers(): void; + expireStaleOffers(): void; + /** + * Get an array of stale offers that are still shown to player + * @returns IRagfairOffer array + */ + protected getStaleOffers(): IRagfairOffer[]; + protected isStale(offer: IRagfairOffer, time: number): boolean; + protected processStaleOffer(staleOffer: IRagfairOffer): void; + protected returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairPriceService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairPriceService.d.ts new file mode 100644 index 0000000..5256b99 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairPriceService.d.ts @@ -0,0 +1,32 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { IRagfairServerPrices } from "../models/spt/ragfair/IRagfairServerPrices"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RagfairPriceService { + protected handbookHelper: HandbookHelper; + protected databaseServer: DatabaseServer; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected prices: IRagfairServerPrices; + constructor(handbookHelper: HandbookHelper, databaseServer: DatabaseServer, logger: ILogger, itemHelper: ItemHelper, presetHelper: PresetHelper, randomUtil: RandomUtil, configServer: ConfigServer); + generateStaticPrices(): void; + generateDynamicPrices(): void; + hasDynamicPrices(): boolean; + getDynamicPrice(itemTpl: string): number; + getAllFleaPrices(): Record; + getFleaPriceForItem(tplId: string): number; + getBarterPrice(barterScheme: IBarterScheme[]): number; + getDynamicOfferPrice(items: Item[], desiredCurrency: string): number; + getWeaponPresetPrice(item: Item, items: Item[], existingPrice: number): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairRequiredItemsService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairRequiredItemsService.d.ts new file mode 100644 index 0000000..b05fc65 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/RagfairRequiredItemsService.d.ts @@ -0,0 +1,12 @@ +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairRequiredItemsService { + protected logger: ILogger; + protected paymentHelper: PaymentHelper; + protected ragfairOfferService: RagfairOfferService; + protected requiredItemsCache: {}; + constructor(logger: ILogger, paymentHelper: PaymentHelper, ragfairOfferService: RagfairOfferService); + getRequiredItems(searchId: string): any; + buildRequiredItemTable(): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/TraderAssortService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/TraderAssortService.d.ts new file mode 100644 index 0000000..5ba2d05 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/TraderAssortService.d.ts @@ -0,0 +1,6 @@ +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +export declare class TraderAssortService { + protected pristineTraderAssorts: Record; + getPristineTraderAssort(traderId: string): ITraderAssort; + setPristineTraderAssort(traderId: string, assort: ITraderAssort): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts new file mode 100644 index 0000000..abfe237 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter, RouteAction } from "../../../di/Router"; +export declare class DynamicRouterMod extends DynamicRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts new file mode 100644 index 0000000..6742fc6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class DynamicRouterModService { + private container; + constructor(container: DependencyContainer); + registerDynamicRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/image/imageRouteService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/image/imageRouteService.d.ts new file mode 100644 index 0000000..29569b2 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/image/imageRouteService.d.ts @@ -0,0 +1,6 @@ +export declare class ImageRouteService { + protected routes: Record; + addRoute(urlKey: string, route: string): void; + getByKey(urlKey: string): string; + existsByKey(urlKey: string): boolean; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onLoad/OnLoadMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onLoad/OnLoadMod.d.ts new file mode 100644 index 0000000..53fb062 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onLoad/OnLoadMod.d.ts @@ -0,0 +1,8 @@ +import { OnLoad } from "../../../di/OnLoad"; +export declare class OnLoadMod extends OnLoad { + private onLoadOverride; + private getRouteOverride; + constructor(onLoadOverride: () => void, getRouteOverride: () => string); + onLoad(): void; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onLoad/OnLoadModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onLoad/OnLoadModService.d.ts new file mode 100644 index 0000000..f402103 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onLoad/OnLoadModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnLoadModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onUpdate/OnUpdateMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onUpdate/OnUpdateMod.d.ts new file mode 100644 index 0000000..ee89043 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onUpdate/OnUpdateMod.d.ts @@ -0,0 +1,8 @@ +import { OnUpdate } from "../../../di/OnUpdate"; +export declare class OnUpdateMod extends OnUpdate { + private onUpdateOverride; + private getRouteOverride; + constructor(onUpdateOverride: (timeSinceLastRun: number) => boolean, getRouteOverride: () => string); + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onUpdate/OnUpdateModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onUpdate/OnUpdateModService.d.ts new file mode 100644 index 0000000..05d735b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/onUpdate/OnUpdateModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnUpdateModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/staticRouter/StaticRouterMod.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/staticRouter/StaticRouterMod.d.ts new file mode 100644 index 0000000..1e62747 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/staticRouter/StaticRouterMod.d.ts @@ -0,0 +1,6 @@ +import { RouteAction, StaticRouter } from "../../../di/Router"; +export declare class StaticRouterMod extends StaticRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/staticRouter/StaticRouterModService.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/staticRouter/StaticRouterModService.d.ts new file mode 100644 index 0000000..f28fd45 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/services/mod/staticRouter/StaticRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class StaticRouterModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/App.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/App.d.ts new file mode 100644 index 0000000..34c141e --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/App.d.ts @@ -0,0 +1,14 @@ +import { TimeUtil } from "./TimeUtil"; +import { OnLoad } from "../di/OnLoad"; +import { OnUpdate } from "../di/OnUpdate"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class App { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected onLoadComponents: OnLoad[]; + protected onUpdateComponents: OnUpdate[]; + protected onUpdateLastRun: {}; + constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]); + load(): void; + protected update(onUpdateComponents: OnUpdate[]): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/AyncQueue.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/AyncQueue.d.ts new file mode 100644 index 0000000..da6ab18 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/AyncQueue.d.ts @@ -0,0 +1,7 @@ +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { ICommand } from "../models/spt/utils/ICommand"; +export declare class AsyncQueue implements IAsyncQueue { + protected commandsQueue: ICommand[]; + constructor(); + waitFor(command: ICommand): Promise; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/DatabaseImporter.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/DatabaseImporter.d.ts new file mode 100644 index 0000000..0857b67 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/DatabaseImporter.d.ts @@ -0,0 +1,18 @@ +import { VFS } from "./VFS"; +import { JsonUtil } from "./JsonUtil"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ImageRouter } from "../routers/ImageRouter"; +import { OnLoad } from "../di/OnLoad"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class DatabaseImporter extends OnLoad { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected imageRouter: ImageRouter; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter); + onLoad(): void; + getRoute(): string; + loadRecursive(filepath: string): any; + loadImages(filepath: string): void; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/HashUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/HashUtil.d.ts new file mode 100644 index 0000000..bacbf2a --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/HashUtil.d.ts @@ -0,0 +1,11 @@ +/// +import crypto from "crypto"; +import { TimeUtil } from "./TimeUtil"; +export declare class HashUtil { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + generate(): string; + generateMd5ForData(data: string): string; + generateSha1ForData(data: string): string; + generateHashForData(algorithm: string, data: crypto.BinaryLike): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/HttpResponseUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/HttpResponseUtil.d.ts new file mode 100644 index 0000000..29502be --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/HttpResponseUtil.d.ts @@ -0,0 +1,16 @@ +import { JsonUtil } from "./JsonUtil"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class HttpResponseUtil { + protected jsonUtil: JsonUtil; + constructor(jsonUtil: JsonUtil); + protected clearString(s: string): any; + noBody(data: any): any; + getBody(data: T, err?: number, errmsg?: any): IGetBodyResponseData; + getUnclearedBody(data: any, err?: number, errmsg?: any): string; + emptyResponse(): IGetBodyResponseData; + nullResponse(): INullResponseData; + emptyArrayResponse(): IGetBodyResponseData; + appendErrorToOutput(output: IItemEventRouterResponse, message?: string, title?: string): IItemEventRouterResponse; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/JsonUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/JsonUtil.d.ts new file mode 100644 index 0000000..71e95f6 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/JsonUtil.d.ts @@ -0,0 +1,25 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "./HashUtil"; +import { VFS } from "./VFS"; +export declare class JsonUtil { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected fileHashes: any; + constructor(vfs: VFS, hashUtil: HashUtil, logger: ILogger); + /** + * From object to string + * @param data object to turn into JSON + * @param prettify Should output be prettified? + * @returns string + */ + serialize(data: any, prettify?: boolean): string; + /** + * From string to object + * @param jsonString json string to turn into object + * @returns object + */ + deserialize(jsonString: string): any; + deserializeWithCacheCheck(jsonString: string, filePath: string): string; + clone(data: T): T; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/Logger.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/Logger.d.ts new file mode 100644 index 0000000..f5b774b --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/Logger.d.ts @@ -0,0 +1,51 @@ +/// +import { Daum } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ILogger } from "../models/spt/utils/ILogger"; +import winston from "winston"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +import fs from "fs"; +interface SptLogger { + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} +export declare class WinstonLogger implements ILogger { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + protected showDebugInConsole: boolean; + protected folderPath: string; + protected file: string; + protected filePath: string; + protected logLevels: { + levels: { + error: number; + warn: number; + succ: number; + info: number; + custom: number; + debug: number; + }; + colors: { + error: string; + warn: string; + succ: string; + info: string; + custom: string; + debug: string; + }; + }; + protected logger: winston.Logger & SptLogger; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + writeToLogFile(data: string | Daum): Promise; + log(data: string | Error | Record, color: string): Promise; + error(data: string | Record): Promise; + warning(data: string | Record): Promise; + success(data: string | Record): Promise; + info(data: string | Record): Promise; + debug(data: string | Record, onlyShowInConsole?: boolean): Promise; +} +export {}; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/MathUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/MathUtil.d.ts new file mode 100644 index 0000000..ea5fd69 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/MathUtil.d.ts @@ -0,0 +1,53 @@ +export declare class MathUtil { + /** + * Helper to create the sum of all array elements + * @param {array} values The array with numbers of which to calculate the sum + * @return {number} sum(values) + */ + arraySum(values: number[]): number; + /** + * Helper to create the cumulative sum of all array elements + * arrayCumsum([1, 2, 3, 4]) = [1, 3, 6, 10] + * @param {array} values The array with numbers of which to calculate the cumulative sum + * @return {array} cumsum(values) + */ + arrayCumsum(values: number[]): number[]; + /** + * Helper to create the product of each element times factor + * @param {array} values The array of numbers which shall be multiplied by the factor + * @return {array} array times factor + */ + arrayProd(values: number[], factor: number): number[]; + /** + * Helper to add a constant to all array elements + * @param {array} values The array of numbers to which the summand should be added + * @return {array} array plus summand + */ + arrayAdd(values: number[], summand: number): number[]; + /** + * Map a value from an input range to an output range linearly + * + * Example: + * a_min = 0; a_max=1; + * b_min = 1; b_max=3; + * MathUtil.mapToRange(0.5, a_min, a_max, b_min, b_max) // returns 2 + * + * @param {number} x The value from input range to be mapped to output range + * @param {number} minIn min of input range + * @param {number} maxIn max of input range + * @param {number} minOut min of output range + * @param {number} maxOut max of outout range + * @return {number} the result of the mapping + */ + mapToRange(x: number, minIn: number, maxIn: number, minOut: number, maxOut: number): number; + /** + * Linear interpolation + * e.g. used to do a continuous integration for quest rewards which are defined for specific support centers of pmcLevel + * + * @param {string} xp the point of x at which to interpolate + * @param {array} x support points in x (of same length as y) + * @param {array} y support points in y (of same length as x) + * @return {number} y(xp) + */ + interp1(xp: number, x: number[], y: number[]): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/ObjectId.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/ObjectId.d.ts new file mode 100644 index 0000000..03aae56 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/ObjectId.d.ts @@ -0,0 +1,14 @@ +/// +import { TimeUtil } from "./TimeUtil"; +export declare class ObjectId { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + protected randomBytes: Buffer; + protected constglobalCounter: number; + protected consttime: number; + protected globalCounter: number; + protected time: number; + incGlobalCounter(): number; + toHexString(byteArray: string | any[] | Buffer): string; + generate(): string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/RandomUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/RandomUtil.d.ts new file mode 100644 index 0000000..c24dd60 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/RandomUtil.d.ts @@ -0,0 +1,153 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "./JsonUtil"; +import { MathUtil } from "./MathUtil"; +/** + * Array of ProbabilityObjectArray which allow to randomly draw of the contained objects + * based on the relative probability of each of its elements. + * The probabilities of the contained element is not required to be normalized. + * + * Example: + * po = new ProbabilityObjectArray( + * new ProbabilityObject("a", 5), + * new ProbabilityObject("b", 1), + * new ProbabilityObject("c", 1) + * ); + * res = po.draw(10000); + * // count the elements which should be distributed according to the relative probabilities + * res.filter(x => x==="b").reduce((sum, x) => sum + 1 , 0) + */ +export declare class ProbabilityObjectArray extends Array> { + private mathUtil; + constructor(mathUtil: MathUtil, ...items: ProbabilityObject[]); + filter(callbackfn: (value: ProbabilityObject, index: number, array: ProbabilityObject[]) => any): ProbabilityObjectArray; + /** + * Calculates the normalized cumulative probability of the ProbabilityObjectArray's elements normalized to 1 + * @param {array} probValues The relative probability values of which to calculate the normalized cumulative sum + * @returns {array} Cumulative Sum normalized to 1 + */ + cumulativeProbability(probValues: number[]): number[]; + /** + * Clone this ProbabilitObjectArray + * @returns {ProbabilityObjectArray} Deep Copy of this ProbabilityObjectArray + */ + clone(): ProbabilityObjectArray; + /** + * Drop an element from the ProbabilityObjectArray + * + * @param {string} key The key of the element to drop + * @returns {ProbabilityObjectArray} ProbabilityObjectArray without the dropped element + */ + drop(key: K): ProbabilityObjectArray; + /** + * Return the data field of a element of the ProbabilityObjectArray + * @param {string} key The key of the element whose data shall be retrieved + * @returns {object} The data object + */ + data(key: K): V; + /** + * Get the relative probability of an element by its key + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @param {string} key The key of the element whose relative probability shall be retrieved + * @return {number} The relative probability + */ + probability(key: K): number; + /** + * Get the maximum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @return {number} the maximum value of all relative probabilities in this ProbabilityObjectArray + */ + maxProbability(): number; + /** + * Get the minimum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.minProbability() // returns 1 + * + * @return {number} the minimum value of all relative probabilities in this ProbabilityObjectArray + */ + minProbability(): number; + /** + * Draw random element of the ProbabilityObject N times to return an array of N keys. + * Drawing can be with or without replacement + * + * @param {integer} count The number of times we want to draw + * @param {boolean} replacement Draw with or without replacement from the input dict + * @param {array} locklist list keys which shall be replaced even if drawing without replacement + * @return {array} Array consisting of N random keys for this ProbabilityObjectArray + */ + draw(count?: number, replacement?: boolean, locklist?: Array): K[]; +} +/** + * A ProbabilityObject which is use as an element to the ProbabilityObjectArray array + * It contains a key, the relative probability as well as optional data. + */ +export declare class ProbabilityObject { + key: K; + relativeProbability: number; + data: V; + /** + * Constructor for the ProbabilityObject + * @param {string} key The key of the element + * @param {number} relativeProbability The relative probability of this element + * @param {any} data Optional data attached to the element + */ + constructor(key: K, relativeProbability: number, data?: V); +} +export declare class RandomUtil { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + constructor(jsonUtil: JsonUtil, logger: ILogger); + getInt(min: number, max: number): number; + getIntEx(max: number): number; + getFloat(min: number, max: number): number; + getBool(): boolean; + getStringArrayValue(arr: string[]): string; + getArrayValue(arr: T[]): T; + getKey(node: any): string; + getKeyValue(node: { + [x: string]: any; + }): any; + /** + * Draw from normal distribution + * @param {number} mu Mean of the normal distribution + * @param {number} sigma Standard deviation of the normal distribution + * @returns {number} The value drawn + */ + randn(mu: number, sigma: number): number; + /** + * Draw Random integer low inclusive, high exclusive + * if high is not set we draw from 0 to low (exclusive) + * @param {integer} low Lower bound inclusive, when high is not set, this is high + * @param {integer} high Higher bound exclusive + * @returns {integer} The random integer in [low, high) + */ + randInt(low: number, high?: number): number; + /** + * Draw a random element of the provided list N times to return an array of N random elements + * 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 + * @return {array} Array consisting of N random elements + */ + drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; + /** + * Draw a random (top level) element of the provided dictionary N times to return an array of N random dictionary keys + * Drawing can be with or without replacement + * @param {any} dict The dictionary 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 dict + * @return {array} Array consisting of N random keys of the dictionary + */ + drawRandomFromDict(dict: any, count?: number, replacement?: boolean): any[]; + getBiasedRandomNumber(min: number, max: number, shift: number, n: number): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/TimeUtil.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/TimeUtil.d.ts new file mode 100644 index 0000000..9733be9 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/TimeUtil.d.ts @@ -0,0 +1,8 @@ +export declare class TimeUtil { + static readonly oneHourAsSeconds = 3600; + formatTime(date: Date): string; + formatDate(date: Date): string; + getDate(): string; + getTime(): string; + getTimestamp(): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/UUidGenerator.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/UUidGenerator.d.ts new file mode 100644 index 0000000..000b719 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/UUidGenerator.d.ts @@ -0,0 +1,4 @@ +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class UUidGenerator implements IUUidGenerator { + generate: () => string; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/VFS.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/VFS.d.ts new file mode 100644 index 0000000..e5eaf02 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/VFS.d.ts @@ -0,0 +1,55 @@ +/// +/// +import "reflect-metadata"; +import fs from "fs"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class VFS { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; + copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; + mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { + recursive: true; + }) => Promise; + readFilePromisify: (path: fs.PathLike) => Promise; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + readdirPromisify: (path: fs.PathLike, options?: BufferEncoding | { + encoding: BufferEncoding; + withFileTypes?: false; + }) => Promise; + statPromisify: (path: fs.PathLike, options?: fs.StatOptions & { + bigint?: false; + }) => Promise; + unlinkPromisify: (path: fs.PathLike) => Promise; + rmdirPromisify: (path: fs.PathLike) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + exists(filepath: fs.PathLike): boolean; + existsAsync(filepath: fs.PathLike): Promise; + copyFile(filepath: fs.PathLike, target: fs.PathLike): void; + copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise; + createDir(filepath: string): void; + createDirAsync(filepath: string): Promise; + copyDir(filepath: string, target: string, fileExtensions?: string | string[]): void; + copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise; + readFile(filepath: string): any; + readFileAsync(filepath: string): Promise; + writeFile(filepath: any, data?: string, append?: boolean, atomic?: boolean): void; + writeFileAsync(filepath: any, data?: string, append?: boolean, atomic?: boolean): Promise; + getFiles(filepath: string): string[]; + getFilesAsync(filepath: string): Promise; + getDirs(filepath: string): string[]; + getDirsAsync(filepath: string): Promise; + removeFile(filepath: string): void; + removeFileAsync(filepath: string): Promise; + removeDir(filepath: string): void; + removeDirAsync(filepath: string): Promise; + private lockFileSync; + private checkFileSync; + private unlockFileSync; + getFileExtension(filepath: string): string; + stripExtension(filepath: string): string; + minifyAllJsonInDirRecursive(filepath: string): Promise; + minifyAllJsonInDirRecursiveAsync(filepath: string): Promise; + getFilesOfType(directory: string, fileType: string, files?: string[]): string[]; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/Watermark.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/Watermark.d.ts new file mode 100644 index 0000000..111bdd0 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/Watermark.d.ts @@ -0,0 +1,41 @@ +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WatermarkLocale { + protected locales: { + "en-US": { + description: string[]; + warning: string[]; + modding: string[]; + }; + "zh-CN": { + description: string[]; + warning: string[]; + modding: string[]; + }; + }; + getLocale(): string; + getDescription(): string[]; + getWarning(): string[]; + getModding(): string[]; +} +export declare class Watermark { + protected logger: ILogger; + protected configServer: ConfigServer; + protected watermarkLocale?: WatermarkLocale; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale); + protected text: string[]; + protected versionLabel: string; + initialize(): void; + getVersionTag(): string; + getVersionLabel(): string; + /** Set window title */ + setTitle(): void; + /** Reset console cursor to top */ + resetCursor(): void; + /** Draw the watermark */ + draw(): void; + /** Caculate text length */ + protected textLength(s: string): number; +} diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/decorators/Singleton.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/decorators/Singleton.d.ts new file mode 100644 index 0000000..7e89026 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/decorators/Singleton.d.ts @@ -0,0 +1,4 @@ +import type constructor from "./constructor"; +import { InjectionToken } from "tsyringe"; +declare function singleton(token?: InjectionToken): (target: constructor) => void; +export default singleton; diff --git a/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/decorators/constructor.d.ts b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/decorators/constructor.d.ts new file mode 100644 index 0000000..416f354 --- /dev/null +++ b/Faupi-MunitionsExpert/MunitionsExpert/src/server/types/utils/decorators/constructor.d.ts @@ -0,0 +1,4 @@ +declare type constructor = { + new (...args: any[]): T; +}; +export default constructor; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/package.json b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/package.json index 8599c2e..8b36f69 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/package.json +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/package.json @@ -5,6 +5,22 @@ "license": "NCSA Open Source", "main": "src/mod.js", "akiVersion": "3.0.0", - "UpdatedBy": "CWX" + "UpdatedBy": "CWX", + "scripts": { + "setup:environment": "npm i", + "build:unzipped": "copyfiles -e \"./node_modules/**/*.*\" -e \"./dist/**/*.*\" -e \"./package-lock.json\" -e \"./tsconfig.json\" -e \"./README.txt\" -e \"./mod.code-workspace\" ./**/*.* ./dist", + "zip:files": "cd dist/ && bestzip ../mod.zip *", + "build:zip": "npm run clean:environment && npm run build:unzipped && npm run zip:files", + "clean:environment": "node -e \"require('fs').rm('mod.zip', ()=>{})\" && node -e \"require('fs').rmdir('./dist/',{recursive:true},()=>{})\"" + }, + "devDependencies": { + "@types/node": "^14.15.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "copyfiles": "2.4.1", + "eslint": "7.26.0", + "tsyringe": "4.6.0", + "typescript": "4.6.4", + "bestzip": "2.2.1" + } } - diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/src/mod.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/src/mod.ts index 9d9a161..d83d48e 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/src/mod.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/src/mod.ts @@ -1,10 +1,9 @@ import type { DependencyContainer } from "tsyringe"; -import { IMod } from "../types/models/external/mod"; -import { ILogger } from "../types/models/spt/utils/ILogger"; -import { DynamicRouterModService } from "../types/services/mod/dynamicRouter/DynamicRouterModService" -import { DatabaseServer } from "../types/servers/DatabaseServer" -import { HttpResponseUtil } from "../types/utils/HttpResponseUtil" -const cfg = require("./config.json"); +import { IMod } from "@spt-aki/models/external/mod"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; +import { DynamicRouterModService } from "@spt-aki/services/mod/dynamicRouter/DynamicRouterModService" +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer" +import { HttpResponseUtil } from "@spt-aki/utils/HttpResponseUtil" class SeeItemValue implements IMod { @@ -26,7 +25,7 @@ class SeeItemValue implements IMod private skier; private fence; private tradersArr; - + private cfg; public load(container: DependencyContainer) { @@ -34,6 +33,7 @@ class SeeItemValue implements IMod this.logger = container.resolve("WinstonLogger"); this.http = container.resolve("HttpResponseUtil"); this.logger.info(`loading: ${this.name} ${this.version}`); + this.cfg = require("./config.json"); this.addRoute() } @@ -85,10 +85,10 @@ class SeeItemValue implements IMod let parentId = ""; // if TraderPrice in cfg is False get price from flea AVG - if(cfg.TraderPrice === false) + if (this.cfg.TraderPrice === false) { const result = this.livePrice[id]; - if(typeof result != `undefined`) + if (typeof result != "undefined") { return result; } @@ -97,14 +97,14 @@ class SeeItemValue implements IMod // if TraderPrice in cfg is True get price from handbook // as traders have a modifier, avg is 0.54, closest we can get without checking against each trader // thanks to TEOA for this info - for(let i in this.handbookTable.Items) + for (const i in this.handbookTable.Items) { - if(this.handbookTable.Items[i].Id === id) + if (this.handbookTable.Items[i].Id === id) { parentId = this.handbookTable.Items[i].ParentId; sMutli = this.getBestTraderMulti(parentId); sPrice = this.handbookTable.Items[i].Price; - let result = (sPrice*sMutli); + const result = (sPrice*sMutli); return result; } @@ -119,9 +119,9 @@ class SeeItemValue implements IMod let traderName = ""; // could be used later to be passed back to module to show trader and price let altTraderSellCat = ""; - for(let i in this.handbookTable.Categories) + for (const i in this.handbookTable.Categories) { - if(this.handbookTable.Categories[i].Id === parentId) + if (this.handbookTable.Categories[i].Id === parentId) { traderSellCat = this.handbookTable.Categories[i].Id; altTraderSellCat = this.handbookTable.Categories[i].ParentId; @@ -129,9 +129,9 @@ class SeeItemValue implements IMod } } - for(let iter = 0; iter < 8; iter++) + for (let iter = 0; iter < 8; iter++) { - if(this.tradersArr[iter].sell_category.includes(traderSellCat)) + if (this.tradersArr[iter].sell_category.includes(traderSellCat)) { traderMulti = (100 - this.tradersArr[iter].loyaltyLevels[0].buy_price_coef) / 100; traderName = this.tradersArr[iter].nickname; @@ -139,16 +139,16 @@ class SeeItemValue implements IMod } } - for(let iter = 0; iter < 8; iter++) + for (let iter = 0; iter < 8; iter++) { - if(this.tradersArr[iter].sell_category.includes(altTraderSellCat)) + if (this.tradersArr[iter].sell_category.includes(altTraderSellCat)) { traderMulti = (100 - this.tradersArr[iter].loyaltyLevels[0].buy_price_coef) / 100; traderName = this.tradersArr[iter].nickname; return traderMulti; } } - return cfg.TraderMultiplier; + return this.cfg.TraderMultiplier; } } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/BotCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/BotCallbacks.d.ts index 9602975..2db60dc 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/BotCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/BotCallbacks.d.ts @@ -5,8 +5,8 @@ import { IBotBase } from "../models/eft/common/tables/IBotBase"; import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class BotCallbacks { - private botController; - private httpResponse; + protected botController: BotController; + protected httpResponse: HttpResponseUtil; constructor(botController: BotController, httpResponse: HttpResponseUtil); getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/BundleCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/BundleCallbacks.d.ts index b007ab8..b28abe1 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/BundleCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/BundleCallbacks.d.ts @@ -1,15 +1,16 @@ import { BundleLoader } from "../loaders/BundleLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class BundleCallbacks { - private logger; - private httpResponse; - private httpServer; - private bundleLoader; - private configServer; - private httpConfig; + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, bundleLoader: BundleLoader, configServer: ConfigServer); sendBundle(sessionID: string, req: any, resp: any, body: any): any; getBundles(url: string, info: any, sessionID: string): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/CustomizationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/CustomizationCallbacks.d.ts index 918b8b6..3bab8c0 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/CustomizationCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/CustomizationCallbacks.d.ts @@ -9,9 +9,9 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { SaveServer } from "../servers/SaveServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class CustomizationCallbacks { - private customizationController; - private saveServer; - private httpResponse; + protected customizationController: CustomizationController; + protected saveServer: SaveServer; + protected httpResponse: HttpResponseUtil; constructor(customizationController: CustomizationController, saveServer: SaveServer, httpResponse: HttpResponseUtil); getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<{ _id: string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/DataCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/DataCallbacks.d.ts index 018420e..cfb1c16 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/DataCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/DataCallbacks.d.ts @@ -12,8 +12,8 @@ import { ISettingsBase } from "../models/spt/server/ISettingsBase"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class DataCallbacks { - private httpResponse; - private databaseServer; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer); getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/DialogueCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/DialogueCallbacks.d.ts index 3b6fbd1..634f90b 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/DialogueCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/DialogueCallbacks.d.ts @@ -21,10 +21,10 @@ import { HashUtil } from "../utils/HashUtil"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class DialogueCallbacks extends OnUpdate { - private hashUtil; - private timeUtil; - private httpResponse; - private dialogueController; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected dialogueController: DialogueController; constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController); getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/GameCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/GameCallbacks.d.ts index 44a30ea..d5cad76 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/GameCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/GameCallbacks.d.ts @@ -8,9 +8,9 @@ import { INullResponseData } from "../models/eft/httpResponse/INullResponseData" import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { Watermark } from "../utils/Watermark"; declare class GameCallbacks { - private httpResponse; - private watermark; - private gameController; + protected httpResponse: HttpResponseUtil; + protected watermark: Watermark; + protected gameController: GameController; constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController); versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HandbookCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HandbookCallbacks.d.ts index 0db5fec..891e375 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HandbookCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HandbookCallbacks.d.ts @@ -1,7 +1,7 @@ import { HandbookController } from "../controllers/HandbookController"; import { OnLoad } from "../di/OnLoad"; export declare class HandbookCallbacks extends OnLoad { - private handbookController; + protected handbookController: HandbookController; constructor(handbookController: HandbookController); onLoad(): void; getRoute(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HealthCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HealthCallbacks.d.ts index a50dd42..8f7b89d 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HealthCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HealthCallbacks.d.ts @@ -9,9 +9,9 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class HealthCallbacks { - private httpResponse; - private profileHelper; - private healthController; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected healthController: HealthController; constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController); syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData; offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HideoutCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HideoutCallbacks.d.ts index 3698176..99ab4c9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HideoutCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HideoutCallbacks.d.ts @@ -11,11 +11,12 @@ import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutTog import { IHideoutUpgradeCompleteRequestData } from "../models/eft/hideout/IHideoutUpgradeCompleteRequestData"; import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; import { ConfigServer } from "../servers/ConfigServer"; export declare class HideoutCallbacks extends OnUpdate { - private hideoutController; - private configServer; - private hideoutConfig; + protected hideoutController: HideoutController; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; constructor(hideoutController: HideoutController, // TODO: delay needed configServer: ConfigServer); upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HttpCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HttpCallbacks.d.ts index 9fe387d..94c97bd 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HttpCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/HttpCallbacks.d.ts @@ -1,7 +1,7 @@ import { OnLoad } from "../di/OnLoad"; import { IHttpServer } from "../models/spt/server/IHttpServer"; export declare class HttpCallbacks extends OnLoad { - private httpServer; + protected httpServer: IHttpServer; constructor(httpServer: IHttpServer); onLoad(): void; getRoute(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InraidCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InraidCallbacks.d.ts index 2d53227..05bcce4 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InraidCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InraidCallbacks.d.ts @@ -3,14 +3,16 @@ import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IAirdropConfig } from "../models/spt/config/IAirdropConfig"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class InraidCallbacks { - private inraidController; - private httpResponse; - private configServer; - private airdropConfig; - private inraidConfig; + protected inraidController: InraidController; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected airdropConfig: IAirdropConfig; + protected inraidConfig: IInRaidConfig; constructor(inraidController: InraidController, httpResponse: HttpResponseUtil, configServer: ConfigServer); registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InsuranceCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InsuranceCallbacks.d.ts index 79feb67..520d0eb 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InsuranceCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InsuranceCallbacks.d.ts @@ -5,15 +5,16 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { InsuranceService } from "../services/InsuranceService"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class InsuranceCallbacks extends OnLoadOnUpdate { - private insuranceController; - private insuranceService; - private httpResponse; - private configServer; - private insuranceConfig; + protected insuranceController: InsuranceController; + protected insuranceService: InsuranceService; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer); onLoad(): void; getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InventoryCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InventoryCallbacks.d.ts index 9795aa0..9ab1486 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InventoryCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/InventoryCallbacks.d.ts @@ -18,7 +18,7 @@ import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryT import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; export declare class InventoryCallbacks { - private inventoryController; + protected inventoryController: InventoryController; constructor(inventoryController: InventoryController); moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ItemEventCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ItemEventCallbacks.d.ts index 74e79c4..f4f04f9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ItemEventCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ItemEventCallbacks.d.ts @@ -4,8 +4,8 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { ItemEventRouter } from "../routers/ItemEventRouter"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class ItemEventCallbacks { - private httpResponse; - private itemEventRouter; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter); handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/LauncherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/LauncherCallbacks.d.ts index 4bd5e2c..c022325 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/LauncherCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/LauncherCallbacks.d.ts @@ -8,10 +8,10 @@ import { SaveServer } from "../servers/SaveServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { Watermark } from "../utils/Watermark"; declare class LauncherCallbacks { - private httpResponse; - private launcherController; - private saveServer; - private watermark; + protected httpResponse: HttpResponseUtil; + protected launcherController: LauncherController; + protected saveServer: SaveServer; + protected watermark: Watermark; constructor(httpResponse: HttpResponseUtil, launcherController: LauncherController, saveServer: SaveServer, watermark: Watermark); connect(): string; login(url: string, info: ILoginRequestData, sessionID: string): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/LocationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/LocationCallbacks.d.ts index 5ecab74..cc69369 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/LocationCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/LocationCallbacks.d.ts @@ -6,8 +6,8 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { IGetLocationRequestData } from "../models/eft/location/IGetLocationRequestData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class LocationCallbacks { - private httpResponse; - private locationController; + protected httpResponse: HttpResponseUtil; + protected locationController: LocationController; constructor(httpResponse: HttpResponseUtil, locationController: LocationController); getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/MatchCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/MatchCallbacks.d.ts index 63d38d9..083c1f5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/MatchCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/MatchCallbacks.d.ts @@ -9,10 +9,10 @@ import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class MatchCallbacks { - private httpResponse; - private jsonUtil; - private matchController; - private databaseServer; + protected httpResponse: HttpResponseUtil; + protected jsonUtil: JsonUtil; + protected matchController: MatchController; + protected databaseServer: DatabaseServer; constructor(httpResponse: HttpResponseUtil, jsonUtil: JsonUtil, matchController: MatchController, databaseServer: DatabaseServer); updatePing(url: string, info: any, sessionID: string): INullResponseData; exitMatch(url: string, info: any, sessionID: string): INullResponseData; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ModCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ModCallbacks.d.ts index 2011f0e..866abf7 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ModCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ModCallbacks.d.ts @@ -1,16 +1,17 @@ import { OnLoad } from "../di/OnLoad"; import { DelayedModLoader } from "../loaders/DelayedModLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; declare class ModCallbacks extends OnLoad { - private logger; - private httpResponse; - private httpServer; - private modLoader; - private configServer; - private httpConfig; + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected modLoader: DelayedModLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, modLoader: DelayedModLoader, configServer: ConfigServer); onLoad(): void; getRoute(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/NoteCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/NoteCallbacks.d.ts index fd7c5ca..d39d400 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/NoteCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/NoteCallbacks.d.ts @@ -3,7 +3,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { INoteActionData } from "../models/eft/notes/INoteActionData"; export declare class NoteCallbacks { - private noteController; + protected noteController: NoteController; constructor(noteController: NoteController); addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/NotifierCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/NotifierCallbacks.d.ts index 416e6a3..cd1e736 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/NotifierCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/NotifierCallbacks.d.ts @@ -6,9 +6,9 @@ import { INotifierChannel } from "../models/eft/notifier/INotifier"; import { ISelectProfileRequestData } from "../models/eft/notifier/ISelectProfileRequestData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class NotifierCallbacks { - private httpServerHelper; - private httpResponse; - private notifierController; + protected httpServerHelper: HttpServerHelper; + protected httpResponse: HttpResponseUtil; + protected notifierController: NotifierController; constructor(httpServerHelper: HttpServerHelper, httpResponse: HttpResponseUtil, notifierController: NotifierController); /** * If we don't have anything to send, it's ok to not send anything back @@ -16,7 +16,7 @@ export declare class NotifierCallbacks { * until we actually have something to send because otherwise we'd spam the client * and the client would abort the connection due to spam. */ - sendNotification(sessionID: string, req: any, resp: any, data: any): void; + sendNotification(_sessionID: string, req: any, resp: any, _data: any): void; getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/PresetBuildCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/PresetBuildCallbacks.d.ts index 639c33f..8a0c155 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/PresetBuildCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/PresetBuildCallbacks.d.ts @@ -6,8 +6,8 @@ import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPreset import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class PresetBuildCallbacks { - private httpResponse; - private presetBuildController; + protected httpResponse: HttpResponseUtil; + protected presetBuildController: PresetBuildController; constructor(httpResponse: HttpResponseUtil, presetBuildController: PresetBuildController); getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/PresetCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/PresetCallbacks.d.ts index f62afd6..4553f8f 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/PresetCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/PresetCallbacks.d.ts @@ -1,7 +1,7 @@ import { PresetController } from "../controllers/PresetController"; import { OnLoad } from "../di/OnLoad"; export declare class PresetCallbacks extends OnLoad { - private presetController; + protected presetController: PresetController; constructor(presetController: PresetController); onLoad(): void; getRoute(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ProfileCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ProfileCallbacks.d.ts index efce47d..116e7c5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ProfileCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/ProfileCallbacks.d.ts @@ -12,9 +12,9 @@ import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNic import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class ProfileCallbacks { - private httpResponse; - private timeUtil; - private profileController; + protected httpResponse: HttpResponseUtil; + protected timeUtil: TimeUtil; + protected profileController: ProfileController; constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, profileController: ProfileController); createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/QuestCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/QuestCallbacks.d.ts index f742096..559c29e 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/QuestCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/QuestCallbacks.d.ts @@ -13,9 +13,9 @@ import { IListQuestsRequestData } from "../models/eft/quests/IListQuestsRequestD import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class QuestCallbacks { - private httpResponse; - private questController; - private repeatableQuestController; + protected httpResponse: HttpResponseUtil; + protected questController: QuestController; + protected repeatableQuestController: RepeatableQuestController; constructor(httpResponse: HttpResponseUtil, questController: QuestController, repeatableQuestController: RepeatableQuestController); changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/RagfairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/RagfairCallbacks.d.ts index 152475f..d5bab8b 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/RagfairCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/RagfairCallbacks.d.ts @@ -3,6 +3,7 @@ import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { IPmcData } from "../models/eft/common/IPmcData"; import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IAddOfferRequestData } from "../models/eft/ragfair/IAddOfferRequestData"; import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; @@ -10,19 +11,20 @@ import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; import { IRemoveOfferRequestData } from "../models/eft/ragfair/IRemoveOfferRequestData"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { RagfairServer } from "../servers/RagfairServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class RagfairCallbacks extends OnLoadOnUpdate { - private httpResponse; - private logger; - private jsonUtil; - private ragfairServer; - private ragfairController; - private configServer; - private ragfairConfig; + protected httpResponse: HttpResponseUtil; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected ragfairServer: RagfairServer; + protected ragfairController: RagfairController; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(httpResponse: HttpResponseUtil, logger: ILogger, jsonUtil: JsonUtil, ragfairServer: RagfairServer, ragfairController: RagfairController, configServer: ConfigServer); onLoad(): void; getRoute(): string; @@ -33,4 +35,5 @@ export declare class RagfairCallbacks extends OnLoadOnUpdate { removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; onUpdate(timeSinceLastRun: number): boolean; + sendReport(url: string, info: any, sessionID: string): INullResponseData; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/RepairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/RepairCallbacks.d.ts index f63ec18..63733fa 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/RepairCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/RepairCallbacks.d.ts @@ -4,7 +4,7 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; export declare class RepairCallbacks { - private repairController; + protected repairController: RepairController; constructor(repairController: RepairController); traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/SaveCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/SaveCallbacks.d.ts index b7219a0..bbb6e53 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/SaveCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/SaveCallbacks.d.ts @@ -1,7 +1,7 @@ import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; import { SaveServer } from "../servers/SaveServer"; export declare class SaveCallbacks extends OnLoadOnUpdate { - private saveServer; + protected saveServer: SaveServer; constructor(saveServer: SaveServer); onLoad(): void; getRoute(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/TradeCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/TradeCallbacks.d.ts index 9928951..272ae46 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/TradeCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/TradeCallbacks.d.ts @@ -4,7 +4,7 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; export declare class TradeCallbacks { - private tradeController; + protected tradeController: TradeController; constructor(tradeController: TradeController); processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/TraderCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/TraderCallbacks.d.ts index 2a8af7f..128d9b2 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/TraderCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/TraderCallbacks.d.ts @@ -5,8 +5,8 @@ import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class TraderCallbacks extends OnLoadOnUpdate { - private httpResponse; - private traderController; + protected httpResponse: HttpResponseUtil; + protected traderController: TraderController; constructor(httpResponse: HttpResponseUtil, traderController: TraderController); onLoad(): void; getRoute(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/WeatherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/WeatherCallbacks.d.ts index e40ab3e..ae784c8 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/WeatherCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/WeatherCallbacks.d.ts @@ -3,8 +3,8 @@ import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class WeatherCallbacks { - private httpResponse; - private weatherController; + protected httpResponse: HttpResponseUtil; + protected weatherController: WeatherController; constructor(httpResponse: HttpResponseUtil, weatherController: WeatherController); getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/WishlistCallbacks.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/WishlistCallbacks.d.ts index e0249fd..c2cc2a8 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/WishlistCallbacks.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/callbacks/WishlistCallbacks.d.ts @@ -3,7 +3,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; export declare class WishlistCallbacks { - private wishlistController; + protected wishlistController: WishlistController; constructor(wishlistController: WishlistController); addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/BotController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/BotController.d.ts index d7dc36d..09a1788 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/BotController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/BotController.d.ts @@ -1,20 +1,35 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { Difficulty } from "../models/eft/common/tables/IBotType"; +import { BotGenerator } from "../generators/BotGenerator"; +import { BotHelper } from "../helpers/BotHelper"; import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; 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 { ConfigServer } from "../servers/ConfigServer"; -import { BotHelper } from "../helpers/BotHelper"; -import { BotGenerator } from "../generators/BotGenerator"; +import { DatabaseServer } from "../servers/DatabaseServer"; export declare class BotController { - private databaseServer; - private botGenerator; - private botHelper; - private configServer; - private botConfig; + protected databaseServer: DatabaseServer; + protected botGenerator: BotGenerator; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); - getBotLimit(type: string): number; - getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; + /** + * Return the number of bot loadout varieties to be generated + * @param type bot Type we want the loadout gen count for + * @returns + */ + getBotPresetGenerationLimit(type: string): number; + getBotCoreDifficulty(): IBotCore; + /** + * Get bot difficulty settings + * adjust PMC settings to ensure they engage the correct bot types + * @param type what bot the server is requesting settings for + * @param difficulty difficulty level server requested settings for + * @returns Difficulty object + */ + getBotDifficulty(type: string, difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; getBotCap(): number; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/CustomizationController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/CustomizationController.d.ts index 6fd3b12..a6c4730 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/CustomizationController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/CustomizationController.d.ts @@ -1,22 +1,22 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { SaveServer } from "../servers/SaveServer"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; -import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; export declare class CustomizationController { - private logger; - private itemEventRouter; - private databaseServer; - private saveServer; - private profileHelper; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper); getTraderSuits(traderID: string, sessionID: string): ISuit[]; wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; - private getAllTraderSuits; + protected getAllTraderSuits(sessionID: string): ISuit[]; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/DialogueController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/DialogueController.d.ts index 8095666..b15c4b6 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/DialogueController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/DialogueController.d.ts @@ -1,15 +1,15 @@ -import { SaveServer } from "../servers/SaveServer"; import { DialogueHelper } from "../helpers/DialogueHelper"; -import { DialogueInfo } from "../models/eft/profile/IAkiProfile"; -import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; -import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { DialogueInfo, Message } from "../models/eft/profile/IAkiProfile"; +import { SaveServer } from "../servers/SaveServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class DialogueController { - private httpResponse; - private saveServer; - private dialogueHelper; + protected httpResponse: HttpResponseUtil; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; constructor(httpResponse: HttpResponseUtil, saveServer: SaveServer, dialogueHelper: DialogueHelper); getFriendList(sessionID: string): IGetFriendListDataResponse; generateDialogueList(sessionID: string): IGetBodyResponseData; @@ -19,6 +19,7 @@ export declare class DialogueController { setDialoguePin(dialogueID: string, shouldPin: boolean, sessionID: string): void; setRead(dialogueIDs: string[], sessionID: string): void; getAllAttachments(dialogueID: string, sessionID: string): IGetAllAttachmentsResponse; - private removeExpiredItems; + protected messagesHaveUncollectedRewards(messages: Message[]): boolean; + protected removeExpiredItems(sessionID: string): void; update(): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/GameController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/GameController.d.ts index 5c9a464..b9067fa 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/GameController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/GameController.d.ts @@ -1,20 +1,32 @@ import { HttpServerHelper } from "../helpers/HttpServerHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcDataRepeatableQuest, IRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { Watermark } from "../utils/Watermark"; export declare class GameController { - private logger; - private watermark; - private httpServerHelper; - private profileHelper; - private configServer; - private httpConfig; + protected logger: ILogger; + protected watermark: Watermark; + protected httpServerHelper: HttpServerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; constructor(logger: ILogger, watermark: Watermark, httpServerHelper: HttpServerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); - gameStart(url: string, info: IEmptyRequestData, sessionID: string): void; + gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void; + protected addMissingBonusesProperty(pmcProfile: IPmcData): void; + protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void; + protected addMissingWeaponRepairSkill(pmcProfile: IPmcData): void; + protected addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void; + protected addMissingArmorRepairSkill(pmcProfile: IPmcData): void; + protected fixNullTraderSalesSums(pmcProfile: IPmcData): void; + protected removeDanglingConditionCounters(pmcProfile: IPmcData): void; + protected removeDanglingBackendCounters(pmcProfile: IPmcData): void; getGameConfig(sessionID: string): IGameConfigResponse; getServer(): any[]; - private getActiveRepeatableQuests; + protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[]; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HandbookController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HandbookController.d.ts index 5a55e89..52d2dd8 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HandbookController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HandbookController.d.ts @@ -1,8 +1,8 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { HandbookHelper } from "../helpers/HandbookHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; export declare class HandbookController { - private databaseServer; - private handbookHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; constructor(databaseServer: DatabaseServer, handbookHelper: HandbookHelper); load(): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HealthController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HealthController.d.ts index ca049f6..aafb8df 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HealthController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HealthController.d.ts @@ -11,12 +11,12 @@ import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRout import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class HealthController { - private logger; - private itemEventRouter; - private itemHelper; - private paymentService; - private inventoryHelper; - private healthHelper; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected inventoryHelper: InventoryHelper; + protected healthHelper: HealthHelper; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, healthHelper: HealthHelper); saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HideoutController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HideoutController.d.ts index 22b7040..a8bf229 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HideoutController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/HideoutController.d.ts @@ -1,46 +1,47 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { TimeUtil } from "../utils/TimeUtil"; -import { HashUtil } from "../utils/HashUtil"; -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { PlayerService } from "../services/PlayerService"; +import { HideoutHelper } from "../helpers/HideoutHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; import { PresetHelper } from "../helpers/PresetHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; -import { PaymentHelper } from "../helpers/PaymentHelper"; -import { InventoryHelper } from "../helpers/InventoryHelper"; -import { HideoutHelper } from "../helpers/HideoutHelper"; -import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; import { IPmcData } from "../models/eft/common/IPmcData"; import { HideoutUpgradeCompleteRequestData } from "../models/eft/hideout/HideoutUpgradeCompleteRequestData"; -import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; -import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; -import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; -import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; -import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; -import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; export declare class HideoutController { - private logger; - private hashUtil; - private timeUtil; - private databaseServer; - private randomUtil; - private inventoryHelper; - private saveServer; - private playerService; - private presetHelper; - private paymentHelper; - private itemEventRouter; - private httpResponse; - private profileHelper; - private hideoutHelper; - private configServer; - private hideoutConfig; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected inventoryHelper: InventoryHelper; + protected saveServer: SaveServer; + protected playerService: PlayerService; + protected presetHelper: PresetHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected hideoutHelper: HideoutHelper; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, configServer: ConfigServer); upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InraidController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InraidController.d.ts index 1033e5f..7f2036c 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InraidController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InraidController.d.ts @@ -1,29 +1,30 @@ -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ItemHelper } from "../helpers/ItemHelper"; -import { TraderHelper } from "../helpers/TraderHelper"; +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; import { HealthHelper } from "../helpers/HealthHelper"; +import { InRaidHelper } from "../helpers/InRaidHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; import { ConfigServer } from "../servers/ConfigServer"; -import { JsonUtil } from "../utils/JsonUtil"; -import { QuestHelper } from "../helpers/QuestHelper"; -import { InRaidHelper } from "../helpers/InRaidHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; import { InsuranceService } from "../services/InsuranceService"; -import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { JsonUtil } from "../utils/JsonUtil"; export declare class InraidController { - private saveServer; - private jsonUtil; - private databaseServer; - private questHelper; - private itemHelper; - private extendedProfileHelper; - private healthHelper; - private traderHelper; - private insuranceService; - private inRaidHelper; - private configServer; - private inraidConfig; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected itemHelper: ItemHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + protected healthHelper: HealthHelper; + protected traderHelper: TraderHelper; + protected insuranceService: InsuranceService; + protected inRaidHelper: InRaidHelper; + protected configServer: ConfigServer; + protected inraidConfig: IInRaidConfig; constructor(saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, extendedProfileHelper: ExtendedProfileHelper, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer); addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void; saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InsuranceController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InsuranceController.d.ts index 50437a6..db2c567 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InsuranceController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InsuranceController.d.ts @@ -1,33 +1,34 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { TimeUtil } from "../utils/TimeUtil"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { PaymentService } from "../services/PaymentService"; import { DialogueHelper } from "../helpers/DialogueHelper"; -import { ProfileHelper } from "../helpers/ProfileHelper"; import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { InsuranceService } from "../services/InsuranceService"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { PaymentService } from "../services/PaymentService"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; export declare class InsuranceController { - private logger; - private randomUtil; - private itemEventRouter; - private timeUtil; - private saveServer; - private databaseServer; - private itemHelper; - private profileHelper; - private dialogueHelper; - private paymentService; - private insuranceService; - private configServer; - private insuranceConfig; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected itemEventRouter: ItemEventRouter; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected profileHelper: ProfileHelper; + protected dialogueHelper: DialogueHelper; + protected paymentService: PaymentService; + protected insuranceService: InsuranceService; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; constructor(logger: ILogger, randomUtil: RandomUtil, itemEventRouter: ItemEventRouter, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required insuranceService: InsuranceService, configServer: ConfigServer); processReturn(): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InventoryController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InventoryController.d.ts index 8235082..b732aa9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InventoryController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/InventoryController.d.ts @@ -27,15 +27,15 @@ import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class InventoryController { - private logger; - private hashUtil; - private jsonUtil; - private databaseServer; - private presetHelper; - private inventoryHelper; - private profileHelper; - private paymentHelper; - private itemEventRouter; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected presetHelper: PresetHelper; + protected inventoryHelper: InventoryHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter); /** * Move Item diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/LauncherController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/LauncherController.d.ts index d3d8e6a..1af1f56 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/LauncherController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/LauncherController.d.ts @@ -1,25 +1,26 @@ -import { HashUtil } from "../utils/HashUtil"; -import { SaveServer } from "../servers/SaveServer"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { Info } from "../models/eft/profile/IAkiProfile"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; -import { IRegisterData } from "../models/eft/launcher/IRegisterData"; -import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; -import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; -import { Info } from "../models/eft/profile/IAkiProfile"; -import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; export declare class LauncherController { - private hashUtil; - private saveServer; - private httpServerHelper; - private databaseServer; - private configServer; - private coreConfig; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected httpServerHelper: HttpServerHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected coreConfig: ICoreConfig; constructor(hashUtil: HashUtil, saveServer: SaveServer, httpServerHelper: HttpServerHelper, databaseServer: DatabaseServer, configServer: ConfigServer); connect(): any; find(sessionIdKey: string): Info; login(info: ILoginRequestData): string; register(info: IRegisterData): string; - private createAccount; + protected createAccount(info: IRegisterData): string; changeUsername(info: IChangeRequestData): string; changePassword(info: IChangeRequestData): string; wipe(info: IRegisterData): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/LocationController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/LocationController.d.ts index dde270c..90b6d7a 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/LocationController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/LocationController.d.ts @@ -1,16 +1,16 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { LocationGenerator } from "../generators/LocationGenerator"; import { ILocationBase } from "../models/eft/common/ILocationBase"; import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class LocationController { - private jsonUtil; - private logger; - private locationGenerator; - private databaseServer; - private timeUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected locationGenerator: LocationGenerator; + protected databaseServer: DatabaseServer; + protected timeUtil: TimeUtil; constructor(jsonUtil: JsonUtil, logger: ILogger, locationGenerator: LocationGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil); get(location: string): ILocationBase; generate(name: string): ILocationBase; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/MatchController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/MatchController.d.ts index 84abbe3..c322d96 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/MatchController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/MatchController.d.ts @@ -4,21 +4,23 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { IMatchConfig } from "../models/spt/config/IMatchConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { SaveServer } from "../servers/SaveServer"; import { MatchLocationService } from "../services/MatchLocationService"; export declare class MatchController { - private saveServer; - private profileHelper; - private matchLocationService; - private traderHelper; - private configServer; - private matchConfig; - private inraidConfig; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected matchLocationService: MatchLocationService; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected matchConfig: IMatchConfig; + protected inraidConfig: IInRaidConfig; constructor(saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, configServer: ConfigServer); getEnabled(): boolean; getProfile(info: IGetProfileRequestData): IPmcData[]; - private getMatch; + protected getMatch(location: any): any; createGroup(sessionID: string, info: any): any; deleteGroup(info: any): void; joinMatch(info: any, sessionID: string): any[]; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/NoteController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/NoteController.d.ts index ecd8001..cc78383 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/NoteController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/NoteController.d.ts @@ -1,9 +1,9 @@ import { IPmcData } from "../models/eft/common/IPmcData"; -import { INoteActionData } from "../models/eft/notes/INoteActionData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; import { ItemEventRouter } from "../routers/ItemEventRouter"; declare class NoteController { - private itemEventRouter; + protected itemEventRouter: ItemEventRouter; constructor(itemEventRouter: ItemEventRouter); addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/NotifierController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/NotifierController.d.ts index 36fef66..31d7bfe 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/NotifierController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/NotifierController.d.ts @@ -3,11 +3,11 @@ import { NotificationService } from "../services/NotificationService"; import { INotifierChannel } from "../models/eft/notifier/INotifier"; import { HttpServerHelper } from "../helpers/HttpServerHelper"; export declare class NotifierController { - private notifierHelper; - private httpServerHelper; - private notificationService; - private pollInterval; - private timeout; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected notificationService: NotificationService; + protected pollInterval: number; + protected timeout: number; constructor(notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, notificationService: NotificationService); /** * Resolve an array of session notifications. diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/PresetBuildController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/PresetBuildController.d.ts index a15b181..adf4084 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/PresetBuildController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/PresetBuildController.d.ts @@ -1,16 +1,16 @@ import { ItemHelper } from "../helpers/ItemHelper"; -import { SaveServer } from "../servers/SaveServer"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; -import { HashUtil } from "../utils/HashUtil"; import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; export declare class PresetBuildController { - private hashUtil; - private itemEventRouter; - private itemHelper; - private saveServer; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; constructor(hashUtil: HashUtil, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, saveServer: SaveServer); getUserBuilds(sessionID: string): WeaponBuild[]; saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/PresetController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/PresetController.d.ts index 6ec8c55..ca1af1a 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/PresetController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/PresetController.d.ts @@ -1,8 +1,8 @@ import { PresetHelper } from "../helpers/PresetHelper"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class PresetController { - private presetHelper; - private databaseServer; + protected presetHelper: PresetHelper; + protected databaseServer: DatabaseServer; constructor(presetHelper: PresetHelper, databaseServer: DatabaseServer); initialize(): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/ProfileController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/ProfileController.d.ts index 46b66d8..9b7a6d5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/ProfileController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/ProfileController.d.ts @@ -1,26 +1,26 @@ -import { SaveServer } from "../servers/SaveServer"; -import { DatabaseServer } from "../servers/DatabaseServer"; +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; +import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; -import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; import { HashUtil } from "../utils/HashUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; -import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; export declare class ProfileController { - private hashUtil; - private timeUtil; - private saveServer; - private databaseServer; - private itemHelper; - private traderHelper; - private extendedProfileHelper; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected traderHelper: TraderHelper; + protected extendedProfileHelper: ExtendedProfileHelper; constructor(hashUtil: HashUtil, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, traderHelper: TraderHelper, extendedProfileHelper: ExtendedProfileHelper); getMiniProfiles(): IMiniProfile[]; getMiniProfile(sessionID: string): any; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/QuestController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/QuestController.d.ts index a964c32..e588de0 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/QuestController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/QuestController.d.ts @@ -1,33 +1,34 @@ -import { TimeUtil } from "../utils/TimeUtil"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { QuestHelper } from "../helpers/QuestHelper"; -import { ItemHelper } from "../helpers/ItemHelper"; import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; import { ProfileHelper } from "../helpers/ProfileHelper"; import { QuestConditionHelper } from "../helpers/QuestConditionHelper"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { PlayerService } from "../services/PlayerService"; +import { QuestHelper } from "../helpers/QuestHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; -import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { TimeUtil } from "../utils/TimeUtil"; export declare class QuestController { - private logger; - private timeUtil; - private itemEventRouter; - private databaseServer; - private itemHelper; - private dialogueHelper; - private profileHelper; - private questHelper; - private questConditionHelper; - private playerService; - private configServer; - private questConfig; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected questHelper: QuestHelper; + protected questConditionHelper: QuestConditionHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; constructor(logger: ILogger, timeUtil: TimeUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, questConditionHelper: QuestConditionHelper, playerService: PlayerService, configServer: ConfigServer); getClientQuests(sessionID: string): IQuest[]; acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RagfairController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RagfairController.d.ts index 5b94a95..c758593 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RagfairController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RagfairController.d.ts @@ -20,6 +20,7 @@ import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPric import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -33,30 +34,30 @@ import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsSer import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class RagfairController { - private logger; - private timeUtil; - private httpResponse; - private itemEventRouter; - private ragfairServer; - private ragfairPriceService; - private databaseServer; - private itemHelper; - private saveServer; - private ragfairSellHelper; - private ragfairTaxHelper; - private ragfairSortHelper; - private ragfairOfferHelper; - private profileHelper; - private paymentService; - private handbookHelper; - private paymentHelper; - private inventoryHelper; - private ragfairHelper; - private ragfairOfferService; - private ragfairRequiredItemsService; - private ragfairOfferGenerator; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + protected ragfairServer: RagfairServer; + protected ragfairPriceService: RagfairPriceService; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + protected ragfairSellHelper: RagfairSellHelper; + protected ragfairTaxHelper: RagfairTaxHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairOfferHelper: RagfairOfferHelper; + protected profileHelper: ProfileHelper; + protected paymentService: PaymentService; + protected handbookHelper: HandbookHelper; + protected paymentHelper: PaymentHelper; + protected inventoryHelper: InventoryHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter, ragfairServer: RagfairServer, ragfairPriceService: RagfairPriceService, databaseServer: DatabaseServer, itemHelper: ItemHelper, saveServer: SaveServer, ragfairSellHelper: RagfairSellHelper, ragfairTaxHelper: RagfairTaxHelper, ragfairSortHelper: RagfairSortHelper, ragfairOfferHelper: RagfairOfferHelper, profileHelper: ProfileHelper, paymentService: PaymentService, handbookHelper: HandbookHelper, paymentHelper: PaymentHelper, inventoryHelper: InventoryHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer); getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult; update(): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RepairController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RepairController.d.ts index 3a9f3a2..e9458f6 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RepairController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RepairController.d.ts @@ -1,25 +1,26 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { QuestHelper } from "../helpers/QuestHelper"; -import { TraderHelper } from "../helpers/TraderHelper"; -import { PaymentService } from "../services/PaymentService"; -import { IPmcData } from "../models/eft/common/IPmcData"; -import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; -import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; -import { ConfigServer } from "../servers/ConfigServer"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; import { RepairHelper } from "../helpers/RepairHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; export declare class RepairController { - private logger; - private itemEventRouter; - private databaseServer; - private questHelper; - private traderHelper; - private paymentService; - private repairHelper; - private configServer; - private repairConfig; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected traderHelper: TraderHelper; + protected paymentService: PaymentService; + protected repairHelper: RepairHelper; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, questHelper: QuestHelper, traderHelper: TraderHelper, paymentService: PaymentService, repairHelper: RepairHelper, configServer: ConfigServer); /** * Repair with trader diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RepeatableQuestController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RepeatableQuestController.d.ts index bd5e5a1..ce190aa 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RepeatableQuestController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/RepeatableQuestController.d.ts @@ -8,7 +8,8 @@ import { IPmcData, TraderInfo } from "../models/eft/common/IPmcData"; import { ICompletion, ICompletionAvailableFor, IElimination, IEliminationCondition, IExploration, IExplorationCondition, IPmcDataRepeatableQuest, IRepeatableQuest, IReward, IRewards } from "../models/eft/common/tables/IRepeatableQuests"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; -import { ELocationName, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ELocationName } from "../models/enums/ELocationName"; +import { IQuestConfig, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -47,21 +48,21 @@ export interface ITargetLocation { locations: string[]; } export declare class RepeatableQuestController { - private timeUtil; - private logger; - private randomUtil; - private mathUtil; - private jsonUtil; - private databaseServer; - private itemHelper; - private presetHelper; - private profileHelper; - private ragfairServerHelper; - private itemEventRouter; - private paymentService; - private objectId; - private configServer; - private questConfig; + protected timeUtil: TimeUtil; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected mathUtil: MathUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected itemEventRouter: ItemEventRouter; + protected paymentService: PaymentService; + protected objectId: ObjectId; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, itemEventRouter: ItemEventRouter, paymentService: PaymentService, objectId: ObjectId, configServer: ConfigServer); /** * This is the method reached by the /client/repeatalbeQuests/activityPeriods endpoint @@ -88,7 +89,7 @@ export declare class RepeatableQuestController { * @param {string} sessionId Player's session id * @returns {array} array of "repeatableQuestObjects" as descibed above */ - getClientRepeatableQuests(info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; + getClientRepeatableQuests(_info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; /** * This method is called by GetClientRepeatableQuests and creates one element of quest type format (see assets/database/templates/repeatableQuests.json). * It randomly draws a quest type (currently Elimination, Completion or Exploration) as well as a trader who is providing the quest diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/TradeController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/TradeController.d.ts index f0a177b..c86745c 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/TradeController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/TradeController.d.ts @@ -9,11 +9,11 @@ import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTr import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ILogger } from "../models/spt/utils/ILogger"; declare class TradeController { - private logger; - private itemEventRouter; - private tradeHelper; - private profileHelper; - private ragfairServer; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected tradeHelper: TradeHelper; + protected profileHelper: ProfileHelper; + protected ragfairServer: RagfairServer; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, tradeHelper: TradeHelper, profileHelper: ProfileHelper, ragfairServer: RagfairServer); confirmTrading(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid?: boolean, upd?: Upd): IItemEventRouterResponse; confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/TraderController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/TraderController.d.ts index 36eac75..7bab158 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/TraderController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/TraderController.d.ts @@ -8,14 +8,14 @@ import { TraderAssortService } from "../services/TraderAssortService"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class TraderController { - private logger; - private databaseServer; - private traderAssortHelper; - private profileHelper; - private traderHelper; - private timeUtil; - private traderAssortService; - private jsonUtil; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected traderAssortHelper: TraderAssortHelper; + protected profileHelper: ProfileHelper; + protected traderHelper: TraderHelper; + protected timeUtil: TimeUtil; + protected traderAssortService: TraderAssortService; + protected jsonUtil: JsonUtil; constructor(logger: ILogger, databaseServer: DatabaseServer, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, timeUtil: TimeUtil, traderAssortService: TraderAssortService, jsonUtil: JsonUtil); load(): void; getTrader(traderID: string, sessionID: string): ITraderBase; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/WeatherController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/WeatherController.d.ts index 4f8bcf1..ca7f5eb 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/WeatherController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/WeatherController.d.ts @@ -1,10 +1,11 @@ -import { ConfigServer } from "../servers/ConfigServer"; import { WeatherGenerator } from "../generators/WeatherGenerator"; import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { ConfigServer } from "../servers/ConfigServer"; export declare class WeatherController { - private weatherGenerator; - private configServer; - private weatherConfig; + protected weatherGenerator: WeatherGenerator; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer); generate(): IWeatherData; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/WishlistController.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/WishlistController.d.ts index 5ef8df3..a96c522 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/WishlistController.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/controllers/WishlistController.d.ts @@ -3,7 +3,7 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; export declare class WishlistController { - private itemEvenRouter; + protected itemEvenRouter: ItemEventRouter; constructor(itemEvenRouter: ItemEventRouter); addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotGenerator.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotGenerator.d.ts index af7d7d4..88a8014 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotGenerator.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotGenerator.d.ts @@ -1,36 +1,46 @@ -import { HashUtil } from "../utils/HashUtil"; -import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; -import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; -import { IBotBase } from "../models/eft/common/tables/IBotBase"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { JsonUtil } from "../utils/JsonUtil"; -import { ConfigServer } from "../servers/ConfigServer"; -import { GameEventHelper } from "../helpers/GameEventHelper"; -import { BotInventoryGenerator } from "./BotInventoryGenerator"; import { BotHelper } from "../helpers/BotHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { Health as PmcHealth } from "../models/eft/common/IPmcData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { Health, Inventory, Skills } 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 { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotInventoryGenerator } from "./BotInventoryGenerator"; +declare namespace BotGenerator { + interface IRandomisedBotLevelResult { + level: number; + exp: number; + } +} export declare class BotGenerator { - private logger; - private hashUtil; - private randomUtil; - private jsonUtil; - private databaseServer; - private botInventoryGenerator; - private botHelper; - private gameEventHelper; - private configServer; - private botConfig; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected botInventoryGenerator: BotInventoryGenerator; + protected botHelper: BotHelper; + protected gameEventHelper: GameEventHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; - private generateBot; - private generateRandomLevel; + protected generateBot(bot: IBotBase, role: string, isPmc: boolean): IBotBase; + protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; /** Converts health object to the required format */ - private generateHealth; - private generateSkills; - private getPmcRole; - private removeChristmasItemsFromBotInventory; - private generateId; - private generateInventoryID; - private getPMCDifficulty; - private generateDogtag; + protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; + protected generateSkills(skillsObj: Skills): Skills; + protected getPmcRole(pmcSide: string): string; + protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + protected generateId(bot: IBotBase): IBotBase; + protected generateInventoryID(profile: IBotBase): IBotBase; + protected getPMCDifficulty(requestedDifficulty: string): string; + protected generateDogtag(bot: IBotBase): IBotBase; } +export {}; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotInventoryGenerator.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotInventoryGenerator.d.ts index 0cdbacb..783d0c5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotInventoryGenerator.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotInventoryGenerator.d.ts @@ -1,5 +1,5 @@ import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; -import { Inventory, Chances, Generation } from "../models/eft/common/tables/IBotType"; +import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; @@ -9,16 +9,16 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; export declare class BotInventoryGenerator { - private logger; - private hashUtil; - private randomUtil; - private databaseServer; - private botWeaponGenerator; - private botLootGenerator; - private botGeneratorHelper; - private weightedRandomHelper; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected botWeaponGenerator: BotWeaponGenerator; + 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(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; - private generateEquipment; - private generateInventoryBase; + protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; + protected generateInventoryBase(): PmcInventory; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotLootGenerator.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotLootGenerator.d.ts index 3bf1b36..1d91836 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotLootGenerator.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotLootGenerator.d.ts @@ -1,27 +1,29 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { HandbookHelper } from "../helpers/HandbookHelper"; import { PMCLootGenerator } from "../generators/PMCLootGenerator"; +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { HandbookHelper } from "../helpers/HandbookHelper"; import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; import { ItemMinMax, Items } from "../models/eft/common/tables/IBotType"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; export declare class BotLootGenerator { - private jsonUtil; - private hashUtil; - private randomUtil; - private databaseServer; - private handbookHelper; - private botGeneratorHelper; - private pmcLootGenerator; - private configServer; - private botConfig; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected pmcLootGenerator: PMCLootGenerator; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, pmcLootGenerator: PMCLootGenerator, configServer: ConfigServer); generateLoot(lootPool: Items, itemCounts: ItemMinMax, isPmc: boolean, inventory: PmcInventory): void; - private getRandomisedCount; - private addLootFromPool; + protected getRandomisedCount(min: number, max: number, nValue: number): number; + protected addLootFromPool(pool: ITemplateItem[], equipmentSlots: string[], count: number, inventory: PmcInventory, totalValueLimit?: number, useLimits?: boolean): void; /** Compares two item templates by their price to spawn chance ratio */ - private compareByValue; + protected compareByValue(a: ITemplateItem, b: ITemplateItem): number; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotWeaponGenerator.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotWeaponGenerator.d.ts index e8f91cb..13fe7df 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotWeaponGenerator.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/BotWeaponGenerator.d.ts @@ -3,22 +3,24 @@ import { ItemHelper } from "../helpers/ItemHelper"; import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; import { MinMax, Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { RandomUtil } from "../utils/RandomUtil"; export declare class BotWeaponGenerator { - private logger; - private hashUtil; - private databaseServer; - private itemHelper; - private weightedRandomHelper; - private botGeneratorHelper; - private randomUtil; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected weightedRandomHelper: WeightedRandomHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected randomUtil: RandomUtil; constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil); generateWeapon(equipmentSlot: string, weaponPool: Record, modPool: Mods, modChances: ModsChances, magCounts: MinMax, botRole: string, isPmc: boolean, inventory: PmcInventory): void; /** Checks if all required slots are occupied on a weapon and all it's mods */ - private isWeaponValid; + protected isWeaponValid(itemList: Item[]): boolean; /** * Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets. * Additionally, adds extra bullets to SecuredContainer @@ -29,8 +31,8 @@ export declare class BotWeaponGenerator { * @param {*} ammoTpl * @returns */ - private generateExtraMagazines; - private addBullets; + protected generateExtraMagazines(weaponMods: Item[], weaponTemplate: ITemplateItem, magCounts: MinMax, ammoTpl: string, inventory: PmcInventory): void; + protected addBullets(ammoTpl: string, bulletCount: number, inventory: PmcInventory): void; /** * Finds and returns tpl of ammo that should be used, while making sure it's compatible * @@ -38,7 +40,7 @@ export declare class BotWeaponGenerator { * @param {*} weaponTemplate * @returns */ - private getCompatibleAmmo; + protected getCompatibleAmmo(weaponMods: Item[], weaponTemplate: ITemplateItem): string; /** Fill existing magazines to full, while replacing their contents with specified ammo */ - private fillExistingMagazines; + protected fillExistingMagazines(weaponMods: Item[], magazine: Item, ammoTpl: string): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/LocationGenerator.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/LocationGenerator.d.ts index b7ba7c5..bd368b5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/LocationGenerator.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/LocationGenerator.d.ts @@ -1,44 +1,46 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { IStaticContainerProps, IStaticLootDetails, IStaticAmmoDetails, IStaticForcedProps } from "../models/eft/common/tables/ILootBase"; +import { ContainerHelper } from "../helpers/ContainerHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; import { ILooseLoot, SpawnpointTemplate } from "../models/eft/common/ILooseLoot"; import { Item } from "../models/eft/common/tables/IItem"; -import { ItemHelper } from "../helpers/ItemHelper"; -import { GameEventHelper } from "../helpers/GameEventHelper"; -import { ContainerHelper } from "../helpers/ContainerHelper"; -import { PresetHelper } from "../helpers/PresetHelper"; +import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "../models/eft/common/tables/ILootBase"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILocationConfig } from "../models/spt/config/ILocationConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { JsonUtil } from "../utils/JsonUtil"; import { MathUtil } from "../utils/MathUtil"; import { ObjectId } from "../utils/ObjectId"; -import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; -import { ILogger } from "../models/spt/utils/ILogger"; +import { RandomUtil } from "../utils/RandomUtil"; export interface IContainerItem { items: Item[]; width: number; height: number; } export declare class LocationGenerator { - private logger; - private jsonUtil; - private objectId; - private randomUtil; - private ragfairServerHelper; - private itemHelper; - private mathUtil; - private gameEventHelper; - private containerHelper; - private presetHelper; - private configServer; - private locationConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected objectId: ObjectId; + protected randomUtil: RandomUtil; + protected ragfairServerHelper: RagfairServerHelper; + protected itemHelper: ItemHelper; + protected mathUtil: MathUtil; + protected gameEventHelper: GameEventHelper; + protected containerHelper: ContainerHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected locationConfig: ILocationConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, objectId: ObjectId, randomUtil: RandomUtil, ragfairServerHelper: RagfairServerHelper, itemHelper: ItemHelper, mathUtil: MathUtil, gameEventHelper: GameEventHelper, containerHelper: ContainerHelper, presetHelper: PresetHelper, configServer: ConfigServer); generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; - private getLooseLootMultiplerForLocation; - private getStaticLootMultiplerForLocation; + protected getLooseLootMultiplerForLocation(location: string): number; + protected getStaticLootMultiplerForLocation(location: string): number; generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; - private createItem; - private getRandomCompatibleCaliberTemplateId; - private getRandomValidCaliber; - private drawAmmoTpl; - private createRandomMagCartridges; - private createCartidges; + protected createItem(tpl: string, staticAmmoDist: Record, parentId?: string): IContainerItem; + protected getRandomCompatibleCaliberTemplateId(item: ITemplateItem): string; + protected getRandomValidCaliber(magTemplate: ITemplateItem): string; + protected drawAmmoTpl(caliber: string, staticAmmoDist: Record): string; + protected createRandomMagCartridges(magTemplate: ITemplateItem, parentId: string, staticAmmoDist: Record, caliber?: string): Item; + protected createCartidges(parentId: string, ammoTpl: string, stackCount: number): Item; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/PMCLootGenerator.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/PMCLootGenerator.d.ts index 601431b..64e6f7f 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/PMCLootGenerator.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/PMCLootGenerator.d.ts @@ -1,13 +1,14 @@ import { ItemHelper } from "../helpers/ItemHelper"; import { DatabaseServer } from "../servers/DatabaseServer"; import { ConfigServer } from "../servers/ConfigServer"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; export declare class PMCLootGenerator { - private itemHelper; - private databaseServer; - private configServer; - private pocketLootPool; - private backpackLootPool; - private botConfig; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected pocketLootPool: string[]; + protected backpackLootPool: string[]; + protected botConfig: IBotConfig; constructor(itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); generatePMCPocketLootPool(): string[]; generatePMCBackpackLootPool(): string[]; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/RagfairAssortGenerator.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/RagfairAssortGenerator.d.ts index 8b52a90..cbdd7f2 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/RagfairAssortGenerator.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/RagfairAssortGenerator.d.ts @@ -1,17 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; import { Item } from "../models/eft/common/tables/IItem"; import { DatabaseServer } from "../servers/DatabaseServer"; -import { ItemHelper } from "../helpers/ItemHelper"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; export declare class RagfairAssortGenerator { - private jsonUtil; - private hashUtil; - private itemHelper; - private databaseServer; - private generatedAssortItems; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected generatedAssortItems: Item[]; constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + /** + * Get an array of unique items that can be sold on the flea + * @returns array of unique items + */ getAssortItems(): Item[]; - private assortsAreGenerated; - private generateRagfairAssortItems; - private createRagfairAssortItem; + protected assortsAreGenerated(): boolean; + /** + * Generate an array of items the flea can sell + * @returns array of unique items + */ + protected generateRagfairAssortItems(): Item[]; + protected createRagfairAssortItem(tplId: string, id?: string): Item; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/RagfairOfferGenerator.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/RagfairOfferGenerator.d.ts index cb2566c..de53ea9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/RagfairOfferGenerator.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/RagfairOfferGenerator.d.ts @@ -1,49 +1,58 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; -import { SaveServer } from "../servers/SaveServer"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { IBarterScheme } from "../models/eft/common/tables/ITrader"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; -import { Item } from "../models/eft/common/tables/IItem"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { PresetHelper } from "../helpers/PresetHelper"; import { RagfairAssortGenerator } from "./RagfairAssortGenerator"; -import { ItemHelper } from "../helpers/ItemHelper"; -import { RagfairOfferService } from "../services/RagfairOfferService"; -import { RagfairPriceService } from "../services/RagfairPriceService"; -import { FenceService } from "../services/FenceService"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class RagfairOfferGenerator { - private logger; - private jsonUtil; - private hashUtil; - private randomUtil; - private timeUtil; - private databaseServer; - private ragfairServerHelper; - private saveServer; - private presetHelper; - private ragfairAssortGenerator; - private ragfairOfferService; - private ragfairPriceService; - private fenceService; - private itemHelper; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected saveServer: SaveServer; + protected presetHelper: PresetHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairPriceService: RagfairPriceService; + protected fenceService: FenceService; + protected itemHelper: ItemHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer); createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; - private getTraderId; - private getRating; - private getRatingGrowing; - private getOfferEndTime; + protected getTraderId(userID: string): string; + protected getRating(userID: string): number; + protected getRatingGrowing(userID: string): boolean; + protected getOfferEndTime(userID: string, time: number): number; + /** + * Create multiple offers for items by using a unique list of items we've generated previously + * @param expiredOffers + */ generateDynamicOffers(expiredOffers?: Item[]): void; generateTraderOffers(traderID: string): void; - private getItemCondition; - private addMissingCondition; - private getOfferRequirements; + protected getItemCondition(userID: string, items: Item[], itemDetails: ITemplateItem): Item[]; + protected addMissingCondition(item: Item): Item; + protected getOfferRequirements(items: Item[]): { + count: number; + _tpl: string; + }[]; /** * Create a flea offer and store it in the Ragfair server offers array */ diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/WeatherGenerator.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/WeatherGenerator.d.ts index b9faa3a..23aa169 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/WeatherGenerator.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/generators/WeatherGenerator.d.ts @@ -1,19 +1,20 @@ import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; import { ConfigServer } from "../servers/ConfigServer"; import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class WeatherGenerator { - private weightedRandomHelper; - private randomUtil; - private timeUtil; - private configServer; - private weatherConfig; + protected weightedRandomHelper: WeightedRandomHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); calculateTime(data: IWeatherData): IWeatherData; generateWeather(data: IWeatherData): IWeatherData; - private getWeightedFog; - private getWeightedRain; - private getRandomFloat; - private getRandomInt; + protected getWeightedFog(): string; + protected getWeightedRain(): number; + protected getRandomFloat(node: string): number; + protected getRandomInt(node: string): number; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/AssortHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/AssortHelper.d.ts index 33cb5c6..15586b9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/AssortHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/AssortHelper.d.ts @@ -5,12 +5,32 @@ import { DatabaseServer } from "../servers/DatabaseServer"; import { ItemHelper } from "./ItemHelper"; import { QuestHelper } from "./QuestHelper"; export declare class AssortHelper { - private logger; - private itemHelper; - private databaseServer; - private questHelper; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; constructor(logger: ILogger, itemHelper: ItemHelper, databaseServer: DatabaseServer, questHelper: QuestHelper); + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort assort items from a trader + * @returns assort items minus locked quest assorts + */ + stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort traders assorts + * @returns traders assorts minus locked loyality assorts + */ + stripLockedLoyaltyAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove an item from an assort + * @param assort assort to modify + * @param itemID item id to remove from asort + * @returns Modified assort + */ removeItemFromAssort(assort: ITraderAssort, itemID: string): ITraderAssort; - stripQuestAssort(pmcProfile: IPmcData, sessionId: string, traderId: string, assort: ITraderAssort): ITraderAssort; - stripLoyaltyAssort(pmcProfile: IPmcData, sessionId: string, traderId: string, assort: ITraderAssort): ITraderAssort; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/BotGeneratorHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/BotGeneratorHelper.d.ts index 6abdc07..c382fc9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/BotGeneratorHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/BotGeneratorHelper.d.ts @@ -1,8 +1,9 @@ import { DurabilityLimitsHelper } from "../helpers/DurabilityLimitsHelper"; import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; import { Mods, ModsChances } from "../models/eft/common/tables/IBotType"; -import { Item, Upd } from "../models/eft/common/tables/IItem"; -import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { Item, Repairable, Upd } from "../models/eft/common/tables/IItem"; +import { Grid, ITemplateItem, Slot } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -12,18 +13,18 @@ import { RandomUtil } from "../utils/RandomUtil"; import { ContainerHelper } from "./ContainerHelper"; import { InventoryHelper } from "./InventoryHelper"; import { ItemHelper } from "./ItemHelper"; -declare class BotGeneratorHelper { - private logger; - private jsonUtil; - private hashUtil; - private randomUtil; - private databaseServer; - private durabilityLimitsHelper; - private itemHelper; - private inventoryHelper; - private containerHelper; - private configServer; - private botConfig; +export declare class BotGeneratorHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected durabilityLimitsHelper: DurabilityLimitsHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected containerHelper: ContainerHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, configServer: ConfigServer); generateModsForItem(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, isPmc?: boolean): Item[]; /** @@ -37,16 +38,50 @@ declare class BotGeneratorHelper { * @param {string} parentId The CylinderMagazine's UID * @param {object} parentTemplate The CylinderMagazine's template */ - private fillCamora; + protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void; generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): { - "upd"?: Upd; + upd?: Upd; }; - private getModTplFromItemDb; + /** + * Create a repairable object for a weapon that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + /** + * Create a repairable object for an armor that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string; + /** + * Sort by spawn chance, highest to lowest, higher is more common + * @param unsortedModArray String array to sort + * @returns Sorted string array + */ + protected sortModArray(unsortedModArray: string[]): string[]; + /** + * Can an item be added to an item without issue + * @param items + * @param tplToCheck + * @param equipmentSlot + * @returns true if possible + */ isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean; - /** Adds an item with all its childern into specified equipmentSlots, wherever it fits. - * Returns a `boolean` indicating success. */ + /** + * Adds an item with all its childern into specified equipmentSlots, wherever it fits. + * @param equipmentSlots + * @param parentId + * @param parentTpl + * @param itemWithChildren + * @param inventory + * @returns a `boolean` indicating item was added + */ addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: PmcInventory): boolean; - private itemAllowedInContainer; + protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean; } export declare class ExhaustableArray { private itemPool; @@ -58,22 +93,3 @@ export declare class ExhaustableArray { getFirstValue(): T; hasValues(): boolean; } -declare namespace BotGeneratorHelper { - enum EquipmentSlots { - HEADWEAR = "Headwear", - EARPIECE = "Earpiece", - FACE_COVER = "FaceCover", - ARMOR_VEST = "ArmorVest", - EYEWEAR = "Eyewear", - ARM_BAND = "ArmBand", - TACTICAL_VEST = "TacticalVest", - POCKETS = "Pockets", - BACKPACK = "Backpack", - SECURED_CONTAINER = "SecuredContainer", - FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", - SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", - HOLSTER = "Holster", - SCABBARD = "Scabbard" - } -} -export { BotGeneratorHelper }; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/BotHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/BotHelper.d.ts index 032218b..0cb1227 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/BotHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/BotHelper.d.ts @@ -1,22 +1,44 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; 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 { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class BotHelper { - private logger; - private jsonUtil; - private databaseServer; - private randomUtil; - private configServer; - private botConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); getBotDifficultySettings(type: string, difficulty: string): Difficulty; getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Randomise the chance the PMC will attack their own side + * @param difficultySettings pmc difficulty settings + */ randomisePmcHostility(difficultySettings: Difficulty): void; isBotPmc(botRole: string): boolean; isBotBoss(botRole: string): boolean; isBotFollower(botRole: string): boolean; + /** + * Add a bot to the FRIENDLY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typeToAdd bot type to add to friendly list + */ addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; + /** + * Add a bot to the ENEMY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to enemy list + */ + addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Add a bot to the REVENGE_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to revenge list + */ + addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ContainerHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ContainerHelper.d.ts index 34cd1e4..3c2ee93 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ContainerHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ContainerHelper.d.ts @@ -6,7 +6,7 @@ export declare class FindSlotResult { constructor(success?: boolean, x?: any, y?: any, rotation?: boolean); } export declare class ContainerHelper { - private locateSlot; + protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean; findSlotForItem(container2D: number[][], itemWidth: number, itemHeight: number): FindSlotResult; fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): any; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/DialogueHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/DialogueHelper.d.ts index d8082e4..9776c6a 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/DialogueHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/DialogueHelper.d.ts @@ -1,17 +1,18 @@ +import { Dialogue, MessageContent, MessagePreview } from "../models/eft/profile/IAkiProfile"; +import { MessageType } from "../models/enums/MessageType"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; -import { ItemHelper } from "./ItemHelper"; -import { Dialogue, MessageContent, MessagePreview, MessageType } from "../models/eft/profile/IAkiProfile"; import { HashUtil } from "../utils/HashUtil"; -import { NotifierHelper } from "./NotifierHelper"; +import { ItemHelper } from "./ItemHelper"; import { NotificationSendHelper } from "./NotificationSendHelper"; +import { NotifierHelper } from "./NotifierHelper"; export declare class DialogueHelper { - private hashUtil; - private saveServer; - private databaseServer; - private notifierHelper; - private notificationSendHelper; - private itemHelper; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected notificationSendHelper: NotificationSendHelper; + protected itemHelper: ItemHelper; constructor(hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, notificationSendHelper: NotificationSendHelper, itemHelper: ItemHelper); createMessageContext(templateId: string, messageType: MessageType, maxStoreTime: number): MessageContent; addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards?: any[]): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/DurabilityLimitsHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/DurabilityLimitsHelper.d.ts index ee8c887..07a5db1 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/DurabilityLimitsHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/DurabilityLimitsHelper.d.ts @@ -1,25 +1,26 @@ -import { ConfigServer } from "../servers/ConfigServer"; import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; import { RandomUtil } from "../utils/RandomUtil"; import { BotHelper } from "./BotHelper"; export declare class DurabilityLimitsHelper { - private randomUtil; - private botHelper; - private configServer; - private botConfig; + protected randomUtil: RandomUtil; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; constructor(randomUtil: RandomUtil, botHelper: BotHelper, configServer: ConfigServer); getRandomisedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number; getRandomisedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number; getRandomisedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; getRandomisedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; - private generateMaxWeaponDurability; - private generateMaxPmcArmorDurability; - private getLowestMaxWeaponFromConfig; - private getHighestMaxWeaponDurabilityFromConfig; - private generateWeaponDurability; - private generateArmorDurability; - private getMinWeaponDeltaFromConfig; - private getMaxWeaponDeltaFromConfig; - private getMinArmorDeltaFromConfig; - private getMaxArmorDeltaFromConfig; + protected generateMaxWeaponDurability(botRole: string): number; + protected generateMaxPmcArmorDurability(itemMaxDurability: number): number; + protected getLowestMaxWeaponFromConfig(botRole: string): number; + protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number; + protected generateWeaponDurability(botRole: string, maxDurability: number): number; + protected generateArmorDurability(botRole: string, maxDurability: number): number; + protected getMinWeaponDeltaFromConfig(botRole: string): number; + protected getMaxWeaponDeltaFromConfig(botRole: string): number; + protected getMinArmorDeltaFromConfig(botRole: string): number; + protected getMaxArmorDeltaFromConfig(botRole: string): number; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ExtendedProfileHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ExtendedProfileHelper.d.ts index 4dd7d3a..d8b754d 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ExtendedProfileHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ExtendedProfileHelper.d.ts @@ -1,5 +1,5 @@ import { BotGenerator } from "../generators/BotGenerator"; -import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcData, Skills, Stats } from "../models/eft/common/IPmcData"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; import { FenceService } from "../services/FenceService"; @@ -9,14 +9,14 @@ import { Watermark } from "../utils/Watermark"; import { ItemHelper } from "./ItemHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class ExtendedProfileHelper extends ProfileHelper { - private botGenerator; + protected botGenerator: BotGenerator; constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService, botGenerator: BotGenerator); generatePlayerScav(sessionID: string): IPmcData; - private getScavSkills; - private removeSecureContainer; - private getDefaultScavSkills; - private getScavStats; - private getScavLevel; - private getScavExperience; - private setScavCooldownTimer; + protected getScavSkills(sessionID: string): Skills; + protected removeSecureContainer(profile: IPmcData): IPmcData; + protected getDefaultScavSkills(): Skills; + protected getScavStats(sessionID: string): Stats; + protected getScavLevel(sessionID: string): number; + protected getScavExperience(sessionID: string): number; + protected setScavCooldownTimer(profile: IPmcData, pmcData: IPmcData): IPmcData; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/GameEventHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/GameEventHelper.d.ts index 8131d31..b2d6377 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/GameEventHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/GameEventHelper.d.ts @@ -1,6 +1,6 @@ import { DatabaseServer } from "../servers/DatabaseServer"; export declare class GameEventHelper { - private databaseServer; + protected databaseServer: DatabaseServer; constructor(databaseServer: DatabaseServer); get EVENT(): Record; get christmasEventItems(): string[]; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HandbookHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HandbookHelper.d.ts index aed6984..b47d466 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HandbookHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HandbookHelper.d.ts @@ -9,7 +9,7 @@ export declare class LookupCollection { constructor(); } export declare class HandbookHelper { - private lookup; + protected lookup: LookupCollection; hydrateLookup(lookup: LookupCollection): void; getTemplatePrice(x: string): number; templatesWithParent(x: string): string[]; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HealthHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HealthHelper.d.ts index fb5bed7..518c23f 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HealthHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HealthHelper.d.ts @@ -1,23 +1,27 @@ -import { SaveServer } from "../servers/SaveServer"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHealthConfig } from "../models/spt/config/IHealthConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; import { JsonUtil } from "../utils/JsonUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class HealthHelper { - private jsonUtil; - private logger; - private timeUtil; - private saveServer; - private configServer; - private healthConfig; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected configServer: ConfigServer; + protected healthConfig: IHealthConfig; constructor(jsonUtil: JsonUtil, logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, configServer: ConfigServer); resetVitality(sessionID: string): IAkiProfile; saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; - private saveHealth; - private saveEffects; - private addEffect; - private isEmpty; + protected saveHealth(pmcData: IPmcData, sessionID: string): void; + protected saveEffects(pmcData: IPmcData, sessionID: string): void; + protected addEffect(pmcData: IPmcData, sessionID: string, effect: { + bodyPart: string; + effectType: string; + }): void; + protected isEmpty(map: any): boolean; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HideoutHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HideoutHelper.d.ts index 5b4a5ad..76b337f 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HideoutHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HideoutHelper.d.ts @@ -1,10 +1,12 @@ -import { IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Common, HideoutArea, IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Upd } from "../models/eft/common/tables/IItem"; import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { StageBonus } from "../models/eft/hideout/IHideoutArea"; import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -17,26 +19,26 @@ import { TimeUtil } from "../utils/TimeUtil"; import { InventoryHelper } from "./InventoryHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class HideoutHelper { - private logger; - private hashUtil; - private timeUtil; - private randomUtil; - private databaseServer; - private itemEventRouter; - private httpResponse; - private profileHelper; - private inventoryHelper; - private playerService; - private configServer; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected inventoryHelper: InventoryHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; static BITCOIN_FARM: string; - private WATER_COLLECTOR; - private BITCOIN; - private EXPEDITIONARY_FUEL_TANK; + protected WATER_COLLECTOR: string; + protected BITCOIN: string; + protected EXPEDITIONARY_FUEL_TANK: string; static NAME_BACKENDCOUNTERS_CRAFTING: string; static SKILL_NAME_HIDEOUT: string; static HOUR_FOR_SKILL_CRAFTING: number; static SKILL_NAME_CRAFITING: string; - private hideoutConfig; + protected hideoutConfig: IHideoutConfig; constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer); registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; /** @@ -46,18 +48,20 @@ export declare class HideoutHelper { initProduction(recipeId: string, productionTime: number): Production; isProductionType(productive: Productive): productive is Production; applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void; - private applySkillXPBoost; + protected applySkillXPBoost(pmcData: IPmcData, bonus: StageBonus): void; updatePlayerHideout(sessionID: string): void; - private updateFuel; - private updateWaterFilters; - private getAreaUpdObject; - private updateAirFilters; - private updateBitcoinFarm; - private getBTCSlots; - private getManagementSkillsSlots; - private hasManagementSkillSlots; - private getHideoutManagementSkill; - private getHideoutManagementConsumptionBonus; + protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void; + protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean; + protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateWaterFilters(waterFilterArea: HideoutArea, pwProd: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea; + protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd; + protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production; + protected getBTCSlots(pmcData: IPmcData): number; + protected getManagementSkillsSlots(): number; + protected hasManagementSkillSlots(pmcData: IPmcData): boolean; + protected getHideoutManagementSkill(pmcData: IPmcData): Common; + protected getHideoutManagementConsumptionBonus(pmcData: IPmcData): number; isProduction(productive: Productive): productive is Production; getBTC(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; getRandomAmountRewardForScavCase(itemToCalculate: ITemplateItem): number; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HttpServerHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HttpServerHelper.d.ts index 2e40814..c6e5296 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HttpServerHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/HttpServerHelper.d.ts @@ -1,8 +1,19 @@ +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { ConfigServer } from "../servers/ConfigServer"; export declare class HttpServerHelper { - private configServer; - private httpConfig; - private mime; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + protected mime: { + css: string; + bin: string; + html: string; + jpg: string; + js: string; + json: string; + png: string; + svg: string; + txt: string; + }; constructor(configServer: ConfigServer); getMimeText(key: string): string; buildUrl(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/InRaidHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/InRaidHelper.d.ts index e79d384..05b6fdf 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/InRaidHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/InRaidHelper.d.ts @@ -8,15 +8,15 @@ import { JsonUtil } from "../utils/JsonUtil"; import { InventoryHelper } from "./InventoryHelper"; import { PaymentHelper } from "./PaymentHelper"; export declare class InRaidHelper { - private logger; - private saveServer; - private jsonUtil; - private databaseServer; - private inventoryHelper; - private paymentHelper; + protected logger: ILogger; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); - private removePlayer; - private removeMapAccessKey; + protected removePlayer(sessionID: string): void; + protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void; addUpdToMoneyFromRaid(items: Item[]): void; /** * Add positive karma for PMC kills diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/InventoryHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/InventoryHelper.d.ts index 00e95d3..dc7cbca 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/InventoryHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/InventoryHelper.d.ts @@ -5,6 +5,7 @@ import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMe import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInventoryConfig } from "../models/spt/config/IInventoryConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -25,26 +26,26 @@ export interface OwnerInventoryItems { isMail: boolean; } export declare class InventoryHelper { - private logger; - private jsonUtil; - private hashUtil; - private httpResponse; - private fenceService; - private databaseServer; - private paymentHelper; - private traderAssortHelper; - private dialogueHelper; - private itemHelper; - private containerHelper; - private profileHelper; - private configServer; - private inventoryConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected httpResponse: HttpResponseUtil; + protected fenceService: FenceService; + protected databaseServer: DatabaseServer; + protected paymentHelper: PaymentHelper; + protected traderAssortHelper: TraderAssortHelper; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected containerHelper: ContainerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected inventoryConfig: IInventoryConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, httpResponse: HttpResponseUtil, fenceService: FenceService, databaseServer: DatabaseServer, paymentHelper: PaymentHelper, traderAssortHelper: TraderAssortHelper, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, containerHelper: ContainerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; getItemSize(itemTpl: string, itemID: string, inventoryItem: Item[]): Record; - private getSizeByInventoryItemHash; - private getInventoryItemHash; + protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): Record; + protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash; getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]; /** * Based on the item action, determine whose inventories we should be looking at for from and to. @@ -56,9 +57,9 @@ export declare class InventoryHelper { * @param {string} sessionID * @returns Array */ - private getStashSlotMap; - private getStashType; - private getPlayerStashSize; + protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][]; + protected getStashType(sessionID: string): string; + protected getPlayerStashSize(sessionID: string): Record; /** * Internal helper function to transfer an item from one profile to another. * fromProfileData: Profile of the source. @@ -73,5 +74,12 @@ export declare class InventoryHelper { /** * Internal helper function to handle cartridges in inventory if any of them exist. */ - private handleCartridges; + protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void; } +declare namespace InventoryHelper { + interface InventoryItemHash { + byItemId: Record; + byParentId: Record; + } +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ItemHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ItemHelper.d.ts index 8c1175a..f124cb1 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ItemHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ItemHelper.d.ts @@ -1,15 +1,15 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { InsuredItem, IPmcData } from "../models/eft/common/IPmcData"; -import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; declare class ItemHelper { - private logger; - private hashUtil; - private jsonUtil; - private databaseServer; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer); /** * Checks if a id is a valid item. Valid meaning that it's an item that be stored in stash @@ -139,98 +139,9 @@ declare class ItemHelper { getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize; } declare namespace ItemHelper { - enum BaseClasses { - WEAPON = "5422acb9af1c889c16000029", - ARMOR = "5448e54d4bdc2dcc718b4568", - VEST = "5448e5284bdc2dcb718b4567", - BACKPACK = "5448e53e4bdc2d60728b4567", - VISORS = "5448e5724bdc2ddf718b4568", - FOOD = "5448e8d04bdc2ddf718b4569", - DRINK = "5448e8d64bdc2dce718b4568", - BARTER_ITEM = "5448eb774bdc2d0a728b4567", - INFO = "5448ecbe4bdc2d60728b4568", - MEDKIT = "5448f39d4bdc2d0a728b4568", - DRUGS = "5448f3a14bdc2d27728b4569", - STIMULATOR = "5448f3a64bdc2d60728b456a", - MEDICAL = "5448f3ac4bdc2dce718b4569", - MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", - MOD = "5448fe124bdc2da5018b4567", - FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", - FUEL = "5d650c3e815116009f6201d2", - GEAR_MOD = "55802f3e4bdc2de7118b4584", - STOCK = "55818a594bdc2db9688b456a", - FOREGRIP = "55818af64bdc2d5b648b4570", - MASTER_MOD = "55802f4a4bdc2ddb688b4569", - MOUNT = "55818b224bdc2dde698b456f", - MUZZLE = "5448fe394bdc2d0d028b456c", - SIGHTS = "5448fe7a4bdc2d6f028b456b", - MEDS = "543be5664bdc2dd4348b4569", - MONEY = "543be5dd4bdc2deb348b4569", - KEY = "543be5e94bdc2df1348b4568", - KEY_MECHANICAL = "5c99f98d86f7745c314214b3", - KEYCARD = "5c164d2286f774194c5e69fa", - EQUIPMENT = "543be5f84bdc2dd4348b456a", - THROW_WEAPON = "543be6564bdc2df4348b4568", - FOOD_DRINK = "543be6674bdc2df1348b4569", - PISTOL = "5447b5cf4bdc2d65278b4567", - SMG = "5447b5e04bdc2d62278b4567", - ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", - ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", - SHOTGUN = "5447b6094bdc2dc3278b4567", - MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", - SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", - MACHINE_GUN = "5447bed64bdc2d97278b4568", - GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", - SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", - SPEC_ITEM = "5447e0e74bdc2d3c308b4567", - KNIFE = "5447e1d04bdc2dff2f8b4567", - AMMO = "5485a8684bdc2da71d8b4567", - AMMO_BOX = "543be5cb4bdc2deb348b4568", - LOOT_CONTAINER = "566965d44bdc2d814c8b4571", - MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", - SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", - STASH = "566abbb64bdc2d144c8b457d", - SORTING_TABLE = "6050cac987d3f925bf016837", - LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", - SIMPLE_CONTAINER = "5795f317245977243854e041", - INVENTORY = "55d720f24bdc2d88028b456d", - STATIONARY_CONTAINER = "567583764bdc2d98058b456e", - POCKETS = "557596e64bdc2dc2118b4571", - ARMBAND = "5b3f15d486f77432d0509248", - DOG_TAG_USEC = "59f32c3b86f77472a31742f0", - DOG_TAG_BEAR = "59f32bb586f774757e1e8442", - JEWELRY = "57864a3d24597754843f8721", - ELECTRONICS = "57864a66245977548f04a81f", - BUILDING_MATERIAL = "57864ada245977548638de91", - TOOL = "57864bb7245977548b3b66c2", - HOUSEHOLD_GOODS = "57864c322459775490116fbf", - LUBRICANT = "57864e4c24597754843f8723", - BATTERY = "57864ee62459775490116fc1", - ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", - REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", - TACTICAL_COMBO = "55818b164bdc2ddc698b456c", - MAGAZINE = "5448bc234bdc2d3c308b4569", - LIGHT_LASER = "55818b0e4bdc2dde698b456e", - FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", - COLLIMATOR = "55818ad54bdc2ddc698b4569", - COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", - COMPENSATOR = "550aa4af4bdc2dd4348b456e", - OPTIC_SCOPE = "55818ae44bdc2dde698b456c", - SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", - OTHER = "590c745b86f7743cc433c5f2", - SILENCER = "550aa4cd4bdc2dd8348b456c", - PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", - ITEM = "54009119af1c881c07000029", - CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" - } interface ItemSize { width: number; height: number; } - enum Money { - ROUBLES = "5449016a4bdc2d6f028b456f", - EUROS = "569668774bdc2da2298b4568", - DOLLARS = "5696686a4bdc2da3298b456a" - } } export { ItemHelper }; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/NotificationSendHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/NotificationSendHelper.d.ts index b9298da..34e62d9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/NotificationSendHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/NotificationSendHelper.d.ts @@ -2,8 +2,8 @@ import { INotification } from "../models/eft/notifier/INotifier"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { NotificationService } from "../services/NotificationService"; export declare class NotificationSendHelper { - private httpServer; - private notificationService; + protected httpServer: IHttpServer; + protected notificationService: NotificationService; constructor(httpServer: IHttpServer, notificationService: NotificationService); /** * Send notification message to the appropiate channel diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/NotifierHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/NotifierHelper.d.ts index 0d524e9..738b69a 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/NotifierHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/NotifierHelper.d.ts @@ -2,11 +2,11 @@ import { INotification } from "../models/eft/notifier/INotifier"; import { Message, MessageContentRagfair } from "../models/eft/profile/IAkiProfile"; import { HttpServerHelper } from "./HttpServerHelper"; export declare class NotifierHelper { - private httpServerHelper; + protected httpServerHelper: HttpServerHelper; /** * The default notification sent when waiting times out. */ - private defaultNotification; + protected defaultNotification: INotification; constructor(httpServerHelper: HttpServerHelper); getDefaultNotification(): INotification; /** Creates a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside */ diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/PresetHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/PresetHelper.d.ts index 0a24128..0371886 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/PresetHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/PresetHelper.d.ts @@ -1,8 +1,8 @@ import { Preset } from "../models/eft/common/IGlobals"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class PresetHelper { - private databaseServer; - private lookup; + protected databaseServer: DatabaseServer; + protected lookup: Record; constructor(databaseServer: DatabaseServer); hydratePresetStore(input: Record): void; isPreset(id: string): boolean; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ProfileHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ProfileHelper.d.ts index 508443c..6a64291 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ProfileHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/ProfileHelper.d.ts @@ -28,6 +28,6 @@ export declare class ProfileHelper { getPmcProfile(sessionID: string): IPmcData; getScavProfile(sessionID: string): IPmcData; getDefaultCounters(): Stats; - private isWiped; - private getServerVersion; + protected isWiped(sessionID: string): boolean; + protected getServerVersion(): string; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/QuestConditionHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/QuestConditionHelper.d.ts index 2a0ee94..90ee560 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/QuestConditionHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/QuestConditionHelper.d.ts @@ -3,5 +3,5 @@ export declare class QuestConditionHelper { getQuestConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; getLevelConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; getLoyaltyConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; - private filterConditions; + protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/QuestHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/QuestHelper.d.ts index 9e2dd5e..f32c85c 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/QuestHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/QuestHelper.d.ts @@ -3,6 +3,7 @@ import { AvailableForConditions, AvailableForProps, IQuest, Reward } from "../mo import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -17,20 +18,20 @@ import { ProfileHelper } from "./ProfileHelper"; import { RagfairServerHelper } from "./RagfairServerHelper"; import { TraderHelper } from "./TraderHelper"; export declare class QuestHelper { - private logger; - private jsonUtil; - private timeUtil; - private hashUtil; - private itemHelper; - private itemEventRouter; - private databaseServer; - private ragfairServerHelper; - private dialogueHelper; - private profileHelper; - private paymentHelper; - private traderHelper; - private configServer; - private questConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, traderHelper: TraderHelper, configServer: ConfigServer); static get STATUS(): Record; questStatus(pmcData: IPmcData, questID: string): string; @@ -47,7 +48,7 @@ export declare class QuestHelper { */ dumpQuests(quests: any, label?: any): void; loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean; - private processReward; + protected processReward(reward: Reward): any[]; getQuestRewardItems(quest: IQuest, state: string): Reward[]; addQuestToPMCData(pmcData: IPmcData, quest: Quest, newState: string, acceptedQuest: IAcceptQuestRequestData): void; acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[]; @@ -58,7 +59,7 @@ export declare class QuestHelper { * Get List of All Quests as an array */ questValues(): IQuest[]; - private cleanQuestList; + protected cleanQuestList(quests: IQuest[]): IQuest[]; cleanQuestConditions(quest: IQuest): IQuest; failQuest(pmcData: IPmcData, body: any, sessionID: string): any; getQuestFromDb(questId: string, pmcData: IPmcData): IQuest; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairHelper.d.ts index 8e70bcd..c8bc5ba 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairHelper.d.ts @@ -2,6 +2,7 @@ import { Item } from "../models/eft/common/tables/IItem"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -12,16 +13,16 @@ import { ItemHelper } from "./ItemHelper"; import { TraderAssortHelper } from "./TraderAssortHelper"; import { UtilityHelper } from "./UtilityHelper"; export declare class RagfairHelper { - private logger; - private jsonUtil; - private traderAssortHelper; - private databaseServer; - private handbookHelper; - private itemHelper; - private ragfairLinkedItemService; - private utilityHelper; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected traderAssortHelper: TraderAssortHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected ragfairLinkedItemService: RagfairLinkedItemService; + protected utilityHelper: UtilityHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, traderAssortHelper: TraderAssortHelper, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, ragfairLinkedItemService: RagfairLinkedItemService, utilityHelper: UtilityHelper, configServer: ConfigServer); /** * Gets currency TAG from TPL @@ -31,7 +32,7 @@ export declare class RagfairHelper { getCurrencyTag(currency: string): string; filterCategories(sessionID: string, info: ISearchRequestData): string[]; getDisplayableAssorts(sessionID: string): Record; - private getCategoryList; + protected getCategoryList(handbookId: string): string[]; countCategories(result: IGetOffersResult): void; /** * Merges Root Items diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairOfferHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairOfferHelper.d.ts index 3bf8add..129bc1c 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairOfferHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairOfferHelper.d.ts @@ -1,7 +1,10 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; @@ -19,31 +22,31 @@ import { RagfairHelper } from "./RagfairHelper"; import { RagfairServerHelper } from "./RagfairServerHelper"; import { RagfairSortHelper } from "./RagfairSortHelper"; export declare class RagfairOfferHelper { - private logger; - private timeUtil; - private hashUtil; - private itemEventRouter; - private databaseServer; - private saveServer; - private dialogueHelper; - private itemHelper; - private paymentHelper; - private presetHelper; - private profileHelper; - private ragfairServerHelper; - private ragfairSortHelper; - private ragfairHelper; - private ragfairOfferService; - private configServer; - private static TPL_GOODS_SOLD; - private ragfairConfig; - private questConfig; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected paymentHelper: PaymentHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected configServer: ConfigServer; + protected static TPL_GOODS_SOLD: string; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, configServer: ConfigServer); getValidOffers(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; getOffersForBuild(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; processOffers(sessionID: string): boolean; - private getProfileOffers; - private deleteOfferByOfferId; - private completeOffer; + protected getProfileOffers(sessionID: string): IRagfairOffer[]; + protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairSellHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairSellHelper.d.ts index 929d112..6ec004a 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairSellHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairSellHelper.d.ts @@ -1,14 +1,15 @@ import { SellResult } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class RagfairSellHelper { - private logger; - private randomUtil; - private timeUtil; - private configServer; - private ragfairConfig; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; constructor(logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); calculateSellChance(baseChance: number, offerPrice: number, requirementsPriceInRub: number): number; rollForSale(sellChance: number, count: number): SellResult[]; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairServerHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairServerHelper.d.ts index 0f32a66..2cb3ea5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairServerHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairServerHelper.d.ts @@ -1,6 +1,8 @@ -import { MemberCategory } from "../models/eft/common/MemberCategory"; +import { MemberCategory } from "../models/enums/MemberCategory"; import { Item } from "../models/eft/common/tables/IItem"; import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; @@ -11,21 +13,26 @@ import { DialogueHelper } from "./DialogueHelper"; import { ItemHelper } from "./ItemHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class RagfairServerHelper { - private randomUtil; - private hashUtil; - private saveServer; - private databaseServer; - private profileHelper; - private itemHelper; - private dialogueHelper; - private jsonUtil; - private configServer; - private ragfairConfig; - private questConfig; - private static TPL_GOODS_RETURNED; + protected randomUtil: RandomUtil; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected jsonUtil: JsonUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + protected static TPL_GOODS_RETURNED: string; constructor(randomUtil: RandomUtil, hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, profileHelper: ProfileHelper, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, jsonUtil: JsonUtil, configServer: ConfigServer); + /** + * Is item valid / on blacklist / quest item + * @param itemDetails + * @returns boolean + */ isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean; - isItemBlacklisted(itemTemplateId: string): boolean; + protected isItemBlacklisted(itemTemplateId: string): boolean; isTrader(userID: string): boolean; isPlayer(userID: string): boolean; returnItems(sessionID: string, items: any[]): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairSortHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairSortHelper.d.ts index e9d8069..e983569 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairSortHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairSortHelper.d.ts @@ -1,12 +1,12 @@ import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class RagfairSortHelper { - private databaseServer; + protected databaseServer: DatabaseServer; constructor(databaseServer: DatabaseServer); sortOffers(offers: IRagfairOffer[], type: number, direction?: number): IRagfairOffer[]; - private sortOffersByID; - private sortOffersByRating; - private sortOffersByName; - private sortOffersByPrice; - private sortOffersByExpiry; + protected sortOffersByID(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByExpiry(a: IRagfairOffer, b: IRagfairOffer): number; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairTaxHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairTaxHelper.d.ts index e87334f..820facb 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairTaxHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RagfairTaxHelper.d.ts @@ -1,15 +1,16 @@ import { IPmcData } from "../models/eft/common/IPmcData"; import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; import { DatabaseServer } from "../servers/DatabaseServer"; import { RagfairPriceService } from "../services/RagfairPriceService"; import { ItemHelper } from "./ItemHelper"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class RagfairTaxHelper { - private logger; - private databaseServer; - private ragfairPriceService; - private itemHelper; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected ragfairPriceService: RagfairPriceService; + protected itemHelper: ItemHelper; constructor(logger: ILogger, databaseServer: DatabaseServer, ragfairPriceService: RagfairPriceService, itemHelper: ItemHelper); calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number; - private calculateItemWorth; + protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem?: boolean): number; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RepairHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RepairHelper.d.ts index d11d0d2..650c1aa 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RepairHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/RepairHelper.d.ts @@ -1,20 +1,22 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { IPmcData } from "../models/eft/common/IPmcData"; import { Item } from "../models/eft/common/tables/IItem"; +import { Props } from "../models/eft/common/tables/ITemplateItem"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class RepairHelper { - private logger; - private jsonUtil; - private randomUtil; - private databaseServer; - private configServer; - private repairConfig; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; constructor(logger: ILogger, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, configServer: ConfigServer); updateItemDurability(itemToRepairId: string, amountToRepair: number, pmcData: IPmcData, useRepairKit?: boolean): Item; - private getRandomisedArmorRepairDegredationValue; - private getRandomisedWeaponRepairDegredationValue; + protected getRandomisedArmorRepairDegredationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number): number; + protected getRandomisedWeaponRepairDegredationValue(itemProps: Props, isRepairKit: boolean, armorMax: number): number; isWeaponTemplate(tpl: string): boolean; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/SecureContainerHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/SecureContainerHelper.d.ts index 8f246b6..9e2bc32 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/SecureContainerHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/SecureContainerHelper.d.ts @@ -7,7 +7,7 @@ export interface OwnerInventoryItems { isMail: boolean; } export declare class SecureContainerHelper { - private itemHelper; + protected itemHelper: ItemHelper; constructor(itemHelper: ItemHelper); getSecureContainerItems(items: Item[]): string[]; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TradeHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TradeHelper.d.ts index a78cd20..975062b 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TradeHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TradeHelper.d.ts @@ -2,7 +2,7 @@ import { InventoryHelper } from "../helpers/InventoryHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; -import { Upd } from "../models/eft/common/tables/IItem"; +import { Item, Upd } from "../models/eft/common/tables/IItem"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; @@ -12,20 +12,33 @@ import { RagfairServer } from "../servers/RagfairServer"; import { FenceService } from "../services/FenceService"; import { PaymentService } from "../services/PaymentService"; export declare class TradeHelper { - private logger; - private itemEventRouter; - private traderHelper; - private itemHelper; - private paymentService; - private fenceService; - private inventoryHelper; - private ragfairServer; + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected fenceService: FenceService; + protected inventoryHelper: InventoryHelper; + protected ragfairServer: RagfairServer; constructor(logger: ILogger, itemEventRouter: ItemEventRouter, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer); + /** + * Buy item from flea or trader + * @param pmcData + * @param buyRequestData data from client + * @param sessionID + * @param foundInRaid + * @param upd optional item details used when buying from flea + * @returns + */ buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse; /** - * Selling item to trader + * Sell item to trader + * @param pmcData + * @param body + * @param sessionID + * @returns */ sellItem(pmcData: IPmcData, body: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse; - private incrementAssortBuyCount; - private checkPurchaseIsWithinTraderItemLimit; + protected incrementAssortBuyCount(assortBeingPurchased: Item, itemsPurchasedCount: number): void; + protected checkPurchaseIsWithinTraderItemLimit(assortBeingPurchased: Item, assortId: string, count: number): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TraderAssortHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TraderAssortHelper.d.ts index d95879c..4f41ac2 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TraderAssortHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TraderAssortHelper.d.ts @@ -1,7 +1,8 @@ -import { ITraderAssort } from "../models/eft/common/tables/ITrader"; -import { ILogger } from "../models/spt/utils/ILogger"; import { RagfairAssortGenerator } from "../generators/RagfairAssortGenerator"; import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { FenceService } from "../services/FenceService"; import { TraderAssortService } from "../services/TraderAssortService"; @@ -9,15 +10,33 @@ import { JsonUtil } from "../utils/JsonUtil"; import { AssortHelper } from "./AssortHelper"; import { ProfileHelper } from "./ProfileHelper"; export declare class TraderAssortHelper { - private logger; - private jsonUtil; - private databaseServer; - private profileHelper; - private assortHelper; - private ragfairAssortGenerator; - private ragfairOfferGenerator; - private traderAssortService; - private fenceService; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected assortHelper: AssortHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected traderAssortService: TraderAssortService; + protected fenceService: FenceService; constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, profileHelper: ProfileHelper, assortHelper: AssortHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferGenerator: RagfairOfferGenerator, traderAssortService: TraderAssortService, fenceService: FenceService); + /** + * Get a traders assorts + * Can be used for returning ragfair / fence assorts + * @param sessionId session id + * @param traderId trader id + * @returns a traders assorts + */ getAssort(sessionId: string, traderId: string): ITraderAssort; + /** + * Get an array of pristine trader items prior to any alteration by player + * @param traderId trader id + * @returns array of Items + */ + protected getPristineTraderAssorts(traderId: string): Item[]; + /** + * Returns generated ragfair offers in a trader assort format + * @returns Trader assort object + */ + protected getRagfairDataAsTraderAssort(): ITraderAssort; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TraderHelper.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TraderHelper.d.ts index 5440afe..ab4a371 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TraderHelper.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/helpers/TraderHelper.d.ts @@ -1,35 +1,53 @@ -import { SaveServer } from "../servers/SaveServer"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; import { PlayerService } from "../services/PlayerService"; import { HandbookHelper } from "./HandbookHelper"; import { ItemHelper } from "./ItemHelper"; -import { ProfileHelper } from "./ProfileHelper"; import { PaymentHelper } from "./PaymentHelper"; -import { FenceService } from "../services/FenceService"; -import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; -import { IPmcData } from "../models/eft/common/IPmcData"; -import { ConfigServer } from "../servers/ConfigServer"; -import { ILogger } from "../models/spt/utils/ILogger"; +import { ProfileHelper } from "./ProfileHelper"; export declare class TraderHelper { - private logger; - private databaseServer; - private saveServer; - private profileHelper; - private paymentHelper; - private itemHelper; - private handbookHelper; - private playerService; - private fenceService; - private configServer; - private traderConfig; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemHelper: ItemHelper; + protected handbookHelper: HandbookHelper; + protected playerService: PlayerService; + protected fenceService: FenceService; + protected configServer: ConfigServer; + protected traderConfig: ITraderConfig; constructor(logger: ILogger, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemHelper: ItemHelper, handbookHelper: HandbookHelper, playerService: PlayerService, fenceService: FenceService, configServer: ConfigServer); getTrader(traderID: string, sessionID: string): ITraderBase; getTraderAssortsById(traderId: string): ITraderAssort; + /** + * Reset a trader back to its initial state as seen by a level 1 player + * Does NOT take into account different profile levels + * @param sessionID session id + * @param traderID trader id to reset + */ resetTrader(sessionID: string, traderID: string): void; changeTraderDisplay(traderID: string, status: boolean, sessionID: string): void; getPurchasesData(traderID: string, sessionID: string): Record; + /** + * Calculate traders level based on exp amount and increment level if over threshold + * @param traderID trader to process + * @param sessionID session id + */ lvlUp(traderID: string, sessionID: string): void; getTraderUpdateSeconds(traderId: string): number; + /** + * check if an item is allowed to be sold to a trader + * @param traderFilters array of allowed categories + * @param tplToCheck itemTpl of inventory + * @returns boolean + */ traderFilter(traderFilters: string[], tplToCheck: string): boolean; getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/ide/BleedingEdgeEntry.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/ide/BleedingEdgeEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/ide/BleedingEdgeEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/BundleLoader.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/BundleLoader.d.ts index 9abfe9f..06ad698 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/BundleLoader.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/BundleLoader.d.ts @@ -2,18 +2,18 @@ import { HttpServerHelper } from "../helpers/HttpServerHelper"; import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; declare class BundleInfo { - private httpServerHelper; + modPath: string; key: string; path: string; filepath: string; dependencyKeys: string[]; - constructor(modpath: string, bundle: any, httpServerHelper: HttpServerHelper); + constructor(modpath: string, bundle: any, bundlePath: string, bundleFilepath: string); } export declare class BundleLoader { - private httpServerHelper; - private vfs; - private jsonUtil; - private bundles; + protected httpServerHelper: HttpServerHelper; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected bundles: Record; constructor(httpServerHelper: HttpServerHelper, vfs: VFS, jsonUtil: JsonUtil); getBundles(local: boolean): BundleInfo[]; getBundle(key: string, local: boolean): BundleInfo; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/DelayedModLoader.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/DelayedModLoader.d.ts index 7e7d8d0..2a05604 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/DelayedModLoader.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/DelayedModLoader.d.ts @@ -6,17 +6,16 @@ import { VFS } from "../utils/VFS"; import { BundleLoader } from "./BundleLoader"; import { InitialModLoader } from "./InitialModLoader"; export declare class DelayedModLoader implements IModLoader { - private bundleLoader; - private handbookController; - private vfs; - private modCompilerService; - private initialModLoader; + protected bundleLoader: BundleLoader; + protected handbookController: HandbookController; + protected vfs: VFS; + protected modCompilerService: ModCompilerService; + protected initialModLoader: InitialModLoader; constructor(bundleLoader: BundleLoader, handbookController: HandbookController, vfs: VFS, modCompilerService: ModCompilerService, initialModLoader: InitialModLoader); getBundles(local: boolean): string; getBundle(key: string, local: boolean): void; - getImportedModsNames(): string[]; getModPath(mod: string): string; - load(container: DependencyContainer): void; - private executeMods; - private addBundles; + load(): void; + protected executeMods(container: DependencyContainer): void; + protected addBundles(): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/InitialModLoader.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/InitialModLoader.d.ts index a53cce2..68e47fe 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/InitialModLoader.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/loaders/InitialModLoader.d.ts @@ -1,35 +1,64 @@ import { DependencyContainer } from "tsyringe"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ModLoader } from "../models/spt/mod/IMod"; import { IModLoader } from "../models/spt/mod/IModLoader"; +import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { ModCompilerService } from "../services/ModCompilerService"; import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; export declare class InitialModLoader implements IModLoader { - private logger; - private vfs; - private jsonUtil; - private modCompilerService; - private configServer; - private readonly basepath; - private imported; - private onLoad; - private akiConfig; - constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, configServer: ConfigServer); + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected modCompilerService: ModCompilerService; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected static container: DependencyContainer; + protected readonly basepath = "user/mods/"; + protected imported: Record; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer); load(container: DependencyContainer): Promise; getBundles(local: boolean): string; getBundle(key: string, local: boolean): void; + /** + * Returns a list of mods with preserved load order + * @returns Array of mod names in load order + */ getImportedModsNames(): string[]; getModPath(mod: string): string; - private importClass; - private importMods; - private isModCombatibleWithAki; - private executeMods; - private sortModsLoadOrder; - private addMod; - private areModDependenciesFulfilled; - private isModCompatible; - private validMod; - private getLoadOrderRecursive; - private getLoadOrder; + protected importClass(name: string, filepath: string, container: DependencyContainer): void; + protected importMods(): Promise; + /** + * + * @param mods Get an array of broken/invalid mods by name + * @returns Mod names array + */ + protected getBrokenMods(mods: string[]): string[]; + /** + * Get packageJson data for mods + * @param mods mods to get packageJson for + * @returns dictionary + */ + protected getModsPackageData(mods: string[]): Record; + /** + * Does mod have "delayedLoad(" string in its entry class + * @param modFolderName folder name + * @param modToValidate package.json details + * @returns boolean + */ + protected isModSpt300Compatible(modFolderName: string, modToValidate: IPackageJsonData): boolean; + protected isModCombatibleWithAki(mod: IPackageJsonData): boolean; + protected executeMods(container: DependencyContainer): void; + sortModsLoadOrder(): string[]; + protected addMod(mod: string): Promise; + protected areModDependenciesFulfilled(mod: IPackageJsonData, loadedMods: Record): boolean; + protected isModCompatible(mod: IPackageJsonData, loadedMods: Record): boolean; + protected validMod(mod: string): boolean; + protected getLoadOrderRecursive(mod: string, result: Record, visited: Record): void; + protected getLoadOrder(mods: Record): Record; + getContainer(): DependencyContainer; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/ILocationBase.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/ILocationBase.d.ts index 0d092f6..ad48d32 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/ILocationBase.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/ILocationBase.d.ts @@ -107,6 +107,15 @@ export interface BossLocationSpawn { BossPlayer: boolean; BossZone: string; Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; +} +export interface BossSupport { + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; } export interface BotLocationModifier { AccuracySpeed: number; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/IPmcData.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/IPmcData.d.ts index 2360147..adc2aa5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/IPmcData.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/IPmcData.d.ts @@ -1,8 +1,8 @@ import { IRagfairOffer } from "../ragfair/IRagfairOffer"; import { IPmcDataRepeatableQuest } from "./tables/IRepeatableQuests"; import { Item, Upd } from "./tables/IItem"; -import { HideoutAreasEnum } from "../hideout/HideoutAreasEnum"; -import { MemberCategory } from "./MemberCategory"; +import { HideoutAreas } from "../../enums/HideoutAreas"; +import { MemberCategory } from "../../enums/MemberCategory"; export interface IPmcData { _id: string; aid: string; @@ -289,7 +289,7 @@ export interface Production extends Productive { ProductionTime: number; } export interface HideoutArea { - type: HideoutAreasEnum; + type: HideoutAreas; level: number; active: boolean; passiveBonusesEnabled: boolean; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/tables/IBotType.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/tables/IBotType.d.ts index e0f39d9..01be0be 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/tables/IBotType.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/tables/IBotType.d.ts @@ -100,6 +100,8 @@ export interface Generation { export interface ItemMinMax { grenades: MinMax; healing: MinMax; + drugs: MinMax; + stims: MinMax; looseLoot: MinMax; magazines: MinMax; specialItems: MinMax; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/tables/IQuest.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/tables/IQuest.d.ts index 1582a2f..e1fc888 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/tables/IQuest.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/common/tables/IQuest.d.ts @@ -44,8 +44,42 @@ export interface AvailableForProps { value?: number; compareMethod?: string; visibilityConditions?: VisibilityCondition[]; - target?: string; + target?: string | string[]; status?: number[]; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; +} +export interface AvailableForCounter { + id: string; + conditions: CounterCondition[]; +} +export interface CounterCondition { + _parent: string; + _props: CounterProps; +} +export interface CounterProps { + id: string; + target: string[] | string; + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; +} +export interface DaytimeCounter { + from: number; + to: number; } export interface VisibilityCondition { id: string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/IGetFriendListDataResponse.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/IGetFriendListDataResponse.d.ts index 41858c9..1d0c0e8 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/IGetFriendListDataResponse.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/IGetFriendListDataResponse.d.ts @@ -1,4 +1,4 @@ -import { MemberCategory } from "../common/MemberCategory"; +import { MemberCategory } from "../../enums/MemberCategory"; export interface IGetFriendListDataResponse { Friends: Friend[]; Ignore: any[]; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts index db45477..43d416e 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts @@ -1,4 +1,4 @@ -import { MessageType } from "../profile/IAkiProfile"; +import { MessageType } from "../../enums/MessageType"; export interface IGetMailDialogViewRequestData { type: MessageType; dialogId: string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/ISendMessageRequest.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/ISendMessageRequest.d.ts index 5f140c7..dd79deb 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/ISendMessageRequest.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/dialog/ISendMessageRequest.d.ts @@ -1,4 +1,4 @@ -import { MessageType } from "../profile/IAkiProfile"; +import { MessageType } from "../../enums/MessageType"; export interface ISendMessageRequest { dialogId: string; type: MessageType; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/profile/IAkiProfile.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/profile/IAkiProfile.d.ts index f95e9a8..3e0b319 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/profile/IAkiProfile.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/profile/IAkiProfile.d.ts @@ -1,3 +1,4 @@ +import { MessageType } from "../../enums/MessageType"; import { IPmcData } from "../common/IPmcData"; import { Item } from "../common/tables/IItem"; export interface IAkiProfile { @@ -43,22 +44,6 @@ export interface DialogueInfo { new: number; attachmentsNew: number; } -export declare enum MessageType { - USER_MESSAGE = 1, - NPC_TRADER = 2, - AUCTION_MESSAGE = 3, - FLEAMARKET_MESSAGE = 4, - ADMIN_MESSAGE = 5, - GROUP_CHAT_MESSAGE = 6, - SYSTEM_MESSAGE = 7, - INSURANCE_RETURN = 8, - GLOBAL_CHAT = 9, - QUEST_START = 10, - QUEST_FAIL = 11, - QUEST_SUCCESS = 12, - MESSAGE_WITH_ITEMS = 13, - INITIAL_SUPPORT = 14 -} export interface Message { _id: string; uid: string; @@ -141,12 +126,16 @@ export interface Chest { export interface Stomach { } export interface LeftArm { + Fracture?: number; } export interface RightArm { + Fracture?: number; } export interface LeftLeg { + Fracture?: number; } export interface RightLeg { + Fracture?: number; } export interface Inraid { location: string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/ragfair/IRagfairOffer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/ragfair/IRagfairOffer.d.ts index 6620a00..63f655e 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/ragfair/IRagfairOffer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/eft/ragfair/IRagfairOffer.d.ts @@ -1,4 +1,4 @@ -import { MemberCategory } from "../common/MemberCategory"; +import { MemberCategory } from "../../enums/MemberCategory"; import { Item } from "../common/tables/IItem"; export interface IRagfairOffer { sellResult?: SellResult[]; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/BaseClasses.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/BaseClasses.d.ts new file mode 100644 index 0000000..e733bca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/BaseClasses.d.ts @@ -0,0 +1,84 @@ +export declare enum BaseClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMOR = "5448e54d4bdc2dcc718b4568", + VEST = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/ConfigTypes.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/ConfigTypes.d.ts new file mode 100644 index 0000000..6bd31e8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/ConfigTypes.d.ts @@ -0,0 +1,18 @@ +export declare enum ConfigTypes { + AIRDROP = "aki-airdrop", + BOT = "aki-bot", + CORE = "aki-core", + HEALTH = "aki-health", + HIDEOUT = "aki-hideout", + HTTP = "aki-http", + IN_RAID = "aki-inraid", + INSURANCE = "aki-insurance", + INVENTORY = "aki-inventory", + LOCATION = "aki-location", + MATCH = "aki-match", + QUEST = "aki-quest", + RAGFAIR = "aki-ragfair", + REPAIR = "aki-repair", + TRADER = "aki-trader", + WEATHER = "aki-weather" +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/ELocationName.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/ELocationName.d.ts new file mode 100644 index 0000000..b56cc08 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/ELocationName.d.ts @@ -0,0 +1,11 @@ +export declare enum ELocationName { + FACTORY_DAY = "factory4_day", + BIGMAP = "bigmap", + WOODS = "Woods", + SHORELINE = "Shoreline", + INTERCHANGE = "Interchange", + LIGHTHOUSE = "Lighthouse", + LABORATORY = "laboratory", + RESERVE = "RezervBase", + ANY = "any" +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/EquipmentSlots.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/EquipmentSlots.d.ts new file mode 100644 index 0000000..35c18ff --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/EquipmentSlots.d.ts @@ -0,0 +1,16 @@ +export declare enum EquipmentSlots { + HEADWEAR = "Headwear", + EARPIECE = "Earpiece", + FACE_COVER = "FaceCover", + ARMOR_VEST = "ArmorVest", + EYEWEAR = "Eyewear", + ARM_BAND = "ArmBand", + TACTICAL_VEST = "TacticalVest", + POCKETS = "Pockets", + BACKPACK = "Backpack", + SECURED_CONTAINER = "SecuredContainer", + FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", + SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", + HOLSTER = "Holster", + SCABBARD = "Scabbard" +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/HideoutAreas.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/HideoutAreas.d.ts new file mode 100644 index 0000000..b44a20a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/HideoutAreas.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreas { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/MemberCategory.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/MessageType.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/MessageType.d.ts new file mode 100644 index 0000000..1b0c649 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/MessageType.d.ts @@ -0,0 +1,16 @@ +export declare enum MessageType { + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14 +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/Money.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/Money.d.ts new file mode 100644 index 0000000..0d39613 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/Money.d.ts @@ -0,0 +1,5 @@ +export declare enum Money { + ROUBLES = "5449016a4bdc2d6f028b456f", + EUROS = "569668774bdc2da2298b4568", + DOLLARS = "5696686a4bdc2da3298b456a" +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/Traders.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/Traders.d.ts new file mode 100644 index 0000000..163cd71 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/enums/Traders.d.ts @@ -0,0 +1,10 @@ +export declare enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/config/IBotConfig.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/config/IBotConfig.d.ts index f8ea940..5fb9d93 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/config/IBotConfig.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/config/IBotConfig.d.ts @@ -5,6 +5,7 @@ export interface IBotConfig extends IBaseConfig { bosses: string[]; durability: Durability; lootNValue: LootNvalue; + revenge: Record; pmc: PmcConfig; showTypeInNickname: boolean; maxBotCap: number; @@ -97,6 +98,7 @@ export interface PmcConfig { maxPocketLootTotalRub: number; maxVestLootTotalRub: number; types: Types; + enemyTypes: string[]; } export interface DynamicLoot { whitelist: string[]; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/config/IQuestConfig.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/config/IQuestConfig.d.ts index 03dc890..be4a97b 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/config/IQuestConfig.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/config/IQuestConfig.d.ts @@ -1,3 +1,4 @@ +import { ELocationName } from "../../enums/ELocationName"; import { IBaseConfig } from "./IBaseConfig"; export interface IQuestConfig extends IBaseConfig { kind: "aki-quest"; @@ -15,17 +16,6 @@ export interface IRepeatableQuestConfig { traderWhitelist: ITraderWhitelist[]; questConfig: IQuestConfig; } -export declare enum ELocationName { - FACTORY_DAY = "factory4_day", - BIGMAP = "bigmap", - WOODS = "Woods", - SHORELINE = "Shoreline", - INTERCHANGE = "Interchange", - LIGHTHOUSE = "Lighthouse", - LABORATORY = "laboratory", - RESERVE = "RezervBase", - ANY = "any" -} export interface IRewardScaling { levels: number[]; experience: number[]; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/helpers/Traders.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/helpers/Traders.d.ts index 163cd71..e935d29 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/helpers/Traders.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/helpers/Traders.d.ts @@ -1,4 +1,4 @@ -export declare enum Traders { +export declare const enum Traders { PRAPOR = "54cb50c76803fa8b248b4571", THERAPIST = "54cb57776803fa99248b456e", FENCE = "579dc571d53a0658a154fbec", diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/mod/IMod.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/mod/IMod.d.ts index 623e3dd..e6eec79 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/mod/IMod.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/mod/IMod.d.ts @@ -1,4 +1,4 @@ -declare namespace ModLoader { +export declare namespace ModLoader { interface IMod { name: string; version: string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/mod/IModLoader.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/mod/IModLoader.d.ts index 5398c9b..40a5e19 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/mod/IModLoader.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/mod/IModLoader.d.ts @@ -3,6 +3,5 @@ export interface IModLoader { load(container: DependencyContainer): void; getBundles(local: boolean): string; getBundle(key: string, local: boolean): void; - getImportedModsNames(): string[]; getModPath(mod: string): string; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/server/IHttpServer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/server/IHttpServer.d.ts index 50e5c91..c828399 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/server/IHttpServer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/server/IHttpServer.d.ts @@ -1,4 +1,5 @@ /// +/// import http, { ServerResponse } from "http"; import { INotification } from "../../eft/notifier/INotifier"; export interface IHttpServer { diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/server/ILocaleBase.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/server/ILocaleBase.d.ts index a20084d..8887c06 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/server/ILocaleBase.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/models/spt/server/ILocaleBase.d.ts @@ -1,5 +1,5 @@ export interface ILocaleBase { - global: ILocaleGlobalBase; + global: Record; menu: Record; languages: ILanguageBase[]; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/HttpRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/HttpRouter.d.ts index 44edc0b..f75a47d 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/HttpRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/HttpRouter.d.ts @@ -1,11 +1,16 @@ /// import { IncomingMessage } from "http"; -import { DynamicRouter, StaticRouter } from "../di/Router"; +import { DynamicRouter, Router, StaticRouter } from "../di/Router"; export declare class HttpRouter { - private staticRouters; - private dynamicRoutes; + protected staticRouters: StaticRouter[]; + protected dynamicRoutes: DynamicRouter[]; constructor(staticRouters: StaticRouter[], dynamicRoutes: DynamicRouter[]); - private groupBy; + protected groupBy(list: T[], keyGetter: (t: T) => string): Map; getResponse(req: IncomingMessage, info: any, sessionID: string): string; - private handleRoute; + protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean; } +declare class ResponseWrapper { + output: string; + constructor(output: string); +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/ImageRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/ImageRouter.d.ts index 07a0606..ab03977 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/ImageRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/ImageRouter.d.ts @@ -1,11 +1,12 @@ /// import { IncomingMessage, ServerResponse } from "http"; -import { VFS } from "../utils/VFS"; import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ImageRouteService } from "../services/mod/image/ImageRouteService"; +import { VFS } from "../utils/VFS"; export declare class ImageRouter { - private vfs; - constructor(vfs: VFS); - private onRoute; + protected vfs: VFS; + protected imageRouteService: ImageRouteService; + constructor(vfs: VFS, imageRouteService: ImageRouteService); addRoute(key: string, valueToAdd: string): void; sendImage(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any, httpServer: IHttpServer): void; getImage(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/ItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/ItemEventRouter.d.ts index bb20152..b1ac5d9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/ItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/ItemEventRouter.d.ts @@ -5,13 +5,13 @@ import { ProfileHelper } from "../helpers/ProfileHelper"; import { ItemEventRouterDefinition } from "../di/Router"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class ItemEventRouter { - private logger; - private jsonUtil; - private profileHelper; - private itemEventRouters; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected profileHelper: ProfileHelper; + protected itemEventRouters: ItemEventRouterDefinition[]; constructor(logger: ILogger, jsonUtil: JsonUtil, profileHelper: ProfileHelper, itemEventRouters: ItemEventRouterDefinition[]); - private output; + protected output: IItemEventRouterResponse; handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse; getOutput(sessionID: string): IItemEventRouterResponse; - private resetOutput; + protected resetOutput(sessionID: string): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/BotDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/BotDynamicRouter.d.ts index dd2f68a..6d0ab4b 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/BotDynamicRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/BotDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { BotCallbacks } from "../../callbacks/BotCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class BotDynamicRouter extends DynamicRouter { - private botCallbacks; + protected botCallbacks: BotCallbacks; constructor(botCallbacks: BotCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/BundleDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/BundleDynamicRouter.d.ts index be27008..a765410 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/BundleDynamicRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/BundleDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class BundleDynamicRouter extends DynamicRouter { - private bundleCallbacks; + protected bundleCallbacks: BundleCallbacks; constructor(bundleCallbacks: BundleCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/CustomizationDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/CustomizationDynamicRouter.d.ts index 03a5967..2db7cc5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/CustomizationDynamicRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/CustomizationDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class CustomizationDynamicRouter extends DynamicRouter { - private customizationCallbacks; + protected customizationCallbacks: CustomizationCallbacks; constructor(customizationCallbacks: CustomizationCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/DataDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/DataDynamicRouter.d.ts index c30501a..836ed8d 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/DataDynamicRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/DataDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { DataCallbacks } from "../../callbacks/DataCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class DataDynamicRouter extends DynamicRouter { - private dataCallbacks; + protected dataCallbacks: DataCallbacks; constructor(dataCallbacks: DataCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/HttpDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/HttpDynamicRouter.d.ts index b2933e9..a152b4d 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/HttpDynamicRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/HttpDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { DynamicRouter } from "../../di/Router"; import { ImageRouter } from "../ImageRouter"; export declare class HttpDynamicRouter extends DynamicRouter { - private imageRouter; + protected imageRouter: ImageRouter; constructor(imageRouter: ImageRouter); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/InraidDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/InraidDynamicRouter.d.ts index ea4a9ae..7c0561f 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/InraidDynamicRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/InraidDynamicRouter.d.ts @@ -1,7 +1,7 @@ import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class InraidDynamicRouter extends DynamicRouter { - private inraidCallbacks; + protected inraidCallbacks: InraidCallbacks; constructor(inraidCallbacks: InraidCallbacks); getTopLevelRoute(): string; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/LocationDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/LocationDynamicRouter.d.ts index 30741db..b8e5cdf 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/LocationDynamicRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/LocationDynamicRouter.d.ts @@ -1,7 +1,7 @@ import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class LocationDynamicRouter extends DynamicRouter { - private locationCallbacks; + protected locationCallbacks: LocationCallbacks; constructor(locationCallbacks: LocationCallbacks); getTopLevelRoute(): string; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/NotifierDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/NotifierDynamicRouter.d.ts index 4786817..83c60c5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/NotifierDynamicRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/NotifierDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class NotifierDynamicRouter extends DynamicRouter { - private notifierCallbacks; + protected notifierCallbacks: NotifierCallbacks; constructor(notifierCallbacks: NotifierCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/TraderDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/TraderDynamicRouter.d.ts index a100b4c..5b7cc1b 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/TraderDynamicRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/dynamic/TraderDynamicRouter.d.ts @@ -1,6 +1,6 @@ import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; import { DynamicRouter } from "../../di/Router"; export declare class TraderDynamicRouter extends DynamicRouter { - private traderCallbacks; + protected traderCallbacks: TraderCallbacks; constructor(traderCallbacks: TraderCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/CustomizationItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/CustomizationItemEventRouter.d.ts index 3025e2c..e78445e 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/CustomizationItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/CustomizationItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class CustomizationItemEventRouter extends ItemEventRouterDefinition { - private customizationCallbacks; + protected customizationCallbacks: CustomizationCallbacks; constructor(customizationCallbacks: CustomizationCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/HealthItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/HealthItemEventRouter.d.ts index bad9af2..99847c6 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/HealthItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/HealthItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class HealthItemEventRouter extends ItemEventRouterDefinition { - private healthCallbacks; + protected healthCallbacks: HealthCallbacks; constructor(healthCallbacks: HealthCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/HideoutItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/HideoutItemEventRouter.d.ts index 2cec18b..e1e98af 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/HideoutItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/HideoutItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { HideoutCallbacks } from "../../callbacks/HideoutCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class HideoutItemEventRouter extends ItemEventRouterDefinition { - private hideoutCallbacks; + protected hideoutCallbacks: HideoutCallbacks; constructor(hideoutCallbacks: HideoutCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/InsuranceItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/InsuranceItemEventRouter.d.ts index 8efc2c2..a922cc0 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/InsuranceItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/InsuranceItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class InsuranceItemEventRouter extends ItemEventRouterDefinition { - private insuranceCallbacks; + protected insuranceCallbacks: InsuranceCallbacks; constructor(insuranceCallbacks: InsuranceCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/InventoryItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/InventoryItemEventRouter.d.ts index 1d93e7b..2619bb9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/InventoryItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/InventoryItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { InventoryCallbacks } from "../../callbacks/InventoryCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class InventoryItemEventRouter extends ItemEventRouterDefinition { - private inventoryCallbacks; + protected inventoryCallbacks: InventoryCallbacks; constructor(inventoryCallbacks: InventoryCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/NoteItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/NoteItemEventRouter.d.ts index 12af594..59bf598 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/NoteItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/NoteItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { NoteCallbacks } from "../../callbacks/NoteCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class NoteItemEventRouter extends ItemEventRouterDefinition { - private noteCallbacks; + protected noteCallbacks: NoteCallbacks; constructor(noteCallbacks: NoteCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/PresetBuildItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/PresetBuildItemEventRouter.d.ts index 7298c52..277db44 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/PresetBuildItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/PresetBuildItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class PresetBuildItemEventRouter extends ItemEventRouterDefinition { - private presetBuildCallbacks; + protected presetBuildCallbacks: PresetBuildCallbacks; constructor(presetBuildCallbacks: PresetBuildCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/QuestItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/QuestItemEventRouter.d.ts index 9944ae9..db59c25 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/QuestItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/QuestItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class QuestItemEventRouter extends ItemEventRouterDefinition { - private questCallbacks; + protected questCallbacks: QuestCallbacks; constructor(questCallbacks: QuestCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/RagfairItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/RagfairItemEventRouter.d.ts index 88e52ba..9216cc5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/RagfairItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/RagfairItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class RagfairItemEventRouter extends ItemEventRouterDefinition { - private ragfairCallbacks; + protected ragfairCallbacks: RagfairCallbacks; constructor(ragfairCallbacks: RagfairCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/RepairItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/RepairItemEventRouter.d.ts index b292ded..5196ba9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/RepairItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/RepairItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { RepairCallbacks } from "../../callbacks/RepairCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class RepairItemEventRouter extends ItemEventRouterDefinition { - private repairCallbacks; + protected repairCallbacks: RepairCallbacks; constructor(repairCallbacks: RepairCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/TradeItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/TradeItemEventRouter.d.ts index 1bca2b8..a43bb0a 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/TradeItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/TradeItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { TradeCallbacks } from "../../callbacks/TradeCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class TradeItemEventRouter extends ItemEventRouterDefinition { - private tradeCallbacks; + protected tradeCallbacks: TradeCallbacks; constructor(tradeCallbacks: TradeCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/WishlistItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/WishlistItemEventRouter.d.ts index 38831f6..38497fb 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/WishlistItemEventRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/item_events/WishlistItemEventRouter.d.ts @@ -3,7 +3,7 @@ import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventR import { WishlistCallbacks } from "../../callbacks/WishlistCallbacks"; import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; export declare class WishlistItemEventRouter extends ItemEventRouterDefinition { - private wishlistCallbacks; + protected wishlistCallbacks: WishlistCallbacks; constructor(wishlistCallbacks: WishlistCallbacks); getHandledRoutes(): HandledRoute[]; handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/BundleSerializer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/BundleSerializer.d.ts index 5f275c4..912db83 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/BundleSerializer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/BundleSerializer.d.ts @@ -1,10 +1,10 @@ -import { IHttpServer } from "../../models/spt/server/IHttpServer"; -import { ILogger } from "../../models/spt/utils/ILogger"; import { Serializer } from "../../di/Serializer"; import { BundleLoader } from "../../loaders/BundleLoader"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { ILogger } from "../../models/spt/utils/ILogger"; export declare class BundleSerializer extends Serializer { - private logger; - private bundleLoader; + protected logger: ILogger; + protected bundleLoader: BundleLoader; constructor(logger: ILogger, bundleLoader: BundleLoader); serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; canHandle(route: string): boolean; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/ImageSerializer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/ImageSerializer.d.ts index 29340d0..0e040d4 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/ImageSerializer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/ImageSerializer.d.ts @@ -2,7 +2,7 @@ import { IHttpServer } from "../../models/spt/server/IHttpServer"; import { Serializer } from "../../di/Serializer"; import { ImageRouter } from "../ImageRouter"; export declare class ImageSerializer extends Serializer { - private imageRouter; + protected imageRouter: ImageRouter; constructor(imageRouter: ImageRouter); serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; canHandle(route: string): boolean; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/NotifySerializer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/NotifySerializer.d.ts index 8be8ac2..1779ac9 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/NotifySerializer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/serializers/NotifySerializer.d.ts @@ -3,9 +3,9 @@ import { Serializer } from "../../di/Serializer"; import { HttpServerHelper } from "../../helpers/HttpServerHelper"; import { IHttpServer } from "../../models/spt/server/IHttpServer"; export declare class NotifySerializer extends Serializer { - private notifierController; - private httpServerHelper; + protected notifierController: NotifierController; + protected httpServerHelper: HttpServerHelper; constructor(notifierController: NotifierController, httpServerHelper: HttpServerHelper); - serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + serialize(_sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; canHandle(route: string): boolean; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/BotStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/BotStaticRouter.d.ts index d8b0bf4..aeea220 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/BotStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/BotStaticRouter.d.ts @@ -1,6 +1,6 @@ import { BotCallbacks } from "../../callbacks/BotCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class BotStaticRouter extends StaticRouter { - private botCallbacks; + protected botCallbacks: BotCallbacks; constructor(botCallbacks: BotCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/BundleStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/BundleStaticRouter.d.ts index 3905b82..fb682fc 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/BundleStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/BundleStaticRouter.d.ts @@ -1,6 +1,6 @@ import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class BundleStaticRouter extends StaticRouter { - private bundleCallbacks; + protected bundleCallbacks: BundleCallbacks; constructor(bundleCallbacks: BundleCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/CustomizationStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/CustomizationStaticRouter.d.ts index 46c71b8..21bc4bb 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/CustomizationStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/CustomizationStaticRouter.d.ts @@ -1,6 +1,6 @@ import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class CustomizationStaticRouter extends StaticRouter { - private customizationCallbacks; + protected customizationCallbacks: CustomizationCallbacks; constructor(customizationCallbacks: CustomizationCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/DataStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/DataStaticRouter.d.ts index a493d3a..84ba7fd 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/DataStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/DataStaticRouter.d.ts @@ -1,6 +1,6 @@ import { DataCallbacks } from "../../callbacks/DataCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class DataStaticRouter extends StaticRouter { - private dataCallbacks; + protected dataCallbacks: DataCallbacks; constructor(dataCallbacks: DataCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/DialogStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/DialogStaticRouter.d.ts index a59fb14..546cdf1 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/DialogStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/DialogStaticRouter.d.ts @@ -1,6 +1,6 @@ import { DialogueCallbacks } from "../../callbacks/DialogueCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class DialogStaticRouter extends StaticRouter { - private dialogueCallbacks; + protected dialogueCallbacks: DialogueCallbacks; constructor(dialogueCallbacks: DialogueCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/GameStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/GameStaticRouter.d.ts index 988b673..a9a7496 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/GameStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/GameStaticRouter.d.ts @@ -1,6 +1,6 @@ import { GameCallbacks } from "../../callbacks/GameCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class GameStaticRouter extends StaticRouter { - private gameCallbacks; + protected gameCallbacks: GameCallbacks; constructor(gameCallbacks: GameCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/HealthStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/HealthStaticRouter.d.ts index e644861..863fd5e 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/HealthStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/HealthStaticRouter.d.ts @@ -1,6 +1,6 @@ import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class HealthStaticRouter extends StaticRouter { - private healthCallbacks; + protected healthCallbacks: HealthCallbacks; constructor(healthCallbacks: HealthCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/InraidStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/InraidStaticRouter.d.ts index 66ed860..b29ad23 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/InraidStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/InraidStaticRouter.d.ts @@ -1,6 +1,6 @@ import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class InraidStaticRouter extends StaticRouter { - private inraidCallbacks; + protected inraidCallbacks: InraidCallbacks; constructor(inraidCallbacks: InraidCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/InsuranceStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/InsuranceStaticRouter.d.ts index 8da26b3..5676499 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/InsuranceStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/InsuranceStaticRouter.d.ts @@ -1,6 +1,6 @@ import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class InsuranceStaticRouter extends StaticRouter { - private insuranceCallbacks; + protected insuranceCallbacks: InsuranceCallbacks; constructor(insuranceCallbacks: InsuranceCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/ItemEventStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/ItemEventStaticRouter.d.ts index 08ba6bb..c30a7fc 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/ItemEventStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/ItemEventStaticRouter.d.ts @@ -1,6 +1,6 @@ import { ItemEventCallbacks } from "../../callbacks/ItemEventCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class ItemEventStaticRouter extends StaticRouter { - private itemEventCallbacks; + protected itemEventCallbacks: ItemEventCallbacks; constructor(itemEventCallbacks: ItemEventCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/LauncherStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/LauncherStaticRouter.d.ts index 9d07f78..0040cbd 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/LauncherStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/LauncherStaticRouter.d.ts @@ -1,6 +1,6 @@ import { LauncherCallbacks } from "../../callbacks/LauncherCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class LauncherStaticRouter extends StaticRouter { - private launcherCallbacks; + protected launcherCallbacks: LauncherCallbacks; constructor(launcherCallbacks: LauncherCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/LocationStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/LocationStaticRouter.d.ts index 9c5c52e..b6de956 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/LocationStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/LocationStaticRouter.d.ts @@ -1,6 +1,6 @@ import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class LocationStaticRouter extends StaticRouter { - private locationCallbacks; + protected locationCallbacks: LocationCallbacks; constructor(locationCallbacks: LocationCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/MatchStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/MatchStaticRouter.d.ts index d746381..9920a92 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/MatchStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/MatchStaticRouter.d.ts @@ -1,6 +1,6 @@ import { MatchCallbacks } from "../../callbacks/MatchCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class MatchStaticRouter extends StaticRouter { - private matchCallbacks; + protected matchCallbacks: MatchCallbacks; constructor(matchCallbacks: MatchCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/NotifierStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/NotifierStaticRouter.d.ts index 1c8566d..8f1f5cc 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/NotifierStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/NotifierStaticRouter.d.ts @@ -1,6 +1,6 @@ import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class NotifierStaticRouter extends StaticRouter { - private notifierCallbacks; + protected notifierCallbacks: NotifierCallbacks; constructor(notifierCallbacks: NotifierCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/PresetStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/PresetStaticRouter.d.ts index 2272f82..a9e7458 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/PresetStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/PresetStaticRouter.d.ts @@ -1,6 +1,6 @@ import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class PresetStaticRouter extends StaticRouter { - private presetCallbacks; + protected presetCallbacks: PresetBuildCallbacks; constructor(presetCallbacks: PresetBuildCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/ProfileStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/ProfileStaticRouter.d.ts index fd787f1..83403f2 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/ProfileStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/ProfileStaticRouter.d.ts @@ -1,6 +1,6 @@ import { ProfileCallbacks } from "../../callbacks/ProfileCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class ProfileStaticRouter extends StaticRouter { - private profileCallbacks; + protected profileCallbacks: ProfileCallbacks; constructor(profileCallbacks: ProfileCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/QuestStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/QuestStaticRouter.d.ts index fda3c23..8f7ca0a 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/QuestStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/QuestStaticRouter.d.ts @@ -1,6 +1,6 @@ import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class QuestStaticRouter extends StaticRouter { - private questCallbacks; + protected questCallbacks: QuestCallbacks; constructor(questCallbacks: QuestCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/RagfairStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/RagfairStaticRouter.d.ts index 618374f..6c41467 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/RagfairStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/RagfairStaticRouter.d.ts @@ -1,6 +1,6 @@ import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class RagfairStaticRouter extends StaticRouter { - private ragfairCallbacks; + protected ragfairCallbacks: RagfairCallbacks; constructor(ragfairCallbacks: RagfairCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/TraderStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/TraderStaticRouter.d.ts index 18f0629..41728a1 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/TraderStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/TraderStaticRouter.d.ts @@ -1,6 +1,6 @@ import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class TraderStaticRouter extends StaticRouter { - private traderCallbacks; + protected traderCallbacks: TraderCallbacks; constructor(traderCallbacks: TraderCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/WeatherStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/WeatherStaticRouter.d.ts index 61b904d..72ed851 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/WeatherStaticRouter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/routers/static/WeatherStaticRouter.d.ts @@ -1,6 +1,6 @@ import { WeatherCallbacks } from "../../callbacks/WeatherCallbacks"; import { StaticRouter } from "../../di/Router"; export declare class WeatherStaticRouter extends StaticRouter { - private weatherCallbacks; + protected weatherCallbacks: WeatherCallbacks; constructor(weatherCallbacks: WeatherCallbacks); } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/ConfigServer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/ConfigServer.d.ts index 9c2e114..a079be8 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/ConfigServer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/ConfigServer.d.ts @@ -1,30 +1,14 @@ import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigTypes } from "../models/enums/ConfigTypes"; export declare class ConfigServer { - private logger; - private vfs; - private jsonUtil; - private configs; + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected configs: Record; constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil); getConfig(configType: ConfigTypes): T; + getConfigByString(configType: string): T; initialize(): void; } -export declare const enum ConfigTypes { - AIRDROP = "aki-airdrop", - BOT = "aki-bot", - CORE = "aki-core", - HEALTH = "aki-health", - HIDEOUT = "aki-hideout", - HTTP = "aki-http", - IN_RAID = "aki-inraid", - INSURANCE = "aki-insurance", - INVENTORY = "aki-inventory", - LOCATION = "aki-location", - MATCH = "aki-match", - QUEST = "aki-quest", - RAGFAIR = "aki-ragfair", - REPAIR = "aki-repair", - TRADER = "aki-trader", - WEATHER = "aki-weather" -} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/DatabaseServer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/DatabaseServer.d.ts index 521bcf9..aa152d0 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/DatabaseServer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/DatabaseServer.d.ts @@ -1,6 +1,6 @@ import { IDatabaseTables } from "../models/spt/server/IDatabaseTables"; export declare class DatabaseServer { - private tableData; + protected tableData: IDatabaseTables; getTables(): IDatabaseTables; setTables(any: any): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/HttpServer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/HttpServer.d.ts index d0db7e4..5234966 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/HttpServer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/HttpServer.d.ts @@ -1,9 +1,11 @@ /// +/// import http, { ServerResponse } from "http"; import { Serializer } from "../di/Serializer"; import { HttpServerHelper } from "../helpers/HttpServerHelper"; import { NotifierHelper } from "../helpers/NotifierHelper"; import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; import { IHttpServer } from "../models/spt/server/IHttpServer"; import { ILogger } from "../models/spt/utils/ILogger"; import { HttpRouter } from "../routers/HttpRouter"; @@ -13,24 +15,24 @@ import { RandomUtil } from "../utils/RandomUtil"; import { ConfigServer } from "./ConfigServer"; import { DatabaseServer } from "./DatabaseServer"; export declare class HttpServer implements IHttpServer { - private httpRouter; - private logger; - private randomUtil; - private jsonUtil; - private httpResponse; - private databaseServer; - private notifierHelper; - private httpServerHelper; - private serializers; - private configServer; + protected httpRouter: HttpRouter; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected serializers: Serializer[]; + protected configServer: ConfigServer; constructor(httpRouter: HttpRouter, // TODO: delay required logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, serializers: Serializer[], configServer: ConfigServer); - private buffers; - private onReceive; - private onRespond; - private httpConfig; - private webSockets; - private websocketPingHandler; + protected buffers: {}; + protected onReceive: {}; + protected onRespond: {}; + protected httpConfig: IHttpConfig; + protected webSockets: {}; + protected websocketPingHandler: any; getCookies(req: http.IncomingMessage): any; resetBuffer(sessionID: string): void; putInBuffer(sessionID: any, data: any, bufLength: number): boolean; @@ -42,6 +44,6 @@ export declare class HttpServer implements IHttpServer { sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; handleRequest(req: http.IncomingMessage, resp: http.ServerResponse): void; load(): void; - private getRandomisedMessage; + protected getRandomisedMessage(): string; wsOnConnection(ws: any, req: any): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/RagfairServer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/RagfairServer.d.ts index d103625..60c92b5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/RagfairServer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/RagfairServer.d.ts @@ -1,38 +1,22 @@ -import { HttpResponseUtil } from "../utils/HttpResponseUtil"; -import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; -import { ProfileHelper } from "../helpers/ProfileHelper"; import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; -import { SaveServer } from "./SaveServer"; -import { RagfairPriceService } from "../services/RagfairPriceService"; -import { RagfairOfferService } from "../services/RagfairOfferService"; -import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; -import { RagfairLinkedItemService } from "../services/RagfairLinkedItemService"; import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; -import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; -import { ConfigServer } from "./ConfigServer"; -import { ItemEventRouter } from "../routers/ItemEventRouter"; -import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { ConfigServer } from "./ConfigServer"; export declare class RagfairServer { - private logger; - private ragfairOfferGenerator; - private ragfairServerHelper; - private profileHelper; - private itemEventRouter; - private httpResponse; - private saveServer; - private ragfairPriceService; - private ragfairOfferService; - private ragfairLinkedItemService; - private ragfairCategoriesService; - private ragfairRequiredItemsService; - private configServer; - private ragfairConfig; - constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, saveServer: SaveServer, ragfairPriceService: RagfairPriceService, ragfairOfferService: RagfairOfferService, ragfairLinkedItemService: RagfairLinkedItemService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); + protected logger: ILogger; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairCategoriesService: RagfairCategoriesService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairOfferService: RagfairOfferService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); load(): void; update(): void; - private processExpiredOffer; - returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; getCategories(): Record; /** * Disable/Hide an offer from flea @@ -40,6 +24,7 @@ export declare class RagfairServer { */ hideOffer(offerId: string): void; getOffer(offerID: string): IRagfairOffer; + getOffers(): IRagfairOffer[]; removeOfferStack(offerID: string, amount: number): void; doesOfferExist(offerId: string): boolean; addPlayerOffers(): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/SaveServer.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/SaveServer.d.ts index fdf92e4..cb28f49 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/SaveServer.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/servers/SaveServer.d.ts @@ -5,15 +5,15 @@ import { VFS } from "../utils/VFS"; import { SaveLoadRouter } from "../di/Router"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class SaveServer { - private vfs; - private saveLoadRouters; - private jsonUtil; - private hashUtil; - private logger; - private profileFilepath; - private profiles; - private onSave; - private saveMd5; + protected vfs: VFS; + protected saveLoadRouters: SaveLoadRouter[]; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected profileFilepath: string; + protected profiles: {}; + protected onSave: {}; + protected saveMd5: {}; constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger); load(): void; save(): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/FenceService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/FenceService.d.ts index eef87b3..12723fb 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/FenceService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/FenceService.d.ts @@ -1,29 +1,30 @@ -import { DatabaseServer } from "../servers/DatabaseServer"; import { HandbookHelper } from "../helpers/HandbookHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { PresetHelper } from "../helpers/PresetHelper"; import { FenceLevel } from "../models/eft/common/IGlobals"; import { IPmcData } from "../models/eft/common/IPmcData"; import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { RandomUtil } from "../utils/RandomUtil"; -import { ILogger } from "../models/spt/utils/ILogger"; export declare class FenceService { - private logger; - private hashUtil; - private jsonUtil; - private randomUtil; - private databaseServer; - private handbookHelper; - private itemHelper; - private presetHelper; - private configServer; - private fenceAssort; - private traderConfig; + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected fenceAssort: ITraderAssort; + protected traderConfig: ITraderConfig; constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, presetHelper: PresetHelper, configServer: ConfigServer); - private setFenceAssort; + protected setFenceAssort(fenceAssort: ITraderAssort): void; getFenceAssorts(): ITraderAssort; hasExpiredCache(refreshAssort: boolean): boolean; generateFenceAssortCache(pmcData: IPmcData): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/HashCacheService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/HashCacheService.d.ts index c9b0170..5320f28 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/HashCacheService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/HashCacheService.d.ts @@ -3,13 +3,13 @@ import { HashUtil } from "../utils/HashUtil"; import { JsonUtil } from "../utils/JsonUtil"; import { VFS } from "../utils/VFS"; export declare class HashCacheService { - private vfs; - private hashUtil; - private jsonUtil; - private logger; - private jsonHashes; - private modHashes; - private readonly modCachePath; + protected vfs: VFS; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected jsonHashes: any; + protected modHashes: any; + protected readonly modCachePath = "./user/cache/modCache.json"; constructor(vfs: VFS, hashUtil: HashUtil, jsonUtil: JsonUtil, logger: ILogger); getStoredModHash(modName: string): string; modContentMatchesStoredHash(modName: string, modContent: string): boolean; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/InsuranceService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/InsuranceService.d.ts index 160faba..0219816 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/InsuranceService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/InsuranceService.d.ts @@ -4,6 +4,7 @@ import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; import { Item } from "../models/eft/common/tables/IItem"; import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; import { ILogger } from "../models/spt/utils/ILogger"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; @@ -11,18 +12,18 @@ import { SaveServer } from "../servers/SaveServer"; import { RandomUtil } from "../utils/RandomUtil"; import { TimeUtil } from "../utils/TimeUtil"; export declare class InsuranceService { - private logger; - private databaseServer; - private secureContainerHelper; - private randomUtil; - private timeUtil; - private saveServer; - private traderHelper; - private dialogueHelper; - private configServer; - private insured; - private templatesById; - private insuranceConfig; + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected secureContainerHelper: SecureContainerHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected traderHelper: TraderHelper; + protected dialogueHelper: DialogueHelper; + protected configServer: ConfigServer; + protected insured: Record>; + protected templatesById: {}; + protected insuranceConfig: IInsuranceConfig; constructor(logger: ILogger, databaseServer: DatabaseServer, secureContainerHelper: SecureContainerHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, saveServer: SaveServer, traderHelper: TraderHelper, dialogueHelper: DialogueHelper, configServer: ConfigServer); insuranceExists(sessionId: string): boolean; insuranceTraderArrayExists(sessionId: string, traderId: string): boolean; @@ -36,6 +37,6 @@ export declare class InsuranceService { sendInsuredItems(pmcData: IPmcData, sessionID: string): void; storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; - private addGearToSend; + protected addGearToSend(pmcData: IPmcData, insuredItem: any, actualItem: any, sessionID: string): any; getPremium(pmcData: IPmcData, inventoryItem: Item, traderId: string): number; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/MatchLocationService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/MatchLocationService.d.ts index f7b7d3b..2b5fc0e 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/MatchLocationService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/MatchLocationService.d.ts @@ -1,7 +1,7 @@ import { TimeUtil } from "../utils/TimeUtil"; export declare class MatchLocationService { - private timeUtil; - private locations; + protected timeUtil: TimeUtil; + protected locations: {}; constructor(timeUtil: TimeUtil); createGroup(sessionID: string, info: any): any; deleteGroup(info: any): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/ModCompilerService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/ModCompilerService.d.ts index d316e48..26cb4ac 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/ModCompilerService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/ModCompilerService.d.ts @@ -1,13 +1,20 @@ +import * as ts from "typescript"; import { ILogger } from "../models/spt/utils/ILogger"; import { VFS } from "../utils/VFS"; import { HashCacheService } from "./HashCacheService"; export declare class ModCompilerService { - private logger; - private hashCacheService; - private vfs; + protected logger: ILogger; + protected hashCacheService: HashCacheService; + protected vfs: VFS; constructor(logger: ILogger, hashCacheService: HashCacheService, vfs: VFS); - compileMod(modName: string, path: string, modTypeScriptFiles: string[]): Promise; - private compile; - private areFilesReady; - private delay; + compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise; + protected compile(fileNames: string[], options: ts.CompilerOptions): Promise; + protected buildDepth(depth: number): string; + protected getNodesModulesPath(depth: number): string; + protected getAkiPath(depth: number): string; + protected getAkiFolder(): string; + protected getNodesModulesFolder(): string; + protected calculateDepth(file: string): number; + protected areFilesReady(fileNames: string[]): boolean; + protected delay(ms: number): Promise; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/NotificationService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/NotificationService.d.ts index 9c6c143..7e2a127 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/NotificationService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/NotificationService.d.ts @@ -1,6 +1,6 @@ import { INotification } from "../models/eft/notifier/INotifier"; export declare class NotificationService { - private messageQueue; + protected messageQueue: {}; getMessageQueue(): {}; getMessageFromQueue(sessionId: string): any; updateMessageOnQueue(sessionId: string, value: any[]): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/PaymentService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/PaymentService.d.ts index 0a6c4d6..5834750 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/PaymentService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/PaymentService.d.ts @@ -4,6 +4,7 @@ import { ItemHelper } from "../helpers/ItemHelper"; import { PaymentHelper } from "../helpers/PaymentHelper"; import { TraderHelper } from "../helpers/TraderHelper"; import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; @@ -11,14 +12,14 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; import { HttpResponseUtil } from "../utils/HttpResponseUtil"; export declare class PaymentService { - private logger; - private httpResponse; - private databaseServer; - private handbookHelper; - private traderHelper; - private itemHelper; - private inventoryHelper; - private paymentHelper; + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); /** * Take money and insert items into return to server request @@ -43,6 +44,6 @@ export declare class PaymentService { * inside the stash, that is it has the stash as * ancestor with slotId=hideout */ - private isItemInStash; + protected isItemInStash(pmcData: IPmcData, item: Item): boolean; addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/PlayerService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/PlayerService.d.ts index 99e5986..519b7e5 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/PlayerService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/PlayerService.d.ts @@ -3,8 +3,8 @@ import { IPlayerIncrementSkillLevelRequestData } from "../models/eft/player/IPla import { ILogger } from "../models/spt/utils/ILogger"; import { DatabaseServer } from "../servers/DatabaseServer"; export declare class PlayerService { - private logger; - private databaseServer; + protected logger: ILogger; + protected databaseServer: DatabaseServer; constructor(logger: ILogger, databaseServer: DatabaseServer); /** * increases the profile skill and updates any output diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairCategoriesService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairCategoriesService.d.ts index fb9efa2..09956cc 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairCategoriesService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairCategoriesService.d.ts @@ -1,7 +1,7 @@ import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; export declare class RagfairCategoriesService { updateCategories(offers: IRagfairOffer[]): void; - private categories; + protected categories: Record; getCategories(): Record; getCategoryByItemId(itemId: string): number; resetCategories(): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairLinkedItemService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairLinkedItemService.d.ts index d5dc58e..6c34ee0 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairLinkedItemService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairLinkedItemService.d.ts @@ -1,9 +1,10 @@ import { DatabaseServer } from "../servers/DatabaseServer"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; export declare class RagfairLinkedItemService { - private databaseServer; - private linkedItemsCache; + protected databaseServer: DatabaseServer; + protected linkedItemsCache: Record>; constructor(databaseServer: DatabaseServer); getLinkedItems(linkedSearchId: string): Iterable; - buildLinkedItemTable(): void; - private getFilters; + protected buildLinkedItemTable(): void; + protected getFilters(item: ITemplateItem, slot: string): string[]; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairOfferService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairOfferService.d.ts index 4e4ae26..7afbf8c 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairOfferService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairOfferService.d.ts @@ -1,20 +1,32 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; import { ConfigServer } from "../servers/ConfigServer"; import { DatabaseServer } from "../servers/DatabaseServer"; import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; import { TimeUtil } from "../utils/TimeUtil"; -import { Item } from "../models/eft/common/tables/IItem"; -import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; export declare class RagfairOfferService { - private timeUtil; - private databaseServer; - private saveServer; - private configServer; - private playerOffersLoaded; - private toUpdate; - private expiredOffers; - private offers; - private ragfairConfig; - constructor(timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, configServer: ConfigServer); + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected ragfairServerHelper: RagfairServerHelper; + protected profileHelper: ProfileHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected playerOffersLoaded: boolean; + protected toUpdate: Record; + protected expiredOffers: Item[]; + protected offers: IRagfairOffer[]; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, configServer: ConfigServer); getOffers(): IRagfairOffer[]; getOfferByOfferId(offerId: string): IRagfairOffer; getOffersOfType(templateId: string): IRagfairOffer[]; @@ -22,20 +34,13 @@ export declare class RagfairOfferService { addOfferToExpired(offer: Item): void; setTraderUpdateStatus(traderId: string, shouldUpdate: boolean): void; shouldTraderBeUpdated(traderID: string): boolean; - /** - * Get an array of expired offers that are still shown to player - * @returns IRagfairOffer array - */ - getExpiredActiveOffers(): IRagfairOffer[]; getExpiredOfferCount(): number; - getOfferIndexByOfferId(offerId: string): number; /** * Get an array of expired items not yet processed into new offers * @returns items that need to be turned into offers */ getExpiredOffers(): Item[]; resetExpiredOffers(): void; - private isExpired; /** * Does the offer exist on the ragfair * @param offerId offer id to check for @@ -44,9 +49,18 @@ export declare class RagfairOfferService { doesOfferExist(offerId: string): boolean; getTraders(): Record; flagTraderForUpdate(expiredOfferUserId: string): void; - removeOffer(globalOfferIndex: number, countToRemove: number): void; + removeOfferById(offerId: string): void; removeOfferStack(offerID: string, amount: number): void; removeAllOffersByTrader(traderId: string): void; addTradersToUpdateList(): void; addPlayerOffers(): void; + expireStaleOffers(): void; + /** + * Get an array of stale offers that are still shown to player + * @returns IRagfairOffer array + */ + protected getStaleOffers(): IRagfairOffer[]; + protected isStale(offer: IRagfairOffer, time: number): boolean; + protected processStaleOffer(staleOffer: IRagfairOffer): void; + protected returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairPriceService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairPriceService.d.ts index 7cc42f9..5256b99 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairPriceService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairPriceService.d.ts @@ -1,22 +1,24 @@ -import { RandomUtil } from "../utils/RandomUtil"; -import { DatabaseServer } from "../servers/DatabaseServer"; -import { ConfigServer } from "../servers/ConfigServer"; import { HandbookHelper } from "../helpers/HandbookHelper"; import { ItemHelper } from "../helpers/ItemHelper"; import { PresetHelper } from "../helpers/PresetHelper"; import { Item } from "../models/eft/common/tables/IItem"; import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { IRagfairServerPrices } from "../models/spt/ragfair/IRagfairServerPrices"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RandomUtil } from "../utils/RandomUtil"; export declare class RagfairPriceService { - private handbookHelper; - private databaseServer; - private logger; - private itemHelper; - private presetHelper; - private randomUtil; - private configServer; - private ragfairConfig; - private prices; + protected handbookHelper: HandbookHelper; + protected databaseServer: DatabaseServer; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected prices: IRagfairServerPrices; constructor(handbookHelper: HandbookHelper, databaseServer: DatabaseServer, logger: ILogger, itemHelper: ItemHelper, presetHelper: PresetHelper, randomUtil: RandomUtil, configServer: ConfigServer); generateStaticPrices(): void; generateDynamicPrices(): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairRequiredItemsService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairRequiredItemsService.d.ts index e4582d0..b05fc65 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairRequiredItemsService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/RagfairRequiredItemsService.d.ts @@ -2,10 +2,10 @@ import { PaymentHelper } from "../helpers/PaymentHelper"; import { RagfairOfferService } from "../services/RagfairOfferService"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class RagfairRequiredItemsService { - private logger; - private paymentHelper; - private ragfairOfferService; - private requiredItemsCache; + protected logger: ILogger; + protected paymentHelper: PaymentHelper; + protected ragfairOfferService: RagfairOfferService; + protected requiredItemsCache: {}; constructor(logger: ILogger, paymentHelper: PaymentHelper, ragfairOfferService: RagfairOfferService); getRequiredItems(searchId: string): any; buildRequiredItemTable(): void; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/TraderAssortService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/TraderAssortService.d.ts index ccb9e45..5ba2d05 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/TraderAssortService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/TraderAssortService.d.ts @@ -1,6 +1,6 @@ import { ITraderAssort } from "../models/eft/common/tables/ITrader"; export declare class TraderAssortService { - private pristineTraderAssorts; + protected pristineTraderAssorts: Record; getPristineTraderAssort(traderId: string): ITraderAssort; setPristineTraderAssort(traderId: string, assort: ITraderAssort): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/image/imageRouteService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/image/imageRouteService.d.ts new file mode 100644 index 0000000..29569b2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/image/imageRouteService.d.ts @@ -0,0 +1,6 @@ +export declare class ImageRouteService { + protected routes: Record; + addRoute(urlKey: string, route: string): void; + getByKey(urlKey: string): string; + existsByKey(urlKey: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/onLoad/OnLoadModService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/onLoad/OnLoadModService.d.ts index 89bad14..f402103 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/onLoad/OnLoadModService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/onLoad/OnLoadModService.d.ts @@ -1,6 +1,6 @@ import { DependencyContainer } from "tsyringe"; export declare class OnLoadModService { - private container; + protected container: DependencyContainer; constructor(container: DependencyContainer); registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/onUpdate/OnUpdateModService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/onUpdate/OnUpdateModService.d.ts index 32419f4..05d735b 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/onUpdate/OnUpdateModService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/onUpdate/OnUpdateModService.d.ts @@ -1,6 +1,6 @@ import { DependencyContainer } from "tsyringe"; export declare class OnUpdateModService { - private container; + protected container: DependencyContainer; constructor(container: DependencyContainer); registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/staticRouter/StaticRouterModService.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/staticRouter/StaticRouterModService.d.ts index d4c42aa..f28fd45 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/staticRouter/StaticRouterModService.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/services/mod/staticRouter/StaticRouterModService.d.ts @@ -1,7 +1,7 @@ import { DependencyContainer } from "tsyringe"; import { RouteAction } from "../../../di/Router"; export declare class StaticRouterModService { - private container; + protected container: DependencyContainer; constructor(container: DependencyContainer); registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/App.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/App.d.ts index a11f576..34c141e 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/App.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/App.d.ts @@ -3,12 +3,12 @@ import { OnLoad } from "../di/OnLoad"; import { OnUpdate } from "../di/OnUpdate"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class App { - private logger; - private timeUtil; - private onLoadComponents; - private onUpdateComponents; - private onUpdateLastRun; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected onLoadComponents: OnLoad[]; + protected onUpdateComponents: OnUpdate[]; + protected onUpdateLastRun: {}; constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]); load(): void; - private update; + protected update(onUpdateComponents: OnUpdate[]): void; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/AyncQueue.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/AyncQueue.d.ts index a99aa37..da6ab18 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/AyncQueue.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/AyncQueue.d.ts @@ -1,7 +1,7 @@ import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; import { ICommand } from "../models/spt/utils/ICommand"; export declare class AsyncQueue implements IAsyncQueue { - private commandsQueue; + protected commandsQueue: ICommand[]; constructor(); waitFor(command: ICommand): Promise; } diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/DatabaseImporter.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/DatabaseImporter.d.ts index 97dda30..0857b67 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/DatabaseImporter.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/DatabaseImporter.d.ts @@ -5,11 +5,11 @@ import { ImageRouter } from "../routers/ImageRouter"; import { OnLoad } from "../di/OnLoad"; import { ILogger } from "../models/spt/utils/ILogger"; export declare class DatabaseImporter extends OnLoad { - private logger; - private vfs; - private jsonUtil; - private databaseServer; - private imageRouter; + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected imageRouter: ImageRouter; constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter); onLoad(): void; getRoute(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/HashUtil.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/HashUtil.d.ts index cf92b47..bacbf2a 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/HashUtil.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/HashUtil.d.ts @@ -2,7 +2,7 @@ import crypto from "crypto"; import { TimeUtil } from "./TimeUtil"; export declare class HashUtil { - private timeUtil; + protected timeUtil: TimeUtil; constructor(timeUtil: TimeUtil); generate(): string; generateMd5ForData(data: string): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/HttpResponseUtil.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/HttpResponseUtil.d.ts index 85c28bd..29502be 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/HttpResponseUtil.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/HttpResponseUtil.d.ts @@ -3,9 +3,9 @@ import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyRespons import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; export declare class HttpResponseUtil { - private jsonUtil; + protected jsonUtil: JsonUtil; constructor(jsonUtil: JsonUtil); - private clearString; + protected clearString(s: string): any; noBody(data: any): any; getBody(data: T, err?: number, errmsg?: any): IGetBodyResponseData; getUnclearedBody(data: any, err?: number, errmsg?: any): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/JsonUtil.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/JsonUtil.d.ts index 20b7448..71e95f6 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/JsonUtil.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/JsonUtil.d.ts @@ -2,10 +2,10 @@ import { ILogger } from "../models/spt/utils/ILogger"; import { HashUtil } from "./HashUtil"; import { VFS } from "./VFS"; export declare class JsonUtil { - private vfs; - private hashUtil; - private logger; - private fileHashes; + protected vfs: VFS; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected fileHashes: any; constructor(vfs: VFS, hashUtil: HashUtil, logger: ILogger); /** * From object to string diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/Logger.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/Logger.d.ts index 9d5b32a..f5b774b 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/Logger.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/Logger.d.ts @@ -1,18 +1,43 @@ /// import { Daum } from "../models/eft/itemEvent/IItemEventRouterRequest"; import { ILogger } from "../models/spt/utils/ILogger"; +import winston from "winston"; import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; import fs from "fs"; +interface SptLogger { + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} export declare class WinstonLogger implements ILogger { - private asyncQueue; - private uuidGenerator; - private showDebugInConsole; - private folderPath; - private file; - private filePath; - private logLevels; - private logger; + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + protected showDebugInConsole: boolean; + protected folderPath: string; + protected file: string; + protected filePath: string; + protected logLevels: { + levels: { + error: number; + warn: number; + succ: number; + info: number; + custom: number; + debug: number; + }; + colors: { + error: string; + warn: string; + succ: string; + info: string; + custom: string; + debug: string; + }; + }; + protected logger: winston.Logger & SptLogger; writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); writeToLogFile(data: string | Daum): Promise; @@ -23,3 +48,4 @@ export declare class WinstonLogger implements ILogger { info(data: string | Record): Promise; debug(data: string | Record, onlyShowInConsole?: boolean): Promise; } +export {}; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/ObjectId.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/ObjectId.d.ts index b100572..03aae56 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/ObjectId.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/ObjectId.d.ts @@ -1,13 +1,13 @@ /// import { TimeUtil } from "./TimeUtil"; export declare class ObjectId { - private timeUtil; + protected timeUtil: TimeUtil; constructor(timeUtil: TimeUtil); - private randomBytes; - private constglobalCounter; - private consttime; - private globalCounter; - private time; + protected randomBytes: Buffer; + protected constglobalCounter: number; + protected consttime: number; + protected globalCounter: number; + protected time: number; incGlobalCounter(): number; toHexString(byteArray: string | any[] | Buffer): string; generate(): string; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/RandomUtil.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/RandomUtil.d.ts index 3a3ecb6..c24dd60 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/RandomUtil.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/RandomUtil.d.ts @@ -103,8 +103,8 @@ export declare class ProbabilityObject { constructor(key: K, relativeProbability: number, data?: V); } export declare class RandomUtil { - private jsonUtil; - private logger; + protected jsonUtil: JsonUtil; + protected logger: ILogger; constructor(jsonUtil: JsonUtil, logger: ILogger); getInt(min: number, max: number): number; getIntEx(max: number): number; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/VFS.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/VFS.d.ts index b064cf4..e5eaf02 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/VFS.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/VFS.d.ts @@ -1,11 +1,12 @@ /// +/// import "reflect-metadata"; import fs from "fs"; import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; export declare class VFS { - private asyncQueue; - private uuidGenerator; + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { @@ -29,7 +30,7 @@ export declare class VFS { copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise; createDir(filepath: string): void; createDirAsync(filepath: string): Promise; - copyDir(filepath: string, target: string, fileExtensions: string | string[]): void; + copyDir(filepath: string, target: string, fileExtensions?: string | string[]): void; copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise; readFile(filepath: string): any; readFileAsync(filepath: string): Promise; diff --git a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/Watermark.d.ts b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/Watermark.d.ts index e7b9883..111bdd0 100644 --- a/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/Watermark.d.ts +++ b/KcY-SeeItemValue/itemValue/Built/KcY-SeeItemValue 1.2.1/user/mods/KcY-SeeItemValue 1.2.1/types/utils/Watermark.d.ts @@ -1,19 +1,32 @@ -import { ConfigServer } from "../servers/ConfigServer"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; export declare class WatermarkLocale { - private locales; + protected locales: { + "en-US": { + description: string[]; + warning: string[]; + modding: string[]; + }; + "zh-CN": { + description: string[]; + warning: string[]; + modding: string[]; + }; + }; getLocale(): string; getDescription(): string[]; getWarning(): string[]; + getModding(): string[]; } export declare class Watermark { - private logger; - private configServer; - private watermarkLocale?; - private akiConfig; + protected logger: ILogger; + protected configServer: ConfigServer; + protected watermarkLocale?: WatermarkLocale; + protected akiConfig: ICoreConfig; constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale); - private text; - private versionLabel; + protected text: string[]; + protected versionLabel: string; initialize(): void; getVersionTag(): string; getVersionLabel(): string; @@ -24,5 +37,5 @@ export declare class Watermark { /** Draw the watermark */ draw(): void; /** Caculate text length */ - private textLength; + protected textLength(s: string): number; } diff --git a/KcY-SeeItemValue/itemValue/Patches.cs b/KcY-SeeItemValue/itemValue/Patches.cs index 20a2a55..183e653 100644 --- a/KcY-SeeItemValue/itemValue/Patches.cs +++ b/KcY-SeeItemValue/itemValue/Patches.cs @@ -1,15 +1,12 @@ using System; using System.Reflection; using Aki.Reflection.Patching; -using Aki.Reflection.Utils; -using EFT; using EFT.InventoryLogic; using Ammo = BulletClass; -using Grenade = GClass2079; -using GrenadeTemplate = GClass1975; -using ItemAttribute = GClass2098; -using SecureContainer = GClass2038; -using SecureContainerTemplate = GClass1937; +using Grenade = GClass2081; +using GrenadeTemplate = GClass1977; +using SecureContainer = GClass2040; +using SecureContainerTemplate = GClass1939; namespace itemValueMod { diff --git a/KcY-SeeItemValue/itemValue/itemValueMod.cs b/KcY-SeeItemValue/itemValue/itemValueMod.cs index 0b4b9a4..6b20dce 100644 --- a/KcY-SeeItemValue/itemValue/itemValueMod.cs +++ b/KcY-SeeItemValue/itemValue/itemValueMod.cs @@ -13,7 +13,7 @@ using Aki.Common.Utils; using EFT.InventoryLogic; using System; using System.Collections.Generic; -using ItemAttribute = GClass2098; +using ItemAttribute = GClass2100; namespace itemValueMod { diff --git a/KcY-SeeItemValue/itemValue/server/.eslintignore b/KcY-SeeItemValue/itemValue/server/.eslintignore new file mode 100644 index 0000000..9922d9a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/.eslintignore @@ -0,0 +1,9 @@ +# Exclude these folders from linting +node_modules +dist/ +types/ + +# Exclude these filetypes from linting +*.json +*.txt +*.exe \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/server/.eslintrc.json b/KcY-SeeItemValue/itemValue/server/.eslintrc.json new file mode 100644 index 0000000..c505160 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/.eslintrc.json @@ -0,0 +1,75 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-unused-vars": 1, + "@typescript-eslint/no-empty-interface": 0, + "@typescript-eslint/no-namespace": 0, + "@typescript-eslint/comma-dangle": 1, + "@typescript-eslint/func-call-spacing": 2, + "@typescript-eslint/quotes": 1, + "@typescript-eslint/brace-style": [ + "warn", + "allman" + ], + "@typescript-eslint/naming-convention": [ + "warn", + { + "selector": "default", + "format": ["camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "typeLike", + "format": ["PascalCase"] + }, + { + "selector": "objectLiteralProperty", + "format": ["PascalCase", "camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "typeProperty", + "format": ["PascalCase", "camelCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "enumMember", + "format": ["UPPER_CASE"] + } + ], + "@typescript-eslint/indent": [ + "warn", + 4 + ], + "@typescript-eslint/no-unused-expressions": [ + "warn", + { + "allowShortCircuit": false, + "allowTernary": false + } + ], + "@typescript-eslint/keyword-spacing": [ + "warn", + { + "before": true, + "after": true + } + ], + "@typescript-eslint/explicit-module-boundary-types": [ + "warn", + { + "allowArgumentsExplicitlyTypedAsAny": true + } + ] + } +} \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/server/LICENSE b/KcY-SeeItemValue/itemValue/server/LICENSE new file mode 100644 index 0000000..14bbbd7 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/LICENSE @@ -0,0 +1,34 @@ +University of Illinois/NCSA Open Source License + +Copyright (c) [year] [fullname]. All rights reserved. + +Developed by: [SEE ITEM VALUE] + [KcY] + [https://github.com/KeiranY/TarkovLoader] + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation files +(the "Software"), to deal with the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + +* Neither the names of [fullname], [project] nor the names of its + contributors may be used to endorse or promote products derived from + this Software without specific prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH +THE SOFTWARE. \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/server/dist/package.json b/KcY-SeeItemValue/itemValue/server/dist/package.json new file mode 100644 index 0000000..8b36f69 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/package.json @@ -0,0 +1,26 @@ +{ + "name": "SeeItemValue", + "author": "KcY", + "version": "1.3.0", + "license": "NCSA Open Source", + "main": "src/mod.js", + "akiVersion": "3.0.0", + "UpdatedBy": "CWX", + "scripts": { + "setup:environment": "npm i", + "build:unzipped": "copyfiles -e \"./node_modules/**/*.*\" -e \"./dist/**/*.*\" -e \"./package-lock.json\" -e \"./tsconfig.json\" -e \"./README.txt\" -e \"./mod.code-workspace\" ./**/*.* ./dist", + "zip:files": "cd dist/ && bestzip ../mod.zip *", + "build:zip": "npm run clean:environment && npm run build:unzipped && npm run zip:files", + "clean:environment": "node -e \"require('fs').rm('mod.zip', ()=>{})\" && node -e \"require('fs').rmdir('./dist/',{recursive:true},()=>{})\"" + }, + "devDependencies": { + "@types/node": "^14.15.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "copyfiles": "2.4.1", + "eslint": "7.26.0", + "tsyringe": "4.6.0", + "typescript": "4.6.4", + "bestzip": "2.2.1" + } +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/src/config.json b/KcY-SeeItemValue/itemValue/server/dist/src/config.json new file mode 100644 index 0000000..7f116ec --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/src/config.json @@ -0,0 +1,4 @@ +{ + "TraderPrice": false, + "TraderMultiplier": 0.54 +} \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/server/dist/src/mod.ts b/KcY-SeeItemValue/itemValue/server/dist/src/mod.ts new file mode 100644 index 0000000..d83d48e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/src/mod.ts @@ -0,0 +1,155 @@ +import type { DependencyContainer } from "tsyringe"; +import { IMod } from "@spt-aki/models/external/mod"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; +import { DynamicRouterModService } from "@spt-aki/services/mod/dynamicRouter/DynamicRouterModService" +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer" +import { HttpResponseUtil } from "@spt-aki/utils/HttpResponseUtil" + +class SeeItemValue implements IMod +{ + private name = "KcY-SeeItemValue"; + private version = "1.3.0"; + private logger: ILogger; + private database: DatabaseServer; + private router: DynamicRouterModService; + private http: HttpResponseUtil; + private table; + private livePrice; + private handbookTable; + private therapist; + private ragman; + private jaeger; + private mechanic; + private prapor; + private peacekeeper; + private skier; + private fence; + private tradersArr; + private cfg; + + public load(container: DependencyContainer) + { + this.router = container.resolve("DynamicRouterModService"); + this.logger = container.resolve("WinstonLogger"); + this.http = container.resolve("HttpResponseUtil"); + this.logger.info(`loading: ${this.name} ${this.version}`); + this.cfg = require("./config.json"); + this.addRoute() + } + + public delayedLoad(container: DependencyContainer) + { + this.database = container.resolve("DatabaseServer"); + this.table = this.database.getTables(); + this.livePrice = this.table.templates.prices; + this.handbookTable = this.table.templates.handbook; + this.therapist = this.table.traders["54cb57776803fa99248b456e"].base; + this.ragman = this.table.traders["5ac3b934156ae10c4430e83c"].base; + this.jaeger = this.table.traders["5c0647fdd443bc2504c2d371"].base; + this.mechanic = this.table.traders["5a7c2eca46aef81a7ca2145d"].base; + this.prapor = this.table.traders["54cb50c76803fa8b248b4571"].base; + this.peacekeeper = this.table.traders["5935c25fb3acc3127c3d8cd9"].base; + this.skier = this.table.traders["58330581ace78e27b8b10cee"].base; + this.fence = this.table.traders["579dc571d53a0658a154fbec"].base; + this.tradersArr = [this.therapist, this.ragman, this.jaeger, this.mechanic, this.prapor, this.peacekeeper, this.skier, this.fence]; + } + + private addRoute() + { + this.router.registerDynamicRouter( + "seeitemvalue", + [ + { + url: "/cwx/seeitemvalue/", + action: (url, info, sessionId, output) => + { + return this.onRequestConfig(url, info, sessionId, output) + } + } + ], + "seeitemvalue" + ) + } + + private onRequestConfig(url, info, sessionId, output) + { + const splittedUrl = url.split("/"); + const id = splittedUrl[splittedUrl.length - 1].toLowerCase(); + return this.http.noBody(this.getIdPrice(id)); + } + + private getIdPrice(id) + { + let sPrice = 1; + let sMutli = 1; + let parentId = ""; + + // if TraderPrice in cfg is False get price from flea AVG + if (this.cfg.TraderPrice === false) + { + const result = this.livePrice[id]; + if (typeof result != "undefined") + { + return result; + } + // will still default to Handbook if no price is found for flea AVG + } + // if TraderPrice in cfg is True get price from handbook + // as traders have a modifier, avg is 0.54, closest we can get without checking against each trader + // thanks to TEOA for this info + for (const i in this.handbookTable.Items) + { + if (this.handbookTable.Items[i].Id === id) + { + parentId = this.handbookTable.Items[i].ParentId; + sMutli = this.getBestTraderMulti(parentId); + sPrice = this.handbookTable.Items[i].Price; + const result = (sPrice*sMutli); + + return result; + } + } + return sPrice; + } + + private getBestTraderMulti(parentId) + { + let traderSellCat = ""; + let traderMulti = 0.54; + let traderName = ""; // could be used later to be passed back to module to show trader and price + let altTraderSellCat = ""; + + for (const i in this.handbookTable.Categories) + { + if (this.handbookTable.Categories[i].Id === parentId) + { + traderSellCat = this.handbookTable.Categories[i].Id; + altTraderSellCat = this.handbookTable.Categories[i].ParentId; + break; + } + } + + for (let iter = 0; iter < 8; iter++) + { + if (this.tradersArr[iter].sell_category.includes(traderSellCat)) + { + traderMulti = (100 - this.tradersArr[iter].loyaltyLevels[0].buy_price_coef) / 100; + traderName = this.tradersArr[iter].nickname; + return traderMulti; + } + } + + for (let iter = 0; iter < 8; iter++) + { + if (this.tradersArr[iter].sell_category.includes(altTraderSellCat)) + { + traderMulti = (100 - this.tradersArr[iter].loyaltyLevels[0].buy_price_coef) / 100; + traderName = this.tradersArr[iter].nickname; + return traderMulti; + } + } + return this.cfg.TraderMultiplier; + } +} + +module.exports = { mod: new SeeItemValue() } \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/Program.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/Program.d.ts new file mode 100644 index 0000000..d4b71b9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/Program.d.ts @@ -0,0 +1,4 @@ +export declare class Program { + constructor(); + start(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/TYPES.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/TYPES.d.ts new file mode 100644 index 0000000..6407c3a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/TYPES.d.ts @@ -0,0 +1,3 @@ +export declare const TYPES: { + [name: string]: symbol; +}; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/Utils.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/Utils.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/BotCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/BotCallbacks.d.ts new file mode 100644 index 0000000..2db60dc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/BotCallbacks.d.ts @@ -0,0 +1,15 @@ +import { BotController } from "../controllers/BotController"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BotCallbacks { + protected botController: BotController; + protected httpResponse: HttpResponseUtil; + constructor(botController: BotController, httpResponse: HttpResponseUtil); + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/BundleCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/BundleCallbacks.d.ts new file mode 100644 index 0000000..b28abe1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/BundleCallbacks.d.ts @@ -0,0 +1,18 @@ +import { BundleLoader } from "../loaders/BundleLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BundleCallbacks { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, bundleLoader: BundleLoader, configServer: ConfigServer); + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/CustomizationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/CustomizationCallbacks.d.ts new file mode 100644 index 0000000..3bab8c0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/CustomizationCallbacks.d.ts @@ -0,0 +1,23 @@ +import { CustomizationController } from "../controllers/CustomizationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class CustomizationCallbacks { + protected customizationController: CustomizationController; + protected saveServer: SaveServer; + protected httpResponse: HttpResponseUtil; + constructor(customizationController: CustomizationController, saveServer: SaveServer, httpResponse: HttpResponseUtil); + getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<{ + _id: string; + suites: string[]; + }>; + getTraderSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/DataCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/DataCallbacks.d.ts new file mode 100644 index 0000000..cfb1c16 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/DataCallbacks.d.ts @@ -0,0 +1,32 @@ +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGlobals } from "../models/eft/common/IGlobals"; +import { ICustomizationItem } from "../models/eft/common/tables/ICustomizationItem"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IHideoutArea } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../models/eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../models/eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../models/eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../models/spt/server/ILocaleBase"; +import { ISettingsBase } from "../models/spt/server/ISettingsBase"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DataCallbacks { + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer); + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/DialogueCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/DialogueCallbacks.d.ts new file mode 100644 index 0000000..634f90b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/DialogueCallbacks.d.ts @@ -0,0 +1,45 @@ +import { DialogueController } from "../controllers/DialogueController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../models/eft/dialog/IFriendRequestData"; +import { IGetAllAttachmentsRequestData } from "../models/eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetChatServerListRequestData } from "../models/eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogInfoRequestData } from "../models/eft/dialog/IGetMailDialogInfoRequestData"; +import { IGetMailDialogListRequestData } from "../models/eft/dialog/IGetMailDialogListRequestData"; +import { IGetMailDialogViewRequestData } from "../models/eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IPinDialogRequestData } from "../models/eft/dialog/IPinDialogRequestData"; +import { IRemoveDialogRequestData } from "../models/eft/dialog/IRemoveDialogRequestData"; +import { ISendMessageRequest } from "../models/eft/dialog/ISendMessageRequest"; +import { ISetDialogReadRequestData } from "../models/eft/dialog/ISetDialogReadRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { DialogueInfo } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class DialogueCallbacks extends OnUpdate { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected dialogueController: DialogueController; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController); + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/GameCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/GameCallbacks.d.ts new file mode 100644 index 0000000..d5cad76 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/GameCallbacks.d.ts @@ -0,0 +1,24 @@ +import { GameController } from "../controllers/GameController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IGameEmptyCrcRequestData } from "../models/eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../models/eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class GameCallbacks { + protected httpResponse: HttpResponseUtil; + protected watermark: Watermark; + protected gameController: GameController; + constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController); + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} +export { GameCallbacks }; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HandbookCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HandbookCallbacks.d.ts new file mode 100644 index 0000000..891e375 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HandbookCallbacks.d.ts @@ -0,0 +1,8 @@ +import { HandbookController } from "../controllers/HandbookController"; +import { OnLoad } from "../di/OnLoad"; +export declare class HandbookCallbacks extends OnLoad { + protected handbookController: HandbookController; + constructor(handbookController: HandbookController); + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HealthCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HealthCallbacks.d.ts new file mode 100644 index 0000000..8f7b89d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HealthCallbacks.d.ts @@ -0,0 +1,20 @@ +import { HealthController } from "../controllers/HealthController"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class HealthCallbacks { + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected healthController: HealthController; + constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController); + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HideoutCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HideoutCallbacks.d.ts new file mode 100644 index 0000000..99ab4c9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HideoutCallbacks.d.ts @@ -0,0 +1,33 @@ +import { HideoutController } from "../controllers/HideoutController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../models/eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HideoutCallbacks extends OnUpdate { + protected hideoutController: HideoutController; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(hideoutController: HideoutController, // TODO: delay needed + configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HttpCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HttpCallbacks.d.ts new file mode 100644 index 0000000..94c97bd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/HttpCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoad } from "../di/OnLoad"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class HttpCallbacks extends OnLoad { + protected httpServer: IHttpServer; + constructor(httpServer: IHttpServer); + onLoad(): void; + getRoute(): string; + getImage(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InraidCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InraidCallbacks.d.ts new file mode 100644 index 0000000..05bcce4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InraidCallbacks.d.ts @@ -0,0 +1,23 @@ +import { InraidController } from "../controllers/InraidController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IAirdropConfig } from "../models/spt/config/IAirdropConfig"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InraidCallbacks { + protected inraidController: InraidController; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected airdropConfig: IAirdropConfig; + protected inraidConfig: IInRaidConfig; + constructor(inraidController: InraidController, httpResponse: HttpResponseUtil, configServer: ConfigServer); + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InsuranceCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InsuranceCallbacks.d.ts new file mode 100644 index 0000000..520d0eb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InsuranceCallbacks.d.ts @@ -0,0 +1,24 @@ +import { InsuranceController } from "../controllers/InsuranceController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InsuranceCallbacks extends OnLoadOnUpdate { + protected insuranceController: InsuranceController; + protected insuranceService: InsuranceService; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer); + onLoad(): void; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(secondsSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InventoryCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InventoryCallbacks.d.ts new file mode 100644 index 0000000..9ab1486 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/InventoryCallbacks.d.ts @@ -0,0 +1,39 @@ +import { InventoryController } from "../controllers/InventoryController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class InventoryCallbacks { + protected inventoryController: InventoryController; + constructor(inventoryController: InventoryController); + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ItemEventCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ItemEventCallbacks.d.ts new file mode 100644 index 0000000..f4f04f9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ItemEventCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class ItemEventCallbacks { + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter); + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/LauncherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/LauncherCallbacks.d.ts new file mode 100644 index 0000000..c022325 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/LauncherCallbacks.d.ts @@ -0,0 +1,28 @@ +import { LauncherController } from "../controllers/LauncherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../models/eft/launcher/IRemoveProfileData"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class LauncherCallbacks { + protected httpResponse: HttpResponseUtil; + protected launcherController: LauncherController; + protected saveServer: SaveServer; + protected watermark: Watermark; + constructor(httpResponse: HttpResponseUtil, launcherController: LauncherController, saveServer: SaveServer, watermark: Watermark); + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getServerVersion(): string; + ping(url: string, info: IEmptyRequestData, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} +export { LauncherCallbacks }; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/LocationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/LocationCallbacks.d.ts new file mode 100644 index 0000000..cc69369 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/LocationCallbacks.d.ts @@ -0,0 +1,14 @@ +import { LocationController } from "../controllers/LocationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetLocationRequestData } from "../models/eft/location/IGetLocationRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class LocationCallbacks { + protected httpResponse: HttpResponseUtil; + protected locationController: LocationController; + constructor(httpResponse: HttpResponseUtil, locationController: LocationController); + getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/MatchCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/MatchCallbacks.d.ts new file mode 100644 index 0000000..083c1f5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/MatchCallbacks.d.ts @@ -0,0 +1,35 @@ +import { MatchController } from "../controllers/MatchController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class MatchCallbacks { + protected httpResponse: HttpResponseUtil; + protected jsonUtil: JsonUtil; + protected matchController: MatchController; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, jsonUtil: JsonUtil, matchController: MatchController, databaseServer: DatabaseServer); + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: IGetProfileRequestData, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ModCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ModCallbacks.d.ts new file mode 100644 index 0000000..866abf7 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ModCallbacks.d.ts @@ -0,0 +1,22 @@ +import { OnLoad } from "../di/OnLoad"; +import { DelayedModLoader } from "../loaders/DelayedModLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +declare class ModCallbacks extends OnLoad { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected modLoader: DelayedModLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, modLoader: DelayedModLoader, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} +export { ModCallbacks }; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/NoteCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/NoteCallbacks.d.ts new file mode 100644 index 0000000..d39d400 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/NoteCallbacks.d.ts @@ -0,0 +1,11 @@ +import { NoteController } from "../controllers/NoteController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +export declare class NoteCallbacks { + protected noteController: NoteController; + constructor(noteController: NoteController); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/NotifierCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/NotifierCallbacks.d.ts new file mode 100644 index 0000000..cd1e736 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/NotifierCallbacks.d.ts @@ -0,0 +1,24 @@ +import { NotifierController } from "../controllers/NotifierController"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../models/eft/notifier/ISelectProfileRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class NotifierCallbacks { + protected httpServerHelper: HttpServerHelper; + protected httpResponse: HttpResponseUtil; + protected notifierController: NotifierController; + constructor(httpServerHelper: HttpServerHelper, httpResponse: HttpResponseUtil, notifierController: NotifierController); + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(_sessionID: string, req: any, resp: any, _data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/PresetBuildCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/PresetBuildCallbacks.d.ts new file mode 100644 index 0000000..8a0c155 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/PresetBuildCallbacks.d.ts @@ -0,0 +1,15 @@ +import { PresetBuildController } from "../controllers/PresetBuildController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PresetBuildCallbacks { + protected httpResponse: HttpResponseUtil; + protected presetBuildController: PresetBuildController; + constructor(httpResponse: HttpResponseUtil, presetBuildController: PresetBuildController); + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/PresetCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/PresetCallbacks.d.ts new file mode 100644 index 0000000..4553f8f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/PresetCallbacks.d.ts @@ -0,0 +1,8 @@ +import { PresetController } from "../controllers/PresetController"; +import { OnLoad } from "../di/OnLoad"; +export declare class PresetCallbacks extends OnLoad { + protected presetController: PresetController; + constructor(presetController: PresetController); + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ProfileCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ProfileCallbacks.d.ts new file mode 100644 index 0000000..116e7c5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/ProfileCallbacks.d.ts @@ -0,0 +1,30 @@ +import { ProfileController } from "../controllers/ProfileController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IGetMiniProfileRequestData } from "../models/eft/launcher/IGetMiniProfileRequestData"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileCallbacks { + protected httpResponse: HttpResponseUtil; + protected timeUtil: TimeUtil; + protected profileController: ProfileController; + constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, profileController: ProfileController); + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/QuestCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/QuestCallbacks.d.ts new file mode 100644 index 0000000..559c29e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/QuestCallbacks.d.ts @@ -0,0 +1,26 @@ +import { QuestController } from "../controllers/QuestController"; +import { RepeatableQuestController } from "../controllers/RepeatableQuestController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IListQuestsRequestData } from "../models/eft/quests/IListQuestsRequestData"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class QuestCallbacks { + protected httpResponse: HttpResponseUtil; + protected questController: QuestController; + protected repeatableQuestController: RepeatableQuestController; + constructor(httpResponse: HttpResponseUtil, questController: QuestController, repeatableQuestController: RepeatableQuestController); + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/RagfairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/RagfairCallbacks.d.ts new file mode 100644 index 0000000..d5bab8b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/RagfairCallbacks.d.ts @@ -0,0 +1,39 @@ +import { RagfairController } from "../controllers/RagfairController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAddOfferRequestData } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IRemoveOfferRequestData } from "../models/eft/ragfair/IRemoveOfferRequestData"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected ragfairServer: RagfairServer; + protected ragfairController: RagfairController; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(httpResponse: HttpResponseUtil, logger: ILogger, jsonUtil: JsonUtil, ragfairServer: RagfairServer, ragfairController: RagfairController, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + sendReport(url: string, info: any, sessionID: string): INullResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/RepairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/RepairCallbacks.d.ts new file mode 100644 index 0000000..63733fa --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/RepairCallbacks.d.ts @@ -0,0 +1,11 @@ +import { RepairController } from "../controllers/RepairController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +export declare class RepairCallbacks { + protected repairController: RepairController; + constructor(repairController: RepairController); + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/SaveCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/SaveCallbacks.d.ts new file mode 100644 index 0000000..bbb6e53 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/SaveCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { SaveServer } from "../servers/SaveServer"; +export declare class SaveCallbacks extends OnLoadOnUpdate { + protected saveServer: SaveServer; + constructor(saveServer: SaveServer); + onLoad(): void; + getRoute(): string; + onUpdate(secondsSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/TradeCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/TradeCallbacks.d.ts new file mode 100644 index 0000000..272ae46 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/TradeCallbacks.d.ts @@ -0,0 +1,11 @@ +import { TradeController } from "../controllers/TradeController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +export declare class TradeCallbacks { + protected tradeController: TradeController; + constructor(tradeController: TradeController); + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/TraderCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/TraderCallbacks.d.ts new file mode 100644 index 0000000..128d9b2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/TraderCallbacks.d.ts @@ -0,0 +1,18 @@ +import { TraderController } from "../controllers/TraderController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class TraderCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected traderController: TraderController; + constructor(httpResponse: HttpResponseUtil, traderController: TraderController); + onLoad(): void; + getRoute(): string; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + onUpdate(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/WeatherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/WeatherCallbacks.d.ts new file mode 100644 index 0000000..ae784c8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/WeatherCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WeatherController } from "../controllers/WeatherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class WeatherCallbacks { + protected httpResponse: HttpResponseUtil; + protected weatherController: WeatherController; + constructor(httpResponse: HttpResponseUtil, weatherController: WeatherController); + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/WishlistCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/WishlistCallbacks.d.ts new file mode 100644 index 0000000..c2cc2a8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/callbacks/WishlistCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WishlistController } from "../controllers/WishlistController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +export declare class WishlistCallbacks { + protected wishlistController: WishlistController; + constructor(wishlistController: WishlistController); + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/BotController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/BotController.d.ts new file mode 100644 index 0000000..09a1788 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/BotController.d.ts @@ -0,0 +1,35 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { BotHelper } from "../helpers/BotHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +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 { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class BotController { + protected databaseServer: DatabaseServer; + protected botGenerator: BotGenerator; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + /** + * Return the number of bot loadout varieties to be generated + * @param type bot Type we want the loadout gen count for + * @returns + */ + getBotPresetGenerationLimit(type: string): number; + getBotCoreDifficulty(): IBotCore; + /** + * Get bot difficulty settings + * adjust PMC settings to ensure they engage the correct bot types + * @param type what bot the server is requesting settings for + * @param difficulty difficulty level server requested settings for + * @returns Difficulty object + */ + getBotDifficulty(type: string, difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/CustomizationController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/CustomizationController.d.ts new file mode 100644 index 0000000..a6c4730 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/CustomizationController.d.ts @@ -0,0 +1,22 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +export declare class CustomizationController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper); + getTraderSuits(traderID: string, sessionID: string): ISuit[]; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; + protected getAllTraderSuits(sessionID: string): ISuit[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/DialogueController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/DialogueController.d.ts new file mode 100644 index 0000000..b15c4b6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/DialogueController.d.ts @@ -0,0 +1,25 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { DialogueInfo, Message } from "../models/eft/profile/IAkiProfile"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DialogueController { + protected httpResponse: HttpResponseUtil; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + constructor(httpResponse: HttpResponseUtil, saveServer: SaveServer, dialogueHelper: DialogueHelper); + getFriendList(sessionID: string): IGetFriendListDataResponse; + generateDialogueList(sessionID: string): IGetBodyResponseData; + getDialogueInfo(dialogueID: string, sessionID: string): DialogueInfo; + generateDialogueView(dialogueID: string, sessionID: string): IGetMailDialogViewResponseData; + removeDialogue(dialogueID: string, sessionID: string): void; + setDialoguePin(dialogueID: string, shouldPin: boolean, sessionID: string): void; + setRead(dialogueIDs: string[], sessionID: string): void; + getAllAttachments(dialogueID: string, sessionID: string): IGetAllAttachmentsResponse; + protected messagesHaveUncollectedRewards(messages: Message[]): boolean; + protected removeExpiredItems(sessionID: string): void; + update(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/GameController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/GameController.d.ts new file mode 100644 index 0000000..b9067fa --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/GameController.d.ts @@ -0,0 +1,32 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcDataRepeatableQuest, IRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { Watermark } from "../utils/Watermark"; +export declare class GameController { + protected logger: ILogger; + protected watermark: Watermark; + protected httpServerHelper: HttpServerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, watermark: Watermark, httpServerHelper: HttpServerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void; + protected addMissingBonusesProperty(pmcProfile: IPmcData): void; + protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void; + protected addMissingWeaponRepairSkill(pmcProfile: IPmcData): void; + protected addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void; + protected addMissingArmorRepairSkill(pmcProfile: IPmcData): void; + protected fixNullTraderSalesSums(pmcProfile: IPmcData): void; + protected removeDanglingConditionCounters(pmcProfile: IPmcData): void; + protected removeDanglingBackendCounters(pmcProfile: IPmcData): void; + getGameConfig(sessionID: string): IGameConfigResponse; + getServer(): any[]; + protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/HandbookController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/HandbookController.d.ts new file mode 100644 index 0000000..52d2dd8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/HandbookController.d.ts @@ -0,0 +1,8 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class HandbookController { + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + constructor(databaseServer: DatabaseServer, handbookHelper: HandbookHelper); + load(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/HealthController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/HealthController.d.ts new file mode 100644 index 0000000..aafb8df --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/HealthController.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentService } from "../services/PaymentService"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class HealthController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected inventoryHelper: InventoryHelper; + protected healthHelper: HealthHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, healthHelper: HealthHelper); + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/HideoutController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/HideoutController.d.ts new file mode 100644 index 0000000..a8bf229 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/HideoutController.d.ts @@ -0,0 +1,57 @@ +import { HideoutHelper } from "../helpers/HideoutHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { HideoutUpgradeCompleteRequestData } from "../models/eft/hideout/HideoutUpgradeCompleteRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HideoutController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected inventoryHelper: InventoryHelper; + protected saveServer: SaveServer; + protected playerService: PlayerService; + protected presetHelper: PresetHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected hideoutHelper: HideoutHelper; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + update(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/InraidController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/InraidController.d.ts new file mode 100644 index 0000000..7f2036c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/InraidController.d.ts @@ -0,0 +1,31 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { InRaidHelper } from "../helpers/InRaidHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InraidController { + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected itemHelper: ItemHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + protected healthHelper: HealthHelper; + protected traderHelper: TraderHelper; + protected insuranceService: InsuranceService; + protected inRaidHelper: InRaidHelper; + protected configServer: ConfigServer; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, extendedProfileHelper: ExtendedProfileHelper, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer); + addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void; + saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/InsuranceController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/InsuranceController.d.ts new file mode 100644 index 0000000..db2c567 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/InsuranceController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { PaymentService } from "../services/PaymentService"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceController { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected itemEventRouter: ItemEventRouter; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected profileHelper: ProfileHelper; + protected dialogueHelper: DialogueHelper; + protected paymentService: PaymentService; + protected insuranceService: InsuranceService; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, itemEventRouter: ItemEventRouter, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required + insuranceService: InsuranceService, configServer: ConfigServer); + processReturn(): void; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + cost(info: IGetInsuranceCostRequestData, sessionID: string): any; + doAbsolutelyNothing(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/InventoryController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/InventoryController.d.ts new file mode 100644 index 0000000..b732aa9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/InventoryController.d.ts @@ -0,0 +1,107 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InventoryController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected presetHelper: PresetHelper; + protected inventoryHelper: InventoryHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter); + /** + * Move Item + * change location of item with parentId and slotId + * transfers items from one profile to another if fromOwner/toOwner is set in the body. + * otherwise, move is contained within the same profile_f. + */ + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Remove Item from Profile + * Deep tree item deletion, also removes items from insurance list + */ + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Implements functionality "Discard" from Main menu (Stash etc.) + * Removes item from PMC Profile + */ + discardItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Split Item + * spliting 1 item-stack into 2 separate items ... + */ + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Merge Item + * merges 2 items into one, deletes item from `body.item` and adding number of stacks into `body.with` + */ + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Transfer item + * Used to take items from scav inventory into stash or to insert ammo into mags (shotgun ones) and reloading weapon by clicking "Reload" + */ + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Swap Item + * its used for "reload" if you have weapon in hands and magazine is somewhere else in rig or backpack in equipment + */ + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Give Item + * its used for "add" item like gifts etc. + */ + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + /** + * Handles folding of Weapons + */ + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Toggles "Toggleable" items like night vision goggles and face shields. + */ + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles Tagging of items (primary Containers). + */ + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles examining of the item * + */ + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles sorting of Inventory. + */ + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/LauncherController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/LauncherController.d.ts new file mode 100644 index 0000000..1af1f56 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/LauncherController.d.ts @@ -0,0 +1,28 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { Info } from "../models/eft/profile/IAkiProfile"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class LauncherController { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected httpServerHelper: HttpServerHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected coreConfig: ICoreConfig; + constructor(hashUtil: HashUtil, saveServer: SaveServer, httpServerHelper: HttpServerHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + connect(): any; + find(sessionIdKey: string): Info; + login(info: ILoginRequestData): string; + register(info: IRegisterData): string; + protected createAccount(info: IRegisterData): string; + changeUsername(info: IChangeRequestData): string; + changePassword(info: IChangeRequestData): string; + wipe(info: IRegisterData): string; + getCompatibleTarkovVersion(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/LocationController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/LocationController.d.ts new file mode 100644 index 0000000..90b6d7a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/LocationController.d.ts @@ -0,0 +1,18 @@ +import { LocationGenerator } from "../generators/LocationGenerator"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class LocationController { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected locationGenerator: LocationGenerator; + protected databaseServer: DatabaseServer; + protected timeUtil: TimeUtil; + constructor(jsonUtil: JsonUtil, logger: ILogger, locationGenerator: LocationGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil); + get(location: string): ILocationBase; + generate(name: string): ILocationBase; + generateAll(): ILocationsGenerateAllResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/MatchController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/MatchController.d.ts new file mode 100644 index 0000000..c322d96 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/MatchController.d.ts @@ -0,0 +1,30 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { IMatchConfig } from "../models/spt/config/IMatchConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { MatchLocationService } from "../services/MatchLocationService"; +export declare class MatchController { + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected matchLocationService: MatchLocationService; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected matchConfig: IMatchConfig; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, configServer: ConfigServer); + getEnabled(): boolean; + getProfile(info: IGetProfileRequestData): IPmcData[]; + protected getMatch(location: any): any; + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; + joinMatch(info: any, sessionID: string): any[]; + getGroupStatus(info: any): any; + startOfflineRaid(info: IStartOfflineRaidRequestData, sessionID: string): void; + endOfflineRaid(info: IEndOfflineRaidRequestData, sessionID: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/NoteController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/NoteController.d.ts new file mode 100644 index 0000000..cc78383 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/NoteController.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +declare class NoteController { + protected itemEventRouter: ItemEventRouter; + constructor(itemEventRouter: ItemEventRouter); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} +export { NoteController }; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/NotifierController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/NotifierController.d.ts new file mode 100644 index 0000000..31d7bfe --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/NotifierController.d.ts @@ -0,0 +1,22 @@ +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { NotificationService } from "../services/NotificationService"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +export declare class NotifierController { + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected notificationService: NotificationService; + protected pollInterval: number; + protected timeout: number; + constructor(notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, notificationService: NotificationService); + /** + * Resolve an array of session notifications. + * + * If no notifications are currently queued then intermittently check for new notifications until either + * one or more appear or when a timeout expires. + * If no notifications are available after the timeout, use a default message. + */ + notifyAsync(sessionID: string): Promise; + getServer(sessionID: string): string; + getChannel(sessionID: string): INotifierChannel; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/PresetBuildController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/PresetBuildController.d.ts new file mode 100644 index 0000000..adf4084 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/PresetBuildController.d.ts @@ -0,0 +1,18 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class PresetBuildController { + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + constructor(hashUtil: HashUtil, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, saveServer: SaveServer); + getUserBuilds(sessionID: string): WeaponBuild[]; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/PresetController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/PresetController.d.ts new file mode 100644 index 0000000..ca1af1a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/PresetController.d.ts @@ -0,0 +1,8 @@ +import { PresetHelper } from "../helpers/PresetHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetController { + protected presetHelper: PresetHelper; + protected databaseServer: DatabaseServer; + constructor(presetHelper: PresetHelper, databaseServer: DatabaseServer); + initialize(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/ProfileController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/ProfileController.d.ts new file mode 100644 index 0000000..9b7a6d5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/ProfileController.d.ts @@ -0,0 +1,34 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileController { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected traderHelper: TraderHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, traderHelper: TraderHelper, extendedProfileHelper: ExtendedProfileHelper); + getMiniProfiles(): IMiniProfile[]; + getMiniProfile(sessionID: string): any; + getCompleteProfile(sessionID: string): IPmcData[]; + createProfile(info: IProfileCreateRequestData, sessionID: string): void; + generatePlayerScav(sessionID: string): IPmcData; + validateNickname(info: IValidateNicknameRequestData, sessionID: string): string; + changeNickname(info: IProfileChangeNicknameRequestData, sessionID: string): string; + changeVoice(info: IProfileChangeVoiceRequestData, sessionID: string): void; + getFriends(info: ISearchFriendRequestData, sessionID: string): ISearchFriendResponse[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/QuestController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/QuestController.d.ts new file mode 100644 index 0000000..e588de0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/QuestController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { QuestConditionHelper } from "../helpers/QuestConditionHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class QuestController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected questHelper: QuestHelper; + protected questConditionHelper: QuestConditionHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, questConditionHelper: QuestConditionHelper, playerService: PlayerService, configServer: ConfigServer); + getClientQuests(sessionID: string): IQuest[]; + acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + acceptRepeatableQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/RagfairController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/RagfairController.d.ts new file mode 100644 index 0000000..c758593 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/RagfairController.d.ts @@ -0,0 +1,70 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairHelper } from "../helpers/RagfairHelper"; +import { RagfairOfferHelper } from "../helpers/RagfairOfferHelper"; +import { RagfairSellHelper } from "../helpers/RagfairSellHelper"; +import { RagfairSortHelper } from "../helpers/RagfairSortHelper"; +import { RagfairTaxHelper } from "../helpers/RagfairTaxHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IAddOfferRequestData, Requirement } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PaymentService } from "../services/PaymentService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + protected ragfairServer: RagfairServer; + protected ragfairPriceService: RagfairPriceService; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + protected ragfairSellHelper: RagfairSellHelper; + protected ragfairTaxHelper: RagfairTaxHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairOfferHelper: RagfairOfferHelper; + protected profileHelper: ProfileHelper; + protected paymentService: PaymentService; + protected handbookHelper: HandbookHelper; + protected paymentHelper: PaymentHelper; + protected inventoryHelper: InventoryHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter, ragfairServer: RagfairServer, ragfairPriceService: RagfairPriceService, databaseServer: DatabaseServer, itemHelper: ItemHelper, saveServer: SaveServer, ragfairSellHelper: RagfairSellHelper, ragfairTaxHelper: RagfairTaxHelper, ragfairSortHelper: RagfairSortHelper, ragfairOfferHelper: RagfairOfferHelper, profileHelper: ProfileHelper, paymentService: PaymentService, handbookHelper: HandbookHelper, paymentHelper: PaymentHelper, inventoryHelper: InventoryHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer); + getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult; + update(): void; + getItemPrice(info: IGetMarketPriceRequestData): IGetItemPriceResult; + addPlayerOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + createPlayerOffer(profile: IAkiProfile, requirements: Requirement[], items: Item[], sellInOnePiece: boolean, amountToSend: number): IRagfairOffer; + getAllFleaPrices(): Record; + removeOffer(offerId: string, sessionID: string): IItemEventRouterResponse; + extendOffer(info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/RepairController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/RepairController.d.ts new file mode 100644 index 0000000..e9458f6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/RepairController.d.ts @@ -0,0 +1,41 @@ +import { QuestHelper } from "../helpers/QuestHelper"; +import { RepairHelper } from "../helpers/RepairHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +export declare class RepairController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected traderHelper: TraderHelper; + protected paymentService: PaymentService; + protected repairHelper: RepairHelper; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, questHelper: QuestHelper, traderHelper: TraderHelper, paymentService: PaymentService, repairHelper: RepairHelper, configServer: ConfigServer); + /** + * Repair with trader + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + /** + * Repair with repair kit + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/RepeatableQuestController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/RepeatableQuestController.d.ts new file mode 100644 index 0000000..ce190aa --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/RepeatableQuestController.d.ts @@ -0,0 +1,217 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { Exit } from "../models/eft/common/ILocationBase"; +import { IPmcData, TraderInfo } from "../models/eft/common/IPmcData"; +import { ICompletion, ICompletionAvailableFor, IElimination, IEliminationCondition, IExploration, IExplorationCondition, IPmcDataRepeatableQuest, IRepeatableQuest, IReward, IRewards } from "../models/eft/common/tables/IRepeatableQuests"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { ELocationName } from "../models/enums/ELocationName"; +import { IQuestConfig, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { ProbabilityObject, ProbabilityObjectArray, RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export interface IQuestTypePool { + types: string[]; + pool: IQuestPool; +} +export interface IQuestPool { + Exploration: IExplorationPool; + Elimination: IEliminationPool; +} +export interface IExplorationPool { + locations: Partial>; +} +export interface IEliminationPool { + targets: IEliminationTargetPool; +} +export interface IEliminationTargetPool { + Savage?: ITargetLocation; + AnyPmc?: ITargetLocation; + bossBully?: ITargetLocation; + bossGluhar?: ITargetLocation; + bossKilla?: ITargetLocation; + bossSanitar?: ITargetLocation; + bossTagilla?: ITargetLocation; + bossKojaniy?: ITargetLocation; +} +export interface ITargetLocation { + locations: string[]; +} +export declare class RepeatableQuestController { + protected timeUtil: TimeUtil; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected mathUtil: MathUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected itemEventRouter: ItemEventRouter; + protected paymentService: PaymentService; + protected objectId: ObjectId; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, itemEventRouter: ItemEventRouter, paymentService: PaymentService, objectId: ObjectId, configServer: ConfigServer); + /** + * This is the method reached by the /client/repeatalbeQuests/activityPeriods endpoint + * Returns an array of objects in the format of repeatable quests to the client. + * repeatableQuestObject = { + * id: Unique Id, + * name: "Daily", + * endTime: the time when the quests expire + * activeQuests: currently available quests in an array. Each element of quest type format (see assets/database/templates/repeatableQuests.json). + * inactiveQuests: the quests which were previously active (required by client to fail them if they are not completed) + * } + * + * The method checks if the player level requirement for repeatable quests (e.g. daily lvl5, weekly lvl15) is met and if the previously active quests + * are still valid. This ischecked by endTime persisted in profile accordning to the resetTime configured for each repeatable kind (daily, weekly) + * in QuestCondig.js + * + * If the condition is met, new repeatableQuests are created, old quests (which are persisted in the profile.RepeatableQuests[i].activeQuests) are + * moved to profile.RepeatableQuests[i].inactiveQuests. This memory is required to get rid of old repeatable quest data in the profile, otherwise + * they'll litter the profile's Quests field. + * (if the are on "Succeed" but not "Completed" we keep them, to allow the player to complete them and get the rewards) + * The new quests generated are again persisted in profile.RepeatableQuests + * + * + * @param {string} sessionId Player's session id + * @returns {array} array of "repeatableQuestObjects" as descibed above + */ + getClientRepeatableQuests(_info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; + /** + * This method is called by GetClientRepeatableQuests and creates one element of quest type format (see assets/database/templates/repeatableQuests.json). + * It randomly draws a quest type (currently Elimination, Completion or Exploration) as well as a trader who is providing the quest + */ + generateRepeatableQuest(pmcLevel: number, pmcTraderInfo: Record, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest; + /** + * Just for debug reasons. Draws dailies a random assort of dailies extracted from dumps + */ + generateDebugDailies(dailiesPool: any, factory: any, number: any): any; + /** + * Generates the base object of quest type format given as templates in assets/database/templates/repeatableQuests.json + * The templates include Elimination, Completion and Extraction quest types + * + * @param {string} type quest type: "Elimination", "Completion" or "Extraction" + * @param {string} traderId trader from which the quest will be provided + * @returns {object} a object which contains the base elements for repeatable quests of the requests type + * (needs to be filled with reward and conditions by called to make a valid quest) + */ + generateRepeatableTemplate(type: string, traderId: string): IRepeatableQuest; + /** + * Generates a valid Exploration quest + * + * @param {integer} pmcLevel player's level for reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Exploration" (see assets/database/templates/repeatableQuests.json) + */ + generateExplorationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IExploration; + /** + * Generates a valid Completion quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Completion" (see assets/database/templates/repeatableQuests.json) + */ + generateCompletionQuest(pmcLevel: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): ICompletion; + /** + * Generates a valid Elimination quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Elimination" (see assets/database/templates/repeatableQuests.json) + */ + generateEliminationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IElimination; + /** + * Exploration repeatable quests can specify a required extraction point. + * This method creates the according object which will be appended to the conditions array + * + * @param {string} exit The exit name to generate the condition for + * @returns {object} Exit condition + */ + generateExplorationExitCondition(exit: Exit): IExplorationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateCompletionQuest to create a completion condition (of which a completion quest theoretically can have many) + * + * @param {string} targetItemId id of the item to request + * @param {integer} value amount of items of this specific type to request + * @returns {object} object of "Completion"-condition + */ + generateCompletionAvailableForFinish(targetItemId: string, value: number): ICompletionAvailableFor; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a location condition. + * + * @param {string} location the location on which to fulfill the elimination quest + * @returns {object} object of "Elimination"-location-subcondition + */ + generateEliminationLocation(location: string[]): IEliminationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a kill condition. + * + * @param {string} target array of target npcs e.g. "AnyPmc", "Savage" + * @param {array} bodyParts array of body parts with which to kill e.g. ["stomach", "thorax"] + * @param {number} distance distance from which to kill (currently only >= supported) + * @returns {object} object of "Elimination"-kill-subcondition + */ + generateEliminationCondition(target: string, bodyPart: string[], distance: number): IEliminationCondition; + /** + * Used to create a quest pool during each cycle of repeatable quest generation. The pool will be subsequently + * narrowed down during quest generation to avoid duplicate quests. Like duplicate extractions or elimination quests + * where you have to e.g. kill scavs in same locations. + * + * @returns {object} the quest pool + */ + generateQuestPool(repeatableConfig: IRepeatableQuestConfig): IQuestTypePool; + /** + * Generate the reward for a mission. A reward can consist of + * - Experience + * - Money + * - Items + * - Trader Reputation + * + * The reward is dependent on the player level as given by the wiki. The exact mapping of pmcLevel to + * experience / money / items / trader reputation can be defined in QuestConfig.js + * + * There's also a random variation of the reward the spread of which can be also defined in the config. + * + * Additonaly, a scaling factor w.r.t. quest difficulty going from 0.2...1 can be used + * + * @param {integer} pmcLevel player's level + * @param {number} difficulty a reward scaling factor goint from 0.2 to 1 + * @param {string} traderId the trader for reputation gain (and possible in the future filtering of reward item type based on trader) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of "Reward"-type that can be given for a repeatable mission + */ + generateReward(pmcLevel: number, difficulty: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): IRewards; + /** + * Helper to create a reward item structured as required by the client + * + * @param {string} tpl itemId of the rewarded item + * @param {integer} value amount of items to give + * @param {integer} index all rewards will be appended to a list, for unkown reasons the client wants the index + * @returns {object} object of "Reward"-item-type + */ + generateRewardItem(tpl: string, value: number, index: number, preset?: any): IReward; + debugLogRepeatableQuestIds(pmcData: IPmcData): void; + probabilityObjectArray(configArrayInput: ProbabilityObject[]): ProbabilityObjectArray; + changeRepeatableQuest(pmcDataIn: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/TradeController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/TradeController.d.ts new file mode 100644 index 0000000..c86745c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/TradeController.d.ts @@ -0,0 +1,21 @@ +import { RagfairServer } from "../servers/RagfairServer"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TradeHelper } from "../helpers/TradeHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +declare class TradeController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected tradeHelper: TradeHelper; + protected profileHelper: ProfileHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, tradeHelper: TradeHelper, profileHelper: ProfileHelper, ragfairServer: RagfairServer); + confirmTrading(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid?: boolean, upd?: Upd): IItemEventRouterResponse; + confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} +export { TradeController }; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/TraderController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/TraderController.d.ts new file mode 100644 index 0000000..7bab158 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/TraderController.d.ts @@ -0,0 +1,26 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderAssortHelper } from "../helpers/TraderAssortHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class TraderController { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected traderAssortHelper: TraderAssortHelper; + protected profileHelper: ProfileHelper; + protected traderHelper: TraderHelper; + protected timeUtil: TimeUtil; + protected traderAssortService: TraderAssortService; + protected jsonUtil: JsonUtil; + constructor(logger: ILogger, databaseServer: DatabaseServer, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, timeUtil: TimeUtil, traderAssortService: TraderAssortService, jsonUtil: JsonUtil); + load(): void; + getTrader(traderID: string, sessionID: string): ITraderBase; + getAllTraders(sessionID: string): ITraderBase[]; + updateTraders(): boolean; + getAssort(sessionId: string, traderId: string): ITraderAssort; + getPurchasesData(traderID: string, sessionID: string): Record; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/WeatherController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/WeatherController.d.ts new file mode 100644 index 0000000..ca7f5eb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/WeatherController.d.ts @@ -0,0 +1,11 @@ +import { WeatherGenerator } from "../generators/WeatherGenerator"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WeatherController { + protected weatherGenerator: WeatherGenerator; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer); + generate(): IWeatherData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/controllers/WishlistController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/WishlistController.d.ts new file mode 100644 index 0000000..a96c522 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/controllers/WishlistController.d.ts @@ -0,0 +1,10 @@ +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class WishlistController { + protected itemEvenRouter: ItemEventRouter; + constructor(itemEvenRouter: ItemEventRouter); + addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/di/Container.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/di/Container.d.ts new file mode 100644 index 0000000..17791b0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/di/Container.d.ts @@ -0,0 +1,14 @@ +import { DependencyContainer } from "tsyringe"; +export declare class Container { + static registerTypes(depContainer: DependencyContainer): void; + static registerListTypes(depContainer: DependencyContainer): void; + private static registerUtils; + private static registerRouters; + private static registerGenerators; + private static registerHelpers; + private static registerLoaders; + private static registerCallbacks; + private static registerServices; + private static registerServers; + private static registerControllers; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/di/OnLoad.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/di/OnLoad.d.ts new file mode 100644 index 0000000..064d07d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/di/OnLoad.d.ts @@ -0,0 +1,4 @@ +export declare class OnLoad { + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/di/OnLoadOnUpdate.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/di/OnLoadOnUpdate.d.ts new file mode 100644 index 0000000..8bd3dc3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/di/OnLoadOnUpdate.d.ts @@ -0,0 +1,7 @@ +import { OnLoad } from "./OnLoad"; +import { OnUpdate } from "./OnUpdate"; +export declare class OnLoadOnUpdate implements OnLoad, OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/di/OnUpdate.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/di/OnUpdate.d.ts new file mode 100644 index 0000000..7fbbe09 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/di/OnUpdate.d.ts @@ -0,0 +1,4 @@ +export declare class OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/di/Router.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/di/Router.d.ts new file mode 100644 index 0000000..2fb98e0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/di/Router.d.ts @@ -0,0 +1,40 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +export declare class Router { + private handledRoutes; + getTopLevelRoute(): string; + protected getHandledRoutes(): HandledRoute[]; + private getInternalHandledRoutes; + canHandle(url: string, partialMatch?: boolean): boolean; +} +export declare class StaticRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleStatic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class DynamicRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleDynamic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class ItemEventRouterDefinition extends Router { + constructor(); + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} +export declare class SaveLoadRouter extends Router { + constructor(); + handleLoad(profile: IAkiProfile): IAkiProfile; +} +export declare class HandledRoute { + route: string; + dynamic: boolean; + constructor(route: string, dynamic: boolean); +} +export declare class RouteAction { + url: string; + action: (url: string, info: any, sessionID: string, output: string) => any; + constructor(url: string, action: (url: string, info: any, sessionID: string, output: string) => any); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/di/Serializer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/di/Serializer.d.ts new file mode 100644 index 0000000..70aa7c5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/di/Serializer.d.ts @@ -0,0 +1,5 @@ +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class Serializer { + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(something: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotGenerator.d.ts new file mode 100644 index 0000000..88a8014 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { Health as PmcHealth } from "../models/eft/common/IPmcData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { Health, Inventory, Skills } 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 { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotInventoryGenerator } from "./BotInventoryGenerator"; +declare namespace BotGenerator { + interface IRandomisedBotLevelResult { + level: number; + exp: number; + } +} +export declare class BotGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected botInventoryGenerator: BotInventoryGenerator; + protected botHelper: BotHelper; + protected gameEventHelper: GameEventHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + protected generateBot(bot: IBotBase, role: string, isPmc: boolean): IBotBase; + protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** Converts health object to the required format */ + protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; + protected generateSkills(skillsObj: Skills): Skills; + protected getPmcRole(pmcSide: string): string; + protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + protected generateId(bot: IBotBase): IBotBase; + protected generateInventoryID(profile: IBotBase): IBotBase; + protected getPMCDifficulty(requestedDifficulty: string): string; + protected generateDogtag(bot: IBotBase): IBotBase; +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotInventoryGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotInventoryGenerator.d.ts new file mode 100644 index 0000000..783d0c5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotInventoryGenerator.d.ts @@ -0,0 +1,24 @@ +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +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"; +export declare class BotInventoryGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected botWeaponGenerator: BotWeaponGenerator; + 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(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; + protected generateInventoryBase(): PmcInventory; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotLootGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotLootGenerator.d.ts new file mode 100644 index 0000000..1d91836 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotLootGenerator.d.ts @@ -0,0 +1,29 @@ +import { PMCLootGenerator } from "../generators/PMCLootGenerator"; +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { ItemMinMax, Items } from "../models/eft/common/tables/IBotType"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotLootGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected pmcLootGenerator: PMCLootGenerator; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, pmcLootGenerator: PMCLootGenerator, configServer: ConfigServer); + generateLoot(lootPool: Items, itemCounts: ItemMinMax, isPmc: boolean, inventory: PmcInventory): void; + protected getRandomisedCount(min: number, max: number, nValue: number): number; + protected addLootFromPool(pool: ITemplateItem[], equipmentSlots: string[], count: number, inventory: PmcInventory, totalValueLimit?: number, useLimits?: boolean): void; + /** Compares two item templates by their price to spawn chance ratio */ + protected compareByValue(a: ITemplateItem, b: ITemplateItem): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotWeaponGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotWeaponGenerator.d.ts new file mode 100644 index 0000000..13fe7df --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/generators/BotWeaponGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { MinMax, Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotWeaponGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected weightedRandomHelper: WeightedRandomHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected randomUtil: RandomUtil; + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil); + generateWeapon(equipmentSlot: string, weaponPool: Record, modPool: Mods, modChances: ModsChances, magCounts: MinMax, botRole: string, isPmc: boolean, inventory: PmcInventory): void; + /** Checks if all required slots are occupied on a weapon and all it's mods */ + protected isWeaponValid(itemList: Item[]): boolean; + /** + * Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets. + * Additionally, adds extra bullets to SecuredContainer + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @param {*} magCounts + * @param {*} ammoTpl + * @returns + */ + protected generateExtraMagazines(weaponMods: Item[], weaponTemplate: ITemplateItem, magCounts: MinMax, ammoTpl: string, inventory: PmcInventory): void; + protected addBullets(ammoTpl: string, bulletCount: number, inventory: PmcInventory): void; + /** + * Finds and returns tpl of ammo that should be used, while making sure it's compatible + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @returns + */ + protected getCompatibleAmmo(weaponMods: Item[], weaponTemplate: ITemplateItem): string; + /** Fill existing magazines to full, while replacing their contents with specified ammo */ + protected fillExistingMagazines(weaponMods: Item[], magazine: Item, ammoTpl: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/generators/LocationGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/generators/LocationGenerator.d.ts new file mode 100644 index 0000000..bd368b5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/generators/LocationGenerator.d.ts @@ -0,0 +1,46 @@ +import { ContainerHelper } from "../helpers/ContainerHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { ILooseLoot, SpawnpointTemplate } from "../models/eft/common/ILooseLoot"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "../models/eft/common/tables/ILootBase"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILocationConfig } from "../models/spt/config/ILocationConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { RandomUtil } from "../utils/RandomUtil"; +export interface IContainerItem { + items: Item[]; + width: number; + height: number; +} +export declare class LocationGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected objectId: ObjectId; + protected randomUtil: RandomUtil; + protected ragfairServerHelper: RagfairServerHelper; + protected itemHelper: ItemHelper; + protected mathUtil: MathUtil; + protected gameEventHelper: GameEventHelper; + protected containerHelper: ContainerHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected locationConfig: ILocationConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, objectId: ObjectId, randomUtil: RandomUtil, ragfairServerHelper: RagfairServerHelper, itemHelper: ItemHelper, mathUtil: MathUtil, gameEventHelper: GameEventHelper, containerHelper: ContainerHelper, presetHelper: PresetHelper, configServer: ConfigServer); + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + protected getLooseLootMultiplerForLocation(location: string): number; + protected getStaticLootMultiplerForLocation(location: string): number; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; + protected createItem(tpl: string, staticAmmoDist: Record, parentId?: string): IContainerItem; + protected getRandomCompatibleCaliberTemplateId(item: ITemplateItem): string; + protected getRandomValidCaliber(magTemplate: ITemplateItem): string; + protected drawAmmoTpl(caliber: string, staticAmmoDist: Record): string; + protected createRandomMagCartridges(magTemplate: ITemplateItem, parentId: string, staticAmmoDist: Record, caliber?: string): Item; + protected createCartidges(parentId: string, ammoTpl: string, stackCount: number): Item; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/generators/PMCLootGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/generators/PMCLootGenerator.d.ts new file mode 100644 index 0000000..64e6f7f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/generators/PMCLootGenerator.d.ts @@ -0,0 +1,15 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +export declare class PMCLootGenerator { + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected pocketLootPool: string[]; + protected backpackLootPool: string[]; + protected botConfig: IBotConfig; + constructor(itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/generators/RagfairAssortGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/generators/RagfairAssortGenerator.d.ts new file mode 100644 index 0000000..cbdd7f2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/generators/RagfairAssortGenerator.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairAssortGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected generatedAssortItems: Item[]; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + /** + * Get an array of unique items that can be sold on the flea + * @returns array of unique items + */ + getAssortItems(): Item[]; + protected assortsAreGenerated(): boolean; + /** + * Generate an array of items the flea can sell + * @returns array of unique items + */ + protected generateRagfairAssortItems(): Item[]; + protected createRagfairAssortItem(tplId: string, id?: string): Item; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/generators/RagfairOfferGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/generators/RagfairOfferGenerator.d.ts new file mode 100644 index 0000000..de53ea9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/generators/RagfairOfferGenerator.d.ts @@ -0,0 +1,60 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { RagfairAssortGenerator } from "./RagfairAssortGenerator"; +export declare class RagfairOfferGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected saveServer: SaveServer; + protected presetHelper: PresetHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairPriceService: RagfairPriceService; + protected fenceService: FenceService; + protected itemHelper: ItemHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer); + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; + protected getTraderId(userID: string): string; + protected getRating(userID: string): number; + protected getRatingGrowing(userID: string): boolean; + protected getOfferEndTime(userID: string, time: number): number; + /** + * Create multiple offers for items by using a unique list of items we've generated previously + * @param expiredOffers + */ + generateDynamicOffers(expiredOffers?: Item[]): void; + generateTraderOffers(traderID: string): void; + protected getItemCondition(userID: string, items: Item[], itemDetails: ITemplateItem): Item[]; + protected addMissingCondition(item: Item): Item; + protected getOfferRequirements(items: Item[]): { + count: number; + _tpl: string; + }[]; + /** + * Create a flea offer and store it in the Ragfair server offers array + */ + createFleaOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/generators/WeatherGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/generators/WeatherGenerator.d.ts new file mode 100644 index 0000000..23aa169 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/generators/WeatherGenerator.d.ts @@ -0,0 +1,20 @@ +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class WeatherGenerator { + protected weightedRandomHelper: WeightedRandomHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateTime(data: IWeatherData): IWeatherData; + generateWeather(data: IWeatherData): IWeatherData; + protected getWeightedFog(): string; + protected getWeightedRain(): number; + protected getRandomFloat(node: string): number; + protected getRandomInt(node: string): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/AssortHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/AssortHelper.d.ts new file mode 100644 index 0000000..15586b9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/AssortHelper.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ItemHelper } from "./ItemHelper"; +import { QuestHelper } from "./QuestHelper"; +export declare class AssortHelper { + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + constructor(logger: ILogger, itemHelper: ItemHelper, databaseServer: DatabaseServer, questHelper: QuestHelper); + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort assort items from a trader + * @returns assort items minus locked quest assorts + */ + stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort traders assorts + * @returns traders assorts minus locked loyality assorts + */ + stripLockedLoyaltyAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove an item from an assort + * @param assort assort to modify + * @param itemID item id to remove from asort + * @returns Modified assort + */ + removeItemFromAssort(assort: ITraderAssort, itemID: string): ITraderAssort; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/BotGeneratorHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/BotGeneratorHelper.d.ts new file mode 100644 index 0000000..c382fc9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/BotGeneratorHelper.d.ts @@ -0,0 +1,95 @@ +import { DurabilityLimitsHelper } from "../helpers/DurabilityLimitsHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item, Repairable, Upd } from "../models/eft/common/tables/IItem"; +import { Grid, ITemplateItem, Slot } from "../models/eft/common/tables/ITemplateItem"; +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { InventoryHelper } from "./InventoryHelper"; +import { ItemHelper } from "./ItemHelper"; +export declare class BotGeneratorHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected durabilityLimitsHelper: DurabilityLimitsHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected containerHelper: ContainerHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, configServer: ConfigServer); + generateModsForItem(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, isPmc?: boolean): Item[]; + /** + * With the shotgun revolver (60db29ce99594040e04c4a27) 12.12 introduced CylinderMagazines. + * Those magazines (e.g. 60dc519adf4c47305f6d410d) have a "Cartridges" entry with a _max_count=0. + * Ammo is not put into the magazine directly but assigned to the magazine's slots: The "camora_xxx" slots. + * This function is a helper called by generateModsForItem for mods with parent type "CylinderMagazine" + * + * @param {object} items The items where the CylinderMagazine's camora are appended to + * @param {object} modPool modPool which should include available cartrigdes + * @param {string} parentId The CylinderMagazine's UID + * @param {object} parentTemplate The CylinderMagazine's template + */ + protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void; + generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): { + upd?: Upd; + }; + /** + * Create a repairable object for a weapon that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + /** + * Create a repairable object for an armor that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string; + /** + * Sort by spawn chance, highest to lowest, higher is more common + * @param unsortedModArray String array to sort + * @returns Sorted string array + */ + protected sortModArray(unsortedModArray: string[]): string[]; + /** + * Can an item be added to an item without issue + * @param items + * @param tplToCheck + * @param equipmentSlot + * @returns true if possible + */ + isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean; + /** + * Adds an item with all its childern into specified equipmentSlots, wherever it fits. + * @param equipmentSlots + * @param parentId + * @param parentTpl + * @param itemWithChildren + * @param inventory + * @returns a `boolean` indicating item was added + */ + addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: PmcInventory): boolean; + protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean; +} +export declare class ExhaustableArray { + private itemPool; + private randomUtil; + private jsonUtil; + private pool; + constructor(itemPool: T[], randomUtil: RandomUtil, jsonUtil: JsonUtil); + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/BotHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/BotHelper.d.ts new file mode 100644 index 0000000..0cb1227 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/BotHelper.d.ts @@ -0,0 +1,44 @@ +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + getBotDifficultySettings(type: string, difficulty: string): Difficulty; + getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Randomise the chance the PMC will attack their own side + * @param difficultySettings pmc difficulty settings + */ + randomisePmcHostility(difficultySettings: Difficulty): void; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + /** + * Add a bot to the FRIENDLY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typeToAdd bot type to add to friendly list + */ + addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; + /** + * Add a bot to the ENEMY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to enemy list + */ + addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Add a bot to the REVENGE_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to revenge list + */ + addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ContainerHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ContainerHelper.d.ts new file mode 100644 index 0000000..3c2ee93 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ContainerHelper.d.ts @@ -0,0 +1,12 @@ +export declare class FindSlotResult { + success: boolean; + x: any; + y: any; + rotation: boolean; + constructor(success?: boolean, x?: any, y?: any, rotation?: boolean); +} +export declare class ContainerHelper { + protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean; + findSlotForItem(container2D: number[][], itemWidth: number, itemHeight: number): FindSlotResult; + fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): any; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/DialogueHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/DialogueHelper.d.ts new file mode 100644 index 0000000..9776c6a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/DialogueHelper.d.ts @@ -0,0 +1,21 @@ +import { Dialogue, MessageContent, MessagePreview } from "../models/eft/profile/IAkiProfile"; +import { MessageType } from "../models/enums/MessageType"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { ItemHelper } from "./ItemHelper"; +import { NotificationSendHelper } from "./NotificationSendHelper"; +import { NotifierHelper } from "./NotifierHelper"; +export declare class DialogueHelper { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected notificationSendHelper: NotificationSendHelper; + protected itemHelper: ItemHelper; + constructor(hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, notificationSendHelper: NotificationSendHelper, itemHelper: ItemHelper); + createMessageContext(templateId: string, messageType: MessageType, maxStoreTime: number): MessageContent; + addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards?: any[]): void; + getMessagePreview(dialogue: Dialogue): MessagePreview; + getMessageItemContents(messageID: string, sessionID: string): any[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/DurabilityLimitsHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/DurabilityLimitsHelper.d.ts new file mode 100644 index 0000000..07a5db1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/DurabilityLimitsHelper.d.ts @@ -0,0 +1,26 @@ +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotHelper } from "./BotHelper"; +export declare class DurabilityLimitsHelper { + protected randomUtil: RandomUtil; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(randomUtil: RandomUtil, botHelper: BotHelper, configServer: ConfigServer); + getRandomisedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + getRandomisedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + protected generateMaxWeaponDurability(botRole: string): number; + protected generateMaxPmcArmorDurability(itemMaxDurability: number): number; + protected getLowestMaxWeaponFromConfig(botRole: string): number; + protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number; + protected generateWeaponDurability(botRole: string, maxDurability: number): number; + protected generateArmorDurability(botRole: string, maxDurability: number): number; + protected getMinWeaponDeltaFromConfig(botRole: string): number; + protected getMaxWeaponDeltaFromConfig(botRole: string): number; + protected getMinArmorDeltaFromConfig(botRole: string): number; + protected getMaxArmorDeltaFromConfig(botRole: string): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ExtendedProfileHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ExtendedProfileHelper.d.ts new file mode 100644 index 0000000..d8b754d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ExtendedProfileHelper.d.ts @@ -0,0 +1,22 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { IPmcData, Skills, Stats } from "../models/eft/common/IPmcData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class ExtendedProfileHelper extends ProfileHelper { + protected botGenerator: BotGenerator; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService, botGenerator: BotGenerator); + generatePlayerScav(sessionID: string): IPmcData; + protected getScavSkills(sessionID: string): Skills; + protected removeSecureContainer(profile: IPmcData): IPmcData; + protected getDefaultScavSkills(): Skills; + protected getScavStats(sessionID: string): Stats; + protected getScavLevel(sessionID: string): number; + protected getScavExperience(sessionID: string): number; + protected setScavCooldownTimer(profile: IPmcData, pmcData: IPmcData): IPmcData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/GameEventHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/GameEventHelper.d.ts new file mode 100644 index 0000000..b2d6377 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/GameEventHelper.d.ts @@ -0,0 +1,9 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class GameEventHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + get EVENT(): Record; + get christmasEventItems(): string[]; + itemIsChristmasRelated(itemId: string): boolean; + christmasEventEnabled(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HandbookHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HandbookHelper.d.ts new file mode 100644 index 0000000..b47d466 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HandbookHelper.d.ts @@ -0,0 +1,33 @@ +declare class LookupItem { + byId: Record; + byParent: Record; + constructor(); +} +export declare class LookupCollection { + items: LookupItem; + categories: LookupItem; + constructor(); +} +export declare class HandbookHelper { + protected lookup: LookupCollection; + hydrateLookup(lookup: LookupCollection): void; + getTemplatePrice(x: string): number; + templatesWithParent(x: string): string[]; + isCategory(x: string): boolean; + childrenCategories(x: string): string[]; + /** + * Gets Currency to Ruble conversion Value + * @param {number} value + * @param {string} currencyFrom + * @returns number + */ + inRUB(value: number, currencyFrom: string): number; + /** + * Gets Ruble to Currency conversion Value + * @param {number} value + * @param {string} currencyTo + * @returns number + */ + fromRUB(value: number, currencyTo: string): number; +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HealthHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HealthHelper.d.ts new file mode 100644 index 0000000..518c23f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HealthHelper.d.ts @@ -0,0 +1,27 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHealthConfig } from "../models/spt/config/IHealthConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HealthHelper { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected configServer: ConfigServer; + protected healthConfig: IHealthConfig; + constructor(jsonUtil: JsonUtil, logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, configServer: ConfigServer); + resetVitality(sessionID: string): IAkiProfile; + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + protected saveHealth(pmcData: IPmcData, sessionID: string): void; + protected saveEffects(pmcData: IPmcData, sessionID: string): void; + protected addEffect(pmcData: IPmcData, sessionID: string, effect: { + bodyPart: string; + effectType: string; + }): void; + protected isEmpty(map: any): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HideoutHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HideoutHelper.d.ts new file mode 100644 index 0000000..76b337f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HideoutHelper.d.ts @@ -0,0 +1,68 @@ +import { Common, HideoutArea, IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { StageBonus } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class HideoutHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected inventoryHelper: InventoryHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + static BITCOIN_FARM: string; + protected WATER_COLLECTOR: string; + protected BITCOIN: string; + protected EXPEDITIONARY_FUEL_TANK: string; + static NAME_BACKENDCOUNTERS_CRAFTING: string; + static SKILL_NAME_HIDEOUT: string; + static HOUR_FOR_SKILL_CRAFTING: number; + static SKILL_NAME_CRAFITING: string; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer); + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + /** + * This convinience function intialies new Production Object + * with all the constants. + */ + initProduction(recipeId: string, productionTime: number): Production; + isProductionType(productive: Productive): productive is Production; + applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void; + protected applySkillXPBoost(pmcData: IPmcData, bonus: StageBonus): void; + updatePlayerHideout(sessionID: string): void; + protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void; + protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean; + protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateWaterFilters(waterFilterArea: HideoutArea, pwProd: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea; + protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd; + protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production; + protected getBTCSlots(pmcData: IPmcData): number; + protected getManagementSkillsSlots(): number; + protected hasManagementSkillSlots(pmcData: IPmcData): boolean; + protected getHideoutManagementSkill(pmcData: IPmcData): Common; + protected getHideoutManagementConsumptionBonus(pmcData: IPmcData): number; + isProduction(productive: Productive): productive is Production; + getBTC(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + getRandomAmountRewardForScavCase(itemToCalculate: ITemplateItem): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HttpServerHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HttpServerHelper.d.ts new file mode 100644 index 0000000..c6e5296 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/HttpServerHelper.d.ts @@ -0,0 +1,23 @@ +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HttpServerHelper { + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + protected mime: { + css: string; + bin: string; + html: string; + jpg: string; + js: string; + json: string; + png: string; + svg: string; + txt: string; + }; + constructor(configServer: ConfigServer); + getMimeText(key: string): string; + buildUrl(): string; + getBackendUrl(): string; + getWebsocketUrl(): string; + sendTextJson(resp: any, output: any): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/InRaidHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/InRaidHelper.d.ts new file mode 100644 index 0000000..05b6fdf --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/InRaidHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Victim } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { PaymentHelper } from "./PaymentHelper"; +export declare class InRaidHelper { + protected logger: ILogger; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + protected removePlayer(sessionID: string): void; + protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void; + addUpdToMoneyFromRaid(items: Item[]): void; + /** + * Add positive karma for PMC kills + * @param {*} existingFenceStanding + * @param {*} victims + */ + calculateFenceStandingChangeFromKills(existingFenceStanding: number, victims: Victim[]): void; + setBaseStats(profileData: IPmcData, offraidData: ISaveProgressRequestData, sessionID: string): IPmcData; + markFoundItems(pmcData: IPmcData, profile: IPmcData, isPlayerScav: boolean): IPmcData; + removeFoundInRaidStatusFromItems(profile: IPmcData): IPmcData; + setInventory(sessionID: string, pmcData: IPmcData, profile: IPmcData): IPmcData; + deleteInventory(pmcData: IPmcData, sessionID: string): IPmcData; + getPlayerGear(items: Item[]): Item[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/InventoryHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/InventoryHelper.d.ts new file mode 100644 index 0000000..dc7cbca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/InventoryHelper.d.ts @@ -0,0 +1,85 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInventoryConfig } from "../models/spt/config/IInventoryConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class InventoryHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected httpResponse: HttpResponseUtil; + protected fenceService: FenceService; + protected databaseServer: DatabaseServer; + protected paymentHelper: PaymentHelper; + protected traderAssortHelper: TraderAssortHelper; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected containerHelper: ContainerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected inventoryConfig: IInventoryConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, httpResponse: HttpResponseUtil, fenceService: FenceService, databaseServer: DatabaseServer, paymentHelper: PaymentHelper, traderAssortHelper: TraderAssortHelper, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, containerHelper: ContainerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + getItemSize(itemTpl: string, itemID: string, inventoryItem: Item[]): Record; + protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): Record; + protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash; + getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]; + /** + * Based on the item action, determine whose inventories we should be looking at for from and to. + */ + getOwnerInventoryItems(body: IInventoryMoveRequestData | IInventorySplitRequestData | IInventoryMergeRequestData, sessionID: string): OwnerInventoryItems; + /** + * Made a 2d array table with 0 - free slot and 1 - used slot + * @param {Object} pmcData + * @param {string} sessionID + * @returns Array + */ + protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][]; + protected getStashType(sessionID: string): string; + protected getPlayerStashSize(sessionID: string): Record; + /** + * Internal helper function to transfer an item from one profile to another. + * fromProfileData: Profile of the source. + * toProfileData: Profile of the destination. + * body: Move request + */ + moveItemToProfile(fromItems: Item[], toItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to move item within the same profile_f. + */ + moveItemInternal(inventoryItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to handle cartridges in inventory if any of them exist. + */ + protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void; +} +declare namespace InventoryHelper { + interface InventoryItemHash { + byItemId: Record; + byParentId: Record; + } +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ItemHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ItemHelper.d.ts new file mode 100644 index 0000000..f124cb1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ItemHelper.d.ts @@ -0,0 +1,147 @@ +import { InsuredItem, IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +declare class ItemHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer); + /** + * Checks if a 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 + */ + isValidItem(tpl: string, invalidBaseTypes?: string[]): boolean; + /** + * Checks if a id is a valid item. Valid meaning that it's an item that may be a reward + * or content of bot loot. Items that are tested as valid may be in a player backpack or stash. + * @param {*} tpl template id of item to check + * @returns boolean: true if item is valid reward + */ + isValidRewardItem(tpl: string): boolean; + /** + * Picks rewardable items from items.json. This means they need to fit into the inventory and they shouldn't be keys (debatable) + * @returns a list of rewardable items [[_tpl, itemTemplate],...] + */ + getRewardableItems(): [string, ITemplateItem][]; + /** + * Check if the tpl / template Id provided is a descendent of the baseclass + * + * @param {string} tpl the item template id to check + * @param {string} baseclassTpl the baseclass to check for + * @return {boolean} is the tpl a descendent? + */ + isOfBaseclass(tpl: string, baseclassTpl: string): any; + /** + * Returns the item price based on the handbook or as a fallback from the prices.json if the item is not + * found in the handbook. If the price can't be found at all return 0 + * + * @param {string} tpl the item template to check + * @returns {integer} The price of the item or 0 if not found + */ + getItemPrice(tpl: string): number; + fixItemStackCount(item: Item): Item; + /** + * AmmoBoxes contain StackSlots which need to be filled for the AmmoBox to have content. + * Here's what a filled AmmoBox looks like: + * { + * "_id": "b1bbe982daa00ac841d4ae4d", + * "_tpl": "57372c89245977685d4159b1", + * "parentId": "5fe49a0e2694b0755a504876", + * "slotId": "hideout", + * "location": { + * "x": 3, + * "y": 4, + * "r": 0 + * }, + * "upd": { + * "StackObjectsCount": 1 + * } + * }, + * { + * "_id": "b997b4117199033afd274a06", + * "_tpl": "56dff061d2720bb5668b4567", + * "parentId": "b1bbe982daa00ac841d4ae4d", + * "slotId": "cartridges", + * "location": 0, + * "upd": { + * "StackObjectsCount": 30 + * } + * } + * Given the AmmoBox Item (first object) this function generates the StackSlot (second object) and returns it. + * StackSlots are only used for AmmoBoxes which only have one element in StackSlots. However, it seems to be generic + * to possibly also have more than one StackSlot. As good as possible, without seeing items having more than one + * StackSlot, this function takes account of this and creates and returns an array of StackSlotItems + * + * @param {object} item The item template of the AmmoBox as given in items.json + * @param {string} parentId The id of the AmmoBox instance these StackSlotItems should be children of + * @returns {array} The array of StackSlotItems + */ + generateStackSlotItems(item: ITemplateItem, parentId: string): StackSlot[]; + getItem(tpl: string): [boolean, ITemplateItem]; + getItemQualityModifier(item: Item): number; + findAndReturnChildrenByItems(items: Item[], itemID: string): string[]; + /** + * A variant of findAndReturnChildren where the output is list of item objects instead of their ids. + */ + findAndReturnChildrenAsItems(items: Item[], baseItemId: string): Item[]; + /** + * find children of the item in a given assort (weapons parts for example, need recursive loop function) + */ + findAndReturnChildrenByAssort(itemIdToFind: string, assort: Item[]): Item[]; + hasBuyRestrictions(itemToCheck: Item): boolean; + /** + * Is Dogtag + * Checks if an item is a dogtag. Used under profile_f.js to modify preparePrice based + * on the level of the dogtag + */ + isDogtag(tpl: string): boolean; + isNotSellable(tpl: string): boolean; + getChildId(item: Item): string; + isItemTplStackable(tpl: string): boolean; + /** + * split item stack if it exceeds StackMaxSize + */ + splitStack(item: Item): Item[]; + /** + * Find Barter items in the inventory + * @param {string} by + * @param {Object} pmcData + * @param {string} barter_itemID + * @returns Array + */ + findBarterItems(by: string, pmcData: IPmcData, barter_itemID: string): any[]; + /** + * @param {Object} pmcData + * @param {Array} items + * @param {Object} fastPanel + * @returns Array + */ + replaceIDs(pmcData: IPmcData, items: Item[], insuredItems?: InsuredItem[], fastPanel?: any): any[]; + /** + * Recursivly loop down through an items hierarchy to see if any of the ids match the supplied list, return true if any do + * @param {string} tpl + * @param {Array} tplsToCheck + * @returns boolean + */ + doesItemOrParentsIdMatch(tpl: string, tplsToCheck: string[]): boolean; + /** + * Return true if item is a quest item + * @param {string} tpl + * @returns boolean + */ + isQuestItem(tpl: string): boolean; + getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize; +} +declare namespace ItemHelper { + interface ItemSize { + width: number; + height: number; + } +} +export { ItemHelper }; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/NotificationSendHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/NotificationSendHelper.d.ts new file mode 100644 index 0000000..34e62d9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/NotificationSendHelper.d.ts @@ -0,0 +1,12 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { NotificationService } from "../services/NotificationService"; +export declare class NotificationSendHelper { + protected httpServer: IHttpServer; + protected notificationService: NotificationService; + constructor(httpServer: IHttpServer, notificationService: NotificationService); + /** + * Send notification message to the appropiate channel + */ + sendMessage(sessionID: string, notificationMessage: INotification): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/NotifierHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/NotifierHelper.d.ts new file mode 100644 index 0000000..738b69a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/NotifierHelper.d.ts @@ -0,0 +1,17 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { Message, MessageContentRagfair } from "../models/eft/profile/IAkiProfile"; +import { HttpServerHelper } from "./HttpServerHelper"; +export declare class NotifierHelper { + protected httpServerHelper: HttpServerHelper; + /** + * The default notification sent when waiting times out. + */ + protected defaultNotification: INotification; + constructor(httpServerHelper: HttpServerHelper); + getDefaultNotification(): INotification; + /** Creates a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside */ + createRagfairOfferSoldNotification(dialogueMessage: Message, ragfairData: MessageContentRagfair): INotification; + /** Creates a new notification with the specified dialogueMessage object. */ + createNewMessageNotification(dialogueMessage: Message): INotification; + getWebSocketServer(sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/PaymentHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/PaymentHelper.d.ts new file mode 100644 index 0000000..2d068a4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/PaymentHelper.d.ts @@ -0,0 +1,14 @@ +export declare class PaymentHelper { + /** + * Check whether tpl is Money + * @param {string} tpl + * @returns void + */ + isMoneyTpl(tpl: string): boolean; + /** + * Gets currency TPL from TAG + * @param {string} currency + * @returns string + */ + getCurrency(currency: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/PresetHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/PresetHelper.d.ts new file mode 100644 index 0000000..0371886 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/PresetHelper.d.ts @@ -0,0 +1,14 @@ +import { Preset } from "../models/eft/common/IGlobals"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetHelper { + protected databaseServer: DatabaseServer; + protected lookup: Record; + constructor(databaseServer: DatabaseServer); + hydratePresetStore(input: Record): void; + isPreset(id: string): boolean; + hasPreset(templateId: string): boolean; + getPreset(id: string): Preset; + getPresets(templateId: string): Preset[]; + getDefaultPreset(templateId: string): Preset; + getBaseItemTpl(presetId: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ProfileHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ProfileHelper.d.ts new file mode 100644 index 0000000..6a64291 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/ProfileHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Stats } from "../models/eft/common/IPmcData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +export declare class ProfileHelper { + protected jsonUtil: JsonUtil; + protected watermark: Watermark; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected fenceService: FenceService; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService); + resetProfileQuestCondition(sessionID: string, conditionId: string): void; + getCompleteProfile(sessionID: string): IPmcData[]; + isNicknameTaken(info: IValidateNicknameRequestData, sessionID: string): boolean; + getProfileByPmcId(pmcId: string): IPmcData; + getExperience(level: number): number; + getMaxLevel(): number; + getDefaultAkiDataObject(): any; + getFullProfile(sessionID: string): IAkiProfile; + getPmcProfile(sessionID: string): IPmcData; + getScavProfile(sessionID: string): IPmcData; + getDefaultCounters(): Stats; + protected isWiped(sessionID: string): boolean; + protected getServerVersion(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/QuestConditionHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/QuestConditionHelper.d.ts new file mode 100644 index 0000000..90ee560 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/QuestConditionHelper.d.ts @@ -0,0 +1,7 @@ +import { AvailableForConditions } from "../models/eft/common/tables/IQuest"; +export declare class QuestConditionHelper { + getQuestConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLevelConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLoyaltyConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/QuestHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/QuestHelper.d.ts new file mode 100644 index 0000000..f32c85c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/QuestHelper.d.ts @@ -0,0 +1,69 @@ +import { IPmcData, Quest } from "../models/eft/common/IPmcData"; +import { AvailableForConditions, AvailableForProps, IQuest, Reward } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { TraderHelper } from "./TraderHelper"; +export declare class QuestHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, traderHelper: TraderHelper, configServer: ConfigServer); + static get STATUS(): Record; + questStatus(pmcData: IPmcData, questID: string): string; + /** + * returns true is the condition is satisfied + */ + evaluateLevel(pmcProfile: IPmcData, cond: AvailableForConditions): boolean; + getDeltaQuests(before: IQuest[], after: IQuest[]): IQuest[]; + rewardSkillPoints(sessionID: string, pmcData: IPmcData, output: IItemEventRouterResponse, skillName: string, progress: number): void; + getQuestLocale(questId: string): any; + /** + * Debug Routine for showing some information on the + * quest list in question. + */ + dumpQuests(quests: any, label?: any): void; + loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean; + protected processReward(reward: Reward): any[]; + getQuestRewardItems(quest: IQuest, state: string): Reward[]; + addQuestToPMCData(pmcData: IPmcData, quest: Quest, newState: string, acceptedQuest: IAcceptQuestRequestData): void; + acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[]; + failedUnlocked(failedQuestId: string, sessionID: string): IQuest[]; + applyMoneyBoost(quest: IQuest, moneyBoost: number): IQuest; + changeItemStack(pmcData: IPmcData, id: string, value: number, sessionID: string, output: any): void; + /** + * Get List of All Quests as an array + */ + questValues(): IQuest[]; + protected cleanQuestList(quests: IQuest[]): IQuest[]; + cleanQuestConditions(quest: IQuest): IQuest; + failQuest(pmcData: IPmcData, body: any, sessionID: string): any; + getQuestFromDb(questId: string, pmcData: IPmcData): IQuest; + getQuestLocaleIdFromDb(messageId: string, localisation?: string): string; + applyQuestReward(pmcData: IPmcData, body: ICompleteQuestRequestData, state: string, sessionID: string): any[]; + getFindItemIdForQuestItem(itemTpl: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairHelper.d.ts new file mode 100644 index 0000000..c8bc5ba --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairHelper.d.ts @@ -0,0 +1,44 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairLinkedItemService } from "../services/RagfairLinkedItemService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +import { UtilityHelper } from "./UtilityHelper"; +export declare class RagfairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected traderAssortHelper: TraderAssortHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected ragfairLinkedItemService: RagfairLinkedItemService; + protected utilityHelper: UtilityHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, traderAssortHelper: TraderAssortHelper, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, ragfairLinkedItemService: RagfairLinkedItemService, utilityHelper: UtilityHelper, configServer: ConfigServer); + /** + * Gets currency TAG from TPL + * @param {string} currency + * @returns string + */ + getCurrencyTag(currency: string): string; + filterCategories(sessionID: string, info: ISearchRequestData): string[]; + getDisplayableAssorts(sessionID: string): Record; + protected getCategoryList(handbookId: string): string[]; + countCategories(result: IGetOffersResult): void; + /** + * Merges Root Items + * Ragfair allows abnormally large stacks. + */ + mergeStackable(items: Item[]): Item[]; + getCurrencySymbol(currencyTpl: string): string; + formatCurrency(moneyAmount: number): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairOfferHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairOfferHelper.d.ts new file mode 100644 index 0000000..129bc1c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairOfferHelper.d.ts @@ -0,0 +1,52 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { PresetHelper } from "./PresetHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairHelper } from "./RagfairHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { RagfairSortHelper } from "./RagfairSortHelper"; +export declare class RagfairOfferHelper { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected paymentHelper: PaymentHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected configServer: ConfigServer; + protected static TPL_GOODS_SOLD: string; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, configServer: ConfigServer); + getValidOffers(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + getOffersForBuild(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + processOffers(sessionID: string): boolean; + protected getProfileOffers(sessionID: string): IRagfairOffer[]; + protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; + isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairSellHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairSellHelper.d.ts new file mode 100644 index 0000000..6ec004a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairSellHelper.d.ts @@ -0,0 +1,16 @@ +import { SellResult } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairSellHelper { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateSellChance(baseChance: number, offerPrice: number, requirementsPriceInRub: number): number; + rollForSale(sellChance: number, count: number): SellResult[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairServerHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairServerHelper.d.ts new file mode 100644 index 0000000..2cb3ea5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairServerHelper.d.ts @@ -0,0 +1,46 @@ +import { MemberCategory } from "../models/enums/MemberCategory"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class RagfairServerHelper { + protected randomUtil: RandomUtil; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected jsonUtil: JsonUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + protected static TPL_GOODS_RETURNED: string; + constructor(randomUtil: RandomUtil, hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, profileHelper: ProfileHelper, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, jsonUtil: JsonUtil, configServer: ConfigServer); + /** + * Is item valid / on blacklist / quest item + * @param itemDetails + * @returns boolean + */ + isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean; + protected isItemBlacklisted(itemTemplateId: string): boolean; + isTrader(userID: string): boolean; + isPlayer(userID: string): boolean; + returnItems(sessionID: string, items: any[]): void; + calculateDynamicStackCount(tplId: string, isWeaponPreset: boolean): number; + getDynamicOfferCurrency(): string; + getMemberType(userID: string): MemberCategory; + getNickname(userID: string): string; + getPresetItems(item: any): Item[]; + getPresetItemsByTpl(item: Item): Item[]; + reparentPresets(item: Item, preset: Item[]): Item[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairSortHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairSortHelper.d.ts new file mode 100644 index 0000000..e983569 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairSortHelper.d.ts @@ -0,0 +1,12 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class RagfairSortHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + sortOffers(offers: IRagfairOffer[], type: number, direction?: number): IRagfairOffer[]; + protected sortOffersByID(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByExpiry(a: IRagfairOffer, b: IRagfairOffer): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairTaxHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairTaxHelper.d.ts new file mode 100644 index 0000000..820facb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RagfairTaxHelper.d.ts @@ -0,0 +1,16 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { ItemHelper } from "./ItemHelper"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairTaxHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected ragfairPriceService: RagfairPriceService; + protected itemHelper: ItemHelper; + constructor(logger: ILogger, databaseServer: DatabaseServer, ragfairPriceService: RagfairPriceService, itemHelper: ItemHelper); + calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number; + protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem?: boolean): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RepairHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RepairHelper.d.ts new file mode 100644 index 0000000..650c1aa --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/RepairHelper.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { Props } from "../models/eft/common/tables/ITemplateItem"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RepairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, configServer: ConfigServer); + updateItemDurability(itemToRepairId: string, amountToRepair: number, pmcData: IPmcData, useRepairKit?: boolean): Item; + protected getRandomisedArmorRepairDegredationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number): number; + protected getRandomisedWeaponRepairDegredationValue(itemProps: Props, isRepairKit: boolean, armorMax: number): number; + isWeaponTemplate(tpl: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/SecureContainerHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/SecureContainerHelper.d.ts new file mode 100644 index 0000000..9e2bc32 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/SecureContainerHelper.d.ts @@ -0,0 +1,13 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ItemHelper } from "./ItemHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class SecureContainerHelper { + protected itemHelper: ItemHelper; + constructor(itemHelper: ItemHelper); + getSecureContainerItems(items: Item[]): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/TradeHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/TradeHelper.d.ts new file mode 100644 index 0000000..975062b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/TradeHelper.d.ts @@ -0,0 +1,44 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item, Upd } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { RagfairServer } from "../servers/RagfairServer"; +import { FenceService } from "../services/FenceService"; +import { PaymentService } from "../services/PaymentService"; +export declare class TradeHelper { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected fenceService: FenceService; + protected inventoryHelper: InventoryHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer); + /** + * Buy item from flea or trader + * @param pmcData + * @param buyRequestData data from client + * @param sessionID + * @param foundInRaid + * @param upd optional item details used when buying from flea + * @returns + */ + buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse; + /** + * Sell item to trader + * @param pmcData + * @param body + * @param sessionID + * @returns + */ + sellItem(pmcData: IPmcData, body: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse; + protected incrementAssortBuyCount(assortBeingPurchased: Item, itemsPurchasedCount: number): void; + protected checkPurchaseIsWithinTraderItemLimit(assortBeingPurchased: Item, assortId: string, count: number): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/TraderAssortHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/TraderAssortHelper.d.ts new file mode 100644 index 0000000..4f41ac2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/TraderAssortHelper.d.ts @@ -0,0 +1,42 @@ +import { RagfairAssortGenerator } from "../generators/RagfairAssortGenerator"; +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { AssortHelper } from "./AssortHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderAssortHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected assortHelper: AssortHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected traderAssortService: TraderAssortService; + protected fenceService: FenceService; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, profileHelper: ProfileHelper, assortHelper: AssortHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferGenerator: RagfairOfferGenerator, traderAssortService: TraderAssortService, fenceService: FenceService); + /** + * Get a traders assorts + * Can be used for returning ragfair / fence assorts + * @param sessionId session id + * @param traderId trader id + * @returns a traders assorts + */ + getAssort(sessionId: string, traderId: string): ITraderAssort; + /** + * Get an array of pristine trader items prior to any alteration by player + * @param traderId trader id + * @returns array of Items + */ + protected getPristineTraderAssorts(traderId: string): Item[]; + /** + * Returns generated ragfair offers in a trader assort format + * @returns Trader assort object + */ + protected getRagfairDataAsTraderAssort(): ITraderAssort; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/TraderHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/TraderHelper.d.ts new file mode 100644 index 0000000..ab4a371 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/TraderHelper.d.ts @@ -0,0 +1,53 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { PlayerService } from "../services/PlayerService"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemHelper: ItemHelper; + protected handbookHelper: HandbookHelper; + protected playerService: PlayerService; + protected fenceService: FenceService; + protected configServer: ConfigServer; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemHelper: ItemHelper, handbookHelper: HandbookHelper, playerService: PlayerService, fenceService: FenceService, configServer: ConfigServer); + getTrader(traderID: string, sessionID: string): ITraderBase; + getTraderAssortsById(traderId: string): ITraderAssort; + /** + * Reset a trader back to its initial state as seen by a level 1 player + * Does NOT take into account different profile levels + * @param sessionID session id + * @param traderID trader id to reset + */ + resetTrader(sessionID: string, traderID: string): void; + changeTraderDisplay(traderID: string, status: boolean, sessionID: string): void; + getPurchasesData(traderID: string, sessionID: string): Record; + /** + * Calculate traders level based on exp amount and increment level if over threshold + * @param traderID trader to process + * @param sessionID session id + */ + lvlUp(traderID: string, sessionID: string): void; + getTraderUpdateSeconds(traderId: string): number; + /** + * check if an item is allowed to be sold to a trader + * @param traderFilters array of allowed categories + * @param tplToCheck itemTpl of inventory + * @returns boolean + */ + traderFilter(traderFilters: string[], tplToCheck: string): boolean; + getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/UtilityHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/UtilityHelper.d.ts new file mode 100644 index 0000000..5d9f482 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/UtilityHelper.d.ts @@ -0,0 +1,3 @@ +export declare class UtilityHelper { + arrayIntersect(a: T[], b: T[]): T[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/helpers/WeightedRandomHelper.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/WeightedRandomHelper.d.ts new file mode 100644 index 0000000..9aa0d29 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/helpers/WeightedRandomHelper.d.ts @@ -0,0 +1,28 @@ +export declare class WeightedRandomHelper { + /** + * Gets a tplId from a weighted dictionary + * @param {tplId: weighting[]} itemArray + * @returns tplId + */ + getWeightedInventoryItem(itemArray: { + [tplId: string]: unknown; + } | ArrayLike): string; + /** + * Picks the random item based on its weight. + * The items with higher weight will be picked more often (with a higher probability). + * + * For example: + * - items = ['banana', 'orange', 'apple'] + * - weights = [0, 0.2, 0.8] + * - weightedRandom(items, weights) in 80% of cases will return 'apple', in 20% of cases will return + * 'orange' and it will never return 'banana' (because probability of picking the banana is 0%) + * + * @param {any[]} items + * @param {number[]} weights + * @returns {{item: any, index: number}} + */ + weightedRandom(items: string | any[], weights: string | any[]): { + item: any; + index: number; + }; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/ide/BleedingEdgeEntry.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/ide/BleedingEdgeEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/ide/BleedingEdgeEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/ide/Compiler.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/ide/Compiler.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/ide/Compiler.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/ide/DebugEntry.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/ide/DebugEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/ide/DebugEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/ide/ReleaseEntry.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/ide/ReleaseEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/ide/ReleaseEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/ide/TestEntry.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/ide/TestEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/ide/TestEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/loaders/BundleLoader.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/loaders/BundleLoader.d.ts new file mode 100644 index 0000000..06ad698 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/loaders/BundleLoader.d.ts @@ -0,0 +1,22 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +declare class BundleInfo { + modPath: string; + key: string; + path: string; + filepath: string; + dependencyKeys: string[]; + constructor(modpath: string, bundle: any, bundlePath: string, bundleFilepath: string); +} +export declare class BundleLoader { + protected httpServerHelper: HttpServerHelper; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected bundles: Record; + constructor(httpServerHelper: HttpServerHelper, vfs: VFS, jsonUtil: JsonUtil); + getBundles(local: boolean): BundleInfo[]; + getBundle(key: string, local: boolean): BundleInfo; + addBundles(modpath: string): void; +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/loaders/DelayedModLoader.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/loaders/DelayedModLoader.d.ts new file mode 100644 index 0000000..2a05604 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/loaders/DelayedModLoader.d.ts @@ -0,0 +1,21 @@ +import { DependencyContainer } from "tsyringe"; +import { HandbookController } from "../controllers/HandbookController"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +import { InitialModLoader } from "./InitialModLoader"; +export declare class DelayedModLoader implements IModLoader { + protected bundleLoader: BundleLoader; + protected handbookController: HandbookController; + protected vfs: VFS; + protected modCompilerService: ModCompilerService; + protected initialModLoader: InitialModLoader; + constructor(bundleLoader: BundleLoader, handbookController: HandbookController, vfs: VFS, modCompilerService: ModCompilerService, initialModLoader: InitialModLoader); + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; + load(): void; + protected executeMods(container: DependencyContainer): void; + protected addBundles(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/loaders/InitialModLoader.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/loaders/InitialModLoader.d.ts new file mode 100644 index 0000000..68e47fe --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/loaders/InitialModLoader.d.ts @@ -0,0 +1,64 @@ +import { DependencyContainer } from "tsyringe"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ModLoader } from "../models/spt/mod/IMod"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +export declare class InitialModLoader implements IModLoader { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected modCompilerService: ModCompilerService; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected static container: DependencyContainer; + protected readonly basepath = "user/mods/"; + protected imported: Record; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer); + load(container: DependencyContainer): Promise; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + /** + * Returns a list of mods with preserved load order + * @returns Array of mod names in load order + */ + getImportedModsNames(): string[]; + getModPath(mod: string): string; + protected importClass(name: string, filepath: string, container: DependencyContainer): void; + protected importMods(): Promise; + /** + * + * @param mods Get an array of broken/invalid mods by name + * @returns Mod names array + */ + protected getBrokenMods(mods: string[]): string[]; + /** + * Get packageJson data for mods + * @param mods mods to get packageJson for + * @returns dictionary + */ + protected getModsPackageData(mods: string[]): Record; + /** + * Does mod have "delayedLoad(" string in its entry class + * @param modFolderName folder name + * @param modToValidate package.json details + * @returns boolean + */ + protected isModSpt300Compatible(modFolderName: string, modToValidate: IPackageJsonData): boolean; + protected isModCombatibleWithAki(mod: IPackageJsonData): boolean; + protected executeMods(container: DependencyContainer): void; + sortModsLoadOrder(): string[]; + protected addMod(mod: string): Promise; + protected areModDependenciesFulfilled(mod: IPackageJsonData, loadedMods: Record): boolean; + protected isModCompatible(mod: IPackageJsonData, loadedMods: Record): boolean; + protected validMod(mod: string): boolean; + protected getLoadOrderRecursive(mod: string, result: Record, visited: Record): void; + protected getLoadOrder(mods: Record): Record; + getContainer(): DependencyContainer; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts new file mode 100644 index 0000000..c49cef7 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/bot/IGenerateBotsRequestData.d.ts @@ -0,0 +1,8 @@ +export interface IGenerateBotsRequestData { + conditions: Condition[]; +} +export interface Condition { + Role: string; + Limit: number; + Difficulty: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IEmptyRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IEmptyRequestData.d.ts new file mode 100644 index 0000000..284d16e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IEmptyRequestData.d.ts @@ -0,0 +1,2 @@ +export interface IEmptyRequestData { +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IGlobals.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IGlobals.d.ts new file mode 100644 index 0000000..456895c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IGlobals.d.ts @@ -0,0 +1,1176 @@ +import { Item } from "./tables/IItem"; +export interface IGlobals { + time: number; + config: Config; + bot_presets: BotPreset[]; + BotWeaponScatterings: BotWeaponScattering[]; + ItemPresets: Record; +} +export interface Config { + content: Content; + AimPunchMagnitude: number; + WeaponSkillProgressRate: number; + SkillAtrophy: boolean; + exp: Exp; + t_base_looting: number; + t_base_lockpicking: number; + armor: Armor; + SessionsToShowHotKeys: number; + MaxBotsAliveOnMap: number; + SavagePlayCooldown: number; + SavagePlayCooldownNdaFree: number; + MarksmanAccuracy: number; + SavagePlayCooldownDevelop: number; + TODSkyDate: string; + Mastering: Mastering[]; + GlobalItemPriceModifier: number; + TradingUnlimitedItems: boolean; + MaxLoyaltyLevelForAll: boolean; + GlobalLootChanceModifier: number; + TimeBeforeDeploy: number; + TimeBeforeDeployLocal: number; + LoadTimeSpeedProgress: number; + BaseLoadTime: number; + BaseUnloadTime: number; + BaseCheckTime: number; + Customization: Customization; + UncheckOnShot: boolean; + BotsEnabled: boolean; + ArmorMaterials: ArmorMaterials; + LegsOverdamage: number; + HandsOverdamage: number; + StomachOverdamage: number; + Health: Health; + rating: Rating; + tournament: Tournament; + RagFair: RagFair; + handbook: Handbook; + FractureCausedByFalling: Probability; + FractureCausedByBulletHit: Probability; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + Stamina: Stamina; + StaminaRestoration: StaminaRestoration; + StaminaDrain: StaminaDrain; + RequirementReferences: RequirementReferences; + RepairKitSettings: RepairKitSettings; + RestrictionsInRaid: RestrictionsInRaid[]; + SkillMinEffectiveness: number; + SkillFatiguePerPoint: number; + SkillFreshEffectiveness: number; + SkillFreshPoints: number; + SkillPointsBeforeFatigue: number; + SkillFatigueReset: number; + DiscardLimitsEnabled: boolean; + EventType: string[]; + WalkSpeed: xyz; + SprintSpeed: xyz; + SkillEnduranceWeightThreshold: number; + TeamSearchingTimeout: number; + Insurance: Insurance; + SkillExpPerLevel: number; + GameSearchingTimeout: number; + WallContusionAbsorption: xyz; + SkillsSettings: SkillsSettings; + AzimuthPanelShowsPlayerOrientation: boolean; + Aiming: Aiming; + Malfunction: Malfunction; + Overheat: Overheat; + FenceSettings: FenceSettings; + TestValue: number; + Inertia: Inertia; + Ballistic: Ballistic; +} +export interface Content { + ip: string; + port: number; + root: string; +} +export interface Exp { + heal: Heal; + match_end: MatchEnd; + kill: Kill; + level: Level; + loot_attempts: LootAttempt[]; + expForLockedDoorOpen: number; + expForLockedDoorBreach: number; + triggerMult: number; +} +export interface Heal { + expForHeal: number; + expForHydration: number; + expForEnergy: number; +} +export interface MatchEnd { + README: string; + survived_exp_requirement: number; + survived_seconds_requirement: number; + survived_exp_reward: number; + mia_exp_reward: number; + runner_exp_reward: number; + leftMult: number; + miaMult: number; + survivedMult: number; + runnerMult: number; + killedMult: number; +} +export interface Kill { + combo: Combo[]; + victimLevelExp: number; + headShotMult: number; + expOnDamageAllHealth: number; + longShotDistance: number; + bloodLossToLitre: number; + victimBotLevelExp: number; +} +export interface Combo { + percent: number; +} +export interface Level { + exp_table: ExpTable[]; + trade_level: number; + savage_level: number; + clan_level: number; + mastering1: number; + mastering2: number; +} +export interface ExpTable { + exp: number; +} +export interface LootAttempt { + k_exp: number; +} +export interface Armor { + class: Class[]; +} +export interface Class { + resistance: number; +} +export interface Mastering { + Name: string; + Templates: string[]; + Level2: number; + Level3: number; +} +export interface Customization { + SavageHead: SavageHead; + SavageBody: SavageBody; + SavageFeet: SavageFeet; + CustomizationVoice: CustomizationVoice[]; + BodyParts: BodyParts; +} +export interface SavageHead { + wild_head_1: WildHead; + wild_head_2: WildHead; + wild_head_3: WildHead; + Wild_Dealmaker_head: WildHead; + Wild_Killa_head: WildHead; + bear_head: WildHead; + bear_head_1: WildHead; + usec_head_1: WildHead; + Head_BOSS_Glukhar: WildHead; + Wild_Head_nonMesh: WildHead; + Head_BOSS_Sanitar: WildHead; + wild_head_drozd: WildHead; + wild_head_misha: WildHead; + head_cultist_01: WildHead; + head_cultist_02: WildHead; + head_cultist_03: WildHead; + DefaultUsecHead: WildHead; + usec_head_3: WildHead; + usec_head_4: WildHead; + usec_head_5: WildHead; +} +export interface WildHead { + head: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface SavageBody { + wild_body: WildBody; + wild_body_1: WildBody; + wild_body_2: WildBody; + wild_body_3: WildBody; + Wild_Dealmaker_body: WildBody; + wild_security_body_1: WildBody; + wild_security_body_2: WildBody; + wild_Killa_body: WildBody; + wild_pmcBot_body: WildBody; + wild_Shturman_body: WildBody; + wild_Gluhar_body: WildBody; + Tshirt_security_TshirtTatu_01: WildBody; + Tshirt_security_TshirtTatu_02: WildBody; + Top_security_Husky: WildBody; + Top_security_Gorka4: WildBody; + scav_kit_upper_meteor: WildBody; + wild_body_russia1: WildBody; + Top_BOSS_Sanitar: WildBody; + wild_body_motocross: WildBody; + top_cultist_01: WildBody; + top_cultist_02: WildBody; + wild_body_rainparka: WildBody; + wild_body_underarmour: WildBody; + top_boss_tagilla: WildBody; + DefaultUsecBody: WildBody; + usec_upper_acu: WildBody; + usec_upper_commando: WildBody; + usec_upper_aggressor: WildBody; + usec_upper_hoody: WildBody; + usec_upper_pcuironsight: WildBody; + usec_top_beltstaff: WildBody; + usec_upper_flexion: WildBody; + usec_upper_tier3: WildBody; + usec_upper_pcsmulticam: WildBody; + usec_upper_tier_2: WildBody; + usec_upper_infiltrator: WildBody; + user_upper_NightPatrol: WildBody; + wild_body_bomber: WildBody; + wild_top_yellowcoat: WildBody; +} +export interface WildBody { + body: string; + hands: string; + isNotRandom: boolean; +} +export interface SavageFeet { + wild_feet: WildFeet; + wild_feet_1: WildFeet; + wild_feet_2: WildFeet; + Wild_Dealmaker_feet: WildFeet; + wild_security_feet_1: WildFeet; + Wild_Killa_feet: WildFeet; + wild_pmcBot_feet: WildFeet; + Pants_BOSS_Glukhar: WildFeet; + Pants_BOSS_Shturman: WildFeet; + Pants_security_Gorka4: WildFeet; + Pants_security_Flora: WildFeet; + scav_kit_lower_sklon: WildFeet; + Pants_BOSS_Sanitar: WildFeet; + wild_feet_sweatpants: WildFeet; + wild_feet_wasatch: WildFeet; + wild_feet_slimPants: WildFeet; + pants_cultist_01: WildFeet; + pants_cultist_02: WildFeet; + wild_feet_scavelite_taclite: WildFeet; + pants_boss_tagilla: WildFeet; + wild_feet_bomber: WildFeet; + wild_pants_yellowcoat: WildFeet; +} +export interface WildFeet { + feet: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface CustomizationVoice { + voice: string; + side: string[]; + isNotRandom: boolean; +} +export interface BodyParts { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface ArmorMaterials { + UHMWPE: ArmorType; + Aramid: ArmorType; + Combined: ArmorType; + Titan: ArmorType; + Aluminium: ArmorType; + ArmoredSteel: ArmorType; + Ceramic: ArmorType; + Glass: ArmorType; +} +export interface ArmorType { + Destructibility: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + ExplosionDestructibility: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; +} +export interface Health { + Falling: Falling; + Effects: Effects; + HealPrice: HealPrice; + ProfileHealthSettings: ProfileHealthSettings; +} +export interface Falling { + DamagePerMeter: number; + SafeHeight: number; +} +export interface Effects { + Existence: Existence; + Dehydration: Dehydration; + BreakPart: BreakPart; + Contusion: Contusion; + Disorientation: Disorientation; + Exhaustion: Exhaustion; + LowEdgeHealth: LowEdgeHealth; + RadExposure: RadExposure; + Stun: Stun; + Intoxication: Intoxication; + Regeneration: Regeneration; + Wound: Wound; + Berserk: Berserk; + Flash: Flash; + MedEffect: MedEffect; + Pain: Pain; + PainKiller: PainKiller; + SandingScreen: SandingScreen; + Stimulator: Stimulator; + Tremor: Tremor; + ChronicStaminaFatigue: ChronicStaminaFatigue; + Fracture: Fracture2; + HeavyBleeding: HeavyBleeding2; + LightBleeding: LightBleeding2; + BodyTemperature: BodyTemperature; +} +export interface Existence { + EnergyLoopTime: number; + HydrationLoopTime: number; + EnergyDamage: number; + HydrationDamage: number; + DestroyedStomachEnergyTimeFactor: number; + DestroyedStomachHydrationTimeFactor: number; +} +export interface Dehydration { + DefaultDelay: number; + DefaultResidueTime: number; + BleedingHealth: number; + BleedingLoopTime: number; + BleedingLifeTime: number; + DamageOnStrongDehydration: number; + StrongDehydrationLoopTime: number; +} +export interface BreakPart { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface Contusion { + Dummy: number; +} +export interface Disorientation { + Dummy: number; +} +export interface Exhaustion { + DefaultDelay: number; + DefaultResidueTime: number; + Damage: number; + DamageLoopTime: number; +} +export interface LowEdgeHealth { + DefaultDelay: number; + DefaultResidueTime: number; + StartCommonHealth: number; +} +export interface RadExposure { + Damage: number; + DamageLoopTime: number; +} +export interface Stun { + Dummy: number; +} +export interface Intoxication { + DefaultDelay: number; + DefaultResidueTime: number; + DamageHealth: number; + HealthLoopTime: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovedAfterDeath: boolean; + HealExperience: number; + RemovePrice: number; +} +export interface Regeneration { + LoopTime: number; + MinimumHealthPercentage: number; + Energy: number; + Hydration: number; + BodyHealth: BodyHealth; + Influences: Influences; +} +export interface BodyHealth { + Head: BodyHealthValue; + Chest: BodyHealthValue; + Stomach: BodyHealthValue; + LeftArm: BodyHealthValue; + RightArm: BodyHealthValue; + LeftLeg: BodyHealthValue; + RightLeg: BodyHealthValue; +} +export interface BodyHealthValue { + Value: number; +} +export interface Influences { + LightBleeding: Influence; + HeavyBleeding: Influence; + Fracture: Influence; + RadExposure: Influence; + Intoxication: Influence; +} +export interface Influence { + HealthSlowDownPercentage: number; + EnergySlowDownPercentage: number; + HydrationSlowDownPercentage: number; +} +export interface Wound { + WorkingTime: number; + ThresholdMin: number; + ThresholdMax: number; +} +export interface Berserk { + DefaultDelay: number; + WorkingTime: number; + DefaultResidueTime: number; +} +export interface Flash { + Dummy: number; +} +export interface MedEffect { + LoopTime: number; + StartDelay: number; + DrinkStartDelay: number; + FoodStartDelay: number; + DrugsStartDelay: number; + MedKitStartDelay: number; + MedicalStartDelay: number; + StimulatorStartDelay: number; +} +export interface Pain { + TremorDelay: number; + HealExperience: number; +} +export interface PainKiller { + Dummy: number; +} +export interface SandingScreen { + Dummy: number; +} +export interface Stimulator { + BuffLoopTime: number; + Buffs: Buffs; +} +export interface Buffs { + BuffsSJ1TGLabs: Buff[]; + BuffsSJ6TGLabs: Buff[]; + BuffsPropital: Buff[]; + BuffsZagustin: Buff[]; + BuffseTGchange: Buff[]; + BuffsAdrenaline: Buff[]; + BuffsGoldenStarBalm: Buff[]; + Buffs_drink_aquamari: Buff[]; + Buffs_drink_maxenergy: Buff[]; + Buffs_drink_milk: Buff[]; + Buffs_drink_tarcola: Buff[]; + Buffs_drink_hotrod: Buff[]; + Buffs_drink_juice_army: Buff[]; + Buffs_drink_water: Buff[]; + Buffs_food_borodinskiye: Buff[]; + Buffs_food_condensed_milk: Buff[]; + Buffs_food_emelya: Buff[]; + Buffs_food_mayonez: Buff[]; + Buffs_food_mre: Buff[]; + Buffs_food_sugar: Buff[]; + Buffs_drink_vodka: Buff[]; + Buffs_drink_jack: Buff[]; + Buffs_drink_moonshine: Buff[]; + Buffs_drink_purewater: Buff[]; + Buffs_3bTG: Buff[]; + Buffs_AHF1M: Buff[]; + Buffs_L1: Buff[]; + Buffs_MULE: Buff[]; + Buffs_Meldonin: Buff[]; + Buffs_Obdolbos: Buff[]; + Buffs_P22: Buff[]; + Buffs_KultistsToxin: Buff[]; + Buffs_BodyTemperature: Buff[]; + Buffs_Antidote: Buff[]; + Buffs_melee_bleed: Buff[]; + Buffs_melee_blunt: Buff[]; + Buffs_hultafors: Buff[]; + Buffs_drink_vodka_BAD: Buff[]; + Buffs_food_alyonka: Buff[]; + Buffs_food_slippers: Buff[]; + Buffs_knife: Buff[]; +} +export interface Buff { + BuffType: string; + Chance: number; + Delay: number; + Duration: number; + Value: number; + AbsoluteValue: boolean; + SkillName: string; +} +export interface Tremor { + DefaultDelay: number; + DefaultResidueTime: number; +} +export interface ChronicStaminaFatigue { + EnergyRate: number; + WorkingTime: number; + TicksEvery: number; + EnergyRatePerStack: number; +} +export interface Fracture2 { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface HeavyBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface Probability { + FunctionType: string; + K: number; + B: number; + Threshold: number; +} +export interface LightBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface BodyTemperature { + DefaultBuildUpTime: number; + DefaultResidueTime: number; + LoopTime: number; +} +export interface HealPrice { + HealthPointPrice: number; + HydrationPointPrice: number; + EnergyPointPrice: number; + TrialLevels: number; + TrialRaids: number; +} +export interface ProfileHealthSettings { + BodyPartsSettings: BodyPartsSettings; + HealthFactorsSettings: HealthFactorsSettings; +} +export interface BodyPartsSettings { + Head: BodyPartsSetting; + Chest: BodyPartsSetting; + Stomach: BodyPartsSetting; + LeftArm: BodyPartsSetting; + RightArm: BodyPartsSetting; + LeftLeg: BodyPartsSetting; + RightLeg: BodyPartsSetting; +} +export interface BodyPartsSetting { + Minimum: number; + Maximum: number; + Default: number; + OverDamageReceivedMultiplier: number; +} +export interface HealthFactorsSettings { + Energy: HealthFactorSetting; + Hydration: HealthFactorSetting; + Temperature: HealthFactorSetting; + Poisoning: HealthFactorSetting; + Radiation: HealthFactorSetting; +} +export interface HealthFactorSetting { + Minimum: number; + Maximum: number; + Default: number; +} +export interface Rating { + levelRequired: number; + limit: number; + categories: Categories; +} +export interface Categories { + experience: boolean; + kd: boolean; + surviveRatio: boolean; + avgEarnings: boolean; + kills: boolean; + raidCount: boolean; + longestShot: boolean; + timeOnline: boolean; + inventoryFullCost: boolean; + ragFairStanding: boolean; +} +export interface Tournament { + categories: Categories2; + limit: number; + levelRequired: number; +} +export interface Categories2 { + dogtags: boolean; +} +export interface RagFair { + enabled: boolean; + priceStabilizerEnabled: boolean; + includePveTraderSales: boolean; + priceStabilizerStartIntervalInHours: number; + minUserLevel: number; + communityTax: number; + communityItemTax: number; + communityRequirementTax: number; + offerPriorityCost: number; + offerDurationTimeInHour: number; + offerDurationTimeInHourAfterRemove: number; + priorityTimeModifier: number; + maxRenewOfferTimeInHour: number; + renewPricePerHour: number; + maxActiveOfferCount: MaxActiveOfferCount[]; + balancerRemovePriceCoefficient: number; + balancerMinPriceCount: number; + balancerAveragePriceCoefficient: number; + delaySinceOfferAdd: number; + uniqueBuyerTimeoutInDays: number; + ratingSumForIncrease: number; + ratingIncreaseCount: number; + ratingSumForDecrease: number; + ratingDecreaseCount: number; + maxSumForIncreaseRatingPerOneSale: number; + maxSumForDecreaseRatingPerOneSale: number; + maxSumForRarity: MaxSumForRarity; + ChangePriceCoef: number; + balancerUserItemSaleCooldownEnabled: boolean; + balancerUserItemSaleCooldown: number; + youSellOfferMaxStorageTimeInHour: number; + yourOfferDidNotSellMaxStorageTimeInHour: number; + isOnlyFoundInRaidAllowed: boolean; + sellInOnePiece: number; +} +export interface MaxActiveOfferCount { + from: number; + to: number; + count: number; +} +export interface MaxSumForRarity { + Common: RarityMaxSum; + Rare: RarityMaxSum; + Superrare: RarityMaxSum; + Not_exist: RarityMaxSum; +} +export interface RarityMaxSum { + value: number; +} +export interface Handbook { + defaultCategory: string; +} +export interface Stamina { + Capacity: number; + SprintDrainRate: number; + BaseRestorationRate: number; + JumpConsumption: number; + GrenadeHighThrow: number; + GrenadeLowThrow: number; + AimDrainRate: number; + AimRangeFinderDrainRate: number; + OxygenCapacity: number; + OxygenRestoration: number; + WalkOverweightLimits: xyz; + BaseOverweightLimits: xyz; + SprintOverweightLimits: xyz; + WalkSpeedOverweightLimits: xyz; + CrouchConsumption: xyz; + WalkConsumption: xyz; + StandupConsumption: xyz; + TransitionSpeed: xyz; + SprintAccelerationLowerLimit: number; + SprintSpeedLowerLimit: number; + SprintSensitivityLowerLimit: number; + AimConsumptionByPose: xyz; + RestorationMultiplierByPose: xyz; + OverweightConsumptionByPose: xyz; + AimingSpeedMultiplier: number; + WalkVisualEffectMultiplier: number; + HandsCapacity: number; + HandsRestoration: number; + ProneConsumption: number; + BaseHoldBreathConsumption: number; + SoundRadius: xyz; + ExhaustedMeleeSpeed: number; + FatigueRestorationRate: number; + FatigueAmountToCreateEffect: number; + ExhaustedMeleeDamageMultiplier: number; + FallDamageMultiplier: number; + SafeHeightOverweight: number; + SitToStandConsumption: number; + StaminaExhaustionCausesJiggle: boolean; + StaminaExhaustionStartsBreathSound: boolean; + StaminaExhaustionRocksCamera: boolean; + HoldBreathStaminaMultiplier: xyz; + PoseLevelIncreaseSpeed: xyz; + PoseLevelDecreaseSpeed: xyz; + PoseLevelConsumptionPerNotch: xyz; +} +export interface StaminaRestoration { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface StaminaDrain { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface RequirementReferences { + Alpinist: Alpinist[]; +} +export interface Alpinist { + Requirement: string; + Id: string; + Count: number; + RequiredSlot: string; + RequirementTip: string; +} +export interface RestrictionsInRaid { + TemplateId: string; + Value: number; +} +export interface Insurance { + MaxStorageTimeInHour: number; +} +export interface SkillsSettings { + SkillProgressRate: number; + WeaponSkillProgressRate: number; + WeaponSkillRecoilBonusPerLevel: number; + HideoutManagement: HideoutManagement; + Crafting: Crafting; + Metabolism: Metabolism; + Immunity: Immunity; + Endurance: Endurance; + Strength: Strength; + Vitality: Vitality; + Health: Health2; + StressResistance: StressResistance; + Throwing: Throwing; + RecoilControl: RecoilControl; + Pistol: WeaponSkills; + Revolver: WeaponSkills; + SMG: any[]; + Assault: WeaponSkills; + Shotgun: WeaponSkills; + Sniper: WeaponSkills; + LMG: any[]; + HMG: any[]; + Launcher: any[]; + AttachedLauncher: any[]; + Melee: any[]; + DMR: WeaponSkills; + BearAssaultoperations: any[]; + BearAuthority: any[]; + BearAksystems: any[]; + BearHeavycaliber: any[]; + BearRawpower: any[]; + UsecArsystems: any[]; + UsecDeepweaponmodding_Settings: any[]; + UsecLongrangeoptics_Settings: any[]; + UsecNegotiations: any[]; + UsecTactics: any[]; + BotReload: any[]; + CovertMovement: CovertMovement; + FieldMedicine: any[]; + Search: Search; + Sniping: any[]; + ProneMovement: any[]; + FirstAid: any[]; + LightVests: ArmorSkills; + HeavyVests: ArmorSkills; + WeaponModding: any[]; + AdvancedModding: any[]; + NightOps: any[]; + SilentOps: any[]; + Lockpicking: any[]; + WeaponTreatment: WeaponTreatment; + MagDrills: MagDrills; + Freetrading: any[]; + Auctions: any[]; + Cleanoperations: any[]; + Barter: any[]; + Shadowconnections: any[]; + Taskperformance: any[]; + Perception: Perception; + Intellect: Intellect; + Attention: Attention; + Charisma: Charisma; + Memory: Memory; + Surgery: Surgery; + AimDrills: AimDrills; + BotSound: any[]; + TroubleShooting: TroubleShooting; +} +export interface ArmorSkills { + WearAmountRepairLVestsReducePerLevel: number; + WearChanceRepairLVestsReduceEliteLevel: number; +} +export interface HideoutManagement { + SkillPointsPerAreaUpgrade: number; + SkillPointsPerCraft: number; + ConsumptionReductionPerLevel: number; + SkillBoostPercent: number; + SkillPointsRate: SkillPointsRate; + EliteSlots: EliteSlots; +} +export interface SkillPointsRate { + Generator: Generator; + AirFilteringUnit: SkillPointRate; + WaterCollector: SkillPointRate; + SolarPower: SkillPointRate; +} +export interface SkillPointRate { + ResourceSpent: number; + PointsGained: number; +} +export interface EliteSlots { + Generator: EliteSlot; + AirFilteringUnit: EliteSlot; + WaterCollector: EliteSlot; + BitcoinFarm: EliteSlot; +} +export interface EliteSlot { + Slots: number; + Container: number; +} +export interface Crafting { + PointsPerCraftingCycle: number; + CraftingCycleHours: number; + PointsPerUniqueCraftCycle: number; + UniqueCraftsPerCycle: number; + CraftTimeReductionPerLevel: number; + ProductionTimeReductionPerLevel: number; + EliteExtraProductions: number; + CraftingPointsToInteligence: number; +} +export interface Metabolism { + HydrationRecoveryRate: number; + EnergyRecoveryRate: number; + IncreasePositiveEffectDurationRate: number; + DecreaseNegativeEffectDurationRate: number; + DecreasePoisonDurationRate: number; +} +export interface Immunity { + ImmunityMiscEffects: number; + ImmunityPoisonBuff: number; + ImmunityPainKiller: number; + HealthNegativeEffect: number; + StimulatorNegativeBuff: number; +} +export interface Endurance { + MovementAction: number; + SprintAction: number; + GainPerFatigueStack: number; +} +export interface Strength { + SprintActionMin: number; + SprintActionMax: number; + MovementActionMin: number; + MovementActionMax: number; + PushUpMin: number; + PushUpMax: number; + FistfightAction: number; + ThrowAction: number; +} +export interface Vitality { + DamageTakenAction: number; + HealthNegativeEffect: number; +} +export interface Health2 { + SkillProgress: number; +} +export interface StressResistance { + HealthNegativeEffect: number; + LowHPDuration: number; +} +export interface Throwing { + ThrowAction: number; +} +export interface RecoilControl { + RecoilAction: number; + RecoilBonusPerLevel: number; +} +export interface WeaponSkills { + WeaponReloadAction: number; + WeaponShotAction: number; + WeaponFixAction: number; + WeaponChamberAction: number; +} +export interface CovertMovement { + MovementAction: number; +} +export interface Search { + SearchAction: number; + FindAction: number; +} +export interface WeaponTreatment { + DurLossReducePerLevel: number; + SkillPointsPerRepair: number; + Filter: any[]; + WearAmountRepairGunsReducePerLevel: number; + WearChanceRepairGunsReduceEliteLevel: number; +} +export interface MagDrills { + RaidLoadedAmmoAction: number; + RaidUnloadedAmmoAction: number; + MagazineCheckAction: number; +} +export interface Perception { + OnlineAction: number; + UniqueLoot: number; +} +export interface Intellect { + ExamineAction: number; + SkillProgress: number; + RepairAction: number; + WearAmountReducePerLevel: number; + WearChanceReduceEliteLevel: number; + RepairPointsCostReduction: number; +} +export interface Attention { + ExamineWithInstruction: number; + FindActionFalse: number; + FindActionTrue: number; +} +export interface Charisma { + SkillProgressInt: number; + SkillProgressAtn: number; + SkillProgressPer: number; +} +export interface Memory { + AnySkillUp: number; + SkillProgress: number; +} +export interface Surgery { + SurgeryAction: number; + SkillProgress: number; +} +export interface AimDrills { + WeaponShotAction: number; +} +export interface TroubleShooting { + MalfRepairSpeedBonusPerLevel: number; + SkillPointsPerMalfFix: number; + EliteDurabilityChanceReduceMult: number; + EliteAmmoChanceReduceMult: number; + EliteMagChanceReduceMult: number; +} +export interface Aiming { + ProceduralIntensityByPose: xyz; + AimProceduralIntensity: number; + HeavyWeight: number; + LightWeight: number; + MaxTimeHeavy: number; + MinTimeHeavy: number; + MaxTimeLight: number; + MinTimeLight: number; + RecoilScaling: number; + RecoilDamping: number; + CameraSnapGlobalMult: number; + RecoilXIntensityByPose: xyz; + RecoilYIntensityByPose: xyz; + RecoilZIntensityByPose: xyz; + RecoilCrank: boolean; + RecoilHandDamping: number; + RecoilConvergenceMult: number; + RecoilVertBonus: number; + RecoilBackBonus: number; +} +export interface Malfunction { + AmmoMalfChanceMult: number; + MagazineMalfChanceMult: number; + MalfRepairHardSlideMult: number; + MalfRepairOneHandBrokenMult: number; + MalfRepairTwoHandsBrokenMult: number; + AllowMalfForBots: boolean; + ShowGlowAttemptsCount: number; + OutToIdleSpeedMultForPistol: number; + IdleToOutSpeedMultOnMalf: number; + TimeToQuickdrawPistol: number; + DurRangeToIgnoreMalfs: xyz; + DurFeedWt: number; + DurMisfireWt: number; + DurJamWt: number; + DurSoftSlideWt: number; + DurHardSlideMinWt: number; + DurHardSlideMaxWt: number; + AmmoMisfireWt: number; + AmmoFeedWt: number; + AmmoJamWt: number; + OverheatFeedWt: number; + OverheatJamWt: number; + OverheatSoftSlideWt: number; + OverheatHardSlideMinWt: number; + OverheatHardSlideMaxWt: number; +} +export interface Overheat { + MinOverheat: number; + MaxOverheat: number; + OverheatProblemsStart: number; + ModHeatFactor: number; + ModCoolFactor: number; + MinWearOnOverheat: number; + MaxWearOnOverheat: number; + MinWearOnMaxOverheat: number; + MaxWearOnMaxOverheat: number; + OverheatWearLimit: number; + MaxCOIIncreaseMult: number; + MinMalfChance: number; + MaxMalfChance: number; + DurReduceMinMult: number; + DurReduceMaxMult: number; + BarrelMoveRndDuration: number; + BarrelMoveMaxMult: number; + FireratePitchMult: number; + FirerateReduceMinMult: number; + FirerateReduceMaxMult: number; + FirerateOverheatBorder: number; + EnableSlideOnMaxOverheat: boolean; + StartSlideOverheat: number; + FixSlideOverheat: number; + AutoshotMinOverheat: number; + AutoshotChance: number; + AutoshotPossibilityDuration: number; + MaxOverheatCoolCoef: number; +} +export interface FenceSettings { + FenceId: string; + Levels: Record; + paidExitStandingNumerator: number; +} +export interface FenceLevel { + SavageCooldownModifier: number; + ScavCaseTimeModifier: number; + PaidExitCostModifier: number; + BotFollowChance: number; + ScavEquipmentSpawnChanceModifier: number; + PriceModifier: number; + HostileBosses: boolean; + HostileScavs: boolean; + ScavAttackSupport: boolean; + ExfiltrationPriceModifier: number; + AvailableExits: number; +} +export interface Inertia { + InertiaLimits: xyz; + InertiaLimitsStep: number; + ExitMovementStateSpeedThreshold: xyz; + WalkInertia: xyz; + FallThreshold: number; + SpeedLimitAfterFallMin: xyz; + SpeedLimitAfterFallMax: xyz; + SpeedLimitDurationMin: xyz; + SpeedLimitDurationMax: xyz; + SpeedInertiaAfterJump: xyz; + BaseJumpPenaltyDuration: number; + DurationPower: number; + BaseJumpPenalty: number; + PenaltyPower: number; + InertiaTiltCurveMin: xyz; + InertiaTiltCurveMax: xyz; + InertiaBackwardCoef: xyz; + TiltInertiaMaxSpeed: xyz; + TiltStartSideBackSpeed: xyz; + TiltMaxSideBackSpeed: xyz; + TiltAcceleration: xyz; + AverageRotationFrameSpan: number; + SprintSpeedInertiaCurveMin: xyz; + SprintSpeedInertiaCurveMax: xyz; + SprintBrakeInertia: xyz; + SprintTransitionMotionPreservation: xyz; + WeaponFlipSpeed: xyz; + PreSprintAccelerationLimits: xyz; + SprintAccelerationLimits: xyz; + SideTime: xyz; + DiagonalTime: xyz; + MinDirectionBlendTime: number; + MoveTime: number; + MinMovementAccelerationRangeRight: xyz; + MaxMovementAccelerationRangeRight: xyz; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Ballistic { + GlobalDamageDegradationCoefficient: number; +} +export interface RepairKitSettings { + armorClassDivisor: number; + durabilityPointCostArmor: number; + durabilityPointCostGuns: number; +} +export interface BotPreset { + UseThis: boolean; + Role: string; + BotDifficulty: string; + VisibleAngle: number; + VisibleDistance: number; + ScatteringPerMeter: number; + HearingSense: number; + SCATTERING_DIST_MODIF: number; + MAX_AIMING_UPGRADE_BY_TIME: number; + FIRST_CONTACT_ADD_SEC: number; + COEF_IF_MOVE: number; +} +export interface BotWeaponScattering { + Name: string; + PriorityScatter1meter: number; + PriorityScatter10meter: number; + PriorityScatter100meter: number; +} +export interface Preset { + _id: string; + _type: string; + _changeWeaponName: boolean; + _name: string; + _parent: string; + _items: Item[]; + _encyclopedia?: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocation.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocation.d.ts new file mode 100644 index 0000000..42fac06 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocation.d.ts @@ -0,0 +1,6 @@ +import { ILocationBase } from "./ILocationBase"; +import { ILooseLoot } from "./ILooseLoot"; +export interface ILocation { + base: ILocationBase; + looseLoot: ILooseLoot; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocationBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocationBase.d.ts new file mode 100644 index 0000000..ad48d32 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocationBase.d.ts @@ -0,0 +1,198 @@ +export interface ILocationBase { + AccessKeys: string[]; + AirdropParameters: AirdropParameter[]; + Area: number; + AveragePlayTime: number; + AveragePlayerLevel: number; + Banners: Banner[]; + BossLocationSpawn: BossLocationSpawn[]; + BotAssault: number; + BotEasy: number; + BotHard: number; + BotImpossible: number; + BotLocationModifier: BotLocationModifier; + BotMarksman: number; + BotMax: number; + BotMaxPlayer: number; + BotMaxTimePlayer: number; + BotNormal: number; + BotSpawnTimeOffMax: number; + BotSpawnTimeOffMin: number; + BotSpawnTimeOnMax: number; + BotSpawnTimeOnMin: number; + BotStart: number; + BotStop: number; + Description: string; + DisabledForScav: boolean; + DisabledScavExits: string; + Enabled: boolean; + GlobalLootChanceModifier: number; + IconX: number; + IconY: number; + Id: string; + Insurance: boolean; + IsSecret: boolean; + Locked: boolean; + Loot: any[]; + MaxBotPerZone: number; + MaxDistToFreePoint: number; + MaxPlayers: number; + MinDistToExitPoint: number; + MinDistToFreePoint: number; + MinMaxBots: MinMaxBot[]; + MinPlayers: number; + Name: string; + NewSpawn: boolean; + OcculsionCullingEnabled: boolean; + OldSpawn: boolean; + OpenZones: string; + Preview: Preview; + RequiredPlayerLevel: number; + Rules: string; + SafeLocation: boolean; + Scene: Scene; + SpawnPointParams: SpawnPointParam[]; + UnixDateTime: number; + _Id: string; + doors: any[]; + escape_time_limit: number; + exit_access_time: number; + exit_count: number; + exit_time: number; + exits: Exit[]; + filter_ex: string[]; + limits: ILimit[]; + matching_min_seconds: number; + maxItemCountInLocation: MaxItemCountInLocation[]; + sav_summon_seconds: number; + tmp_location_field_remove_me: number; + users_gather_seconds: number; + users_spawn_seconds_n: number; + users_spawn_seconds_n2: number; + users_summon_seconds: number; + waves: Wave[]; +} +export interface ILimit { + min: number; + max: number; + items: any[]; +} +export interface AirdropParameter { + AirdropPointDeactivateDistance: number; + MinPlayersCountToSpawnAirdrop: number; + PlaneAirdropChance: number; + PlaneAirdropCooldownMax: number; + PlaneAirdropCooldownMin: number; + PlaneAirdropEnd: number; + PlaneAirdropMax: number; + PlaneAirdropStartMax: number; + PlaneAirdropStartMin: number; + UnsuccessfulTryPenalty: number; +} +export interface Banner { + id: string; + pic: Pic; +} +export interface Pic { + path: string; + rcid: string; +} +export interface BossLocationSpawn { + BossChance: number; + BossDifficult: string; + BossEscortAmount: string; + BossEscortDifficult: string; + BossEscortType: string; + BossName: string; + BossPlayer: boolean; + BossZone: string; + Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; +} +export interface BossSupport { + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; +} +export interface BotLocationModifier { + AccuracySpeed: number; + DistToActivate: number; + DistToPersueAxemanCoef: number; + DistToSleep: number; + GainSight: number; + KhorovodChance: number; + MagnetPower: number; + MarksmanAccuratyCoef: number; + Scattering: number; + VisibleDistance: number; +} +export interface MinMaxBot { + WildSpawnType: string; + max: number; + min: number; +} +export interface Preview { + path: string; + rcid: string; +} +export interface Scene { + path: string; + rcid: string; +} +export interface SpawnPointParam { + BotZoneName: string; + Categories: string[]; + ColliderParams: ColliderParams; + DelayToCanSpawnSec: number; + Id: string; + Infiltration: string; + Position: xyz; + Rotation: number; + Sides: string[]; +} +export interface ColliderParams { + _parent: string; + _props: Props; +} +export interface Props { + Center: xyz; + Radius: number; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Exit { + Chance: number; + Count: number; + EntryPoints: string; + ExfiltrationTime: number; + ExfiltrationType: string; + Id: string; + MaxTime: number; + MinTime: number; + Name: string; + PassageRequirement: string; + PlayersCount: number; + RequirementTip: string; +} +export interface MaxItemCountInLocation { + TemplateId: string; + Value: number; +} +export interface Wave { + BotPreset: string; + BotSide: string; + SpawnPoints: string; + WildSpawnType: string; + isPlayers: boolean; + number: number; + slots_max: number; + slots_min: number; + time_max: number; + time_min: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts new file mode 100644 index 0000000..7f8d915 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILocationsSourceDestinationBase.d.ts @@ -0,0 +1,9 @@ +import { ILocations } from "../../spt/server/ILocations"; +export interface ILocationsGenerateAllResponse { + locations: ILocations; + paths: Path[]; +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILooseLoot.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILooseLoot.d.ts new file mode 100644 index 0000000..14b795e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/ILooseLoot.d.ts @@ -0,0 +1,45 @@ +export interface ILooseLoot { + spawnpointCount: SpawnpointCount; + spawnpointsForced: SpawnpointsForced[]; + spawnpoints: Spawnpoint[]; +} +export interface SpawnpointCount { + mean: number; + std: number; +} +export interface SpawnpointsForced { + locationId: string; + probability: number; + template: SpawnpointTemplate; +} +export interface SpawnpointTemplate { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: Item[]; +} +export interface Item { + _id: string; + _tpl?: string; +} +export interface Spawnpoint { + locationId: string; + probability: number; + template: SpawnpointTemplate; + itemDistribution: ItemDistribution[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IMetricsTableData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IMetricsTableData.d.ts new file mode 100644 index 0000000..873ef82 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IMetricsTableData.d.ts @@ -0,0 +1,7 @@ +export interface IMetricsTableData { + Keys: number[]; + NetProcessingBins: number[]; + RenderBins: number[]; + GameUpdateBins: number[]; + MemoryMeasureInterval: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IPmcData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IPmcData.d.ts new file mode 100644 index 0000000..adc2aa5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/IPmcData.d.ts @@ -0,0 +1,341 @@ +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +import { IPmcDataRepeatableQuest } from "./tables/IRepeatableQuests"; +import { Item, Upd } from "./tables/IItem"; +import { HideoutAreas } from "../../enums/HideoutAreas"; +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IPmcData { + _id: string; + aid: string; + savage: string; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: Record; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: InsuredItem[]; + Hideout: Hideout; + Bonuses: Bonus[]; + Notes: Notes; + Quests: Quest[]; + TradersInfo: Record; + RagfairInfo: RagfairInfo; + WishList: string[]; + RepeatableQuests: IPmcDataRepeatableQuest[]; + CarExtractCounts: CarExtractCounts; + SurvivorClass: SurvivorClass; +} +export declare enum SurvivorClass { + Unknown = 0, + Neutralizer = 1, + Marauder = 2, + Paramedic = 3, + Survivor = 4 +} +export interface Info { + EntryPoint: string; + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: MemberCategory; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + IsStreamerModeAvailable: boolean; + Bans: IBan[]; + BannedState: boolean; + BannedUntil: number; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface IBan { + type: BanType; + dateTime: number; +} +export declare enum BanType { + Chat = 0, + RagFair = 1, + Voip = 2, + Trading = 3, + Online = 4, + Friends = 5, + ChangeNickname = 6 +} +export interface Notes { + Notes: Note[]; +} +export interface Note { + Time: number; + Text: string; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { + Hydration: CurrentMax; + Energy: CurrentMax; + Temperature: CurrentMax; + BodyParts: BodyPartsHealth; + UpdateTime: number; +} +export interface BodyPartsHealth { + Head: BodyPartHealth; + Chest: BodyPartHealth; + Stomach: BodyPartHealth; + LeftArm: BodyPartHealth; + RightArm: BodyPartHealth; + LeftLeg: BodyPartHealth; + RightLeg: BodyPartHealth; +} +export interface BodyPartHealth { + Health: CurrentMax; + Effects?: Record; +} +export interface CurrentMax { + Current: number; + Maximum: number; +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: Common[]; + Mastering: Mastering[]; + Bonuses?: any[]; + Points: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession: number; + LastAccess: number; +} +export interface Mastering { + Id: string; + Progress: number; +} +export interface Stats { + CarriedQuestItems: string[]; + Victims: Victim[]; + TotalSessionExperience: number; + LastSessionDate: number; + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; + SessionExperienceMult?: number; + ExperienceBonusMult?: number; + Aggressor?: Aggressor; + DroppedItems?: IDroppedItem[]; + FoundInRaidItems?: FoundInRaidItem[]; + DamageHistory?: DamageHistory; + DeathCause?: DeathCause; + LastPlayerState?: LastPlayerState; + TotalInGameTime: number; + SurvivorClass?: string; +} +export interface IDroppedItem { + QuestId: string; + ItemId: string; + ZoneId: string; +} +export interface FoundInRaidItem { + QuestId: string; + ItemId: string; +} +export interface Victim { + AccountId: string; + ProfileId: string; + Name: string; + Side: string; + BodyPart: string; + Time: string; + Distance: number; + Level: number; + Weapon: string; + Role: string; +} +export interface SessionCounters { + Items: CounterKeyValue[]; +} +export interface OverallCounters { + Items: CounterKeyValue[]; +} +export interface CounterKeyValue { + Key: string[]; + Value: number; +} +export interface Aggressor { + AccountId: string; + ProfileId: string; + MainProfileNickname: string; + Name: string; + Side: string; + BodyPart: string; + HeadSegment: string; + WeaponName: string; + Category: string; +} +export interface DamageHistory { + LethalDamagePart: string; + LethalDamage: LethalDamage; + BodyParts: BodyPartsDamageHistory; +} +export interface LethalDamage { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface BodyPartsDamageHistory { + Head: DamageStats[]; + Chest: DamageStats[]; + Stomach: DamageStats[]; + LeftArm: DamageStats[]; + RightArm: DamageStats[]; + LeftLeg: DamageStats[]; + RightLeg: DamageStats[]; + Common: DamageStats[]; +} +export interface DamageStats { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface DeathCause { + DamageType: string; + Side: string; + Role: string; + WeaponId: string; +} +export interface LastPlayerState { + Info: LastPlayerStateInfo; + Customization: Record; + Equipment: any; +} +export interface LastPlayerStateInfo { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; +} +export interface ConditionCounters { + Counters: Counter[]; +} +export interface Counter { + id: string; + value: number; + qid: string; +} +export interface BackendCounter { + id: string; + qid?: string; + value: number; +} +export interface InsuredItem { + tid: string; + itemId: string; +} +export interface Hideout { + Production: Record; + Areas: HideoutArea[]; +} +export interface Productive { + Products: Product[]; + Progress?: number; + inProgress?: boolean; + StartTimestamp?: number; +} +export interface Product { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface ScavCase extends Productive { +} +export interface Production extends Productive { + RecipeId: string; + SkipTime: number; + ProductionTime: number; +} +export interface HideoutArea { + type: HideoutAreas; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: HideoutSlot[]; + lastRecipe: string; +} +export interface HideoutSlot { + item: HideoutItem[]; +} +export interface HideoutItem { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface Bonus { + type: string; + templateId?: string; + passive?: boolean; + production?: boolean; + visible?: boolean; + value?: number; + icon?: string; +} +export interface Quest { + qid: string; + startTime: number; + status: string; + statusTimers?: StatusTimer; + completedConditions?: string[]; +} +export interface StatusTimer { + AvailableForStart?: number; +} +export interface TraderInfo { + loyaltyLevel: number; + salesSum: number; + standing: number; + nextResupply: number; + unlocked: boolean; +} +export interface RagfairInfo { + rating: number; + isRatingGrowing: boolean; + offers: IRagfairOffer[]; +} +export interface CarExtractCounts { +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/MemberCategory.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts new file mode 100644 index 0000000..7303275 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/request/IBaseInteractionRequestData.d.ts @@ -0,0 +1,9 @@ +export interface IBaseInteractionRequestData { + Action: string; + fromOwner?: OwnerInfo; + toOwner?: OwnerInfo; +} +export interface OwnerInfo { + id: string; + type: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotBase.d.ts new file mode 100644 index 0000000..677fd49 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotBase.d.ts @@ -0,0 +1,101 @@ +import { BackendCounter, Bonus } from "../IPmcData"; +import { Item } from "./IItem"; +export interface IBotBase { + _id: string; + aid: string; + savage: any; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: any; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: any[]; + Hideout: Hideout; + Bonuses: Bonus[]; +} +export interface Info { + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: number; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + NeedWipeOptions: any[]; + lastCompletedWipe: any; + BannedState: boolean; + BannedUntil: number; + IsStreamerModeAvailable: boolean; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: any[]; + Mastering: any[]; + Points: number; +} +export interface Stats { + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; +} +export interface SessionCounters { + Items: any[]; +} +export interface OverallCounters { + Items: any[]; +} +export interface ConditionCounters { + Counters: any[]; +} +export interface Hideout { + Production: Production; + Areas: Area[]; +} +export interface Production { +} +export interface Area { + type: number; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: any[]; + lastRecipe: any; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotCore.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotCore.d.ts new file mode 100644 index 0000000..16a782d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotCore.d.ts @@ -0,0 +1,133 @@ +export interface IBotCore { + SAVAGE_KILL_DIST: number; + SOUND_DOOR_BREACH_METERS: number; + SOUND_DOOR_OPEN_METERS: number; + STEP_NOISE_DELTA: number; + JUMP_NOISE_DELTA: number; + GUNSHOT_SPREAD: number; + GUNSHOT_SPREAD_SILENCE: number; + BASE_WALK_SPEREAD2: number; + MOVE_SPEED_COEF_MAX: number; + SPEED_SERV_SOUND_COEF_A: number; + SPEED_SERV_SOUND_COEF_B: number; + G: number; + STAY_COEF: number; + SIT_COEF: number; + LAY_COEF: number; + MAX_ITERATIONS: number; + START_DIST_TO_COV: number; + MAX_DIST_TO_COV: number; + STAY_HEIGHT: number; + CLOSE_POINTS: number; + COUNT_TURNS: number; + SIMPLE_POINT_LIFE_TIME_SEC: number; + DANGER_POINT_LIFE_TIME_SEC: number; + DANGER_POWER: number; + COVER_DIST_CLOSE: number; + GOOD_DIST_TO_POINT: number; + COVER_TOOFAR_FROM_BOSS: number; + COVER_TOOFAR_FROM_BOSS_SQRT: number; + MAX_Y_DIFF_TO_PROTECT: number; + FLARE_POWER: number; + MOVE_COEF: number; + PRONE_POSE: number; + LOWER_POSE: number; + MAX_POSE: number; + FLARE_TIME: number; + MAX_REQUESTS__PER_GROUP: number; + UPDATE_GOAL_TIMER_SEC: number; + DIST_NOT_TO_GROUP: number; + DIST_NOT_TO_GROUP_SQR: number; + LAST_SEEN_POS_LIFETIME: number; + DELTA_GRENADE_START_TIME: number; + DELTA_GRENADE_END_TIME: number; + DELTA_GRENADE_RUN_DIST: number; + DELTA_GRENADE_RUN_DIST_SQRT: number; + PATROL_MIN_LIGHT_DIST: number; + HOLD_MIN_LIGHT_DIST: number; + STANDART_BOT_PAUSE_DOOR: number; + ARMOR_CLASS_COEF: number; + SHOTGUN_POWER: number; + RIFLE_POWER: number; + PISTOL_POWER: number; + SMG_POWER: number; + SNIPE_POWER: number; + GESTUS_PERIOD_SEC: number; + GESTUS_AIMING_DELAY: number; + GESTUS_REQUEST_LIFETIME: number; + GESTUS_FIRST_STAGE_MAX_TIME: number; + GESTUS_SECOND_STAGE_MAX_TIME: number; + GESTUS_MAX_ANSWERS: number; + GESTUS_FUCK_TO_SHOOT: number; + GESTUS_DIST_ANSWERS: number; + GESTUS_DIST_ANSWERS_SQRT: number; + GESTUS_ANYWAY_CHANCE: number; + TALK_DELAY: number; + CAN_SHOOT_TO_HEAD: boolean; + CAN_TILT: boolean; + TILT_CHANCE: number; + MIN_BLOCK_DIST: number; + MIN_BLOCK_TIME: number; + COVER_SECONDS_AFTER_LOSE_VISION: number; + MIN_ARG_COEF: number; + MAX_ARG_COEF: number; + DEAD_AGR_DIST: number; + MAX_DANGER_CARE_DIST_SQRT: number; + MAX_DANGER_CARE_DIST: number; + MIN_MAX_PERSON_SEARCH: number; + PERCENT_PERSON_SEARCH: number; + LOOK_ANYSIDE_BY_WALL_SEC_OF_ENEMY: number; + CLOSE_TO_WALL_ROTATE_BY_WALL_SQRT: number; + SHOOT_TO_CHANGE_RND_PART_MIN: number; + SHOOT_TO_CHANGE_RND_PART_MAX: number; + SHOOT_TO_CHANGE_RND_PART_DELTA: number; + FORMUL_COEF_DELTA_DIST: number; + FORMUL_COEF_DELTA_SHOOT: number; + FORMUL_COEF_DELTA_FRIEND_COVER: number; + SUSPETION_POINT_DIST_CHECK: number; + MAX_BASE_REQUESTS_PER_PLAYER: number; + MAX_HOLD_REQUESTS_PER_PLAYER: number; + MAX_GO_TO_REQUESTS_PER_PLAYER: number; + MAX_COME_WITH_ME_REQUESTS_PER_PLAYER: number; + CORE_POINT_MAX_VALUE: number; + CORE_POINTS_MAX: number; + CORE_POINTS_MIN: number; + BORN_POISTS_FREE_ONLY_FAREST_BOT: boolean; + BORN_POINSTS_FREE_ONLY_FAREST_PLAYER: boolean; + SCAV_GROUPS_TOGETHER: boolean; + LAY_DOWN_ANG_SHOOT: number; + HOLD_REQUEST_TIME_SEC: number; + TRIGGERS_DOWN_TO_RUN_WHEN_MOVE: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING_OTHER_ENEMIS: number; + MIN_DIST_TO_STOP_RUN: number; + JUMP_SPREAD_DIST: number; + LOOK_TIMES_TO_KILL: number; + COME_INSIDE_TIMES: number; + TOTAL_TIME_KILL: number; + TOTAL_TIME_KILL_AFTER_WARN: number; + MOVING_AIM_COEF: number; + VERTICAL_DIST_TO_IGNORE_SOUND: number; + DEFENCE_LEVEL_SHIFT: number; + MIN_DIST_CLOSE_DEF: number; + USE_ID_PRIOR_WHO_GO: boolean; + SMOKE_GRENADE_RADIUS_COEF: number; + GRENADE_PRECISION: number; + MAX_WARNS_BEFORE_KILL: number; + CARE_ENEMY_ONLY_TIME: number; + MIDDLE_POINT_COEF: number; + MAIN_TACTIC_ONLY_ATTACK: boolean; + LAST_DAMAGE_ACTIVE: number; + SHALL_DIE_IF_NOT_INITED: boolean; + CHECK_BOT_INIT_TIME_SEC: number; + WEAPON_ROOT_Y_OFFSET: number; + DELTA_SUPRESS_DISTANCE_SQRT: number; + DELTA_SUPRESS_DISTANCE: number; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + WAVE_ONLY_AS_ONLINE: boolean; + LOCAL_BOTS_COUNT: number; + AXE_MAN_KILLS_END: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotType.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotType.d.ts new file mode 100644 index 0000000..01be0be --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IBotType.d.ts @@ -0,0 +1,176 @@ +export interface IBotType { + appearance: Appearance; + chances: Chances; + difficulty: Difficulties; + experience: Experience; + firstName: string[]; + generation: Generation; + health: Health; + inventory: Inventory; + lastName: string[]; + skills: Skills; +} +export interface Appearance { + body: string[]; + feet: string[]; + hands: string[]; + head: string[]; + voice: string[]; +} +export interface Chances { + equipment: EquipmentChances; + mods: ModsChances; +} +export interface EquipmentChances { + ArmBand: number; + ArmorVest: number; + Backpack: number; + Earpiece: number; + Eyewear: number; + FaceCover: number; + FirstPrimaryWeapon: number; + Headwear: number; + Holster: number; + Pockets: number; + Scabbard: number; + SecondPrimaryWeapon: number; + SecuredContainer: number; + TacticalVest: number; +} +export interface ModsChances { + mod_charge: number; + mod_equipment: number; + mod_equipment_000: number; + mod_equipment_001: number; + mod_equipment_002: number; + mod_flashlight: number; + mod_foregrip: number; + mod_launcher: number; + mod_magazine: number; + mod_mount: number; + mod_mount_000: number; + mod_mount_001: number; + mod_muzzle: number; + mod_nvg: number; + mod_pistol_grip: number; + mod_reciever: number; + mod_scope: number; + mod_sight_front: number; + mod_sight_rear: number; + mod_stock: number; + mod_stock_000: number; + mod_stock_akms: number; + mod_tactical: number; + mod_tactical_000: number; + mod_tactical_001: number; + mod_tactical_002: number; + mod_tactical_003: number; +} +export interface Difficulties { + easy: Difficulty; + normal: Difficulty; + hard: Difficulty; + impossible: Difficulty; +} +export interface Difficulty { + Aiming: Record; + Boss: Record; + Change: Record; + Core: Record; + Cover: Record; + Grenade: Record; + Hearing: Record; + Lay: Record; + Look: Record; + Mind: Record; + Move: Record; + Patrol: Record; + Scattering: Record; + Shoot: Record; +} +export interface Experience { + aggressorBonus: number; + level: MinMax; + reward: MinMax; + standingForKill: number; +} +export interface Generation { + items: ItemMinMax; +} +export interface ItemMinMax { + grenades: MinMax; + healing: MinMax; + drugs: MinMax; + stims: MinMax; + looseLoot: MinMax; + magazines: MinMax; + specialItems: MinMax; +} +export interface Health { + BodyParts: BodyPart[]; + Energy: MinMax; + Hydration: MinMax; + Temperature: MinMax; +} +export interface BodyPart { + Chest: MinMax; + Head: MinMax; + LeftArm: MinMax; + LeftLeg: MinMax; + RightArm: MinMax; + RightLeg: MinMax; + Stomach: MinMax; +} +export interface MinMax { + max: number; + min: number; +} +export interface Inventory { + equipment: Equipment; + items: Items; + mods: Mods; +} +export interface Equipment { + ArmBand: Record; + ArmorVest: Record; + Backpack: Record; + Earpiece: Record; + Eyewear: Record; + FaceCover: Record; + FirstPrimaryWeapon: Record; + Headwear: Record; + Holster: Record; + Pockets: Record; + Scabbard: Record; + SecondPrimaryWeapon: Record; + SecuredContainer: Record; + TacticalVest: Record; +} +export interface Items { + Backpack: string[]; + Pockets: string[]; + SecuredContainer: string[]; + SpecialLoot: string[]; + TacticalVest: string[]; +} +export declare type Mods = Record>; +export interface Skills { + Common: Common[]; + Bonuses?: any; + Mastering: Mastering[]; + Points: number; +} +export interface Mastering { + Id: string; + Progress: number; + max?: number; + min?: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession?: number; + LastAccess?: number; + max?: number; + min?: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts new file mode 100644 index 0000000..8bfeece --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ICustomizationItem.d.ts @@ -0,0 +1,33 @@ +export interface ICustomizationItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Side: string[]; + BodyPart: string; + AvailableAsDefault?: boolean; + Body: string; + Hands: string; + Feet: string; + Prefab: Prefab; + WatchPrefab: Prefab; + IntegratedArmorVest: boolean; + WatchPosition: Xyz; + WatchRotation: Xyz; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Xyz { + x: number; + y: number; + z: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts new file mode 100644 index 0000000..7d7db07 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IHandbookBase.d.ts @@ -0,0 +1,16 @@ +export interface IHandbookBase { + Categories: Category[]; + Items: HandbookItem[]; +} +export interface Category { + Id: string; + ParentId?: string; + Icon: string; + Color: string; + Order: string; +} +export interface HandbookItem { + Id: string; + ParentId: string; + Price: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IItem.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IItem.d.ts new file mode 100644 index 0000000..2dd2c03 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IItem.d.ts @@ -0,0 +1,108 @@ +export interface Item { + _id: string; + _tpl: string; + parentId?: string; + slotId?: string; + location?: Location | number; + upd?: Upd; +} +export interface Upd { + OriginalStackObjectsCount?: number; + Togglable?: Togglable; + Map?: Map; + Tag?: Tag; + sptPresetId?: string; + FaceShield?: FaceShield; + StackObjectsCount?: number; + UnlimitedCount?: boolean; + Repairable?: Repairable; + FireMode?: FireMode; + SpawnedInSession?: boolean; + Light?: Light; + Key?: Key; + Resource?: Resource; + Sight?: Sight; + MedKit?: MedKit; + FoodDrink?: FoodDrink; + Dogtag?: Dogtag; + BuyRestrictionMax?: number; + BuyRestrictionCurrent?: number; + Foldable?: Foldable; + SideEffect?: SideEffect; + RepairKit?: RepairKit; +} +export interface Togglable { + On: boolean; +} +export interface Map { + Markers: MapMarker[]; +} +export interface MapMarker { + X: number; + Y: number; +} +export interface Tag { + Color: number; + Name: string; +} +export interface FaceShield { + Hits: number; +} +export interface Repairable { + Durability: number; + MaxDurability: number; +} +export interface MedKit { + HpResource: number; +} +export interface Sight { + ScopesCurrentCalibPointIndexes: number[]; + ScopesSelectedModes: number[]; + SelectedScope: number; +} +export interface Foldable { + Folded: boolean; +} +export interface FireMode { + FireMode: string; +} +export interface FoodDrink { + HpPercent: number; +} +export interface Key { + NumberOfUsages: number; +} +export interface Resource { + Value: number; + UnitsConsumed: number; +} +export interface Light { + IsActive: boolean; + SelectedMode: number; +} +export interface Dogtag { + AccountId: string; + ProfileId: string; + Nickname: string; + Side: string; + Level: number; + Time: string; + Status: string; + KillerAccountId: string; + KillerProfileId: string; + KillerName: string; + WeaponName: string; +} +export interface Location { + x: number; + y: number; + r: string | number; + isSearched?: boolean; + rotation?: string; +} +export interface SideEffect { + Value: number; +} +export interface RepairKit { + Resource: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts new file mode 100644 index 0000000..2c96af3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ILocationsBase.d.ts @@ -0,0 +1,10 @@ +export interface ILocationsBase { + locations: Locations; + paths: Path[]; +} +export interface Locations { +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ILootBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ILootBase.d.ts new file mode 100644 index 0000000..e4baac5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ILootBase.d.ts @@ -0,0 +1,64 @@ +import { Item } from "./IItem"; +export interface ILootBase { + staticAmmo: Record; + staticContainers: Record; + staticLoot: Record; +} +export interface IStaticAmmoDetails { + tpl: string; + relativeProbability: number; +} +export interface IStaticContainerDetails { + staticWeapons: IStaticWeaponProps[]; + staticContainers: IStaticContainerProps[]; + staticForced: IStaticForcedProps[]; +} +export interface IStaticWeaponProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: string; + Items: Item[]; +} +export interface IStaticContainerProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: StaticItem[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StaticItem { + _id: any; + _tpl: string; +} +export interface IStaticForcedProps { + containerId: string; + itemTpl: string; +} +export interface IStaticLootDetails { + itemcountDistribution: ItemCountDistribution[]; + itemDistribution: ItemDistribution[]; +} +export interface ItemCountDistribution { + count: number; + relativeProbability: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IQuest.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IQuest.d.ts new file mode 100644 index 0000000..e1fc888 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IQuest.d.ts @@ -0,0 +1,110 @@ +import { Item } from "./IItem"; +export interface IQuest { + QuestName: string; + _id: string; + canShowNotificationsInGame: boolean; + conditions: Conditions; + description: string; + failMessageText: string; + name: string; + note: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + startedMessageText: string; + successMessageText: string; + templateId: string; + rewards: Rewards; + status: string; + KeyQuest: boolean; + changeQuestMessageText: string; +} +export interface Conditions { + Started: AvailableForConditions[]; + AvailableForFinish: AvailableForConditions[]; + AvailableForStart: AvailableForConditions[]; + Success: AvailableForConditions[]; + Fail: AvailableForConditions[]; +} +export interface AvailableForConditions { + _parent: string; + _props: AvailableForProps; + dynamicLocale: boolean; +} +export interface AvailableForProps { + id: string; + index: number; + parentId: string; + dynamicLocale: boolean; + value?: number; + compareMethod?: string; + visibilityConditions?: VisibilityCondition[]; + target?: string | string[]; + status?: number[]; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; +} +export interface AvailableForCounter { + id: string; + conditions: CounterCondition[]; +} +export interface CounterCondition { + _parent: string; + _props: CounterProps; +} +export interface CounterProps { + id: string; + target: string[] | string; + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; +} +export interface DaytimeCounter { + from: number; + to: number; +} +export interface VisibilityCondition { + id: string; + value: number; + dynamicLocale: boolean; + oneSessionOnly: boolean; +} +export interface Rewards { + AvailableForStart: Reward[]; + AvailableForFinish: Reward[]; + Started: Reward[]; + Success: Reward[]; + Fail: Reward[]; + FailRestartable: Reward[]; + Expired: Reward[]; +} +export interface Reward { + value?: string; + id: string; + type: string; + index: number; + target?: string; + items?: Item[]; + loyaltyLevel?: number; + traderId?: string; + unknown?: boolean; + findInRaid?: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts new file mode 100644 index 0000000..e23ec73 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/IRepeatableQuests.d.ts @@ -0,0 +1,219 @@ +import { Item } from "./IItem"; +export interface IReward { + index: number; + type: string; + value: number; + target?: string; + items?: Item[]; +} +export interface IRepeatableQuestDatabase { + templates: ITemplates; + rewards: IRewardOptions; + data: IOptions; + samples: ISampleQuests[]; +} +export interface ITemplates { + Elimination: IRepeatableQuest; + Completion: IRepeatableQuest; + Exploration: IRepeatableQuest; +} +export interface IPmcDataRepeatableQuest { + id?: string; + name: string; + activeQuests: IRepeatableQuest[]; + inactiveQuests: IRepeatableQuest[]; + endTime: number; + changeRequirement: TChangeRequirementRecord; +} +export declare type TChangeRequirementRecord = Record; +export interface IChangeRequirement { + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IChangeCost { + templateId: string; + count: number; +} +export interface IRepeatableQuest { + _id: any; + traderId: string; + location: any; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + changeQuestMessageText: string; + templateId: string; + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IRewards { + Started: IReward[]; + Success: IReward[]; + Fail: IReward[]; +} +export interface IConditions { + AvailableForStart: any[]; + AvailableForFinish: IAvailableFor[]; + Fail: any[]; +} +export interface IAvailableFor { + _props: IAvailableForProps; + _parent: string; + dynamicLocale: boolean; +} +export interface IAvailableForProps { + id: string; + parentId: string; + dynamicLocale: boolean; + index: number; + visibilityConditions: IVisibilityCondition[]; + value: number; +} +export interface IVisibilityCondition { + id: string; + oneSessionOnly: boolean; + value: number; + index: number; + dynamicLocale: boolean; +} +export interface IAvailableForPropsCounter extends IAvailableForProps { + type: string; + oneSessionOnly: boolean; + doNotResetIfCounterCompleted: boolean; + counter: ICounter; +} +export interface ICounter { + id: string; + conditions: ICondition[]; +} +export interface ICondition { + _props: IConditionProps; + _parent: string; +} +export interface IConditionProps { + id: string; + dynamicLocale: boolean; +} +export interface IElimination extends IRepeatableQuest { + conditions: IEliminationConditions; +} +export interface IEliminationConditions extends IConditions { + AvailableForFinish: IEliminationAvailableFor[]; +} +export interface IEliminationAvailableFor extends IAvailableFor { + _props: IEliminationAvailableForProps; +} +export interface IEliminationAvailableForProps extends IAvailableForPropsCounter { + counter: IEliminationCounter; +} +export interface IEliminationCounter extends ICounter { + conditions: IEliminationCondition[]; +} +export interface IEliminationCondition extends ICondition { + _props: ILocationConditionProps | IKillConditionProps; +} +export interface IExploration extends IRepeatableQuest { + conditions: IExplorationConditions; +} +export interface IExplorationConditions extends IConditions { + AvailableForFinish: IExplorationAvailableFor[]; +} +export interface IExplorationAvailableFor extends IAvailableFor { + _props: IExplorationAvailableForProps; +} +export interface IExplorationAvailableForProps extends IAvailableForPropsCounter { + counter: IExplorationCounter; +} +export interface IExplorationCounter extends ICounter { + conditions: IExplorationCondition[]; +} +export interface IExplorationCondition extends ICondition { + _props: ILocationConditionProps | IExitStatusConditionProps | IExitNameConditionProps; +} +export interface ICompletion extends IRepeatableQuest { + conditions: ICompletionConditions; +} +export interface ICompletionConditions extends IConditions { + AvailableForFinish: ICompletionAvailableFor[]; +} +export interface ICompletionAvailableFor extends IAvailableFor { + _props: ICompletionAvailableForProps; +} +export interface ICompletionAvailableForProps extends IAvailableForProps { + target: string[]; + minDurability: number; + maxDurability: number; + dogtagLevel: number; + onlyFoundInRaid: boolean; +} +export interface ILocationConditionProps extends IConditionProps { + target: string[]; +} +export interface IKillConditionProps extends IConditionProps { + target: string; + value: number; + savageRole?: string[]; + bodyPart?: string[]; + distance?: IDistanceCheck; +} +export interface IDistanceCheck { + compareMethod: string; + value: number; +} +export interface IExitStatusConditionProps extends IConditionProps { + status: string[]; +} +export interface IExitNameConditionProps extends IConditionProps { + exitName: string; +} +export interface IRewardOptions { + itemsBlacklist: string[]; +} +export interface IOptions { + Completion: ICompletionFilter; +} +export interface ICompletionFilter { + itemsBlacklist: ItemsBlacklist[]; + itemsWhitelist: ItemsWhitelist[]; +} +export interface ItemsBlacklist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ItemsWhitelist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ISampleQuests { + _id: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + templateId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts new file mode 100644 index 0000000..c2ba762 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ITemplateItem.d.ts @@ -0,0 +1,401 @@ +export interface ITemplateItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Weight: number; + BackgroundColor: string; + Width: number; + Height: number; + StackMaxSize: number; + Rarity?: string; + SpawnChance?: number; + CreditsPrice?: number; + ItemSound: string; + Prefab: Prefab; + UsePrefab: Prefab; + StackObjectsCount: number; + NotShownInSlot: boolean; + ExaminedByDefault: boolean; + ExamineTime: number; + IsUndiscardable: boolean; + IsUnsaleable: boolean; + IsUnbuyable: boolean; + IsUngivable: boolean; + IsLockedafterEquip: boolean; + QuestItem: boolean; + LootExperience: number; + ExamineExperience: number; + HideEntrails: boolean; + RepairCost: number; + RepairSpeed: number; + ExtraSizeLeft: number; + ExtraSizeRight: number; + ExtraSizeUp: number; + ExtraSizeDown: number; + ExtraSizeForceAdd: boolean; + MergesWithChildren: boolean; + CanSellOnRagfair: boolean; + CanRequireOnRagfair: boolean; + ConflictingItems: string[]; + DiscardLimit: number; + Unlootable: boolean; + UnlootableFromSlot: string; + UnlootableFromSide: string[]; + AnimationVariantsNumber: number; + DiscardingBlock: boolean; + RagFairCommissionModifier: number; + IsAlwaysAvailableForInsurance: boolean; + Grids: Grid[]; + Slots: Slot[]; + CanPutIntoDuringTheRaid: boolean; + CantRemoveFromSlotsDuringRaid: string[]; + weapClass: string; + weapUseType: string; + ammoCaliber: string; + Durability: number; + MaxDurability: number; + OperatingResource: number; + RepairComplexity: number; + durabSpawnMin: number; + durabSpawnMax: number; + isFastReload: boolean; + RecoilForceUp: number; + RecoilForceBack: number; + Convergence: number; + RecoilAngle: number; + weapFireType: string[]; + RecolDispersion: number; + SingleFireRate: number; + CanQueueSecondShot: boolean; + bFirerate: number; + Ergonomics: number; + Velocity: number; + bEffDist: number; + bHearDist: number; + isChamberLoad: boolean; + chamberAmmoCount: number; + isBoltCatch: boolean; + defMagType: string; + defAmmo: string; + AdjustCollimatorsToTrajectory: boolean; + shotgunDispersion: number; + Chambers: Chamber[]; + CameraRecoil: number; + CameraSnap: number; + ReloadMode: string; + CenterOfImpact: number; + AimPlane: number; + DeviationCurve: number; + DeviationMax: number; + Foldable: boolean; + Retractable: boolean; + TacticalReloadStiffnes: Xyz; + TacticalReloadFixation: number; + RecoilCenter: Xyz; + RotationCenter: Xyz; + RotationCenterNoStock: Xyz; + SizeReduceRight: number; + FoldedSlot: string; + CompactHandling: boolean; + SightingRange: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; + IronSightRange: number; + MustBoltBeOpennedForExternalReload: boolean; + MustBoltBeOpennedForInternalReload: boolean; + BoltAction: boolean; + HipAccuracyRestorationDelay: number; + HipAccuracyRestorationSpeed: number; + HipInnaccuracyGain: number; + ManualBoltCatch: boolean; + BurstShotsCount: number; + BaseMalfunctionChance: number; + AllowJam: boolean; + AllowFeed: boolean; + AllowMisfire: boolean; + AllowSlide: boolean; + DurabilityBurnRatio: number; + HeatFactorGun: number; + CoolFactorGun: number; + CoolFactorGunMods: number; + HeatFactorByShot: number; + AllowOverheat: boolean; + DoubleActionAccuracyPenalty: number; + RecoilPosZMult: number; + ShotgunDispersion: number; + StackMinRandom: number; + StackMaxRandom: number; + StackSlots: StackSlot[]; + SearchSound: string; + BlocksArmorVest: boolean; + RigLayoutName: string; + armorZone: string[]; + armorClass: number; + speedPenaltyPercent: number; + mousePenalty: number; + weaponErgonomicPenalty: number; + BluntThroughput: number; + ArmorMaterial: string; + medUseTime: number; + medEffectType: string; + MaxHpResource: number; + hpResourceRate: number; + StimulatorBuffs: string; + effects_health: EffectsHealth; + effects_damage: EffectsDamage; + knifeHitDelay: number; + knifeHitSlashRate: number; + knifeHitStabRate: number; + knifeHitRadius: number; + knifeHitSlashDam: number; + knifeHitStabDam: number; + knifeDurab: number; + PrimaryDistance: number; + SecondryDistance: number; + SlashPenetration: number; + StabPenetration: number; + PrimaryConsumption: number; + SecondryConsumption: number; + DeflectionConsumption: number; + MaxResource: number; + AppliedTrunkRotation: Xyz; + AppliedHeadRotation: Xyz; + DisplayOnModel: boolean; + AdditionalAnimationLayer: number; + StaminaBurnRate: number; + ColliderScaleMultiplier: Xyz; + ammoType: string; + InitialSpeed: number; + BallisticCoeficient: number; + BulletMassGram: number; + BulletDiameterMilimeters: number; + Damage: number; + ammoAccr: number; + ammoRec: number; + ammoDist: number; + buckshotBullets: number; + PenetrationPower: number; + PenetrationPowerDiviation: number; + ammoHear: number; + ammoSfx: string; + MisfireChance: number; + MinFragmentsCount: number; + MaxFragmentsCount: number; + ammoShiftChance: number; + casingName: string; + casingEjectPower: number; + casingMass: number; + casingSounds: string; + ProjectileCount: number; + PenetrationChance: number; + RicochetChance: number; + FragmentationChance: number; + Deterioration: number; + SpeedRetardation: number; + Tracer: boolean; + TracerColor: string; + TracerDistance: number; + ArmorDamage: number; + Caliber: string; + StaminaBurnPerDamage: number; + HeavyBleedingDelta: number; + LightBleedingDelta: number; + ShowBullet: boolean; + HasGrenaderComponent: boolean; + FuzeArmTimeSec: number; + ExplosionStrength: number; + MinExplosionDistance: number; + MaxExplosionDistance: number; + FragmentsCount: number; + FragmentType: string; + ShowHitEffectOnExplode: boolean; + ExplosionType: string; + AmmoLifeTimeSec: number; + Contusion: Contusion; + ArmorDistanceDistanceDamage: Xyz; + Blindness: Xyz; + IsLightAndSoundShot: boolean; + LightAndSoundShotAngle: number; + LightAndSoundShotSelfContusionTime: number; + LightAndSoundShotSelfContusionStrength: number; + MalfMisfireChance: number; + DurabilityBurnModificator: number; + HeatFactor: number; + MalfFeedChance: number; + Accuracy: number; + Recoil: number; + Loudness: number; + EffectiveDistance: number; + RaidModdable: boolean; + ToolModdable: boolean; + BlocksFolding: boolean; + BlocksCollapsible: boolean; + IsAnimated: boolean; + HasShoulderContact: boolean; + DoubleActionAccuracyPenaltyMult: number; + magAnimationIndex: number; + Cartridges: Cartridge[]; + CanFast: boolean; + CanHit: boolean; + CanAdmin: boolean; + LoadUnloadModifier: number; + CheckTimeModifier: number; + CheckOverride: number; + ReloadMagType: string; + VisibleAmmoRangesString: string; + MalfunctionChance: number; + TagColor: number; + TagName: string; + MaximumNumberOfUsage: number; + CustomAimPlane: string; + sightModType: string; + aimingSensitivity: number; + SightModesCount: number; + OpticCalibrationDistances: number[]; + ScopesCount: number; + AimSensitivity: number[][]; + ModesCount: number[]; + Zooms: number[][]; + CalibrationDistances: number[][]; + Intensity: number; + Mask: string; + MaskSize: number; + NoiseIntensity: number; + NoiseScale: number; + Color: Color; + DiffuseIntensity: number; + HasHinge: boolean; + Resource?: number; + CoolFactor?: number; + foodUseTime?: number; + foodEffectType?: string; + MaxRepairResource: number; + RepairQuality: number; + RepairType: string; + TargetItemFilter: string[]; + apResource: number; + krResource: number; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Grid { + _name: string; + _id: string; + _parent: string; + _props: GridProps; + _proto: string; +} +export interface GridProps { + filters: GridFilter[]; + cellsH: number; + cellsV: number; + minCount: number; + maxCount: number; + maxWeight: number; + isSortingTable: boolean; +} +export interface GridFilter { + Filter: string[]; + ExcludedFilter: string[]; +} +export interface Slot { + _name: string; + _id: string; + _parent: string; + _props: SlotProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface SlotProps { + filters: Filter[]; +} +export interface Chamber { + _name: string; + _id: string; + _parent: string; + _props: ChamberProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface ChamberProps { + filters: FilterProps[]; +} +export interface FilterProps { + Filter: string[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StackSlot { + _name?: string; + _id: string; + _sptTpl: string; + parent: string; + location: any; + slotId: string; + _max_count: number; + _props?: StackSlotProps; + _proto?: string; + upd: any; +} +export interface StackSlotProps { + filters: Filter[]; +} +export interface EffectsHealth { + Hydration: Hydration; +} +export interface Hydration { + value: number; +} +export interface EffectsDamage { + Pain: Pain; + Contusion: Contusion; +} +export interface Pain { + delay: number; + duration: number; + fadeOut: number; +} +export interface Contusion { + delay: number; + duration: number; + fadeOut: number; +} +export interface Cartridge { + _name: string; + _id: string; + _parent: string; + _max_count: number; + _props: CartridgeProps; + _proto: string; +} +export interface CartridgeProps { + filters: Filter[]; +} +export interface Filter { + Shift?: number; + Filter: string[]; + AnimationIndex?: number; +} +export interface Color { + r: number; + g: number; + b: number; + a: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ITrader.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ITrader.d.ts new file mode 100644 index 0000000..f0fe2b5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/common/tables/ITrader.d.ts @@ -0,0 +1,90 @@ +import { Item } from "./IItem"; +export interface ITrader { + assort: ITraderAssort; + base: ITraderBase; + dialogue?: Record; + questassort: Record>; + suits?: ISuit[]; +} +export interface ITraderBase { + refreshAssort: boolean; + _id: string; + avatar: string; + balance_dol: number; + balance_eur: number; + balance_rub: number; + buyer_up: boolean; + currency: string; + customization_seller: boolean; + discount: number; + discount_end: number; + gridHeight: number; + insurance: Insurance; + location: string; + loyaltyLevels: LoyaltyLevel[]; + medic: boolean; + name: string; + nextResupply: number; + nickname: string; + repair: Repair; + sell_category: string[]; + surname: string; + unlockedByDefault: boolean; +} +export interface Insurance { + availability: boolean; + excluded_category: string[]; + max_return_hour: number; + max_storage_time: number; + min_payment: number; + min_return_hour: number; +} +export interface LoyaltyLevel { + buy_price_coef: number; + exchange_price_coef: number; + heal_price_coef: number; + insurance_price_coef: number; + minLevel: number; + minSalesSum: number; + minStanding: number; + repair_price_coef: number; +} +export interface Repair { + availability: boolean; + currency: string; + currency_coefficient: number; + excluded_category: string[]; + excluded_id_list: any[]; + quality: string; +} +export interface ITraderAssort { + nextResupply?: number; + items: Item[]; + barter_scheme: Record; + loyal_level_items: Record; +} +export interface IBarterScheme { + count: number; + _tpl: string; + onlyFunctional?: boolean; +} +export interface ISuit { + _id: string; + tid: string; + suiteId: string; + isActive: boolean; + requirements: Requirements; +} +export interface Requirements { + loyaltyLevel: number; + profileLevel: number; + standing: number; + skillRequirements: string[]; + questRequirements: string[]; + itemRequirements: ItemRequirement[]; +} +export interface ItemRequirement { + count: number; + _tpl: string; + onlyFunctional: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts new file mode 100644 index 0000000..d19b70d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/customization/IBuyClothingRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IBuyClothingRequestData { + Action: "CustomizationBuy"; + offer: string; + items: ClothingItem[]; +} +export interface ClothingItem { + del: boolean; + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts new file mode 100644 index 0000000..122d9cf --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/customization/IWearClothingRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IWearClothingRequestData { + Action: "CustomizationWear"; + suites: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts new file mode 100644 index 0000000..9c326ac --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IFriendRequestData { + to: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts new file mode 100644 index 0000000..53d8289 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetAllAttachmentsRequestData { + dialogId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts new file mode 100644 index 0000000..076d414 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts @@ -0,0 +1,6 @@ +import { Message } from "../profile/IAkiProfile"; +export interface IGetAllAttachmentsResponse { + messages: Message[]; + profiles: any[]; + hasMessagesWithRewards: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts new file mode 100644 index 0000000..8f1beac --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetChatServerListRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetChatServerListRequestData { + VersionId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts new file mode 100644 index 0000000..1d0c0e8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetFriendListDataResponse.d.ts @@ -0,0 +1,16 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IGetFriendListDataResponse { + Friends: Friend[]; + Ignore: any[]; + InIgnoreList: any[]; +} +export interface Friend { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; + MemberCategory: MemberCategory; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts new file mode 100644 index 0000000..eed84b1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMailDialogInfoRequestData { + dialogId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts new file mode 100644 index 0000000..f8fbf5d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMailDialogListRequestData { + limit: number; + offset: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts new file mode 100644 index 0000000..43d416e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface IGetMailDialogViewRequestData { + type: MessageType; + dialogId: string; + limit: number; + time: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts new file mode 100644 index 0000000..4f8b946 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../common/IPmcData"; +import { Message } from "../profile/IAkiProfile"; +export interface IGetMailDialogViewResponseData { + messages: Message[]; + profiles: IPmcData[]; + hasMessagesWithRewards: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts new file mode 100644 index 0000000..57b8a00 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IPinDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IPinDialogRequestData { + dialogId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts new file mode 100644 index 0000000..874b828 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/IRemoveDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IRemoveDialogRequestData { + dialogId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts new file mode 100644 index 0000000..dd79deb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/ISendMessageRequest.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface ISendMessageRequest { + dialogId: string; + type: MessageType; + text: string; + replyTo: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts new file mode 100644 index 0000000..2076232 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/dialog/ISetDialogReadRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISetDialogReadRequestData { + dialogs: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IGameConfigResponse.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IGameConfigResponse.d.ts new file mode 100644 index 0000000..eb37a39 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IGameConfigResponse.d.ts @@ -0,0 +1,19 @@ +export interface IGameConfigResponse { + aid: string; + lang: string; + languages: Record; + ndaFree: boolean; + taxonomy: number; + activeProfileId: string; + backend: Backend; + utc_time: number; + totalInGame: number; + reportAvailable: boolean; + twitchEventMember: boolean; +} +export interface Backend { + Trading: string; + Messaging: string; + Main: string; + RagFair: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts new file mode 100644 index 0000000..a3ecad9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IGameEmptyCrcRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGameEmptyCrcRequestData { + crc: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts new file mode 100644 index 0000000..0aa0fed --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/game/IVersionValidateRequestData.d.ts @@ -0,0 +1,11 @@ +export interface IVersionValidateRequestData { + version: Version; + develop: boolean; +} +export interface Version { + major: string; + minor: string; + game: string; + backend: string; + taxonomy: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts new file mode 100644 index 0000000..7fb80a8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IHealthTreatmentRequestData.d.ts @@ -0,0 +1,29 @@ +export interface IHealthTreatmentRequestData { + Action: "RestoreHealth"; + trader: string; + items: Item[]; + difference: Difference; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} +export interface Difference { + BodyParts: BodyParts; + Energy: number; + Hydration: number; +} +export interface BodyParts { + Head: BodyPart; + Chest: BodyPart; + Stomach: BodyPart; + LeftArm: BodyPart; + RightArm: BodyPart; + LeftLeg: BodyPart; + RightLeg: BodyPart; +} +export interface BodyPart { + Health: number; + Effects: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts new file mode 100644 index 0000000..8e2b6c3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IOffraidEatRequestData.d.ts @@ -0,0 +1,7 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidEatRequestData extends IBaseInteractionRequestData { + Action: "Eat"; + item: string; + count: number; + time: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts new file mode 100644 index 0000000..c242300 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/IOffraidHealRequestData.d.ts @@ -0,0 +1,18 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidHealRequestData extends IBaseInteractionRequestData { + Action: "Heal"; + item: string; + part: BodyPart; + count: number; + time: number; +} +export declare enum BodyPart { + Head = 0, + Chest = 1, + Stomach = 2, + LeftArm = 3, + RightArm = 4, + LeftLeg = 5, + RightLeg = 6, + Common = 7 +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts new file mode 100644 index 0000000..20e32f6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/health/ISyncHealthRequestData.d.ts @@ -0,0 +1,21 @@ +export interface ISyncHealthRequestData { + Health: Health; + IsAlive: boolean; + Hydration?: number; + Energy?: number; + Temperature?: number; +} +export interface Health { + Head?: BodyPartHealth; + Chest?: BodyPartHealth; + Stomach?: BodyPartHealth; + LeftArm?: BodyPartHealth; + RightArm?: BodyPartHealth; + LeftLeg?: BodyPartHealth; + RightLeg?: BodyPartHealth; +} +export interface BodyPartHealth { + Maximum: number; + Current: number; + Effects: Record; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts new file mode 100644 index 0000000..10f851b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/HideoutAreasEnum.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreasEnum { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..8583e8d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface HideoutUpgradeCompleteRequestData { + Action: string; + areaType: number; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutArea.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutArea.d.ts new file mode 100644 index 0000000..d9fd2bf --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutArea.d.ts @@ -0,0 +1,40 @@ +export interface IHideoutArea { + _id: string; + type: number; + enabled: boolean; + needsFuel: boolean; + takeFromSlotLocked: boolean; + craftGivesExp: boolean; + stages: Record; +} +export interface Stage { + requirements: Requirement[]; + bonuses: StageBonus[]; + slots: number; + constructionTime: number; + description: string; +} +export interface Requirement { + areaType?: number; + requiredLevel?: number; + type: string; + templateId?: string; + count?: number; + isFunctional?: boolean; + traderId?: string; + loyaltyLevel?: number; + skillName?: string; + skillLevel?: number; +} +export interface StageBonus { + value: number; + passive: boolean; + production: boolean; + visible: boolean; + skillType?: string; + type: string; + filter?: string[]; + icon?: string; + id?: string; + templateId?: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts new file mode 100644 index 0000000..dba83eb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutContinousProductionStartRequestData { + Action: "HideoutContinuousProductionStart"; + recipeId: string; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts new file mode 100644 index 0000000..ce878be --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutProduction.d.ts @@ -0,0 +1,20 @@ +export interface IHideoutProduction { + _id: string; + areaType: number; + requirements: Requirement[]; + productionTime: number; + boosters: any; + endProduct: string; + continuous: boolean; + count: number; + productionLimitCount: number; +} +export interface Requirement { + templateId?: string; + count?: number; + isFunctional?: boolean; + type: string; + areaType?: number; + requiredLevel?: number; + resource?: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts new file mode 100644 index 0000000..8326c55 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutPutItemInRequestData { + Action: "HideoutPutItemsInAreaSlots"; + areaType: number; + items: Record; + timestamp: number; +} +export interface ItemDetails { + count: number; + id: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts new file mode 100644 index 0000000..25abcf3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutScavCase.d.ts @@ -0,0 +1,21 @@ +export interface IHideoutScavCase { + _id: string; + ProductionTime: number; + Requirements: Requirement[]; + EndProducts: EndProducts; +} +export interface Requirement { + templateId: string; + count: number; + isFunctional: boolean; + type: string; +} +export interface EndProducts { + Common: MinMax; + Rare: MinMax; + Superrare: MinMax; +} +export interface MinMax { + min: string; + max: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts new file mode 100644 index 0000000..72fda86 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts @@ -0,0 +1,15 @@ +export interface IHideoutScavCaseStartRequestData { + Action: "HideoutScavCaseProductionStart"; + recipeId: string; + items: HideoutItem[]; + tools: Tool[]; + timestamp: number; +} +export interface HideoutItem { + id: string; + count: number; +} +export interface Tool { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts new file mode 100644 index 0000000..8e45939 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutSettingsBase.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutSettingsBase { + generatorSpeedWithoutFuel: number; + generatorFuelFlowRate: number; + airFilterUnitFlowRate: number; + gpuBoostRate: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts new file mode 100644 index 0000000..1ed542a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutSingleProductionStartRequestData { + Action: "HideoutSingleProductionStart"; + recipeId: string; + items: Item[]; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts new file mode 100644 index 0000000..83a740a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutTakeItemOutRequestData { + Action: "HideoutTakeItemsFromAreaSlots"; + areaType: number; + slots: number[]; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts new file mode 100644 index 0000000..a6847ef --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutTakeProductionRequestData { + Action: "HideoutTakeProduction"; + recipeId: string; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts new file mode 100644 index 0000000..cdea513 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutToggleAreaRequestData { + Action: "HideoutToggleArea"; + areaType: number; + enabled: boolean; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..545311e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutUpgradeCompleteRequestData { + Action: "HideoutUpgradeComplete"; + areaType: number; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts new file mode 100644 index 0000000..dfbfdca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutUpgradeRequestData { + Action: "HideoutUpgrade"; + areaType: number; + items: HideoutItem[]; + timestamp: number; +} +export interface HideoutItem { + count: number; + id: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts new file mode 100644 index 0000000..b5dc5c1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/httpResponse/IGetBodyResponseData.d.ts @@ -0,0 +1,5 @@ +export interface IGetBodyResponseData { + err: number; + errmsg: any; + (data: Type): Type; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts new file mode 100644 index 0000000..a3ae838 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/httpResponse/INullResponseData.d.ts @@ -0,0 +1,5 @@ +export interface INullResponseData { + err: number; + errmsg: any; + data: null; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts new file mode 100644 index 0000000..e2d9cf1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IRegisterPlayerRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts new file mode 100644 index 0000000..6930261 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inRaid/ISaveProgressRequestData.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../common/IPmcData"; +import { ISyncHealthRequestData } from "../health/ISyncHealthRequestData"; +export interface ISaveProgressRequestData { + exit: string; + profile: IPmcData; + isPlayerScav: boolean; + health: ISyncHealthRequestData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts new file mode 100644 index 0000000..0e32e96 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetInsuranceCostRequestData { + traders: string[]; + items: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts new file mode 100644 index 0000000..f657bb7 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/insurance/IInsureRequestData.d.ts @@ -0,0 +1,6 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInsureRequestData extends IBaseInteractionRequestData { + Action: "Insure"; + tid: string; + items: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts new file mode 100644 index 0000000..53db97a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IAddItemRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IAddItemRequestData { + tid: string; + items: any[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts new file mode 100644 index 0000000..462e0de --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryAddRequestData.d.ts @@ -0,0 +1,6 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryAddRequestData extends IInventoryBaseActionRequestData { + Action: "Add"; + item: string; + container: Container; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts new file mode 100644 index 0000000..b45e459 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts @@ -0,0 +1,27 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInventoryBaseActionRequestData extends IBaseInteractionRequestData { +} +export interface To { + id: string; + container: string; + location?: ToLocation | number; +} +export interface ToLocation { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} +export interface Container { + id: string; + container: string; + location: Location | number; +} +export interface Location { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts new file mode 100644 index 0000000..ff35066 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryBindRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryBindRequestData extends IInventoryBaseActionRequestData { + Action: "Bind"; + item: string; + index: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts new file mode 100644 index 0000000..1e1ecef --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts @@ -0,0 +1,12 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryCreateMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "CreateMapMarker"; + item: string; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts new file mode 100644 index 0000000..0657e1b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryDeleteMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "DeleteMapMarker"; + item: string; + X: number; + Y: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts new file mode 100644 index 0000000..e2857e1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts @@ -0,0 +1,14 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryEditMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "EditMapMarker"; + item: string; + X: number; + Y: number; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts new file mode 100644 index 0000000..614711f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryExamineRequestData.d.ts @@ -0,0 +1,10 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryExamineRequestData extends IInventoryBaseActionRequestData { + Action: "Examine"; + item: string; + fromOwner: IFromOwner; +} +export interface IFromOwner { + id: string; + type: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts new file mode 100644 index 0000000..a5fb2a1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryFoldRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryFoldRequestData extends IInventoryBaseActionRequestData { + Action: "Fold"; + item: string; + value: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts new file mode 100644 index 0000000..3fcfa35 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryMergeRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMergeRequestData extends IInventoryBaseActionRequestData { + Action: "Merge"; + item: string; + with: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts new file mode 100644 index 0000000..b767908 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryMoveRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMoveRequestData extends IInventoryBaseActionRequestData { + Action: "Move"; + item: string; + to: To; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts new file mode 100644 index 0000000..5487b20 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryReadEncyclopediaRequestData extends IInventoryBaseActionRequestData { + Action: "ReadEncyclopedia"; + ids: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts new file mode 100644 index 0000000..07d1a52 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryRemoveRequestData extends IInventoryBaseActionRequestData { + Action: "Remove"; + item: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts new file mode 100644 index 0000000..a0b7928 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySortRequestData.d.ts @@ -0,0 +1,20 @@ +import { Upd } from "../common/tables/IItem"; +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySortRequestData extends IInventoryBaseActionRequestData { + Action: "ApplyInventoryChanges"; + changedItems: ChangedItem[]; +} +export interface ChangedItem { + _id: string; + _tpl: string; + parentId: string; + slotId: string; + location: Location; + upd: Upd; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts new file mode 100644 index 0000000..730ae71 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySplitRequestData.d.ts @@ -0,0 +1,7 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySplitRequestData extends IInventoryBaseActionRequestData { + Action: "Split"; + item: string; + container: Container; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts new file mode 100644 index 0000000..1b0464d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventorySwapRequestData.d.ts @@ -0,0 +1,11 @@ +import { OwnerInfo } from "../common/request/IBaseInteractionRequestData"; +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventorySwapRequestData extends IInventoryBaseActionRequestData { + Action: "Swap"; + item: string; + to: To; + item2: string; + to2: To; + fromOwner2: OwnerInfo; + toOwner2: OwnerInfo; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts new file mode 100644 index 0000000..f021661 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryTagRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTagRequestData extends IInventoryBaseActionRequestData { + Action: "Tag"; + item: string; + TagName: string; + TagColor: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts new file mode 100644 index 0000000..0955440 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryToggleRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryToggleRequestData extends IInventoryBaseActionRequestData { + Action: "Toggle"; + item: string; + value: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts new file mode 100644 index 0000000..cf4391b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/inventory/IInventoryTransferRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTransferRequestData extends IInventoryBaseActionRequestData { + Action: "Transfer"; + item: string; + with: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts new file mode 100644 index 0000000..689fe75 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts @@ -0,0 +1,4 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IEmptyItemEventRouterResponse extends IItemEventRouterBase { + profileChanges: ""; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts new file mode 100644 index 0000000..31e62fe --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterBase.d.ts @@ -0,0 +1,67 @@ +import { Skills } from "../common/IPmcData"; +import { Item, Upd } from "../common/tables/IItem"; +import { IQuest } from "../common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../common/tables/IRepeatableQuests"; +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +export interface IItemEventRouterBase { + warnings: Warning[]; + profileChanges: TProfileChanges | ""; +} +export declare type TProfileChanges = Record; +export interface Warning { + index: number; + err: string; + errmsg: string; +} +export interface ProfileChange { + _id: string; + experience: number; + quests: IQuest[]; + ragFairOffers: IRagfairOffer[]; + builds: BuildChange[]; + items: ItemChanges; + production: Record; + skills: Skills; + traderRelations: Record; + repeatableQuests?: IPmcDataRepeatableQuest[]; +} +export interface BuildChange { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface ItemChanges { + new: Product[]; + change: Product[]; + del: Product[]; +} +export interface Production { + Progress: number; + StartTimestamp: number; + ProductionTime: number; + inProgress: boolean; + RecipeId: string; + Products: Product[]; +} +export interface Product { + _id: string; + _tpl?: string; + parentId?: string; + slotId?: string; + location?: ItemChangeLocation; + upd?: Upd; +} +export interface ItemChangeLocation { + x: number; + y: number; + r: number; + isSearched?: boolean; +} +export interface TraderRelations { + salesSum?: number; + standing?: number; + loyalty?: number; + unlocked?: boolean; + disabled?: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts new file mode 100644 index 0000000..515b49a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts @@ -0,0 +1,21 @@ +export interface IItemEventRouterRequest { + data: Daum[]; + tm: number; + reload: number; +} +export interface Daum { + Action: string; + item: string; + to: To; +} +export interface To { + id: string; + container: string; + location?: Location; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts new file mode 100644 index 0000000..72a9b5b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts @@ -0,0 +1,3 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IItemEventRouterResponse extends IItemEventRouterBase { +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts new file mode 100644 index 0000000..f0a7838 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IChangeRequestData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IChangeRequestData extends ILoginRequestData { + change: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts new file mode 100644 index 0000000..a14c7c9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMiniProfileRequestData { + username: string; + password: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts new file mode 100644 index 0000000..e965813 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/ILoginRequestData.d.ts @@ -0,0 +1,4 @@ +export interface ILoginRequestData { + username: string; + password: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IMiniProfile.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IMiniProfile.d.ts new file mode 100644 index 0000000..c12661a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IMiniProfile.d.ts @@ -0,0 +1,14 @@ +export interface IMiniProfile { + username: string; + nickname: string; + side: string; + currlvl: number; + currexp: number; + prevexp: number; + nextlvl: number; + maxlvl: number; + akiData: AkiData; +} +export interface AkiData { + version: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IRegisterData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IRegisterData.d.ts new file mode 100644 index 0000000..61a8bbe --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IRegisterData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IRegisterData extends ILoginRequestData { + edition: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts new file mode 100644 index 0000000..d31c9ac --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/launcher/IRemoveProfileData.d.ts @@ -0,0 +1,2 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export declare type IRemoveProfileData = ILoginRequestData; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts new file mode 100644 index 0000000..04e84d9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/location/IGetLocationRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IGetLocationRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts new file mode 100644 index 0000000..811e9a2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IEndOfflineRaidRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IEndOfflineRaidRequestData { + crc: number; + exitStatus: string; + exitName: any; + raidSeconds: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts new file mode 100644 index 0000000..86b5bbd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IGetProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetProfileRequestData { + profileId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts new file mode 100644 index 0000000..84bccc8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/match/IStartOffineRaidRequestData.d.ts @@ -0,0 +1,27 @@ +export interface IStartOfflineRaidRequestData { + locationName: string; + entryPoint: string; + startTime: number; + dateTime: string; + gameSettings: GameSettings; +} +export interface GameSettings { + timeAndWeatherSettings: TimeAndWeatherSettings; + botsSettings: BotsSettings; + wavesSettings: WavesSettings; +} +export interface TimeAndWeatherSettings { + isRandomTime: boolean; + isRandomWeather: boolean; +} +export interface BotsSettings { + isEnabled: boolean; + isScavWars: boolean; + botAmount: string; +} +export interface WavesSettings { + botDifficulty: string; + isBosses: boolean; + isTaggedAndCursed: boolean; + wavesBotAmount: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notes/INoteActionData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notes/INoteActionData.d.ts new file mode 100644 index 0000000..610657f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notes/INoteActionData.d.ts @@ -0,0 +1,10 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface INoteActionData extends IBaseInteractionRequestData { + Action: string; + index: number; + note: INote; +} +export interface INote { + Time: number; + Text: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notifier/INotifier.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notifier/INotifier.d.ts new file mode 100644 index 0000000..8c48260 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notifier/INotifier.d.ts @@ -0,0 +1,14 @@ +export interface INotifierChannel { + "server": string; + "channel_id": string; + "url": string; + "notifierServer": string; + "ws": string; +} +import { Message } from "../profile/IAkiProfile"; +export interface INotification { + type: "RagfairOfferSold" | "new_message" | "ping"; + eventId: string; + dialogId?: string; + message?: Message; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts new file mode 100644 index 0000000..2bc3d1e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/notifier/ISelectProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISelectProfileRequestData { + uid: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts new file mode 100644 index 0000000..dcd14a2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts @@ -0,0 +1,21 @@ +import { Skills } from "../common/IPmcData"; +export interface IPlayerIncrementSkillLevelRequestData { + _id: string; + experience: number; + quests: any[]; + ragFairOffers: any[]; + builds: any[]; + items: Items; + production: Production; + skills: Skills; + traderRelations: TraderRelations; +} +export interface Items { + new: any[]; + change: any[]; + del: any[]; +} +export interface Production { +} +export interface TraderRelations { +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts new file mode 100644 index 0000000..99c61f1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts @@ -0,0 +1,25 @@ +export interface IPresetBuildActionRequestData { + Action: string; + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Item { + _id: string; + _tpl: string; + upd?: Upd; + parentId?: string; + slotId?: string; +} +export interface Upd { + Repairable: Repairable; + FireMode: FireMode; +} +export interface Repairable { + MaxDurability: number; + Durability: number; +} +export interface FireMode { + FireMode: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IAkiProfile.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IAkiProfile.d.ts new file mode 100644 index 0000000..3e0b319 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IAkiProfile.d.ts @@ -0,0 +1,167 @@ +import { MessageType } from "../../enums/MessageType"; +import { IPmcData } from "../common/IPmcData"; +import { Item } from "../common/tables/IItem"; +export interface IAkiProfile { + info: Info; + characters: Characters; + suits: string[]; + weaponbuilds: WeaponBuild[]; + dialogues: Record; + aki: Aki; + vitality: Vitality; + inraid: Inraid; + insurance: Insurance[]; +} +export interface Info { + id: string; + username: string; + password: string; + wipe: boolean; + edition: string; +} +export interface Characters { + pmc: IPmcData; + scav: IPmcData; +} +export interface WeaponBuild { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Dialogue { + _id: string; + messages: Message[]; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface DialogueInfo { + _id: string; + type: MessageType; + message: MessagePreview; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface Message { + _id: string; + uid: string; + type: MessageType; + dt: number; + localDateTime: number; + UtcDateTime?: number; + Member?: IUpdatableChatMember; + templateId: string; + text?: string; + hasRewards: boolean; + rewardCollected: boolean; + items: Items; + maxStorageTime?: number; + systemData?: ISystemData; +} +export interface MessagePreview { + uid: string; + type: MessageType; + dt: number; + templateId: string; + text?: string; +} +export interface Items { + stash?: string; + data?: Item[]; +} +export interface ISystemData { + date?: string; + time?: string; + location?: string; + buyerNickname?: string; + soldItem?: string; + itemCount?: number; +} +export interface IUpdatableChatMember { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; + Ignored: boolean; + Banned: boolean; +} +export interface DateTime { + date: string; + time: string; +} +export interface Aki { + version: string; +} +export interface Vitality { + health: Health; + effects: Effects; +} +export interface Health { + Hydration: number; + Energy: number; + Temperature: number; + Head: number; + Chest: number; + Stomach: number; + LeftArm: number; + RightArm: number; + LeftLeg: number; + RightLeg: number; +} +export interface Effects { + Head: Head; + Chest: Chest; + Stomach: Stomach; + LeftArm: LeftArm; + RightArm: RightArm; + LeftLeg: LeftLeg; + RightLeg: RightLeg; +} +export interface Head { +} +export interface Chest { +} +export interface Stomach { +} +export interface LeftArm { + Fracture?: number; +} +export interface RightArm { + Fracture?: number; +} +export interface LeftLeg { + Fracture?: number; +} +export interface RightLeg { + Fracture?: number; +} +export interface Inraid { + location: string; + character: string; +} +export interface Insurance { + scheduledTime: number; + traderId: string; + messageContent: MessageContent; + items: Item[]; +} +export interface MessageContent { + ragfair?: MessageContentRagfair; + text?: string; + templateId: string; + type: MessageType; + maxStorageTime?: number; + systemData?: MessageContentData; +} +export interface MessageContentRagfair { + offerId: string; + count: number; + handbookId: string; +} +export interface MessageContentData { + date: string; + time: string; + location: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts new file mode 100644 index 0000000..4a61196 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeNicknameRequestData { + nickname: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts new file mode 100644 index 0000000..91058ce --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeVoiceRequestData { + voice: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts new file mode 100644 index 0000000..93cc656 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IProfileCreateRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IProfileCreateRequestData { + side: string; + nickname: string; + headId: string; + voiceId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts new file mode 100644 index 0000000..e63e386 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/ISearchFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISearchFriendRequestData { + nickname: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts new file mode 100644 index 0000000..96d88b2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/ISearchFriendResponse.d.ts @@ -0,0 +1,9 @@ +export interface ISearchFriendResponse { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts new file mode 100644 index 0000000..9cca7e7 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/profile/IValidateNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IValidateNicknameRequestData { + nickname: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts new file mode 100644 index 0000000..0e4821a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IAcceptQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IAcceptQuestRequestData { + Action: "QuestAccept"; + qid: string; + type: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts new file mode 100644 index 0000000..cc67404 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/ICompleteQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface ICompleteQuestRequestData { + Action: string; + qid: string; + removeExcessItems: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts new file mode 100644 index 0000000..63f10a8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IHandoverQuestRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHandoverQuestRequestData { + Action: "QuestHandover"; + qid: string; + conditionId: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts new file mode 100644 index 0000000..91f0b8c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IListQuestsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IListQuestsRequestData { + completed: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts new file mode 100644 index 0000000..015f58e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts @@ -0,0 +1,4 @@ +export interface IRepeatableQuestChangeRequest { + Action: "RepeatableQuestChange"; + qid: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts new file mode 100644 index 0000000..465ee02 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IAddOfferRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IAddOfferRequestData { + Action: string; + sellInOnePiece: boolean; + items: string[]; + requirements: Requirement[]; +} +export interface Requirement { + _tpl: string; + count: number; + level: number; + side: number; + onlyFunctional: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts new file mode 100644 index 0000000..2a4a876 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IExtendOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IExtendOfferRequestData { + offerId: string; + renewalTime: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts new file mode 100644 index 0000000..676322a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetItemPriceResult.d.ts @@ -0,0 +1,5 @@ +export interface IGetItemPriceResult { + avg: number; + min: number; + max: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts new file mode 100644 index 0000000..00f8f17 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMarketPriceRequestData { + templateId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts new file mode 100644 index 0000000..1c11422 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IGetOffersResult.d.ts @@ -0,0 +1,7 @@ +import { IRagfairOffer } from "./IRagfairOffer"; +export interface IGetOffersResult { + categories: Record; + offers: IRagfairOffer[]; + offersCount: number; + selectedCategory: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts new file mode 100644 index 0000000..63f655e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IRagfairOffer.d.ts @@ -0,0 +1,42 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +import { Item } from "../common/tables/IItem"; +export interface IRagfairOffer { + sellResult?: SellResult[]; + _id: string; + items: Item[]; + requirements: OfferRequirement[]; + root: string; + intId: number; + itemsCost: number; + requirementsCost: number; + startTime: number; + endTime: number; + sellInOnePiece: boolean; + name?: string; + shortName?: string; + loyaltyLevel: number; + locked: boolean; + unlimitedCount: boolean; + summaryCost: number; + user: IRagfairOfferUser; + notAvailable: boolean; + CurrentItemCount: number; + priority: boolean; +} +export interface OfferRequirement { + _tpl: string; + count: number; + onlyFunctional: boolean; +} +export interface IRagfairOfferUser { + id: string; + nickname: string; + rating: number; + memberType: MemberCategory; + avatar: string; + isRatingGrowing: boolean; +} +export interface SellResult { + sellTime: number; + amount: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts new file mode 100644 index 0000000..d926615 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IRemoveOfferRequestData { + Action: string; + offerId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts new file mode 100644 index 0000000..08e7fd3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/ragfair/ISearchRequestData.d.ts @@ -0,0 +1,32 @@ +export interface ISearchRequestData { + page: number; + limit: number; + sortType: number; + sortDirection: number; + currency: number; + priceFrom: number; + priceTo: number; + quantityFrom: number; + quantityTo: number; + conditionFrom: number; + conditionTo: number; + oneHourExpiration: boolean; + removeBartering: boolean; + offerOwnerType: OfferOwnerType; + onlyFunctional: boolean; + updateOfferCount: boolean; + handbookId: string; + linkedSearchId: string; + neededSearchId: string; + buildItems: BuildItems; + buildCount: number; + tm: number; + reload: number; +} +export declare enum OfferOwnerType { + ANYOWNERTYPE = 0, + TRADEROWNERTYPE = 1, + PLAYEROWNERTYPE = 2 +} +export interface BuildItems { +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e645fb3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts @@ -0,0 +1,3 @@ +export interface IBaseRepairActionDataRequest { + Action: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts new file mode 100644 index 0000000..263d400 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/IRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface IRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "Repair"; + repairKitsInfo: RepairKitsInfo[]; + target: string; +} +export interface RepairKitsInfo { + _id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e3d469d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface ITraderRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "TraderRepair"; + tid: string; + repairItems: RepairItem[]; +} +export interface RepairItem { + _id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts new file mode 100644 index 0000000..a9ef757 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IProcessBaseTradeRequestData { + Action: string; + type: string; + tid: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts new file mode 100644 index 0000000..a9e4c17 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts @@ -0,0 +1,14 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData { + Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | ""; + type: string; + tid: string; + item_id: string; + count: number; + scheme_id: number; + scheme_items: SchemeItem[]; +} +export interface SchemeItem { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts new file mode 100644 index 0000000..889dfd1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IProcessRagfairTradeRequestData { + Action: string; + offers: Offer[]; +} +export interface Offer { + id: string; + count: number; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts new file mode 100644 index 0000000..f1d555f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/trade/IProcessSellTradeRequestData.d.ts @@ -0,0 +1,12 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessSellTradeRequestData extends IProcessBaseTradeRequestData { + Action: "sell_to_trader"; + type: string; + tid: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; + scheme_id: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/weather/IWeatherData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/weather/IWeatherData.d.ts new file mode 100644 index 0000000..ecc96ce --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/weather/IWeatherData.d.ts @@ -0,0 +1,20 @@ +export interface IWeatherData { + acceleration: number; + time: string; + date: string; + weather: IWeather; +} +export interface IWeather { + pressure: number; + temp: number; + fog: string; + rain_intensity: number; + rain: any; + wind_gustiness: number; + wind_direction: any; + wind_speed: number; + cloud: number; + time: string; + date: string; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts new file mode 100644 index 0000000..9217864 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/eft/wishlist/IWishlistActionData.d.ts @@ -0,0 +1,4 @@ +export interface IWishlistActionData { + Action: string; + templateId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/BaseClasses.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/BaseClasses.d.ts new file mode 100644 index 0000000..e733bca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/BaseClasses.d.ts @@ -0,0 +1,84 @@ +export declare enum BaseClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMOR = "5448e54d4bdc2dcc718b4568", + VEST = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/ConfigTypes.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/ConfigTypes.d.ts new file mode 100644 index 0000000..6bd31e8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/ConfigTypes.d.ts @@ -0,0 +1,18 @@ +export declare enum ConfigTypes { + AIRDROP = "aki-airdrop", + BOT = "aki-bot", + CORE = "aki-core", + HEALTH = "aki-health", + HIDEOUT = "aki-hideout", + HTTP = "aki-http", + IN_RAID = "aki-inraid", + INSURANCE = "aki-insurance", + INVENTORY = "aki-inventory", + LOCATION = "aki-location", + MATCH = "aki-match", + QUEST = "aki-quest", + RAGFAIR = "aki-ragfair", + REPAIR = "aki-repair", + TRADER = "aki-trader", + WEATHER = "aki-weather" +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/ELocationName.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/ELocationName.d.ts new file mode 100644 index 0000000..b56cc08 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/ELocationName.d.ts @@ -0,0 +1,11 @@ +export declare enum ELocationName { + FACTORY_DAY = "factory4_day", + BIGMAP = "bigmap", + WOODS = "Woods", + SHORELINE = "Shoreline", + INTERCHANGE = "Interchange", + LIGHTHOUSE = "Lighthouse", + LABORATORY = "laboratory", + RESERVE = "RezervBase", + ANY = "any" +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/EquipmentSlots.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/EquipmentSlots.d.ts new file mode 100644 index 0000000..35c18ff --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/EquipmentSlots.d.ts @@ -0,0 +1,16 @@ +export declare enum EquipmentSlots { + HEADWEAR = "Headwear", + EARPIECE = "Earpiece", + FACE_COVER = "FaceCover", + ARMOR_VEST = "ArmorVest", + EYEWEAR = "Eyewear", + ARM_BAND = "ArmBand", + TACTICAL_VEST = "TacticalVest", + POCKETS = "Pockets", + BACKPACK = "Backpack", + SECURED_CONTAINER = "SecuredContainer", + FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", + SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", + HOLSTER = "Holster", + SCABBARD = "Scabbard" +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/HideoutAreas.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/HideoutAreas.d.ts new file mode 100644 index 0000000..b44a20a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/HideoutAreas.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreas { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/MemberCategory.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/MessageType.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/MessageType.d.ts new file mode 100644 index 0000000..1b0c649 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/MessageType.d.ts @@ -0,0 +1,16 @@ +export declare enum MessageType { + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14 +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/Money.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/Money.d.ts new file mode 100644 index 0000000..0d39613 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/Money.d.ts @@ -0,0 +1,5 @@ +export declare enum Money { + ROUBLES = "5449016a4bdc2d6f028b456f", + EUROS = "569668774bdc2da2298b4568", + DOLLARS = "5696686a4bdc2da3298b456a" +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/Traders.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/Traders.d.ts new file mode 100644 index 0000000..163cd71 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/enums/Traders.d.ts @@ -0,0 +1,10 @@ +export declare enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/external/mod.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/external/mod.d.ts new file mode 100644 index 0000000..ecef460 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/external/mod.d.ts @@ -0,0 +1,5 @@ +import { DependencyContainer } from "./tsyringe"; +export interface IMod { + load: (container: DependencyContainer) => void; + delayedLoad: (container: DependencyContainer) => void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/external/tsyringe.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/external/tsyringe.d.ts new file mode 100644 index 0000000..56a7e58 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/external/tsyringe.d.ts @@ -0,0 +1,2 @@ +import type { DependencyContainer } from "tsyringe"; +export type { DependencyContainer }; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/bindings/Route.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/bindings/Route.d.ts new file mode 100644 index 0000000..1b29d7d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/bindings/Route.d.ts @@ -0,0 +1,3 @@ +export interface IRoute { + aki: any; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts new file mode 100644 index 0000000..2c42813 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IBotCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface IBotCallbacks { + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts new file mode 100644 index 0000000..7e37c6e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IBundleCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IBundleCallbacks { + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts new file mode 100644 index 0000000..d10027f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ICustomizationCallbacks.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IBuyClothingRequestData } from "../../eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../../eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISuit } from "../../eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface ICustomizationCallbacks { + getSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + getTraderSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts new file mode 100644 index 0000000..a098560 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IDataCallbacks.d.ts @@ -0,0 +1,26 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGlobals } from "../../eft/common/IGlobals"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../server/ILocaleBase"; +import { ISettingsBase } from "../server/ISettingsBase"; +export interface IDataCallbacks { + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts new file mode 100644 index 0000000..fe2115a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IDialogueCallbacks.d.ts @@ -0,0 +1,34 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetMailDialogViewRequestData } from "../../eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogInfoRequestData } from "../../eft/dialog/IGetMailDialogInfoRequestData"; +import { IRemoveDialogRequestData } from "../../eft/dialog/IRemoveDialogRequestData"; +import { IGetMailDialogListRequestData } from "../../eft/dialog/IGetMailDialogListRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../../eft/dialog/IFriendRequestData"; +import { IPinDialogRequestData } from "../../eft/dialog/IPinDialogRequestData"; +import { ISetDialogReadRequestData } from "../../eft/dialog/ISetDialogReadRequestData"; +import { IGetAllAttachmentsRequestData } from "../../eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetChatServerListRequestData } from "../../eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../../eft/dialog/IGetFriendListDataResponse"; +import { ISendMessageRequest } from "../../eft/dialog/ISendMessageRequest"; +import { IGetMailDialogViewResponseData } from "../../eft/dialog/IGetMailDialogViewResponseData"; +import { IGetAllAttachmentsResponse } from "../../eft/dialog/IGetAllAttachmentsResponse"; +import { DialogueInfo } from "../../eft/profile/IAkiProfile"; +export interface IDialogueCallbacks { + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts new file mode 100644 index 0000000..38ebc5f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IGameCallbacks.d.ts @@ -0,0 +1,16 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGameEmptyCrcRequestData } from "../../eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../../eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGameConfigResponse } from "../../eft/game/IGameConfigResponse"; +export interface IGameCallbacks { + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts new file mode 100644 index 0000000..5857a3e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHandbookCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IHandbookCallbacks { + load(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts new file mode 100644 index 0000000..d238c7a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHealthCallbacks.d.ts @@ -0,0 +1,13 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { ISyncHealthRequestData } from "../../eft/health/ISyncHealthRequestData"; +import { IOffraidEatRequestData } from "../../eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../../eft/health/IOffraidHealRequestData"; +import { IHealthTreatmentRequestData } from "../../eft/health/IHealthTreatmentRequestData"; +export interface IHealthCallbacks { + onLoad(sessionID: string): IAkiProfile; + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): any; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): any; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): any; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): any; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts new file mode 100644 index 0000000..e9badb6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHideoutCallbacks.d.ts @@ -0,0 +1,23 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IHideoutUpgradeRequestData } from "../../eft/hideout/IHideoutUpgradeRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../../eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutScavCaseStartRequestData } from "../../eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutPutItemInRequestData } from "../../eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutTakeItemOutRequestData } from "../../eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutToggleAreaRequestData } from "../../eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../../eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../../eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../../eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IHideoutCallbacks { + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts new file mode 100644 index 0000000..3ecd945 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IHttpCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IHttpCallbacks { + load(): void; + sendImage(sessionID: string, req: any, resp: any, body: any): void; + getImage(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts new file mode 100644 index 0000000..e959b98 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInraidCallbacks.d.ts @@ -0,0 +1,14 @@ +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IRegisterPlayerRequestData } from "../../eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../../eft/inRaid/ISaveProgressRequestData"; +export interface IInraidCallbacks { + onLoad(sessionID: string): IAkiProfile; + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts new file mode 100644 index 0000000..082112d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInsuranceCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IGetInsuranceCostRequestData } from "../../eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../../eft/insurance/IInsureRequestData"; +export interface IInsuranceCallbacks { + onLoad(sessionID: string): IAkiProfile; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): any; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): any; + update(secondsSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts new file mode 100644 index 0000000..e53f7d0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IInventoryCallbacks.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IInventoryFoldRequestData } from "../../eft/inventory/IInventoryFoldRequestData"; +import { IInventorySplitRequestData } from "../../eft/inventory/IInventorySplitRequestData"; +import { IInventoryMoveRequestData } from "../../eft/inventory/IInventoryMoveRequestData"; +import { IInventoryMergeRequestData } from "../../eft/inventory/IInventoryMergeRequestData"; +import { IInventoryRemoveRequestData } from "../../eft/inventory/IInventoryRemoveRequestData"; +import { IInventoryTransferRequestData } from "../../eft/inventory/IInventoryTransferRequestData"; +import { IInventorySwapRequestData } from "../../eft/inventory/IInventorySwapRequestData"; +import { IInventoryToggleRequestData } from "../../eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTagRequestData } from "../../eft/inventory/IInventoryTagRequestData"; +import { IInventoryBindRequestData } from "../../eft/inventory/IInventoryBindRequestData"; +import { IInventoryExamineRequestData } from "../../eft/inventory/IInventoryExamineRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../../eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventorySortRequestData } from "../../eft/inventory/IInventorySortRequestData"; +import { IInventoryCreateMarkerRequestData } from "../../eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../../eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../../eft/inventory/IInventoryEditMarkerRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IInventoryCallbacks { + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts new file mode 100644 index 0000000..59db771 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IItemEventCallbacks.d.ts @@ -0,0 +1,6 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../../eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IItemEventCallbacks { + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts new file mode 100644 index 0000000..52dfec6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ILauncherCallbacks.d.ts @@ -0,0 +1,20 @@ +import { IRegisterData } from "../../eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../../eft/launcher/IRemoveProfileData"; +import { ILoginRequestData } from "../../eft/launcher/ILoginRequestData"; +import { IChangeRequestData } from "../../eft/launcher/IChangeRequestData"; +import { IGetMiniProfileRequestData } from "../../eft/launcher/IGetMiniProfileRequestData.js"; +export interface ILauncherCallbacks { + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; + getServerVersion(): string; + ping(url: string, info: any, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts new file mode 100644 index 0000000..71656a4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ILocationCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IGetLocationRequestData } from "../../eft/location/IGetLocationRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILocationsGenerateAllResponse } from "../../eft/common/ILocationsSourceDestinationBase"; +import { ILocationBase } from "../../eft/common/ILocationBase"; +export interface ILocationCallbacks { + getLocationData(url: string, info: any, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts new file mode 100644 index 0000000..fcbf173 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IMatchCallbacks.d.ts @@ -0,0 +1,25 @@ +import { IStartOfflineRaidRequestData } from "../../eft/match/IStartOffineRaidRequestData"; +import { IEndOfflineRaidRequestData } from "../../eft/match/IEndOfflineRaidRequestData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IPmcData } from "../../eft/common/IPmcData"; +export interface IMatchCallbacks { + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: any, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts new file mode 100644 index 0000000..1a4cd7b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IModCallbacks.d.ts @@ -0,0 +1,6 @@ +export interface IModCallbacks { + load(): void; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts new file mode 100644 index 0000000..8453a4f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/INoteCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { INoteActionData } from "../../eft/notes/INoteActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface INoteCallbacks { + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts new file mode 100644 index 0000000..a211310 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/INotifierCallbacks.d.ts @@ -0,0 +1,17 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../../eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../../eft/notifier/ISelectProfileRequestData"; +export interface INotifierCallbacks { + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(sessionID: string, req: any, resp: any, data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts new file mode 100644 index 0000000..97c6487 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IPresetBuildActionRequestData } from "../../eft/presetBuild/IPresetBuildActionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { WeaponBuild } from "../../eft/profile/IAkiProfile"; +export interface IPresetBuildCallbacks { + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts new file mode 100644 index 0000000..4169857 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IPresetCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IPresetCallbacks { + load(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts new file mode 100644 index 0000000..9d4d2df --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IProfileCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IProfileChangeNicknameRequestData } from "../../eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../../eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../../eft/profile/IProfileCreateRequestData"; +import { IValidateNicknameRequestData } from "../../eft/profile/IValidateNicknameRequestData"; +import { ISearchFriendRequestData } from "../../eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../../eft/profile/ISearchFriendResponse"; +export interface IProfileCallbacks { + onLoad(sessionID: string): any; + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts new file mode 100644 index 0000000..1c4d0c3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IQuestCallbacks.d.ts @@ -0,0 +1,19 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAcceptQuestRequestData } from "../../eft/quests/IAcceptQuestRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IListQuestsRequestData } from "../../eft/quests/IListQuestsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { ICompleteQuestRequestData } from "../../eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../../eft/quests/IHandoverQuestRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../../eft/common/tables/IRepeatableQuests"; +import { IRepeatableQuestChangeRequest } from "../../eft/quests/IRepeatableQuestChangeRequest"; +export interface IQuestCallbacks { + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts new file mode 100644 index 0000000..9282bd4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IRagfairCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISearchRequestData } from "../../eft/ragfair/ISearchRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetMarketPriceRequestData } from "../../eft/ragfair/IGetMarketPriceRequestData"; +import { IAddOfferRequestData } from "../../eft/ragfair/IAddOfferRequestData"; +import { IRemoveOfferRequestData } from "../../eft/ragfair/IRemoveOfferRequestData"; +import { IExtendOfferRequestData } from "../../eft/ragfair/IExtendOfferRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetItemPriceResult } from "../../eft/ragfair/IGetItemPriceResult"; +export interface IRagfairCallbacks { + load(): void; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; + updatePlayer(timeSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts new file mode 100644 index 0000000..e8183c9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IRepairCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../../eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../../eft/repair/ITraderRepairActionDataRequest"; +export interface IRepairCallbacks { + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts new file mode 100644 index 0000000..1ad3b82 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ISaveCallbacks.d.ts @@ -0,0 +1,4 @@ +export interface ISaveCallbacks { + load(): void; + update(secondsSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts new file mode 100644 index 0000000..2f41d54 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ITradeCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../../eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../../eft/trade/IProcessBaseTradeRequestData"; +export interface ITradeCallbacks { + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts new file mode 100644 index 0000000..e0d7d06 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/ITraderCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../../eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface ITraderCallbacks { + load(): void; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts new file mode 100644 index 0000000..9ac72ae --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IWeatherCallbacks.d.ts @@ -0,0 +1,5 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +export interface IWeatherCallbacks { + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts new file mode 100644 index 0000000..e5d519c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/callbacks/IWishlistCallbacks.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IWishlistActionData } from "../../eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IWishlistCallbacks { + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IAirdropConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IAirdropConfig.d.ts new file mode 100644 index 0000000..f4aee89 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IAirdropConfig.d.ts @@ -0,0 +1,20 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IAirdropConfig extends IBaseConfig { + kind: "aki-airdrop"; + airdropChancePercent: AirdropChancePercent; + airdropMinOpenHeight: number; + airdropMaxOpenHeight: number; + planeMinFlyHeight: number; + planeMaxFlyHeight: number; + planeVolume: number; + airdropMinStartTimeSeconds: number; + airdropMaxStartTimeSeconds: number; +} +export interface AirdropChancePercent { + bigmap: number; + woods: number; + lighthouse: number; + shoreline: number; + interchange: number; + reserve: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IBaseConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IBaseConfig.d.ts new file mode 100644 index 0000000..8b6ba88 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IBaseConfig.d.ts @@ -0,0 +1,3 @@ +export interface IBaseConfig { + kind: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IBotConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IBotConfig.d.ts new file mode 100644 index 0000000..5fb9d93 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IBotConfig.d.ts @@ -0,0 +1,114 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IBotConfig extends IBaseConfig { + kind: "aki-bot"; + presetBatch: PresetBatch; + bosses: string[]; + durability: Durability; + lootNValue: LootNvalue; + revenge: Record; + pmc: PmcConfig; + showTypeInNickname: boolean; + maxBotCap: number; +} +export interface PresetBatch { + assault: number; + bossBully: number; + bossGluhar: number; + bossKilla: number; + bossKojaniy: number; + bossSanitar: number; + bossTagilla: number; + bossTest: number; + cursedAssault: number; + followerBully: number; + followerGluharAssault: number; + followerGluharScout: number; + followerGluharSecurity: number; + followerGluharSnipe: number; + followerKojaniy: number; + followerSanitar: number; + followerTagilla: number; + followerTest: number; + marksman: number; + pmcBot: number; + sectantPriest: number; + sectantWarrior: number; + gifter: number; + test: number; + exUsec: number; +} +export interface Durability { + default: DefaultDurability; + pmc: PmcDurability; + boss: BotDurability; + follower: BotDurability; + assault: BotDurability; + cursedassault: BotDurability; + marksman: BotDurability; + pmcbot: BotDurability; + exusec: BotDurability; + sectantpriest: BotDurability; + sectantwarrior: BotDurability; +} +export interface DefaultDurability { + armor: DefaultArmor; + weapon: WeaponDurability; +} +export interface DefaultArmor { + maxDelta: number; + minDelta: number; +} +export interface WeaponDurability { + lowestMax: number; + highestMax: number; + maxDelta: number; + minDelta: number; +} +export interface PmcDurability { + armor: PmcDurabilityArmor; + weapon: WeaponDurability; +} +export interface PmcDurabilityArmor { + lowestMaxPercent: number; + highestMaxPercent: number; + maxDelta: number; + minDelta: number; +} +export interface BotDurability { + armor: ArmorDurability; + weapon: WeaponDurability; +} +export interface ArmorDurability { + maxDelta: number; + minDelta: number; +} +export interface LootNvalue { + scav: number; + pmc: number; +} +export interface PmcConfig { + dynamicLoot: DynamicLoot; + cartridgeBlacklist: string[]; + difficulty: string; + isUsec: number; + chanceSameSideIsHostilePercent: number; + usecType: string; + bearType: string; + maxBackpackLootTotalRub: number; + maxPocketLootTotalRub: number; + maxVestLootTotalRub: number; + types: Types; + enemyTypes: string[]; +} +export interface DynamicLoot { + whitelist: string[]; + blacklist: string[]; + spawnLimits: Record; + moneyStackLimits: Record; +} +export interface Types { + assault: number; + cursedAssault: number; + pmcBot: number; + exUsec: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ICoreConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ICoreConfig.d.ts new file mode 100644 index 0000000..cfcaf61 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ICoreConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ICoreConfig extends IBaseConfig { + kind: "aki-core"; + akiVersion: string; + projectName: string; + compatibleTarkovVersion: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHealthConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHealthConfig.d.ts new file mode 100644 index 0000000..fdbf656 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHealthConfig.d.ts @@ -0,0 +1,14 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHealthConfig extends IBaseConfig { + kind: "aki-health"; + healthMultipliers: HealthMultipliers; + save: Save; +} +export interface HealthMultipliers { + death: number; + blacked: number; +} +export interface Save { + health: boolean; + effects: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHideoutConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHideoutConfig.d.ts new file mode 100644 index 0000000..4658fa6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHideoutConfig.d.ts @@ -0,0 +1,27 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHideoutConfig extends IBaseConfig { + kind: "aki-hideout"; + runIntervalSeconds: number; + scavCase: ScavCase; + fuelDrainRateMultipler: number; +} +export interface ScavCase { + rewardParentBlacklist: string[]; + rewardItemBlacklist: any[]; + ammoRewards: AmmoRewards; + moneyRewards: MoneyRewards; +} +export interface AmmoRewards { + giveMultipleOfTen: boolean; + minAmount: number; +} +export interface MoneyRewards { + enabled: boolean; + rub: MinMax; + usd: MinMax; + eur: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHttpConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHttpConfig.d.ts new file mode 100644 index 0000000..c41d035 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IHttpConfig.d.ts @@ -0,0 +1,6 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHttpConfig extends IBaseConfig { + kind: "aki-http"; + ip: string; + port: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInRaidConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInRaidConfig.d.ts new file mode 100644 index 0000000..baaf083 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInRaidConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInRaidConfig extends IBaseConfig { + kind: "aki-inraid"; + MIAOnRaidEnd: boolean; + raidMenuSettings: RaidMenuSettings; + save: Save; + carExtracts: string[]; + carExtractBaseStandingGain: number; + scavExtractGain: number; +} +export interface RaidMenuSettings { + aiAmount: string; + aiDifficulty: string; + bossEnabled: boolean; + scavWars: boolean; + taggedAndCursed: boolean; +} +export interface Save { + loot: boolean; + durability: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInsuranceConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInsuranceConfig.d.ts new file mode 100644 index 0000000..6e9c744 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInsuranceConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInsuranceConfig extends IBaseConfig { + kind: "aki-insurance"; + insuranceMultiplier: Record; + returnChancePercent: Record; + runIntervalSeconds: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInventoryConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInventoryConfig.d.ts new file mode 100644 index 0000000..ffffa41 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IInventoryConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInventoryConfig extends IBaseConfig { + kind: "aki-inventory"; + newItemsMarkedFound: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ILocationConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ILocationConfig.d.ts new file mode 100644 index 0000000..0551d57 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ILocationConfig.d.ts @@ -0,0 +1,24 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ILocationConfig extends IBaseConfig { + kind: "aki-location"; + looseLootMultiplier: LootMultiplier; + staticLootMultiplier: LootMultiplier; +} +export interface LootMultiplier { + bigmap: number; + develop: number; + factory4_day: number; + factory4_night: number; + interchange: number; + laboratory: number; + rezervbase: number; + shoreline: number; + woods: number; + hideout: number; + lighthouse: number; + privatearea: number; + suburbs: number; + tarkovstreets: number; + terminal: number; + town: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IMatchConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IMatchConfig.d.ts new file mode 100644 index 0000000..92c4d77 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IMatchConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IMatchConfig extends IBaseConfig { + kind: "aki-match"; + enabled: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IQuestConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IQuestConfig.d.ts new file mode 100644 index 0000000..be4a97b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IQuestConfig.d.ts @@ -0,0 +1,77 @@ +import { ELocationName } from "../../enums/ELocationName"; +import { IBaseConfig } from "./IBaseConfig"; +export interface IQuestConfig extends IBaseConfig { + kind: "aki-quest"; + redeemTime: number; + repeatableQuests: IRepeatableQuestConfig[]; +} +export interface IRepeatableQuestConfig { + name: string; + types: string[]; + resetTime: number; + numQuests: number; + minPlayerLevel: number; + rewardScaling: IRewardScaling; + locations: Record; + traderWhitelist: ITraderWhitelist[]; + questConfig: IQuestConfig; +} +export interface IRewardScaling { + levels: number[]; + experience: number[]; + roubles: number[]; + items: number[]; + reputation: number[]; + rewardSpread: number; +} +export interface ITraderWhitelist { + traderId: string; + questTypes: string[]; +} +export interface IQuestConfig { + Exploration: IExploration; + Completion: ICompletion; + Elimination: IElimination; +} +export interface IExploration { + maxExtracts: number; + specificExits: ISpecificExits; +} +export interface ISpecificExits { + probability: number; + passageRequirementWhitelist: string[]; +} +export interface ICompletion { + minRequestedAmount: number; + maxRequestedAmount: number; + minRequestedBulletAmount: number; + maxRequestedBulletAmount: number; + useWhitelist: boolean; + useBlacklist: boolean; +} +export interface IElimination { + targets: ITarget[]; + bodyPartProb: number; + bodyParts: IBodyPart[]; + specificLocationProb: number; + distLocationBlacklist: string[]; + distProb: number; + maxDist: number; + minDist: number; + maxKills: number; + minKills: number; +} +export interface IProbabilityObject { + key: string; + relativeProbability: number; + data?: any; +} +export interface ITarget extends IProbabilityObject { + data: IBossInfo; +} +export interface IBossInfo { + isBoss: boolean; +} +export interface IBodyPart extends IProbabilityObject { + data: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IRagfairConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IRagfairConfig.d.ts new file mode 100644 index 0000000..2d151ca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IRagfairConfig.d.ts @@ -0,0 +1,59 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRagfairConfig extends IBaseConfig { + kind: "aki-ragfair"; + runIntervalSeconds: number; + sell: Sell; + traders: Record; + dynamic: Dynamic; +} +export interface Sell { + fees: boolean; + chance: Chance; + time: Time; + reputation: Reputation; +} +export interface Chance { + base: number; + overprices: number; + underpriced: number; +} +export interface Time { + base: number; + min: number; + max: number; +} +export interface Reputation { + gain: number; + loss: number; +} +export interface Dynamic { + expiredOfferThreshold: number; + offerItemCount: MinMax; + price: MinMax; + endTimeSeconds: MinMax; + condition: Condition; + stackablePercent: MinMax; + nonStackableCount: MinMax; + rating: MinMax; + currencies: Record; + showAsSingleStack: string[]; + blacklist: Blacklist; +} +export interface MinMax { + min: number; + max: number; +} +export interface Condition { + conditionChance: number; + min: number; + max: number; +} +export interface Blacklist { + /** + * show/hide trader items that are blacklisted by bsg + */ + traderItems: boolean; + custom: string[]; + enableBsgList: boolean; + enableQuestList: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IRepairConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IRepairConfig.d.ts new file mode 100644 index 0000000..4966eb5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IRepairConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRepairConfig extends IBaseConfig { + kind: "aki-repair"; + priceMultiplier: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ITraderConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ITraderConfig.d.ts new file mode 100644 index 0000000..dab73e3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/ITraderConfig.d.ts @@ -0,0 +1,15 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ITraderConfig extends IBaseConfig { + kind: "aki-trader"; + updateTime: UpdateTime[]; + updateTimeDefault: number; + fenceAssortSize: number; + fenceMaxPresetsCount: number; + fencePresetPriceMult: number; + minDurabilityForSale: number; + fenceItemIgnoreList: string[]; +} +export interface UpdateTime { + traderId: string; + seconds: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IWeatherConfig.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IWeatherConfig.d.ts new file mode 100644 index 0000000..c52cab3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/config/IWeatherConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IWeatherConfig extends IBaseConfig { + kind: "aki-weather"; + acceleration: number; + weather: Weather; +} +export interface Weather { + clouds: MinMax; + windSpeed: MinMax; + windDirection: MinMax; + windGustiness: MinMax; + rain: MinMax; + rainIntensity: MinMax; + fog: MinMax; + temp: MinMax; + pressure: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/controllers/IBotController.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/controllers/IBotController.d.ts new file mode 100644 index 0000000..010e208 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/controllers/IBotController.d.ts @@ -0,0 +1,13 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { Difficulty } from "../../eft/common/tables/IBotType"; +export interface IBotController { + getBotLimit(type: string): number; + getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + generate(info: IGenerateBotsRequestData, playerScav: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IBotGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IBotGenerator.d.ts new file mode 100644 index 0000000..f3e8586 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IBotGenerator.d.ts @@ -0,0 +1,10 @@ +import { Inventory as PmcInventory } from "../../eft/common/IPmcData"; +import { Inventory, Chances, Generation } from "../../eft/common/tables/IBotType"; +export interface IBotGenerator { + generateInventory(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; +} +export interface IExhaustableArray { + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/ILocationGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/ILocationGenerator.d.ts new file mode 100644 index 0000000..530ceca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/ILocationGenerator.d.ts @@ -0,0 +1,6 @@ +import { IStaticContainerProps, IStaticLootDetails, IStaticAmmoDetails, IStaticForcedProps } from "../../eft/common/tables/ILootBase"; +import { ILooseLoot, SpawnpointTemplate } from "../../eft/common/ILooseLoot"; +export interface ILocationGenerator { + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts new file mode 100644 index 0000000..a9db89b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IPMCLootGenerator.d.ts @@ -0,0 +1,4 @@ +export interface IPMCLootGenerator { + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts new file mode 100644 index 0000000..6670540 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IRagfairAssortGenerator.d.ts @@ -0,0 +1,4 @@ +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairAssortGenerator { + getAssortItems(): Item[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts new file mode 100644 index 0000000..30b4be5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/generators/IRagfairOfferGenerator.d.ts @@ -0,0 +1,6 @@ +import { IBarterScheme } from "../../eft/common/tables/ITrader"; +import { IRagfairOffer } from "../../eft/ragfair/IRagfairOffer"; +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairOfferGenerator { + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece: boolean): IRagfairOffer; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/helpers/Traders.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/helpers/Traders.d.ts new file mode 100644 index 0000000..e935d29 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/helpers/Traders.d.ts @@ -0,0 +1,10 @@ +export declare const enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IMod.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IMod.d.ts new file mode 100644 index 0000000..e6eec79 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IMod.d.ts @@ -0,0 +1,10 @@ +export declare namespace ModLoader { + interface IMod { + name: string; + version: string; + main?: string; + author?: string; + license: string; + dependencies?: Record; + } +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IModLoader.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IModLoader.d.ts new file mode 100644 index 0000000..40a5e19 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IModLoader.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +export interface IModLoader { + load(container: DependencyContainer): void; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IPackageJsonData.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IPackageJsonData.d.ts new file mode 100644 index 0000000..09472cd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/mod/IPackageJsonData.d.ts @@ -0,0 +1,11 @@ +export interface IPackageJsonData { + incompatibilities?: string[]; + dependencies?: string[]; + name: string; + author: string; + version: string; + akiVersion: string; + licence: string; + main: string; + contributors: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts new file mode 100644 index 0000000..c7d246a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/ragfair/IRagfairServerPrices.d.ts @@ -0,0 +1,4 @@ +export interface IRagfairServerPrices { + static: Record; + dynamic: Record; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IDatabaseTables.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IDatabaseTables.d.ts new file mode 100644 index 0000000..dbb71be --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IDatabaseTables.d.ts @@ -0,0 +1,51 @@ +import { IGlobals } from "../../eft/common/IGlobals"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { IBotType } from "../../eft/common/tables/IBotType"; +import { ICustomizationItem } from "../../eft/common/tables/ICustomizationItem"; +import { IHandbookBase } from "../../eft/common/tables/IHandbookBase"; +import { ILootBase } from "../../eft/common/tables/ILootBase"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IRepeatableQuestDatabase } from "../../eft/common/tables/IRepeatableQuests"; +import { ITemplateItem } from "../../eft/common/tables/ITemplateItem"; +import { ITrader } from "../../eft/common/tables/ITrader"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { ILocaleBase } from "./ILocaleBase"; +import { ILocations } from "./ILocations"; +import { IServerBase } from "./IServerBase"; +import { ISettingsBase } from "./ISettingsBase"; +export interface IDatabaseTables { + bots: { + types: Record; + base: IBotBase; + core: IBotCore; + }; + hideout: { + areas: IHideoutArea[]; + production: IHideoutProduction[]; + scavcase: IHideoutScavCase[]; + settings: IHideoutSettingsBase; + }; + locales: ILocaleBase; + locations: ILocations; + loot: ILootBase; + match: any; + templates: { + character: string[]; + items: Record; + quests: IQuest[]; + repeatableQuests: IRepeatableQuestDatabase; + clientItems: Record; + handbook: IHandbookBase; + customization: Record; + profiles: any; + prices: Record; + }; + traders: Record; + globals: IGlobals; + server: IServerBase; + settings: ISettingsBase; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IHttpServer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IHttpServer.d.ts new file mode 100644 index 0000000..c828399 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IHttpServer.d.ts @@ -0,0 +1,12 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { INotification } from "../../eft/notifier/INotifier"; +export interface IHttpServer { + load(): void; + getCookies(req: http.IncomingMessage): any; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + sendMessage(sessionID: string, output: INotification): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ILocaleBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ILocaleBase.d.ts new file mode 100644 index 0000000..8887c06 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ILocaleBase.d.ts @@ -0,0 +1,61 @@ +export interface ILocaleBase { + global: Record; + menu: Record; + languages: ILanguageBase[]; +} +export interface ILocaleGlobalBase { + interface: Record; + enum: any[]; + mail: Record; + quest: Record; + preset: Record; + handbook: Record; + season: Record; + customization: Record; + repeatableQuest: Record; + templates: ILocaleTemplateBase; + locations: ILocaleLocationsBase; + banners: ILocaleBannersBase; + trading: ILocaleTradingBase; +} +export interface ILocaleQuest { + name: string; + description: string; + note: string; + failMessageText: string; + startedMessageText: string; + successMessageText: string; + conditions: Record; + location: string; +} +export interface ILocalePreset { + Name: string; +} +export interface ILocaleTemplateBase { + templates: Record; +} +export interface ILocaleLocationsBase { + locations: Record; +} +export interface ILocaleBannersBase { + locations: Record; +} +export interface ILocaleProps { + Name: string; + ShortName: string; + Description: string; +} +export interface ILocaleTradingBase { + locations: Record; +} +export interface ILocaleTradingProps { + FullName: string; + FirstName: string; + Nickname: string; + Location: string; + Description: string; +} +export interface ILanguageBase { + ShortName: string; + Name: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ILocations.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ILocations.d.ts new file mode 100644 index 0000000..18f0262 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ILocations.d.ts @@ -0,0 +1,26 @@ +import { ILocationBase } from "../../eft/common/ILocationBase"; +import { ILooseLoot } from "../../eft/common/ILooseLoot"; +import { ILocationsBase } from "../../eft/common/tables/ILocationsBase"; +export interface ILocations { + bigmap?: ILocationData; + develop?: ILocationData; + factory4_day?: ILocationData; + factory4_night?: ILocationData; + hideout?: ILocationData; + interchange?: ILocationData; + laboratory?: ILocationData; + lighthouse?: ILocationData; + privatearea?: ILocationData; + rezervbase?: ILocationData; + shoreline?: ILocationData; + suburbs?: ILocationData; + tarkovstreets?: ILocationData; + terminal?: ILocationData; + town?: ILocationData; + woods?: ILocationData; + base?: ILocationsBase; +} +export interface ILocationData { + base: ILocationBase; + looseLoot?: ILooseLoot; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IServerBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IServerBase.d.ts new file mode 100644 index 0000000..d033db3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/IServerBase.d.ts @@ -0,0 +1,4 @@ +export interface IServerBase { + ip: string; + port: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ISettingsBase.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ISettingsBase.d.ts new file mode 100644 index 0000000..c067cda --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/server/ISettingsBase.d.ts @@ -0,0 +1,43 @@ +export interface ISettingsBase { + config: Config; +} +export interface Config { + AFKTimeoutSeconds: number; + AdditionalRandomDelaySeconds: number; + ClientSendRateLimit: number; + CriticalRetriesCount: number; + DefaultRetriesCount: number; + FirstCycleDelaySeconds: number; + FramerateLimit: FramerateLimit; + GroupStatusInterval: number; + KeepAliveInterval: number; + Mark502and504AsNonImportant: boolean; + MemoryManagementSettings: MemoryManagementSettings; + NVidiaHighlights: boolean; + NextCycleDelaySeconds: number; + PingServerResultSendInterval: number; + PingServersInterval: number; + ReleaseProfiler: ReleaseProfiler; + SecondCycleDelaySeconds: number; + TurnOffLogging: boolean; + WeaponOverlapDistanceCulling: number; + WebDiagnosticsEnabled: boolean; +} +export interface FramerateLimit { + MaxFramerateGameLimit: number; + MaxFramerateLobbyLimit: number; + MinFramerateLimit: number; +} +export interface MemoryManagementSettings { + AggressiveGC: boolean; + GigabytesRequiredToDisableGCDuringRaid: number; + HeapPreAllocationEnabled: boolean; + HeapPreAllocationMB: number; + OverrideRamCleanerSettings: boolean; + RamCleanerEnabled: boolean; +} +export interface ReleaseProfiler { + Enabled: boolean; + MaxRecords: number; + RecordTriggerValue: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/IAsyncQueue.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/IAsyncQueue.d.ts new file mode 100644 index 0000000..2be801a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/IAsyncQueue.d.ts @@ -0,0 +1,4 @@ +import { ICommand } from "./ICommand"; +export interface IAsyncQueue { + waitFor(command: ICommand): Promise; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/ICommand.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/ICommand.d.ts new file mode 100644 index 0000000..696bb83 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/ICommand.d.ts @@ -0,0 +1,4 @@ +export interface ICommand { + uuid: string; + cmd: () => Promise; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/ILogger.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/ILogger.d.ts new file mode 100644 index 0000000..c983701 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/ILogger.d.ts @@ -0,0 +1,10 @@ +import { Daum } from "../../eft/itemEvent/IItemEventRouterRequest"; +export interface ILogger { + writeToLogFile(data: string | Daum): void; + log(data: string | Record | Error, color: string): void; + error(data: string): void; + warning(data: string): void; + success(data: string): void; + info(data: string): void; + debug(data: string | Record, onlyShowInConsole?: boolean): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/IUuidGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/IUuidGenerator.d.ts new file mode 100644 index 0000000..3870469 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/models/spt/utils/IUuidGenerator.d.ts @@ -0,0 +1,3 @@ +export interface IUUidGenerator { + generate(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/HttpRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/HttpRouter.d.ts new file mode 100644 index 0000000..f75a47d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/HttpRouter.d.ts @@ -0,0 +1,16 @@ +/// +import { IncomingMessage } from "http"; +import { DynamicRouter, Router, StaticRouter } from "../di/Router"; +export declare class HttpRouter { + protected staticRouters: StaticRouter[]; + protected dynamicRoutes: DynamicRouter[]; + constructor(staticRouters: StaticRouter[], dynamicRoutes: DynamicRouter[]); + protected groupBy(list: T[], keyGetter: (t: T) => string): Map; + getResponse(req: IncomingMessage, info: any, sessionID: string): string; + protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean; +} +declare class ResponseWrapper { + output: string; + constructor(output: string); +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/ImageRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/ImageRouter.d.ts new file mode 100644 index 0000000..ab03977 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/ImageRouter.d.ts @@ -0,0 +1,13 @@ +/// +import { IncomingMessage, ServerResponse } from "http"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ImageRouteService } from "../services/mod/image/ImageRouteService"; +import { VFS } from "../utils/VFS"; +export declare class ImageRouter { + protected vfs: VFS; + protected imageRouteService: ImageRouteService; + constructor(vfs: VFS, imageRouteService: ImageRouteService); + addRoute(key: string, valueToAdd: string): void; + sendImage(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any, httpServer: IHttpServer): void; + getImage(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/ItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/ItemEventRouter.d.ts new file mode 100644 index 0000000..b1ac5d9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/ItemEventRouter.d.ts @@ -0,0 +1,17 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { ItemEventRouterDefinition } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class ItemEventRouter { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected profileHelper: ProfileHelper; + protected itemEventRouters: ItemEventRouterDefinition[]; + constructor(logger: ILogger, jsonUtil: JsonUtil, profileHelper: ProfileHelper, itemEventRouters: ItemEventRouterDefinition[]); + protected output: IItemEventRouterResponse; + handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse; + getOutput(sessionID: string): IItemEventRouterResponse; + protected resetOutput(sessionID: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts new file mode 100644 index 0000000..6d0ab4b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/BotDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BotDynamicRouter extends DynamicRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts new file mode 100644 index 0000000..a765410 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/BundleDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BundleDynamicRouter extends DynamicRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts new file mode 100644 index 0000000..2db7cc5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/CustomizationDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class CustomizationDynamicRouter extends DynamicRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts new file mode 100644 index 0000000..836ed8d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/DataDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class DataDynamicRouter extends DynamicRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts new file mode 100644 index 0000000..a152b4d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/HttpDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter } from "../../di/Router"; +import { ImageRouter } from "../ImageRouter"; +export declare class HttpDynamicRouter extends DynamicRouter { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts new file mode 100644 index 0000000..7c0561f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/InraidDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class InraidDynamicRouter extends DynamicRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); + getTopLevelRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts new file mode 100644 index 0000000..b8e5cdf --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/LocationDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class LocationDynamicRouter extends DynamicRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); + getTopLevelRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts new file mode 100644 index 0000000..83c60c5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/NotifierDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class NotifierDynamicRouter extends DynamicRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts new file mode 100644 index 0000000..5b7cc1b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/dynamic/TraderDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class TraderDynamicRouter extends DynamicRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts new file mode 100644 index 0000000..e78445e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/CustomizationItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class CustomizationItemEventRouter extends ItemEventRouterDefinition { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts new file mode 100644 index 0000000..99847c6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/HealthItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HealthItemEventRouter extends ItemEventRouterDefinition { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts new file mode 100644 index 0000000..e1e98af --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/HideoutItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HideoutCallbacks } from "../../callbacks/HideoutCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HideoutItemEventRouter extends ItemEventRouterDefinition { + protected hideoutCallbacks: HideoutCallbacks; + constructor(hideoutCallbacks: HideoutCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts new file mode 100644 index 0000000..a922cc0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/InsuranceItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InsuranceItemEventRouter extends ItemEventRouterDefinition { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts new file mode 100644 index 0000000..2619bb9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/InventoryItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InventoryCallbacks } from "../../callbacks/InventoryCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InventoryItemEventRouter extends ItemEventRouterDefinition { + protected inventoryCallbacks: InventoryCallbacks; + constructor(inventoryCallbacks: InventoryCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts new file mode 100644 index 0000000..59bf598 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/NoteItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { NoteCallbacks } from "../../callbacks/NoteCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class NoteItemEventRouter extends ItemEventRouterDefinition { + protected noteCallbacks: NoteCallbacks; + constructor(noteCallbacks: NoteCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts new file mode 100644 index 0000000..277db44 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/PresetBuildItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class PresetBuildItemEventRouter extends ItemEventRouterDefinition { + protected presetBuildCallbacks: PresetBuildCallbacks; + constructor(presetBuildCallbacks: PresetBuildCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts new file mode 100644 index 0000000..db59c25 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/QuestItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class QuestItemEventRouter extends ItemEventRouterDefinition { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts new file mode 100644 index 0000000..9216cc5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/RagfairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RagfairItemEventRouter extends ItemEventRouterDefinition { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts new file mode 100644 index 0000000..5196ba9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/RepairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RepairCallbacks } from "../../callbacks/RepairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RepairItemEventRouter extends ItemEventRouterDefinition { + protected repairCallbacks: RepairCallbacks; + constructor(repairCallbacks: RepairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts new file mode 100644 index 0000000..a43bb0a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/TradeItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { TradeCallbacks } from "../../callbacks/TradeCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class TradeItemEventRouter extends ItemEventRouterDefinition { + protected tradeCallbacks: TradeCallbacks; + constructor(tradeCallbacks: TradeCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts new file mode 100644 index 0000000..38497fb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/item_events/WishlistItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { WishlistCallbacks } from "../../callbacks/WishlistCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class WishlistItemEventRouter extends ItemEventRouterDefinition { + protected wishlistCallbacks: WishlistCallbacks; + constructor(wishlistCallbacks: WishlistCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts new file mode 100644 index 0000000..114f5b2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/HealthSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class HealthSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts new file mode 100644 index 0000000..4c00b40 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/InraidSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InraidSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts new file mode 100644 index 0000000..30ce98e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/InsuranceSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InsuranceSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts new file mode 100644 index 0000000..16c7619 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/save_load/ProfileSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class ProfileSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/BundleSerializer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/BundleSerializer.d.ts new file mode 100644 index 0000000..912db83 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/BundleSerializer.d.ts @@ -0,0 +1,11 @@ +import { Serializer } from "../../di/Serializer"; +import { BundleLoader } from "../../loaders/BundleLoader"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { ILogger } from "../../models/spt/utils/ILogger"; +export declare class BundleSerializer extends Serializer { + protected logger: ILogger; + protected bundleLoader: BundleLoader; + constructor(logger: ILogger, bundleLoader: BundleLoader); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/ImageSerializer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/ImageSerializer.d.ts new file mode 100644 index 0000000..0e040d4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/ImageSerializer.d.ts @@ -0,0 +1,9 @@ +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { Serializer } from "../../di/Serializer"; +import { ImageRouter } from "../ImageRouter"; +export declare class ImageSerializer extends Serializer { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/NotifySerializer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/NotifySerializer.d.ts new file mode 100644 index 0000000..1779ac9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/serializers/NotifySerializer.d.ts @@ -0,0 +1,11 @@ +import { NotifierController } from "../../controllers/NotifierController"; +import { Serializer } from "../../di/Serializer"; +import { HttpServerHelper } from "../../helpers/HttpServerHelper"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +export declare class NotifySerializer extends Serializer { + protected notifierController: NotifierController; + protected httpServerHelper: HttpServerHelper; + constructor(notifierController: NotifierController, httpServerHelper: HttpServerHelper); + serialize(_sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/BotStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/BotStaticRouter.d.ts new file mode 100644 index 0000000..aeea220 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/BotStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BotStaticRouter extends StaticRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/BundleStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/BundleStaticRouter.d.ts new file mode 100644 index 0000000..fb682fc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/BundleStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BundleStaticRouter extends StaticRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/CustomizationStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/CustomizationStaticRouter.d.ts new file mode 100644 index 0000000..21bc4bb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/CustomizationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class CustomizationStaticRouter extends StaticRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/DataStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/DataStaticRouter.d.ts new file mode 100644 index 0000000..84ba7fd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/DataStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DataStaticRouter extends StaticRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/DialogStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/DialogStaticRouter.d.ts new file mode 100644 index 0000000..546cdf1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/DialogStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DialogueCallbacks } from "../../callbacks/DialogueCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DialogStaticRouter extends StaticRouter { + protected dialogueCallbacks: DialogueCallbacks; + constructor(dialogueCallbacks: DialogueCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/GameStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/GameStaticRouter.d.ts new file mode 100644 index 0000000..a9a7496 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/GameStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { GameCallbacks } from "../../callbacks/GameCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class GameStaticRouter extends StaticRouter { + protected gameCallbacks: GameCallbacks; + constructor(gameCallbacks: GameCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/HealthStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/HealthStaticRouter.d.ts new file mode 100644 index 0000000..863fd5e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/HealthStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class HealthStaticRouter extends StaticRouter { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/InraidStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/InraidStaticRouter.d.ts new file mode 100644 index 0000000..b29ad23 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/InraidStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InraidStaticRouter extends StaticRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/InsuranceStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/InsuranceStaticRouter.d.ts new file mode 100644 index 0000000..5676499 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/InsuranceStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InsuranceStaticRouter extends StaticRouter { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/ItemEventStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/ItemEventStaticRouter.d.ts new file mode 100644 index 0000000..c30a7fc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/ItemEventStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ItemEventCallbacks } from "../../callbacks/ItemEventCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ItemEventStaticRouter extends StaticRouter { + protected itemEventCallbacks: ItemEventCallbacks; + constructor(itemEventCallbacks: ItemEventCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/LauncherStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/LauncherStaticRouter.d.ts new file mode 100644 index 0000000..0040cbd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/LauncherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LauncherCallbacks } from "../../callbacks/LauncherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LauncherStaticRouter extends StaticRouter { + protected launcherCallbacks: LauncherCallbacks; + constructor(launcherCallbacks: LauncherCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/LocationStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/LocationStaticRouter.d.ts new file mode 100644 index 0000000..b6de956 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/LocationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LocationStaticRouter extends StaticRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/MatchStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/MatchStaticRouter.d.ts new file mode 100644 index 0000000..9920a92 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/MatchStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { MatchCallbacks } from "../../callbacks/MatchCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class MatchStaticRouter extends StaticRouter { + protected matchCallbacks: MatchCallbacks; + constructor(matchCallbacks: MatchCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/NotifierStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/NotifierStaticRouter.d.ts new file mode 100644 index 0000000..8f1f5cc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/NotifierStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class NotifierStaticRouter extends StaticRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/PresetStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/PresetStaticRouter.d.ts new file mode 100644 index 0000000..a9e7458 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/PresetStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class PresetStaticRouter extends StaticRouter { + protected presetCallbacks: PresetBuildCallbacks; + constructor(presetCallbacks: PresetBuildCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/ProfileStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/ProfileStaticRouter.d.ts new file mode 100644 index 0000000..83403f2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/ProfileStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ProfileCallbacks } from "../../callbacks/ProfileCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ProfileStaticRouter extends StaticRouter { + protected profileCallbacks: ProfileCallbacks; + constructor(profileCallbacks: ProfileCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/QuestStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/QuestStaticRouter.d.ts new file mode 100644 index 0000000..8f7ca0a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/QuestStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class QuestStaticRouter extends StaticRouter { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/RagfairStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/RagfairStaticRouter.d.ts new file mode 100644 index 0000000..6c41467 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/RagfairStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class RagfairStaticRouter extends StaticRouter { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/TraderStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/TraderStaticRouter.d.ts new file mode 100644 index 0000000..41728a1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/TraderStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class TraderStaticRouter extends StaticRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/WeatherStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/WeatherStaticRouter.d.ts new file mode 100644 index 0000000..72ed851 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/routers/static/WeatherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { WeatherCallbacks } from "../../callbacks/WeatherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class WeatherStaticRouter extends StaticRouter { + protected weatherCallbacks: WeatherCallbacks; + constructor(weatherCallbacks: WeatherCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/servers/ConfigServer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/servers/ConfigServer.d.ts new file mode 100644 index 0000000..a079be8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/servers/ConfigServer.d.ts @@ -0,0 +1,14 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigTypes } from "../models/enums/ConfigTypes"; +export declare class ConfigServer { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected configs: Record; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil); + getConfig(configType: ConfigTypes): T; + getConfigByString(configType: string): T; + initialize(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/servers/DatabaseServer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/servers/DatabaseServer.d.ts new file mode 100644 index 0000000..aa152d0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/servers/DatabaseServer.d.ts @@ -0,0 +1,6 @@ +import { IDatabaseTables } from "../models/spt/server/IDatabaseTables"; +export declare class DatabaseServer { + protected tableData: IDatabaseTables; + getTables(): IDatabaseTables; + setTables(any: any): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/servers/HttpServer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/servers/HttpServer.d.ts new file mode 100644 index 0000000..5234966 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/servers/HttpServer.d.ts @@ -0,0 +1,49 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { Serializer } from "../di/Serializer"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { HttpRouter } from "../routers/HttpRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ConfigServer } from "./ConfigServer"; +import { DatabaseServer } from "./DatabaseServer"; +export declare class HttpServer implements IHttpServer { + protected httpRouter: HttpRouter; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected serializers: Serializer[]; + protected configServer: ConfigServer; + constructor(httpRouter: HttpRouter, // TODO: delay required + logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, serializers: Serializer[], configServer: ConfigServer); + protected buffers: {}; + protected onReceive: {}; + protected onRespond: {}; + protected httpConfig: IHttpConfig; + protected webSockets: {}; + protected websocketPingHandler: any; + getCookies(req: http.IncomingMessage): any; + resetBuffer(sessionID: string): void; + putInBuffer(sessionID: any, data: any, bufLength: number): boolean; + getFromBuffer(sessionID: string): any; + sendZlibJson(resp: any, output: any, sessionID: string): void; + sendMessage(sessionID: string, output: INotification): void; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + handleRequest(req: http.IncomingMessage, resp: http.ServerResponse): void; + load(): void; + protected getRandomisedMessage(): string; + wsOnConnection(ws: any, req: any): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/servers/RagfairServer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/servers/RagfairServer.d.ts new file mode 100644 index 0000000..60c92b5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/servers/RagfairServer.d.ts @@ -0,0 +1,31 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { ConfigServer } from "./ConfigServer"; +export declare class RagfairServer { + protected logger: ILogger; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairCategoriesService: RagfairCategoriesService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairOfferService: RagfairOfferService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); + load(): void; + update(): void; + getCategories(): Record; + /** + * Disable/Hide an offer from flea + * @param offerId + */ + hideOffer(offerId: string): void; + getOffer(offerID: string): IRagfairOffer; + getOffers(): IRagfairOffer[]; + removeOfferStack(offerID: string, amount: number): void; + doesOfferExist(offerId: string): boolean; + addPlayerOffers(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/servers/SaveServer.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/servers/SaveServer.d.ts new file mode 100644 index 0000000..cb28f49 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/servers/SaveServer.d.ts @@ -0,0 +1,28 @@ +import { IAkiProfile, Info } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { SaveLoadRouter } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class SaveServer { + protected vfs: VFS; + protected saveLoadRouters: SaveLoadRouter[]; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected profileFilepath: string; + protected profiles: {}; + protected onSave: {}; + protected saveMd5: {}; + constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger); + load(): void; + save(): void; + getProfile(sessionId: string): IAkiProfile; + getProfiles(): Record; + deleteProfileById(sessionID: string): boolean; + createProfile(profileInfo: Info): void; + addProfile(profileDetails: IAkiProfile): void; + loadProfile(sessionID: string): void; + saveProfile(sessionID: string): void; + removeProfile(sessionID: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/FenceService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/FenceService.d.ts new file mode 100644 index 0000000..12723fb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/FenceService.d.ts @@ -0,0 +1,39 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { FenceLevel } from "../models/eft/common/IGlobals"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class FenceService { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected fenceAssort: ITraderAssort; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, presetHelper: PresetHelper, configServer: ConfigServer); + protected setFenceAssort(fenceAssort: ITraderAssort): void; + getFenceAssorts(): ITraderAssort; + hasExpiredCache(refreshAssort: boolean): boolean; + generateFenceAssortCache(pmcData: IPmcData): void; + /** + * + * @param pmcData Get the fence level the passed in profile has + * @returns FenceLevel + */ + getFenceInfo(pmcData: IPmcData): FenceLevel; + removeFenceOffer(assortIdToRemove: string): void; + updateFenceOffers(pmcData: IPmcData): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/HashCacheService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/HashCacheService.d.ts new file mode 100644 index 0000000..5320f28 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/HashCacheService.d.ts @@ -0,0 +1,19 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +export declare class HashCacheService { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected jsonHashes: any; + protected modHashes: any; + protected readonly modCachePath = "./user/cache/modCache.json"; + constructor(vfs: VFS, hashUtil: HashUtil, jsonUtil: JsonUtil, logger: ILogger); + getStoredModHash(modName: string): string; + modContentMatchesStoredHash(modName: string, modContent: string): boolean; + hashMatchesStoredHash(modName: string, modHash: string): boolean; + storeModContent(modName: string, modContent: string): void; + storeModHash(modName: string, modHash: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/InsuranceService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/InsuranceService.d.ts new file mode 100644 index 0000000..0219816 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/InsuranceService.d.ts @@ -0,0 +1,42 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { SecureContainerHelper } from "../helpers/SecureContainerHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected secureContainerHelper: SecureContainerHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected traderHelper: TraderHelper; + protected dialogueHelper: DialogueHelper; + protected configServer: ConfigServer; + protected insured: Record>; + protected templatesById: {}; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, secureContainerHelper: SecureContainerHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, saveServer: SaveServer, traderHelper: TraderHelper, dialogueHelper: DialogueHelper, configServer: ConfigServer); + insuranceExists(sessionId: string): boolean; + insuranceTraderArrayExists(sessionId: string, traderId: string): boolean; + getInsurance(sessionId: string): Record; + getInsuranceItems(sessionId: string, traderId: string): any[]; + resetInsurance(sessionId: string): void; + resetInsuranceTraderArray(sessionId: string, traderId: string): void; + addInsuranceItemToArray(sessionId: string, traderId: string, itemToAdd: any): void; + getItemPrice(_tpl: string): number; + generateTemplatesById(): void; + sendInsuredItems(pmcData: IPmcData, sessionID: string): void; + storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + protected addGearToSend(pmcData: IPmcData, insuredItem: any, actualItem: any, sessionID: string): any; + getPremium(pmcData: IPmcData, inventoryItem: Item, traderId: string): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/MatchLocationService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/MatchLocationService.d.ts new file mode 100644 index 0000000..2b5fc0e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/MatchLocationService.d.ts @@ -0,0 +1,8 @@ +import { TimeUtil } from "../utils/TimeUtil"; +export declare class MatchLocationService { + protected timeUtil: TimeUtil; + protected locations: {}; + constructor(timeUtil: TimeUtil); + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/ModCompilerService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/ModCompilerService.d.ts new file mode 100644 index 0000000..26cb4ac --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/ModCompilerService.d.ts @@ -0,0 +1,20 @@ +import * as ts from "typescript"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { VFS } from "../utils/VFS"; +import { HashCacheService } from "./HashCacheService"; +export declare class ModCompilerService { + protected logger: ILogger; + protected hashCacheService: HashCacheService; + protected vfs: VFS; + constructor(logger: ILogger, hashCacheService: HashCacheService, vfs: VFS); + compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise; + protected compile(fileNames: string[], options: ts.CompilerOptions): Promise; + protected buildDepth(depth: number): string; + protected getNodesModulesPath(depth: number): string; + protected getAkiPath(depth: number): string; + protected getAkiFolder(): string; + protected getNodesModulesFolder(): string; + protected calculateDepth(file: string): number; + protected areFilesReady(fileNames: string[]): boolean; + protected delay(ms: number): Promise; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/NotificationService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/NotificationService.d.ts new file mode 100644 index 0000000..7e2a127 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/NotificationService.d.ts @@ -0,0 +1,21 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +export declare class NotificationService { + protected messageQueue: {}; + getMessageQueue(): {}; + getMessageFromQueue(sessionId: string): any; + updateMessageOnQueue(sessionId: string, value: any[]): void; + has(sessionID: string): boolean; + /** + * Pop first message from queue. + */ + pop(sessionID: string): any; + /** + * Add message to queue + */ + add(sessionID: string, message: INotification): void; + /** + * Get message queue for session + * @param sessionID + */ + get(sessionID: string): any; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/PaymentService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/PaymentService.d.ts new file mode 100644 index 0000000..5834750 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/PaymentService.d.ts @@ -0,0 +1,49 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PaymentService { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + /** + * Take money and insert items into return to server request + * @param {Object} pmcData + * @param {Object} body + * @param {string} sessionID + * @returns Object + */ + payMoney(pmcData: IPmcData, body: IProcessBuyTradeRequestData, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Receive money back after selling + * @param {IPmcData} pmcData + * @param {number} amount + * @param {IProcessSellTradeRequestData} body + * @param {IItemEventRouterResponse} output + * @param {string} sessionID + * @returns IItemEventRouterResponse + */ + getMoney(pmcData: IPmcData, amount: number, body: IProcessSellTradeRequestData, output: IItemEventRouterResponse, sessionID: string): IItemEventRouterResponse; + /** + * Recursively checks if the given item is + * inside the stash, that is it has the stash as + * ancestor with slotId=hideout + */ + protected isItemInStash(pmcData: IPmcData, item: Item): boolean; + addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/PlayerService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/PlayerService.d.ts new file mode 100644 index 0000000..519b7e5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/PlayerService.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPlayerIncrementSkillLevelRequestData } from "../models/eft/player/IPlayerIncrementSkillLevelRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PlayerService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, databaseServer: DatabaseServer); + /** + * increases the profile skill and updates any output + * @param {Object} pmcData + * @param {Object} output + * @param {String} skillName + * @param {Number} amount + */ + incrementSkillLevel(pmcData: IPmcData, output: IPlayerIncrementSkillLevelRequestData, skillName: string, amount: number): void; + /** + * @param {Object} pmcData + * @returns number + */ + calculateLevel(pmcData: IPmcData): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairCategoriesService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairCategoriesService.d.ts new file mode 100644 index 0000000..09956cc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairCategoriesService.d.ts @@ -0,0 +1,10 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +export declare class RagfairCategoriesService { + updateCategories(offers: IRagfairOffer[]): void; + protected categories: Record; + getCategories(): Record; + getCategoryByItemId(itemId: string): number; + resetCategories(): void; + setCategoryValue(itemId: string, newValue: number): void; + incrementCategory(itemId: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairLinkedItemService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairLinkedItemService.d.ts new file mode 100644 index 0000000..6c34ee0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairLinkedItemService.d.ts @@ -0,0 +1,10 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +export declare class RagfairLinkedItemService { + protected databaseServer: DatabaseServer; + protected linkedItemsCache: Record>; + constructor(databaseServer: DatabaseServer); + getLinkedItems(linkedSearchId: string): Iterable; + protected buildLinkedItemTable(): void; + protected getFilters(item: ITemplateItem, slot: string): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairOfferService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairOfferService.d.ts new file mode 100644 index 0000000..7afbf8c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairOfferService.d.ts @@ -0,0 +1,66 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairOfferService { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected ragfairServerHelper: RagfairServerHelper; + protected profileHelper: ProfileHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected playerOffersLoaded: boolean; + protected toUpdate: Record; + protected expiredOffers: Item[]; + protected offers: IRagfairOffer[]; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, configServer: ConfigServer); + getOffers(): IRagfairOffer[]; + getOfferByOfferId(offerId: string): IRagfairOffer; + getOffersOfType(templateId: string): IRagfairOffer[]; + addOffer(offer: IRagfairOffer): void; + addOfferToExpired(offer: Item): void; + setTraderUpdateStatus(traderId: string, shouldUpdate: boolean): void; + shouldTraderBeUpdated(traderID: string): boolean; + getExpiredOfferCount(): number; + /** + * Get an array of expired items not yet processed into new offers + * @returns items that need to be turned into offers + */ + getExpiredOffers(): Item[]; + resetExpiredOffers(): void; + /** + * Does the offer exist on the ragfair + * @param offerId offer id to check for + * @returns offer exists - true + */ + doesOfferExist(offerId: string): boolean; + getTraders(): Record; + flagTraderForUpdate(expiredOfferUserId: string): void; + removeOfferById(offerId: string): void; + removeOfferStack(offerID: string, amount: number): void; + removeAllOffersByTrader(traderId: string): void; + addTradersToUpdateList(): void; + addPlayerOffers(): void; + expireStaleOffers(): void; + /** + * Get an array of stale offers that are still shown to player + * @returns IRagfairOffer array + */ + protected getStaleOffers(): IRagfairOffer[]; + protected isStale(offer: IRagfairOffer, time: number): boolean; + protected processStaleOffer(staleOffer: IRagfairOffer): void; + protected returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairPriceService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairPriceService.d.ts new file mode 100644 index 0000000..5256b99 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairPriceService.d.ts @@ -0,0 +1,32 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { IRagfairServerPrices } from "../models/spt/ragfair/IRagfairServerPrices"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RagfairPriceService { + protected handbookHelper: HandbookHelper; + protected databaseServer: DatabaseServer; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected prices: IRagfairServerPrices; + constructor(handbookHelper: HandbookHelper, databaseServer: DatabaseServer, logger: ILogger, itemHelper: ItemHelper, presetHelper: PresetHelper, randomUtil: RandomUtil, configServer: ConfigServer); + generateStaticPrices(): void; + generateDynamicPrices(): void; + hasDynamicPrices(): boolean; + getDynamicPrice(itemTpl: string): number; + getAllFleaPrices(): Record; + getFleaPriceForItem(tplId: string): number; + getBarterPrice(barterScheme: IBarterScheme[]): number; + getDynamicOfferPrice(items: Item[], desiredCurrency: string): number; + getWeaponPresetPrice(item: Item, items: Item[], existingPrice: number): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairRequiredItemsService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairRequiredItemsService.d.ts new file mode 100644 index 0000000..b05fc65 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/RagfairRequiredItemsService.d.ts @@ -0,0 +1,12 @@ +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairRequiredItemsService { + protected logger: ILogger; + protected paymentHelper: PaymentHelper; + protected ragfairOfferService: RagfairOfferService; + protected requiredItemsCache: {}; + constructor(logger: ILogger, paymentHelper: PaymentHelper, ragfairOfferService: RagfairOfferService); + getRequiredItems(searchId: string): any; + buildRequiredItemTable(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/TraderAssortService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/TraderAssortService.d.ts new file mode 100644 index 0000000..5ba2d05 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/TraderAssortService.d.ts @@ -0,0 +1,6 @@ +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +export declare class TraderAssortService { + protected pristineTraderAssorts: Record; + getPristineTraderAssort(traderId: string): ITraderAssort; + setPristineTraderAssort(traderId: string, assort: ITraderAssort): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts new file mode 100644 index 0000000..abfe237 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter, RouteAction } from "../../../di/Router"; +export declare class DynamicRouterMod extends DynamicRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts new file mode 100644 index 0000000..6742fc6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class DynamicRouterModService { + private container; + constructor(container: DependencyContainer); + registerDynamicRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/image/imageRouteService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/image/imageRouteService.d.ts new file mode 100644 index 0000000..29569b2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/image/imageRouteService.d.ts @@ -0,0 +1,6 @@ +export declare class ImageRouteService { + protected routes: Record; + addRoute(urlKey: string, route: string): void; + getByKey(urlKey: string): string; + existsByKey(urlKey: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts new file mode 100644 index 0000000..53fb062 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onLoad/OnLoadMod.d.ts @@ -0,0 +1,8 @@ +import { OnLoad } from "../../../di/OnLoad"; +export declare class OnLoadMod extends OnLoad { + private onLoadOverride; + private getRouteOverride; + constructor(onLoadOverride: () => void, getRouteOverride: () => string); + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts new file mode 100644 index 0000000..f402103 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onLoad/OnLoadModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnLoadModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts new file mode 100644 index 0000000..ee89043 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onUpdate/OnUpdateMod.d.ts @@ -0,0 +1,8 @@ +import { OnUpdate } from "../../../di/OnUpdate"; +export declare class OnUpdateMod extends OnUpdate { + private onUpdateOverride; + private getRouteOverride; + constructor(onUpdateOverride: (timeSinceLastRun: number) => boolean, getRouteOverride: () => string); + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts new file mode 100644 index 0000000..05d735b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/onUpdate/OnUpdateModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnUpdateModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts new file mode 100644 index 0000000..1e62747 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/staticRouter/StaticRouterMod.d.ts @@ -0,0 +1,6 @@ +import { RouteAction, StaticRouter } from "../../../di/Router"; +export declare class StaticRouterMod extends StaticRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts new file mode 100644 index 0000000..f28fd45 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/services/mod/staticRouter/StaticRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class StaticRouterModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/App.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/App.d.ts new file mode 100644 index 0000000..34c141e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/App.d.ts @@ -0,0 +1,14 @@ +import { TimeUtil } from "./TimeUtil"; +import { OnLoad } from "../di/OnLoad"; +import { OnUpdate } from "../di/OnUpdate"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class App { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected onLoadComponents: OnLoad[]; + protected onUpdateComponents: OnUpdate[]; + protected onUpdateLastRun: {}; + constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]); + load(): void; + protected update(onUpdateComponents: OnUpdate[]): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/AyncQueue.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/AyncQueue.d.ts new file mode 100644 index 0000000..da6ab18 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/AyncQueue.d.ts @@ -0,0 +1,7 @@ +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { ICommand } from "../models/spt/utils/ICommand"; +export declare class AsyncQueue implements IAsyncQueue { + protected commandsQueue: ICommand[]; + constructor(); + waitFor(command: ICommand): Promise; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/DatabaseImporter.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/DatabaseImporter.d.ts new file mode 100644 index 0000000..0857b67 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/DatabaseImporter.d.ts @@ -0,0 +1,18 @@ +import { VFS } from "./VFS"; +import { JsonUtil } from "./JsonUtil"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ImageRouter } from "../routers/ImageRouter"; +import { OnLoad } from "../di/OnLoad"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class DatabaseImporter extends OnLoad { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected imageRouter: ImageRouter; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter); + onLoad(): void; + getRoute(): string; + loadRecursive(filepath: string): any; + loadImages(filepath: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/HashUtil.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/HashUtil.d.ts new file mode 100644 index 0000000..bacbf2a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/HashUtil.d.ts @@ -0,0 +1,11 @@ +/// +import crypto from "crypto"; +import { TimeUtil } from "./TimeUtil"; +export declare class HashUtil { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + generate(): string; + generateMd5ForData(data: string): string; + generateSha1ForData(data: string): string; + generateHashForData(algorithm: string, data: crypto.BinaryLike): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/HttpResponseUtil.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/HttpResponseUtil.d.ts new file mode 100644 index 0000000..29502be --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/HttpResponseUtil.d.ts @@ -0,0 +1,16 @@ +import { JsonUtil } from "./JsonUtil"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class HttpResponseUtil { + protected jsonUtil: JsonUtil; + constructor(jsonUtil: JsonUtil); + protected clearString(s: string): any; + noBody(data: any): any; + getBody(data: T, err?: number, errmsg?: any): IGetBodyResponseData; + getUnclearedBody(data: any, err?: number, errmsg?: any): string; + emptyResponse(): IGetBodyResponseData; + nullResponse(): INullResponseData; + emptyArrayResponse(): IGetBodyResponseData; + appendErrorToOutput(output: IItemEventRouterResponse, message?: string, title?: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/JsonUtil.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/JsonUtil.d.ts new file mode 100644 index 0000000..71e95f6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/JsonUtil.d.ts @@ -0,0 +1,25 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "./HashUtil"; +import { VFS } from "./VFS"; +export declare class JsonUtil { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected fileHashes: any; + constructor(vfs: VFS, hashUtil: HashUtil, logger: ILogger); + /** + * From object to string + * @param data object to turn into JSON + * @param prettify Should output be prettified? + * @returns string + */ + serialize(data: any, prettify?: boolean): string; + /** + * From string to object + * @param jsonString json string to turn into object + * @returns object + */ + deserialize(jsonString: string): any; + deserializeWithCacheCheck(jsonString: string, filePath: string): string; + clone(data: T): T; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/Logger.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/Logger.d.ts new file mode 100644 index 0000000..f5b774b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/Logger.d.ts @@ -0,0 +1,51 @@ +/// +import { Daum } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ILogger } from "../models/spt/utils/ILogger"; +import winston from "winston"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +import fs from "fs"; +interface SptLogger { + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} +export declare class WinstonLogger implements ILogger { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + protected showDebugInConsole: boolean; + protected folderPath: string; + protected file: string; + protected filePath: string; + protected logLevels: { + levels: { + error: number; + warn: number; + succ: number; + info: number; + custom: number; + debug: number; + }; + colors: { + error: string; + warn: string; + succ: string; + info: string; + custom: string; + debug: string; + }; + }; + protected logger: winston.Logger & SptLogger; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + writeToLogFile(data: string | Daum): Promise; + log(data: string | Error | Record, color: string): Promise; + error(data: string | Record): Promise; + warning(data: string | Record): Promise; + success(data: string | Record): Promise; + info(data: string | Record): Promise; + debug(data: string | Record, onlyShowInConsole?: boolean): Promise; +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/MathUtil.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/MathUtil.d.ts new file mode 100644 index 0000000..ea5fd69 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/MathUtil.d.ts @@ -0,0 +1,53 @@ +export declare class MathUtil { + /** + * Helper to create the sum of all array elements + * @param {array} values The array with numbers of which to calculate the sum + * @return {number} sum(values) + */ + arraySum(values: number[]): number; + /** + * Helper to create the cumulative sum of all array elements + * arrayCumsum([1, 2, 3, 4]) = [1, 3, 6, 10] + * @param {array} values The array with numbers of which to calculate the cumulative sum + * @return {array} cumsum(values) + */ + arrayCumsum(values: number[]): number[]; + /** + * Helper to create the product of each element times factor + * @param {array} values The array of numbers which shall be multiplied by the factor + * @return {array} array times factor + */ + arrayProd(values: number[], factor: number): number[]; + /** + * Helper to add a constant to all array elements + * @param {array} values The array of numbers to which the summand should be added + * @return {array} array plus summand + */ + arrayAdd(values: number[], summand: number): number[]; + /** + * Map a value from an input range to an output range linearly + * + * Example: + * a_min = 0; a_max=1; + * b_min = 1; b_max=3; + * MathUtil.mapToRange(0.5, a_min, a_max, b_min, b_max) // returns 2 + * + * @param {number} x The value from input range to be mapped to output range + * @param {number} minIn min of input range + * @param {number} maxIn max of input range + * @param {number} minOut min of output range + * @param {number} maxOut max of outout range + * @return {number} the result of the mapping + */ + mapToRange(x: number, minIn: number, maxIn: number, minOut: number, maxOut: number): number; + /** + * Linear interpolation + * e.g. used to do a continuous integration for quest rewards which are defined for specific support centers of pmcLevel + * + * @param {string} xp the point of x at which to interpolate + * @param {array} x support points in x (of same length as y) + * @param {array} y support points in y (of same length as x) + * @return {number} y(xp) + */ + interp1(xp: number, x: number[], y: number[]): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/ObjectId.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/ObjectId.d.ts new file mode 100644 index 0000000..03aae56 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/ObjectId.d.ts @@ -0,0 +1,14 @@ +/// +import { TimeUtil } from "./TimeUtil"; +export declare class ObjectId { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + protected randomBytes: Buffer; + protected constglobalCounter: number; + protected consttime: number; + protected globalCounter: number; + protected time: number; + incGlobalCounter(): number; + toHexString(byteArray: string | any[] | Buffer): string; + generate(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/RandomUtil.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/RandomUtil.d.ts new file mode 100644 index 0000000..c24dd60 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/RandomUtil.d.ts @@ -0,0 +1,153 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "./JsonUtil"; +import { MathUtil } from "./MathUtil"; +/** + * Array of ProbabilityObjectArray which allow to randomly draw of the contained objects + * based on the relative probability of each of its elements. + * The probabilities of the contained element is not required to be normalized. + * + * Example: + * po = new ProbabilityObjectArray( + * new ProbabilityObject("a", 5), + * new ProbabilityObject("b", 1), + * new ProbabilityObject("c", 1) + * ); + * res = po.draw(10000); + * // count the elements which should be distributed according to the relative probabilities + * res.filter(x => x==="b").reduce((sum, x) => sum + 1 , 0) + */ +export declare class ProbabilityObjectArray extends Array> { + private mathUtil; + constructor(mathUtil: MathUtil, ...items: ProbabilityObject[]); + filter(callbackfn: (value: ProbabilityObject, index: number, array: ProbabilityObject[]) => any): ProbabilityObjectArray; + /** + * Calculates the normalized cumulative probability of the ProbabilityObjectArray's elements normalized to 1 + * @param {array} probValues The relative probability values of which to calculate the normalized cumulative sum + * @returns {array} Cumulative Sum normalized to 1 + */ + cumulativeProbability(probValues: number[]): number[]; + /** + * Clone this ProbabilitObjectArray + * @returns {ProbabilityObjectArray} Deep Copy of this ProbabilityObjectArray + */ + clone(): ProbabilityObjectArray; + /** + * Drop an element from the ProbabilityObjectArray + * + * @param {string} key The key of the element to drop + * @returns {ProbabilityObjectArray} ProbabilityObjectArray without the dropped element + */ + drop(key: K): ProbabilityObjectArray; + /** + * Return the data field of a element of the ProbabilityObjectArray + * @param {string} key The key of the element whose data shall be retrieved + * @returns {object} The data object + */ + data(key: K): V; + /** + * Get the relative probability of an element by its key + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @param {string} key The key of the element whose relative probability shall be retrieved + * @return {number} The relative probability + */ + probability(key: K): number; + /** + * Get the maximum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @return {number} the maximum value of all relative probabilities in this ProbabilityObjectArray + */ + maxProbability(): number; + /** + * Get the minimum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.minProbability() // returns 1 + * + * @return {number} the minimum value of all relative probabilities in this ProbabilityObjectArray + */ + minProbability(): number; + /** + * Draw random element of the ProbabilityObject N times to return an array of N keys. + * Drawing can be with or without replacement + * + * @param {integer} count The number of times we want to draw + * @param {boolean} replacement Draw with or without replacement from the input dict + * @param {array} locklist list keys which shall be replaced even if drawing without replacement + * @return {array} Array consisting of N random keys for this ProbabilityObjectArray + */ + draw(count?: number, replacement?: boolean, locklist?: Array): K[]; +} +/** + * A ProbabilityObject which is use as an element to the ProbabilityObjectArray array + * It contains a key, the relative probability as well as optional data. + */ +export declare class ProbabilityObject { + key: K; + relativeProbability: number; + data: V; + /** + * Constructor for the ProbabilityObject + * @param {string} key The key of the element + * @param {number} relativeProbability The relative probability of this element + * @param {any} data Optional data attached to the element + */ + constructor(key: K, relativeProbability: number, data?: V); +} +export declare class RandomUtil { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + constructor(jsonUtil: JsonUtil, logger: ILogger); + getInt(min: number, max: number): number; + getIntEx(max: number): number; + getFloat(min: number, max: number): number; + getBool(): boolean; + getStringArrayValue(arr: string[]): string; + getArrayValue(arr: T[]): T; + getKey(node: any): string; + getKeyValue(node: { + [x: string]: any; + }): any; + /** + * Draw from normal distribution + * @param {number} mu Mean of the normal distribution + * @param {number} sigma Standard deviation of the normal distribution + * @returns {number} The value drawn + */ + randn(mu: number, sigma: number): number; + /** + * Draw Random integer low inclusive, high exclusive + * if high is not set we draw from 0 to low (exclusive) + * @param {integer} low Lower bound inclusive, when high is not set, this is high + * @param {integer} high Higher bound exclusive + * @returns {integer} The random integer in [low, high) + */ + randInt(low: number, high?: number): number; + /** + * Draw a random element of the provided list N times to return an array of N random elements + * 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 + * @return {array} Array consisting of N random elements + */ + drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; + /** + * Draw a random (top level) element of the provided dictionary N times to return an array of N random dictionary keys + * Drawing can be with or without replacement + * @param {any} dict The dictionary 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 dict + * @return {array} Array consisting of N random keys of the dictionary + */ + drawRandomFromDict(dict: any, count?: number, replacement?: boolean): any[]; + getBiasedRandomNumber(min: number, max: number, shift: number, n: number): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/TimeUtil.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/TimeUtil.d.ts new file mode 100644 index 0000000..9733be9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/TimeUtil.d.ts @@ -0,0 +1,8 @@ +export declare class TimeUtil { + static readonly oneHourAsSeconds = 3600; + formatTime(date: Date): string; + formatDate(date: Date): string; + getDate(): string; + getTime(): string; + getTimestamp(): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/UUidGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/UUidGenerator.d.ts new file mode 100644 index 0000000..000b719 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/UUidGenerator.d.ts @@ -0,0 +1,4 @@ +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class UUidGenerator implements IUUidGenerator { + generate: () => string; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/VFS.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/VFS.d.ts new file mode 100644 index 0000000..e5eaf02 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/VFS.d.ts @@ -0,0 +1,55 @@ +/// +/// +import "reflect-metadata"; +import fs from "fs"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class VFS { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; + copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; + mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { + recursive: true; + }) => Promise; + readFilePromisify: (path: fs.PathLike) => Promise; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + readdirPromisify: (path: fs.PathLike, options?: BufferEncoding | { + encoding: BufferEncoding; + withFileTypes?: false; + }) => Promise; + statPromisify: (path: fs.PathLike, options?: fs.StatOptions & { + bigint?: false; + }) => Promise; + unlinkPromisify: (path: fs.PathLike) => Promise; + rmdirPromisify: (path: fs.PathLike) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + exists(filepath: fs.PathLike): boolean; + existsAsync(filepath: fs.PathLike): Promise; + copyFile(filepath: fs.PathLike, target: fs.PathLike): void; + copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise; + createDir(filepath: string): void; + createDirAsync(filepath: string): Promise; + copyDir(filepath: string, target: string, fileExtensions?: string | string[]): void; + copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise; + readFile(filepath: string): any; + readFileAsync(filepath: string): Promise; + writeFile(filepath: any, data?: string, append?: boolean, atomic?: boolean): void; + writeFileAsync(filepath: any, data?: string, append?: boolean, atomic?: boolean): Promise; + getFiles(filepath: string): string[]; + getFilesAsync(filepath: string): Promise; + getDirs(filepath: string): string[]; + getDirsAsync(filepath: string): Promise; + removeFile(filepath: string): void; + removeFileAsync(filepath: string): Promise; + removeDir(filepath: string): void; + removeDirAsync(filepath: string): Promise; + private lockFileSync; + private checkFileSync; + private unlockFileSync; + getFileExtension(filepath: string): string; + stripExtension(filepath: string): string; + minifyAllJsonInDirRecursive(filepath: string): Promise; + minifyAllJsonInDirRecursiveAsync(filepath: string): Promise; + getFilesOfType(directory: string, fileType: string, files?: string[]): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/Watermark.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/Watermark.d.ts new file mode 100644 index 0000000..111bdd0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/Watermark.d.ts @@ -0,0 +1,41 @@ +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WatermarkLocale { + protected locales: { + "en-US": { + description: string[]; + warning: string[]; + modding: string[]; + }; + "zh-CN": { + description: string[]; + warning: string[]; + modding: string[]; + }; + }; + getLocale(): string; + getDescription(): string[]; + getWarning(): string[]; + getModding(): string[]; +} +export declare class Watermark { + protected logger: ILogger; + protected configServer: ConfigServer; + protected watermarkLocale?: WatermarkLocale; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale); + protected text: string[]; + protected versionLabel: string; + initialize(): void; + getVersionTag(): string; + getVersionLabel(): string; + /** Set window title */ + setTitle(): void; + /** Reset console cursor to top */ + resetCursor(): void; + /** Draw the watermark */ + draw(): void; + /** Caculate text length */ + protected textLength(s: string): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/decorators/Singleton.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/decorators/Singleton.d.ts new file mode 100644 index 0000000..7e89026 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/decorators/Singleton.d.ts @@ -0,0 +1,4 @@ +import type constructor from "./constructor"; +import { InjectionToken } from "tsyringe"; +declare function singleton(token?: InjectionToken): (target: constructor) => void; +export default singleton; diff --git a/KcY-SeeItemValue/itemValue/server/dist/types/utils/decorators/constructor.d.ts b/KcY-SeeItemValue/itemValue/server/dist/types/utils/decorators/constructor.d.ts new file mode 100644 index 0000000..416f354 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/dist/types/utils/decorators/constructor.d.ts @@ -0,0 +1,4 @@ +declare type constructor = { + new (...args: any[]): T; +}; +export default constructor; diff --git a/KcY-SeeItemValue/itemValue/server/mod.code-workspace b/KcY-SeeItemValue/itemValue/server/mod.code-workspace new file mode 100644 index 0000000..6732c67 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/mod.code-workspace @@ -0,0 +1,12 @@ +{ + "folders": [ + { + "path": "." + } + ], + "extensions": { + "recommendations": [ + "dbaeumer.vscode-eslint" + ] + } +} \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/server/package.json b/KcY-SeeItemValue/itemValue/server/package.json new file mode 100644 index 0000000..8b36f69 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/package.json @@ -0,0 +1,26 @@ +{ + "name": "SeeItemValue", + "author": "KcY", + "version": "1.3.0", + "license": "NCSA Open Source", + "main": "src/mod.js", + "akiVersion": "3.0.0", + "UpdatedBy": "CWX", + "scripts": { + "setup:environment": "npm i", + "build:unzipped": "copyfiles -e \"./node_modules/**/*.*\" -e \"./dist/**/*.*\" -e \"./package-lock.json\" -e \"./tsconfig.json\" -e \"./README.txt\" -e \"./mod.code-workspace\" ./**/*.* ./dist", + "zip:files": "cd dist/ && bestzip ../mod.zip *", + "build:zip": "npm run clean:environment && npm run build:unzipped && npm run zip:files", + "clean:environment": "node -e \"require('fs').rm('mod.zip', ()=>{})\" && node -e \"require('fs').rmdir('./dist/',{recursive:true},()=>{})\"" + }, + "devDependencies": { + "@types/node": "^14.15.3", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "copyfiles": "2.4.1", + "eslint": "7.26.0", + "tsyringe": "4.6.0", + "typescript": "4.6.4", + "bestzip": "2.2.1" + } +} diff --git a/KcY-SeeItemValue/itemValue/server/src/config.json b/KcY-SeeItemValue/itemValue/server/src/config.json new file mode 100644 index 0000000..7f116ec --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/src/config.json @@ -0,0 +1,4 @@ +{ + "TraderPrice": false, + "TraderMultiplier": 0.54 +} \ No newline at end of file diff --git a/KcY-SeeItemValue/itemValue/server/src/mod.ts b/KcY-SeeItemValue/itemValue/server/src/mod.ts new file mode 100644 index 0000000..d83d48e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/src/mod.ts @@ -0,0 +1,155 @@ +import type { DependencyContainer } from "tsyringe"; +import { IMod } from "@spt-aki/models/external/mod"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; +import { DynamicRouterModService } from "@spt-aki/services/mod/dynamicRouter/DynamicRouterModService" +import { DatabaseServer } from "@spt-aki/servers/DatabaseServer" +import { HttpResponseUtil } from "@spt-aki/utils/HttpResponseUtil" + +class SeeItemValue implements IMod +{ + private name = "KcY-SeeItemValue"; + private version = "1.3.0"; + private logger: ILogger; + private database: DatabaseServer; + private router: DynamicRouterModService; + private http: HttpResponseUtil; + private table; + private livePrice; + private handbookTable; + private therapist; + private ragman; + private jaeger; + private mechanic; + private prapor; + private peacekeeper; + private skier; + private fence; + private tradersArr; + private cfg; + + public load(container: DependencyContainer) + { + this.router = container.resolve("DynamicRouterModService"); + this.logger = container.resolve("WinstonLogger"); + this.http = container.resolve("HttpResponseUtil"); + this.logger.info(`loading: ${this.name} ${this.version}`); + this.cfg = require("./config.json"); + this.addRoute() + } + + public delayedLoad(container: DependencyContainer) + { + this.database = container.resolve("DatabaseServer"); + this.table = this.database.getTables(); + this.livePrice = this.table.templates.prices; + this.handbookTable = this.table.templates.handbook; + this.therapist = this.table.traders["54cb57776803fa99248b456e"].base; + this.ragman = this.table.traders["5ac3b934156ae10c4430e83c"].base; + this.jaeger = this.table.traders["5c0647fdd443bc2504c2d371"].base; + this.mechanic = this.table.traders["5a7c2eca46aef81a7ca2145d"].base; + this.prapor = this.table.traders["54cb50c76803fa8b248b4571"].base; + this.peacekeeper = this.table.traders["5935c25fb3acc3127c3d8cd9"].base; + this.skier = this.table.traders["58330581ace78e27b8b10cee"].base; + this.fence = this.table.traders["579dc571d53a0658a154fbec"].base; + this.tradersArr = [this.therapist, this.ragman, this.jaeger, this.mechanic, this.prapor, this.peacekeeper, this.skier, this.fence]; + } + + private addRoute() + { + this.router.registerDynamicRouter( + "seeitemvalue", + [ + { + url: "/cwx/seeitemvalue/", + action: (url, info, sessionId, output) => + { + return this.onRequestConfig(url, info, sessionId, output) + } + } + ], + "seeitemvalue" + ) + } + + private onRequestConfig(url, info, sessionId, output) + { + const splittedUrl = url.split("/"); + const id = splittedUrl[splittedUrl.length - 1].toLowerCase(); + return this.http.noBody(this.getIdPrice(id)); + } + + private getIdPrice(id) + { + let sPrice = 1; + let sMutli = 1; + let parentId = ""; + + // if TraderPrice in cfg is False get price from flea AVG + if (this.cfg.TraderPrice === false) + { + const result = this.livePrice[id]; + if (typeof result != "undefined") + { + return result; + } + // will still default to Handbook if no price is found for flea AVG + } + // if TraderPrice in cfg is True get price from handbook + // as traders have a modifier, avg is 0.54, closest we can get without checking against each trader + // thanks to TEOA for this info + for (const i in this.handbookTable.Items) + { + if (this.handbookTable.Items[i].Id === id) + { + parentId = this.handbookTable.Items[i].ParentId; + sMutli = this.getBestTraderMulti(parentId); + sPrice = this.handbookTable.Items[i].Price; + const result = (sPrice*sMutli); + + return result; + } + } + return sPrice; + } + + private getBestTraderMulti(parentId) + { + let traderSellCat = ""; + let traderMulti = 0.54; + let traderName = ""; // could be used later to be passed back to module to show trader and price + let altTraderSellCat = ""; + + for (const i in this.handbookTable.Categories) + { + if (this.handbookTable.Categories[i].Id === parentId) + { + traderSellCat = this.handbookTable.Categories[i].Id; + altTraderSellCat = this.handbookTable.Categories[i].ParentId; + break; + } + } + + for (let iter = 0; iter < 8; iter++) + { + if (this.tradersArr[iter].sell_category.includes(traderSellCat)) + { + traderMulti = (100 - this.tradersArr[iter].loyaltyLevels[0].buy_price_coef) / 100; + traderName = this.tradersArr[iter].nickname; + return traderMulti; + } + } + + for (let iter = 0; iter < 8; iter++) + { + if (this.tradersArr[iter].sell_category.includes(altTraderSellCat)) + { + traderMulti = (100 - this.tradersArr[iter].loyaltyLevels[0].buy_price_coef) / 100; + traderName = this.tradersArr[iter].nickname; + return traderMulti; + } + } + return this.cfg.TraderMultiplier; + } +} + +module.exports = { mod: new SeeItemValue() } \ No newline at end of file diff --git a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/tsconfig.json b/KcY-SeeItemValue/itemValue/server/tsconfig.json similarity index 72% rename from Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/tsconfig.json rename to KcY-SeeItemValue/itemValue/server/tsconfig.json index 8ba3117..8151310 100644 --- a/Faupi-MunitionsExpert/MunitionsExpert/Built/Faupi-MunitionsExpert 1.4.1/user/mods/Faupi-MunitionsExpert 1.4.1/tsconfig.json +++ b/KcY-SeeItemValue/itemValue/server/tsconfig.json @@ -8,8 +8,12 @@ "downlevelIteration": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "resolveJsonModule": true, - "outDir": "out" + "resolveJsonModule": true, + "outDir": "tmp", + "baseUrl": ".", + "paths": { + "@spt-aki/*": ["./types/*"] + } }, "lib": [ "es2020" diff --git a/KcY-SeeItemValue/itemValue/server/types/Program.d.ts b/KcY-SeeItemValue/itemValue/server/types/Program.d.ts new file mode 100644 index 0000000..d4b71b9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/Program.d.ts @@ -0,0 +1,4 @@ +export declare class Program { + constructor(); + start(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/TYPES.d.ts b/KcY-SeeItemValue/itemValue/server/types/TYPES.d.ts new file mode 100644 index 0000000..6407c3a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/TYPES.d.ts @@ -0,0 +1,3 @@ +export declare const TYPES: { + [name: string]: symbol; +}; diff --git a/KcY-SeeItemValue/itemValue/server/types/Utils.d.ts b/KcY-SeeItemValue/itemValue/server/types/Utils.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/BotCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/BotCallbacks.d.ts new file mode 100644 index 0000000..2db60dc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/BotCallbacks.d.ts @@ -0,0 +1,15 @@ +import { BotController } from "../controllers/BotController"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BotCallbacks { + protected botController: BotController; + protected httpResponse: HttpResponseUtil; + constructor(botController: BotController, httpResponse: HttpResponseUtil); + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/BundleCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/BundleCallbacks.d.ts new file mode 100644 index 0000000..b28abe1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/BundleCallbacks.d.ts @@ -0,0 +1,18 @@ +import { BundleLoader } from "../loaders/BundleLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class BundleCallbacks { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, bundleLoader: BundleLoader, configServer: ConfigServer); + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/CustomizationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/CustomizationCallbacks.d.ts new file mode 100644 index 0000000..3bab8c0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/CustomizationCallbacks.d.ts @@ -0,0 +1,23 @@ +import { CustomizationController } from "../controllers/CustomizationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class CustomizationCallbacks { + protected customizationController: CustomizationController; + protected saveServer: SaveServer; + protected httpResponse: HttpResponseUtil; + constructor(customizationController: CustomizationController, saveServer: SaveServer, httpResponse: HttpResponseUtil); + getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<{ + _id: string; + suites: string[]; + }>; + getTraderSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/DataCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/DataCallbacks.d.ts new file mode 100644 index 0000000..cfb1c16 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/DataCallbacks.d.ts @@ -0,0 +1,32 @@ +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGlobals } from "../models/eft/common/IGlobals"; +import { ICustomizationItem } from "../models/eft/common/tables/ICustomizationItem"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IHideoutArea } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../models/eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../models/eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../models/eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../models/spt/server/ILocaleBase"; +import { ISettingsBase } from "../models/spt/server/ISettingsBase"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DataCallbacks { + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer); + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/DialogueCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/DialogueCallbacks.d.ts new file mode 100644 index 0000000..634f90b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/DialogueCallbacks.d.ts @@ -0,0 +1,45 @@ +import { DialogueController } from "../controllers/DialogueController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../models/eft/dialog/IFriendRequestData"; +import { IGetAllAttachmentsRequestData } from "../models/eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetChatServerListRequestData } from "../models/eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogInfoRequestData } from "../models/eft/dialog/IGetMailDialogInfoRequestData"; +import { IGetMailDialogListRequestData } from "../models/eft/dialog/IGetMailDialogListRequestData"; +import { IGetMailDialogViewRequestData } from "../models/eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IPinDialogRequestData } from "../models/eft/dialog/IPinDialogRequestData"; +import { IRemoveDialogRequestData } from "../models/eft/dialog/IRemoveDialogRequestData"; +import { ISendMessageRequest } from "../models/eft/dialog/ISendMessageRequest"; +import { ISetDialogReadRequestData } from "../models/eft/dialog/ISetDialogReadRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { DialogueInfo } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class DialogueCallbacks extends OnUpdate { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected dialogueController: DialogueController; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController); + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/GameCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/GameCallbacks.d.ts new file mode 100644 index 0000000..d5cad76 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/GameCallbacks.d.ts @@ -0,0 +1,24 @@ +import { GameController } from "../controllers/GameController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IGameEmptyCrcRequestData } from "../models/eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../models/eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class GameCallbacks { + protected httpResponse: HttpResponseUtil; + protected watermark: Watermark; + protected gameController: GameController; + constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController); + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} +export { GameCallbacks }; diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/HandbookCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/HandbookCallbacks.d.ts new file mode 100644 index 0000000..891e375 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/HandbookCallbacks.d.ts @@ -0,0 +1,8 @@ +import { HandbookController } from "../controllers/HandbookController"; +import { OnLoad } from "../di/OnLoad"; +export declare class HandbookCallbacks extends OnLoad { + protected handbookController: HandbookController; + constructor(handbookController: HandbookController); + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/HealthCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/HealthCallbacks.d.ts new file mode 100644 index 0000000..8f7b89d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/HealthCallbacks.d.ts @@ -0,0 +1,20 @@ +import { HealthController } from "../controllers/HealthController"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class HealthCallbacks { + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected healthController: HealthController; + constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController); + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/HideoutCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/HideoutCallbacks.d.ts new file mode 100644 index 0000000..99ab4c9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/HideoutCallbacks.d.ts @@ -0,0 +1,33 @@ +import { HideoutController } from "../controllers/HideoutController"; +import { OnUpdate } from "../di/OnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../models/eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HideoutCallbacks extends OnUpdate { + protected hideoutController: HideoutController; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(hideoutController: HideoutController, // TODO: delay needed + configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/HttpCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/HttpCallbacks.d.ts new file mode 100644 index 0000000..94c97bd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/HttpCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoad } from "../di/OnLoad"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class HttpCallbacks extends OnLoad { + protected httpServer: IHttpServer; + constructor(httpServer: IHttpServer); + onLoad(): void; + getRoute(): string; + getImage(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/InraidCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/InraidCallbacks.d.ts new file mode 100644 index 0000000..05bcce4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/InraidCallbacks.d.ts @@ -0,0 +1,23 @@ +import { InraidController } from "../controllers/InraidController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IAirdropConfig } from "../models/spt/config/IAirdropConfig"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InraidCallbacks { + protected inraidController: InraidController; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected airdropConfig: IAirdropConfig; + protected inraidConfig: IInRaidConfig; + constructor(inraidController: InraidController, httpResponse: HttpResponseUtil, configServer: ConfigServer); + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/InsuranceCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/InsuranceCallbacks.d.ts new file mode 100644 index 0000000..520d0eb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/InsuranceCallbacks.d.ts @@ -0,0 +1,24 @@ +import { InsuranceController } from "../controllers/InsuranceController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class InsuranceCallbacks extends OnLoadOnUpdate { + protected insuranceController: InsuranceController; + protected insuranceService: InsuranceService; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer); + onLoad(): void; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(secondsSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/InventoryCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/InventoryCallbacks.d.ts new file mode 100644 index 0000000..9ab1486 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/InventoryCallbacks.d.ts @@ -0,0 +1,39 @@ +import { InventoryController } from "../controllers/InventoryController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class InventoryCallbacks { + protected inventoryController: InventoryController; + constructor(inventoryController: InventoryController); + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/ItemEventCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/ItemEventCallbacks.d.ts new file mode 100644 index 0000000..f4f04f9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/ItemEventCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class ItemEventCallbacks { + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter); + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/LauncherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/LauncherCallbacks.d.ts new file mode 100644 index 0000000..c022325 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/LauncherCallbacks.d.ts @@ -0,0 +1,28 @@ +import { LauncherController } from "../controllers/LauncherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../models/eft/launcher/IRemoveProfileData"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { Watermark } from "../utils/Watermark"; +declare class LauncherCallbacks { + protected httpResponse: HttpResponseUtil; + protected launcherController: LauncherController; + protected saveServer: SaveServer; + protected watermark: Watermark; + constructor(httpResponse: HttpResponseUtil, launcherController: LauncherController, saveServer: SaveServer, watermark: Watermark); + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getServerVersion(): string; + ping(url: string, info: IEmptyRequestData, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} +export { LauncherCallbacks }; diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/LocationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/LocationCallbacks.d.ts new file mode 100644 index 0000000..cc69369 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/LocationCallbacks.d.ts @@ -0,0 +1,14 @@ +import { LocationController } from "../controllers/LocationController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IGetLocationRequestData } from "../models/eft/location/IGetLocationRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class LocationCallbacks { + protected httpResponse: HttpResponseUtil; + protected locationController: LocationController; + constructor(httpResponse: HttpResponseUtil, locationController: LocationController); + getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/MatchCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/MatchCallbacks.d.ts new file mode 100644 index 0000000..083c1f5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/MatchCallbacks.d.ts @@ -0,0 +1,35 @@ +import { MatchController } from "../controllers/MatchController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class MatchCallbacks { + protected httpResponse: HttpResponseUtil; + protected jsonUtil: JsonUtil; + protected matchController: MatchController; + protected databaseServer: DatabaseServer; + constructor(httpResponse: HttpResponseUtil, jsonUtil: JsonUtil, matchController: MatchController, databaseServer: DatabaseServer); + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: IGetProfileRequestData, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/ModCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/ModCallbacks.d.ts new file mode 100644 index 0000000..866abf7 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/ModCallbacks.d.ts @@ -0,0 +1,22 @@ +import { OnLoad } from "../di/OnLoad"; +import { DelayedModLoader } from "../loaders/DelayedModLoader"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +declare class ModCallbacks extends OnLoad { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected httpServer: IHttpServer; + protected modLoader: DelayedModLoader; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, httpServer: IHttpServer, modLoader: DelayedModLoader, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} +export { ModCallbacks }; diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/NoteCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/NoteCallbacks.d.ts new file mode 100644 index 0000000..d39d400 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/NoteCallbacks.d.ts @@ -0,0 +1,11 @@ +import { NoteController } from "../controllers/NoteController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +export declare class NoteCallbacks { + protected noteController: NoteController; + constructor(noteController: NoteController); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/NotifierCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/NotifierCallbacks.d.ts new file mode 100644 index 0000000..cd1e736 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/NotifierCallbacks.d.ts @@ -0,0 +1,24 @@ +import { NotifierController } from "../controllers/NotifierController"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../models/eft/notifier/ISelectProfileRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class NotifierCallbacks { + protected httpServerHelper: HttpServerHelper; + protected httpResponse: HttpResponseUtil; + protected notifierController: NotifierController; + constructor(httpServerHelper: HttpServerHelper, httpResponse: HttpResponseUtil, notifierController: NotifierController); + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(_sessionID: string, req: any, resp: any, _data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/PresetBuildCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/PresetBuildCallbacks.d.ts new file mode 100644 index 0000000..8a0c155 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/PresetBuildCallbacks.d.ts @@ -0,0 +1,15 @@ +import { PresetBuildController } from "../controllers/PresetBuildController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PresetBuildCallbacks { + protected httpResponse: HttpResponseUtil; + protected presetBuildController: PresetBuildController; + constructor(httpResponse: HttpResponseUtil, presetBuildController: PresetBuildController); + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/PresetCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/PresetCallbacks.d.ts new file mode 100644 index 0000000..4553f8f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/PresetCallbacks.d.ts @@ -0,0 +1,8 @@ +import { PresetController } from "../controllers/PresetController"; +import { OnLoad } from "../di/OnLoad"; +export declare class PresetCallbacks extends OnLoad { + protected presetController: PresetController; + constructor(presetController: PresetController); + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/ProfileCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/ProfileCallbacks.d.ts new file mode 100644 index 0000000..116e7c5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/ProfileCallbacks.d.ts @@ -0,0 +1,30 @@ +import { ProfileController } from "../controllers/ProfileController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IGetMiniProfileRequestData } from "../models/eft/launcher/IGetMiniProfileRequestData"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileCallbacks { + protected httpResponse: HttpResponseUtil; + protected timeUtil: TimeUtil; + protected profileController: ProfileController; + constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, profileController: ProfileController); + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/QuestCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/QuestCallbacks.d.ts new file mode 100644 index 0000000..559c29e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/QuestCallbacks.d.ts @@ -0,0 +1,26 @@ +import { QuestController } from "../controllers/QuestController"; +import { RepeatableQuestController } from "../controllers/RepeatableQuestController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IListQuestsRequestData } from "../models/eft/quests/IListQuestsRequestData"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class QuestCallbacks { + protected httpResponse: HttpResponseUtil; + protected questController: QuestController; + protected repeatableQuestController: RepeatableQuestController; + constructor(httpResponse: HttpResponseUtil, questController: QuestController, repeatableQuestController: RepeatableQuestController); + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/RagfairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/RagfairCallbacks.d.ts new file mode 100644 index 0000000..d5bab8b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/RagfairCallbacks.d.ts @@ -0,0 +1,39 @@ +import { RagfairController } from "../controllers/RagfairController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAddOfferRequestData } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IRemoveOfferRequestData } from "../models/eft/ragfair/IRemoveOfferRequestData"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected ragfairServer: RagfairServer; + protected ragfairController: RagfairController; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(httpResponse: HttpResponseUtil, logger: ILogger, jsonUtil: JsonUtil, ragfairServer: RagfairServer, ragfairController: RagfairController, configServer: ConfigServer); + onLoad(): void; + getRoute(): string; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + onUpdate(timeSinceLastRun: number): boolean; + sendReport(url: string, info: any, sessionID: string): INullResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/RepairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/RepairCallbacks.d.ts new file mode 100644 index 0000000..63733fa --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/RepairCallbacks.d.ts @@ -0,0 +1,11 @@ +import { RepairController } from "../controllers/RepairController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +export declare class RepairCallbacks { + protected repairController: RepairController; + constructor(repairController: RepairController); + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/SaveCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/SaveCallbacks.d.ts new file mode 100644 index 0000000..bbb6e53 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/SaveCallbacks.d.ts @@ -0,0 +1,9 @@ +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { SaveServer } from "../servers/SaveServer"; +export declare class SaveCallbacks extends OnLoadOnUpdate { + protected saveServer: SaveServer; + constructor(saveServer: SaveServer); + onLoad(): void; + getRoute(): string; + onUpdate(secondsSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/TradeCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/TradeCallbacks.d.ts new file mode 100644 index 0000000..272ae46 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/TradeCallbacks.d.ts @@ -0,0 +1,11 @@ +import { TradeController } from "../controllers/TradeController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +export declare class TradeCallbacks { + protected tradeController: TradeController; + constructor(tradeController: TradeController); + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/TraderCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/TraderCallbacks.d.ts new file mode 100644 index 0000000..128d9b2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/TraderCallbacks.d.ts @@ -0,0 +1,18 @@ +import { TraderController } from "../controllers/TraderController"; +import { OnLoadOnUpdate } from "../di/OnLoadOnUpdate"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class TraderCallbacks extends OnLoadOnUpdate { + protected httpResponse: HttpResponseUtil; + protected traderController: TraderController; + constructor(httpResponse: HttpResponseUtil, traderController: TraderController); + onLoad(): void; + getRoute(): string; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + onUpdate(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/WeatherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/WeatherCallbacks.d.ts new file mode 100644 index 0000000..ae784c8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/WeatherCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WeatherController } from "../controllers/WeatherController"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class WeatherCallbacks { + protected httpResponse: HttpResponseUtil; + protected weatherController: WeatherController; + constructor(httpResponse: HttpResponseUtil, weatherController: WeatherController); + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/callbacks/WishlistCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/callbacks/WishlistCallbacks.d.ts new file mode 100644 index 0000000..c2cc2a8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/callbacks/WishlistCallbacks.d.ts @@ -0,0 +1,10 @@ +import { WishlistController } from "../controllers/WishlistController"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +export declare class WishlistCallbacks { + protected wishlistController: WishlistController; + constructor(wishlistController: WishlistController); + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/BotController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/BotController.d.ts new file mode 100644 index 0000000..09a1788 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/BotController.d.ts @@ -0,0 +1,35 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { BotHelper } from "../helpers/BotHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +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 { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class BotController { + protected databaseServer: DatabaseServer; + protected botGenerator: BotGenerator; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, configServer: ConfigServer); + /** + * Return the number of bot loadout varieties to be generated + * @param type bot Type we want the loadout gen count for + * @returns + */ + getBotPresetGenerationLimit(type: string): number; + getBotCoreDifficulty(): IBotCore; + /** + * Get bot difficulty settings + * adjust PMC settings to ensure they engage the correct bot types + * @param type what bot the server is requesting settings for + * @param difficulty difficulty level server requested settings for + * @returns Difficulty object + */ + getBotDifficulty(type: string, difficulty: string): Difficulty; + protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string): Difficulty; + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/CustomizationController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/CustomizationController.d.ts new file mode 100644 index 0000000..a6c4730 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/CustomizationController.d.ts @@ -0,0 +1,22 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISuit } from "../models/eft/common/tables/ITrader"; +import { IBuyClothingRequestData } from "../models/eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +export declare class CustomizationController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper); + getTraderSuits(traderID: string, sessionID: string): ISuit[]; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; + protected getAllTraderSuits(sessionID: string): ISuit[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/DialogueController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/DialogueController.d.ts new file mode 100644 index 0000000..b15c4b6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/DialogueController.d.ts @@ -0,0 +1,25 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { IGetAllAttachmentsResponse } from "../models/eft/dialog/IGetAllAttachmentsResponse"; +import { IGetFriendListDataResponse } from "../models/eft/dialog/IGetFriendListDataResponse"; +import { IGetMailDialogViewResponseData } from "../models/eft/dialog/IGetMailDialogViewResponseData"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { DialogueInfo, Message } from "../models/eft/profile/IAkiProfile"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class DialogueController { + protected httpResponse: HttpResponseUtil; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + constructor(httpResponse: HttpResponseUtil, saveServer: SaveServer, dialogueHelper: DialogueHelper); + getFriendList(sessionID: string): IGetFriendListDataResponse; + generateDialogueList(sessionID: string): IGetBodyResponseData; + getDialogueInfo(dialogueID: string, sessionID: string): DialogueInfo; + generateDialogueView(dialogueID: string, sessionID: string): IGetMailDialogViewResponseData; + removeDialogue(dialogueID: string, sessionID: string): void; + setDialoguePin(dialogueID: string, shouldPin: boolean, sessionID: string): void; + setRead(dialogueIDs: string[], sessionID: string): void; + getAllAttachments(dialogueID: string, sessionID: string): IGetAllAttachmentsResponse; + protected messagesHaveUncollectedRewards(messages: Message[]): boolean; + protected removeExpiredItems(sessionID: string): void; + update(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/GameController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/GameController.d.ts new file mode 100644 index 0000000..b9067fa --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/GameController.d.ts @@ -0,0 +1,32 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPmcDataRepeatableQuest, IRepeatableQuest } from "../models/eft/common/tables/IRepeatableQuests"; +import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { Watermark } from "../utils/Watermark"; +export declare class GameController { + protected logger: ILogger; + protected watermark: Watermark; + protected httpServerHelper: HttpServerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + constructor(logger: ILogger, watermark: Watermark, httpServerHelper: HttpServerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void; + protected addMissingBonusesProperty(pmcProfile: IPmcData): void; + protected addMissingRepeatableQuestsProperty(pmcProfile: IPmcData): void; + protected addMissingWeaponRepairSkill(pmcProfile: IPmcData): void; + protected addMissingAkiVersionTagToProfile(fullProfile: IAkiProfile): void; + protected addMissingArmorRepairSkill(pmcProfile: IPmcData): void; + protected fixNullTraderSalesSums(pmcProfile: IPmcData): void; + protected removeDanglingConditionCounters(pmcProfile: IPmcData): void; + protected removeDanglingBackendCounters(pmcProfile: IPmcData): void; + getGameConfig(sessionID: string): IGameConfigResponse; + getServer(): any[]; + protected getActiveRepeatableQuests(repeatableQuests: IPmcDataRepeatableQuest[]): IRepeatableQuest[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/HandbookController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/HandbookController.d.ts new file mode 100644 index 0000000..52d2dd8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/HandbookController.d.ts @@ -0,0 +1,8 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class HandbookController { + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + constructor(databaseServer: DatabaseServer, handbookHelper: HandbookHelper); + load(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/HealthController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/HealthController.d.ts new file mode 100644 index 0000000..aafb8df --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/HealthController.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentService } from "../services/PaymentService"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IHealthTreatmentRequestData } from "../models/eft/health/IHealthTreatmentRequestData"; +import { IOffraidEatRequestData } from "../models/eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../models/eft/health/IOffraidHealRequestData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class HealthController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected inventoryHelper: InventoryHelper; + protected healthHelper: HealthHelper; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, healthHelper: HealthHelper); + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/HideoutController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/HideoutController.d.ts new file mode 100644 index 0000000..a8bf229 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/HideoutController.d.ts @@ -0,0 +1,57 @@ +import { HideoutHelper } from "../helpers/HideoutHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { HideoutUpgradeCompleteRequestData } from "../models/eft/hideout/HideoutUpgradeCompleteRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutPutItemInRequestData } from "../models/eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutScavCaseStartRequestData } from "../models/eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeItemOutRequestData } from "../models/eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IHideoutToggleAreaRequestData } from "../models/eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutUpgradeRequestData } from "../models/eft/hideout/IHideoutUpgradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HideoutController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected inventoryHelper: InventoryHelper; + protected saveServer: SaveServer; + protected playerService: PlayerService; + protected presetHelper: PresetHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected hideoutHelper: HideoutHelper; + protected configServer: ConfigServer; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, configServer: ConfigServer); + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + update(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/InraidController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/InraidController.d.ts new file mode 100644 index 0000000..7f2036c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/InraidController.d.ts @@ -0,0 +1,31 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { HealthHelper } from "../helpers/HealthHelper"; +import { InRaidHelper } from "../helpers/InRaidHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InraidController { + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected itemHelper: ItemHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + protected healthHelper: HealthHelper; + protected traderHelper: TraderHelper; + protected insuranceService: InsuranceService; + protected inRaidHelper: InRaidHelper; + protected configServer: ConfigServer; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, extendedProfileHelper: ExtendedProfileHelper, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer); + addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void; + saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/InsuranceController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/InsuranceController.d.ts new file mode 100644 index 0000000..db2c567 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/InsuranceController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IGetInsuranceCostRequestData } from "../models/eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../models/eft/insurance/IInsureRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { InsuranceService } from "../services/InsuranceService"; +import { PaymentService } from "../services/PaymentService"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceController { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected itemEventRouter: ItemEventRouter; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected profileHelper: ProfileHelper; + protected dialogueHelper: DialogueHelper; + protected paymentService: PaymentService; + protected insuranceService: InsuranceService; + protected configServer: ConfigServer; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, itemEventRouter: ItemEventRouter, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required + insuranceService: InsuranceService, configServer: ConfigServer); + processReturn(): void; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse; + cost(info: IGetInsuranceCostRequestData, sessionID: string): any; + doAbsolutelyNothing(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/InventoryController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/InventoryController.d.ts new file mode 100644 index 0000000..b732aa9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/InventoryController.d.ts @@ -0,0 +1,107 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData"; +import { IInventoryCreateMarkerRequestData } from "../models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../models/eft/inventory/IInventoryEditMarkerRequestData"; +import { IInventoryExamineRequestData } from "../models/eft/inventory/IInventoryExamineRequestData"; +import { IInventoryFoldRequestData } from "../models/eft/inventory/IInventoryFoldRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../models/eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventoryRemoveRequestData } from "../models/eft/inventory/IInventoryRemoveRequestData"; +import { IInventorySortRequestData } from "../models/eft/inventory/IInventorySortRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwapRequestData"; +import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData"; +import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class InventoryController { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected presetHelper: PresetHelper; + protected inventoryHelper: InventoryHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemEventRouter: ItemEventRouter; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemEventRouter: ItemEventRouter); + /** + * Move Item + * change location of item with parentId and slotId + * transfers items from one profile to another if fromOwner/toOwner is set in the body. + * otherwise, move is contained within the same profile_f. + */ + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Remove Item from Profile + * Deep tree item deletion, also removes items from insurance list + */ + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Implements functionality "Discard" from Main menu (Stash etc.) + * Removes item from PMC Profile + */ + discardItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Split Item + * spliting 1 item-stack into 2 separate items ... + */ + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Merge Item + * merges 2 items into one, deletes item from `body.item` and adding number of stacks into `body.with` + */ + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Transfer item + * Used to take items from scav inventory into stash or to insert ammo into mags (shotgun ones) and reloading weapon by clicking "Reload" + */ + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Swap Item + * its used for "reload" if you have weapon in hands and magazine is somewhere else in rig or backpack in equipment + */ + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Give Item + * its used for "add" item like gifts etc. + */ + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + /** + * Handles folding of Weapons + */ + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Toggles "Toggleable" items like night vision goggles and face shields. + */ + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles Tagging of items (primary Containers). + */ + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles examining of the item * + */ + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + /** + * Handles sorting of Inventory. + */ + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/LauncherController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/LauncherController.d.ts new file mode 100644 index 0000000..1af1f56 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/LauncherController.d.ts @@ -0,0 +1,28 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { IChangeRequestData } from "../models/eft/launcher/IChangeRequestData"; +import { ILoginRequestData } from "../models/eft/launcher/ILoginRequestData"; +import { IRegisterData } from "../models/eft/launcher/IRegisterData"; +import { Info } from "../models/eft/profile/IAkiProfile"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class LauncherController { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected httpServerHelper: HttpServerHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected coreConfig: ICoreConfig; + constructor(hashUtil: HashUtil, saveServer: SaveServer, httpServerHelper: HttpServerHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + connect(): any; + find(sessionIdKey: string): Info; + login(info: ILoginRequestData): string; + register(info: IRegisterData): string; + protected createAccount(info: IRegisterData): string; + changeUsername(info: IChangeRequestData): string; + changePassword(info: IChangeRequestData): string; + wipe(info: IRegisterData): string; + getCompatibleTarkovVersion(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/LocationController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/LocationController.d.ts new file mode 100644 index 0000000..90b6d7a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/LocationController.d.ts @@ -0,0 +1,18 @@ +import { LocationGenerator } from "../generators/LocationGenerator"; +import { ILocationBase } from "../models/eft/common/ILocationBase"; +import { ILocationsGenerateAllResponse } from "../models/eft/common/ILocationsSourceDestinationBase"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class LocationController { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected locationGenerator: LocationGenerator; + protected databaseServer: DatabaseServer; + protected timeUtil: TimeUtil; + constructor(jsonUtil: JsonUtil, logger: ILogger, locationGenerator: LocationGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil); + get(location: string): ILocationBase; + generate(name: string): ILocationBase; + generateAll(): ILocationsGenerateAllResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/MatchController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/MatchController.d.ts new file mode 100644 index 0000000..c322d96 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/MatchController.d.ts @@ -0,0 +1,30 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IEndOfflineRaidRequestData } from "../models/eft/match/IEndOfflineRaidRequestData"; +import { IGetProfileRequestData } from "../models/eft/match/IGetProfileRequestData"; +import { IStartOfflineRaidRequestData } from "../models/eft/match/IStartOffineRaidRequestData"; +import { IInRaidConfig } from "../models/spt/config/IInRaidConfig"; +import { IMatchConfig } from "../models/spt/config/IMatchConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { MatchLocationService } from "../services/MatchLocationService"; +export declare class MatchController { + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected matchLocationService: MatchLocationService; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected matchConfig: IMatchConfig; + protected inraidConfig: IInRaidConfig; + constructor(saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, configServer: ConfigServer); + getEnabled(): boolean; + getProfile(info: IGetProfileRequestData): IPmcData[]; + protected getMatch(location: any): any; + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; + joinMatch(info: any, sessionID: string): any[]; + getGroupStatus(info: any): any; + startOfflineRaid(info: IStartOfflineRaidRequestData, sessionID: string): void; + endOfflineRaid(info: IEndOfflineRaidRequestData, sessionID: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/NoteController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/NoteController.d.ts new file mode 100644 index 0000000..cc78383 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/NoteController.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { INoteActionData } from "../models/eft/notes/INoteActionData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +declare class NoteController { + protected itemEventRouter: ItemEventRouter; + constructor(itemEventRouter: ItemEventRouter); + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} +export { NoteController }; diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/NotifierController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/NotifierController.d.ts new file mode 100644 index 0000000..31d7bfe --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/NotifierController.d.ts @@ -0,0 +1,22 @@ +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { NotificationService } from "../services/NotificationService"; +import { INotifierChannel } from "../models/eft/notifier/INotifier"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +export declare class NotifierController { + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected notificationService: NotificationService; + protected pollInterval: number; + protected timeout: number; + constructor(notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, notificationService: NotificationService); + /** + * Resolve an array of session notifications. + * + * If no notifications are currently queued then intermittently check for new notifications until either + * one or more appear or when a timeout expires. + * If no notifications are available after the timeout, use a default message. + */ + notifyAsync(sessionID: string): Promise; + getServer(sessionID: string): string; + getChannel(sessionID: string): INotifierChannel; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/PresetBuildController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/PresetBuildController.d.ts new file mode 100644 index 0000000..adf4084 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/PresetBuildController.d.ts @@ -0,0 +1,18 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IPresetBuildActionRequestData } from "../models/eft/presetBuild/IPresetBuildActionRequestData"; +import { WeaponBuild } from "../models/eft/profile/IAkiProfile"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +export declare class PresetBuildController { + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + constructor(hashUtil: HashUtil, itemEventRouter: ItemEventRouter, itemHelper: ItemHelper, saveServer: SaveServer); + getUserBuilds(sessionID: string): WeaponBuild[]; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/PresetController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/PresetController.d.ts new file mode 100644 index 0000000..ca1af1a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/PresetController.d.ts @@ -0,0 +1,8 @@ +import { PresetHelper } from "../helpers/PresetHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetController { + protected presetHelper: PresetHelper; + protected databaseServer: DatabaseServer; + constructor(presetHelper: PresetHelper, databaseServer: DatabaseServer); + initialize(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/ProfileController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/ProfileController.d.ts new file mode 100644 index 0000000..9b7a6d5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/ProfileController.d.ts @@ -0,0 +1,34 @@ +import { ExtendedProfileHelper } from "../helpers/ExtendedProfileHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IMiniProfile } from "../models/eft/launcher/IMiniProfile"; +import { IProfileChangeNicknameRequestData } from "../models/eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../models/eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../models/eft/profile/IProfileCreateRequestData"; +import { ISearchFriendRequestData } from "../models/eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../models/eft/profile/ISearchFriendResponse"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class ProfileController { + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected traderHelper: TraderHelper; + protected extendedProfileHelper: ExtendedProfileHelper; + constructor(hashUtil: HashUtil, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, traderHelper: TraderHelper, extendedProfileHelper: ExtendedProfileHelper); + getMiniProfiles(): IMiniProfile[]; + getMiniProfile(sessionID: string): any; + getCompleteProfile(sessionID: string): IPmcData[]; + createProfile(info: IProfileCreateRequestData, sessionID: string): void; + generatePlayerScav(sessionID: string): IPmcData; + validateNickname(info: IValidateNicknameRequestData, sessionID: string): string; + changeNickname(info: IProfileChangeNicknameRequestData, sessionID: string): string; + changeVoice(info: IProfileChangeVoiceRequestData, sessionID: string): void; + getFriends(info: ISearchFriendRequestData, sessionID: string): ISearchFriendResponse[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/QuestController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/QuestController.d.ts new file mode 100644 index 0000000..e588de0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/QuestController.d.ts @@ -0,0 +1,38 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { QuestConditionHelper } from "../helpers/QuestConditionHelper"; +import { QuestHelper } from "../helpers/QuestHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IQuest } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../models/eft/quests/IHandoverQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class QuestController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected questHelper: QuestHelper; + protected questConditionHelper: QuestConditionHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, questConditionHelper: QuestConditionHelper, playerService: PlayerService, configServer: ConfigServer); + getClientQuests(sessionID: string): IQuest[]; + acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + acceptRepeatableQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/RagfairController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/RagfairController.d.ts new file mode 100644 index 0000000..c758593 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/RagfairController.d.ts @@ -0,0 +1,70 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairHelper } from "../helpers/RagfairHelper"; +import { RagfairOfferHelper } from "../helpers/RagfairOfferHelper"; +import { RagfairSellHelper } from "../helpers/RagfairSellHelper"; +import { RagfairSortHelper } from "../helpers/RagfairSortHelper"; +import { RagfairTaxHelper } from "../helpers/RagfairTaxHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IAddOfferRequestData, Requirement } from "../models/eft/ragfair/IAddOfferRequestData"; +import { IExtendOfferRequestData } from "../models/eft/ragfair/IExtendOfferRequestData"; +import { IGetItemPriceResult } from "../models/eft/ragfair/IGetItemPriceResult"; +import { IGetMarketPriceRequestData } from "../models/eft/ragfair/IGetMarketPriceRequestData"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairServer } from "../servers/RagfairServer"; +import { SaveServer } from "../servers/SaveServer"; +import { PaymentService } from "../services/PaymentService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairController { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected httpResponse: HttpResponseUtil; + protected itemEventRouter: ItemEventRouter; + protected ragfairServer: RagfairServer; + protected ragfairPriceService: RagfairPriceService; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected saveServer: SaveServer; + protected ragfairSellHelper: RagfairSellHelper; + protected ragfairTaxHelper: RagfairTaxHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairOfferHelper: RagfairOfferHelper; + protected profileHelper: ProfileHelper; + protected paymentService: PaymentService; + protected handbookHelper: HandbookHelper; + protected paymentHelper: PaymentHelper; + protected inventoryHelper: InventoryHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter, ragfairServer: RagfairServer, ragfairPriceService: RagfairPriceService, databaseServer: DatabaseServer, itemHelper: ItemHelper, saveServer: SaveServer, ragfairSellHelper: RagfairSellHelper, ragfairTaxHelper: RagfairTaxHelper, ragfairSortHelper: RagfairSortHelper, ragfairOfferHelper: RagfairOfferHelper, profileHelper: ProfileHelper, paymentService: PaymentService, handbookHelper: HandbookHelper, paymentHelper: PaymentHelper, inventoryHelper: InventoryHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer); + getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult; + update(): void; + getItemPrice(info: IGetMarketPriceRequestData): IGetItemPriceResult; + addPlayerOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + createPlayerOffer(profile: IAkiProfile, requirements: Requirement[], items: Item[], sellInOnePiece: boolean, amountToSend: number): IRagfairOffer; + getAllFleaPrices(): Record; + removeOffer(offerId: string, sessionID: string): IItemEventRouterResponse; + extendOffer(info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/RepairController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/RepairController.d.ts new file mode 100644 index 0000000..e9458f6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/RepairController.d.ts @@ -0,0 +1,41 @@ +import { QuestHelper } from "../helpers/QuestHelper"; +import { RepairHelper } from "../helpers/RepairHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../models/eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../models/eft/repair/ITraderRepairActionDataRequest"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +export declare class RepairController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + protected traderHelper: TraderHelper; + protected paymentService: PaymentService; + protected repairHelper: RepairHelper; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, questHelper: QuestHelper, traderHelper: TraderHelper, paymentService: PaymentService, repairHelper: RepairHelper, configServer: ConfigServer); + /** + * Repair with trader + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + /** + * Repair with repair kit + * @param pmcData player profile + * @param body endpoint request data + * @param sessionID session id + * @returns item event router action + */ + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/RepeatableQuestController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/RepeatableQuestController.d.ts new file mode 100644 index 0000000..ce190aa --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/RepeatableQuestController.d.ts @@ -0,0 +1,217 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData"; +import { Exit } from "../models/eft/common/ILocationBase"; +import { IPmcData, TraderInfo } from "../models/eft/common/IPmcData"; +import { ICompletion, ICompletionAvailableFor, IElimination, IEliminationCondition, IExploration, IExplorationCondition, IPmcDataRepeatableQuest, IRepeatableQuest, IReward, IRewards } from "../models/eft/common/tables/IRepeatableQuests"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRepeatableQuestChangeRequest } from "../models/eft/quests/IRepeatableQuestChangeRequest"; +import { ELocationName } from "../models/enums/ELocationName"; +import { IQuestConfig, IRepeatableQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PaymentService } from "../services/PaymentService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { ProbabilityObject, ProbabilityObjectArray, RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export interface IQuestTypePool { + types: string[]; + pool: IQuestPool; +} +export interface IQuestPool { + Exploration: IExplorationPool; + Elimination: IEliminationPool; +} +export interface IExplorationPool { + locations: Partial>; +} +export interface IEliminationPool { + targets: IEliminationTargetPool; +} +export interface IEliminationTargetPool { + Savage?: ITargetLocation; + AnyPmc?: ITargetLocation; + bossBully?: ITargetLocation; + bossGluhar?: ITargetLocation; + bossKilla?: ITargetLocation; + bossSanitar?: ITargetLocation; + bossTagilla?: ITargetLocation; + bossKojaniy?: ITargetLocation; +} +export interface ITargetLocation { + locations: string[]; +} +export declare class RepeatableQuestController { + protected timeUtil: TimeUtil; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected mathUtil: MathUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected itemEventRouter: ItemEventRouter; + protected paymentService: PaymentService; + protected objectId: ObjectId; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, itemEventRouter: ItemEventRouter, paymentService: PaymentService, objectId: ObjectId, configServer: ConfigServer); + /** + * This is the method reached by the /client/repeatalbeQuests/activityPeriods endpoint + * Returns an array of objects in the format of repeatable quests to the client. + * repeatableQuestObject = { + * id: Unique Id, + * name: "Daily", + * endTime: the time when the quests expire + * activeQuests: currently available quests in an array. Each element of quest type format (see assets/database/templates/repeatableQuests.json). + * inactiveQuests: the quests which were previously active (required by client to fail them if they are not completed) + * } + * + * The method checks if the player level requirement for repeatable quests (e.g. daily lvl5, weekly lvl15) is met and if the previously active quests + * are still valid. This ischecked by endTime persisted in profile accordning to the resetTime configured for each repeatable kind (daily, weekly) + * in QuestCondig.js + * + * If the condition is met, new repeatableQuests are created, old quests (which are persisted in the profile.RepeatableQuests[i].activeQuests) are + * moved to profile.RepeatableQuests[i].inactiveQuests. This memory is required to get rid of old repeatable quest data in the profile, otherwise + * they'll litter the profile's Quests field. + * (if the are on "Succeed" but not "Completed" we keep them, to allow the player to complete them and get the rewards) + * The new quests generated are again persisted in profile.RepeatableQuests + * + * + * @param {string} sessionId Player's session id + * @returns {array} array of "repeatableQuestObjects" as descibed above + */ + getClientRepeatableQuests(_info: IEmptyRequestData, sessionID: string): IPmcDataRepeatableQuest[]; + /** + * This method is called by GetClientRepeatableQuests and creates one element of quest type format (see assets/database/templates/repeatableQuests.json). + * It randomly draws a quest type (currently Elimination, Completion or Exploration) as well as a trader who is providing the quest + */ + generateRepeatableQuest(pmcLevel: number, pmcTraderInfo: Record, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest; + /** + * Just for debug reasons. Draws dailies a random assort of dailies extracted from dumps + */ + generateDebugDailies(dailiesPool: any, factory: any, number: any): any; + /** + * Generates the base object of quest type format given as templates in assets/database/templates/repeatableQuests.json + * The templates include Elimination, Completion and Extraction quest types + * + * @param {string} type quest type: "Elimination", "Completion" or "Extraction" + * @param {string} traderId trader from which the quest will be provided + * @returns {object} a object which contains the base elements for repeatable quests of the requests type + * (needs to be filled with reward and conditions by called to make a valid quest) + */ + generateRepeatableTemplate(type: string, traderId: string): IRepeatableQuest; + /** + * Generates a valid Exploration quest + * + * @param {integer} pmcLevel player's level for reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Exploration" (see assets/database/templates/repeatableQuests.json) + */ + generateExplorationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IExploration; + /** + * Generates a valid Completion quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Completion" (see assets/database/templates/repeatableQuests.json) + */ + generateCompletionQuest(pmcLevel: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): ICompletion; + /** + * Generates a valid Elimination quest + * + * @param {integer} pmcLevel player's level for requested items and reward generation + * @param {string} traderId trader from which the quest will be provided + * @param {object} questTypePool Pools for quests (used to avoid redundant quests) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of quest type format for "Elimination" (see assets/database/templates/repeatableQuests.json) + */ + generateEliminationQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IElimination; + /** + * Exploration repeatable quests can specify a required extraction point. + * This method creates the according object which will be appended to the conditions array + * + * @param {string} exit The exit name to generate the condition for + * @returns {object} Exit condition + */ + generateExplorationExitCondition(exit: Exit): IExplorationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateCompletionQuest to create a completion condition (of which a completion quest theoretically can have many) + * + * @param {string} targetItemId id of the item to request + * @param {integer} value amount of items of this specific type to request + * @returns {object} object of "Completion"-condition + */ + generateCompletionAvailableForFinish(targetItemId: string, value: number): ICompletionAvailableFor; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a location condition. + * + * @param {string} location the location on which to fulfill the elimination quest + * @returns {object} object of "Elimination"-location-subcondition + */ + generateEliminationLocation(location: string[]): IEliminationCondition; + /** + * A repeatable quest, besides some more or less static components, exists of reward and condition (see assets/database/templates/repeatableQuests.json) + * This is a helper method for GenerateEliminationQuest to create a kill condition. + * + * @param {string} target array of target npcs e.g. "AnyPmc", "Savage" + * @param {array} bodyParts array of body parts with which to kill e.g. ["stomach", "thorax"] + * @param {number} distance distance from which to kill (currently only >= supported) + * @returns {object} object of "Elimination"-kill-subcondition + */ + generateEliminationCondition(target: string, bodyPart: string[], distance: number): IEliminationCondition; + /** + * Used to create a quest pool during each cycle of repeatable quest generation. The pool will be subsequently + * narrowed down during quest generation to avoid duplicate quests. Like duplicate extractions or elimination quests + * where you have to e.g. kill scavs in same locations. + * + * @returns {object} the quest pool + */ + generateQuestPool(repeatableConfig: IRepeatableQuestConfig): IQuestTypePool; + /** + * Generate the reward for a mission. A reward can consist of + * - Experience + * - Money + * - Items + * - Trader Reputation + * + * The reward is dependent on the player level as given by the wiki. The exact mapping of pmcLevel to + * experience / money / items / trader reputation can be defined in QuestConfig.js + * + * There's also a random variation of the reward the spread of which can be also defined in the config. + * + * Additonaly, a scaling factor w.r.t. quest difficulty going from 0.2...1 can be used + * + * @param {integer} pmcLevel player's level + * @param {number} difficulty a reward scaling factor goint from 0.2 to 1 + * @param {string} traderId the trader for reputation gain (and possible in the future filtering of reward item type based on trader) + * @param {object} repeatableConfig The configuration for the repeatably kind (daily, weekly) as configured in QuestConfig for the requestd quest + * @returns {object} object of "Reward"-type that can be given for a repeatable mission + */ + generateReward(pmcLevel: number, difficulty: number, traderId: string, repeatableConfig: IRepeatableQuestConfig): IRewards; + /** + * Helper to create a reward item structured as required by the client + * + * @param {string} tpl itemId of the rewarded item + * @param {integer} value amount of items to give + * @param {integer} index all rewards will be appended to a list, for unkown reasons the client wants the index + * @returns {object} object of "Reward"-item-type + */ + generateRewardItem(tpl: string, value: number, index: number, preset?: any): IReward; + debugLogRepeatableQuestIds(pmcData: IPmcData): void; + probabilityObjectArray(configArrayInput: ProbabilityObject[]): ProbabilityObjectArray; + changeRepeatableQuest(pmcDataIn: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/TradeController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/TradeController.d.ts new file mode 100644 index 0000000..c86745c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/TradeController.d.ts @@ -0,0 +1,21 @@ +import { RagfairServer } from "../servers/RagfairServer"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TradeHelper } from "../helpers/TradeHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../models/eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { IProcessBaseTradeRequestData } from "../models/eft/trade/IProcessBaseTradeRequestData"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ILogger } from "../models/spt/utils/ILogger"; +declare class TradeController { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected tradeHelper: TradeHelper; + protected profileHelper: ProfileHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, tradeHelper: TradeHelper, profileHelper: ProfileHelper, ragfairServer: RagfairServer); + confirmTrading(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string, foundInRaid?: boolean, upd?: Upd): IItemEventRouterResponse; + confirmRagfairTrading(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} +export { TradeController }; diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/TraderController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/TraderController.d.ts new file mode 100644 index 0000000..7bab158 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/TraderController.d.ts @@ -0,0 +1,26 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { TraderAssortHelper } from "../helpers/TraderAssortHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class TraderController { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected traderAssortHelper: TraderAssortHelper; + protected profileHelper: ProfileHelper; + protected traderHelper: TraderHelper; + protected timeUtil: TimeUtil; + protected traderAssortService: TraderAssortService; + protected jsonUtil: JsonUtil; + constructor(logger: ILogger, databaseServer: DatabaseServer, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, timeUtil: TimeUtil, traderAssortService: TraderAssortService, jsonUtil: JsonUtil); + load(): void; + getTrader(traderID: string, sessionID: string): ITraderBase; + getAllTraders(sessionID: string): ITraderBase[]; + updateTraders(): boolean; + getAssort(sessionId: string, traderId: string): ITraderAssort; + getPurchasesData(traderID: string, sessionID: string): Record; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/WeatherController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/WeatherController.d.ts new file mode 100644 index 0000000..ca7f5eb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/WeatherController.d.ts @@ -0,0 +1,11 @@ +import { WeatherGenerator } from "../generators/WeatherGenerator"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WeatherController { + protected weatherGenerator: WeatherGenerator; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer); + generate(): IWeatherData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/controllers/WishlistController.d.ts b/KcY-SeeItemValue/itemValue/server/types/controllers/WishlistController.d.ts new file mode 100644 index 0000000..a96c522 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/controllers/WishlistController.d.ts @@ -0,0 +1,10 @@ +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IWishlistActionData } from "../models/eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class WishlistController { + protected itemEvenRouter: ItemEventRouter; + constructor(itemEvenRouter: ItemEventRouter); + addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/di/Container.d.ts b/KcY-SeeItemValue/itemValue/server/types/di/Container.d.ts new file mode 100644 index 0000000..17791b0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/di/Container.d.ts @@ -0,0 +1,14 @@ +import { DependencyContainer } from "tsyringe"; +export declare class Container { + static registerTypes(depContainer: DependencyContainer): void; + static registerListTypes(depContainer: DependencyContainer): void; + private static registerUtils; + private static registerRouters; + private static registerGenerators; + private static registerHelpers; + private static registerLoaders; + private static registerCallbacks; + private static registerServices; + private static registerServers; + private static registerControllers; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/di/OnLoad.d.ts b/KcY-SeeItemValue/itemValue/server/types/di/OnLoad.d.ts new file mode 100644 index 0000000..064d07d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/di/OnLoad.d.ts @@ -0,0 +1,4 @@ +export declare class OnLoad { + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/di/OnLoadOnUpdate.d.ts b/KcY-SeeItemValue/itemValue/server/types/di/OnLoadOnUpdate.d.ts new file mode 100644 index 0000000..8bd3dc3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/di/OnLoadOnUpdate.d.ts @@ -0,0 +1,7 @@ +import { OnLoad } from "./OnLoad"; +import { OnUpdate } from "./OnUpdate"; +export declare class OnLoadOnUpdate implements OnLoad, OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/di/OnUpdate.d.ts b/KcY-SeeItemValue/itemValue/server/types/di/OnUpdate.d.ts new file mode 100644 index 0000000..7fbbe09 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/di/OnUpdate.d.ts @@ -0,0 +1,4 @@ +export declare class OnUpdate { + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/di/Router.d.ts b/KcY-SeeItemValue/itemValue/server/types/di/Router.d.ts new file mode 100644 index 0000000..2fb98e0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/di/Router.d.ts @@ -0,0 +1,40 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +export declare class Router { + private handledRoutes; + getTopLevelRoute(): string; + protected getHandledRoutes(): HandledRoute[]; + private getInternalHandledRoutes; + canHandle(url: string, partialMatch?: boolean): boolean; +} +export declare class StaticRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleStatic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class DynamicRouter extends Router { + private routes; + constructor(routes: RouteAction[]); + handleDynamic(url: string, info: any, sessionID: string, output: string): any; + getHandledRoutes(): HandledRoute[]; +} +export declare class ItemEventRouterDefinition extends Router { + constructor(); + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} +export declare class SaveLoadRouter extends Router { + constructor(); + handleLoad(profile: IAkiProfile): IAkiProfile; +} +export declare class HandledRoute { + route: string; + dynamic: boolean; + constructor(route: string, dynamic: boolean); +} +export declare class RouteAction { + url: string; + action: (url: string, info: any, sessionID: string, output: string) => any; + constructor(url: string, action: (url: string, info: any, sessionID: string, output: string) => any); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/di/Serializer.d.ts b/KcY-SeeItemValue/itemValue/server/types/di/Serializer.d.ts new file mode 100644 index 0000000..70aa7c5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/di/Serializer.d.ts @@ -0,0 +1,5 @@ +import { IHttpServer } from "../models/spt/server/IHttpServer"; +export declare class Serializer { + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(something: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/generators/BotGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/generators/BotGenerator.d.ts new file mode 100644 index 0000000..88a8014 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/generators/BotGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotHelper } from "../helpers/BotHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData"; +import { Health as PmcHealth } from "../models/eft/common/IPmcData"; +import { IBotBase } from "../models/eft/common/tables/IBotBase"; +import { Health, Inventory, Skills } 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 { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotInventoryGenerator } from "./BotInventoryGenerator"; +declare namespace BotGenerator { + interface IRandomisedBotLevelResult { + level: number; + exp: number; + } +} +export declare class BotGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected botInventoryGenerator: BotInventoryGenerator; + protected botHelper: BotHelper; + protected gameEventHelper: GameEventHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botHelper: BotHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer); + generate(info: IGenerateBotsRequestData, playerScav?: boolean): IBotBase[]; + protected generateBot(bot: IBotBase, role: string, isPmc: boolean): IBotBase; + protected generateRandomLevel(min: number, max: number): BotGenerator.IRandomisedBotLevelResult; + /** Converts health object to the required format */ + protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth; + protected generateSkills(skillsObj: Skills): Skills; + protected getPmcRole(pmcSide: string): string; + protected removeChristmasItemsFromBotInventory(nodeInventory: Inventory): void; + protected generateId(bot: IBotBase): IBotBase; + protected generateInventoryID(profile: IBotBase): IBotBase; + protected getPMCDifficulty(requestedDifficulty: string): string; + protected generateDogtag(bot: IBotBase): IBotBase; +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/types/generators/BotInventoryGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/generators/BotInventoryGenerator.d.ts new file mode 100644 index 0000000..783d0c5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/generators/BotInventoryGenerator.d.ts @@ -0,0 +1,24 @@ +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Inventory, Chances, Generation, Mods } from "../models/eft/common/tables/IBotType"; +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"; +export declare class BotInventoryGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected botWeaponGenerator: BotWeaponGenerator; + 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(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; + protected generateEquipment(equipmentSlot: string, equipmentPool: Record, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void; + protected generateInventoryBase(): PmcInventory; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/generators/BotLootGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/generators/BotLootGenerator.d.ts new file mode 100644 index 0000000..1d91836 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/generators/BotLootGenerator.d.ts @@ -0,0 +1,29 @@ +import { PMCLootGenerator } from "../generators/PMCLootGenerator"; +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { ItemMinMax, Items } from "../models/eft/common/tables/IBotType"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotLootGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected pmcLootGenerator: PMCLootGenerator; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, pmcLootGenerator: PMCLootGenerator, configServer: ConfigServer); + generateLoot(lootPool: Items, itemCounts: ItemMinMax, isPmc: boolean, inventory: PmcInventory): void; + protected getRandomisedCount(min: number, max: number, nValue: number): number; + protected addLootFromPool(pool: ITemplateItem[], equipmentSlots: string[], count: number, inventory: PmcInventory, totalValueLimit?: number, useLimits?: boolean): void; + /** Compares two item templates by their price to spawn chance ratio */ + protected compareByValue(a: ITemplateItem, b: ITemplateItem): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/generators/BotWeaponGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/generators/BotWeaponGenerator.d.ts new file mode 100644 index 0000000..13fe7df --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/generators/BotWeaponGenerator.d.ts @@ -0,0 +1,46 @@ +import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { MinMax, Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotWeaponGenerator { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected weightedRandomHelper: WeightedRandomHelper; + protected botGeneratorHelper: BotGeneratorHelper; + protected randomUtil: RandomUtil; + constructor(logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil); + generateWeapon(equipmentSlot: string, weaponPool: Record, modPool: Mods, modChances: ModsChances, magCounts: MinMax, botRole: string, isPmc: boolean, inventory: PmcInventory): void; + /** Checks if all required slots are occupied on a weapon and all it's mods */ + protected isWeaponValid(itemList: Item[]): boolean; + /** + * Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets. + * Additionally, adds extra bullets to SecuredContainer + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @param {*} magCounts + * @param {*} ammoTpl + * @returns + */ + protected generateExtraMagazines(weaponMods: Item[], weaponTemplate: ITemplateItem, magCounts: MinMax, ammoTpl: string, inventory: PmcInventory): void; + protected addBullets(ammoTpl: string, bulletCount: number, inventory: PmcInventory): void; + /** + * Finds and returns tpl of ammo that should be used, while making sure it's compatible + * + * @param {*} weaponMods + * @param {*} weaponTemplate + * @returns + */ + protected getCompatibleAmmo(weaponMods: Item[], weaponTemplate: ITemplateItem): string; + /** Fill existing magazines to full, while replacing their contents with specified ammo */ + protected fillExistingMagazines(weaponMods: Item[], magazine: Item, ammoTpl: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/generators/LocationGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/generators/LocationGenerator.d.ts new file mode 100644 index 0000000..bd368b5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/generators/LocationGenerator.d.ts @@ -0,0 +1,46 @@ +import { ContainerHelper } from "../helpers/ContainerHelper"; +import { GameEventHelper } from "../helpers/GameEventHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { ILooseLoot, SpawnpointTemplate } from "../models/eft/common/ILooseLoot"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IStaticAmmoDetails, IStaticContainerProps, IStaticForcedProps, IStaticLootDetails } from "../models/eft/common/tables/ILootBase"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { ILocationConfig } from "../models/spt/config/ILocationConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { MathUtil } from "../utils/MathUtil"; +import { ObjectId } from "../utils/ObjectId"; +import { RandomUtil } from "../utils/RandomUtil"; +export interface IContainerItem { + items: Item[]; + width: number; + height: number; +} +export declare class LocationGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected objectId: ObjectId; + protected randomUtil: RandomUtil; + protected ragfairServerHelper: RagfairServerHelper; + protected itemHelper: ItemHelper; + protected mathUtil: MathUtil; + protected gameEventHelper: GameEventHelper; + protected containerHelper: ContainerHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected locationConfig: ILocationConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, objectId: ObjectId, randomUtil: RandomUtil, ragfairServerHelper: RagfairServerHelper, itemHelper: ItemHelper, mathUtil: MathUtil, gameEventHelper: GameEventHelper, containerHelper: ContainerHelper, presetHelper: PresetHelper, configServer: ConfigServer); + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + protected getLooseLootMultiplerForLocation(location: string): number; + protected getStaticLootMultiplerForLocation(location: string): number; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; + protected createItem(tpl: string, staticAmmoDist: Record, parentId?: string): IContainerItem; + protected getRandomCompatibleCaliberTemplateId(item: ITemplateItem): string; + protected getRandomValidCaliber(magTemplate: ITemplateItem): string; + protected drawAmmoTpl(caliber: string, staticAmmoDist: Record): string; + protected createRandomMagCartridges(magTemplate: ITemplateItem, parentId: string, staticAmmoDist: Record, caliber?: string): Item; + protected createCartidges(parentId: string, ammoTpl: string, stackCount: number): Item; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/generators/PMCLootGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/generators/PMCLootGenerator.d.ts new file mode 100644 index 0000000..64e6f7f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/generators/PMCLootGenerator.d.ts @@ -0,0 +1,15 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +export declare class PMCLootGenerator { + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected pocketLootPool: string[]; + protected backpackLootPool: string[]; + protected botConfig: IBotConfig; + constructor(itemHelper: ItemHelper, databaseServer: DatabaseServer, configServer: ConfigServer); + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/generators/RagfairAssortGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/generators/RagfairAssortGenerator.d.ts new file mode 100644 index 0000000..cbdd7f2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/generators/RagfairAssortGenerator.d.ts @@ -0,0 +1,25 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +export declare class RagfairAssortGenerator { + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected generatedAssortItems: Item[]; + constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseServer: DatabaseServer); + /** + * Get an array of unique items that can be sold on the flea + * @returns array of unique items + */ + getAssortItems(): Item[]; + protected assortsAreGenerated(): boolean; + /** + * Generate an array of items the flea can sell + * @returns array of unique items + */ + protected generateRagfairAssortItems(): Item[]; + protected createRagfairAssortItem(tplId: string, id?: string): Item; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/generators/RagfairOfferGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/generators/RagfairOfferGenerator.d.ts new file mode 100644 index 0000000..de53ea9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/generators/RagfairOfferGenerator.d.ts @@ -0,0 +1,60 @@ +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { RagfairAssortGenerator } from "./RagfairAssortGenerator"; +export declare class RagfairOfferGenerator { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected saveServer: SaveServer; + protected presetHelper: PresetHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairPriceService: RagfairPriceService; + protected fenceService: FenceService; + protected itemHelper: ItemHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer); + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; + protected getTraderId(userID: string): string; + protected getRating(userID: string): number; + protected getRatingGrowing(userID: string): boolean; + protected getOfferEndTime(userID: string, time: number): number; + /** + * Create multiple offers for items by using a unique list of items we've generated previously + * @param expiredOffers + */ + generateDynamicOffers(expiredOffers?: Item[]): void; + generateTraderOffers(traderID: string): void; + protected getItemCondition(userID: string, items: Item[], itemDetails: ITemplateItem): Item[]; + protected addMissingCondition(item: Item): Item; + protected getOfferRequirements(items: Item[]): { + count: number; + _tpl: string; + }[]; + /** + * Create a flea offer and store it in the Ragfair server offers array + */ + createFleaOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/generators/WeatherGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/generators/WeatherGenerator.d.ts new file mode 100644 index 0000000..23aa169 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/generators/WeatherGenerator.d.ts @@ -0,0 +1,20 @@ +import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper"; +import { ConfigServer } from "../servers/ConfigServer"; +import { IWeatherData } from "../models/eft/weather/IWeatherData"; +import { IWeatherConfig } from "../models/spt/config/IWeatherConfig"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class WeatherGenerator { + protected weightedRandomHelper: WeightedRandomHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected weatherConfig: IWeatherConfig; + constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateTime(data: IWeatherData): IWeatherData; + generateWeather(data: IWeatherData): IWeatherData; + protected getWeightedFog(): string; + protected getWeightedRain(): number; + protected getRandomFloat(node: string): number; + protected getRandomInt(node: string): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/AssortHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/AssortHelper.d.ts new file mode 100644 index 0000000..15586b9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/AssortHelper.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ItemHelper } from "./ItemHelper"; +import { QuestHelper } from "./QuestHelper"; +export declare class AssortHelper { + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected databaseServer: DatabaseServer; + protected questHelper: QuestHelper; + constructor(logger: ILogger, itemHelper: ItemHelper, databaseServer: DatabaseServer, questHelper: QuestHelper); + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort assort items from a trader + * @returns assort items minus locked quest assorts + */ + stripLockedQuestAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove assorts from a trader that have not been unlocked yet + * @param pmcProfile player profile + * @param traderId traders id + * @param assort traders assorts + * @returns traders assorts minus locked loyality assorts + */ + stripLockedLoyaltyAssort(pmcProfile: IPmcData, traderId: string, assort: ITraderAssort): ITraderAssort; + /** + * Remove an item from an assort + * @param assort assort to modify + * @param itemID item id to remove from asort + * @returns Modified assort + */ + removeItemFromAssort(assort: ITraderAssort, itemID: string): ITraderAssort; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/BotGeneratorHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/BotGeneratorHelper.d.ts new file mode 100644 index 0000000..c382fc9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/BotGeneratorHelper.d.ts @@ -0,0 +1,95 @@ +import { DurabilityLimitsHelper } from "../helpers/DurabilityLimitsHelper"; +import { Inventory as PmcInventory } from "../models/eft/common/IPmcData"; +import { Mods, ModsChances } from "../models/eft/common/tables/IBotType"; +import { Item, Repairable, Upd } from "../models/eft/common/tables/IItem"; +import { Grid, ITemplateItem, Slot } from "../models/eft/common/tables/ITemplateItem"; +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { InventoryHelper } from "./InventoryHelper"; +import { ItemHelper } from "./ItemHelper"; +export declare class BotGeneratorHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected durabilityLimitsHelper: DurabilityLimitsHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected containerHelper: ContainerHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, configServer: ConfigServer); + generateModsForItem(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, isPmc?: boolean): Item[]; + /** + * With the shotgun revolver (60db29ce99594040e04c4a27) 12.12 introduced CylinderMagazines. + * Those magazines (e.g. 60dc519adf4c47305f6d410d) have a "Cartridges" entry with a _max_count=0. + * Ammo is not put into the magazine directly but assigned to the magazine's slots: The "camora_xxx" slots. + * This function is a helper called by generateModsForItem for mods with parent type "CylinderMagazine" + * + * @param {object} items The items where the CylinderMagazine's camora are appended to + * @param {object} modPool modPool which should include available cartrigdes + * @param {string} parentId The CylinderMagazine's UID + * @param {object} parentTemplate The CylinderMagazine's template + */ + protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void; + generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): { + upd?: Upd; + }; + /** + * Create a repairable object for a weapon that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + /** + * Create a repairable object for an armor that containers durability + max durability properties + * @param itemTemplate weapon object being generated for + * @param botRole type of bot being generated for + * @returns Repairable object + */ + protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable; + protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string; + /** + * Sort by spawn chance, highest to lowest, higher is more common + * @param unsortedModArray String array to sort + * @returns Sorted string array + */ + protected sortModArray(unsortedModArray: string[]): string[]; + /** + * Can an item be added to an item without issue + * @param items + * @param tplToCheck + * @param equipmentSlot + * @returns true if possible + */ + isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean; + /** + * Adds an item with all its childern into specified equipmentSlots, wherever it fits. + * @param equipmentSlots + * @param parentId + * @param parentTpl + * @param itemWithChildren + * @param inventory + * @returns a `boolean` indicating item was added + */ + addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], parentId: string, parentTpl: string, itemWithChildren: Item[], inventory: PmcInventory): boolean; + protected itemAllowedInContainer(slot: Grid, itemTpl: string): boolean; +} +export declare class ExhaustableArray { + private itemPool; + private randomUtil; + private jsonUtil; + private pool; + constructor(itemPool: T[], randomUtil: RandomUtil, jsonUtil: JsonUtil); + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/BotHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/BotHelper.d.ts new file mode 100644 index 0000000..0cb1227 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/BotHelper.d.ts @@ -0,0 +1,44 @@ +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 { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class BotHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer); + getBotDifficultySettings(type: string, difficulty: string): Difficulty; + getPmcDifficultySettings(type: string, difficulty: string): Difficulty; + /** + * Randomise the chance the PMC will attack their own side + * @param difficultySettings pmc difficulty settings + */ + randomisePmcHostility(difficultySettings: Difficulty): void; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + /** + * Add a bot to the FRIENDLY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typeToAdd bot type to add to friendly list + */ + addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void; + /** + * Add a bot to the ENEMY_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to enemy list + */ + addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[]): void; + /** + * Add a bot to the REVENGE_BOT_TYPES array + * @param difficultySettings bot settings to alter + * @param typesToAdd bot type to add to revenge list + */ + addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/ContainerHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/ContainerHelper.d.ts new file mode 100644 index 0000000..3c2ee93 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/ContainerHelper.d.ts @@ -0,0 +1,12 @@ +export declare class FindSlotResult { + success: boolean; + x: any; + y: any; + rotation: boolean; + constructor(success?: boolean, x?: any, y?: any, rotation?: boolean); +} +export declare class ContainerHelper { + protected locateSlot(container2D: number[][], containerX: number, containerY: number, x: number, y: number, itemW: number, itemH: number): boolean; + findSlotForItem(container2D: number[][], itemWidth: number, itemHeight: number): FindSlotResult; + fillContainerMapWithItem(container2D: number[][], x: number, y: number, itemW: number, itemH: number, rotate: boolean): any; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/DialogueHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/DialogueHelper.d.ts new file mode 100644 index 0000000..9776c6a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/DialogueHelper.d.ts @@ -0,0 +1,21 @@ +import { Dialogue, MessageContent, MessagePreview } from "../models/eft/profile/IAkiProfile"; +import { MessageType } from "../models/enums/MessageType"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { ItemHelper } from "./ItemHelper"; +import { NotificationSendHelper } from "./NotificationSendHelper"; +import { NotifierHelper } from "./NotifierHelper"; +export declare class DialogueHelper { + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected notificationSendHelper: NotificationSendHelper; + protected itemHelper: ItemHelper; + constructor(hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, notificationSendHelper: NotificationSendHelper, itemHelper: ItemHelper); + createMessageContext(templateId: string, messageType: MessageType, maxStoreTime: number): MessageContent; + addDialogueMessage(dialogueID: string, messageContent: MessageContent, sessionID: string, rewards?: any[]): void; + getMessagePreview(dialogue: Dialogue): MessagePreview; + getMessageItemContents(messageID: string, sessionID: string): any[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/DurabilityLimitsHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/DurabilityLimitsHelper.d.ts new file mode 100644 index 0000000..07a5db1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/DurabilityLimitsHelper.d.ts @@ -0,0 +1,26 @@ +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IBotConfig } from "../models/spt/config/IBotConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { BotHelper } from "./BotHelper"; +export declare class DurabilityLimitsHelper { + protected randomUtil: RandomUtil; + protected botHelper: BotHelper; + protected configServer: ConfigServer; + protected botConfig: IBotConfig; + constructor(randomUtil: RandomUtil, botHelper: BotHelper, configServer: ConfigServer); + getRandomisedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number; + getRandomisedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + getRandomisedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number; + protected generateMaxWeaponDurability(botRole: string): number; + protected generateMaxPmcArmorDurability(itemMaxDurability: number): number; + protected getLowestMaxWeaponFromConfig(botRole: string): number; + protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number; + protected generateWeaponDurability(botRole: string, maxDurability: number): number; + protected generateArmorDurability(botRole: string, maxDurability: number): number; + protected getMinWeaponDeltaFromConfig(botRole: string): number; + protected getMaxWeaponDeltaFromConfig(botRole: string): number; + protected getMinArmorDeltaFromConfig(botRole: string): number; + protected getMaxArmorDeltaFromConfig(botRole: string): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/ExtendedProfileHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/ExtendedProfileHelper.d.ts new file mode 100644 index 0000000..d8b754d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/ExtendedProfileHelper.d.ts @@ -0,0 +1,22 @@ +import { BotGenerator } from "../generators/BotGenerator"; +import { IPmcData, Skills, Stats } from "../models/eft/common/IPmcData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class ExtendedProfileHelper extends ProfileHelper { + protected botGenerator: BotGenerator; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService, botGenerator: BotGenerator); + generatePlayerScav(sessionID: string): IPmcData; + protected getScavSkills(sessionID: string): Skills; + protected removeSecureContainer(profile: IPmcData): IPmcData; + protected getDefaultScavSkills(): Skills; + protected getScavStats(sessionID: string): Stats; + protected getScavLevel(sessionID: string): number; + protected getScavExperience(sessionID: string): number; + protected setScavCooldownTimer(profile: IPmcData, pmcData: IPmcData): IPmcData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/GameEventHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/GameEventHelper.d.ts new file mode 100644 index 0000000..b2d6377 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/GameEventHelper.d.ts @@ -0,0 +1,9 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class GameEventHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + get EVENT(): Record; + get christmasEventItems(): string[]; + itemIsChristmasRelated(itemId: string): boolean; + christmasEventEnabled(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/HandbookHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/HandbookHelper.d.ts new file mode 100644 index 0000000..b47d466 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/HandbookHelper.d.ts @@ -0,0 +1,33 @@ +declare class LookupItem { + byId: Record; + byParent: Record; + constructor(); +} +export declare class LookupCollection { + items: LookupItem; + categories: LookupItem; + constructor(); +} +export declare class HandbookHelper { + protected lookup: LookupCollection; + hydrateLookup(lookup: LookupCollection): void; + getTemplatePrice(x: string): number; + templatesWithParent(x: string): string[]; + isCategory(x: string): boolean; + childrenCategories(x: string): string[]; + /** + * Gets Currency to Ruble conversion Value + * @param {number} value + * @param {string} currencyFrom + * @returns number + */ + inRUB(value: number, currencyFrom: string): number; + /** + * Gets Ruble to Currency conversion Value + * @param {number} value + * @param {string} currencyTo + * @returns number + */ + fromRUB(value: number, currencyTo: string): number; +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/HealthHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/HealthHelper.d.ts new file mode 100644 index 0000000..518c23f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/HealthHelper.d.ts @@ -0,0 +1,27 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ISyncHealthRequestData } from "../models/eft/health/ISyncHealthRequestData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IHealthConfig } from "../models/spt/config/IHealthConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class HealthHelper { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected configServer: ConfigServer; + protected healthConfig: IHealthConfig; + constructor(jsonUtil: JsonUtil, logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, configServer: ConfigServer); + resetVitality(sessionID: string): IAkiProfile; + saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string): void; + protected saveHealth(pmcData: IPmcData, sessionID: string): void; + protected saveEffects(pmcData: IPmcData, sessionID: string): void; + protected addEffect(pmcData: IPmcData, sessionID: string, effect: { + bodyPart: string; + effectType: string; + }): void; + protected isEmpty(map: any): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/HideoutHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/HideoutHelper.d.ts new file mode 100644 index 0000000..76b337f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/HideoutHelper.d.ts @@ -0,0 +1,68 @@ +import { Common, HideoutArea, IPmcData, Production, Productive } from "../models/eft/common/IPmcData"; +import { Upd } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { StageBonus } from "../models/eft/hideout/IHideoutArea"; +import { IHideoutContinousProductionStartRequestData } from "../models/eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../models/eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../models/eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IHideoutConfig } from "../models/spt/config/IHideoutConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { PlayerService } from "../services/PlayerService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class HideoutHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected timeUtil: TimeUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected profileHelper: ProfileHelper; + protected inventoryHelper: InventoryHelper; + protected playerService: PlayerService; + protected configServer: ConfigServer; + static BITCOIN_FARM: string; + protected WATER_COLLECTOR: string; + protected BITCOIN: string; + protected EXPEDITIONARY_FUEL_TANK: string; + static NAME_BACKENDCOUNTERS_CRAFTING: string; + static SKILL_NAME_HIDEOUT: string; + static HOUR_FOR_SKILL_CRAFTING: number; + static SKILL_NAME_CRAFITING: string; + protected hideoutConfig: IHideoutConfig; + constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer); + registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + /** + * This convinience function intialies new Production Object + * with all the constants. + */ + initProduction(recipeId: string, productionTime: number): Production; + isProductionType(productive: Productive): productive is Production; + applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void; + protected applySkillXPBoost(pmcData: IPmcData, bonus: StageBonus): void; + updatePlayerHideout(sessionID: string): void; + protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, isGeneratorOn: boolean): void; + protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean; + protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateWaterFilters(waterFilterArea: HideoutArea, pwProd: Production, isGeneratorOn: boolean, pmcData: IPmcData): HideoutArea; + protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number): Upd; + protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData): HideoutArea; + protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production; + protected getBTCSlots(pmcData: IPmcData): number; + protected getManagementSkillsSlots(): number; + protected hasManagementSkillSlots(pmcData: IPmcData): boolean; + protected getHideoutManagementSkill(pmcData: IPmcData): Common; + protected getHideoutManagementConsumptionBonus(pmcData: IPmcData): number; + isProduction(productive: Productive): productive is Production; + getBTC(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + getRandomAmountRewardForScavCase(itemToCalculate: ITemplateItem): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/HttpServerHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/HttpServerHelper.d.ts new file mode 100644 index 0000000..c6e5296 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/HttpServerHelper.d.ts @@ -0,0 +1,23 @@ +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class HttpServerHelper { + protected configServer: ConfigServer; + protected httpConfig: IHttpConfig; + protected mime: { + css: string; + bin: string; + html: string; + jpg: string; + js: string; + json: string; + png: string; + svg: string; + txt: string; + }; + constructor(configServer: ConfigServer); + getMimeText(key: string): string; + buildUrl(): string; + getBackendUrl(): string; + getWebsocketUrl(): string; + sendTextJson(resp: any, output: any): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/InRaidHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/InRaidHelper.d.ts new file mode 100644 index 0000000..05b6fdf --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/InRaidHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Victim } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { InventoryHelper } from "./InventoryHelper"; +import { PaymentHelper } from "./PaymentHelper"; +export declare class InRaidHelper { + protected logger: ILogger; + protected saveServer: SaveServer; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, databaseServer: DatabaseServer, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + protected removePlayer(sessionID: string): void; + protected removeMapAccessKey(offraidData: ISaveProgressRequestData, sessionID: string): void; + addUpdToMoneyFromRaid(items: Item[]): void; + /** + * Add positive karma for PMC kills + * @param {*} existingFenceStanding + * @param {*} victims + */ + calculateFenceStandingChangeFromKills(existingFenceStanding: number, victims: Victim[]): void; + setBaseStats(profileData: IPmcData, offraidData: ISaveProgressRequestData, sessionID: string): IPmcData; + markFoundItems(pmcData: IPmcData, profile: IPmcData, isPlayerScav: boolean): IPmcData; + removeFoundInRaidStatusFromItems(profile: IPmcData): IPmcData; + setInventory(sessionID: string, pmcData: IPmcData, profile: IPmcData): IPmcData; + deleteInventory(pmcData: IPmcData, sessionID: string): IPmcData; + getPlayerGear(items: Item[]): Item[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/InventoryHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/InventoryHelper.d.ts new file mode 100644 index 0000000..dc7cbca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/InventoryHelper.d.ts @@ -0,0 +1,85 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData"; +import { IInventoryMergeRequestData } from "../models/eft/inventory/IInventoryMergeRequestData"; +import { IInventoryMoveRequestData } from "../models/eft/inventory/IInventoryMoveRequestData"; +import { IInventorySplitRequestData } from "../models/eft/inventory/IInventorySplitRequestData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IInventoryConfig } from "../models/spt/config/IInventoryConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { HashUtil } from "../utils/HashUtil"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { ContainerHelper } from "./ContainerHelper"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class InventoryHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected httpResponse: HttpResponseUtil; + protected fenceService: FenceService; + protected databaseServer: DatabaseServer; + protected paymentHelper: PaymentHelper; + protected traderAssortHelper: TraderAssortHelper; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected containerHelper: ContainerHelper; + protected profileHelper: ProfileHelper; + protected configServer: ConfigServer; + protected inventoryConfig: IInventoryConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, httpResponse: HttpResponseUtil, fenceService: FenceService, databaseServer: DatabaseServer, paymentHelper: PaymentHelper, traderAssortHelper: TraderAssortHelper, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, containerHelper: ContainerHelper, profileHelper: ProfileHelper, configServer: ConfigServer); + addItem(pmcData: IPmcData, body: IAddItemRequestData, output: IItemEventRouterResponse, sessionID: string, callback: any, foundInRaid?: boolean, addUpd?: any): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, itemId: string, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse; + getItemSize(itemTpl: string, itemID: string, inventoryItem: Item[]): Record; + protected getSizeByInventoryItemHash(itemTpl: string, itemID: string, inventoryItemHash: InventoryHelper.InventoryItemHash): Record; + protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash; + getContainerMap(containerW: number, containerH: number, itemList: Item[], containerId: string): number[][]; + /** + * Based on the item action, determine whose inventories we should be looking at for from and to. + */ + getOwnerInventoryItems(body: IInventoryMoveRequestData | IInventorySplitRequestData | IInventoryMergeRequestData, sessionID: string): OwnerInventoryItems; + /** + * Made a 2d array table with 0 - free slot and 1 - used slot + * @param {Object} pmcData + * @param {string} sessionID + * @returns Array + */ + protected getStashSlotMap(pmcData: IPmcData, sessionID: string): number[][]; + protected getStashType(sessionID: string): string; + protected getPlayerStashSize(sessionID: string): Record; + /** + * Internal helper function to transfer an item from one profile to another. + * fromProfileData: Profile of the source. + * toProfileData: Profile of the destination. + * body: Move request + */ + moveItemToProfile(fromItems: Item[], toItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to move item within the same profile_f. + */ + moveItemInternal(inventoryItems: Item[], body: IInventoryMoveRequestData): void; + /** + * Internal helper function to handle cartridges in inventory if any of them exist. + */ + protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void; +} +declare namespace InventoryHelper { + interface InventoryItemHash { + byItemId: Record; + byParentId: Record; + } +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/ItemHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/ItemHelper.d.ts new file mode 100644 index 0000000..f124cb1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/ItemHelper.d.ts @@ -0,0 +1,147 @@ +import { InsuredItem, IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem, StackSlot } from "../models/eft/common/tables/ITemplateItem"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +declare class ItemHelper { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer); + /** + * Checks if a 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 + */ + isValidItem(tpl: string, invalidBaseTypes?: string[]): boolean; + /** + * Checks if a id is a valid item. Valid meaning that it's an item that may be a reward + * or content of bot loot. Items that are tested as valid may be in a player backpack or stash. + * @param {*} tpl template id of item to check + * @returns boolean: true if item is valid reward + */ + isValidRewardItem(tpl: string): boolean; + /** + * Picks rewardable items from items.json. This means they need to fit into the inventory and they shouldn't be keys (debatable) + * @returns a list of rewardable items [[_tpl, itemTemplate],...] + */ + getRewardableItems(): [string, ITemplateItem][]; + /** + * Check if the tpl / template Id provided is a descendent of the baseclass + * + * @param {string} tpl the item template id to check + * @param {string} baseclassTpl the baseclass to check for + * @return {boolean} is the tpl a descendent? + */ + isOfBaseclass(tpl: string, baseclassTpl: string): any; + /** + * Returns the item price based on the handbook or as a fallback from the prices.json if the item is not + * found in the handbook. If the price can't be found at all return 0 + * + * @param {string} tpl the item template to check + * @returns {integer} The price of the item or 0 if not found + */ + getItemPrice(tpl: string): number; + fixItemStackCount(item: Item): Item; + /** + * AmmoBoxes contain StackSlots which need to be filled for the AmmoBox to have content. + * Here's what a filled AmmoBox looks like: + * { + * "_id": "b1bbe982daa00ac841d4ae4d", + * "_tpl": "57372c89245977685d4159b1", + * "parentId": "5fe49a0e2694b0755a504876", + * "slotId": "hideout", + * "location": { + * "x": 3, + * "y": 4, + * "r": 0 + * }, + * "upd": { + * "StackObjectsCount": 1 + * } + * }, + * { + * "_id": "b997b4117199033afd274a06", + * "_tpl": "56dff061d2720bb5668b4567", + * "parentId": "b1bbe982daa00ac841d4ae4d", + * "slotId": "cartridges", + * "location": 0, + * "upd": { + * "StackObjectsCount": 30 + * } + * } + * Given the AmmoBox Item (first object) this function generates the StackSlot (second object) and returns it. + * StackSlots are only used for AmmoBoxes which only have one element in StackSlots. However, it seems to be generic + * to possibly also have more than one StackSlot. As good as possible, without seeing items having more than one + * StackSlot, this function takes account of this and creates and returns an array of StackSlotItems + * + * @param {object} item The item template of the AmmoBox as given in items.json + * @param {string} parentId The id of the AmmoBox instance these StackSlotItems should be children of + * @returns {array} The array of StackSlotItems + */ + generateStackSlotItems(item: ITemplateItem, parentId: string): StackSlot[]; + getItem(tpl: string): [boolean, ITemplateItem]; + getItemQualityModifier(item: Item): number; + findAndReturnChildrenByItems(items: Item[], itemID: string): string[]; + /** + * A variant of findAndReturnChildren where the output is list of item objects instead of their ids. + */ + findAndReturnChildrenAsItems(items: Item[], baseItemId: string): Item[]; + /** + * find children of the item in a given assort (weapons parts for example, need recursive loop function) + */ + findAndReturnChildrenByAssort(itemIdToFind: string, assort: Item[]): Item[]; + hasBuyRestrictions(itemToCheck: Item): boolean; + /** + * Is Dogtag + * Checks if an item is a dogtag. Used under profile_f.js to modify preparePrice based + * on the level of the dogtag + */ + isDogtag(tpl: string): boolean; + isNotSellable(tpl: string): boolean; + getChildId(item: Item): string; + isItemTplStackable(tpl: string): boolean; + /** + * split item stack if it exceeds StackMaxSize + */ + splitStack(item: Item): Item[]; + /** + * Find Barter items in the inventory + * @param {string} by + * @param {Object} pmcData + * @param {string} barter_itemID + * @returns Array + */ + findBarterItems(by: string, pmcData: IPmcData, barter_itemID: string): any[]; + /** + * @param {Object} pmcData + * @param {Array} items + * @param {Object} fastPanel + * @returns Array + */ + replaceIDs(pmcData: IPmcData, items: Item[], insuredItems?: InsuredItem[], fastPanel?: any): any[]; + /** + * Recursivly loop down through an items hierarchy to see if any of the ids match the supplied list, return true if any do + * @param {string} tpl + * @param {Array} tplsToCheck + * @returns boolean + */ + doesItemOrParentsIdMatch(tpl: string, tplsToCheck: string[]): boolean; + /** + * Return true if item is a quest item + * @param {string} tpl + * @returns boolean + */ + isQuestItem(tpl: string): boolean; + getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize; +} +declare namespace ItemHelper { + interface ItemSize { + width: number; + height: number; + } +} +export { ItemHelper }; diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/NotificationSendHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/NotificationSendHelper.d.ts new file mode 100644 index 0000000..34e62d9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/NotificationSendHelper.d.ts @@ -0,0 +1,12 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { NotificationService } from "../services/NotificationService"; +export declare class NotificationSendHelper { + protected httpServer: IHttpServer; + protected notificationService: NotificationService; + constructor(httpServer: IHttpServer, notificationService: NotificationService); + /** + * Send notification message to the appropiate channel + */ + sendMessage(sessionID: string, notificationMessage: INotification): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/NotifierHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/NotifierHelper.d.ts new file mode 100644 index 0000000..738b69a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/NotifierHelper.d.ts @@ -0,0 +1,17 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +import { Message, MessageContentRagfair } from "../models/eft/profile/IAkiProfile"; +import { HttpServerHelper } from "./HttpServerHelper"; +export declare class NotifierHelper { + protected httpServerHelper: HttpServerHelper; + /** + * The default notification sent when waiting times out. + */ + protected defaultNotification: INotification; + constructor(httpServerHelper: HttpServerHelper); + getDefaultNotification(): INotification; + /** Creates a new notification that displays the "Your offer was sold!" prompt and removes sold offer from "My Offers" on clientside */ + createRagfairOfferSoldNotification(dialogueMessage: Message, ragfairData: MessageContentRagfair): INotification; + /** Creates a new notification with the specified dialogueMessage object. */ + createNewMessageNotification(dialogueMessage: Message): INotification; + getWebSocketServer(sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/PaymentHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/PaymentHelper.d.ts new file mode 100644 index 0000000..2d068a4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/PaymentHelper.d.ts @@ -0,0 +1,14 @@ +export declare class PaymentHelper { + /** + * Check whether tpl is Money + * @param {string} tpl + * @returns void + */ + isMoneyTpl(tpl: string): boolean; + /** + * Gets currency TPL from TAG + * @param {string} currency + * @returns string + */ + getCurrency(currency: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/PresetHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/PresetHelper.d.ts new file mode 100644 index 0000000..0371886 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/PresetHelper.d.ts @@ -0,0 +1,14 @@ +import { Preset } from "../models/eft/common/IGlobals"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PresetHelper { + protected databaseServer: DatabaseServer; + protected lookup: Record; + constructor(databaseServer: DatabaseServer); + hydratePresetStore(input: Record): void; + isPreset(id: string): boolean; + hasPreset(templateId: string): boolean; + getPreset(id: string): Preset; + getPresets(templateId: string): Preset[]; + getDefaultPreset(templateId: string): Preset; + getBaseItemTpl(presetId: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/ProfileHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/ProfileHelper.d.ts new file mode 100644 index 0000000..6a64291 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/ProfileHelper.d.ts @@ -0,0 +1,33 @@ +import { IPmcData, Stats } from "../models/eft/common/IPmcData"; +import { IAkiProfile } from "../models/eft/profile/IAkiProfile"; +import { IValidateNicknameRequestData } from "../models/eft/profile/IValidateNicknameRequestData"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { Watermark } from "../utils/Watermark"; +import { ItemHelper } from "./ItemHelper"; +export declare class ProfileHelper { + protected jsonUtil: JsonUtil; + protected watermark: Watermark; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected itemHelper: ItemHelper; + protected fenceService: FenceService; + constructor(jsonUtil: JsonUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, fenceService: FenceService); + resetProfileQuestCondition(sessionID: string, conditionId: string): void; + getCompleteProfile(sessionID: string): IPmcData[]; + isNicknameTaken(info: IValidateNicknameRequestData, sessionID: string): boolean; + getProfileByPmcId(pmcId: string): IPmcData; + getExperience(level: number): number; + getMaxLevel(): number; + getDefaultAkiDataObject(): any; + getFullProfile(sessionID: string): IAkiProfile; + getPmcProfile(sessionID: string): IPmcData; + getScavProfile(sessionID: string): IPmcData; + getDefaultCounters(): Stats; + protected isWiped(sessionID: string): boolean; + protected getServerVersion(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/QuestConditionHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/QuestConditionHelper.d.ts new file mode 100644 index 0000000..90ee560 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/QuestConditionHelper.d.ts @@ -0,0 +1,7 @@ +import { AvailableForConditions } from "../models/eft/common/tables/IQuest"; +export declare class QuestConditionHelper { + getQuestConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLevelConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + getLoyaltyConditions(q: AvailableForConditions[], furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; + protected filterConditions(q: AvailableForConditions[], questType: string, furtherFilter?: (a: AvailableForConditions) => AvailableForConditions[]): AvailableForConditions[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/QuestHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/QuestHelper.d.ts new file mode 100644 index 0000000..f32c85c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/QuestHelper.d.ts @@ -0,0 +1,69 @@ +import { IPmcData, Quest } from "../models/eft/common/IPmcData"; +import { AvailableForConditions, AvailableForProps, IQuest, Reward } from "../models/eft/common/tables/IQuest"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IAcceptQuestRequestData } from "../models/eft/quests/IAcceptQuestRequestData"; +import { ICompleteQuestRequestData } from "../models/eft/quests/ICompleteQuestRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { TraderHelper } from "./TraderHelper"; +export declare class QuestHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemHelper: ItemHelper; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected ragfairServerHelper: RagfairServerHelper; + protected dialogueHelper: DialogueHelper; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected traderHelper: TraderHelper; + protected configServer: ConfigServer; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, traderHelper: TraderHelper, configServer: ConfigServer); + static get STATUS(): Record; + questStatus(pmcData: IPmcData, questID: string): string; + /** + * returns true is the condition is satisfied + */ + evaluateLevel(pmcProfile: IPmcData, cond: AvailableForConditions): boolean; + getDeltaQuests(before: IQuest[], after: IQuest[]): IQuest[]; + rewardSkillPoints(sessionID: string, pmcData: IPmcData, output: IItemEventRouterResponse, skillName: string, progress: number): void; + getQuestLocale(questId: string): any; + /** + * Debug Routine for showing some information on the + * quest list in question. + */ + dumpQuests(quests: any, label?: any): void; + loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean; + protected processReward(reward: Reward): any[]; + getQuestRewardItems(quest: IQuest, state: string): Reward[]; + addQuestToPMCData(pmcData: IPmcData, quest: Quest, newState: string, acceptedQuest: IAcceptQuestRequestData): void; + acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[]; + failedUnlocked(failedQuestId: string, sessionID: string): IQuest[]; + applyMoneyBoost(quest: IQuest, moneyBoost: number): IQuest; + changeItemStack(pmcData: IPmcData, id: string, value: number, sessionID: string, output: any): void; + /** + * Get List of All Quests as an array + */ + questValues(): IQuest[]; + protected cleanQuestList(quests: IQuest[]): IQuest[]; + cleanQuestConditions(quest: IQuest): IQuest; + failQuest(pmcData: IPmcData, body: any, sessionID: string): any; + getQuestFromDb(questId: string, pmcData: IPmcData): IQuest; + getQuestLocaleIdFromDb(messageId: string, localisation?: string): string; + applyQuestReward(pmcData: IPmcData, body: ICompleteQuestRequestData, state: string, sessionID: string): any[]; + getFindItemIdForQuestItem(itemTpl: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairHelper.d.ts new file mode 100644 index 0000000..c8bc5ba --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairHelper.d.ts @@ -0,0 +1,44 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IGetOffersResult } from "../models/eft/ragfair/IGetOffersResult"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairLinkedItemService } from "../services/RagfairLinkedItemService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { TraderAssortHelper } from "./TraderAssortHelper"; +import { UtilityHelper } from "./UtilityHelper"; +export declare class RagfairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected traderAssortHelper: TraderAssortHelper; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected ragfairLinkedItemService: RagfairLinkedItemService; + protected utilityHelper: UtilityHelper; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, traderAssortHelper: TraderAssortHelper, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, ragfairLinkedItemService: RagfairLinkedItemService, utilityHelper: UtilityHelper, configServer: ConfigServer); + /** + * Gets currency TAG from TPL + * @param {string} currency + * @returns string + */ + getCurrencyTag(currency: string): string; + filterCategories(sessionID: string, info: ISearchRequestData): string[]; + getDisplayableAssorts(sessionID: string): Record; + protected getCategoryList(handbookId: string): string[]; + countCategories(result: IGetOffersResult): void; + /** + * Merges Root Items + * Ragfair allows abnormally large stacks. + */ + mergeStackable(items: Item[]): Item[]; + getCurrencySymbol(currencyTpl: string): string; + formatCurrency(moneyAmount: number): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairOfferHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairOfferHelper.d.ts new file mode 100644 index 0000000..129bc1c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairOfferHelper.d.ts @@ -0,0 +1,52 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { ISearchRequestData } from "../models/eft/ragfair/ISearchRequestData"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { HashUtil } from "../utils/HashUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { PresetHelper } from "./PresetHelper"; +import { ProfileHelper } from "./ProfileHelper"; +import { RagfairHelper } from "./RagfairHelper"; +import { RagfairServerHelper } from "./RagfairServerHelper"; +import { RagfairSortHelper } from "./RagfairSortHelper"; +export declare class RagfairOfferHelper { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected hashUtil: HashUtil; + protected itemEventRouter: ItemEventRouter; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected dialogueHelper: DialogueHelper; + protected itemHelper: ItemHelper; + protected paymentHelper: PaymentHelper; + protected presetHelper: PresetHelper; + protected profileHelper: ProfileHelper; + protected ragfairServerHelper: RagfairServerHelper; + protected ragfairSortHelper: RagfairSortHelper; + protected ragfairHelper: RagfairHelper; + protected ragfairOfferService: RagfairOfferService; + protected configServer: ConfigServer; + protected static TPL_GOODS_SOLD: string; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemEventRouter: ItemEventRouter, databaseServer: DatabaseServer, saveServer: SaveServer, dialogueHelper: DialogueHelper, itemHelper: ItemHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, configServer: ConfigServer); + getValidOffers(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + getOffersForBuild(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, pmcProfile: IPmcData): IRagfairOffer[]; + processOffers(sessionID: string): boolean; + protected getProfileOffers(sessionID: string): IRagfairOffer[]; + protected deleteOfferByOfferId(sessionID: string, offerId: string): void; + protected completeOffer(sessionID: string, offer: IRagfairOffer, boughtAmount: number): IItemEventRouterResponse; + isDisplayableOffer(info: ISearchRequestData, itemsToAdd: string[], assorts: Record, offer: IRagfairOffer, pmcProfile: IPmcData): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairSellHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairSellHelper.d.ts new file mode 100644 index 0000000..6ec004a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairSellHelper.d.ts @@ -0,0 +1,16 @@ +import { SellResult } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairSellHelper { + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer); + calculateSellChance(baseChance: number, offerPrice: number, requirementsPriceInRub: number): number; + rollForSale(sellChance: number, count: number): SellResult[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairServerHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairServerHelper.d.ts new file mode 100644 index 0000000..2cb3ea5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairServerHelper.d.ts @@ -0,0 +1,46 @@ +import { MemberCategory } from "../models/enums/MemberCategory"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { IQuestConfig } from "../models/spt/config/IQuestConfig"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { DialogueHelper } from "./DialogueHelper"; +import { ItemHelper } from "./ItemHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class RagfairServerHelper { + protected randomUtil: RandomUtil; + protected hashUtil: HashUtil; + protected saveServer: SaveServer; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected itemHelper: ItemHelper; + protected dialogueHelper: DialogueHelper; + protected jsonUtil: JsonUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected questConfig: IQuestConfig; + protected static TPL_GOODS_RETURNED: string; + constructor(randomUtil: RandomUtil, hashUtil: HashUtil, saveServer: SaveServer, databaseServer: DatabaseServer, profileHelper: ProfileHelper, itemHelper: ItemHelper, dialogueHelper: DialogueHelper, jsonUtil: JsonUtil, configServer: ConfigServer); + /** + * Is item valid / on blacklist / quest item + * @param itemDetails + * @returns boolean + */ + isItemValidRagfairItem(itemDetails: [boolean, ITemplateItem]): boolean; + protected isItemBlacklisted(itemTemplateId: string): boolean; + isTrader(userID: string): boolean; + isPlayer(userID: string): boolean; + returnItems(sessionID: string, items: any[]): void; + calculateDynamicStackCount(tplId: string, isWeaponPreset: boolean): number; + getDynamicOfferCurrency(): string; + getMemberType(userID: string): MemberCategory; + getNickname(userID: string): string; + getPresetItems(item: any): Item[]; + getPresetItemsByTpl(item: Item): Item[]; + reparentPresets(item: Item, preset: Item[]): Item[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairSortHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairSortHelper.d.ts new file mode 100644 index 0000000..e983569 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairSortHelper.d.ts @@ -0,0 +1,12 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class RagfairSortHelper { + protected databaseServer: DatabaseServer; + constructor(databaseServer: DatabaseServer); + sortOffers(offers: IRagfairOffer[], type: number, direction?: number): IRagfairOffer[]; + protected sortOffersByID(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByPrice(a: IRagfairOffer, b: IRagfairOffer): number; + protected sortOffersByExpiry(a: IRagfairOffer, b: IRagfairOffer): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairTaxHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairTaxHelper.d.ts new file mode 100644 index 0000000..820facb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/RagfairTaxHelper.d.ts @@ -0,0 +1,16 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RagfairPriceService } from "../services/RagfairPriceService"; +import { ItemHelper } from "./ItemHelper"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairTaxHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected ragfairPriceService: RagfairPriceService; + protected itemHelper: ItemHelper; + constructor(logger: ILogger, databaseServer: DatabaseServer, ragfairPriceService: RagfairPriceService, itemHelper: ItemHelper); + calculateTax(item: Item, pmcData: IPmcData, requirementsValue: number, offerItemCount: number, sellInOnePiece: boolean): number; + protected calculateItemWorth(item: Item, itemTemplate: ITemplateItem, itemCount: number, pmcData: IPmcData, isRootItem?: boolean): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/RepairHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/RepairHelper.d.ts new file mode 100644 index 0000000..650c1aa --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/RepairHelper.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { Props } from "../models/eft/common/tables/ITemplateItem"; +import { IRepairConfig } from "../models/spt/config/IRepairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RepairHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected configServer: ConfigServer; + protected repairConfig: IRepairConfig; + constructor(logger: ILogger, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, configServer: ConfigServer); + updateItemDurability(itemToRepairId: string, amountToRepair: number, pmcData: IPmcData, useRepairKit?: boolean): Item; + protected getRandomisedArmorRepairDegredationValue(armorMaterial: string, isRepairKit: boolean, armorMax: number): number; + protected getRandomisedWeaponRepairDegredationValue(itemProps: Props, isRepairKit: boolean, armorMax: number): number; + isWeaponTemplate(tpl: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/SecureContainerHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/SecureContainerHelper.d.ts new file mode 100644 index 0000000..9e2bc32 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/SecureContainerHelper.d.ts @@ -0,0 +1,13 @@ +import { Item } from "../models/eft/common/tables/IItem"; +import { ItemHelper } from "./ItemHelper"; +export interface OwnerInventoryItems { + from: Item[]; + to: Item[]; + sameInventory: boolean; + isMail: boolean; +} +export declare class SecureContainerHelper { + protected itemHelper: ItemHelper; + constructor(itemHelper: ItemHelper); + getSecureContainerItems(items: Item[]): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/TradeHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/TradeHelper.d.ts new file mode 100644 index 0000000..975062b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/TradeHelper.d.ts @@ -0,0 +1,44 @@ +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item, Upd } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { RagfairServer } from "../servers/RagfairServer"; +import { FenceService } from "../services/FenceService"; +import { PaymentService } from "../services/PaymentService"; +export declare class TradeHelper { + protected logger: ILogger; + protected itemEventRouter: ItemEventRouter; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected paymentService: PaymentService; + protected fenceService: FenceService; + protected inventoryHelper: InventoryHelper; + protected ragfairServer: RagfairServer; + constructor(logger: ILogger, itemEventRouter: ItemEventRouter, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer); + /** + * Buy item from flea or trader + * @param pmcData + * @param buyRequestData data from client + * @param sessionID + * @param foundInRaid + * @param upd optional item details used when buying from flea + * @returns + */ + buyItem(pmcData: IPmcData, buyRequestData: IProcessBuyTradeRequestData, sessionID: string, foundInRaid: boolean, upd: Upd): IItemEventRouterResponse; + /** + * Sell item to trader + * @param pmcData + * @param body + * @param sessionID + * @returns + */ + sellItem(pmcData: IPmcData, body: IProcessSellTradeRequestData, sessionID: string): IItemEventRouterResponse; + protected incrementAssortBuyCount(assortBeingPurchased: Item, itemsPurchasedCount: number): void; + protected checkPurchaseIsWithinTraderItemLimit(assortBeingPurchased: Item, assortId: string, count: number): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/TraderAssortHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/TraderAssortHelper.d.ts new file mode 100644 index 0000000..4f41ac2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/TraderAssortHelper.d.ts @@ -0,0 +1,42 @@ +import { RagfairAssortGenerator } from "../generators/RagfairAssortGenerator"; +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { FenceService } from "../services/FenceService"; +import { TraderAssortService } from "../services/TraderAssortService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { AssortHelper } from "./AssortHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderAssortHelper { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected profileHelper: ProfileHelper; + protected assortHelper: AssortHelper; + protected ragfairAssortGenerator: RagfairAssortGenerator; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected traderAssortService: TraderAssortService; + protected fenceService: FenceService; + constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, profileHelper: ProfileHelper, assortHelper: AssortHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferGenerator: RagfairOfferGenerator, traderAssortService: TraderAssortService, fenceService: FenceService); + /** + * Get a traders assorts + * Can be used for returning ragfair / fence assorts + * @param sessionId session id + * @param traderId trader id + * @returns a traders assorts + */ + getAssort(sessionId: string, traderId: string): ITraderAssort; + /** + * Get an array of pristine trader items prior to any alteration by player + * @param traderId trader id + * @returns array of Items + */ + protected getPristineTraderAssorts(traderId: string): Item[]; + /** + * Returns generated ragfair offers in a trader assort format + * @returns Trader assort object + */ + protected getRagfairDataAsTraderAssort(): ITraderAssort; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/TraderHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/TraderHelper.d.ts new file mode 100644 index 0000000..ab4a371 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/TraderHelper.d.ts @@ -0,0 +1,53 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IBarterScheme, ITraderAssort, ITraderBase, LoyaltyLevel } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { FenceService } from "../services/FenceService"; +import { PlayerService } from "../services/PlayerService"; +import { HandbookHelper } from "./HandbookHelper"; +import { ItemHelper } from "./ItemHelper"; +import { PaymentHelper } from "./PaymentHelper"; +import { ProfileHelper } from "./ProfileHelper"; +export declare class TraderHelper { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected profileHelper: ProfileHelper; + protected paymentHelper: PaymentHelper; + protected itemHelper: ItemHelper; + protected handbookHelper: HandbookHelper; + protected playerService: PlayerService; + protected fenceService: FenceService; + protected configServer: ConfigServer; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, saveServer: SaveServer, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, itemHelper: ItemHelper, handbookHelper: HandbookHelper, playerService: PlayerService, fenceService: FenceService, configServer: ConfigServer); + getTrader(traderID: string, sessionID: string): ITraderBase; + getTraderAssortsById(traderId: string): ITraderAssort; + /** + * Reset a trader back to its initial state as seen by a level 1 player + * Does NOT take into account different profile levels + * @param sessionID session id + * @param traderID trader id to reset + */ + resetTrader(sessionID: string, traderID: string): void; + changeTraderDisplay(traderID: string, status: boolean, sessionID: string): void; + getPurchasesData(traderID: string, sessionID: string): Record; + /** + * Calculate traders level based on exp amount and increment level if over threshold + * @param traderID trader to process + * @param sessionID session id + */ + lvlUp(traderID: string, sessionID: string): void; + getTraderUpdateSeconds(traderId: string): number; + /** + * check if an item is allowed to be sold to a trader + * @param traderFilters array of allowed categories + * @param tplToCheck itemTpl of inventory + * @returns boolean + */ + traderFilter(traderFilters: string[], tplToCheck: string): boolean; + getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/UtilityHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/UtilityHelper.d.ts new file mode 100644 index 0000000..5d9f482 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/UtilityHelper.d.ts @@ -0,0 +1,3 @@ +export declare class UtilityHelper { + arrayIntersect(a: T[], b: T[]): T[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/helpers/WeightedRandomHelper.d.ts b/KcY-SeeItemValue/itemValue/server/types/helpers/WeightedRandomHelper.d.ts new file mode 100644 index 0000000..9aa0d29 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/helpers/WeightedRandomHelper.d.ts @@ -0,0 +1,28 @@ +export declare class WeightedRandomHelper { + /** + * Gets a tplId from a weighted dictionary + * @param {tplId: weighting[]} itemArray + * @returns tplId + */ + getWeightedInventoryItem(itemArray: { + [tplId: string]: unknown; + } | ArrayLike): string; + /** + * Picks the random item based on its weight. + * The items with higher weight will be picked more often (with a higher probability). + * + * For example: + * - items = ['banana', 'orange', 'apple'] + * - weights = [0, 0.2, 0.8] + * - weightedRandom(items, weights) in 80% of cases will return 'apple', in 20% of cases will return + * 'orange' and it will never return 'banana' (because probability of picking the banana is 0%) + * + * @param {any[]} items + * @param {number[]} weights + * @returns {{item: any, index: number}} + */ + weightedRandom(items: string | any[], weights: string | any[]): { + item: any; + index: number; + }; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/ide/BleedingEdgeEntry.d.ts b/KcY-SeeItemValue/itemValue/server/types/ide/BleedingEdgeEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/ide/BleedingEdgeEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/types/ide/Compiler.d.ts b/KcY-SeeItemValue/itemValue/server/types/ide/Compiler.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/ide/Compiler.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/types/ide/DebugEntry.d.ts b/KcY-SeeItemValue/itemValue/server/types/ide/DebugEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/ide/DebugEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/types/ide/ReleaseEntry.d.ts b/KcY-SeeItemValue/itemValue/server/types/ide/ReleaseEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/ide/ReleaseEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/types/ide/TestEntry.d.ts b/KcY-SeeItemValue/itemValue/server/types/ide/TestEntry.d.ts new file mode 100644 index 0000000..fded23a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/ide/TestEntry.d.ts @@ -0,0 +1 @@ +import "reflect-metadata"; diff --git a/KcY-SeeItemValue/itemValue/server/types/loaders/BundleLoader.d.ts b/KcY-SeeItemValue/itemValue/server/types/loaders/BundleLoader.d.ts new file mode 100644 index 0000000..06ad698 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/loaders/BundleLoader.d.ts @@ -0,0 +1,22 @@ +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +declare class BundleInfo { + modPath: string; + key: string; + path: string; + filepath: string; + dependencyKeys: string[]; + constructor(modpath: string, bundle: any, bundlePath: string, bundleFilepath: string); +} +export declare class BundleLoader { + protected httpServerHelper: HttpServerHelper; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected bundles: Record; + constructor(httpServerHelper: HttpServerHelper, vfs: VFS, jsonUtil: JsonUtil); + getBundles(local: boolean): BundleInfo[]; + getBundle(key: string, local: boolean): BundleInfo; + addBundles(modpath: string): void; +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/types/loaders/DelayedModLoader.d.ts b/KcY-SeeItemValue/itemValue/server/types/loaders/DelayedModLoader.d.ts new file mode 100644 index 0000000..2a05604 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/loaders/DelayedModLoader.d.ts @@ -0,0 +1,21 @@ +import { DependencyContainer } from "tsyringe"; +import { HandbookController } from "../controllers/HandbookController"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +import { InitialModLoader } from "./InitialModLoader"; +export declare class DelayedModLoader implements IModLoader { + protected bundleLoader: BundleLoader; + protected handbookController: HandbookController; + protected vfs: VFS; + protected modCompilerService: ModCompilerService; + protected initialModLoader: InitialModLoader; + constructor(bundleLoader: BundleLoader, handbookController: HandbookController, vfs: VFS, modCompilerService: ModCompilerService, initialModLoader: InitialModLoader); + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; + load(): void; + protected executeMods(container: DependencyContainer): void; + protected addBundles(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/loaders/InitialModLoader.d.ts b/KcY-SeeItemValue/itemValue/server/types/loaders/InitialModLoader.d.ts new file mode 100644 index 0000000..68e47fe --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/loaders/InitialModLoader.d.ts @@ -0,0 +1,64 @@ +import { DependencyContainer } from "tsyringe"; +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ModLoader } from "../models/spt/mod/IMod"; +import { IModLoader } from "../models/spt/mod/IModLoader"; +import { IPackageJsonData } from "../models/spt/mod/IPackageJsonData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { ModCompilerService } from "../services/ModCompilerService"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { BundleLoader } from "./BundleLoader"; +export declare class InitialModLoader implements IModLoader { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected modCompilerService: ModCompilerService; + protected bundleLoader: BundleLoader; + protected configServer: ConfigServer; + protected static container: DependencyContainer; + protected readonly basepath = "user/mods/"; + protected imported: Record; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer); + load(container: DependencyContainer): Promise; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + /** + * Returns a list of mods with preserved load order + * @returns Array of mod names in load order + */ + getImportedModsNames(): string[]; + getModPath(mod: string): string; + protected importClass(name: string, filepath: string, container: DependencyContainer): void; + protected importMods(): Promise; + /** + * + * @param mods Get an array of broken/invalid mods by name + * @returns Mod names array + */ + protected getBrokenMods(mods: string[]): string[]; + /** + * Get packageJson data for mods + * @param mods mods to get packageJson for + * @returns dictionary + */ + protected getModsPackageData(mods: string[]): Record; + /** + * Does mod have "delayedLoad(" string in its entry class + * @param modFolderName folder name + * @param modToValidate package.json details + * @returns boolean + */ + protected isModSpt300Compatible(modFolderName: string, modToValidate: IPackageJsonData): boolean; + protected isModCombatibleWithAki(mod: IPackageJsonData): boolean; + protected executeMods(container: DependencyContainer): void; + sortModsLoadOrder(): string[]; + protected addMod(mod: string): Promise; + protected areModDependenciesFulfilled(mod: IPackageJsonData, loadedMods: Record): boolean; + protected isModCompatible(mod: IPackageJsonData, loadedMods: Record): boolean; + protected validMod(mod: string): boolean; + protected getLoadOrderRecursive(mod: string, result: Record, visited: Record): void; + protected getLoadOrder(mods: Record): Record; + getContainer(): DependencyContainer; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts new file mode 100644 index 0000000..c49cef7 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/bot/IGenerateBotsRequestData.d.ts @@ -0,0 +1,8 @@ +export interface IGenerateBotsRequestData { + conditions: Condition[]; +} +export interface Condition { + Role: string; + Limit: number; + Difficulty: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IEmptyRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IEmptyRequestData.d.ts new file mode 100644 index 0000000..284d16e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IEmptyRequestData.d.ts @@ -0,0 +1,2 @@ +export interface IEmptyRequestData { +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IGlobals.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IGlobals.d.ts new file mode 100644 index 0000000..456895c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IGlobals.d.ts @@ -0,0 +1,1176 @@ +import { Item } from "./tables/IItem"; +export interface IGlobals { + time: number; + config: Config; + bot_presets: BotPreset[]; + BotWeaponScatterings: BotWeaponScattering[]; + ItemPresets: Record; +} +export interface Config { + content: Content; + AimPunchMagnitude: number; + WeaponSkillProgressRate: number; + SkillAtrophy: boolean; + exp: Exp; + t_base_looting: number; + t_base_lockpicking: number; + armor: Armor; + SessionsToShowHotKeys: number; + MaxBotsAliveOnMap: number; + SavagePlayCooldown: number; + SavagePlayCooldownNdaFree: number; + MarksmanAccuracy: number; + SavagePlayCooldownDevelop: number; + TODSkyDate: string; + Mastering: Mastering[]; + GlobalItemPriceModifier: number; + TradingUnlimitedItems: boolean; + MaxLoyaltyLevelForAll: boolean; + GlobalLootChanceModifier: number; + TimeBeforeDeploy: number; + TimeBeforeDeployLocal: number; + LoadTimeSpeedProgress: number; + BaseLoadTime: number; + BaseUnloadTime: number; + BaseCheckTime: number; + Customization: Customization; + UncheckOnShot: boolean; + BotsEnabled: boolean; + ArmorMaterials: ArmorMaterials; + LegsOverdamage: number; + HandsOverdamage: number; + StomachOverdamage: number; + Health: Health; + rating: Rating; + tournament: Tournament; + RagFair: RagFair; + handbook: Handbook; + FractureCausedByFalling: Probability; + FractureCausedByBulletHit: Probability; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + Stamina: Stamina; + StaminaRestoration: StaminaRestoration; + StaminaDrain: StaminaDrain; + RequirementReferences: RequirementReferences; + RepairKitSettings: RepairKitSettings; + RestrictionsInRaid: RestrictionsInRaid[]; + SkillMinEffectiveness: number; + SkillFatiguePerPoint: number; + SkillFreshEffectiveness: number; + SkillFreshPoints: number; + SkillPointsBeforeFatigue: number; + SkillFatigueReset: number; + DiscardLimitsEnabled: boolean; + EventType: string[]; + WalkSpeed: xyz; + SprintSpeed: xyz; + SkillEnduranceWeightThreshold: number; + TeamSearchingTimeout: number; + Insurance: Insurance; + SkillExpPerLevel: number; + GameSearchingTimeout: number; + WallContusionAbsorption: xyz; + SkillsSettings: SkillsSettings; + AzimuthPanelShowsPlayerOrientation: boolean; + Aiming: Aiming; + Malfunction: Malfunction; + Overheat: Overheat; + FenceSettings: FenceSettings; + TestValue: number; + Inertia: Inertia; + Ballistic: Ballistic; +} +export interface Content { + ip: string; + port: number; + root: string; +} +export interface Exp { + heal: Heal; + match_end: MatchEnd; + kill: Kill; + level: Level; + loot_attempts: LootAttempt[]; + expForLockedDoorOpen: number; + expForLockedDoorBreach: number; + triggerMult: number; +} +export interface Heal { + expForHeal: number; + expForHydration: number; + expForEnergy: number; +} +export interface MatchEnd { + README: string; + survived_exp_requirement: number; + survived_seconds_requirement: number; + survived_exp_reward: number; + mia_exp_reward: number; + runner_exp_reward: number; + leftMult: number; + miaMult: number; + survivedMult: number; + runnerMult: number; + killedMult: number; +} +export interface Kill { + combo: Combo[]; + victimLevelExp: number; + headShotMult: number; + expOnDamageAllHealth: number; + longShotDistance: number; + bloodLossToLitre: number; + victimBotLevelExp: number; +} +export interface Combo { + percent: number; +} +export interface Level { + exp_table: ExpTable[]; + trade_level: number; + savage_level: number; + clan_level: number; + mastering1: number; + mastering2: number; +} +export interface ExpTable { + exp: number; +} +export interface LootAttempt { + k_exp: number; +} +export interface Armor { + class: Class[]; +} +export interface Class { + resistance: number; +} +export interface Mastering { + Name: string; + Templates: string[]; + Level2: number; + Level3: number; +} +export interface Customization { + SavageHead: SavageHead; + SavageBody: SavageBody; + SavageFeet: SavageFeet; + CustomizationVoice: CustomizationVoice[]; + BodyParts: BodyParts; +} +export interface SavageHead { + wild_head_1: WildHead; + wild_head_2: WildHead; + wild_head_3: WildHead; + Wild_Dealmaker_head: WildHead; + Wild_Killa_head: WildHead; + bear_head: WildHead; + bear_head_1: WildHead; + usec_head_1: WildHead; + Head_BOSS_Glukhar: WildHead; + Wild_Head_nonMesh: WildHead; + Head_BOSS_Sanitar: WildHead; + wild_head_drozd: WildHead; + wild_head_misha: WildHead; + head_cultist_01: WildHead; + head_cultist_02: WildHead; + head_cultist_03: WildHead; + DefaultUsecHead: WildHead; + usec_head_3: WildHead; + usec_head_4: WildHead; + usec_head_5: WildHead; +} +export interface WildHead { + head: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface SavageBody { + wild_body: WildBody; + wild_body_1: WildBody; + wild_body_2: WildBody; + wild_body_3: WildBody; + Wild_Dealmaker_body: WildBody; + wild_security_body_1: WildBody; + wild_security_body_2: WildBody; + wild_Killa_body: WildBody; + wild_pmcBot_body: WildBody; + wild_Shturman_body: WildBody; + wild_Gluhar_body: WildBody; + Tshirt_security_TshirtTatu_01: WildBody; + Tshirt_security_TshirtTatu_02: WildBody; + Top_security_Husky: WildBody; + Top_security_Gorka4: WildBody; + scav_kit_upper_meteor: WildBody; + wild_body_russia1: WildBody; + Top_BOSS_Sanitar: WildBody; + wild_body_motocross: WildBody; + top_cultist_01: WildBody; + top_cultist_02: WildBody; + wild_body_rainparka: WildBody; + wild_body_underarmour: WildBody; + top_boss_tagilla: WildBody; + DefaultUsecBody: WildBody; + usec_upper_acu: WildBody; + usec_upper_commando: WildBody; + usec_upper_aggressor: WildBody; + usec_upper_hoody: WildBody; + usec_upper_pcuironsight: WildBody; + usec_top_beltstaff: WildBody; + usec_upper_flexion: WildBody; + usec_upper_tier3: WildBody; + usec_upper_pcsmulticam: WildBody; + usec_upper_tier_2: WildBody; + usec_upper_infiltrator: WildBody; + user_upper_NightPatrol: WildBody; + wild_body_bomber: WildBody; + wild_top_yellowcoat: WildBody; +} +export interface WildBody { + body: string; + hands: string; + isNotRandom: boolean; +} +export interface SavageFeet { + wild_feet: WildFeet; + wild_feet_1: WildFeet; + wild_feet_2: WildFeet; + Wild_Dealmaker_feet: WildFeet; + wild_security_feet_1: WildFeet; + Wild_Killa_feet: WildFeet; + wild_pmcBot_feet: WildFeet; + Pants_BOSS_Glukhar: WildFeet; + Pants_BOSS_Shturman: WildFeet; + Pants_security_Gorka4: WildFeet; + Pants_security_Flora: WildFeet; + scav_kit_lower_sklon: WildFeet; + Pants_BOSS_Sanitar: WildFeet; + wild_feet_sweatpants: WildFeet; + wild_feet_wasatch: WildFeet; + wild_feet_slimPants: WildFeet; + pants_cultist_01: WildFeet; + pants_cultist_02: WildFeet; + wild_feet_scavelite_taclite: WildFeet; + pants_boss_tagilla: WildFeet; + wild_feet_bomber: WildFeet; + wild_pants_yellowcoat: WildFeet; +} +export interface WildFeet { + feet: string; + isNotRandom: boolean; + NotRandom: boolean; +} +export interface CustomizationVoice { + voice: string; + side: string[]; + isNotRandom: boolean; +} +export interface BodyParts { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface ArmorMaterials { + UHMWPE: ArmorType; + Aramid: ArmorType; + Combined: ArmorType; + Titan: ArmorType; + Aluminium: ArmorType; + ArmoredSteel: ArmorType; + Ceramic: ArmorType; + Glass: ArmorType; +} +export interface ArmorType { + Destructibility: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + ExplosionDestructibility: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; +} +export interface Health { + Falling: Falling; + Effects: Effects; + HealPrice: HealPrice; + ProfileHealthSettings: ProfileHealthSettings; +} +export interface Falling { + DamagePerMeter: number; + SafeHeight: number; +} +export interface Effects { + Existence: Existence; + Dehydration: Dehydration; + BreakPart: BreakPart; + Contusion: Contusion; + Disorientation: Disorientation; + Exhaustion: Exhaustion; + LowEdgeHealth: LowEdgeHealth; + RadExposure: RadExposure; + Stun: Stun; + Intoxication: Intoxication; + Regeneration: Regeneration; + Wound: Wound; + Berserk: Berserk; + Flash: Flash; + MedEffect: MedEffect; + Pain: Pain; + PainKiller: PainKiller; + SandingScreen: SandingScreen; + Stimulator: Stimulator; + Tremor: Tremor; + ChronicStaminaFatigue: ChronicStaminaFatigue; + Fracture: Fracture2; + HeavyBleeding: HeavyBleeding2; + LightBleeding: LightBleeding2; + BodyTemperature: BodyTemperature; +} +export interface Existence { + EnergyLoopTime: number; + HydrationLoopTime: number; + EnergyDamage: number; + HydrationDamage: number; + DestroyedStomachEnergyTimeFactor: number; + DestroyedStomachHydrationTimeFactor: number; +} +export interface Dehydration { + DefaultDelay: number; + DefaultResidueTime: number; + BleedingHealth: number; + BleedingLoopTime: number; + BleedingLifeTime: number; + DamageOnStrongDehydration: number; + StrongDehydrationLoopTime: number; +} +export interface BreakPart { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface Contusion { + Dummy: number; +} +export interface Disorientation { + Dummy: number; +} +export interface Exhaustion { + DefaultDelay: number; + DefaultResidueTime: number; + Damage: number; + DamageLoopTime: number; +} +export interface LowEdgeHealth { + DefaultDelay: number; + DefaultResidueTime: number; + StartCommonHealth: number; +} +export interface RadExposure { + Damage: number; + DamageLoopTime: number; +} +export interface Stun { + Dummy: number; +} +export interface Intoxication { + DefaultDelay: number; + DefaultResidueTime: number; + DamageHealth: number; + HealthLoopTime: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovedAfterDeath: boolean; + HealExperience: number; + RemovePrice: number; +} +export interface Regeneration { + LoopTime: number; + MinimumHealthPercentage: number; + Energy: number; + Hydration: number; + BodyHealth: BodyHealth; + Influences: Influences; +} +export interface BodyHealth { + Head: BodyHealthValue; + Chest: BodyHealthValue; + Stomach: BodyHealthValue; + LeftArm: BodyHealthValue; + RightArm: BodyHealthValue; + LeftLeg: BodyHealthValue; + RightLeg: BodyHealthValue; +} +export interface BodyHealthValue { + Value: number; +} +export interface Influences { + LightBleeding: Influence; + HeavyBleeding: Influence; + Fracture: Influence; + RadExposure: Influence; + Intoxication: Influence; +} +export interface Influence { + HealthSlowDownPercentage: number; + EnergySlowDownPercentage: number; + HydrationSlowDownPercentage: number; +} +export interface Wound { + WorkingTime: number; + ThresholdMin: number; + ThresholdMax: number; +} +export interface Berserk { + DefaultDelay: number; + WorkingTime: number; + DefaultResidueTime: number; +} +export interface Flash { + Dummy: number; +} +export interface MedEffect { + LoopTime: number; + StartDelay: number; + DrinkStartDelay: number; + FoodStartDelay: number; + DrugsStartDelay: number; + MedKitStartDelay: number; + MedicalStartDelay: number; + StimulatorStartDelay: number; +} +export interface Pain { + TremorDelay: number; + HealExperience: number; +} +export interface PainKiller { + Dummy: number; +} +export interface SandingScreen { + Dummy: number; +} +export interface Stimulator { + BuffLoopTime: number; + Buffs: Buffs; +} +export interface Buffs { + BuffsSJ1TGLabs: Buff[]; + BuffsSJ6TGLabs: Buff[]; + BuffsPropital: Buff[]; + BuffsZagustin: Buff[]; + BuffseTGchange: Buff[]; + BuffsAdrenaline: Buff[]; + BuffsGoldenStarBalm: Buff[]; + Buffs_drink_aquamari: Buff[]; + Buffs_drink_maxenergy: Buff[]; + Buffs_drink_milk: Buff[]; + Buffs_drink_tarcola: Buff[]; + Buffs_drink_hotrod: Buff[]; + Buffs_drink_juice_army: Buff[]; + Buffs_drink_water: Buff[]; + Buffs_food_borodinskiye: Buff[]; + Buffs_food_condensed_milk: Buff[]; + Buffs_food_emelya: Buff[]; + Buffs_food_mayonez: Buff[]; + Buffs_food_mre: Buff[]; + Buffs_food_sugar: Buff[]; + Buffs_drink_vodka: Buff[]; + Buffs_drink_jack: Buff[]; + Buffs_drink_moonshine: Buff[]; + Buffs_drink_purewater: Buff[]; + Buffs_3bTG: Buff[]; + Buffs_AHF1M: Buff[]; + Buffs_L1: Buff[]; + Buffs_MULE: Buff[]; + Buffs_Meldonin: Buff[]; + Buffs_Obdolbos: Buff[]; + Buffs_P22: Buff[]; + Buffs_KultistsToxin: Buff[]; + Buffs_BodyTemperature: Buff[]; + Buffs_Antidote: Buff[]; + Buffs_melee_bleed: Buff[]; + Buffs_melee_blunt: Buff[]; + Buffs_hultafors: Buff[]; + Buffs_drink_vodka_BAD: Buff[]; + Buffs_food_alyonka: Buff[]; + Buffs_food_slippers: Buff[]; + Buffs_knife: Buff[]; +} +export interface Buff { + BuffType: string; + Chance: number; + Delay: number; + Duration: number; + Value: number; + AbsoluteValue: boolean; + SkillName: string; +} +export interface Tremor { + DefaultDelay: number; + DefaultResidueTime: number; +} +export interface ChronicStaminaFatigue { + EnergyRate: number; + WorkingTime: number; + TicksEvery: number; + EnergyRatePerStack: number; +} +export interface Fracture2 { + DefaultDelay: number; + DefaultResidueTime: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + BulletHitProbability: Probability; + FallingProbability: Probability; +} +export interface HeavyBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface Probability { + FunctionType: string; + K: number; + B: number; + Threshold: number; +} +export interface LightBleeding2 { + DefaultDelay: number; + DefaultResidueTime: number; + DamageEnergy: number; + DamageHealth: number; + EnergyLoopTime: number; + HealthLoopTime: number; + DamageHealthDehydrated: number; + HealthLoopTimeDehydrated: number; + LifeTimeDehydrated: number; + EliteVitalityDuration: number; + HealExperience: number; + OfflineDurationMin: number; + OfflineDurationMax: number; + RemovePrice: number; + RemovedAfterDeath: boolean; + Probability: Probability; +} +export interface BodyTemperature { + DefaultBuildUpTime: number; + DefaultResidueTime: number; + LoopTime: number; +} +export interface HealPrice { + HealthPointPrice: number; + HydrationPointPrice: number; + EnergyPointPrice: number; + TrialLevels: number; + TrialRaids: number; +} +export interface ProfileHealthSettings { + BodyPartsSettings: BodyPartsSettings; + HealthFactorsSettings: HealthFactorsSettings; +} +export interface BodyPartsSettings { + Head: BodyPartsSetting; + Chest: BodyPartsSetting; + Stomach: BodyPartsSetting; + LeftArm: BodyPartsSetting; + RightArm: BodyPartsSetting; + LeftLeg: BodyPartsSetting; + RightLeg: BodyPartsSetting; +} +export interface BodyPartsSetting { + Minimum: number; + Maximum: number; + Default: number; + OverDamageReceivedMultiplier: number; +} +export interface HealthFactorsSettings { + Energy: HealthFactorSetting; + Hydration: HealthFactorSetting; + Temperature: HealthFactorSetting; + Poisoning: HealthFactorSetting; + Radiation: HealthFactorSetting; +} +export interface HealthFactorSetting { + Minimum: number; + Maximum: number; + Default: number; +} +export interface Rating { + levelRequired: number; + limit: number; + categories: Categories; +} +export interface Categories { + experience: boolean; + kd: boolean; + surviveRatio: boolean; + avgEarnings: boolean; + kills: boolean; + raidCount: boolean; + longestShot: boolean; + timeOnline: boolean; + inventoryFullCost: boolean; + ragFairStanding: boolean; +} +export interface Tournament { + categories: Categories2; + limit: number; + levelRequired: number; +} +export interface Categories2 { + dogtags: boolean; +} +export interface RagFair { + enabled: boolean; + priceStabilizerEnabled: boolean; + includePveTraderSales: boolean; + priceStabilizerStartIntervalInHours: number; + minUserLevel: number; + communityTax: number; + communityItemTax: number; + communityRequirementTax: number; + offerPriorityCost: number; + offerDurationTimeInHour: number; + offerDurationTimeInHourAfterRemove: number; + priorityTimeModifier: number; + maxRenewOfferTimeInHour: number; + renewPricePerHour: number; + maxActiveOfferCount: MaxActiveOfferCount[]; + balancerRemovePriceCoefficient: number; + balancerMinPriceCount: number; + balancerAveragePriceCoefficient: number; + delaySinceOfferAdd: number; + uniqueBuyerTimeoutInDays: number; + ratingSumForIncrease: number; + ratingIncreaseCount: number; + ratingSumForDecrease: number; + ratingDecreaseCount: number; + maxSumForIncreaseRatingPerOneSale: number; + maxSumForDecreaseRatingPerOneSale: number; + maxSumForRarity: MaxSumForRarity; + ChangePriceCoef: number; + balancerUserItemSaleCooldownEnabled: boolean; + balancerUserItemSaleCooldown: number; + youSellOfferMaxStorageTimeInHour: number; + yourOfferDidNotSellMaxStorageTimeInHour: number; + isOnlyFoundInRaidAllowed: boolean; + sellInOnePiece: number; +} +export interface MaxActiveOfferCount { + from: number; + to: number; + count: number; +} +export interface MaxSumForRarity { + Common: RarityMaxSum; + Rare: RarityMaxSum; + Superrare: RarityMaxSum; + Not_exist: RarityMaxSum; +} +export interface RarityMaxSum { + value: number; +} +export interface Handbook { + defaultCategory: string; +} +export interface Stamina { + Capacity: number; + SprintDrainRate: number; + BaseRestorationRate: number; + JumpConsumption: number; + GrenadeHighThrow: number; + GrenadeLowThrow: number; + AimDrainRate: number; + AimRangeFinderDrainRate: number; + OxygenCapacity: number; + OxygenRestoration: number; + WalkOverweightLimits: xyz; + BaseOverweightLimits: xyz; + SprintOverweightLimits: xyz; + WalkSpeedOverweightLimits: xyz; + CrouchConsumption: xyz; + WalkConsumption: xyz; + StandupConsumption: xyz; + TransitionSpeed: xyz; + SprintAccelerationLowerLimit: number; + SprintSpeedLowerLimit: number; + SprintSensitivityLowerLimit: number; + AimConsumptionByPose: xyz; + RestorationMultiplierByPose: xyz; + OverweightConsumptionByPose: xyz; + AimingSpeedMultiplier: number; + WalkVisualEffectMultiplier: number; + HandsCapacity: number; + HandsRestoration: number; + ProneConsumption: number; + BaseHoldBreathConsumption: number; + SoundRadius: xyz; + ExhaustedMeleeSpeed: number; + FatigueRestorationRate: number; + FatigueAmountToCreateEffect: number; + ExhaustedMeleeDamageMultiplier: number; + FallDamageMultiplier: number; + SafeHeightOverweight: number; + SitToStandConsumption: number; + StaminaExhaustionCausesJiggle: boolean; + StaminaExhaustionStartsBreathSound: boolean; + StaminaExhaustionRocksCamera: boolean; + HoldBreathStaminaMultiplier: xyz; + PoseLevelIncreaseSpeed: xyz; + PoseLevelDecreaseSpeed: xyz; + PoseLevelConsumptionPerNotch: xyz; +} +export interface StaminaRestoration { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface StaminaDrain { + LowerLeftPoint: number; + LowerRightPoint: number; + LeftPlatoPoint: number; + RightPlatoPoint: number; + RightLimit: number; + ZeroValue: number; +} +export interface RequirementReferences { + Alpinist: Alpinist[]; +} +export interface Alpinist { + Requirement: string; + Id: string; + Count: number; + RequiredSlot: string; + RequirementTip: string; +} +export interface RestrictionsInRaid { + TemplateId: string; + Value: number; +} +export interface Insurance { + MaxStorageTimeInHour: number; +} +export interface SkillsSettings { + SkillProgressRate: number; + WeaponSkillProgressRate: number; + WeaponSkillRecoilBonusPerLevel: number; + HideoutManagement: HideoutManagement; + Crafting: Crafting; + Metabolism: Metabolism; + Immunity: Immunity; + Endurance: Endurance; + Strength: Strength; + Vitality: Vitality; + Health: Health2; + StressResistance: StressResistance; + Throwing: Throwing; + RecoilControl: RecoilControl; + Pistol: WeaponSkills; + Revolver: WeaponSkills; + SMG: any[]; + Assault: WeaponSkills; + Shotgun: WeaponSkills; + Sniper: WeaponSkills; + LMG: any[]; + HMG: any[]; + Launcher: any[]; + AttachedLauncher: any[]; + Melee: any[]; + DMR: WeaponSkills; + BearAssaultoperations: any[]; + BearAuthority: any[]; + BearAksystems: any[]; + BearHeavycaliber: any[]; + BearRawpower: any[]; + UsecArsystems: any[]; + UsecDeepweaponmodding_Settings: any[]; + UsecLongrangeoptics_Settings: any[]; + UsecNegotiations: any[]; + UsecTactics: any[]; + BotReload: any[]; + CovertMovement: CovertMovement; + FieldMedicine: any[]; + Search: Search; + Sniping: any[]; + ProneMovement: any[]; + FirstAid: any[]; + LightVests: ArmorSkills; + HeavyVests: ArmorSkills; + WeaponModding: any[]; + AdvancedModding: any[]; + NightOps: any[]; + SilentOps: any[]; + Lockpicking: any[]; + WeaponTreatment: WeaponTreatment; + MagDrills: MagDrills; + Freetrading: any[]; + Auctions: any[]; + Cleanoperations: any[]; + Barter: any[]; + Shadowconnections: any[]; + Taskperformance: any[]; + Perception: Perception; + Intellect: Intellect; + Attention: Attention; + Charisma: Charisma; + Memory: Memory; + Surgery: Surgery; + AimDrills: AimDrills; + BotSound: any[]; + TroubleShooting: TroubleShooting; +} +export interface ArmorSkills { + WearAmountRepairLVestsReducePerLevel: number; + WearChanceRepairLVestsReduceEliteLevel: number; +} +export interface HideoutManagement { + SkillPointsPerAreaUpgrade: number; + SkillPointsPerCraft: number; + ConsumptionReductionPerLevel: number; + SkillBoostPercent: number; + SkillPointsRate: SkillPointsRate; + EliteSlots: EliteSlots; +} +export interface SkillPointsRate { + Generator: Generator; + AirFilteringUnit: SkillPointRate; + WaterCollector: SkillPointRate; + SolarPower: SkillPointRate; +} +export interface SkillPointRate { + ResourceSpent: number; + PointsGained: number; +} +export interface EliteSlots { + Generator: EliteSlot; + AirFilteringUnit: EliteSlot; + WaterCollector: EliteSlot; + BitcoinFarm: EliteSlot; +} +export interface EliteSlot { + Slots: number; + Container: number; +} +export interface Crafting { + PointsPerCraftingCycle: number; + CraftingCycleHours: number; + PointsPerUniqueCraftCycle: number; + UniqueCraftsPerCycle: number; + CraftTimeReductionPerLevel: number; + ProductionTimeReductionPerLevel: number; + EliteExtraProductions: number; + CraftingPointsToInteligence: number; +} +export interface Metabolism { + HydrationRecoveryRate: number; + EnergyRecoveryRate: number; + IncreasePositiveEffectDurationRate: number; + DecreaseNegativeEffectDurationRate: number; + DecreasePoisonDurationRate: number; +} +export interface Immunity { + ImmunityMiscEffects: number; + ImmunityPoisonBuff: number; + ImmunityPainKiller: number; + HealthNegativeEffect: number; + StimulatorNegativeBuff: number; +} +export interface Endurance { + MovementAction: number; + SprintAction: number; + GainPerFatigueStack: number; +} +export interface Strength { + SprintActionMin: number; + SprintActionMax: number; + MovementActionMin: number; + MovementActionMax: number; + PushUpMin: number; + PushUpMax: number; + FistfightAction: number; + ThrowAction: number; +} +export interface Vitality { + DamageTakenAction: number; + HealthNegativeEffect: number; +} +export interface Health2 { + SkillProgress: number; +} +export interface StressResistance { + HealthNegativeEffect: number; + LowHPDuration: number; +} +export interface Throwing { + ThrowAction: number; +} +export interface RecoilControl { + RecoilAction: number; + RecoilBonusPerLevel: number; +} +export interface WeaponSkills { + WeaponReloadAction: number; + WeaponShotAction: number; + WeaponFixAction: number; + WeaponChamberAction: number; +} +export interface CovertMovement { + MovementAction: number; +} +export interface Search { + SearchAction: number; + FindAction: number; +} +export interface WeaponTreatment { + DurLossReducePerLevel: number; + SkillPointsPerRepair: number; + Filter: any[]; + WearAmountRepairGunsReducePerLevel: number; + WearChanceRepairGunsReduceEliteLevel: number; +} +export interface MagDrills { + RaidLoadedAmmoAction: number; + RaidUnloadedAmmoAction: number; + MagazineCheckAction: number; +} +export interface Perception { + OnlineAction: number; + UniqueLoot: number; +} +export interface Intellect { + ExamineAction: number; + SkillProgress: number; + RepairAction: number; + WearAmountReducePerLevel: number; + WearChanceReduceEliteLevel: number; + RepairPointsCostReduction: number; +} +export interface Attention { + ExamineWithInstruction: number; + FindActionFalse: number; + FindActionTrue: number; +} +export interface Charisma { + SkillProgressInt: number; + SkillProgressAtn: number; + SkillProgressPer: number; +} +export interface Memory { + AnySkillUp: number; + SkillProgress: number; +} +export interface Surgery { + SurgeryAction: number; + SkillProgress: number; +} +export interface AimDrills { + WeaponShotAction: number; +} +export interface TroubleShooting { + MalfRepairSpeedBonusPerLevel: number; + SkillPointsPerMalfFix: number; + EliteDurabilityChanceReduceMult: number; + EliteAmmoChanceReduceMult: number; + EliteMagChanceReduceMult: number; +} +export interface Aiming { + ProceduralIntensityByPose: xyz; + AimProceduralIntensity: number; + HeavyWeight: number; + LightWeight: number; + MaxTimeHeavy: number; + MinTimeHeavy: number; + MaxTimeLight: number; + MinTimeLight: number; + RecoilScaling: number; + RecoilDamping: number; + CameraSnapGlobalMult: number; + RecoilXIntensityByPose: xyz; + RecoilYIntensityByPose: xyz; + RecoilZIntensityByPose: xyz; + RecoilCrank: boolean; + RecoilHandDamping: number; + RecoilConvergenceMult: number; + RecoilVertBonus: number; + RecoilBackBonus: number; +} +export interface Malfunction { + AmmoMalfChanceMult: number; + MagazineMalfChanceMult: number; + MalfRepairHardSlideMult: number; + MalfRepairOneHandBrokenMult: number; + MalfRepairTwoHandsBrokenMult: number; + AllowMalfForBots: boolean; + ShowGlowAttemptsCount: number; + OutToIdleSpeedMultForPistol: number; + IdleToOutSpeedMultOnMalf: number; + TimeToQuickdrawPistol: number; + DurRangeToIgnoreMalfs: xyz; + DurFeedWt: number; + DurMisfireWt: number; + DurJamWt: number; + DurSoftSlideWt: number; + DurHardSlideMinWt: number; + DurHardSlideMaxWt: number; + AmmoMisfireWt: number; + AmmoFeedWt: number; + AmmoJamWt: number; + OverheatFeedWt: number; + OverheatJamWt: number; + OverheatSoftSlideWt: number; + OverheatHardSlideMinWt: number; + OverheatHardSlideMaxWt: number; +} +export interface Overheat { + MinOverheat: number; + MaxOverheat: number; + OverheatProblemsStart: number; + ModHeatFactor: number; + ModCoolFactor: number; + MinWearOnOverheat: number; + MaxWearOnOverheat: number; + MinWearOnMaxOverheat: number; + MaxWearOnMaxOverheat: number; + OverheatWearLimit: number; + MaxCOIIncreaseMult: number; + MinMalfChance: number; + MaxMalfChance: number; + DurReduceMinMult: number; + DurReduceMaxMult: number; + BarrelMoveRndDuration: number; + BarrelMoveMaxMult: number; + FireratePitchMult: number; + FirerateReduceMinMult: number; + FirerateReduceMaxMult: number; + FirerateOverheatBorder: number; + EnableSlideOnMaxOverheat: boolean; + StartSlideOverheat: number; + FixSlideOverheat: number; + AutoshotMinOverheat: number; + AutoshotChance: number; + AutoshotPossibilityDuration: number; + MaxOverheatCoolCoef: number; +} +export interface FenceSettings { + FenceId: string; + Levels: Record; + paidExitStandingNumerator: number; +} +export interface FenceLevel { + SavageCooldownModifier: number; + ScavCaseTimeModifier: number; + PaidExitCostModifier: number; + BotFollowChance: number; + ScavEquipmentSpawnChanceModifier: number; + PriceModifier: number; + HostileBosses: boolean; + HostileScavs: boolean; + ScavAttackSupport: boolean; + ExfiltrationPriceModifier: number; + AvailableExits: number; +} +export interface Inertia { + InertiaLimits: xyz; + InertiaLimitsStep: number; + ExitMovementStateSpeedThreshold: xyz; + WalkInertia: xyz; + FallThreshold: number; + SpeedLimitAfterFallMin: xyz; + SpeedLimitAfterFallMax: xyz; + SpeedLimitDurationMin: xyz; + SpeedLimitDurationMax: xyz; + SpeedInertiaAfterJump: xyz; + BaseJumpPenaltyDuration: number; + DurationPower: number; + BaseJumpPenalty: number; + PenaltyPower: number; + InertiaTiltCurveMin: xyz; + InertiaTiltCurveMax: xyz; + InertiaBackwardCoef: xyz; + TiltInertiaMaxSpeed: xyz; + TiltStartSideBackSpeed: xyz; + TiltMaxSideBackSpeed: xyz; + TiltAcceleration: xyz; + AverageRotationFrameSpan: number; + SprintSpeedInertiaCurveMin: xyz; + SprintSpeedInertiaCurveMax: xyz; + SprintBrakeInertia: xyz; + SprintTransitionMotionPreservation: xyz; + WeaponFlipSpeed: xyz; + PreSprintAccelerationLimits: xyz; + SprintAccelerationLimits: xyz; + SideTime: xyz; + DiagonalTime: xyz; + MinDirectionBlendTime: number; + MoveTime: number; + MinMovementAccelerationRangeRight: xyz; + MaxMovementAccelerationRangeRight: xyz; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Ballistic { + GlobalDamageDegradationCoefficient: number; +} +export interface RepairKitSettings { + armorClassDivisor: number; + durabilityPointCostArmor: number; + durabilityPointCostGuns: number; +} +export interface BotPreset { + UseThis: boolean; + Role: string; + BotDifficulty: string; + VisibleAngle: number; + VisibleDistance: number; + ScatteringPerMeter: number; + HearingSense: number; + SCATTERING_DIST_MODIF: number; + MAX_AIMING_UPGRADE_BY_TIME: number; + FIRST_CONTACT_ADD_SEC: number; + COEF_IF_MOVE: number; +} +export interface BotWeaponScattering { + Name: string; + PriorityScatter1meter: number; + PriorityScatter10meter: number; + PriorityScatter100meter: number; +} +export interface Preset { + _id: string; + _type: string; + _changeWeaponName: boolean; + _name: string; + _parent: string; + _items: Item[]; + _encyclopedia?: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocation.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocation.d.ts new file mode 100644 index 0000000..42fac06 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocation.d.ts @@ -0,0 +1,6 @@ +import { ILocationBase } from "./ILocationBase"; +import { ILooseLoot } from "./ILooseLoot"; +export interface ILocation { + base: ILocationBase; + looseLoot: ILooseLoot; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocationBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocationBase.d.ts new file mode 100644 index 0000000..ad48d32 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocationBase.d.ts @@ -0,0 +1,198 @@ +export interface ILocationBase { + AccessKeys: string[]; + AirdropParameters: AirdropParameter[]; + Area: number; + AveragePlayTime: number; + AveragePlayerLevel: number; + Banners: Banner[]; + BossLocationSpawn: BossLocationSpawn[]; + BotAssault: number; + BotEasy: number; + BotHard: number; + BotImpossible: number; + BotLocationModifier: BotLocationModifier; + BotMarksman: number; + BotMax: number; + BotMaxPlayer: number; + BotMaxTimePlayer: number; + BotNormal: number; + BotSpawnTimeOffMax: number; + BotSpawnTimeOffMin: number; + BotSpawnTimeOnMax: number; + BotSpawnTimeOnMin: number; + BotStart: number; + BotStop: number; + Description: string; + DisabledForScav: boolean; + DisabledScavExits: string; + Enabled: boolean; + GlobalLootChanceModifier: number; + IconX: number; + IconY: number; + Id: string; + Insurance: boolean; + IsSecret: boolean; + Locked: boolean; + Loot: any[]; + MaxBotPerZone: number; + MaxDistToFreePoint: number; + MaxPlayers: number; + MinDistToExitPoint: number; + MinDistToFreePoint: number; + MinMaxBots: MinMaxBot[]; + MinPlayers: number; + Name: string; + NewSpawn: boolean; + OcculsionCullingEnabled: boolean; + OldSpawn: boolean; + OpenZones: string; + Preview: Preview; + RequiredPlayerLevel: number; + Rules: string; + SafeLocation: boolean; + Scene: Scene; + SpawnPointParams: SpawnPointParam[]; + UnixDateTime: number; + _Id: string; + doors: any[]; + escape_time_limit: number; + exit_access_time: number; + exit_count: number; + exit_time: number; + exits: Exit[]; + filter_ex: string[]; + limits: ILimit[]; + matching_min_seconds: number; + maxItemCountInLocation: MaxItemCountInLocation[]; + sav_summon_seconds: number; + tmp_location_field_remove_me: number; + users_gather_seconds: number; + users_spawn_seconds_n: number; + users_spawn_seconds_n2: number; + users_summon_seconds: number; + waves: Wave[]; +} +export interface ILimit { + min: number; + max: number; + items: any[]; +} +export interface AirdropParameter { + AirdropPointDeactivateDistance: number; + MinPlayersCountToSpawnAirdrop: number; + PlaneAirdropChance: number; + PlaneAirdropCooldownMax: number; + PlaneAirdropCooldownMin: number; + PlaneAirdropEnd: number; + PlaneAirdropMax: number; + PlaneAirdropStartMax: number; + PlaneAirdropStartMin: number; + UnsuccessfulTryPenalty: number; +} +export interface Banner { + id: string; + pic: Pic; +} +export interface Pic { + path: string; + rcid: string; +} +export interface BossLocationSpawn { + BossChance: number; + BossDifficult: string; + BossEscortAmount: string; + BossEscortDifficult: string; + BossEscortType: string; + BossName: string; + BossPlayer: boolean; + BossZone: string; + Time: number; + TriggerId: string; + TriggerName: string; + Delay?: number; + Supports?: BossSupport[]; +} +export interface BossSupport { + BossEscortAmount: string; + BossEscortDifficult: string[]; + BossEscortType: string; +} +export interface BotLocationModifier { + AccuracySpeed: number; + DistToActivate: number; + DistToPersueAxemanCoef: number; + DistToSleep: number; + GainSight: number; + KhorovodChance: number; + MagnetPower: number; + MarksmanAccuratyCoef: number; + Scattering: number; + VisibleDistance: number; +} +export interface MinMaxBot { + WildSpawnType: string; + max: number; + min: number; +} +export interface Preview { + path: string; + rcid: string; +} +export interface Scene { + path: string; + rcid: string; +} +export interface SpawnPointParam { + BotZoneName: string; + Categories: string[]; + ColliderParams: ColliderParams; + DelayToCanSpawnSec: number; + Id: string; + Infiltration: string; + Position: xyz; + Rotation: number; + Sides: string[]; +} +export interface ColliderParams { + _parent: string; + _props: Props; +} +export interface Props { + Center: xyz; + Radius: number; +} +export interface xyz { + x: number; + y: number; + z: number; +} +export interface Exit { + Chance: number; + Count: number; + EntryPoints: string; + ExfiltrationTime: number; + ExfiltrationType: string; + Id: string; + MaxTime: number; + MinTime: number; + Name: string; + PassageRequirement: string; + PlayersCount: number; + RequirementTip: string; +} +export interface MaxItemCountInLocation { + TemplateId: string; + Value: number; +} +export interface Wave { + BotPreset: string; + BotSide: string; + SpawnPoints: string; + WildSpawnType: string; + isPlayers: boolean; + number: number; + slots_max: number; + slots_min: number; + time_max: number; + time_min: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts new file mode 100644 index 0000000..7f8d915 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILocationsSourceDestinationBase.d.ts @@ -0,0 +1,9 @@ +import { ILocations } from "../../spt/server/ILocations"; +export interface ILocationsGenerateAllResponse { + locations: ILocations; + paths: Path[]; +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILooseLoot.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILooseLoot.d.ts new file mode 100644 index 0000000..14b795e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/ILooseLoot.d.ts @@ -0,0 +1,45 @@ +export interface ILooseLoot { + spawnpointCount: SpawnpointCount; + spawnpointsForced: SpawnpointsForced[]; + spawnpoints: Spawnpoint[]; +} +export interface SpawnpointCount { + mean: number; + std: number; +} +export interface SpawnpointsForced { + locationId: string; + probability: number; + template: SpawnpointTemplate; +} +export interface SpawnpointTemplate { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: Item[]; +} +export interface Item { + _id: string; + _tpl?: string; +} +export interface Spawnpoint { + locationId: string; + probability: number; + template: SpawnpointTemplate; + itemDistribution: ItemDistribution[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IMetricsTableData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IMetricsTableData.d.ts new file mode 100644 index 0000000..873ef82 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IMetricsTableData.d.ts @@ -0,0 +1,7 @@ +export interface IMetricsTableData { + Keys: number[]; + NetProcessingBins: number[]; + RenderBins: number[]; + GameUpdateBins: number[]; + MemoryMeasureInterval: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IPmcData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IPmcData.d.ts new file mode 100644 index 0000000..adc2aa5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/IPmcData.d.ts @@ -0,0 +1,341 @@ +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +import { IPmcDataRepeatableQuest } from "./tables/IRepeatableQuests"; +import { Item, Upd } from "./tables/IItem"; +import { HideoutAreas } from "../../enums/HideoutAreas"; +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IPmcData { + _id: string; + aid: string; + savage: string; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: Record; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: InsuredItem[]; + Hideout: Hideout; + Bonuses: Bonus[]; + Notes: Notes; + Quests: Quest[]; + TradersInfo: Record; + RagfairInfo: RagfairInfo; + WishList: string[]; + RepeatableQuests: IPmcDataRepeatableQuest[]; + CarExtractCounts: CarExtractCounts; + SurvivorClass: SurvivorClass; +} +export declare enum SurvivorClass { + Unknown = 0, + Neutralizer = 1, + Marauder = 2, + Paramedic = 3, + Survivor = 4 +} +export interface Info { + EntryPoint: string; + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: MemberCategory; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + IsStreamerModeAvailable: boolean; + Bans: IBan[]; + BannedState: boolean; + BannedUntil: number; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface IBan { + type: BanType; + dateTime: number; +} +export declare enum BanType { + Chat = 0, + RagFair = 1, + Voip = 2, + Trading = 3, + Online = 4, + Friends = 5, + ChangeNickname = 6 +} +export interface Notes { + Notes: Note[]; +} +export interface Note { + Time: number; + Text: string; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { + Hydration: CurrentMax; + Energy: CurrentMax; + Temperature: CurrentMax; + BodyParts: BodyPartsHealth; + UpdateTime: number; +} +export interface BodyPartsHealth { + Head: BodyPartHealth; + Chest: BodyPartHealth; + Stomach: BodyPartHealth; + LeftArm: BodyPartHealth; + RightArm: BodyPartHealth; + LeftLeg: BodyPartHealth; + RightLeg: BodyPartHealth; +} +export interface BodyPartHealth { + Health: CurrentMax; + Effects?: Record; +} +export interface CurrentMax { + Current: number; + Maximum: number; +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: Common[]; + Mastering: Mastering[]; + Bonuses?: any[]; + Points: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession: number; + LastAccess: number; +} +export interface Mastering { + Id: string; + Progress: number; +} +export interface Stats { + CarriedQuestItems: string[]; + Victims: Victim[]; + TotalSessionExperience: number; + LastSessionDate: number; + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; + SessionExperienceMult?: number; + ExperienceBonusMult?: number; + Aggressor?: Aggressor; + DroppedItems?: IDroppedItem[]; + FoundInRaidItems?: FoundInRaidItem[]; + DamageHistory?: DamageHistory; + DeathCause?: DeathCause; + LastPlayerState?: LastPlayerState; + TotalInGameTime: number; + SurvivorClass?: string; +} +export interface IDroppedItem { + QuestId: string; + ItemId: string; + ZoneId: string; +} +export interface FoundInRaidItem { + QuestId: string; + ItemId: string; +} +export interface Victim { + AccountId: string; + ProfileId: string; + Name: string; + Side: string; + BodyPart: string; + Time: string; + Distance: number; + Level: number; + Weapon: string; + Role: string; +} +export interface SessionCounters { + Items: CounterKeyValue[]; +} +export interface OverallCounters { + Items: CounterKeyValue[]; +} +export interface CounterKeyValue { + Key: string[]; + Value: number; +} +export interface Aggressor { + AccountId: string; + ProfileId: string; + MainProfileNickname: string; + Name: string; + Side: string; + BodyPart: string; + HeadSegment: string; + WeaponName: string; + Category: string; +} +export interface DamageHistory { + LethalDamagePart: string; + LethalDamage: LethalDamage; + BodyParts: BodyPartsDamageHistory; +} +export interface LethalDamage { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface BodyPartsDamageHistory { + Head: DamageStats[]; + Chest: DamageStats[]; + Stomach: DamageStats[]; + LeftArm: DamageStats[]; + RightArm: DamageStats[]; + LeftLeg: DamageStats[]; + RightLeg: DamageStats[]; + Common: DamageStats[]; +} +export interface DamageStats { + Amount: number; + Type: string; + SourceId: string; + OverDamageFrom: string; + Blunt: boolean; + ImpactsCount: number; +} +export interface DeathCause { + DamageType: string; + Side: string; + Role: string; + WeaponId: string; +} +export interface LastPlayerState { + Info: LastPlayerStateInfo; + Customization: Record; + Equipment: any; +} +export interface LastPlayerStateInfo { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; +} +export interface ConditionCounters { + Counters: Counter[]; +} +export interface Counter { + id: string; + value: number; + qid: string; +} +export interface BackendCounter { + id: string; + qid?: string; + value: number; +} +export interface InsuredItem { + tid: string; + itemId: string; +} +export interface Hideout { + Production: Record; + Areas: HideoutArea[]; +} +export interface Productive { + Products: Product[]; + Progress?: number; + inProgress?: boolean; + StartTimestamp?: number; +} +export interface Product { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface ScavCase extends Productive { +} +export interface Production extends Productive { + RecipeId: string; + SkipTime: number; + ProductionTime: number; +} +export interface HideoutArea { + type: HideoutAreas; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: HideoutSlot[]; + lastRecipe: string; +} +export interface HideoutSlot { + item: HideoutItem[]; +} +export interface HideoutItem { + _id: string; + _tpl: string; + upd?: Upd; +} +export interface Bonus { + type: string; + templateId?: string; + passive?: boolean; + production?: boolean; + visible?: boolean; + value?: number; + icon?: string; +} +export interface Quest { + qid: string; + startTime: number; + status: string; + statusTimers?: StatusTimer; + completedConditions?: string[]; +} +export interface StatusTimer { + AvailableForStart?: number; +} +export interface TraderInfo { + loyaltyLevel: number; + salesSum: number; + standing: number; + nextResupply: number; + unlocked: boolean; +} +export interface RagfairInfo { + rating: number; + isRatingGrowing: boolean; + offers: IRagfairOffer[]; +} +export interface CarExtractCounts { +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/MemberCategory.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts new file mode 100644 index 0000000..7303275 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/request/IBaseInteractionRequestData.d.ts @@ -0,0 +1,9 @@ +export interface IBaseInteractionRequestData { + Action: string; + fromOwner?: OwnerInfo; + toOwner?: OwnerInfo; +} +export interface OwnerInfo { + id: string; + type: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotBase.d.ts new file mode 100644 index 0000000..677fd49 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotBase.d.ts @@ -0,0 +1,101 @@ +import { BackendCounter, Bonus } from "../IPmcData"; +import { Item } from "./IItem"; +export interface IBotBase { + _id: string; + aid: string; + savage: any; + Info: Info; + Customization: Customization; + Health: Health; + Inventory: Inventory; + Skills: Skills; + Stats: Stats; + Encyclopedia: any; + ConditionCounters: ConditionCounters; + BackendCounters: Record; + InsuredItems: any[]; + Hideout: Hideout; + Bonuses: Bonus[]; +} +export interface Info { + Nickname: string; + LowerNickname: string; + Side: string; + Voice: string; + Level: number; + Experience: number; + RegistrationDate: number; + GameVersion: string; + AccountType: number; + MemberCategory: number; + lockedMoveCommands: boolean; + SavageLockTime: number; + LastTimePlayedAsSavage: number; + Settings: Settings; + NicknameChangeDate: number; + NeedWipeOptions: any[]; + lastCompletedWipe: any; + BannedState: boolean; + BannedUntil: number; + IsStreamerModeAvailable: boolean; +} +export interface Settings { + Role: string; + BotDifficulty: string; + Experience: number; + StandingForKill: number; + AggressorBonus: number; +} +export interface Customization { + Head: string; + Body: string; + Feet: string; + Hands: string; +} +export interface Health { +} +export interface Inventory { + items: Item[]; + equipment: string; + stash: string; + sortingTable: string; + questRaidItems: string; + questStashItems: string; + fastPanel: FastPanel; +} +export interface FastPanel { +} +export interface Skills { + Common: any[]; + Mastering: any[]; + Points: number; +} +export interface Stats { + SessionCounters: SessionCounters; + OverallCounters: OverallCounters; +} +export interface SessionCounters { + Items: any[]; +} +export interface OverallCounters { + Items: any[]; +} +export interface ConditionCounters { + Counters: any[]; +} +export interface Hideout { + Production: Production; + Areas: Area[]; +} +export interface Production { +} +export interface Area { + type: number; + level: number; + active: boolean; + passiveBonusesEnabled: boolean; + completeTime: number; + constructing: boolean; + slots: any[]; + lastRecipe: any; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotCore.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotCore.d.ts new file mode 100644 index 0000000..16a782d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotCore.d.ts @@ -0,0 +1,133 @@ +export interface IBotCore { + SAVAGE_KILL_DIST: number; + SOUND_DOOR_BREACH_METERS: number; + SOUND_DOOR_OPEN_METERS: number; + STEP_NOISE_DELTA: number; + JUMP_NOISE_DELTA: number; + GUNSHOT_SPREAD: number; + GUNSHOT_SPREAD_SILENCE: number; + BASE_WALK_SPEREAD2: number; + MOVE_SPEED_COEF_MAX: number; + SPEED_SERV_SOUND_COEF_A: number; + SPEED_SERV_SOUND_COEF_B: number; + G: number; + STAY_COEF: number; + SIT_COEF: number; + LAY_COEF: number; + MAX_ITERATIONS: number; + START_DIST_TO_COV: number; + MAX_DIST_TO_COV: number; + STAY_HEIGHT: number; + CLOSE_POINTS: number; + COUNT_TURNS: number; + SIMPLE_POINT_LIFE_TIME_SEC: number; + DANGER_POINT_LIFE_TIME_SEC: number; + DANGER_POWER: number; + COVER_DIST_CLOSE: number; + GOOD_DIST_TO_POINT: number; + COVER_TOOFAR_FROM_BOSS: number; + COVER_TOOFAR_FROM_BOSS_SQRT: number; + MAX_Y_DIFF_TO_PROTECT: number; + FLARE_POWER: number; + MOVE_COEF: number; + PRONE_POSE: number; + LOWER_POSE: number; + MAX_POSE: number; + FLARE_TIME: number; + MAX_REQUESTS__PER_GROUP: number; + UPDATE_GOAL_TIMER_SEC: number; + DIST_NOT_TO_GROUP: number; + DIST_NOT_TO_GROUP_SQR: number; + LAST_SEEN_POS_LIFETIME: number; + DELTA_GRENADE_START_TIME: number; + DELTA_GRENADE_END_TIME: number; + DELTA_GRENADE_RUN_DIST: number; + DELTA_GRENADE_RUN_DIST_SQRT: number; + PATROL_MIN_LIGHT_DIST: number; + HOLD_MIN_LIGHT_DIST: number; + STANDART_BOT_PAUSE_DOOR: number; + ARMOR_CLASS_COEF: number; + SHOTGUN_POWER: number; + RIFLE_POWER: number; + PISTOL_POWER: number; + SMG_POWER: number; + SNIPE_POWER: number; + GESTUS_PERIOD_SEC: number; + GESTUS_AIMING_DELAY: number; + GESTUS_REQUEST_LIFETIME: number; + GESTUS_FIRST_STAGE_MAX_TIME: number; + GESTUS_SECOND_STAGE_MAX_TIME: number; + GESTUS_MAX_ANSWERS: number; + GESTUS_FUCK_TO_SHOOT: number; + GESTUS_DIST_ANSWERS: number; + GESTUS_DIST_ANSWERS_SQRT: number; + GESTUS_ANYWAY_CHANCE: number; + TALK_DELAY: number; + CAN_SHOOT_TO_HEAD: boolean; + CAN_TILT: boolean; + TILT_CHANCE: number; + MIN_BLOCK_DIST: number; + MIN_BLOCK_TIME: number; + COVER_SECONDS_AFTER_LOSE_VISION: number; + MIN_ARG_COEF: number; + MAX_ARG_COEF: number; + DEAD_AGR_DIST: number; + MAX_DANGER_CARE_DIST_SQRT: number; + MAX_DANGER_CARE_DIST: number; + MIN_MAX_PERSON_SEARCH: number; + PERCENT_PERSON_SEARCH: number; + LOOK_ANYSIDE_BY_WALL_SEC_OF_ENEMY: number; + CLOSE_TO_WALL_ROTATE_BY_WALL_SQRT: number; + SHOOT_TO_CHANGE_RND_PART_MIN: number; + SHOOT_TO_CHANGE_RND_PART_MAX: number; + SHOOT_TO_CHANGE_RND_PART_DELTA: number; + FORMUL_COEF_DELTA_DIST: number; + FORMUL_COEF_DELTA_SHOOT: number; + FORMUL_COEF_DELTA_FRIEND_COVER: number; + SUSPETION_POINT_DIST_CHECK: number; + MAX_BASE_REQUESTS_PER_PLAYER: number; + MAX_HOLD_REQUESTS_PER_PLAYER: number; + MAX_GO_TO_REQUESTS_PER_PLAYER: number; + MAX_COME_WITH_ME_REQUESTS_PER_PLAYER: number; + CORE_POINT_MAX_VALUE: number; + CORE_POINTS_MAX: number; + CORE_POINTS_MIN: number; + BORN_POISTS_FREE_ONLY_FAREST_BOT: boolean; + BORN_POINSTS_FREE_ONLY_FAREST_PLAYER: boolean; + SCAV_GROUPS_TOGETHER: boolean; + LAY_DOWN_ANG_SHOOT: number; + HOLD_REQUEST_TIME_SEC: number; + TRIGGERS_DOWN_TO_RUN_WHEN_MOVE: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING: number; + MIN_DIST_TO_RUN_WHILE_ATTACK_MOVING_OTHER_ENEMIS: number; + MIN_DIST_TO_STOP_RUN: number; + JUMP_SPREAD_DIST: number; + LOOK_TIMES_TO_KILL: number; + COME_INSIDE_TIMES: number; + TOTAL_TIME_KILL: number; + TOTAL_TIME_KILL_AFTER_WARN: number; + MOVING_AIM_COEF: number; + VERTICAL_DIST_TO_IGNORE_SOUND: number; + DEFENCE_LEVEL_SHIFT: number; + MIN_DIST_CLOSE_DEF: number; + USE_ID_PRIOR_WHO_GO: boolean; + SMOKE_GRENADE_RADIUS_COEF: number; + GRENADE_PRECISION: number; + MAX_WARNS_BEFORE_KILL: number; + CARE_ENEMY_ONLY_TIME: number; + MIDDLE_POINT_COEF: number; + MAIN_TACTIC_ONLY_ATTACK: boolean; + LAST_DAMAGE_ACTIVE: number; + SHALL_DIE_IF_NOT_INITED: boolean; + CHECK_BOT_INIT_TIME_SEC: number; + WEAPON_ROOT_Y_OFFSET: number; + DELTA_SUPRESS_DISTANCE_SQRT: number; + DELTA_SUPRESS_DISTANCE: number; + WAVE_COEF_LOW: number; + WAVE_COEF_MID: number; + WAVE_COEF_HIGH: number; + WAVE_COEF_HORDE: number; + WAVE_ONLY_AS_ONLINE: boolean; + LOCAL_BOTS_COUNT: number; + AXE_MAN_KILLS_END: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotType.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotType.d.ts new file mode 100644 index 0000000..01be0be --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IBotType.d.ts @@ -0,0 +1,176 @@ +export interface IBotType { + appearance: Appearance; + chances: Chances; + difficulty: Difficulties; + experience: Experience; + firstName: string[]; + generation: Generation; + health: Health; + inventory: Inventory; + lastName: string[]; + skills: Skills; +} +export interface Appearance { + body: string[]; + feet: string[]; + hands: string[]; + head: string[]; + voice: string[]; +} +export interface Chances { + equipment: EquipmentChances; + mods: ModsChances; +} +export interface EquipmentChances { + ArmBand: number; + ArmorVest: number; + Backpack: number; + Earpiece: number; + Eyewear: number; + FaceCover: number; + FirstPrimaryWeapon: number; + Headwear: number; + Holster: number; + Pockets: number; + Scabbard: number; + SecondPrimaryWeapon: number; + SecuredContainer: number; + TacticalVest: number; +} +export interface ModsChances { + mod_charge: number; + mod_equipment: number; + mod_equipment_000: number; + mod_equipment_001: number; + mod_equipment_002: number; + mod_flashlight: number; + mod_foregrip: number; + mod_launcher: number; + mod_magazine: number; + mod_mount: number; + mod_mount_000: number; + mod_mount_001: number; + mod_muzzle: number; + mod_nvg: number; + mod_pistol_grip: number; + mod_reciever: number; + mod_scope: number; + mod_sight_front: number; + mod_sight_rear: number; + mod_stock: number; + mod_stock_000: number; + mod_stock_akms: number; + mod_tactical: number; + mod_tactical_000: number; + mod_tactical_001: number; + mod_tactical_002: number; + mod_tactical_003: number; +} +export interface Difficulties { + easy: Difficulty; + normal: Difficulty; + hard: Difficulty; + impossible: Difficulty; +} +export interface Difficulty { + Aiming: Record; + Boss: Record; + Change: Record; + Core: Record; + Cover: Record; + Grenade: Record; + Hearing: Record; + Lay: Record; + Look: Record; + Mind: Record; + Move: Record; + Patrol: Record; + Scattering: Record; + Shoot: Record; +} +export interface Experience { + aggressorBonus: number; + level: MinMax; + reward: MinMax; + standingForKill: number; +} +export interface Generation { + items: ItemMinMax; +} +export interface ItemMinMax { + grenades: MinMax; + healing: MinMax; + drugs: MinMax; + stims: MinMax; + looseLoot: MinMax; + magazines: MinMax; + specialItems: MinMax; +} +export interface Health { + BodyParts: BodyPart[]; + Energy: MinMax; + Hydration: MinMax; + Temperature: MinMax; +} +export interface BodyPart { + Chest: MinMax; + Head: MinMax; + LeftArm: MinMax; + LeftLeg: MinMax; + RightArm: MinMax; + RightLeg: MinMax; + Stomach: MinMax; +} +export interface MinMax { + max: number; + min: number; +} +export interface Inventory { + equipment: Equipment; + items: Items; + mods: Mods; +} +export interface Equipment { + ArmBand: Record; + ArmorVest: Record; + Backpack: Record; + Earpiece: Record; + Eyewear: Record; + FaceCover: Record; + FirstPrimaryWeapon: Record; + Headwear: Record; + Holster: Record; + Pockets: Record; + Scabbard: Record; + SecondPrimaryWeapon: Record; + SecuredContainer: Record; + TacticalVest: Record; +} +export interface Items { + Backpack: string[]; + Pockets: string[]; + SecuredContainer: string[]; + SpecialLoot: string[]; + TacticalVest: string[]; +} +export declare type Mods = Record>; +export interface Skills { + Common: Common[]; + Bonuses?: any; + Mastering: Mastering[]; + Points: number; +} +export interface Mastering { + Id: string; + Progress: number; + max?: number; + min?: number; +} +export interface Common { + Id: string; + Progress: number; + PointsEarnedDuringSession?: number; + LastAccess?: number; + max?: number; + min?: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ICustomizationItem.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ICustomizationItem.d.ts new file mode 100644 index 0000000..8bfeece --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ICustomizationItem.d.ts @@ -0,0 +1,33 @@ +export interface ICustomizationItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Side: string[]; + BodyPart: string; + AvailableAsDefault?: boolean; + Body: string; + Hands: string; + Feet: string; + Prefab: Prefab; + WatchPrefab: Prefab; + IntegratedArmorVest: boolean; + WatchPosition: Xyz; + WatchRotation: Xyz; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Xyz { + x: number; + y: number; + z: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IHandbookBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IHandbookBase.d.ts new file mode 100644 index 0000000..7d7db07 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IHandbookBase.d.ts @@ -0,0 +1,16 @@ +export interface IHandbookBase { + Categories: Category[]; + Items: HandbookItem[]; +} +export interface Category { + Id: string; + ParentId?: string; + Icon: string; + Color: string; + Order: string; +} +export interface HandbookItem { + Id: string; + ParentId: string; + Price: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IItem.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IItem.d.ts new file mode 100644 index 0000000..2dd2c03 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IItem.d.ts @@ -0,0 +1,108 @@ +export interface Item { + _id: string; + _tpl: string; + parentId?: string; + slotId?: string; + location?: Location | number; + upd?: Upd; +} +export interface Upd { + OriginalStackObjectsCount?: number; + Togglable?: Togglable; + Map?: Map; + Tag?: Tag; + sptPresetId?: string; + FaceShield?: FaceShield; + StackObjectsCount?: number; + UnlimitedCount?: boolean; + Repairable?: Repairable; + FireMode?: FireMode; + SpawnedInSession?: boolean; + Light?: Light; + Key?: Key; + Resource?: Resource; + Sight?: Sight; + MedKit?: MedKit; + FoodDrink?: FoodDrink; + Dogtag?: Dogtag; + BuyRestrictionMax?: number; + BuyRestrictionCurrent?: number; + Foldable?: Foldable; + SideEffect?: SideEffect; + RepairKit?: RepairKit; +} +export interface Togglable { + On: boolean; +} +export interface Map { + Markers: MapMarker[]; +} +export interface MapMarker { + X: number; + Y: number; +} +export interface Tag { + Color: number; + Name: string; +} +export interface FaceShield { + Hits: number; +} +export interface Repairable { + Durability: number; + MaxDurability: number; +} +export interface MedKit { + HpResource: number; +} +export interface Sight { + ScopesCurrentCalibPointIndexes: number[]; + ScopesSelectedModes: number[]; + SelectedScope: number; +} +export interface Foldable { + Folded: boolean; +} +export interface FireMode { + FireMode: string; +} +export interface FoodDrink { + HpPercent: number; +} +export interface Key { + NumberOfUsages: number; +} +export interface Resource { + Value: number; + UnitsConsumed: number; +} +export interface Light { + IsActive: boolean; + SelectedMode: number; +} +export interface Dogtag { + AccountId: string; + ProfileId: string; + Nickname: string; + Side: string; + Level: number; + Time: string; + Status: string; + KillerAccountId: string; + KillerProfileId: string; + KillerName: string; + WeaponName: string; +} +export interface Location { + x: number; + y: number; + r: string | number; + isSearched?: boolean; + rotation?: string; +} +export interface SideEffect { + Value: number; +} +export interface RepairKit { + Resource: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ILocationsBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ILocationsBase.d.ts new file mode 100644 index 0000000..2c96af3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ILocationsBase.d.ts @@ -0,0 +1,10 @@ +export interface ILocationsBase { + locations: Locations; + paths: Path[]; +} +export interface Locations { +} +export interface Path { + Source: string; + Destination: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ILootBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ILootBase.d.ts new file mode 100644 index 0000000..e4baac5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ILootBase.d.ts @@ -0,0 +1,64 @@ +import { Item } from "./IItem"; +export interface ILootBase { + staticAmmo: Record; + staticContainers: Record; + staticLoot: Record; +} +export interface IStaticAmmoDetails { + tpl: string; + relativeProbability: number; +} +export interface IStaticContainerDetails { + staticWeapons: IStaticWeaponProps[]; + staticContainers: IStaticContainerProps[]; + staticForced: IStaticForcedProps[]; +} +export interface IStaticWeaponProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: string; + Items: Item[]; +} +export interface IStaticContainerProps { + Id: string; + IsStatic: boolean; + useGravity: boolean; + randomRotation: boolean; + Position: Xyz; + Rotation: Xyz; + IsGroupPosition: boolean; + GroupPositions: any[]; + Root: any; + Items: StaticItem[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StaticItem { + _id: any; + _tpl: string; +} +export interface IStaticForcedProps { + containerId: string; + itemTpl: string; +} +export interface IStaticLootDetails { + itemcountDistribution: ItemCountDistribution[]; + itemDistribution: ItemDistribution[]; +} +export interface ItemCountDistribution { + count: number; + relativeProbability: number; +} +export interface ItemDistribution { + tpl: string; + relativeProbability: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IQuest.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IQuest.d.ts new file mode 100644 index 0000000..e1fc888 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IQuest.d.ts @@ -0,0 +1,110 @@ +import { Item } from "./IItem"; +export interface IQuest { + QuestName: string; + _id: string; + canShowNotificationsInGame: boolean; + conditions: Conditions; + description: string; + failMessageText: string; + name: string; + note: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + startedMessageText: string; + successMessageText: string; + templateId: string; + rewards: Rewards; + status: string; + KeyQuest: boolean; + changeQuestMessageText: string; +} +export interface Conditions { + Started: AvailableForConditions[]; + AvailableForFinish: AvailableForConditions[]; + AvailableForStart: AvailableForConditions[]; + Success: AvailableForConditions[]; + Fail: AvailableForConditions[]; +} +export interface AvailableForConditions { + _parent: string; + _props: AvailableForProps; + dynamicLocale: boolean; +} +export interface AvailableForProps { + id: string; + index: number; + parentId: string; + dynamicLocale: boolean; + value?: number; + compareMethod?: string; + visibilityConditions?: VisibilityCondition[]; + target?: string | string[]; + status?: number[]; + onlyFoundInRaid?: boolean; + oneSessionOnly?: boolean; + doNotResetIfCounterCompleted?: boolean; + dogtagLevel?: number; + maxDurability?: number; + minDurability?: number; + counter?: AvailableForCounter; + plantTime?: number; + zoneId?: string; + type?: boolean; +} +export interface AvailableForCounter { + id: string; + conditions: CounterCondition[]; +} +export interface CounterCondition { + _parent: string; + _props: CounterProps; +} +export interface CounterProps { + id: string; + target: string[] | string; + compareMethod?: string; + value?: string; + weapon?: string[]; + equipmentInclusive?: string[][]; + weaponModsInclusive?: string[][]; + status?: string[]; + bodyPart?: string[]; + daytime?: DaytimeCounter; +} +export interface DaytimeCounter { + from: number; + to: number; +} +export interface VisibilityCondition { + id: string; + value: number; + dynamicLocale: boolean; + oneSessionOnly: boolean; +} +export interface Rewards { + AvailableForStart: Reward[]; + AvailableForFinish: Reward[]; + Started: Reward[]; + Success: Reward[]; + Fail: Reward[]; + FailRestartable: Reward[]; + Expired: Reward[]; +} +export interface Reward { + value?: string; + id: string; + type: string; + index: number; + target?: string; + items?: Item[]; + loyaltyLevel?: number; + traderId?: string; + unknown?: boolean; + findInRaid?: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IRepeatableQuests.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IRepeatableQuests.d.ts new file mode 100644 index 0000000..e23ec73 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/IRepeatableQuests.d.ts @@ -0,0 +1,219 @@ +import { Item } from "./IItem"; +export interface IReward { + index: number; + type: string; + value: number; + target?: string; + items?: Item[]; +} +export interface IRepeatableQuestDatabase { + templates: ITemplates; + rewards: IRewardOptions; + data: IOptions; + samples: ISampleQuests[]; +} +export interface ITemplates { + Elimination: IRepeatableQuest; + Completion: IRepeatableQuest; + Exploration: IRepeatableQuest; +} +export interface IPmcDataRepeatableQuest { + id?: string; + name: string; + activeQuests: IRepeatableQuest[]; + inactiveQuests: IRepeatableQuest[]; + endTime: number; + changeRequirement: TChangeRequirementRecord; +} +export declare type TChangeRequirementRecord = Record; +export interface IChangeRequirement { + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IChangeCost { + templateId: string; + count: number; +} +export interface IRepeatableQuest { + _id: any; + traderId: string; + location: any; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + changeQuestMessageText: string; + templateId: string; + changeCost: IChangeCost[]; + changeStandingCost: number; +} +export interface IRewards { + Started: IReward[]; + Success: IReward[]; + Fail: IReward[]; +} +export interface IConditions { + AvailableForStart: any[]; + AvailableForFinish: IAvailableFor[]; + Fail: any[]; +} +export interface IAvailableFor { + _props: IAvailableForProps; + _parent: string; + dynamicLocale: boolean; +} +export interface IAvailableForProps { + id: string; + parentId: string; + dynamicLocale: boolean; + index: number; + visibilityConditions: IVisibilityCondition[]; + value: number; +} +export interface IVisibilityCondition { + id: string; + oneSessionOnly: boolean; + value: number; + index: number; + dynamicLocale: boolean; +} +export interface IAvailableForPropsCounter extends IAvailableForProps { + type: string; + oneSessionOnly: boolean; + doNotResetIfCounterCompleted: boolean; + counter: ICounter; +} +export interface ICounter { + id: string; + conditions: ICondition[]; +} +export interface ICondition { + _props: IConditionProps; + _parent: string; +} +export interface IConditionProps { + id: string; + dynamicLocale: boolean; +} +export interface IElimination extends IRepeatableQuest { + conditions: IEliminationConditions; +} +export interface IEliminationConditions extends IConditions { + AvailableForFinish: IEliminationAvailableFor[]; +} +export interface IEliminationAvailableFor extends IAvailableFor { + _props: IEliminationAvailableForProps; +} +export interface IEliminationAvailableForProps extends IAvailableForPropsCounter { + counter: IEliminationCounter; +} +export interface IEliminationCounter extends ICounter { + conditions: IEliminationCondition[]; +} +export interface IEliminationCondition extends ICondition { + _props: ILocationConditionProps | IKillConditionProps; +} +export interface IExploration extends IRepeatableQuest { + conditions: IExplorationConditions; +} +export interface IExplorationConditions extends IConditions { + AvailableForFinish: IExplorationAvailableFor[]; +} +export interface IExplorationAvailableFor extends IAvailableFor { + _props: IExplorationAvailableForProps; +} +export interface IExplorationAvailableForProps extends IAvailableForPropsCounter { + counter: IExplorationCounter; +} +export interface IExplorationCounter extends ICounter { + conditions: IExplorationCondition[]; +} +export interface IExplorationCondition extends ICondition { + _props: ILocationConditionProps | IExitStatusConditionProps | IExitNameConditionProps; +} +export interface ICompletion extends IRepeatableQuest { + conditions: ICompletionConditions; +} +export interface ICompletionConditions extends IConditions { + AvailableForFinish: ICompletionAvailableFor[]; +} +export interface ICompletionAvailableFor extends IAvailableFor { + _props: ICompletionAvailableForProps; +} +export interface ICompletionAvailableForProps extends IAvailableForProps { + target: string[]; + minDurability: number; + maxDurability: number; + dogtagLevel: number; + onlyFoundInRaid: boolean; +} +export interface ILocationConditionProps extends IConditionProps { + target: string[]; +} +export interface IKillConditionProps extends IConditionProps { + target: string; + value: number; + savageRole?: string[]; + bodyPart?: string[]; + distance?: IDistanceCheck; +} +export interface IDistanceCheck { + compareMethod: string; + value: number; +} +export interface IExitStatusConditionProps extends IConditionProps { + status: string[]; +} +export interface IExitNameConditionProps extends IConditionProps { + exitName: string; +} +export interface IRewardOptions { + itemsBlacklist: string[]; +} +export interface IOptions { + Completion: ICompletionFilter; +} +export interface ICompletionFilter { + itemsBlacklist: ItemsBlacklist[]; + itemsWhitelist: ItemsWhitelist[]; +} +export interface ItemsBlacklist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ItemsWhitelist { + minPlayerLevel: number; + itemIds: string[]; +} +export interface ISampleQuests { + _id: string; + traderId: string; + location: string; + image: string; + type: string; + isKey: boolean; + restartable: boolean; + instantComplete: boolean; + secretQuest: boolean; + canShowNotificationsInGame: boolean; + rewards: IRewards; + conditions: IConditions; + name: string; + note: string; + description: string; + successMessageText: string; + failMessageText: string; + startedMessageText: string; + templateId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ITemplateItem.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ITemplateItem.d.ts new file mode 100644 index 0000000..c2ba762 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ITemplateItem.d.ts @@ -0,0 +1,401 @@ +export interface ITemplateItem { + _id: string; + _name: string; + _parent: string; + _type: string; + _props: Props; + _proto: string; +} +export interface Props { + Name: string; + ShortName: string; + Description: string; + Weight: number; + BackgroundColor: string; + Width: number; + Height: number; + StackMaxSize: number; + Rarity?: string; + SpawnChance?: number; + CreditsPrice?: number; + ItemSound: string; + Prefab: Prefab; + UsePrefab: Prefab; + StackObjectsCount: number; + NotShownInSlot: boolean; + ExaminedByDefault: boolean; + ExamineTime: number; + IsUndiscardable: boolean; + IsUnsaleable: boolean; + IsUnbuyable: boolean; + IsUngivable: boolean; + IsLockedafterEquip: boolean; + QuestItem: boolean; + LootExperience: number; + ExamineExperience: number; + HideEntrails: boolean; + RepairCost: number; + RepairSpeed: number; + ExtraSizeLeft: number; + ExtraSizeRight: number; + ExtraSizeUp: number; + ExtraSizeDown: number; + ExtraSizeForceAdd: boolean; + MergesWithChildren: boolean; + CanSellOnRagfair: boolean; + CanRequireOnRagfair: boolean; + ConflictingItems: string[]; + DiscardLimit: number; + Unlootable: boolean; + UnlootableFromSlot: string; + UnlootableFromSide: string[]; + AnimationVariantsNumber: number; + DiscardingBlock: boolean; + RagFairCommissionModifier: number; + IsAlwaysAvailableForInsurance: boolean; + Grids: Grid[]; + Slots: Slot[]; + CanPutIntoDuringTheRaid: boolean; + CantRemoveFromSlotsDuringRaid: string[]; + weapClass: string; + weapUseType: string; + ammoCaliber: string; + Durability: number; + MaxDurability: number; + OperatingResource: number; + RepairComplexity: number; + durabSpawnMin: number; + durabSpawnMax: number; + isFastReload: boolean; + RecoilForceUp: number; + RecoilForceBack: number; + Convergence: number; + RecoilAngle: number; + weapFireType: string[]; + RecolDispersion: number; + SingleFireRate: number; + CanQueueSecondShot: boolean; + bFirerate: number; + Ergonomics: number; + Velocity: number; + bEffDist: number; + bHearDist: number; + isChamberLoad: boolean; + chamberAmmoCount: number; + isBoltCatch: boolean; + defMagType: string; + defAmmo: string; + AdjustCollimatorsToTrajectory: boolean; + shotgunDispersion: number; + Chambers: Chamber[]; + CameraRecoil: number; + CameraSnap: number; + ReloadMode: string; + CenterOfImpact: number; + AimPlane: number; + DeviationCurve: number; + DeviationMax: number; + Foldable: boolean; + Retractable: boolean; + TacticalReloadStiffnes: Xyz; + TacticalReloadFixation: number; + RecoilCenter: Xyz; + RotationCenter: Xyz; + RotationCenterNoStock: Xyz; + SizeReduceRight: number; + FoldedSlot: string; + CompactHandling: boolean; + SightingRange: number; + MinRepairDegradation: number; + MaxRepairDegradation: number; + MinRepairKitDegradation: number; + MaxRepairKitDegradation: number; + IronSightRange: number; + MustBoltBeOpennedForExternalReload: boolean; + MustBoltBeOpennedForInternalReload: boolean; + BoltAction: boolean; + HipAccuracyRestorationDelay: number; + HipAccuracyRestorationSpeed: number; + HipInnaccuracyGain: number; + ManualBoltCatch: boolean; + BurstShotsCount: number; + BaseMalfunctionChance: number; + AllowJam: boolean; + AllowFeed: boolean; + AllowMisfire: boolean; + AllowSlide: boolean; + DurabilityBurnRatio: number; + HeatFactorGun: number; + CoolFactorGun: number; + CoolFactorGunMods: number; + HeatFactorByShot: number; + AllowOverheat: boolean; + DoubleActionAccuracyPenalty: number; + RecoilPosZMult: number; + ShotgunDispersion: number; + StackMinRandom: number; + StackMaxRandom: number; + StackSlots: StackSlot[]; + SearchSound: string; + BlocksArmorVest: boolean; + RigLayoutName: string; + armorZone: string[]; + armorClass: number; + speedPenaltyPercent: number; + mousePenalty: number; + weaponErgonomicPenalty: number; + BluntThroughput: number; + ArmorMaterial: string; + medUseTime: number; + medEffectType: string; + MaxHpResource: number; + hpResourceRate: number; + StimulatorBuffs: string; + effects_health: EffectsHealth; + effects_damage: EffectsDamage; + knifeHitDelay: number; + knifeHitSlashRate: number; + knifeHitStabRate: number; + knifeHitRadius: number; + knifeHitSlashDam: number; + knifeHitStabDam: number; + knifeDurab: number; + PrimaryDistance: number; + SecondryDistance: number; + SlashPenetration: number; + StabPenetration: number; + PrimaryConsumption: number; + SecondryConsumption: number; + DeflectionConsumption: number; + MaxResource: number; + AppliedTrunkRotation: Xyz; + AppliedHeadRotation: Xyz; + DisplayOnModel: boolean; + AdditionalAnimationLayer: number; + StaminaBurnRate: number; + ColliderScaleMultiplier: Xyz; + ammoType: string; + InitialSpeed: number; + BallisticCoeficient: number; + BulletMassGram: number; + BulletDiameterMilimeters: number; + Damage: number; + ammoAccr: number; + ammoRec: number; + ammoDist: number; + buckshotBullets: number; + PenetrationPower: number; + PenetrationPowerDiviation: number; + ammoHear: number; + ammoSfx: string; + MisfireChance: number; + MinFragmentsCount: number; + MaxFragmentsCount: number; + ammoShiftChance: number; + casingName: string; + casingEjectPower: number; + casingMass: number; + casingSounds: string; + ProjectileCount: number; + PenetrationChance: number; + RicochetChance: number; + FragmentationChance: number; + Deterioration: number; + SpeedRetardation: number; + Tracer: boolean; + TracerColor: string; + TracerDistance: number; + ArmorDamage: number; + Caliber: string; + StaminaBurnPerDamage: number; + HeavyBleedingDelta: number; + LightBleedingDelta: number; + ShowBullet: boolean; + HasGrenaderComponent: boolean; + FuzeArmTimeSec: number; + ExplosionStrength: number; + MinExplosionDistance: number; + MaxExplosionDistance: number; + FragmentsCount: number; + FragmentType: string; + ShowHitEffectOnExplode: boolean; + ExplosionType: string; + AmmoLifeTimeSec: number; + Contusion: Contusion; + ArmorDistanceDistanceDamage: Xyz; + Blindness: Xyz; + IsLightAndSoundShot: boolean; + LightAndSoundShotAngle: number; + LightAndSoundShotSelfContusionTime: number; + LightAndSoundShotSelfContusionStrength: number; + MalfMisfireChance: number; + DurabilityBurnModificator: number; + HeatFactor: number; + MalfFeedChance: number; + Accuracy: number; + Recoil: number; + Loudness: number; + EffectiveDistance: number; + RaidModdable: boolean; + ToolModdable: boolean; + BlocksFolding: boolean; + BlocksCollapsible: boolean; + IsAnimated: boolean; + HasShoulderContact: boolean; + DoubleActionAccuracyPenaltyMult: number; + magAnimationIndex: number; + Cartridges: Cartridge[]; + CanFast: boolean; + CanHit: boolean; + CanAdmin: boolean; + LoadUnloadModifier: number; + CheckTimeModifier: number; + CheckOverride: number; + ReloadMagType: string; + VisibleAmmoRangesString: string; + MalfunctionChance: number; + TagColor: number; + TagName: string; + MaximumNumberOfUsage: number; + CustomAimPlane: string; + sightModType: string; + aimingSensitivity: number; + SightModesCount: number; + OpticCalibrationDistances: number[]; + ScopesCount: number; + AimSensitivity: number[][]; + ModesCount: number[]; + Zooms: number[][]; + CalibrationDistances: number[][]; + Intensity: number; + Mask: string; + MaskSize: number; + NoiseIntensity: number; + NoiseScale: number; + Color: Color; + DiffuseIntensity: number; + HasHinge: boolean; + Resource?: number; + CoolFactor?: number; + foodUseTime?: number; + foodEffectType?: string; + MaxRepairResource: number; + RepairQuality: number; + RepairType: string; + TargetItemFilter: string[]; + apResource: number; + krResource: number; +} +export interface Prefab { + path: string; + rcid: string; +} +export interface Grid { + _name: string; + _id: string; + _parent: string; + _props: GridProps; + _proto: string; +} +export interface GridProps { + filters: GridFilter[]; + cellsH: number; + cellsV: number; + minCount: number; + maxCount: number; + maxWeight: number; + isSortingTable: boolean; +} +export interface GridFilter { + Filter: string[]; + ExcludedFilter: string[]; +} +export interface Slot { + _name: string; + _id: string; + _parent: string; + _props: SlotProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface SlotProps { + filters: Filter[]; +} +export interface Chamber { + _name: string; + _id: string; + _parent: string; + _props: ChamberProps; + _required: boolean; + _mergeSlotWithChildren: boolean; + _proto: string; +} +export interface ChamberProps { + filters: FilterProps[]; +} +export interface FilterProps { + Filter: string[]; +} +export interface Xyz { + x: number; + y: number; + z: number; +} +export interface StackSlot { + _name?: string; + _id: string; + _sptTpl: string; + parent: string; + location: any; + slotId: string; + _max_count: number; + _props?: StackSlotProps; + _proto?: string; + upd: any; +} +export interface StackSlotProps { + filters: Filter[]; +} +export interface EffectsHealth { + Hydration: Hydration; +} +export interface Hydration { + value: number; +} +export interface EffectsDamage { + Pain: Pain; + Contusion: Contusion; +} +export interface Pain { + delay: number; + duration: number; + fadeOut: number; +} +export interface Contusion { + delay: number; + duration: number; + fadeOut: number; +} +export interface Cartridge { + _name: string; + _id: string; + _parent: string; + _max_count: number; + _props: CartridgeProps; + _proto: string; +} +export interface CartridgeProps { + filters: Filter[]; +} +export interface Filter { + Shift?: number; + Filter: string[]; + AnimationIndex?: number; +} +export interface Color { + r: number; + g: number; + b: number; + a: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ITrader.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ITrader.d.ts new file mode 100644 index 0000000..f0fe2b5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/common/tables/ITrader.d.ts @@ -0,0 +1,90 @@ +import { Item } from "./IItem"; +export interface ITrader { + assort: ITraderAssort; + base: ITraderBase; + dialogue?: Record; + questassort: Record>; + suits?: ISuit[]; +} +export interface ITraderBase { + refreshAssort: boolean; + _id: string; + avatar: string; + balance_dol: number; + balance_eur: number; + balance_rub: number; + buyer_up: boolean; + currency: string; + customization_seller: boolean; + discount: number; + discount_end: number; + gridHeight: number; + insurance: Insurance; + location: string; + loyaltyLevels: LoyaltyLevel[]; + medic: boolean; + name: string; + nextResupply: number; + nickname: string; + repair: Repair; + sell_category: string[]; + surname: string; + unlockedByDefault: boolean; +} +export interface Insurance { + availability: boolean; + excluded_category: string[]; + max_return_hour: number; + max_storage_time: number; + min_payment: number; + min_return_hour: number; +} +export interface LoyaltyLevel { + buy_price_coef: number; + exchange_price_coef: number; + heal_price_coef: number; + insurance_price_coef: number; + minLevel: number; + minSalesSum: number; + minStanding: number; + repair_price_coef: number; +} +export interface Repair { + availability: boolean; + currency: string; + currency_coefficient: number; + excluded_category: string[]; + excluded_id_list: any[]; + quality: string; +} +export interface ITraderAssort { + nextResupply?: number; + items: Item[]; + barter_scheme: Record; + loyal_level_items: Record; +} +export interface IBarterScheme { + count: number; + _tpl: string; + onlyFunctional?: boolean; +} +export interface ISuit { + _id: string; + tid: string; + suiteId: string; + isActive: boolean; + requirements: Requirements; +} +export interface Requirements { + loyaltyLevel: number; + profileLevel: number; + standing: number; + skillRequirements: string[]; + questRequirements: string[]; + itemRequirements: ItemRequirement[]; +} +export interface ItemRequirement { + count: number; + _tpl: string; + onlyFunctional: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/customization/IBuyClothingRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/customization/IBuyClothingRequestData.d.ts new file mode 100644 index 0000000..d19b70d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/customization/IBuyClothingRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IBuyClothingRequestData { + Action: "CustomizationBuy"; + offer: string; + items: ClothingItem[]; +} +export interface ClothingItem { + del: boolean; + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/customization/IWearClothingRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/customization/IWearClothingRequestData.d.ts new file mode 100644 index 0000000..122d9cf --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/customization/IWearClothingRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IWearClothingRequestData { + Action: "CustomizationWear"; + suites: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IFriendRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IFriendRequestData.d.ts new file mode 100644 index 0000000..9c326ac --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IFriendRequestData { + to: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts new file mode 100644 index 0000000..53d8289 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetAllAttachmentsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetAllAttachmentsRequestData { + dialogId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts new file mode 100644 index 0000000..076d414 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetAllAttachmentsResponse.d.ts @@ -0,0 +1,6 @@ +import { Message } from "../profile/IAkiProfile"; +export interface IGetAllAttachmentsResponse { + messages: Message[]; + profiles: any[]; + hasMessagesWithRewards: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts new file mode 100644 index 0000000..8f1beac --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetChatServerListRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetChatServerListRequestData { + VersionId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts new file mode 100644 index 0000000..1d0c0e8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetFriendListDataResponse.d.ts @@ -0,0 +1,16 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +export interface IGetFriendListDataResponse { + Friends: Friend[]; + Ignore: any[]; + InIgnoreList: any[]; +} +export interface Friend { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; + MemberCategory: MemberCategory; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts new file mode 100644 index 0000000..eed84b1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogInfoRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMailDialogInfoRequestData { + dialogId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts new file mode 100644 index 0000000..f8fbf5d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogListRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMailDialogListRequestData { + limit: number; + offset: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts new file mode 100644 index 0000000..43d416e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogViewRequestData.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface IGetMailDialogViewRequestData { + type: MessageType; + dialogId: string; + limit: number; + time: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts new file mode 100644 index 0000000..4f8b946 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IGetMailDialogViewResponseData.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../common/IPmcData"; +import { Message } from "../profile/IAkiProfile"; +export interface IGetMailDialogViewResponseData { + messages: Message[]; + profiles: IPmcData[]; + hasMessagesWithRewards: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IPinDialogRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IPinDialogRequestData.d.ts new file mode 100644 index 0000000..57b8a00 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IPinDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IPinDialogRequestData { + dialogId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts new file mode 100644 index 0000000..874b828 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/IRemoveDialogRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IRemoveDialogRequestData { + dialogId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/ISendMessageRequest.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/ISendMessageRequest.d.ts new file mode 100644 index 0000000..dd79deb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/ISendMessageRequest.d.ts @@ -0,0 +1,7 @@ +import { MessageType } from "../../enums/MessageType"; +export interface ISendMessageRequest { + dialogId: string; + type: MessageType; + text: string; + replyTo: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts new file mode 100644 index 0000000..2076232 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/dialog/ISetDialogReadRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISetDialogReadRequestData { + dialogs: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/game/IGameConfigResponse.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/game/IGameConfigResponse.d.ts new file mode 100644 index 0000000..eb37a39 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/game/IGameConfigResponse.d.ts @@ -0,0 +1,19 @@ +export interface IGameConfigResponse { + aid: string; + lang: string; + languages: Record; + ndaFree: boolean; + taxonomy: number; + activeProfileId: string; + backend: Backend; + utc_time: number; + totalInGame: number; + reportAvailable: boolean; + twitchEventMember: boolean; +} +export interface Backend { + Trading: string; + Messaging: string; + Main: string; + RagFair: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts new file mode 100644 index 0000000..a3ecad9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/game/IGameEmptyCrcRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGameEmptyCrcRequestData { + crc: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/game/IVersionValidateRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/game/IVersionValidateRequestData.d.ts new file mode 100644 index 0000000..0aa0fed --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/game/IVersionValidateRequestData.d.ts @@ -0,0 +1,11 @@ +export interface IVersionValidateRequestData { + version: Version; + develop: boolean; +} +export interface Version { + major: string; + minor: string; + game: string; + backend: string; + taxonomy: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts new file mode 100644 index 0000000..7fb80a8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/health/IHealthTreatmentRequestData.d.ts @@ -0,0 +1,29 @@ +export interface IHealthTreatmentRequestData { + Action: "RestoreHealth"; + trader: string; + items: Item[]; + difference: Difference; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} +export interface Difference { + BodyParts: BodyParts; + Energy: number; + Hydration: number; +} +export interface BodyParts { + Head: BodyPart; + Chest: BodyPart; + Stomach: BodyPart; + LeftArm: BodyPart; + RightArm: BodyPart; + LeftLeg: BodyPart; + RightLeg: BodyPart; +} +export interface BodyPart { + Health: number; + Effects: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/health/IOffraidEatRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/health/IOffraidEatRequestData.d.ts new file mode 100644 index 0000000..8e2b6c3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/health/IOffraidEatRequestData.d.ts @@ -0,0 +1,7 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidEatRequestData extends IBaseInteractionRequestData { + Action: "Eat"; + item: string; + count: number; + time: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/health/IOffraidHealRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/health/IOffraidHealRequestData.d.ts new file mode 100644 index 0000000..c242300 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/health/IOffraidHealRequestData.d.ts @@ -0,0 +1,18 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IOffraidHealRequestData extends IBaseInteractionRequestData { + Action: "Heal"; + item: string; + part: BodyPart; + count: number; + time: number; +} +export declare enum BodyPart { + Head = 0, + Chest = 1, + Stomach = 2, + LeftArm = 3, + RightArm = 4, + LeftLeg = 5, + RightLeg = 6, + Common = 7 +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/health/ISyncHealthRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/health/ISyncHealthRequestData.d.ts new file mode 100644 index 0000000..20e32f6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/health/ISyncHealthRequestData.d.ts @@ -0,0 +1,21 @@ +export interface ISyncHealthRequestData { + Health: Health; + IsAlive: boolean; + Hydration?: number; + Energy?: number; + Temperature?: number; +} +export interface Health { + Head?: BodyPartHealth; + Chest?: BodyPartHealth; + Stomach?: BodyPartHealth; + LeftArm?: BodyPartHealth; + RightArm?: BodyPartHealth; + LeftLeg?: BodyPartHealth; + RightLeg?: BodyPartHealth; +} +export interface BodyPartHealth { + Maximum: number; + Current: number; + Effects: Record; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/HideoutAreasEnum.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/HideoutAreasEnum.d.ts new file mode 100644 index 0000000..10f851b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/HideoutAreasEnum.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreasEnum { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..8583e8d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/HideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface HideoutUpgradeCompleteRequestData { + Action: string; + areaType: number; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutArea.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutArea.d.ts new file mode 100644 index 0000000..d9fd2bf --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutArea.d.ts @@ -0,0 +1,40 @@ +export interface IHideoutArea { + _id: string; + type: number; + enabled: boolean; + needsFuel: boolean; + takeFromSlotLocked: boolean; + craftGivesExp: boolean; + stages: Record; +} +export interface Stage { + requirements: Requirement[]; + bonuses: StageBonus[]; + slots: number; + constructionTime: number; + description: string; +} +export interface Requirement { + areaType?: number; + requiredLevel?: number; + type: string; + templateId?: string; + count?: number; + isFunctional?: boolean; + traderId?: string; + loyaltyLevel?: number; + skillName?: string; + skillLevel?: number; +} +export interface StageBonus { + value: number; + passive: boolean; + production: boolean; + visible: boolean; + skillType?: string; + type: string; + filter?: string[]; + icon?: string; + id?: string; + templateId?: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts new file mode 100644 index 0000000..dba83eb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutContinousProductionStartRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutContinousProductionStartRequestData { + Action: "HideoutContinuousProductionStart"; + recipeId: string; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutProduction.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutProduction.d.ts new file mode 100644 index 0000000..ce878be --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutProduction.d.ts @@ -0,0 +1,20 @@ +export interface IHideoutProduction { + _id: string; + areaType: number; + requirements: Requirement[]; + productionTime: number; + boosters: any; + endProduct: string; + continuous: boolean; + count: number; + productionLimitCount: number; +} +export interface Requirement { + templateId?: string; + count?: number; + isFunctional?: boolean; + type: string; + areaType?: number; + requiredLevel?: number; + resource?: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts new file mode 100644 index 0000000..8326c55 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutPutItemInRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutPutItemInRequestData { + Action: "HideoutPutItemsInAreaSlots"; + areaType: number; + items: Record; + timestamp: number; +} +export interface ItemDetails { + count: number; + id: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutScavCase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutScavCase.d.ts new file mode 100644 index 0000000..25abcf3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutScavCase.d.ts @@ -0,0 +1,21 @@ +export interface IHideoutScavCase { + _id: string; + ProductionTime: number; + Requirements: Requirement[]; + EndProducts: EndProducts; +} +export interface Requirement { + templateId: string; + count: number; + isFunctional: boolean; + type: string; +} +export interface EndProducts { + Common: MinMax; + Rare: MinMax; + Superrare: MinMax; +} +export interface MinMax { + min: string; + max: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts new file mode 100644 index 0000000..72fda86 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutScavCaseStartRequestData.d.ts @@ -0,0 +1,15 @@ +export interface IHideoutScavCaseStartRequestData { + Action: "HideoutScavCaseProductionStart"; + recipeId: string; + items: HideoutItem[]; + tools: Tool[]; + timestamp: number; +} +export interface HideoutItem { + id: string; + count: number; +} +export interface Tool { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts new file mode 100644 index 0000000..8e45939 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutSettingsBase.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutSettingsBase { + generatorSpeedWithoutFuel: number; + generatorFuelFlowRate: number; + airFilterUnitFlowRate: number; + gpuBoostRate: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts new file mode 100644 index 0000000..1ed542a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutSingleProductionStartRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutSingleProductionStartRequestData { + Action: "HideoutSingleProductionStart"; + recipeId: string; + items: Item[]; + timestamp: number; +} +export interface Item { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts new file mode 100644 index 0000000..83a740a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutTakeItemOutRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutTakeItemOutRequestData { + Action: "HideoutTakeItemsFromAreaSlots"; + areaType: number; + slots: number[]; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts new file mode 100644 index 0000000..a6847ef --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutTakeProductionRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutTakeProductionRequestData { + Action: "HideoutTakeProduction"; + recipeId: string; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts new file mode 100644 index 0000000..cdea513 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutToggleAreaRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IHideoutToggleAreaRequestData { + Action: "HideoutToggleArea"; + areaType: number; + enabled: boolean; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts new file mode 100644 index 0000000..545311e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutUpgradeCompleteRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IHideoutUpgradeCompleteRequestData { + Action: "HideoutUpgradeComplete"; + areaType: number; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts new file mode 100644 index 0000000..dfbfdca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/hideout/IHideoutUpgradeRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHideoutUpgradeRequestData { + Action: "HideoutUpgrade"; + areaType: number; + items: HideoutItem[]; + timestamp: number; +} +export interface HideoutItem { + count: number; + id: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts new file mode 100644 index 0000000..b5dc5c1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/httpResponse/IGetBodyResponseData.d.ts @@ -0,0 +1,5 @@ +export interface IGetBodyResponseData { + err: number; + errmsg: any; + (data: Type): Type; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/httpResponse/INullResponseData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/httpResponse/INullResponseData.d.ts new file mode 100644 index 0000000..a3ae838 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/httpResponse/INullResponseData.d.ts @@ -0,0 +1,5 @@ +export interface INullResponseData { + err: number; + errmsg: any; + data: null; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts new file mode 100644 index 0000000..e2d9cf1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inRaid/IRegisterPlayerRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IRegisterPlayerRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts new file mode 100644 index 0000000..6930261 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inRaid/ISaveProgressRequestData.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../common/IPmcData"; +import { ISyncHealthRequestData } from "../health/ISyncHealthRequestData"; +export interface ISaveProgressRequestData { + exit: string; + profile: IPmcData; + isPlayerScav: boolean; + health: ISyncHealthRequestData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts new file mode 100644 index 0000000..0e32e96 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/insurance/IGetInsuranceCostRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetInsuranceCostRequestData { + traders: string[]; + items: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/insurance/IInsureRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/insurance/IInsureRequestData.d.ts new file mode 100644 index 0000000..f657bb7 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/insurance/IInsureRequestData.d.ts @@ -0,0 +1,6 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInsureRequestData extends IBaseInteractionRequestData { + Action: "Insure"; + tid: string; + items: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IAddItemRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IAddItemRequestData.d.ts new file mode 100644 index 0000000..53db97a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IAddItemRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IAddItemRequestData { + tid: string; + items: any[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts new file mode 100644 index 0000000..462e0de --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryAddRequestData.d.ts @@ -0,0 +1,6 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryAddRequestData extends IInventoryBaseActionRequestData { + Action: "Add"; + item: string; + container: Container; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts new file mode 100644 index 0000000..b45e459 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryBaseActionRequestData.d.ts @@ -0,0 +1,27 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface IInventoryBaseActionRequestData extends IBaseInteractionRequestData { +} +export interface To { + id: string; + container: string; + location?: ToLocation | number; +} +export interface ToLocation { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} +export interface Container { + id: string; + container: string; + location: Location | number; +} +export interface Location { + x: number; + y: number; + r: string; + rotation?: string; + isSearched: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts new file mode 100644 index 0000000..ff35066 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryBindRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryBindRequestData extends IInventoryBaseActionRequestData { + Action: "Bind"; + item: string; + index: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts new file mode 100644 index 0000000..1e1ecef --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryCreateMarkerRequestData.d.ts @@ -0,0 +1,12 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryCreateMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "CreateMapMarker"; + item: string; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts new file mode 100644 index 0000000..0657e1b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryDeleteMarkerRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryDeleteMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "DeleteMapMarker"; + item: string; + X: number; + Y: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts new file mode 100644 index 0000000..e2857e1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryEditMarkerRequestData.d.ts @@ -0,0 +1,14 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryEditMarkerRequestData extends IInventoryBaseActionRequestData { + Action: "EditMapMarker"; + item: string; + X: number; + Y: number; + mapMarker: MapMarker; +} +export interface MapMarker { + Type: string; + X: number; + Y: number; + Note: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts new file mode 100644 index 0000000..614711f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryExamineRequestData.d.ts @@ -0,0 +1,10 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryExamineRequestData extends IInventoryBaseActionRequestData { + Action: "Examine"; + item: string; + fromOwner: IFromOwner; +} +export interface IFromOwner { + id: string; + type: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts new file mode 100644 index 0000000..a5fb2a1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryFoldRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryFoldRequestData extends IInventoryBaseActionRequestData { + Action: "Fold"; + item: string; + value: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts new file mode 100644 index 0000000..3fcfa35 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryMergeRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMergeRequestData extends IInventoryBaseActionRequestData { + Action: "Merge"; + item: string; + with: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts new file mode 100644 index 0000000..b767908 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryMoveRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventoryMoveRequestData extends IInventoryBaseActionRequestData { + Action: "Move"; + item: string; + to: To; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts new file mode 100644 index 0000000..5487b20 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryReadEncyclopediaRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryReadEncyclopediaRequestData extends IInventoryBaseActionRequestData { + Action: "ReadEncyclopedia"; + ids: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts new file mode 100644 index 0000000..07d1a52 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryRemoveRequestData.d.ts @@ -0,0 +1,5 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryRemoveRequestData extends IInventoryBaseActionRequestData { + Action: "Remove"; + item: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySortRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySortRequestData.d.ts new file mode 100644 index 0000000..a0b7928 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySortRequestData.d.ts @@ -0,0 +1,20 @@ +import { Upd } from "../common/tables/IItem"; +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySortRequestData extends IInventoryBaseActionRequestData { + Action: "ApplyInventoryChanges"; + changedItems: ChangedItem[]; +} +export interface ChangedItem { + _id: string; + _tpl: string; + parentId: string; + slotId: string; + location: Location; + upd: Upd; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts new file mode 100644 index 0000000..730ae71 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySplitRequestData.d.ts @@ -0,0 +1,7 @@ +import { Container, IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventorySplitRequestData extends IInventoryBaseActionRequestData { + Action: "Split"; + item: string; + container: Container; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts new file mode 100644 index 0000000..1b0464d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventorySwapRequestData.d.ts @@ -0,0 +1,11 @@ +import { OwnerInfo } from "../common/request/IBaseInteractionRequestData"; +import { IInventoryBaseActionRequestData, To } from "./IInventoryBaseActionRequestData"; +export interface IInventorySwapRequestData extends IInventoryBaseActionRequestData { + Action: "Swap"; + item: string; + to: To; + item2: string; + to2: To; + fromOwner2: OwnerInfo; + toOwner2: OwnerInfo; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts new file mode 100644 index 0000000..f021661 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryTagRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTagRequestData extends IInventoryBaseActionRequestData { + Action: "Tag"; + item: string; + TagName: string; + TagColor: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts new file mode 100644 index 0000000..0955440 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryToggleRequestData.d.ts @@ -0,0 +1,6 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryToggleRequestData extends IInventoryBaseActionRequestData { + Action: "Toggle"; + item: string; + value: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts new file mode 100644 index 0000000..cf4391b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/inventory/IInventoryTransferRequestData.d.ts @@ -0,0 +1,7 @@ +import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData"; +export interface IInventoryTransferRequestData extends IInventoryBaseActionRequestData { + Action: "Transfer"; + item: string; + with: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts new file mode 100644 index 0000000..689fe75 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IEmptyItemEventRouterResponse.d.ts @@ -0,0 +1,4 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IEmptyItemEventRouterResponse extends IItemEventRouterBase { + profileChanges: ""; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts new file mode 100644 index 0000000..31e62fe --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterBase.d.ts @@ -0,0 +1,67 @@ +import { Skills } from "../common/IPmcData"; +import { Item, Upd } from "../common/tables/IItem"; +import { IQuest } from "../common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../common/tables/IRepeatableQuests"; +import { IRagfairOffer } from "../ragfair/IRagfairOffer"; +export interface IItemEventRouterBase { + warnings: Warning[]; + profileChanges: TProfileChanges | ""; +} +export declare type TProfileChanges = Record; +export interface Warning { + index: number; + err: string; + errmsg: string; +} +export interface ProfileChange { + _id: string; + experience: number; + quests: IQuest[]; + ragFairOffers: IRagfairOffer[]; + builds: BuildChange[]; + items: ItemChanges; + production: Record; + skills: Skills; + traderRelations: Record; + repeatableQuests?: IPmcDataRepeatableQuest[]; +} +export interface BuildChange { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface ItemChanges { + new: Product[]; + change: Product[]; + del: Product[]; +} +export interface Production { + Progress: number; + StartTimestamp: number; + ProductionTime: number; + inProgress: boolean; + RecipeId: string; + Products: Product[]; +} +export interface Product { + _id: string; + _tpl?: string; + parentId?: string; + slotId?: string; + location?: ItemChangeLocation; + upd?: Upd; +} +export interface ItemChangeLocation { + x: number; + y: number; + r: number; + isSearched?: boolean; +} +export interface TraderRelations { + salesSum?: number; + standing?: number; + loyalty?: number; + unlocked?: boolean; + disabled?: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts new file mode 100644 index 0000000..515b49a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterRequest.d.ts @@ -0,0 +1,21 @@ +export interface IItemEventRouterRequest { + data: Daum[]; + tm: number; + reload: number; +} +export interface Daum { + Action: string; + item: string; + to: To; +} +export interface To { + id: string; + container: string; + location?: Location; +} +export interface Location { + x: number; + y: number; + r: string; + isSearched: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts new file mode 100644 index 0000000..72a9b5b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/itemEvent/IItemEventRouterResponse.d.ts @@ -0,0 +1,3 @@ +import { IItemEventRouterBase } from "./IItemEventRouterBase"; +export interface IItemEventRouterResponse extends IItemEventRouterBase { +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IChangeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IChangeRequestData.d.ts new file mode 100644 index 0000000..f0a7838 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IChangeRequestData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IChangeRequestData extends ILoginRequestData { + change: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts new file mode 100644 index 0000000..a14c7c9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IGetMiniProfileRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IGetMiniProfileRequestData { + username: string; + password: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/ILoginRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/ILoginRequestData.d.ts new file mode 100644 index 0000000..e965813 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/ILoginRequestData.d.ts @@ -0,0 +1,4 @@ +export interface ILoginRequestData { + username: string; + password: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IMiniProfile.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IMiniProfile.d.ts new file mode 100644 index 0000000..c12661a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IMiniProfile.d.ts @@ -0,0 +1,14 @@ +export interface IMiniProfile { + username: string; + nickname: string; + side: string; + currlvl: number; + currexp: number; + prevexp: number; + nextlvl: number; + maxlvl: number; + akiData: AkiData; +} +export interface AkiData { + version: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IRegisterData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IRegisterData.d.ts new file mode 100644 index 0000000..61a8bbe --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IRegisterData.d.ts @@ -0,0 +1,4 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export interface IRegisterData extends ILoginRequestData { + edition: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IRemoveProfileData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IRemoveProfileData.d.ts new file mode 100644 index 0000000..d31c9ac --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/launcher/IRemoveProfileData.d.ts @@ -0,0 +1,2 @@ +import { ILoginRequestData } from "./ILoginRequestData"; +export declare type IRemoveProfileData = ILoginRequestData; diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/location/IGetLocationRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/location/IGetLocationRequestData.d.ts new file mode 100644 index 0000000..04e84d9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/location/IGetLocationRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IGetLocationRequestData { + crc: number; + locationId: string; + variantId: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts new file mode 100644 index 0000000..811e9a2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/match/IEndOfflineRaidRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IEndOfflineRaidRequestData { + crc: number; + exitStatus: string; + exitName: any; + raidSeconds: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/match/IGetProfileRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/match/IGetProfileRequestData.d.ts new file mode 100644 index 0000000..86b5bbd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/match/IGetProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetProfileRequestData { + profileId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts new file mode 100644 index 0000000..84bccc8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/match/IStartOffineRaidRequestData.d.ts @@ -0,0 +1,27 @@ +export interface IStartOfflineRaidRequestData { + locationName: string; + entryPoint: string; + startTime: number; + dateTime: string; + gameSettings: GameSettings; +} +export interface GameSettings { + timeAndWeatherSettings: TimeAndWeatherSettings; + botsSettings: BotsSettings; + wavesSettings: WavesSettings; +} +export interface TimeAndWeatherSettings { + isRandomTime: boolean; + isRandomWeather: boolean; +} +export interface BotsSettings { + isEnabled: boolean; + isScavWars: boolean; + botAmount: string; +} +export interface WavesSettings { + botDifficulty: string; + isBosses: boolean; + isTaggedAndCursed: boolean; + wavesBotAmount: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/notes/INoteActionData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/notes/INoteActionData.d.ts new file mode 100644 index 0000000..610657f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/notes/INoteActionData.d.ts @@ -0,0 +1,10 @@ +import { IBaseInteractionRequestData } from "../common/request/IBaseInteractionRequestData"; +export interface INoteActionData extends IBaseInteractionRequestData { + Action: string; + index: number; + note: INote; +} +export interface INote { + Time: number; + Text: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/notifier/INotifier.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/notifier/INotifier.d.ts new file mode 100644 index 0000000..8c48260 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/notifier/INotifier.d.ts @@ -0,0 +1,14 @@ +export interface INotifierChannel { + "server": string; + "channel_id": string; + "url": string; + "notifierServer": string; + "ws": string; +} +import { Message } from "../profile/IAkiProfile"; +export interface INotification { + type: "RagfairOfferSold" | "new_message" | "ping"; + eventId: string; + dialogId?: string; + message?: Message; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts new file mode 100644 index 0000000..2bc3d1e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/notifier/ISelectProfileRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISelectProfileRequestData { + uid: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts new file mode 100644 index 0000000..dcd14a2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/player/IPlayerIncrementSkillLevelRequestData.d.ts @@ -0,0 +1,21 @@ +import { Skills } from "../common/IPmcData"; +export interface IPlayerIncrementSkillLevelRequestData { + _id: string; + experience: number; + quests: any[]; + ragFairOffers: any[]; + builds: any[]; + items: Items; + production: Production; + skills: Skills; + traderRelations: TraderRelations; +} +export interface Items { + new: any[]; + change: any[]; + del: any[]; +} +export interface Production { +} +export interface TraderRelations { +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts new file mode 100644 index 0000000..99c61f1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/presetBuild/IPresetBuildActionRequestData.d.ts @@ -0,0 +1,25 @@ +export interface IPresetBuildActionRequestData { + Action: string; + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Item { + _id: string; + _tpl: string; + upd?: Upd; + parentId?: string; + slotId?: string; +} +export interface Upd { + Repairable: Repairable; + FireMode: FireMode; +} +export interface Repairable { + MaxDurability: number; + Durability: number; +} +export interface FireMode { + FireMode: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IAkiProfile.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IAkiProfile.d.ts new file mode 100644 index 0000000..3e0b319 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IAkiProfile.d.ts @@ -0,0 +1,167 @@ +import { MessageType } from "../../enums/MessageType"; +import { IPmcData } from "../common/IPmcData"; +import { Item } from "../common/tables/IItem"; +export interface IAkiProfile { + info: Info; + characters: Characters; + suits: string[]; + weaponbuilds: WeaponBuild[]; + dialogues: Record; + aki: Aki; + vitality: Vitality; + inraid: Inraid; + insurance: Insurance[]; +} +export interface Info { + id: string; + username: string; + password: string; + wipe: boolean; + edition: string; +} +export interface Characters { + pmc: IPmcData; + scav: IPmcData; +} +export interface WeaponBuild { + id: string; + name: string; + root: string; + items: Item[]; +} +export interface Dialogue { + _id: string; + messages: Message[]; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface DialogueInfo { + _id: string; + type: MessageType; + message: MessagePreview; + pinned: boolean; + new: number; + attachmentsNew: number; +} +export interface Message { + _id: string; + uid: string; + type: MessageType; + dt: number; + localDateTime: number; + UtcDateTime?: number; + Member?: IUpdatableChatMember; + templateId: string; + text?: string; + hasRewards: boolean; + rewardCollected: boolean; + items: Items; + maxStorageTime?: number; + systemData?: ISystemData; +} +export interface MessagePreview { + uid: string; + type: MessageType; + dt: number; + templateId: string; + text?: string; +} +export interface Items { + stash?: string; + data?: Item[]; +} +export interface ISystemData { + date?: string; + time?: string; + location?: string; + buyerNickname?: string; + soldItem?: string; + itemCount?: number; +} +export interface IUpdatableChatMember { + Nickname: string; + Side: string; + Level: number; + MemberCategory: string; + Ignored: boolean; + Banned: boolean; +} +export interface DateTime { + date: string; + time: string; +} +export interface Aki { + version: string; +} +export interface Vitality { + health: Health; + effects: Effects; +} +export interface Health { + Hydration: number; + Energy: number; + Temperature: number; + Head: number; + Chest: number; + Stomach: number; + LeftArm: number; + RightArm: number; + LeftLeg: number; + RightLeg: number; +} +export interface Effects { + Head: Head; + Chest: Chest; + Stomach: Stomach; + LeftArm: LeftArm; + RightArm: RightArm; + LeftLeg: LeftLeg; + RightLeg: RightLeg; +} +export interface Head { +} +export interface Chest { +} +export interface Stomach { +} +export interface LeftArm { + Fracture?: number; +} +export interface RightArm { + Fracture?: number; +} +export interface LeftLeg { + Fracture?: number; +} +export interface RightLeg { + Fracture?: number; +} +export interface Inraid { + location: string; + character: string; +} +export interface Insurance { + scheduledTime: number; + traderId: string; + messageContent: MessageContent; + items: Item[]; +} +export interface MessageContent { + ragfair?: MessageContentRagfair; + text?: string; + templateId: string; + type: MessageType; + maxStorageTime?: number; + systemData?: MessageContentData; +} +export interface MessageContentRagfair { + offerId: string; + count: number; + handbookId: string; +} +export interface MessageContentData { + date: string; + time: string; + location: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts new file mode 100644 index 0000000..4a61196 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileChangeNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeNicknameRequestData { + nickname: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts new file mode 100644 index 0000000..91058ce --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileChangeVoiceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IProfileChangeVoiceRequestData { + voice: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileCreateRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileCreateRequestData.d.ts new file mode 100644 index 0000000..93cc656 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IProfileCreateRequestData.d.ts @@ -0,0 +1,6 @@ +export interface IProfileCreateRequestData { + side: string; + nickname: string; + headId: string; + voiceId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/ISearchFriendRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/ISearchFriendRequestData.d.ts new file mode 100644 index 0000000..e63e386 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/ISearchFriendRequestData.d.ts @@ -0,0 +1,3 @@ +export interface ISearchFriendRequestData { + nickname: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/ISearchFriendResponse.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/ISearchFriendResponse.d.ts new file mode 100644 index 0000000..96d88b2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/ISearchFriendResponse.d.ts @@ -0,0 +1,9 @@ +export interface ISearchFriendResponse { + _id: string; + Info: Info; +} +export interface Info { + Nickname: string; + Side: string; + Level: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts new file mode 100644 index 0000000..9cca7e7 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/profile/IValidateNicknameRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IValidateNicknameRequestData { + nickname: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts new file mode 100644 index 0000000..0e4821a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IAcceptQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IAcceptQuestRequestData { + Action: "QuestAccept"; + qid: string; + type: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts new file mode 100644 index 0000000..cc67404 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/ICompleteQuestRequestData.d.ts @@ -0,0 +1,5 @@ +export interface ICompleteQuestRequestData { + Action: string; + qid: string; + removeExcessItems: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts new file mode 100644 index 0000000..63f10a8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IHandoverQuestRequestData.d.ts @@ -0,0 +1,10 @@ +export interface IHandoverQuestRequestData { + Action: "QuestHandover"; + qid: string; + conditionId: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IListQuestsRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IListQuestsRequestData.d.ts new file mode 100644 index 0000000..91f0b8c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IListQuestsRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IListQuestsRequestData { + completed: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts new file mode 100644 index 0000000..015f58e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/quests/IRepeatableQuestChangeRequest.d.ts @@ -0,0 +1,4 @@ +export interface IRepeatableQuestChangeRequest { + Action: "RepeatableQuestChange"; + qid: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts new file mode 100644 index 0000000..465ee02 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IAddOfferRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IAddOfferRequestData { + Action: string; + sellInOnePiece: boolean; + items: string[]; + requirements: Requirement[]; +} +export interface Requirement { + _tpl: string; + count: number; + level: number; + side: number; + onlyFunctional: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts new file mode 100644 index 0000000..2a4a876 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IExtendOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IExtendOfferRequestData { + offerId: string; + renewalTime: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts new file mode 100644 index 0000000..676322a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetItemPriceResult.d.ts @@ -0,0 +1,5 @@ +export interface IGetItemPriceResult { + avg: number; + min: number; + max: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts new file mode 100644 index 0000000..00f8f17 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetMarketPriceRequestData.d.ts @@ -0,0 +1,3 @@ +export interface IGetMarketPriceRequestData { + templateId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetOffersResult.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetOffersResult.d.ts new file mode 100644 index 0000000..1c11422 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IGetOffersResult.d.ts @@ -0,0 +1,7 @@ +import { IRagfairOffer } from "./IRagfairOffer"; +export interface IGetOffersResult { + categories: Record; + offers: IRagfairOffer[]; + offersCount: number; + selectedCategory: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IRagfairOffer.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IRagfairOffer.d.ts new file mode 100644 index 0000000..63f655e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IRagfairOffer.d.ts @@ -0,0 +1,42 @@ +import { MemberCategory } from "../../enums/MemberCategory"; +import { Item } from "../common/tables/IItem"; +export interface IRagfairOffer { + sellResult?: SellResult[]; + _id: string; + items: Item[]; + requirements: OfferRequirement[]; + root: string; + intId: number; + itemsCost: number; + requirementsCost: number; + startTime: number; + endTime: number; + sellInOnePiece: boolean; + name?: string; + shortName?: string; + loyaltyLevel: number; + locked: boolean; + unlimitedCount: boolean; + summaryCost: number; + user: IRagfairOfferUser; + notAvailable: boolean; + CurrentItemCount: number; + priority: boolean; +} +export interface OfferRequirement { + _tpl: string; + count: number; + onlyFunctional: boolean; +} +export interface IRagfairOfferUser { + id: string; + nickname: string; + rating: number; + memberType: MemberCategory; + avatar: string; + isRatingGrowing: boolean; +} +export interface SellResult { + sellTime: number; + amount: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts new file mode 100644 index 0000000..d926615 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/IRemoveOfferRequestData.d.ts @@ -0,0 +1,4 @@ +export interface IRemoveOfferRequestData { + Action: string; + offerId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/ISearchRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/ISearchRequestData.d.ts new file mode 100644 index 0000000..08e7fd3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/ragfair/ISearchRequestData.d.ts @@ -0,0 +1,32 @@ +export interface ISearchRequestData { + page: number; + limit: number; + sortType: number; + sortDirection: number; + currency: number; + priceFrom: number; + priceTo: number; + quantityFrom: number; + quantityTo: number; + conditionFrom: number; + conditionTo: number; + oneHourExpiration: boolean; + removeBartering: boolean; + offerOwnerType: OfferOwnerType; + onlyFunctional: boolean; + updateOfferCount: boolean; + handbookId: string; + linkedSearchId: string; + neededSearchId: string; + buildItems: BuildItems; + buildCount: number; + tm: number; + reload: number; +} +export declare enum OfferOwnerType { + ANYOWNERTYPE = 0, + TRADEROWNERTYPE = 1, + PLAYEROWNERTYPE = 2 +} +export interface BuildItems { +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e645fb3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/repair/IBaseRepairActionDataRequest.d.ts @@ -0,0 +1,3 @@ +export interface IBaseRepairActionDataRequest { + Action: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/repair/IRepairActionDataRequest.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/repair/IRepairActionDataRequest.d.ts new file mode 100644 index 0000000..263d400 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/repair/IRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface IRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "Repair"; + repairKitsInfo: RepairKitsInfo[]; + target: string; +} +export interface RepairKitsInfo { + _id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts new file mode 100644 index 0000000..e3d469d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/repair/ITraderRepairActionDataRequest.d.ts @@ -0,0 +1,10 @@ +import { IBaseRepairActionDataRequest } from "./IBaseRepairActionDataRequest"; +export interface ITraderRepairActionDataRequest extends IBaseRepairActionDataRequest { + Action: "TraderRepair"; + tid: string; + repairItems: RepairItem[]; +} +export interface RepairItem { + _id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts new file mode 100644 index 0000000..a9ef757 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessBaseTradeRequestData.d.ts @@ -0,0 +1,5 @@ +export interface IProcessBaseTradeRequestData { + Action: string; + type: string; + tid: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts new file mode 100644 index 0000000..a9e4c17 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessBuyTradeRequestData.d.ts @@ -0,0 +1,14 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessBuyTradeRequestData extends IProcessBaseTradeRequestData { + Action: "buy_from_trader" | "TradingConfirm" | "RestoreHealth" | ""; + type: string; + tid: string; + item_id: string; + count: number; + scheme_id: number; + scheme_items: SchemeItem[]; +} +export interface SchemeItem { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts new file mode 100644 index 0000000..889dfd1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessRagfairTradeRequestData.d.ts @@ -0,0 +1,13 @@ +export interface IProcessRagfairTradeRequestData { + Action: string; + offers: Offer[]; +} +export interface Offer { + id: string; + count: number; + items: Item[]; +} +export interface Item { + id: string; + count: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts new file mode 100644 index 0000000..f1d555f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/trade/IProcessSellTradeRequestData.d.ts @@ -0,0 +1,12 @@ +import { IProcessBaseTradeRequestData } from "./IProcessBaseTradeRequestData"; +export interface IProcessSellTradeRequestData extends IProcessBaseTradeRequestData { + Action: "sell_to_trader"; + type: string; + tid: string; + items: Item[]; +} +export interface Item { + id: string; + count: number; + scheme_id: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/weather/IWeatherData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/weather/IWeatherData.d.ts new file mode 100644 index 0000000..ecc96ce --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/weather/IWeatherData.d.ts @@ -0,0 +1,20 @@ +export interface IWeatherData { + acceleration: number; + time: string; + date: string; + weather: IWeather; +} +export interface IWeather { + pressure: number; + temp: number; + fog: string; + rain_intensity: number; + rain: any; + wind_gustiness: number; + wind_direction: any; + wind_speed: number; + cloud: number; + time: string; + date: string; + timestamp: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/eft/wishlist/IWishlistActionData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/eft/wishlist/IWishlistActionData.d.ts new file mode 100644 index 0000000..9217864 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/eft/wishlist/IWishlistActionData.d.ts @@ -0,0 +1,4 @@ +export interface IWishlistActionData { + Action: string; + templateId: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/enums/BaseClasses.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/enums/BaseClasses.d.ts new file mode 100644 index 0000000..e733bca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/enums/BaseClasses.d.ts @@ -0,0 +1,84 @@ +export declare enum BaseClasses { + WEAPON = "5422acb9af1c889c16000029", + ARMOR = "5448e54d4bdc2dcc718b4568", + VEST = "5448e5284bdc2dcb718b4567", + BACKPACK = "5448e53e4bdc2d60728b4567", + VISORS = "5448e5724bdc2ddf718b4568", + FOOD = "5448e8d04bdc2ddf718b4569", + DRINK = "5448e8d64bdc2dce718b4568", + BARTER_ITEM = "5448eb774bdc2d0a728b4567", + INFO = "5448ecbe4bdc2d60728b4568", + MEDKIT = "5448f39d4bdc2d0a728b4568", + DRUGS = "5448f3a14bdc2d27728b4569", + STIMULATOR = "5448f3a64bdc2d60728b456a", + MEDICAL = "5448f3ac4bdc2dce718b4569", + MEDICAL_SUPPLIES = "57864c8c245977548867e7f1", + MOD = "5448fe124bdc2da5018b4567", + FUNCTIONAL_MOD = "550aa4154bdc2dd8348b456b", + FUEL = "5d650c3e815116009f6201d2", + GEAR_MOD = "55802f3e4bdc2de7118b4584", + STOCK = "55818a594bdc2db9688b456a", + FOREGRIP = "55818af64bdc2d5b648b4570", + MASTER_MOD = "55802f4a4bdc2ddb688b4569", + MOUNT = "55818b224bdc2dde698b456f", + MUZZLE = "5448fe394bdc2d0d028b456c", + SIGHTS = "5448fe7a4bdc2d6f028b456b", + MEDS = "543be5664bdc2dd4348b4569", + MONEY = "543be5dd4bdc2deb348b4569", + KEY = "543be5e94bdc2df1348b4568", + KEY_MECHANICAL = "5c99f98d86f7745c314214b3", + KEYCARD = "5c164d2286f774194c5e69fa", + EQUIPMENT = "543be5f84bdc2dd4348b456a", + THROW_WEAPON = "543be6564bdc2df4348b4568", + FOOD_DRINK = "543be6674bdc2df1348b4569", + PISTOL = "5447b5cf4bdc2d65278b4567", + SMG = "5447b5e04bdc2d62278b4567", + ASSAULT_RIFLE = "5447b5f14bdc2d61278b4567", + ASSAULT_CARBINE = "5447b5fc4bdc2d87278b4567", + SHOTGUN = "5447b6094bdc2dc3278b4567", + MARKSMAN_RIFLE = "5447b6194bdc2d67278b4567", + SNIPER_RIFLE = "5447b6254bdc2dc3278b4568", + MACHINE_GUN = "5447bed64bdc2d97278b4568", + GRENADE_LAUNCHER = "5447bedf4bdc2d87278b4568", + SPECIAL_WEAPON = "5447bee84bdc2dc3278b4569", + SPEC_ITEM = "5447e0e74bdc2d3c308b4567", + KNIFE = "5447e1d04bdc2dff2f8b4567", + AMMO = "5485a8684bdc2da71d8b4567", + AMMO_BOX = "543be5cb4bdc2deb348b4568", + LOOT_CONTAINER = "566965d44bdc2d814c8b4571", + MOD_CONTAINER = "5448bf274bdc2dfc2f8b456a", + SEARCHABLE_ITEM = "566168634bdc2d144c8b456c", + STASH = "566abbb64bdc2d144c8b457d", + SORTING_TABLE = "6050cac987d3f925bf016837", + LOCKABLE_CONTAINER = "5671435f4bdc2d96058b4569", + SIMPLE_CONTAINER = "5795f317245977243854e041", + INVENTORY = "55d720f24bdc2d88028b456d", + STATIONARY_CONTAINER = "567583764bdc2d98058b456e", + POCKETS = "557596e64bdc2dc2118b4571", + ARMBAND = "5b3f15d486f77432d0509248", + DOG_TAG_USEC = "59f32c3b86f77472a31742f0", + DOG_TAG_BEAR = "59f32bb586f774757e1e8442", + JEWELRY = "57864a3d24597754843f8721", + ELECTRONICS = "57864a66245977548f04a81f", + BUILDING_MATERIAL = "57864ada245977548638de91", + TOOL = "57864bb7245977548b3b66c2", + HOUSEHOLD_GOODS = "57864c322459775490116fbf", + LUBRICANT = "57864e4c24597754843f8723", + BATTERY = "57864ee62459775490116fc1", + ASSAULT_SCOPE = "55818add4bdc2d5b648b456f", + REFLEX_SIGHT = "55818ad54bdc2ddc698b4569", + TACTICAL_COMBO = "55818b164bdc2ddc698b456c", + MAGAZINE = "5448bc234bdc2d3c308b4569", + LIGHT_LASER = "55818b0e4bdc2dde698b456e", + FLASH_HIDER = "550aa4bf4bdc2dd6348b456b", + COLLIMATOR = "55818ad54bdc2ddc698b4569", + COMPACT_COLLIMATOR = "55818acf4bdc2dde698b456b", + COMPENSATOR = "550aa4af4bdc2dd4348b456e", + OPTIC_SCOPE = "55818ae44bdc2dde698b456c", + SPECIAL_SCOPE = "55818aeb4bdc2ddc698b456a", + OTHER = "590c745b86f7743cc433c5f2", + SILENCER = "550aa4cd4bdc2dd8348b456c", + PORTABLE_RANGE_FINDER = "61605ddea09d851a0a0c1bbc", + ITEM = "54009119af1c881c07000029", + CYLINDER_MAGAZINE = "610720f290b75a49ff2e5e25" +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/enums/ConfigTypes.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/enums/ConfigTypes.d.ts new file mode 100644 index 0000000..6bd31e8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/enums/ConfigTypes.d.ts @@ -0,0 +1,18 @@ +export declare enum ConfigTypes { + AIRDROP = "aki-airdrop", + BOT = "aki-bot", + CORE = "aki-core", + HEALTH = "aki-health", + HIDEOUT = "aki-hideout", + HTTP = "aki-http", + IN_RAID = "aki-inraid", + INSURANCE = "aki-insurance", + INVENTORY = "aki-inventory", + LOCATION = "aki-location", + MATCH = "aki-match", + QUEST = "aki-quest", + RAGFAIR = "aki-ragfair", + REPAIR = "aki-repair", + TRADER = "aki-trader", + WEATHER = "aki-weather" +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/enums/ELocationName.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/enums/ELocationName.d.ts new file mode 100644 index 0000000..b56cc08 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/enums/ELocationName.d.ts @@ -0,0 +1,11 @@ +export declare enum ELocationName { + FACTORY_DAY = "factory4_day", + BIGMAP = "bigmap", + WOODS = "Woods", + SHORELINE = "Shoreline", + INTERCHANGE = "Interchange", + LIGHTHOUSE = "Lighthouse", + LABORATORY = "laboratory", + RESERVE = "RezervBase", + ANY = "any" +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/enums/EquipmentSlots.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/enums/EquipmentSlots.d.ts new file mode 100644 index 0000000..35c18ff --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/enums/EquipmentSlots.d.ts @@ -0,0 +1,16 @@ +export declare enum EquipmentSlots { + HEADWEAR = "Headwear", + EARPIECE = "Earpiece", + FACE_COVER = "FaceCover", + ARMOR_VEST = "ArmorVest", + EYEWEAR = "Eyewear", + ARM_BAND = "ArmBand", + TACTICAL_VEST = "TacticalVest", + POCKETS = "Pockets", + BACKPACK = "Backpack", + SECURED_CONTAINER = "SecuredContainer", + FIRST_PRIMARY_WEAPON = "FirstPrimaryWeapon", + SECOND_PRIMARY_WEAPON = "SecondPrimaryWeapon", + HOLSTER = "Holster", + SCABBARD = "Scabbard" +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/enums/HideoutAreas.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/enums/HideoutAreas.d.ts new file mode 100644 index 0000000..b44a20a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/enums/HideoutAreas.d.ts @@ -0,0 +1,25 @@ +export declare enum HideoutAreas { + NOTSET = -1, + VENTS = 0, + SECURITY = 1, + LAVATORY = 2, + STASH = 3, + GENERATOR = 4, + HEATING = 5, + WATER_COLLECTOR = 6, + MEDSTATION = 7, + NUTRITION_UNIT = 8, + REST_SPACE = 9, + WORKBENCH = 10, + INTEL_CENTER = 11, + SHOOTING_RANGE = 12, + LIBRARY = 13, + SCAV_CASE = 14, + ILLUMINATION = 15, + PLACE_OF_FAME = 16, + AIR_FILTERING = 17, + SOLAR_POWER = 18, + BOOZE_GENERATOR = 19, + BITCOIN_FARM = 20, + CHRISTMAS_TREE = 21 +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/enums/MemberCategory.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/enums/MemberCategory.d.ts new file mode 100644 index 0000000..3bd9a21 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/enums/MemberCategory.d.ts @@ -0,0 +1,13 @@ +export declare enum MemberCategory { + Default = 0, + Developer = 1, + UniqueId = 2, + Trader = 4, + Group = 8, + System = 16, + ChatModerator = 32, + ChatModeratorWithPermanentBan = 64, + UnitTest = 128, + Sherpa = 256, + Emissary = 512 +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/enums/MessageType.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/enums/MessageType.d.ts new file mode 100644 index 0000000..1b0c649 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/enums/MessageType.d.ts @@ -0,0 +1,16 @@ +export declare enum MessageType { + USER_MESSAGE = 1, + NPC_TRADER = 2, + AUCTION_MESSAGE = 3, + FLEAMARKET_MESSAGE = 4, + ADMIN_MESSAGE = 5, + GROUP_CHAT_MESSAGE = 6, + SYSTEM_MESSAGE = 7, + INSURANCE_RETURN = 8, + GLOBAL_CHAT = 9, + QUEST_START = 10, + QUEST_FAIL = 11, + QUEST_SUCCESS = 12, + MESSAGE_WITH_ITEMS = 13, + INITIAL_SUPPORT = 14 +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/enums/Money.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/enums/Money.d.ts new file mode 100644 index 0000000..0d39613 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/enums/Money.d.ts @@ -0,0 +1,5 @@ +export declare enum Money { + ROUBLES = "5449016a4bdc2d6f028b456f", + EUROS = "569668774bdc2da2298b4568", + DOLLARS = "5696686a4bdc2da3298b456a" +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/enums/Traders.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/enums/Traders.d.ts new file mode 100644 index 0000000..163cd71 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/enums/Traders.d.ts @@ -0,0 +1,10 @@ +export declare enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/external/mod.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/external/mod.d.ts new file mode 100644 index 0000000..ecef460 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/external/mod.d.ts @@ -0,0 +1,5 @@ +import { DependencyContainer } from "./tsyringe"; +export interface IMod { + load: (container: DependencyContainer) => void; + delayedLoad: (container: DependencyContainer) => void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/external/tsyringe.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/external/tsyringe.d.ts new file mode 100644 index 0000000..56a7e58 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/external/tsyringe.d.ts @@ -0,0 +1,2 @@ +import type { DependencyContainer } from "tsyringe"; +export type { DependencyContainer }; diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/bindings/Route.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/bindings/Route.d.ts new file mode 100644 index 0000000..1b29d7d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/bindings/Route.d.ts @@ -0,0 +1,3 @@ +export interface IRoute { + aki: any; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IBotCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IBotCallbacks.d.ts new file mode 100644 index 0000000..2c42813 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IBotCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface IBotCallbacks { + getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string; + getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string; + generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData; + getBotCap(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IBundleCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IBundleCallbacks.d.ts new file mode 100644 index 0000000..7e37c6e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IBundleCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IBundleCallbacks { + sendBundle(sessionID: string, req: any, resp: any, body: any): any; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts new file mode 100644 index 0000000..d10027f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ICustomizationCallbacks.d.ts @@ -0,0 +1,12 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IBuyClothingRequestData } from "../../eft/customization/IBuyClothingRequestData"; +import { IWearClothingRequestData } from "../../eft/customization/IWearClothingRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISuit } from "../../eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface ICustomizationCallbacks { + getSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + getTraderSuits(url: string, info: any, sessionID: string): IGetBodyResponseData; + wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse; + buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IDataCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IDataCallbacks.d.ts new file mode 100644 index 0000000..a098560 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IDataCallbacks.d.ts @@ -0,0 +1,26 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGlobals } from "../../eft/common/IGlobals"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILanguageBase } from "../server/ILocaleBase"; +import { ISettingsBase } from "../server/ISettingsBase"; +export interface IDataCallbacks { + getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string; + getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts new file mode 100644 index 0000000..fe2115a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IDialogueCallbacks.d.ts @@ -0,0 +1,34 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetMailDialogViewRequestData } from "../../eft/dialog/IGetMailDialogViewRequestData"; +import { IGetMailDialogInfoRequestData } from "../../eft/dialog/IGetMailDialogInfoRequestData"; +import { IRemoveDialogRequestData } from "../../eft/dialog/IRemoveDialogRequestData"; +import { IGetMailDialogListRequestData } from "../../eft/dialog/IGetMailDialogListRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IFriendRequestData } from "../../eft/dialog/IFriendRequestData"; +import { IPinDialogRequestData } from "../../eft/dialog/IPinDialogRequestData"; +import { ISetDialogReadRequestData } from "../../eft/dialog/ISetDialogReadRequestData"; +import { IGetAllAttachmentsRequestData } from "../../eft/dialog/IGetAllAttachmentsRequestData"; +import { IGetChatServerListRequestData } from "../../eft/dialog/IGetChatServerListRequestData"; +import { IGetFriendListDataResponse } from "../../eft/dialog/IGetFriendListDataResponse"; +import { ISendMessageRequest } from "../../eft/dialog/ISendMessageRequest"; +import { IGetMailDialogViewResponseData } from "../../eft/dialog/IGetMailDialogViewResponseData"; +import { IGetAllAttachmentsResponse } from "../../eft/dialog/IGetAllAttachmentsResponse"; +import { DialogueInfo } from "../../eft/profile/IAkiProfile"; +export interface IDialogueCallbacks { + getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData; + getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData; + removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData; + pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData; + setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData; + getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData; + listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + friendRequest(url: string, request: IFriendRequestData, sessionID: string): INullResponseData; + sendMessage(url: string, request: ISendMessageRequest, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IGameCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IGameCallbacks.d.ts new file mode 100644 index 0000000..38ebc5f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IGameCallbacks.d.ts @@ -0,0 +1,16 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGameEmptyCrcRequestData } from "../../eft/game/IGameEmptyCrcRequestData"; +import { IVersionValidateRequestData } from "../../eft/game/IVersionValidateRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGameConfigResponse } from "../../eft/game/IGameConfigResponse"; +export interface IGameCallbacks { + versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData; + gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData; + getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getVersion(url: string, info: IEmptyRequestData, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts new file mode 100644 index 0000000..5857a3e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHandbookCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IHandbookCallbacks { + load(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHealthCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHealthCallbacks.d.ts new file mode 100644 index 0000000..d238c7a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHealthCallbacks.d.ts @@ -0,0 +1,13 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { ISyncHealthRequestData } from "../../eft/health/ISyncHealthRequestData"; +import { IOffraidEatRequestData } from "../../eft/health/IOffraidEatRequestData"; +import { IOffraidHealRequestData } from "../../eft/health/IOffraidHealRequestData"; +import { IHealthTreatmentRequestData } from "../../eft/health/IHealthTreatmentRequestData"; +export interface IHealthCallbacks { + onLoad(sessionID: string): IAkiProfile; + syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): any; + offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): any; + offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): any; + healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): any; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts new file mode 100644 index 0000000..e9badb6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHideoutCallbacks.d.ts @@ -0,0 +1,23 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IHideoutUpgradeRequestData } from "../../eft/hideout/IHideoutUpgradeRequestData"; +import { IHideoutUpgradeCompleteRequestData } from "../../eft/hideout/IHideoutUpgradeCompleteRequestData"; +import { IHideoutScavCaseStartRequestData } from "../../eft/hideout/IHideoutScavCaseStartRequestData"; +import { IHideoutPutItemInRequestData } from "../../eft/hideout/IHideoutPutItemInRequestData"; +import { IHideoutTakeItemOutRequestData } from "../../eft/hideout/IHideoutTakeItemOutRequestData"; +import { IHideoutToggleAreaRequestData } from "../../eft/hideout/IHideoutToggleAreaRequestData"; +import { IHideoutSingleProductionStartRequestData } from "../../eft/hideout/IHideoutSingleProductionStartRequestData"; +import { IHideoutContinousProductionStartRequestData } from "../../eft/hideout/IHideoutContinousProductionStartRequestData"; +import { IHideoutTakeProductionRequestData } from "../../eft/hideout/IHideoutTakeProductionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IHideoutCallbacks { + upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse; + upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse; + putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse; + takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse; + toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse; + singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse; + continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse; + takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHttpCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHttpCallbacks.d.ts new file mode 100644 index 0000000..3ecd945 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IHttpCallbacks.d.ts @@ -0,0 +1,5 @@ +export interface IHttpCallbacks { + load(): void; + sendImage(sessionID: string, req: any, resp: any, body: any): void; + getImage(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInraidCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInraidCallbacks.d.ts new file mode 100644 index 0000000..e959b98 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInraidCallbacks.d.ts @@ -0,0 +1,14 @@ +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IRegisterPlayerRequestData } from "../../eft/inRaid/IRegisterPlayerRequestData"; +import { ISaveProgressRequestData } from "../../eft/inRaid/ISaveProgressRequestData"; +export interface IInraidCallbacks { + onLoad(sessionID: string): IAkiProfile; + registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData; + saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData; + getRaidEndState(): string; + getRaidMenuSettings(url: string, info: IEmptyRequestData, sessionID: string): string; + getWeaponDurability(url: string, info: any, sessionID: string): string; + getAirdropConfig(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts new file mode 100644 index 0000000..082112d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInsuranceCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAkiProfile } from "../../eft/profile/IAkiProfile"; +import { IGetInsuranceCostRequestData } from "../../eft/insurance/IGetInsuranceCostRequestData"; +import { IInsureRequestData } from "../../eft/insurance/IInsureRequestData"; +export interface IInsuranceCallbacks { + onLoad(sessionID: string): IAkiProfile; + getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): any; + insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): any; + update(secondsSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts new file mode 100644 index 0000000..e53f7d0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IInventoryCallbacks.d.ts @@ -0,0 +1,36 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IInventoryFoldRequestData } from "../../eft/inventory/IInventoryFoldRequestData"; +import { IInventorySplitRequestData } from "../../eft/inventory/IInventorySplitRequestData"; +import { IInventoryMoveRequestData } from "../../eft/inventory/IInventoryMoveRequestData"; +import { IInventoryMergeRequestData } from "../../eft/inventory/IInventoryMergeRequestData"; +import { IInventoryRemoveRequestData } from "../../eft/inventory/IInventoryRemoveRequestData"; +import { IInventoryTransferRequestData } from "../../eft/inventory/IInventoryTransferRequestData"; +import { IInventorySwapRequestData } from "../../eft/inventory/IInventorySwapRequestData"; +import { IInventoryToggleRequestData } from "../../eft/inventory/IInventoryToggleRequestData"; +import { IInventoryTagRequestData } from "../../eft/inventory/IInventoryTagRequestData"; +import { IInventoryBindRequestData } from "../../eft/inventory/IInventoryBindRequestData"; +import { IInventoryExamineRequestData } from "../../eft/inventory/IInventoryExamineRequestData"; +import { IInventoryReadEncyclopediaRequestData } from "../../eft/inventory/IInventoryReadEncyclopediaRequestData"; +import { IInventorySortRequestData } from "../../eft/inventory/IInventorySortRequestData"; +import { IInventoryCreateMarkerRequestData } from "../../eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "../../eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "../../eft/inventory/IInventoryEditMarkerRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IInventoryCallbacks { + moveItem(pmcData: IPmcData, body: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse; + removeItem(pmcData: IPmcData, body: IInventoryRemoveRequestData, sessionID: string): IItemEventRouterResponse; + splitItem(pmcData: IPmcData, body: IInventorySplitRequestData, sessionID: string): IItemEventRouterResponse; + mergeItem(pmcData: IPmcData, body: IInventoryMergeRequestData, sessionID: string): IItemEventRouterResponse; + transferItem(pmcData: IPmcData, body: IInventoryTransferRequestData, sessionID: string): IItemEventRouterResponse; + swapItem(pmcData: IPmcData, body: IInventorySwapRequestData, sessionID: string): IItemEventRouterResponse; + foldItem(pmcData: IPmcData, body: IInventoryFoldRequestData, sessionID: string): IItemEventRouterResponse; + toggleItem(pmcData: IPmcData, body: IInventoryToggleRequestData, sessionID: string): IItemEventRouterResponse; + tagItem(pmcData: IPmcData, body: IInventoryTagRequestData, sessionID: string): IItemEventRouterResponse; + bindItem(pmcData: IPmcData, body: IInventoryBindRequestData, sessionID: string): IItemEventRouterResponse; + examineItem(pmcData: IPmcData, body: IInventoryExamineRequestData, sessionID: string): IItemEventRouterResponse; + readEncyclopedia(pmcData: IPmcData, body: IInventoryReadEncyclopediaRequestData, sessionID: string): IItemEventRouterResponse; + sortInventory(pmcData: IPmcData, body: IInventorySortRequestData, sessionID: string): IItemEventRouterResponse; + createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse; + deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse; + editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts new file mode 100644 index 0000000..59db771 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IItemEventCallbacks.d.ts @@ -0,0 +1,6 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IItemEventRouterRequest } from "../../eft/itemEvent/IItemEventRouterRequest"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IItemEventCallbacks { + handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts new file mode 100644 index 0000000..52dfec6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ILauncherCallbacks.d.ts @@ -0,0 +1,20 @@ +import { IRegisterData } from "../../eft/launcher/IRegisterData"; +import { IRemoveProfileData } from "../../eft/launcher/IRemoveProfileData"; +import { ILoginRequestData } from "../../eft/launcher/ILoginRequestData"; +import { IChangeRequestData } from "../../eft/launcher/IChangeRequestData"; +import { IGetMiniProfileRequestData } from "../../eft/launcher/IGetMiniProfileRequestData.js"; +export interface ILauncherCallbacks { + connect(): string; + login(url: string, info: ILoginRequestData, sessionID: string): string; + register(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + get(url: string, info: ILoginRequestData, sessionID: string): string; + changeUsername(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + changePassword(url: string, info: IChangeRequestData, sessionID: string): "FAILED" | "OK"; + wipe(url: string, info: IRegisterData, sessionID: string): "FAILED" | "OK"; + getMiniProfile(url: string, info: IGetMiniProfileRequestData, sessionID: string): string; + getAllMiniProfiles(url: string, info: any, sessionID: string): string; + getServerVersion(): string; + ping(url: string, info: any, sessionID: string): string; + removeProfile(url: string, info: IRemoveProfileData, sessionID: string): string; + getCompatibleTarkovVersion(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ILocationCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ILocationCallbacks.d.ts new file mode 100644 index 0000000..71656a4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ILocationCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IGetLocationRequestData } from "../../eft/location/IGetLocationRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ILocationsGenerateAllResponse } from "../../eft/common/ILocationsSourceDestinationBase"; +import { ILocationBase } from "../../eft/common/ILocationBase"; +export interface ILocationCallbacks { + getLocationData(url: string, info: any, sessionID: string): IGetBodyResponseData; + getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IMatchCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IMatchCallbacks.d.ts new file mode 100644 index 0000000..fcbf173 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IMatchCallbacks.d.ts @@ -0,0 +1,25 @@ +import { IStartOfflineRaidRequestData } from "../../eft/match/IStartOffineRaidRequestData"; +import { IEndOfflineRaidRequestData } from "../../eft/match/IEndOfflineRaidRequestData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IPmcData } from "../../eft/common/IPmcData"; +export interface IMatchCallbacks { + updatePing(url: string, info: any, sessionID: string): INullResponseData; + exitMatch(url: string, info: any, sessionID: string): INullResponseData; + exitToMenu(url: string, info: any, sessionID: string): INullResponseData; + startGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + stopGroupSearch(url: string, info: any, sessionID: string): INullResponseData; + sendGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + acceptGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + cancelGroupInvite(url: string, info: any, sessionID: string): INullResponseData; + putMetrics(url: string, info: any, sessionID: string): INullResponseData; + getProfile(url: string, info: any, sessionID: string): IGetBodyResponseData; + serverAvailable(url: string, info: any, sessionID: string): IGetBodyResponseData | IGetBodyResponseData; + joinMatch(url: string, info: any, sessionID: string): IGetBodyResponseData; + getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData; + getGroupStatus(url: string, info: any, sessionID: string): IGetBodyResponseData; + createGroup(url: string, info: any, sessionID: string): IGetBodyResponseData; + deleteGroup(url: string, info: any, sessionID: string): INullResponseData; + startOfflineRaid(url: string, info: IStartOfflineRaidRequestData, sessionID: string): INullResponseData; + endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IModCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IModCallbacks.d.ts new file mode 100644 index 0000000..1a4cd7b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IModCallbacks.d.ts @@ -0,0 +1,6 @@ +export interface IModCallbacks { + load(): void; + sendBundle(sessionID: string, req: any, resp: any, body: any): void; + getBundles(url: string, info: any, sessionID: string): string; + getBundle(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/INoteCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/INoteCallbacks.d.ts new file mode 100644 index 0000000..8453a4f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/INoteCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { INoteActionData } from "../../eft/notes/INoteActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface INoteCallbacks { + addNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + editNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; + deleteNote(pmcData: IPmcData, body: INoteActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/INotifierCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/INotifierCallbacks.d.ts new file mode 100644 index 0000000..a211310 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/INotifierCallbacks.d.ts @@ -0,0 +1,17 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INotifierChannel } from "../../eft/notifier/INotifier"; +import { ISelectProfileRequestData } from "../../eft/notifier/ISelectProfileRequestData"; +export interface INotifierCallbacks { + /** + * If we don't have anything to send, it's ok to not send anything back + * because notification requests can be long-polling. In fact, we SHOULD wait + * until we actually have something to send because otherwise we'd spam the client + * and the client would abort the connection due to spam. + */ + sendNotification(sessionID: string, req: any, resp: any, data: any): void; + getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData; + createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData; + notify(url: string, info: any, sessionID: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts new file mode 100644 index 0000000..97c6487 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IPresetBuildCallbacks.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IPresetBuildActionRequestData } from "../../eft/presetBuild/IPresetBuildActionRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { WeaponBuild } from "../../eft/profile/IAkiProfile"; +export interface IPresetBuildCallbacks { + getHandbookUserlist(url: string, info: any, sessionID: string): IGetBodyResponseData; + saveBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; + removeBuild(pmcData: IPmcData, body: IPresetBuildActionRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IPresetCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IPresetCallbacks.d.ts new file mode 100644 index 0000000..4169857 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IPresetCallbacks.d.ts @@ -0,0 +1,3 @@ +export interface IPresetCallbacks { + load(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IProfileCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IProfileCallbacks.d.ts new file mode 100644 index 0000000..9d4d2df --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IProfileCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../../eft/httpResponse/INullResponseData"; +import { IProfileChangeNicknameRequestData } from "../../eft/profile/IProfileChangeNicknameRequestData"; +import { IProfileChangeVoiceRequestData } from "../../eft/profile/IProfileChangeVoiceRequestData"; +import { IProfileCreateRequestData } from "../../eft/profile/IProfileCreateRequestData"; +import { IValidateNicknameRequestData } from "../../eft/profile/IValidateNicknameRequestData"; +import { ISearchFriendRequestData } from "../../eft/profile/ISearchFriendRequestData"; +import { ISearchFriendResponse } from "../../eft/profile/ISearchFriendResponse"; +export interface IProfileCallbacks { + onLoad(sessionID: string): any; + createProfile(url: string, info: IProfileCreateRequestData, sessionID: string): IGetBodyResponseData; + getProfileData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + regenerateScav(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + changeVoice(url: string, info: IProfileChangeVoiceRequestData, sessionID: string): INullResponseData; + changeNickname(url: string, info: IProfileChangeNicknameRequestData, sessionID: string): IGetBodyResponseData; + validateNickname(url: string, info: IValidateNicknameRequestData, sessionID: string): IGetBodyResponseData; + getReservedNickname(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + searchFriend(url: string, info: ISearchFriendRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IQuestCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IQuestCallbacks.d.ts new file mode 100644 index 0000000..1c4d0c3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IQuestCallbacks.d.ts @@ -0,0 +1,19 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IAcceptQuestRequestData } from "../../eft/quests/IAcceptQuestRequestData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IListQuestsRequestData } from "../../eft/quests/IListQuestsRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { ICompleteQuestRequestData } from "../../eft/quests/ICompleteQuestRequestData"; +import { IHandoverQuestRequestData } from "../../eft/quests/IHandoverQuestRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IPmcDataRepeatableQuest } from "../../eft/common/tables/IRepeatableQuests"; +import { IRepeatableQuestChangeRequest } from "../../eft/quests/IRepeatableQuestChangeRequest"; +export interface IQuestCallbacks { + changeRepeatableQuest(pmcData: IPmcData, body: IRepeatableQuestChangeRequest, sessionID: string): IItemEventRouterResponse; + acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse; + completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse; + handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse; + listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData; + activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts new file mode 100644 index 0000000..9282bd4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IRagfairCallbacks.d.ts @@ -0,0 +1,21 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { ISearchRequestData } from "../../eft/ragfair/ISearchRequestData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IGetMarketPriceRequestData } from "../../eft/ragfair/IGetMarketPriceRequestData"; +import { IAddOfferRequestData } from "../../eft/ragfair/IAddOfferRequestData"; +import { IRemoveOfferRequestData } from "../../eft/ragfair/IRemoveOfferRequestData"; +import { IExtendOfferRequestData } from "../../eft/ragfair/IExtendOfferRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IGetItemPriceResult } from "../../eft/ragfair/IGetItemPriceResult"; +export interface IRagfairCallbacks { + load(): void; + search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData; + getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData; + getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse; + removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse; + extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse; + update(timeSinceLastRun: number): boolean; + updatePlayer(timeSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IRepairCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IRepairCallbacks.d.ts new file mode 100644 index 0000000..e8183c9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IRepairCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IRepairActionDataRequest } from "../../eft/repair/IRepairActionDataRequest"; +import { ITraderRepairActionDataRequest } from "../../eft/repair/ITraderRepairActionDataRequest"; +export interface IRepairCallbacks { + traderRepair(pmcData: IPmcData, body: ITraderRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; + repair(pmcData: IPmcData, body: IRepairActionDataRequest, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ISaveCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ISaveCallbacks.d.ts new file mode 100644 index 0000000..1ad3b82 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ISaveCallbacks.d.ts @@ -0,0 +1,4 @@ +export interface ISaveCallbacks { + load(): void; + update(secondsSinceLastRun: number): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ITradeCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ITradeCallbacks.d.ts new file mode 100644 index 0000000..2f41d54 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ITradeCallbacks.d.ts @@ -0,0 +1,8 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IProcessRagfairTradeRequestData } from "../../eft/trade/IProcessRagfairTradeRequestData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBaseTradeRequestData } from "../../eft/trade/IProcessBaseTradeRequestData"; +export interface ITradeCallbacks { + processTrade(pmcData: IPmcData, body: IProcessBaseTradeRequestData, sessionID: string): IItemEventRouterResponse; + processRagfairTrade(pmcData: IPmcData, body: IProcessRagfairTradeRequestData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ITraderCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ITraderCallbacks.d.ts new file mode 100644 index 0000000..e0d7d06 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/ITraderCallbacks.d.ts @@ -0,0 +1,11 @@ +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +import { IBarterScheme, ITraderAssort, ITraderBase } from "../../eft/common/tables/ITrader"; +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +export interface ITraderCallbacks { + load(): void; + getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData>; + getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; + update(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts new file mode 100644 index 0000000..9ac72ae --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IWeatherCallbacks.d.ts @@ -0,0 +1,5 @@ +import { IGetBodyResponseData } from "../../eft/httpResponse/IGetBodyResponseData"; +import { IEmptyRequestData } from "../../eft/common/IEmptyRequestData"; +export interface IWeatherCallbacks { + getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts new file mode 100644 index 0000000..e5d519c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/callbacks/IWishlistCallbacks.d.ts @@ -0,0 +1,7 @@ +import { IPmcData } from "../../eft/common/IPmcData"; +import { IWishlistActionData } from "../../eft/wishlist/IWishlistActionData"; +import { IItemEventRouterResponse } from "../../eft/itemEvent/IItemEventRouterResponse"; +export interface IWishlistCallbacks { + addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; + removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IAirdropConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IAirdropConfig.d.ts new file mode 100644 index 0000000..f4aee89 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IAirdropConfig.d.ts @@ -0,0 +1,20 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IAirdropConfig extends IBaseConfig { + kind: "aki-airdrop"; + airdropChancePercent: AirdropChancePercent; + airdropMinOpenHeight: number; + airdropMaxOpenHeight: number; + planeMinFlyHeight: number; + planeMaxFlyHeight: number; + planeVolume: number; + airdropMinStartTimeSeconds: number; + airdropMaxStartTimeSeconds: number; +} +export interface AirdropChancePercent { + bigmap: number; + woods: number; + lighthouse: number; + shoreline: number; + interchange: number; + reserve: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IBaseConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IBaseConfig.d.ts new file mode 100644 index 0000000..8b6ba88 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IBaseConfig.d.ts @@ -0,0 +1,3 @@ +export interface IBaseConfig { + kind: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IBotConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IBotConfig.d.ts new file mode 100644 index 0000000..5fb9d93 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IBotConfig.d.ts @@ -0,0 +1,114 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IBotConfig extends IBaseConfig { + kind: "aki-bot"; + presetBatch: PresetBatch; + bosses: string[]; + durability: Durability; + lootNValue: LootNvalue; + revenge: Record; + pmc: PmcConfig; + showTypeInNickname: boolean; + maxBotCap: number; +} +export interface PresetBatch { + assault: number; + bossBully: number; + bossGluhar: number; + bossKilla: number; + bossKojaniy: number; + bossSanitar: number; + bossTagilla: number; + bossTest: number; + cursedAssault: number; + followerBully: number; + followerGluharAssault: number; + followerGluharScout: number; + followerGluharSecurity: number; + followerGluharSnipe: number; + followerKojaniy: number; + followerSanitar: number; + followerTagilla: number; + followerTest: number; + marksman: number; + pmcBot: number; + sectantPriest: number; + sectantWarrior: number; + gifter: number; + test: number; + exUsec: number; +} +export interface Durability { + default: DefaultDurability; + pmc: PmcDurability; + boss: BotDurability; + follower: BotDurability; + assault: BotDurability; + cursedassault: BotDurability; + marksman: BotDurability; + pmcbot: BotDurability; + exusec: BotDurability; + sectantpriest: BotDurability; + sectantwarrior: BotDurability; +} +export interface DefaultDurability { + armor: DefaultArmor; + weapon: WeaponDurability; +} +export interface DefaultArmor { + maxDelta: number; + minDelta: number; +} +export interface WeaponDurability { + lowestMax: number; + highestMax: number; + maxDelta: number; + minDelta: number; +} +export interface PmcDurability { + armor: PmcDurabilityArmor; + weapon: WeaponDurability; +} +export interface PmcDurabilityArmor { + lowestMaxPercent: number; + highestMaxPercent: number; + maxDelta: number; + minDelta: number; +} +export interface BotDurability { + armor: ArmorDurability; + weapon: WeaponDurability; +} +export interface ArmorDurability { + maxDelta: number; + minDelta: number; +} +export interface LootNvalue { + scav: number; + pmc: number; +} +export interface PmcConfig { + dynamicLoot: DynamicLoot; + cartridgeBlacklist: string[]; + difficulty: string; + isUsec: number; + chanceSameSideIsHostilePercent: number; + usecType: string; + bearType: string; + maxBackpackLootTotalRub: number; + maxPocketLootTotalRub: number; + maxVestLootTotalRub: number; + types: Types; + enemyTypes: string[]; +} +export interface DynamicLoot { + whitelist: string[]; + blacklist: string[]; + spawnLimits: Record; + moneyStackLimits: Record; +} +export interface Types { + assault: number; + cursedAssault: number; + pmcBot: number; + exUsec: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/ICoreConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/ICoreConfig.d.ts new file mode 100644 index 0000000..cfcaf61 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/ICoreConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ICoreConfig extends IBaseConfig { + kind: "aki-core"; + akiVersion: string; + projectName: string; + compatibleTarkovVersion: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHealthConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHealthConfig.d.ts new file mode 100644 index 0000000..fdbf656 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHealthConfig.d.ts @@ -0,0 +1,14 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHealthConfig extends IBaseConfig { + kind: "aki-health"; + healthMultipliers: HealthMultipliers; + save: Save; +} +export interface HealthMultipliers { + death: number; + blacked: number; +} +export interface Save { + health: boolean; + effects: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHideoutConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHideoutConfig.d.ts new file mode 100644 index 0000000..4658fa6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHideoutConfig.d.ts @@ -0,0 +1,27 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHideoutConfig extends IBaseConfig { + kind: "aki-hideout"; + runIntervalSeconds: number; + scavCase: ScavCase; + fuelDrainRateMultipler: number; +} +export interface ScavCase { + rewardParentBlacklist: string[]; + rewardItemBlacklist: any[]; + ammoRewards: AmmoRewards; + moneyRewards: MoneyRewards; +} +export interface AmmoRewards { + giveMultipleOfTen: boolean; + minAmount: number; +} +export interface MoneyRewards { + enabled: boolean; + rub: MinMax; + usd: MinMax; + eur: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHttpConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHttpConfig.d.ts new file mode 100644 index 0000000..c41d035 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IHttpConfig.d.ts @@ -0,0 +1,6 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IHttpConfig extends IBaseConfig { + kind: "aki-http"; + ip: string; + port: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInRaidConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInRaidConfig.d.ts new file mode 100644 index 0000000..baaf083 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInRaidConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInRaidConfig extends IBaseConfig { + kind: "aki-inraid"; + MIAOnRaidEnd: boolean; + raidMenuSettings: RaidMenuSettings; + save: Save; + carExtracts: string[]; + carExtractBaseStandingGain: number; + scavExtractGain: number; +} +export interface RaidMenuSettings { + aiAmount: string; + aiDifficulty: string; + bossEnabled: boolean; + scavWars: boolean; + taggedAndCursed: boolean; +} +export interface Save { + loot: boolean; + durability: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInsuranceConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInsuranceConfig.d.ts new file mode 100644 index 0000000..6e9c744 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInsuranceConfig.d.ts @@ -0,0 +1,7 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInsuranceConfig extends IBaseConfig { + kind: "aki-insurance"; + insuranceMultiplier: Record; + returnChancePercent: Record; + runIntervalSeconds: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInventoryConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInventoryConfig.d.ts new file mode 100644 index 0000000..ffffa41 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IInventoryConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IInventoryConfig extends IBaseConfig { + kind: "aki-inventory"; + newItemsMarkedFound: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/ILocationConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/ILocationConfig.d.ts new file mode 100644 index 0000000..0551d57 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/ILocationConfig.d.ts @@ -0,0 +1,24 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ILocationConfig extends IBaseConfig { + kind: "aki-location"; + looseLootMultiplier: LootMultiplier; + staticLootMultiplier: LootMultiplier; +} +export interface LootMultiplier { + bigmap: number; + develop: number; + factory4_day: number; + factory4_night: number; + interchange: number; + laboratory: number; + rezervbase: number; + shoreline: number; + woods: number; + hideout: number; + lighthouse: number; + privatearea: number; + suburbs: number; + tarkovstreets: number; + terminal: number; + town: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IMatchConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IMatchConfig.d.ts new file mode 100644 index 0000000..92c4d77 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IMatchConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IMatchConfig extends IBaseConfig { + kind: "aki-match"; + enabled: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IQuestConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IQuestConfig.d.ts new file mode 100644 index 0000000..be4a97b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IQuestConfig.d.ts @@ -0,0 +1,77 @@ +import { ELocationName } from "../../enums/ELocationName"; +import { IBaseConfig } from "./IBaseConfig"; +export interface IQuestConfig extends IBaseConfig { + kind: "aki-quest"; + redeemTime: number; + repeatableQuests: IRepeatableQuestConfig[]; +} +export interface IRepeatableQuestConfig { + name: string; + types: string[]; + resetTime: number; + numQuests: number; + minPlayerLevel: number; + rewardScaling: IRewardScaling; + locations: Record; + traderWhitelist: ITraderWhitelist[]; + questConfig: IQuestConfig; +} +export interface IRewardScaling { + levels: number[]; + experience: number[]; + roubles: number[]; + items: number[]; + reputation: number[]; + rewardSpread: number; +} +export interface ITraderWhitelist { + traderId: string; + questTypes: string[]; +} +export interface IQuestConfig { + Exploration: IExploration; + Completion: ICompletion; + Elimination: IElimination; +} +export interface IExploration { + maxExtracts: number; + specificExits: ISpecificExits; +} +export interface ISpecificExits { + probability: number; + passageRequirementWhitelist: string[]; +} +export interface ICompletion { + minRequestedAmount: number; + maxRequestedAmount: number; + minRequestedBulletAmount: number; + maxRequestedBulletAmount: number; + useWhitelist: boolean; + useBlacklist: boolean; +} +export interface IElimination { + targets: ITarget[]; + bodyPartProb: number; + bodyParts: IBodyPart[]; + specificLocationProb: number; + distLocationBlacklist: string[]; + distProb: number; + maxDist: number; + minDist: number; + maxKills: number; + minKills: number; +} +export interface IProbabilityObject { + key: string; + relativeProbability: number; + data?: any; +} +export interface ITarget extends IProbabilityObject { + data: IBossInfo; +} +export interface IBossInfo { + isBoss: boolean; +} +export interface IBodyPart extends IProbabilityObject { + data: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IRagfairConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IRagfairConfig.d.ts new file mode 100644 index 0000000..2d151ca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IRagfairConfig.d.ts @@ -0,0 +1,59 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRagfairConfig extends IBaseConfig { + kind: "aki-ragfair"; + runIntervalSeconds: number; + sell: Sell; + traders: Record; + dynamic: Dynamic; +} +export interface Sell { + fees: boolean; + chance: Chance; + time: Time; + reputation: Reputation; +} +export interface Chance { + base: number; + overprices: number; + underpriced: number; +} +export interface Time { + base: number; + min: number; + max: number; +} +export interface Reputation { + gain: number; + loss: number; +} +export interface Dynamic { + expiredOfferThreshold: number; + offerItemCount: MinMax; + price: MinMax; + endTimeSeconds: MinMax; + condition: Condition; + stackablePercent: MinMax; + nonStackableCount: MinMax; + rating: MinMax; + currencies: Record; + showAsSingleStack: string[]; + blacklist: Blacklist; +} +export interface MinMax { + min: number; + max: number; +} +export interface Condition { + conditionChance: number; + min: number; + max: number; +} +export interface Blacklist { + /** + * show/hide trader items that are blacklisted by bsg + */ + traderItems: boolean; + custom: string[]; + enableBsgList: boolean; + enableQuestList: boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IRepairConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IRepairConfig.d.ts new file mode 100644 index 0000000..4966eb5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IRepairConfig.d.ts @@ -0,0 +1,5 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IRepairConfig extends IBaseConfig { + kind: "aki-repair"; + priceMultiplier: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/ITraderConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/ITraderConfig.d.ts new file mode 100644 index 0000000..dab73e3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/ITraderConfig.d.ts @@ -0,0 +1,15 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface ITraderConfig extends IBaseConfig { + kind: "aki-trader"; + updateTime: UpdateTime[]; + updateTimeDefault: number; + fenceAssortSize: number; + fenceMaxPresetsCount: number; + fencePresetPriceMult: number; + minDurabilityForSale: number; + fenceItemIgnoreList: string[]; +} +export interface UpdateTime { + traderId: string; + seconds: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IWeatherConfig.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IWeatherConfig.d.ts new file mode 100644 index 0000000..c52cab3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/config/IWeatherConfig.d.ts @@ -0,0 +1,21 @@ +import { IBaseConfig } from "./IBaseConfig"; +export interface IWeatherConfig extends IBaseConfig { + kind: "aki-weather"; + acceleration: number; + weather: Weather; +} +export interface Weather { + clouds: MinMax; + windSpeed: MinMax; + windDirection: MinMax; + windGustiness: MinMax; + rain: MinMax; + rainIntensity: MinMax; + fog: MinMax; + temp: MinMax; + pressure: MinMax; +} +export interface MinMax { + min: number; + max: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/controllers/IBotController.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/controllers/IBotController.d.ts new file mode 100644 index 0000000..010e208 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/controllers/IBotController.d.ts @@ -0,0 +1,13 @@ +import { IGenerateBotsRequestData } from "../../eft/bot/IGenerateBotsRequestData"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { Difficulty } from "../../eft/common/tables/IBotType"; +export interface IBotController { + getBotLimit(type: string): number; + getBotDifficulty(type: string, difficulty: string): IBotCore | Difficulty; + isBotPmc(botRole: string): boolean; + isBotBoss(botRole: string): boolean; + isBotFollower(botRole: string): boolean; + generate(info: IGenerateBotsRequestData, playerScav: boolean): IBotBase[]; + getBotCap(): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IBotGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IBotGenerator.d.ts new file mode 100644 index 0000000..f3e8586 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IBotGenerator.d.ts @@ -0,0 +1,10 @@ +import { Inventory as PmcInventory } from "../../eft/common/IPmcData"; +import { Inventory, Chances, Generation } from "../../eft/common/tables/IBotType"; +export interface IBotGenerator { + generateInventory(templateInventory: Inventory, equipmentChances: Chances, generation: Generation, botRole: string, isPmc: boolean): PmcInventory; +} +export interface IExhaustableArray { + getRandomValue(): T; + getFirstValue(): T; + hasValues(): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/ILocationGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/ILocationGenerator.d.ts new file mode 100644 index 0000000..530ceca --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/ILocationGenerator.d.ts @@ -0,0 +1,6 @@ +import { IStaticContainerProps, IStaticLootDetails, IStaticAmmoDetails, IStaticForcedProps } from "../../eft/common/tables/ILootBase"; +import { ILooseLoot, SpawnpointTemplate } from "../../eft/common/ILooseLoot"; +export interface ILocationGenerator { + generateContainerLoot(containerIn: IStaticContainerProps, staticForced: IStaticForcedProps[], staticLootDist: Record, staticAmmoDist: Record, locationName: string): IStaticContainerProps; + generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record, locationName: string): SpawnpointTemplate[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IPMCLootGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IPMCLootGenerator.d.ts new file mode 100644 index 0000000..a9db89b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IPMCLootGenerator.d.ts @@ -0,0 +1,4 @@ +export interface IPMCLootGenerator { + generatePMCPocketLootPool(): string[]; + generatePMCBackpackLootPool(): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts new file mode 100644 index 0000000..6670540 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IRagfairAssortGenerator.d.ts @@ -0,0 +1,4 @@ +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairAssortGenerator { + getAssortItems(): Item[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts new file mode 100644 index 0000000..30b4be5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/generators/IRagfairOfferGenerator.d.ts @@ -0,0 +1,6 @@ +import { IBarterScheme } from "../../eft/common/tables/ITrader"; +import { IRagfairOffer } from "../../eft/ragfair/IRagfairOffer"; +import { Item } from "../../eft/common/tables/IItem"; +export interface IRagfairOfferGenerator { + createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece: boolean): IRagfairOffer; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/helpers/Traders.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/helpers/Traders.d.ts new file mode 100644 index 0000000..e935d29 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/helpers/Traders.d.ts @@ -0,0 +1,10 @@ +export declare const enum Traders { + PRAPOR = "54cb50c76803fa8b248b4571", + THERAPIST = "54cb57776803fa99248b456e", + FENCE = "579dc571d53a0658a154fbec", + SKIER = "58330581ace78e27b8b10cee", + PEACEKEEPER = "5935c25fb3acc3127c3d8cd9", + MECHANIC = "5a7c2eca46aef81a7ca2145d", + RAGMAN = "5ac3b934156ae10c4430e83c", + JAEGER = "5c0647fdd443bc2504c2d371" +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IMod.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IMod.d.ts new file mode 100644 index 0000000..e6eec79 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IMod.d.ts @@ -0,0 +1,10 @@ +export declare namespace ModLoader { + interface IMod { + name: string; + version: string; + main?: string; + author?: string; + license: string; + dependencies?: Record; + } +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IModLoader.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IModLoader.d.ts new file mode 100644 index 0000000..40a5e19 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IModLoader.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +export interface IModLoader { + load(container: DependencyContainer): void; + getBundles(local: boolean): string; + getBundle(key: string, local: boolean): void; + getModPath(mod: string): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IPackageJsonData.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IPackageJsonData.d.ts new file mode 100644 index 0000000..09472cd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/mod/IPackageJsonData.d.ts @@ -0,0 +1,11 @@ +export interface IPackageJsonData { + incompatibilities?: string[]; + dependencies?: string[]; + name: string; + author: string; + version: string; + akiVersion: string; + licence: string; + main: string; + contributors: string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts new file mode 100644 index 0000000..c7d246a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/ragfair/IRagfairServerPrices.d.ts @@ -0,0 +1,4 @@ +export interface IRagfairServerPrices { + static: Record; + dynamic: Record; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/server/IDatabaseTables.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/IDatabaseTables.d.ts new file mode 100644 index 0000000..dbb71be --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/IDatabaseTables.d.ts @@ -0,0 +1,51 @@ +import { IGlobals } from "../../eft/common/IGlobals"; +import { IBotBase } from "../../eft/common/tables/IBotBase"; +import { IBotCore } from "../../eft/common/tables/IBotCore"; +import { IBotType } from "../../eft/common/tables/IBotType"; +import { ICustomizationItem } from "../../eft/common/tables/ICustomizationItem"; +import { IHandbookBase } from "../../eft/common/tables/IHandbookBase"; +import { ILootBase } from "../../eft/common/tables/ILootBase"; +import { IQuest } from "../../eft/common/tables/IQuest"; +import { IRepeatableQuestDatabase } from "../../eft/common/tables/IRepeatableQuests"; +import { ITemplateItem } from "../../eft/common/tables/ITemplateItem"; +import { ITrader } from "../../eft/common/tables/ITrader"; +import { IHideoutArea } from "../../eft/hideout/IHideoutArea"; +import { IHideoutProduction } from "../../eft/hideout/IHideoutProduction"; +import { IHideoutScavCase } from "../../eft/hideout/IHideoutScavCase"; +import { IHideoutSettingsBase } from "../../eft/hideout/IHideoutSettingsBase"; +import { ILocaleBase } from "./ILocaleBase"; +import { ILocations } from "./ILocations"; +import { IServerBase } from "./IServerBase"; +import { ISettingsBase } from "./ISettingsBase"; +export interface IDatabaseTables { + bots: { + types: Record; + base: IBotBase; + core: IBotCore; + }; + hideout: { + areas: IHideoutArea[]; + production: IHideoutProduction[]; + scavcase: IHideoutScavCase[]; + settings: IHideoutSettingsBase; + }; + locales: ILocaleBase; + locations: ILocations; + loot: ILootBase; + match: any; + templates: { + character: string[]; + items: Record; + quests: IQuest[]; + repeatableQuests: IRepeatableQuestDatabase; + clientItems: Record; + handbook: IHandbookBase; + customization: Record; + profiles: any; + prices: Record; + }; + traders: Record; + globals: IGlobals; + server: IServerBase; + settings: ISettingsBase; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/server/IHttpServer.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/IHttpServer.d.ts new file mode 100644 index 0000000..c828399 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/IHttpServer.d.ts @@ -0,0 +1,12 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { INotification } from "../../eft/notifier/INotifier"; +export interface IHttpServer { + load(): void; + getCookies(req: http.IncomingMessage): any; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + sendMessage(sessionID: string, output: INotification): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/server/ILocaleBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/ILocaleBase.d.ts new file mode 100644 index 0000000..8887c06 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/ILocaleBase.d.ts @@ -0,0 +1,61 @@ +export interface ILocaleBase { + global: Record; + menu: Record; + languages: ILanguageBase[]; +} +export interface ILocaleGlobalBase { + interface: Record; + enum: any[]; + mail: Record; + quest: Record; + preset: Record; + handbook: Record; + season: Record; + customization: Record; + repeatableQuest: Record; + templates: ILocaleTemplateBase; + locations: ILocaleLocationsBase; + banners: ILocaleBannersBase; + trading: ILocaleTradingBase; +} +export interface ILocaleQuest { + name: string; + description: string; + note: string; + failMessageText: string; + startedMessageText: string; + successMessageText: string; + conditions: Record; + location: string; +} +export interface ILocalePreset { + Name: string; +} +export interface ILocaleTemplateBase { + templates: Record; +} +export interface ILocaleLocationsBase { + locations: Record; +} +export interface ILocaleBannersBase { + locations: Record; +} +export interface ILocaleProps { + Name: string; + ShortName: string; + Description: string; +} +export interface ILocaleTradingBase { + locations: Record; +} +export interface ILocaleTradingProps { + FullName: string; + FirstName: string; + Nickname: string; + Location: string; + Description: string; +} +export interface ILanguageBase { + ShortName: string; + Name: string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/server/ILocations.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/ILocations.d.ts new file mode 100644 index 0000000..18f0262 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/ILocations.d.ts @@ -0,0 +1,26 @@ +import { ILocationBase } from "../../eft/common/ILocationBase"; +import { ILooseLoot } from "../../eft/common/ILooseLoot"; +import { ILocationsBase } from "../../eft/common/tables/ILocationsBase"; +export interface ILocations { + bigmap?: ILocationData; + develop?: ILocationData; + factory4_day?: ILocationData; + factory4_night?: ILocationData; + hideout?: ILocationData; + interchange?: ILocationData; + laboratory?: ILocationData; + lighthouse?: ILocationData; + privatearea?: ILocationData; + rezervbase?: ILocationData; + shoreline?: ILocationData; + suburbs?: ILocationData; + tarkovstreets?: ILocationData; + terminal?: ILocationData; + town?: ILocationData; + woods?: ILocationData; + base?: ILocationsBase; +} +export interface ILocationData { + base: ILocationBase; + looseLoot?: ILooseLoot; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/server/IServerBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/IServerBase.d.ts new file mode 100644 index 0000000..d033db3 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/IServerBase.d.ts @@ -0,0 +1,4 @@ +export interface IServerBase { + ip: string; + port: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/server/ISettingsBase.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/ISettingsBase.d.ts new file mode 100644 index 0000000..c067cda --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/server/ISettingsBase.d.ts @@ -0,0 +1,43 @@ +export interface ISettingsBase { + config: Config; +} +export interface Config { + AFKTimeoutSeconds: number; + AdditionalRandomDelaySeconds: number; + ClientSendRateLimit: number; + CriticalRetriesCount: number; + DefaultRetriesCount: number; + FirstCycleDelaySeconds: number; + FramerateLimit: FramerateLimit; + GroupStatusInterval: number; + KeepAliveInterval: number; + Mark502and504AsNonImportant: boolean; + MemoryManagementSettings: MemoryManagementSettings; + NVidiaHighlights: boolean; + NextCycleDelaySeconds: number; + PingServerResultSendInterval: number; + PingServersInterval: number; + ReleaseProfiler: ReleaseProfiler; + SecondCycleDelaySeconds: number; + TurnOffLogging: boolean; + WeaponOverlapDistanceCulling: number; + WebDiagnosticsEnabled: boolean; +} +export interface FramerateLimit { + MaxFramerateGameLimit: number; + MaxFramerateLobbyLimit: number; + MinFramerateLimit: number; +} +export interface MemoryManagementSettings { + AggressiveGC: boolean; + GigabytesRequiredToDisableGCDuringRaid: number; + HeapPreAllocationEnabled: boolean; + HeapPreAllocationMB: number; + OverrideRamCleanerSettings: boolean; + RamCleanerEnabled: boolean; +} +export interface ReleaseProfiler { + Enabled: boolean; + MaxRecords: number; + RecordTriggerValue: number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/IAsyncQueue.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/IAsyncQueue.d.ts new file mode 100644 index 0000000..2be801a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/IAsyncQueue.d.ts @@ -0,0 +1,4 @@ +import { ICommand } from "./ICommand"; +export interface IAsyncQueue { + waitFor(command: ICommand): Promise; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/ICommand.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/ICommand.d.ts new file mode 100644 index 0000000..696bb83 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/ICommand.d.ts @@ -0,0 +1,4 @@ +export interface ICommand { + uuid: string; + cmd: () => Promise; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/ILogger.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/ILogger.d.ts new file mode 100644 index 0000000..c983701 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/ILogger.d.ts @@ -0,0 +1,10 @@ +import { Daum } from "../../eft/itemEvent/IItemEventRouterRequest"; +export interface ILogger { + writeToLogFile(data: string | Daum): void; + log(data: string | Record | Error, color: string): void; + error(data: string): void; + warning(data: string): void; + success(data: string): void; + info(data: string): void; + debug(data: string | Record, onlyShowInConsole?: boolean): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/IUuidGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/IUuidGenerator.d.ts new file mode 100644 index 0000000..3870469 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/models/spt/utils/IUuidGenerator.d.ts @@ -0,0 +1,3 @@ +export interface IUUidGenerator { + generate(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/HttpRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/HttpRouter.d.ts new file mode 100644 index 0000000..f75a47d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/HttpRouter.d.ts @@ -0,0 +1,16 @@ +/// +import { IncomingMessage } from "http"; +import { DynamicRouter, Router, StaticRouter } from "../di/Router"; +export declare class HttpRouter { + protected staticRouters: StaticRouter[]; + protected dynamicRoutes: DynamicRouter[]; + constructor(staticRouters: StaticRouter[], dynamicRoutes: DynamicRouter[]); + protected groupBy(list: T[], keyGetter: (t: T) => string): Map; + getResponse(req: IncomingMessage, info: any, sessionID: string): string; + protected handleRoute(url: string, info: any, sessionID: string, wrapper: ResponseWrapper, routers: Router[], dynamic: boolean): boolean; +} +declare class ResponseWrapper { + output: string; + constructor(output: string); +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/ImageRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/ImageRouter.d.ts new file mode 100644 index 0000000..ab03977 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/ImageRouter.d.ts @@ -0,0 +1,13 @@ +/// +import { IncomingMessage, ServerResponse } from "http"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ImageRouteService } from "../services/mod/image/ImageRouteService"; +import { VFS } from "../utils/VFS"; +export declare class ImageRouter { + protected vfs: VFS; + protected imageRouteService: ImageRouteService; + constructor(vfs: VFS, imageRouteService: ImageRouteService); + addRoute(key: string, valueToAdd: string): void; + sendImage(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any, httpServer: IHttpServer): void; + getImage(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/ItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/ItemEventRouter.d.ts new file mode 100644 index 0000000..b1ac5d9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/ItemEventRouter.d.ts @@ -0,0 +1,17 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { ItemEventRouterDefinition } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class ItemEventRouter { + protected logger: ILogger; + protected jsonUtil: JsonUtil; + protected profileHelper: ProfileHelper; + protected itemEventRouters: ItemEventRouterDefinition[]; + constructor(logger: ILogger, jsonUtil: JsonUtil, profileHelper: ProfileHelper, itemEventRouters: ItemEventRouterDefinition[]); + protected output: IItemEventRouterResponse; + handleEvents(info: IItemEventRouterRequest, sessionID: string): IItemEventRouterResponse; + getOutput(sessionID: string): IItemEventRouterResponse; + protected resetOutput(sessionID: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/BotDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/BotDynamicRouter.d.ts new file mode 100644 index 0000000..6d0ab4b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/BotDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BotDynamicRouter extends DynamicRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/BundleDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/BundleDynamicRouter.d.ts new file mode 100644 index 0000000..a765410 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/BundleDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class BundleDynamicRouter extends DynamicRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts new file mode 100644 index 0000000..2db7cc5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/CustomizationDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class CustomizationDynamicRouter extends DynamicRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/DataDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/DataDynamicRouter.d.ts new file mode 100644 index 0000000..836ed8d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/DataDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class DataDynamicRouter extends DynamicRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/HttpDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/HttpDynamicRouter.d.ts new file mode 100644 index 0000000..a152b4d --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/HttpDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter } from "../../di/Router"; +import { ImageRouter } from "../ImageRouter"; +export declare class HttpDynamicRouter extends DynamicRouter { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/InraidDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/InraidDynamicRouter.d.ts new file mode 100644 index 0000000..7c0561f --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/InraidDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class InraidDynamicRouter extends DynamicRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); + getTopLevelRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/LocationDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/LocationDynamicRouter.d.ts new file mode 100644 index 0000000..b8e5cdf --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/LocationDynamicRouter.d.ts @@ -0,0 +1,7 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class LocationDynamicRouter extends DynamicRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); + getTopLevelRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/NotifierDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/NotifierDynamicRouter.d.ts new file mode 100644 index 0000000..83c60c5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/NotifierDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class NotifierDynamicRouter extends DynamicRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/TraderDynamicRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/TraderDynamicRouter.d.ts new file mode 100644 index 0000000..5b7cc1b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/dynamic/TraderDynamicRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { DynamicRouter } from "../../di/Router"; +export declare class TraderDynamicRouter extends DynamicRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/CustomizationItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/CustomizationItemEventRouter.d.ts new file mode 100644 index 0000000..e78445e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/CustomizationItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class CustomizationItemEventRouter extends ItemEventRouterDefinition { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/HealthItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/HealthItemEventRouter.d.ts new file mode 100644 index 0000000..99847c6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/HealthItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HealthItemEventRouter extends ItemEventRouterDefinition { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/HideoutItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/HideoutItemEventRouter.d.ts new file mode 100644 index 0000000..e1e98af --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/HideoutItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { HideoutCallbacks } from "../../callbacks/HideoutCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class HideoutItemEventRouter extends ItemEventRouterDefinition { + protected hideoutCallbacks: HideoutCallbacks; + constructor(hideoutCallbacks: HideoutCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/InsuranceItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/InsuranceItemEventRouter.d.ts new file mode 100644 index 0000000..a922cc0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/InsuranceItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InsuranceItemEventRouter extends ItemEventRouterDefinition { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/InventoryItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/InventoryItemEventRouter.d.ts new file mode 100644 index 0000000..2619bb9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/InventoryItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { InventoryCallbacks } from "../../callbacks/InventoryCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class InventoryItemEventRouter extends ItemEventRouterDefinition { + protected inventoryCallbacks: InventoryCallbacks; + constructor(inventoryCallbacks: InventoryCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/NoteItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/NoteItemEventRouter.d.ts new file mode 100644 index 0000000..59bf598 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/NoteItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { NoteCallbacks } from "../../callbacks/NoteCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class NoteItemEventRouter extends ItemEventRouterDefinition { + protected noteCallbacks: NoteCallbacks; + constructor(noteCallbacks: NoteCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts new file mode 100644 index 0000000..277db44 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/PresetBuildItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class PresetBuildItemEventRouter extends ItemEventRouterDefinition { + protected presetBuildCallbacks: PresetBuildCallbacks; + constructor(presetBuildCallbacks: PresetBuildCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/QuestItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/QuestItemEventRouter.d.ts new file mode 100644 index 0000000..db59c25 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/QuestItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class QuestItemEventRouter extends ItemEventRouterDefinition { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/RagfairItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/RagfairItemEventRouter.d.ts new file mode 100644 index 0000000..9216cc5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/RagfairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RagfairItemEventRouter extends ItemEventRouterDefinition { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/RepairItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/RepairItemEventRouter.d.ts new file mode 100644 index 0000000..5196ba9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/RepairItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { RepairCallbacks } from "../../callbacks/RepairCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class RepairItemEventRouter extends ItemEventRouterDefinition { + protected repairCallbacks: RepairCallbacks; + constructor(repairCallbacks: RepairCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/TradeItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/TradeItemEventRouter.d.ts new file mode 100644 index 0000000..a43bb0a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/TradeItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { TradeCallbacks } from "../../callbacks/TradeCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class TradeItemEventRouter extends ItemEventRouterDefinition { + protected tradeCallbacks: TradeCallbacks; + constructor(tradeCallbacks: TradeCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/item_events/WishlistItemEventRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/WishlistItemEventRouter.d.ts new file mode 100644 index 0000000..38497fb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/item_events/WishlistItemEventRouter.d.ts @@ -0,0 +1,10 @@ +import { IPmcData } from "../../models/eft/common/IPmcData"; +import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse"; +import { WishlistCallbacks } from "../../callbacks/WishlistCallbacks"; +import { HandledRoute, ItemEventRouterDefinition } from "../../di/Router"; +export declare class WishlistItemEventRouter extends ItemEventRouterDefinition { + protected wishlistCallbacks: WishlistCallbacks; + constructor(wishlistCallbacks: WishlistCallbacks); + getHandledRoutes(): HandledRoute[]; + handleItemEvent(url: string, pmcData: IPmcData, body: any, sessionID: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/save_load/HealthSaveLoadRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/save_load/HealthSaveLoadRouter.d.ts new file mode 100644 index 0000000..114f5b2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/save_load/HealthSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class HealthSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/save_load/InraidSaveLoadRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/save_load/InraidSaveLoadRouter.d.ts new file mode 100644 index 0000000..4c00b40 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/save_load/InraidSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InraidSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts new file mode 100644 index 0000000..30ce98e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/save_load/InsuranceSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class InsuranceSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts new file mode 100644 index 0000000..16c7619 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/save_load/ProfileSaveLoadRouter.d.ts @@ -0,0 +1,7 @@ +import { IAkiProfile } from "../../models/eft/profile/IAkiProfile"; +import { HandledRoute, SaveLoadRouter } from "../../di/Router"; +export declare class ProfileSaveLoadRouter extends SaveLoadRouter { + constructor(); + getHandledRoutes(): HandledRoute[]; + handleLoad(profile: IAkiProfile): IAkiProfile; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/serializers/BundleSerializer.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/serializers/BundleSerializer.d.ts new file mode 100644 index 0000000..912db83 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/serializers/BundleSerializer.d.ts @@ -0,0 +1,11 @@ +import { Serializer } from "../../di/Serializer"; +import { BundleLoader } from "../../loaders/BundleLoader"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { ILogger } from "../../models/spt/utils/ILogger"; +export declare class BundleSerializer extends Serializer { + protected logger: ILogger; + protected bundleLoader: BundleLoader; + constructor(logger: ILogger, bundleLoader: BundleLoader); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/serializers/ImageSerializer.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/serializers/ImageSerializer.d.ts new file mode 100644 index 0000000..0e040d4 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/serializers/ImageSerializer.d.ts @@ -0,0 +1,9 @@ +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +import { Serializer } from "../../di/Serializer"; +import { ImageRouter } from "../ImageRouter"; +export declare class ImageSerializer extends Serializer { + protected imageRouter: ImageRouter; + constructor(imageRouter: ImageRouter); + serialize(sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/serializers/NotifySerializer.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/serializers/NotifySerializer.d.ts new file mode 100644 index 0000000..1779ac9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/serializers/NotifySerializer.d.ts @@ -0,0 +1,11 @@ +import { NotifierController } from "../../controllers/NotifierController"; +import { Serializer } from "../../di/Serializer"; +import { HttpServerHelper } from "../../helpers/HttpServerHelper"; +import { IHttpServer } from "../../models/spt/server/IHttpServer"; +export declare class NotifySerializer extends Serializer { + protected notifierController: NotifierController; + protected httpServerHelper: HttpServerHelper; + constructor(notifierController: NotifierController, httpServerHelper: HttpServerHelper); + serialize(_sessionID: string, req: any, resp: any, body: any, httpServer: IHttpServer): void; + canHandle(route: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/BotStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/BotStaticRouter.d.ts new file mode 100644 index 0000000..aeea220 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/BotStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BotCallbacks } from "../../callbacks/BotCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BotStaticRouter extends StaticRouter { + protected botCallbacks: BotCallbacks; + constructor(botCallbacks: BotCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/BundleStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/BundleStaticRouter.d.ts new file mode 100644 index 0000000..fb682fc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/BundleStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { BundleCallbacks } from "../../callbacks/BundleCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class BundleStaticRouter extends StaticRouter { + protected bundleCallbacks: BundleCallbacks; + constructor(bundleCallbacks: BundleCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/CustomizationStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/CustomizationStaticRouter.d.ts new file mode 100644 index 0000000..21bc4bb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/CustomizationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { CustomizationCallbacks } from "../../callbacks/CustomizationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class CustomizationStaticRouter extends StaticRouter { + protected customizationCallbacks: CustomizationCallbacks; + constructor(customizationCallbacks: CustomizationCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/DataStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/DataStaticRouter.d.ts new file mode 100644 index 0000000..84ba7fd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/DataStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DataCallbacks } from "../../callbacks/DataCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DataStaticRouter extends StaticRouter { + protected dataCallbacks: DataCallbacks; + constructor(dataCallbacks: DataCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/DialogStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/DialogStaticRouter.d.ts new file mode 100644 index 0000000..546cdf1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/DialogStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { DialogueCallbacks } from "../../callbacks/DialogueCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class DialogStaticRouter extends StaticRouter { + protected dialogueCallbacks: DialogueCallbacks; + constructor(dialogueCallbacks: DialogueCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/GameStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/GameStaticRouter.d.ts new file mode 100644 index 0000000..a9a7496 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/GameStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { GameCallbacks } from "../../callbacks/GameCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class GameStaticRouter extends StaticRouter { + protected gameCallbacks: GameCallbacks; + constructor(gameCallbacks: GameCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/HealthStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/HealthStaticRouter.d.ts new file mode 100644 index 0000000..863fd5e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/HealthStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { HealthCallbacks } from "../../callbacks/HealthCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class HealthStaticRouter extends StaticRouter { + protected healthCallbacks: HealthCallbacks; + constructor(healthCallbacks: HealthCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/InraidStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/InraidStaticRouter.d.ts new file mode 100644 index 0000000..b29ad23 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/InraidStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InraidCallbacks } from "../../callbacks/InraidCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InraidStaticRouter extends StaticRouter { + protected inraidCallbacks: InraidCallbacks; + constructor(inraidCallbacks: InraidCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/InsuranceStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/InsuranceStaticRouter.d.ts new file mode 100644 index 0000000..5676499 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/InsuranceStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { InsuranceCallbacks } from "../../callbacks/InsuranceCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class InsuranceStaticRouter extends StaticRouter { + protected insuranceCallbacks: InsuranceCallbacks; + constructor(insuranceCallbacks: InsuranceCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/ItemEventStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/ItemEventStaticRouter.d.ts new file mode 100644 index 0000000..c30a7fc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/ItemEventStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ItemEventCallbacks } from "../../callbacks/ItemEventCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ItemEventStaticRouter extends StaticRouter { + protected itemEventCallbacks: ItemEventCallbacks; + constructor(itemEventCallbacks: ItemEventCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/LauncherStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/LauncherStaticRouter.d.ts new file mode 100644 index 0000000..0040cbd --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/LauncherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LauncherCallbacks } from "../../callbacks/LauncherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LauncherStaticRouter extends StaticRouter { + protected launcherCallbacks: LauncherCallbacks; + constructor(launcherCallbacks: LauncherCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/LocationStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/LocationStaticRouter.d.ts new file mode 100644 index 0000000..b6de956 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/LocationStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { LocationCallbacks } from "../../callbacks/LocationCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class LocationStaticRouter extends StaticRouter { + protected locationCallbacks: LocationCallbacks; + constructor(locationCallbacks: LocationCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/MatchStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/MatchStaticRouter.d.ts new file mode 100644 index 0000000..9920a92 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/MatchStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { MatchCallbacks } from "../../callbacks/MatchCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class MatchStaticRouter extends StaticRouter { + protected matchCallbacks: MatchCallbacks; + constructor(matchCallbacks: MatchCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/NotifierStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/NotifierStaticRouter.d.ts new file mode 100644 index 0000000..8f1f5cc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/NotifierStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { NotifierCallbacks } from "../../callbacks/NotifierCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class NotifierStaticRouter extends StaticRouter { + protected notifierCallbacks: NotifierCallbacks; + constructor(notifierCallbacks: NotifierCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/PresetStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/PresetStaticRouter.d.ts new file mode 100644 index 0000000..a9e7458 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/PresetStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { PresetBuildCallbacks } from "../../callbacks/PresetBuildCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class PresetStaticRouter extends StaticRouter { + protected presetCallbacks: PresetBuildCallbacks; + constructor(presetCallbacks: PresetBuildCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/ProfileStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/ProfileStaticRouter.d.ts new file mode 100644 index 0000000..83403f2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/ProfileStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { ProfileCallbacks } from "../../callbacks/ProfileCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class ProfileStaticRouter extends StaticRouter { + protected profileCallbacks: ProfileCallbacks; + constructor(profileCallbacks: ProfileCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/QuestStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/QuestStaticRouter.d.ts new file mode 100644 index 0000000..8f7ca0a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/QuestStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { QuestCallbacks } from "../../callbacks/QuestCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class QuestStaticRouter extends StaticRouter { + protected questCallbacks: QuestCallbacks; + constructor(questCallbacks: QuestCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/RagfairStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/RagfairStaticRouter.d.ts new file mode 100644 index 0000000..6c41467 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/RagfairStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { RagfairCallbacks } from "../../callbacks/RagfairCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class RagfairStaticRouter extends StaticRouter { + protected ragfairCallbacks: RagfairCallbacks; + constructor(ragfairCallbacks: RagfairCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/TraderStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/TraderStaticRouter.d.ts new file mode 100644 index 0000000..41728a1 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/TraderStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { TraderCallbacks } from "../../callbacks/TraderCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class TraderStaticRouter extends StaticRouter { + protected traderCallbacks: TraderCallbacks; + constructor(traderCallbacks: TraderCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/routers/static/WeatherStaticRouter.d.ts b/KcY-SeeItemValue/itemValue/server/types/routers/static/WeatherStaticRouter.d.ts new file mode 100644 index 0000000..72ed851 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/routers/static/WeatherStaticRouter.d.ts @@ -0,0 +1,6 @@ +import { WeatherCallbacks } from "../../callbacks/WeatherCallbacks"; +import { StaticRouter } from "../../di/Router"; +export declare class WeatherStaticRouter extends StaticRouter { + protected weatherCallbacks: WeatherCallbacks; + constructor(weatherCallbacks: WeatherCallbacks); +} diff --git a/KcY-SeeItemValue/itemValue/server/types/servers/ConfigServer.d.ts b/KcY-SeeItemValue/itemValue/server/types/servers/ConfigServer.d.ts new file mode 100644 index 0000000..a079be8 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/servers/ConfigServer.d.ts @@ -0,0 +1,14 @@ +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigTypes } from "../models/enums/ConfigTypes"; +export declare class ConfigServer { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected configs: Record; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil); + getConfig(configType: ConfigTypes): T; + getConfigByString(configType: string): T; + initialize(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/servers/DatabaseServer.d.ts b/KcY-SeeItemValue/itemValue/server/types/servers/DatabaseServer.d.ts new file mode 100644 index 0000000..aa152d0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/servers/DatabaseServer.d.ts @@ -0,0 +1,6 @@ +import { IDatabaseTables } from "../models/spt/server/IDatabaseTables"; +export declare class DatabaseServer { + protected tableData: IDatabaseTables; + getTables(): IDatabaseTables; + setTables(any: any): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/servers/HttpServer.d.ts b/KcY-SeeItemValue/itemValue/server/types/servers/HttpServer.d.ts new file mode 100644 index 0000000..5234966 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/servers/HttpServer.d.ts @@ -0,0 +1,49 @@ +/// +/// +import http, { ServerResponse } from "http"; +import { Serializer } from "../di/Serializer"; +import { HttpServerHelper } from "../helpers/HttpServerHelper"; +import { NotifierHelper } from "../helpers/NotifierHelper"; +import { INotification } from "../models/eft/notifier/INotifier"; +import { IHttpConfig } from "../models/spt/config/IHttpConfig"; +import { IHttpServer } from "../models/spt/server/IHttpServer"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { HttpRouter } from "../routers/HttpRouter"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +import { ConfigServer } from "./ConfigServer"; +import { DatabaseServer } from "./DatabaseServer"; +export declare class HttpServer implements IHttpServer { + protected httpRouter: HttpRouter; + protected logger: ILogger; + protected randomUtil: RandomUtil; + protected jsonUtil: JsonUtil; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected notifierHelper: NotifierHelper; + protected httpServerHelper: HttpServerHelper; + protected serializers: Serializer[]; + protected configServer: ConfigServer; + constructor(httpRouter: HttpRouter, // TODO: delay required + logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, notifierHelper: NotifierHelper, httpServerHelper: HttpServerHelper, serializers: Serializer[], configServer: ConfigServer); + protected buffers: {}; + protected onReceive: {}; + protected onRespond: {}; + protected httpConfig: IHttpConfig; + protected webSockets: {}; + protected websocketPingHandler: any; + getCookies(req: http.IncomingMessage): any; + resetBuffer(sessionID: string): void; + putInBuffer(sessionID: any, data: any, bufLength: number): boolean; + getFromBuffer(sessionID: string): any; + sendZlibJson(resp: any, output: any, sessionID: string): void; + sendMessage(sessionID: string, output: INotification): void; + sendFile(resp: ServerResponse, file: any): void; + isConnectionWebSocket(sessionID: string): boolean; + sendResponse(sessionID: string, req: any, resp: any, body: Buffer): void; + handleRequest(req: http.IncomingMessage, resp: http.ServerResponse): void; + load(): void; + protected getRandomisedMessage(): string; + wsOnConnection(ws: any, req: any): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/servers/RagfairServer.d.ts b/KcY-SeeItemValue/itemValue/server/types/servers/RagfairServer.d.ts new file mode 100644 index 0000000..60c92b5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/servers/RagfairServer.d.ts @@ -0,0 +1,31 @@ +import { RagfairOfferGenerator } from "../generators/RagfairOfferGenerator"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { RagfairCategoriesService } from "../services/RagfairCategoriesService"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { RagfairRequiredItemsService } from "../services/RagfairRequiredItemsService"; +import { ConfigServer } from "./ConfigServer"; +export declare class RagfairServer { + protected logger: ILogger; + protected ragfairOfferGenerator: RagfairOfferGenerator; + protected ragfairOfferService: RagfairOfferService; + protected ragfairCategoriesService: RagfairCategoriesService; + protected ragfairRequiredItemsService: RagfairRequiredItemsService; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, ragfairOfferGenerator: RagfairOfferGenerator, ragfairOfferService: RagfairOfferService, ragfairCategoriesService: RagfairCategoriesService, ragfairRequiredItemsService: RagfairRequiredItemsService, configServer: ConfigServer); + load(): void; + update(): void; + getCategories(): Record; + /** + * Disable/Hide an offer from flea + * @param offerId + */ + hideOffer(offerId: string): void; + getOffer(offerID: string): IRagfairOffer; + getOffers(): IRagfairOffer[]; + removeOfferStack(offerID: string, amount: number): void; + doesOfferExist(offerId: string): boolean; + addPlayerOffers(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/servers/SaveServer.d.ts b/KcY-SeeItemValue/itemValue/server/types/servers/SaveServer.d.ts new file mode 100644 index 0000000..cb28f49 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/servers/SaveServer.d.ts @@ -0,0 +1,28 @@ +import { IAkiProfile, Info } from "../models/eft/profile/IAkiProfile"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +import { SaveLoadRouter } from "../di/Router"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class SaveServer { + protected vfs: VFS; + protected saveLoadRouters: SaveLoadRouter[]; + protected jsonUtil: JsonUtil; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected profileFilepath: string; + protected profiles: {}; + protected onSave: {}; + protected saveMd5: {}; + constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger); + load(): void; + save(): void; + getProfile(sessionId: string): IAkiProfile; + getProfiles(): Record; + deleteProfileById(sessionID: string): boolean; + createProfile(profileInfo: Info): void; + addProfile(profileDetails: IAkiProfile): void; + loadProfile(sessionID: string): void; + saveProfile(sessionID: string): void; + removeProfile(sessionID: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/FenceService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/FenceService.d.ts new file mode 100644 index 0000000..12723fb --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/FenceService.d.ts @@ -0,0 +1,39 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { FenceLevel } from "../models/eft/common/IGlobals"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +import { ITraderConfig } from "../models/spt/config/ITraderConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class FenceService { + protected logger: ILogger; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected randomUtil: RandomUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected configServer: ConfigServer; + protected fenceAssort: ITraderAssort; + protected traderConfig: ITraderConfig; + constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, itemHelper: ItemHelper, presetHelper: PresetHelper, configServer: ConfigServer); + protected setFenceAssort(fenceAssort: ITraderAssort): void; + getFenceAssorts(): ITraderAssort; + hasExpiredCache(refreshAssort: boolean): boolean; + generateFenceAssortCache(pmcData: IPmcData): void; + /** + * + * @param pmcData Get the fence level the passed in profile has + * @returns FenceLevel + */ + getFenceInfo(pmcData: IPmcData): FenceLevel; + removeFenceOffer(assortIdToRemove: string): void; + updateFenceOffers(pmcData: IPmcData): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/HashCacheService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/HashCacheService.d.ts new file mode 100644 index 0000000..5320f28 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/HashCacheService.d.ts @@ -0,0 +1,19 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "../utils/HashUtil"; +import { JsonUtil } from "../utils/JsonUtil"; +import { VFS } from "../utils/VFS"; +export declare class HashCacheService { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected jsonUtil: JsonUtil; + protected logger: ILogger; + protected jsonHashes: any; + protected modHashes: any; + protected readonly modCachePath = "./user/cache/modCache.json"; + constructor(vfs: VFS, hashUtil: HashUtil, jsonUtil: JsonUtil, logger: ILogger); + getStoredModHash(modName: string): string; + modContentMatchesStoredHash(modName: string, modContent: string): boolean; + hashMatchesStoredHash(modName: string, modHash: string): boolean; + storeModContent(modName: string, modContent: string): void; + storeModHash(modName: string, modHash: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/InsuranceService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/InsuranceService.d.ts new file mode 100644 index 0000000..0219816 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/InsuranceService.d.ts @@ -0,0 +1,42 @@ +import { DialogueHelper } from "../helpers/DialogueHelper"; +import { SecureContainerHelper } from "../helpers/SecureContainerHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData"; +import { IInsuranceConfig } from "../models/spt/config/IInsuranceConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { RandomUtil } from "../utils/RandomUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class InsuranceService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + protected secureContainerHelper: SecureContainerHelper; + protected randomUtil: RandomUtil; + protected timeUtil: TimeUtil; + protected saveServer: SaveServer; + protected traderHelper: TraderHelper; + protected dialogueHelper: DialogueHelper; + protected configServer: ConfigServer; + protected insured: Record>; + protected templatesById: {}; + protected insuranceConfig: IInsuranceConfig; + constructor(logger: ILogger, databaseServer: DatabaseServer, secureContainerHelper: SecureContainerHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, saveServer: SaveServer, traderHelper: TraderHelper, dialogueHelper: DialogueHelper, configServer: ConfigServer); + insuranceExists(sessionId: string): boolean; + insuranceTraderArrayExists(sessionId: string, traderId: string): boolean; + getInsurance(sessionId: string): Record; + getInsuranceItems(sessionId: string, traderId: string): any[]; + resetInsurance(sessionId: string): void; + resetInsuranceTraderArray(sessionId: string, traderId: string): void; + addInsuranceItemToArray(sessionId: string, traderId: string, itemToAdd: any): void; + getItemPrice(_tpl: string): number; + generateTemplatesById(): void; + sendInsuredItems(pmcData: IPmcData, sessionID: string): void; + storeLostGear(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + storeInsuredItemsForReturn(pmcData: IPmcData, offraidData: ISaveProgressRequestData, preRaidGear: Item[], sessionID: string): void; + protected addGearToSend(pmcData: IPmcData, insuredItem: any, actualItem: any, sessionID: string): any; + getPremium(pmcData: IPmcData, inventoryItem: Item, traderId: string): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/MatchLocationService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/MatchLocationService.d.ts new file mode 100644 index 0000000..2b5fc0e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/MatchLocationService.d.ts @@ -0,0 +1,8 @@ +import { TimeUtil } from "../utils/TimeUtil"; +export declare class MatchLocationService { + protected timeUtil: TimeUtil; + protected locations: {}; + constructor(timeUtil: TimeUtil); + createGroup(sessionID: string, info: any): any; + deleteGroup(info: any): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/ModCompilerService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/ModCompilerService.d.ts new file mode 100644 index 0000000..26cb4ac --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/ModCompilerService.d.ts @@ -0,0 +1,20 @@ +import * as ts from "typescript"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { VFS } from "../utils/VFS"; +import { HashCacheService } from "./HashCacheService"; +export declare class ModCompilerService { + protected logger: ILogger; + protected hashCacheService: HashCacheService; + protected vfs: VFS; + constructor(logger: ILogger, hashCacheService: HashCacheService, vfs: VFS); + compileMod(modName: string, modPath: string, modTypeScriptFiles: string[]): Promise; + protected compile(fileNames: string[], options: ts.CompilerOptions): Promise; + protected buildDepth(depth: number): string; + protected getNodesModulesPath(depth: number): string; + protected getAkiPath(depth: number): string; + protected getAkiFolder(): string; + protected getNodesModulesFolder(): string; + protected calculateDepth(file: string): number; + protected areFilesReady(fileNames: string[]): boolean; + protected delay(ms: number): Promise; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/NotificationService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/NotificationService.d.ts new file mode 100644 index 0000000..7e2a127 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/NotificationService.d.ts @@ -0,0 +1,21 @@ +import { INotification } from "../models/eft/notifier/INotifier"; +export declare class NotificationService { + protected messageQueue: {}; + getMessageQueue(): {}; + getMessageFromQueue(sessionId: string): any; + updateMessageOnQueue(sessionId: string, value: any[]): void; + has(sessionID: string): boolean; + /** + * Pop first message from queue. + */ + pop(sessionID: string): any; + /** + * Add message to queue + */ + add(sessionID: string, message: INotification): void; + /** + * Get message queue for session + * @param sessionID + */ + get(sessionID: string): any; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/PaymentService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/PaymentService.d.ts new file mode 100644 index 0000000..5834750 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/PaymentService.d.ts @@ -0,0 +1,49 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { InventoryHelper } from "../helpers/InventoryHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { TraderHelper } from "../helpers/TraderHelper"; +import { IPmcData } from "../models/eft/common/IPmcData"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "../models/eft/trade/IProcessBuyTradeRequestData"; +import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTradeRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +export declare class PaymentService { + protected logger: ILogger; + protected httpResponse: HttpResponseUtil; + protected databaseServer: DatabaseServer; + protected handbookHelper: HandbookHelper; + protected traderHelper: TraderHelper; + protected itemHelper: ItemHelper; + protected inventoryHelper: InventoryHelper; + protected paymentHelper: PaymentHelper; + constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper); + /** + * Take money and insert items into return to server request + * @param {Object} pmcData + * @param {Object} body + * @param {string} sessionID + * @returns Object + */ + payMoney(pmcData: IPmcData, body: IProcessBuyTradeRequestData, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; + /** + * Receive money back after selling + * @param {IPmcData} pmcData + * @param {number} amount + * @param {IProcessSellTradeRequestData} body + * @param {IItemEventRouterResponse} output + * @param {string} sessionID + * @returns IItemEventRouterResponse + */ + getMoney(pmcData: IPmcData, amount: number, body: IProcessSellTradeRequestData, output: IItemEventRouterResponse, sessionID: string): IItemEventRouterResponse; + /** + * Recursively checks if the given item is + * inside the stash, that is it has the stash as + * ancestor with slotId=hideout + */ + protected isItemInStash(pmcData: IPmcData, item: Item): boolean; + addPaymentToOutput(pmcData: IPmcData, currencyTpl: string, amountToPay: number, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/PlayerService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/PlayerService.d.ts new file mode 100644 index 0000000..519b7e5 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/PlayerService.d.ts @@ -0,0 +1,22 @@ +import { IPmcData } from "../models/eft/common/IPmcData"; +import { IPlayerIncrementSkillLevelRequestData } from "../models/eft/player/IPlayerIncrementSkillLevelRequestData"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { DatabaseServer } from "../servers/DatabaseServer"; +export declare class PlayerService { + protected logger: ILogger; + protected databaseServer: DatabaseServer; + constructor(logger: ILogger, databaseServer: DatabaseServer); + /** + * increases the profile skill and updates any output + * @param {Object} pmcData + * @param {Object} output + * @param {String} skillName + * @param {Number} amount + */ + incrementSkillLevel(pmcData: IPmcData, output: IPlayerIncrementSkillLevelRequestData, skillName: string, amount: number): void; + /** + * @param {Object} pmcData + * @returns number + */ + calculateLevel(pmcData: IPmcData): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/RagfairCategoriesService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/RagfairCategoriesService.d.ts new file mode 100644 index 0000000..09956cc --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/RagfairCategoriesService.d.ts @@ -0,0 +1,10 @@ +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +export declare class RagfairCategoriesService { + updateCategories(offers: IRagfairOffer[]): void; + protected categories: Record; + getCategories(): Record; + getCategoryByItemId(itemId: string): number; + resetCategories(): void; + setCategoryValue(itemId: string, newValue: number): void; + incrementCategory(itemId: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/RagfairLinkedItemService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/RagfairLinkedItemService.d.ts new file mode 100644 index 0000000..6c34ee0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/RagfairLinkedItemService.d.ts @@ -0,0 +1,10 @@ +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem"; +export declare class RagfairLinkedItemService { + protected databaseServer: DatabaseServer; + protected linkedItemsCache: Record>; + constructor(databaseServer: DatabaseServer); + getLinkedItems(linkedSearchId: string): Iterable; + protected buildLinkedItemTable(): void; + protected getFilters(item: ITemplateItem, slot: string): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/RagfairOfferService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/RagfairOfferService.d.ts new file mode 100644 index 0000000..7afbf8c --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/RagfairOfferService.d.ts @@ -0,0 +1,66 @@ +import { ProfileHelper } from "../helpers/ProfileHelper"; +import { RagfairServerHelper } from "../helpers/RagfairServerHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +import { IRagfairOffer } from "../models/eft/ragfair/IRagfairOffer"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ItemEventRouter } from "../routers/ItemEventRouter"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { SaveServer } from "../servers/SaveServer"; +import { HttpResponseUtil } from "../utils/HttpResponseUtil"; +import { TimeUtil } from "../utils/TimeUtil"; +export declare class RagfairOfferService { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected databaseServer: DatabaseServer; + protected saveServer: SaveServer; + protected ragfairServerHelper: RagfairServerHelper; + protected profileHelper: ProfileHelper; + protected itemEventRouter: ItemEventRouter; + protected httpResponse: HttpResponseUtil; + protected configServer: ConfigServer; + protected playerOffersLoaded: boolean; + protected toUpdate: Record; + protected expiredOffers: Item[]; + protected offers: IRagfairOffer[]; + protected ragfairConfig: IRagfairConfig; + constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, profileHelper: ProfileHelper, itemEventRouter: ItemEventRouter, httpResponse: HttpResponseUtil, configServer: ConfigServer); + getOffers(): IRagfairOffer[]; + getOfferByOfferId(offerId: string): IRagfairOffer; + getOffersOfType(templateId: string): IRagfairOffer[]; + addOffer(offer: IRagfairOffer): void; + addOfferToExpired(offer: Item): void; + setTraderUpdateStatus(traderId: string, shouldUpdate: boolean): void; + shouldTraderBeUpdated(traderID: string): boolean; + getExpiredOfferCount(): number; + /** + * Get an array of expired items not yet processed into new offers + * @returns items that need to be turned into offers + */ + getExpiredOffers(): Item[]; + resetExpiredOffers(): void; + /** + * Does the offer exist on the ragfair + * @param offerId offer id to check for + * @returns offer exists - true + */ + doesOfferExist(offerId: string): boolean; + getTraders(): Record; + flagTraderForUpdate(expiredOfferUserId: string): void; + removeOfferById(offerId: string): void; + removeOfferStack(offerID: string, amount: number): void; + removeAllOffersByTrader(traderId: string): void; + addTradersToUpdateList(): void; + addPlayerOffers(): void; + expireStaleOffers(): void; + /** + * Get an array of stale offers that are still shown to player + * @returns IRagfairOffer array + */ + protected getStaleOffers(): IRagfairOffer[]; + protected isStale(offer: IRagfairOffer, time: number): boolean; + protected processStaleOffer(staleOffer: IRagfairOffer): void; + protected returnPlayerOffer(offer: IRagfairOffer): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/RagfairPriceService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/RagfairPriceService.d.ts new file mode 100644 index 0000000..5256b99 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/RagfairPriceService.d.ts @@ -0,0 +1,32 @@ +import { HandbookHelper } from "../helpers/HandbookHelper"; +import { ItemHelper } from "../helpers/ItemHelper"; +import { PresetHelper } from "../helpers/PresetHelper"; +import { Item } from "../models/eft/common/tables/IItem"; +import { IBarterScheme } from "../models/eft/common/tables/ITrader"; +import { IRagfairConfig } from "../models/spt/config/IRagfairConfig"; +import { IRagfairServerPrices } from "../models/spt/ragfair/IRagfairServerPrices"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { RandomUtil } from "../utils/RandomUtil"; +export declare class RagfairPriceService { + protected handbookHelper: HandbookHelper; + protected databaseServer: DatabaseServer; + protected logger: ILogger; + protected itemHelper: ItemHelper; + protected presetHelper: PresetHelper; + protected randomUtil: RandomUtil; + protected configServer: ConfigServer; + protected ragfairConfig: IRagfairConfig; + protected prices: IRagfairServerPrices; + constructor(handbookHelper: HandbookHelper, databaseServer: DatabaseServer, logger: ILogger, itemHelper: ItemHelper, presetHelper: PresetHelper, randomUtil: RandomUtil, configServer: ConfigServer); + generateStaticPrices(): void; + generateDynamicPrices(): void; + hasDynamicPrices(): boolean; + getDynamicPrice(itemTpl: string): number; + getAllFleaPrices(): Record; + getFleaPriceForItem(tplId: string): number; + getBarterPrice(barterScheme: IBarterScheme[]): number; + getDynamicOfferPrice(items: Item[], desiredCurrency: string): number; + getWeaponPresetPrice(item: Item, items: Item[], existingPrice: number): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/RagfairRequiredItemsService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/RagfairRequiredItemsService.d.ts new file mode 100644 index 0000000..b05fc65 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/RagfairRequiredItemsService.d.ts @@ -0,0 +1,12 @@ +import { PaymentHelper } from "../helpers/PaymentHelper"; +import { RagfairOfferService } from "../services/RagfairOfferService"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class RagfairRequiredItemsService { + protected logger: ILogger; + protected paymentHelper: PaymentHelper; + protected ragfairOfferService: RagfairOfferService; + protected requiredItemsCache: {}; + constructor(logger: ILogger, paymentHelper: PaymentHelper, ragfairOfferService: RagfairOfferService); + getRequiredItems(searchId: string): any; + buildRequiredItemTable(): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/TraderAssortService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/TraderAssortService.d.ts new file mode 100644 index 0000000..5ba2d05 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/TraderAssortService.d.ts @@ -0,0 +1,6 @@ +import { ITraderAssort } from "../models/eft/common/tables/ITrader"; +export declare class TraderAssortService { + protected pristineTraderAssorts: Record; + getPristineTraderAssort(traderId: string): ITraderAssort; + setPristineTraderAssort(traderId: string, assort: ITraderAssort): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts new file mode 100644 index 0000000..abfe237 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/mod/dynamicRouter/DynamicRouterMod.d.ts @@ -0,0 +1,6 @@ +import { DynamicRouter, RouteAction } from "../../../di/Router"; +export declare class DynamicRouterMod extends DynamicRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts new file mode 100644 index 0000000..6742fc6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/mod/dynamicRouter/DynamicRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class DynamicRouterModService { + private container; + constructor(container: DependencyContainer); + registerDynamicRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/mod/image/imageRouteService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/mod/image/imageRouteService.d.ts new file mode 100644 index 0000000..29569b2 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/mod/image/imageRouteService.d.ts @@ -0,0 +1,6 @@ +export declare class ImageRouteService { + protected routes: Record; + addRoute(urlKey: string, route: string): void; + getByKey(urlKey: string): string; + existsByKey(urlKey: string): boolean; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/mod/onLoad/OnLoadMod.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/mod/onLoad/OnLoadMod.d.ts new file mode 100644 index 0000000..53fb062 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/mod/onLoad/OnLoadMod.d.ts @@ -0,0 +1,8 @@ +import { OnLoad } from "../../../di/OnLoad"; +export declare class OnLoadMod extends OnLoad { + private onLoadOverride; + private getRouteOverride; + constructor(onLoadOverride: () => void, getRouteOverride: () => string); + onLoad(): void; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/mod/onLoad/OnLoadModService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/mod/onLoad/OnLoadModService.d.ts new file mode 100644 index 0000000..f402103 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/mod/onLoad/OnLoadModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnLoadModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnLoad(name: string, onLoad: () => void, getRoute: () => string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/mod/onUpdate/OnUpdateMod.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/mod/onUpdate/OnUpdateMod.d.ts new file mode 100644 index 0000000..ee89043 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/mod/onUpdate/OnUpdateMod.d.ts @@ -0,0 +1,8 @@ +import { OnUpdate } from "../../../di/OnUpdate"; +export declare class OnUpdateMod extends OnUpdate { + private onUpdateOverride; + private getRouteOverride; + constructor(onUpdateOverride: (timeSinceLastRun: number) => boolean, getRouteOverride: () => string); + onUpdate(timeSinceLastRun: number): boolean; + getRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/mod/onUpdate/OnUpdateModService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/mod/onUpdate/OnUpdateModService.d.ts new file mode 100644 index 0000000..05d735b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/mod/onUpdate/OnUpdateModService.d.ts @@ -0,0 +1,6 @@ +import { DependencyContainer } from "tsyringe"; +export declare class OnUpdateModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerOnUpdate(name: string, onUpdate: (timeSinceLastRun: number) => boolean, getRoute: () => string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/mod/staticRouter/StaticRouterMod.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/mod/staticRouter/StaticRouterMod.d.ts new file mode 100644 index 0000000..1e62747 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/mod/staticRouter/StaticRouterMod.d.ts @@ -0,0 +1,6 @@ +import { RouteAction, StaticRouter } from "../../../di/Router"; +export declare class StaticRouterMod extends StaticRouter { + private topLevelRoute; + constructor(routes: RouteAction[], topLevelRoute: string); + getTopLevelRoute(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/services/mod/staticRouter/StaticRouterModService.d.ts b/KcY-SeeItemValue/itemValue/server/types/services/mod/staticRouter/StaticRouterModService.d.ts new file mode 100644 index 0000000..f28fd45 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/services/mod/staticRouter/StaticRouterModService.d.ts @@ -0,0 +1,7 @@ +import { DependencyContainer } from "tsyringe"; +import { RouteAction } from "../../../di/Router"; +export declare class StaticRouterModService { + protected container: DependencyContainer; + constructor(container: DependencyContainer); + registerStaticRouter(name: string, routes: RouteAction[], topLevelRoute: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/App.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/App.d.ts new file mode 100644 index 0000000..34c141e --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/App.d.ts @@ -0,0 +1,14 @@ +import { TimeUtil } from "./TimeUtil"; +import { OnLoad } from "../di/OnLoad"; +import { OnUpdate } from "../di/OnUpdate"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class App { + protected logger: ILogger; + protected timeUtil: TimeUtil; + protected onLoadComponents: OnLoad[]; + protected onUpdateComponents: OnUpdate[]; + protected onUpdateLastRun: {}; + constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]); + load(): void; + protected update(onUpdateComponents: OnUpdate[]): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/AyncQueue.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/AyncQueue.d.ts new file mode 100644 index 0000000..da6ab18 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/AyncQueue.d.ts @@ -0,0 +1,7 @@ +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { ICommand } from "../models/spt/utils/ICommand"; +export declare class AsyncQueue implements IAsyncQueue { + protected commandsQueue: ICommand[]; + constructor(); + waitFor(command: ICommand): Promise; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/DatabaseImporter.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/DatabaseImporter.d.ts new file mode 100644 index 0000000..0857b67 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/DatabaseImporter.d.ts @@ -0,0 +1,18 @@ +import { VFS } from "./VFS"; +import { JsonUtil } from "./JsonUtil"; +import { DatabaseServer } from "../servers/DatabaseServer"; +import { ImageRouter } from "../routers/ImageRouter"; +import { OnLoad } from "../di/OnLoad"; +import { ILogger } from "../models/spt/utils/ILogger"; +export declare class DatabaseImporter extends OnLoad { + protected logger: ILogger; + protected vfs: VFS; + protected jsonUtil: JsonUtil; + protected databaseServer: DatabaseServer; + protected imageRouter: ImageRouter; + constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter); + onLoad(): void; + getRoute(): string; + loadRecursive(filepath: string): any; + loadImages(filepath: string): void; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/HashUtil.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/HashUtil.d.ts new file mode 100644 index 0000000..bacbf2a --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/HashUtil.d.ts @@ -0,0 +1,11 @@ +/// +import crypto from "crypto"; +import { TimeUtil } from "./TimeUtil"; +export declare class HashUtil { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + generate(): string; + generateMd5ForData(data: string): string; + generateSha1ForData(data: string): string; + generateHashForData(algorithm: string, data: crypto.BinaryLike): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/HttpResponseUtil.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/HttpResponseUtil.d.ts new file mode 100644 index 0000000..29502be --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/HttpResponseUtil.d.ts @@ -0,0 +1,16 @@ +import { JsonUtil } from "./JsonUtil"; +import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData"; +import { INullResponseData } from "../models/eft/httpResponse/INullResponseData"; +import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse"; +export declare class HttpResponseUtil { + protected jsonUtil: JsonUtil; + constructor(jsonUtil: JsonUtil); + protected clearString(s: string): any; + noBody(data: any): any; + getBody(data: T, err?: number, errmsg?: any): IGetBodyResponseData; + getUnclearedBody(data: any, err?: number, errmsg?: any): string; + emptyResponse(): IGetBodyResponseData; + nullResponse(): INullResponseData; + emptyArrayResponse(): IGetBodyResponseData; + appendErrorToOutput(output: IItemEventRouterResponse, message?: string, title?: string): IItemEventRouterResponse; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/JsonUtil.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/JsonUtil.d.ts new file mode 100644 index 0000000..71e95f6 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/JsonUtil.d.ts @@ -0,0 +1,25 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { HashUtil } from "./HashUtil"; +import { VFS } from "./VFS"; +export declare class JsonUtil { + protected vfs: VFS; + protected hashUtil: HashUtil; + protected logger: ILogger; + protected fileHashes: any; + constructor(vfs: VFS, hashUtil: HashUtil, logger: ILogger); + /** + * From object to string + * @param data object to turn into JSON + * @param prettify Should output be prettified? + * @returns string + */ + serialize(data: any, prettify?: boolean): string; + /** + * From string to object + * @param jsonString json string to turn into object + * @returns object + */ + deserialize(jsonString: string): any; + deserializeWithCacheCheck(jsonString: string, filePath: string): string; + clone(data: T): T; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/Logger.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/Logger.d.ts new file mode 100644 index 0000000..f5b774b --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/Logger.d.ts @@ -0,0 +1,51 @@ +/// +import { Daum } from "../models/eft/itemEvent/IItemEventRouterRequest"; +import { ILogger } from "../models/spt/utils/ILogger"; +import winston from "winston"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +import fs from "fs"; +interface SptLogger { + error: (msg: string | Record) => void; + warn: (msg: string | Record) => void; + succ?: (msg: string | Record) => void; + info: (msg: string | Record) => void; + debug: (msg: string | Record) => void; +} +export declare class WinstonLogger implements ILogger { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + protected showDebugInConsole: boolean; + protected folderPath: string; + protected file: string; + protected filePath: string; + protected logLevels: { + levels: { + error: number; + warn: number; + succ: number; + info: number; + custom: number; + debug: number; + }; + colors: { + error: string; + warn: string; + succ: string; + info: string; + custom: string; + debug: string; + }; + }; + protected logger: winston.Logger & SptLogger; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + writeToLogFile(data: string | Daum): Promise; + log(data: string | Error | Record, color: string): Promise; + error(data: string | Record): Promise; + warning(data: string | Record): Promise; + success(data: string | Record): Promise; + info(data: string | Record): Promise; + debug(data: string | Record, onlyShowInConsole?: boolean): Promise; +} +export {}; diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/MathUtil.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/MathUtil.d.ts new file mode 100644 index 0000000..ea5fd69 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/MathUtil.d.ts @@ -0,0 +1,53 @@ +export declare class MathUtil { + /** + * Helper to create the sum of all array elements + * @param {array} values The array with numbers of which to calculate the sum + * @return {number} sum(values) + */ + arraySum(values: number[]): number; + /** + * Helper to create the cumulative sum of all array elements + * arrayCumsum([1, 2, 3, 4]) = [1, 3, 6, 10] + * @param {array} values The array with numbers of which to calculate the cumulative sum + * @return {array} cumsum(values) + */ + arrayCumsum(values: number[]): number[]; + /** + * Helper to create the product of each element times factor + * @param {array} values The array of numbers which shall be multiplied by the factor + * @return {array} array times factor + */ + arrayProd(values: number[], factor: number): number[]; + /** + * Helper to add a constant to all array elements + * @param {array} values The array of numbers to which the summand should be added + * @return {array} array plus summand + */ + arrayAdd(values: number[], summand: number): number[]; + /** + * Map a value from an input range to an output range linearly + * + * Example: + * a_min = 0; a_max=1; + * b_min = 1; b_max=3; + * MathUtil.mapToRange(0.5, a_min, a_max, b_min, b_max) // returns 2 + * + * @param {number} x The value from input range to be mapped to output range + * @param {number} minIn min of input range + * @param {number} maxIn max of input range + * @param {number} minOut min of output range + * @param {number} maxOut max of outout range + * @return {number} the result of the mapping + */ + mapToRange(x: number, minIn: number, maxIn: number, minOut: number, maxOut: number): number; + /** + * Linear interpolation + * e.g. used to do a continuous integration for quest rewards which are defined for specific support centers of pmcLevel + * + * @param {string} xp the point of x at which to interpolate + * @param {array} x support points in x (of same length as y) + * @param {array} y support points in y (of same length as x) + * @return {number} y(xp) + */ + interp1(xp: number, x: number[], y: number[]): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/ObjectId.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/ObjectId.d.ts new file mode 100644 index 0000000..03aae56 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/ObjectId.d.ts @@ -0,0 +1,14 @@ +/// +import { TimeUtil } from "./TimeUtil"; +export declare class ObjectId { + protected timeUtil: TimeUtil; + constructor(timeUtil: TimeUtil); + protected randomBytes: Buffer; + protected constglobalCounter: number; + protected consttime: number; + protected globalCounter: number; + protected time: number; + incGlobalCounter(): number; + toHexString(byteArray: string | any[] | Buffer): string; + generate(): string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/RandomUtil.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/RandomUtil.d.ts new file mode 100644 index 0000000..c24dd60 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/RandomUtil.d.ts @@ -0,0 +1,153 @@ +import { ILogger } from "../models/spt/utils/ILogger"; +import { JsonUtil } from "./JsonUtil"; +import { MathUtil } from "./MathUtil"; +/** + * Array of ProbabilityObjectArray which allow to randomly draw of the contained objects + * based on the relative probability of each of its elements. + * The probabilities of the contained element is not required to be normalized. + * + * Example: + * po = new ProbabilityObjectArray( + * new ProbabilityObject("a", 5), + * new ProbabilityObject("b", 1), + * new ProbabilityObject("c", 1) + * ); + * res = po.draw(10000); + * // count the elements which should be distributed according to the relative probabilities + * res.filter(x => x==="b").reduce((sum, x) => sum + 1 , 0) + */ +export declare class ProbabilityObjectArray extends Array> { + private mathUtil; + constructor(mathUtil: MathUtil, ...items: ProbabilityObject[]); + filter(callbackfn: (value: ProbabilityObject, index: number, array: ProbabilityObject[]) => any): ProbabilityObjectArray; + /** + * Calculates the normalized cumulative probability of the ProbabilityObjectArray's elements normalized to 1 + * @param {array} probValues The relative probability values of which to calculate the normalized cumulative sum + * @returns {array} Cumulative Sum normalized to 1 + */ + cumulativeProbability(probValues: number[]): number[]; + /** + * Clone this ProbabilitObjectArray + * @returns {ProbabilityObjectArray} Deep Copy of this ProbabilityObjectArray + */ + clone(): ProbabilityObjectArray; + /** + * Drop an element from the ProbabilityObjectArray + * + * @param {string} key The key of the element to drop + * @returns {ProbabilityObjectArray} ProbabilityObjectArray without the dropped element + */ + drop(key: K): ProbabilityObjectArray; + /** + * Return the data field of a element of the ProbabilityObjectArray + * @param {string} key The key of the element whose data shall be retrieved + * @returns {object} The data object + */ + data(key: K): V; + /** + * Get the relative probability of an element by its key + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @param {string} key The key of the element whose relative probability shall be retrieved + * @return {number} The relative probability + */ + probability(key: K): number; + /** + * Get the maximum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.maxProbability() // returns 5 + * + * @return {number} the maximum value of all relative probabilities in this ProbabilityObjectArray + */ + maxProbability(): number; + /** + * Get the minimum relative probability out of a ProbabilityObjectArray + * + * Example: + * po = new ProbabilityObjectArray(new ProbabilityObject("a", 5), new ProbabilityObject("b", 1)) + * po.minProbability() // returns 1 + * + * @return {number} the minimum value of all relative probabilities in this ProbabilityObjectArray + */ + minProbability(): number; + /** + * Draw random element of the ProbabilityObject N times to return an array of N keys. + * Drawing can be with or without replacement + * + * @param {integer} count The number of times we want to draw + * @param {boolean} replacement Draw with or without replacement from the input dict + * @param {array} locklist list keys which shall be replaced even if drawing without replacement + * @return {array} Array consisting of N random keys for this ProbabilityObjectArray + */ + draw(count?: number, replacement?: boolean, locklist?: Array): K[]; +} +/** + * A ProbabilityObject which is use as an element to the ProbabilityObjectArray array + * It contains a key, the relative probability as well as optional data. + */ +export declare class ProbabilityObject { + key: K; + relativeProbability: number; + data: V; + /** + * Constructor for the ProbabilityObject + * @param {string} key The key of the element + * @param {number} relativeProbability The relative probability of this element + * @param {any} data Optional data attached to the element + */ + constructor(key: K, relativeProbability: number, data?: V); +} +export declare class RandomUtil { + protected jsonUtil: JsonUtil; + protected logger: ILogger; + constructor(jsonUtil: JsonUtil, logger: ILogger); + getInt(min: number, max: number): number; + getIntEx(max: number): number; + getFloat(min: number, max: number): number; + getBool(): boolean; + getStringArrayValue(arr: string[]): string; + getArrayValue(arr: T[]): T; + getKey(node: any): string; + getKeyValue(node: { + [x: string]: any; + }): any; + /** + * Draw from normal distribution + * @param {number} mu Mean of the normal distribution + * @param {number} sigma Standard deviation of the normal distribution + * @returns {number} The value drawn + */ + randn(mu: number, sigma: number): number; + /** + * Draw Random integer low inclusive, high exclusive + * if high is not set we draw from 0 to low (exclusive) + * @param {integer} low Lower bound inclusive, when high is not set, this is high + * @param {integer} high Higher bound exclusive + * @returns {integer} The random integer in [low, high) + */ + randInt(low: number, high?: number): number; + /** + * Draw a random element of the provided list N times to return an array of N random elements + * 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 + * @return {array} Array consisting of N random elements + */ + drawRandomFromList(list: Array, count?: number, replacement?: boolean): Array; + /** + * Draw a random (top level) element of the provided dictionary N times to return an array of N random dictionary keys + * Drawing can be with or without replacement + * @param {any} dict The dictionary 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 dict + * @return {array} Array consisting of N random keys of the dictionary + */ + drawRandomFromDict(dict: any, count?: number, replacement?: boolean): any[]; + getBiasedRandomNumber(min: number, max: number, shift: number, n: number): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/TimeUtil.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/TimeUtil.d.ts new file mode 100644 index 0000000..9733be9 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/TimeUtil.d.ts @@ -0,0 +1,8 @@ +export declare class TimeUtil { + static readonly oneHourAsSeconds = 3600; + formatTime(date: Date): string; + formatDate(date: Date): string; + getDate(): string; + getTime(): string; + getTimestamp(): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/UUidGenerator.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/UUidGenerator.d.ts new file mode 100644 index 0000000..000b719 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/UUidGenerator.d.ts @@ -0,0 +1,4 @@ +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class UUidGenerator implements IUUidGenerator { + generate: () => string; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/VFS.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/VFS.d.ts new file mode 100644 index 0000000..e5eaf02 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/VFS.d.ts @@ -0,0 +1,55 @@ +/// +/// +import "reflect-metadata"; +import fs from "fs"; +import { IAsyncQueue } from "../models/spt/utils/IAsyncQueue"; +import { IUUidGenerator } from "../models/spt/utils/IUuidGenerator"; +export declare class VFS { + protected asyncQueue: IAsyncQueue; + protected uuidGenerator: IUUidGenerator; + accessFilePromisify: (path: fs.PathLike, mode?: number) => Promise; + copyFilePromisify: (src: fs.PathLike, dst: fs.PathLike, flags?: number) => Promise; + mkdirPromisify: (path: fs.PathLike, options: fs.MakeDirectoryOptions & { + recursive: true; + }) => Promise; + readFilePromisify: (path: fs.PathLike) => Promise; + writeFilePromisify: (path: fs.PathLike, data: string, options?: any) => Promise; + readdirPromisify: (path: fs.PathLike, options?: BufferEncoding | { + encoding: BufferEncoding; + withFileTypes?: false; + }) => Promise; + statPromisify: (path: fs.PathLike, options?: fs.StatOptions & { + bigint?: false; + }) => Promise; + unlinkPromisify: (path: fs.PathLike) => Promise; + rmdirPromisify: (path: fs.PathLike) => Promise; + constructor(asyncQueue: IAsyncQueue, uuidGenerator: IUUidGenerator); + exists(filepath: fs.PathLike): boolean; + existsAsync(filepath: fs.PathLike): Promise; + copyFile(filepath: fs.PathLike, target: fs.PathLike): void; + copyAsync(filepath: fs.PathLike, target: fs.PathLike): Promise; + createDir(filepath: string): void; + createDirAsync(filepath: string): Promise; + copyDir(filepath: string, target: string, fileExtensions?: string | string[]): void; + copyDirAsync(filepath: string, target: string, fileExtensions: string | string[]): Promise; + readFile(filepath: string): any; + readFileAsync(filepath: string): Promise; + writeFile(filepath: any, data?: string, append?: boolean, atomic?: boolean): void; + writeFileAsync(filepath: any, data?: string, append?: boolean, atomic?: boolean): Promise; + getFiles(filepath: string): string[]; + getFilesAsync(filepath: string): Promise; + getDirs(filepath: string): string[]; + getDirsAsync(filepath: string): Promise; + removeFile(filepath: string): void; + removeFileAsync(filepath: string): Promise; + removeDir(filepath: string): void; + removeDirAsync(filepath: string): Promise; + private lockFileSync; + private checkFileSync; + private unlockFileSync; + getFileExtension(filepath: string): string; + stripExtension(filepath: string): string; + minifyAllJsonInDirRecursive(filepath: string): Promise; + minifyAllJsonInDirRecursiveAsync(filepath: string): Promise; + getFilesOfType(directory: string, fileType: string, files?: string[]): string[]; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/Watermark.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/Watermark.d.ts new file mode 100644 index 0000000..111bdd0 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/Watermark.d.ts @@ -0,0 +1,41 @@ +import { ICoreConfig } from "../models/spt/config/ICoreConfig"; +import { ILogger } from "../models/spt/utils/ILogger"; +import { ConfigServer } from "../servers/ConfigServer"; +export declare class WatermarkLocale { + protected locales: { + "en-US": { + description: string[]; + warning: string[]; + modding: string[]; + }; + "zh-CN": { + description: string[]; + warning: string[]; + modding: string[]; + }; + }; + getLocale(): string; + getDescription(): string[]; + getWarning(): string[]; + getModding(): string[]; +} +export declare class Watermark { + protected logger: ILogger; + protected configServer: ConfigServer; + protected watermarkLocale?: WatermarkLocale; + protected akiConfig: ICoreConfig; + constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale); + protected text: string[]; + protected versionLabel: string; + initialize(): void; + getVersionTag(): string; + getVersionLabel(): string; + /** Set window title */ + setTitle(): void; + /** Reset console cursor to top */ + resetCursor(): void; + /** Draw the watermark */ + draw(): void; + /** Caculate text length */ + protected textLength(s: string): number; +} diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/decorators/Singleton.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/decorators/Singleton.d.ts new file mode 100644 index 0000000..7e89026 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/decorators/Singleton.d.ts @@ -0,0 +1,4 @@ +import type constructor from "./constructor"; +import { InjectionToken } from "tsyringe"; +declare function singleton(token?: InjectionToken): (target: constructor) => void; +export default singleton; diff --git a/KcY-SeeItemValue/itemValue/server/types/utils/decorators/constructor.d.ts b/KcY-SeeItemValue/itemValue/server/types/utils/decorators/constructor.d.ts new file mode 100644 index 0000000..416f354 --- /dev/null +++ b/KcY-SeeItemValue/itemValue/server/types/utils/decorators/constructor.d.ts @@ -0,0 +1,4 @@ +declare type constructor = { + new (...args: any[]): T; +}; +export default constructor; diff --git a/Shared/EFT/Assembly-CSharp.dll b/Shared/EFT/Assembly-CSharp.dll index 8180ad68ac20dd306134cde69bcd8e1e501151e0..79401f797ab79954e82eab284bdf097b2a70b1aa 100644 GIT binary patch literal 9394176 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
tvKFsLBVg@syBUr?xC@e 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 z z)*L+oqp6IhA6(KIm+Oz1XJMHaOa0`Z{KLdasaJEzkj%M?s>2HvDvc%@lL6R0X5L0=7pJKNH6a z$H3wIjj3$w--+2d&KQtyH|}Bs?2IENCegdnlN)8lfz7q{7PtZ|p0H0~1!P;~yz~&x ztwmFKa}gjk`Y!e3nWy~aA5)pILHsu)8cHrVfduN?y~xoKkh+jJcVxPoo=o#(i6S?}>jwRDMP#Oc=H| ztxB}nQE077bplTv+m|7p)h2EqM`U`pUph8z>zHW+r2d(Mc=tg22;w&FGY}%9FAo;m z62*LCIj_!T7F!AXOn5prc%lpih0`+>0d=V^wzVIZfq{x{&*2uG6#h9oqFeF+s~eJI znL?A~X{KN)UguKr*iN9_6EYdg7x4P979&5nWE=FWxDa!=wWc0sqPGleNMKHO!r{Ji zBZlVrL7O)Q3E(FFft_vlpiOe?t<(;=2hG`xqKf^X*XI$WJMK0z%>4*ctm{mSn%-!- zQ;7K*)Iuqn7&*PkbPos+APMS)DIDXnsc>b+NVMYe8kSv$fo8UpF6r}f;P))s8Sd(2 z2IHzwv3HR|)2(M7g+{W+J`r9etA8Q~s%W`Gf}QLKlejkv;+E>Y-f$kotAsbQfb{gwNWQd=er=_CX>A#oAE46cY_s>=6(#cqRzNwe z@OA?-RC~J%Py~OcgdcAY!0}?eO^o4m;kOgZ*Q6>zm9=_wiKmbo(}yc%h2ex8G<2hl zSh2nRvWh!X5K-L0GDoI=Z}`eceJ?oHSl>mam8Zd@eSkjpM^J+q%mK#z$oeEk1$)it&*d zTwVuucqu+^Ujb1%q2eSlW~;LWNQBq1emWAxZR4e}3HP?3^^_VDZt|agQ!2!9;XwjF%?4MHvzG~J%+fBd2RZDEAfODK6EcU-G{u*fFqNiQX5769 zB!MPCzaSz8o}tVOeKyWnh%4~btn4aZ3ETk7z4N)?Az%}OYuWmXvGp*+#(RhuWsh=K zfETVP1ZHbubOt*bb?Oo1$3ARV{%VbbcbjmTCE_&fZQ-;(Mg>}CC2+0p{y^q3f_1io z7i@mhlFlr+u+~UVs~s0$m#>0Q*y%8v@$3U^J02IBLttM3D}Afr6V+Bh*dDhBL4Oaa zOZkre1L0U>U5|*$JHP|i;{jpgn#Y36R%-tpF7E)~5OPOGJrC~SF8vv?S+3glXgl8- z>DyQI1|{UgXNK(Jt5BL^ikNNY>e5`%j(58AIh&=|z zNS-+$>2kn#fATf$+YzH-k3}yKlE_$A96%f#AjI)c_YMlN1s4;l<2$%E zzOOOTL-5lo%*Ao5dkct+dkgtVc#HUf6>u@W80)bPVt^rk!|HGf80a-Q&Sji$!kO#F zeMQH>QNnJzCy-~J0|2_2IOt}680=VltAkBz!eoNTPCP5a5Bs#M!3FbJbixdln{^Rj zoLh!_d?pw@S16{~?ImE{?)Gt785i^Gl3$X3bMW%wQ-ZSNbv`nyE?aZw8(rwkUwt_!D=(8jz%0DnI1s=NlMJZC=kriQBQ1C2B19M9yfG-QLhw*d6M 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

{z)o-L2HH{yJO)4* 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

Zv8gEc0QU3oglU*_)0d6_pru_K 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 Q?V=AUDw)d-URobi*bEzdM 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 K(@b*!JO9)s#kecng6c!Kf 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 iJh6V3lf(#$i)|r1@bDOh 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

T1CG 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

b_*pD|t~-nQ=Y-v}=Mg*)s;VZr?kLEfh$ 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�M2oQ`EqyeEeTK^ryCl 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

;nQo2;X@c2!3iD$r1n%1<1!yPi1pNTq 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⪼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

OZWU=R4T3`ff)*8oq-5!=5kvu}+w%y+41; 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 z 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 z59Ⓢ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

SXov z%$bmBuVR(21SwImf_Is7xg9Z^)7h1*B_M^lyzB<8TGlGMNrs}bVzpz?>Sk@sV0}<4 zl`;*oHlq~RI!fY}wF_jM+M^k>_JMps&ys4Eu=&&{>j0&tX={ed{%+1XnZb6EbHy#_ zbgGI7^M*D>T8_@TKqaMf4r(?}$hr>lVWpHw%({uR92QHGlywW_jM@`rX1&N@Eo!OQ zwK>-AmSwau5?EV$wRe`uT1J1|7taf5*Oq0b9!lQ>Qv0R>S%Dz`)Rbur$qKcyx#@#Q z%dY=CE1b)yUD60aZmV6=sH_+(D`{7HGJAlYsv5MhS@E#*<+1W0cKz5a3rMs@l5tsS zAgfPEGCnI4Ojl`5&T0YDM5Q$)>obrRDlL0f zJCN;)OwHSByq74*)o0ht9ArJdf{bs%$7tZfWhzwA#SQ$wxC`ei#q#!0Qd24=fM zreYsyXJED$WPH`?Ye=>UGFG+L8j>B5S%dP^T(nGTQQ0AxthHnmNIN5l=!ogkveTfoNk!+T5Gf;t{q4AnrcKSZ zf@~8{yBH~=)HQ88-Nw&raB6lh$UK`MwPp}ud44vP6FQrkZHG*i1s`Rmf}9nzj7Bo^ zsQ1yk9!o!J?L;XWMsPyU6tZ`NIEbCEUH^6V9;9_+yVRPOy%+wGDH*hR+4~^Vb304(E44iS8rrr0TG{v)fxx?oP8BqKdKe%FWEnGJK|OxI(3$P4Po-wAKBMI z^35{!zp`(D+)Lr)gW*l~FG$NSW_*guX5Rt1EoOX!Rxalr`j^WZX~!YwA?yUOfdT%h zn)3)g>>x%hyS`e^UyyP7ipxB8bIN%FJN4DBq(;u0Og1-porf8!ow_+%79%?TNebl@!AI}Md%*=Jt@)<_R&S-UJ>1<9AWWE#Y zd4qN_Cm7_iqtv>Z69RHONRl6OLSd&Z&1>wpuiURWVOeag-k-iE%u=`Of6a-6OpJ)L z(J2B!8V-!U>sFLwg=21=>QXf6#&64e(Y!0Kh2p6(tElj&xo+L+FtBI>W91_Qc5IR>}3qvhn#t+ z)A#B&whFnMki(%NGIa+c%+BZ4IH@1vkh>M60{xf$3|j5ngRnD|q6h3p-+s;gBa6*? z+r)ZG}kGc zjR5!B$&$7u!n964tSGeF=GMq&(Xh+sCFzvgFq^I3pNn0RW9^=~zS-<8fLO6Mw(EQ4 z24u6|v`6h_`Vc82|CDC)v}oN+gn9mwnDOapMQ&g=>t9{Aa2dzipXbKHPD^@r%zifA z7rBW@>pvl5*OwAuc4|%JTC~c|P0D5w#p`0FXV;IWnQf>;ghP2}z+hUlM zn}(83KUG1LeR^&l$htPN>@#u;p>>;{$1xxF)X&bfk;kZ{x1`pb+!onvQVg*1{JhpL z&g}`(U45~7ac*DOi4?7_QQ$g3CJJwS>b@y=BxJ%xTWu7$DR&geIkEm}@4hd04v3#v z?HIIux!<66qSa_~D0gi(8^=7=XmcWW17u#Wl^#2pyBXwPN4S~V{F&VC@cdM=fB&DN-v;~b^T!`!#fsvY)`yaRbdDYBnIdzf1#ht)-!?wq{V|B+jr z2(5C}c=$(dtsK^VZkBQxFYT|~Iw0r7evpy6IV{g3Mf;)q0dnhse5xV?FLFIVR!x$r zzshY4vQ_Q7-{)F#G_rG?c8)xU?{m|U!@r*cP-H;MYnj99tE`Qb(em1W3==Z6-pK0! zGF+|j4SAh&SU-JibI|&x>S-@rF|Qj+F>154Q!TGA%KliL_Y2M25AyALDHE3W1IRiR zvkK2Ul*8toS56g$<;c7vAS+d@AR+HoP8k)TI-T9%zx2Fca!Sdov*@f5&rf>Z;~YKN zIVPSMI@Zq2dy7)sxx{to3{~E{oRRd$`cW02H6=7V@4p-aX}zw>b2!$qPu_rB16h6* zEXkm}!MRLk9Id9o_ZK3dndd@{e_#lQ%7QB<0XNhL>VumAQE{bD0nA zVvp}wdq>`~T-NFqs#wbIyw$mE^jlSfm%^Z3%3A}nvauvr^VULZ27RB1dG!zX>v`*7 zd7_9FIM%+Kx0Q&dHK#8+F&Ufgx4a#>Y_@t<2kxQy^cfK*vw~h7=Q1zzc7n{S$}QV; z)$%zR@`JQf3xvKM9M1FOSUZ{#%JY7@)t}dLeE!~CHulaG`(?YncfMa9D_1=cw|OHtzehA1c(SBY{ACeyi(n5Ik)$|eh zk+5SE-gq_ri~ML#M4n$wAC(`Q$NJY;F)tgm(fRRtY)ojO_QKQhGeKO{u6AyIHpomd zcN?^Y`MDr&YP4CDpAVu_qr~F;LXgLUcu5V~lKf(jKs8FN$ZrMGNbQ$b=C=lkR^!In z{I*<1?N8U|w+E@LdiU1+jvxW5S8mJi4C1NU*!KLcAVI2)?a1$*$6CSwItR;J!p{7X zJl0yK*5-M(>-Pv^7te+5`tJnkS0H6hjV_X$6y&z2> zNiO6M0V%&jlFRwSKzf&xt@n0*DadKD%eL$P$e#f64O?{3&#wPBe;UYYvCFpWUlU}Sy42~x9@B)Wo)ka;ZHDxFO&*hK!JwapYMQ?XzNT3r*d+M##W3U-53+A3u- z3-*At7cI)5Wfy!0;wxGdy|Y%Z4=vM6)Vo1zTJQrWqLvL>%YuU-wezLrwgrbk#*3Xe zJ%2Aa4AN6Y!+I1P0oiAlT0IMng4|WHuU-YmKqiVA)}Zw%I1XZhcbI?r7MuW?CHzcZ zR4F(K(nk2%pbaiK1=3si*`R%1a2kZ(dJum8vfvEJk*1Q2E;tKf=po7Yf^#5)RqSGN z!FiCeGo;Lvf(sx6RP17E!9|dhDt0lW;1YNNPKfimK0nA8C@dD(t_(CPgJC0S-}mE|7J>=RRuRe{#qf)`huVG^zO9V zsxIHTK3#ANBv0J5X3%aF+{F<@LeqXKc$mlbL}P`PUH?l$M7TwFY^qb{wAxxwM7o|+e$LBs9iqW zDRfjTt5HRrk=8$A{bSI^7xhAZcB&^wlZyI*Y^y2l*oy|h&RMZfajZR~Xb|c&XojrQ znMFhM*?Kjot6as+A;SFJQN=2^6wOEK+rp*g9YqTvvt7(GboXOX8ORMW%h>e?ik6|I zAp^M9AI2j^D^Su=Dn@jqXf?D(ikZl+KT)(1GILeb=t9wE8q=J#RvTpM7m9Z0v;9ux zM?B9I`zqQCnLHK$xm>glqr{NQym#N%-!3|k&&JHUSL9fCyXXhV%%~Zn=xL(z5kxlKF|m0mCZU(pTZr%{&Fs!)6@pG}-o)w{`6 zifJuFetz3d%2X%9+H;ngyQ>%9L47?_>-ieRzmXQjng&X(A|h4M3c7I2l94nNp|cR`jMD8` z-AiBTDh`6o9I>9C9zLfy8l;ctO^n2W>=QFJBZ(l##dtV|hy`SbSPf1f(gft2%`!i8 ziqk>96RUToWd+$LR_}~tf$XdCQ7eaQiSdxhC33FNhCElj2hNNg>h7L(});w#qJV~F$s z*(BNz)9MK_L9Fl@=?(IuSa~wi7i5`Oc{0);gxwF!ek`qlAmzjv;4$Izi$4dc)Qrmv zC-MbIfmqLv313h=2INz*o@Znn$Tn}THHF9okWA6P7@1taMkH$wE6)yrgF+*xCFD@%!Bfz(6O}nCaIojb5>S^+d;;jX2O!)pO3QBEt zW$|{%OcQODZhLl3V;=?FK(?;C#zHkAT!F|B;*k3HJR+&VcM(#fg`8wDMV7tuE^WxM(HX`k$Gl6VG zGHL%7TR|SE)w14J1QOF*YL&MYgEV}>ORD#-Vrz!9^uc`jZqOWUpMn&q)pB)POK9y@ zY1Ol}LVmiaos^5MYatsC51o*$&fQi5GF|PYJZ!x{miWm07;Sw(B9kTYvh_t;qr`mb zSlh?eztBMc{M&Rc^IC7V4J9o)k-DEh-?8b;wh@JTNq)q9Fa&u$=~ZrTW(wwzD8<>ZIjp z+j)=*%x(0ens*p(#qbS`mZmU+r%Jr`**IHZkA{O0kDAwVQwKv=9 z7P03|eN;qfv#lQNc%0@tJG*`d5tg5kVjiUaX{%3prnsouH!;GVWF2`zg7h ztj%w-@KUt*K43F~v=%2V`w{U0+1iuK(Cy_mQxWUSuFO2_9I^R<1k9G?xGe};&SLa4 zXeVr;AoN0^&^l>r46SMEjL<1tBs|u;inMdq7K^f<5i_G*f5p}mcJ@@1GS_X*i&zZy z`x%^2tiaZyi1nTS$JKcUMpblw|7Kw+5_(5EQbO;9Btqy22%%)N*(D(%J)5$dUN!{? zouyX^B}ng0iu58NO+ZmpKt!Y?(m@g4Gv9k=c;4Us1AI7hrren`=giEVJDA7d>zUV? z9N~HS^~~S=t;l_T3#sRZe-Jdc?IX$G{s|!8TP1nzp9a#zF3CUs86Xah5NVywKMS=e z)Vq(?SbOL11lh}{2n5N&^LoY+nMNcR`skK?-!z`GcPEAkVoCh0FwyDE6ZSnF#VZ`%!{S0$IX-lpvEq zj?flN)g*N=R-v_b;jn76D4VCS`TuKBgFci%}g6WmT!_W z%}pCY=5Rb%-?N2j6Ucs!2kU#bG;IbsT~4NIW!eIAvYjMtOj|+x2TIc3v<;-=Xh}Ml zwu3ZGlcbYr2gqoSzv_E-Htht-;%KYBXBX2~AfIlLsd}1rfrN4dRNu3=Y4>p9IhZ*D zs_)syv3OyrDH$l8P z3RvkGW%>hT3fm1qZh_2UyHQBwPmqA^dhUgu(WW~f+t_Xtdd8UUfuynBDD;dqJpf6r zEK}J`k95*mk_6LZkWfEK?4~Cmr`T>3dM25k>4fb@p=XNe1&I4}nJUBd3Z#9JB$=i+ zAa{32l4JT8gp+B5i}I9!Q7srPwpyV5&bt%%^L(kG-CGJ7AVc zkXPKt+IGDiFdIZ;JO6s-oq)L@$GDHZo_Q}|K1f}*^RH(<2v}$;NqRaQ)4lhtv5x}2 zFbSWei&_DG9&iMt_XRva@>|{nd;{`BX}!!e=LVbs+1N^w66PO47V&eZyWGuJK&q%2 zq>T9&kagS>Tn2aZRggn;(Gqa{qA|8kiq}^ir$4 zjm?ii-kJ1NE<+RZ6ObBe-f3-q22xGUJ8jJ`Kzd)2b@w#C1F^cx+`Y_(0MTMmZ6xtA z8$s^$m&Dgx5~Mr#UiuD#`6H06+VcYn8Jb6t>?bd!eo`Maeu z@qRA-@C-rfQ?JXHvEEoFPnaC;I>FosGJ}fg9Y~O-(0rXO{~N^RM2*_M|7j>bo1zdu_SYbSES#1&oW0N zRdcp=H@eO-r=Wd8TvE?Gb1w9p>ZFq^UFVx8Kqm2#{*+yYMdm3W*{^g$`|svyAcxgS zm8ItCATO0qvfMlqq#V!hMy<#^8|4|aTh?opc_CzCc%1rq{a_w%7B!9F=%%CB6|>7M z>UD6eUP3>w+vXy(sQWCACfa)4H*ZF&`aDwni0mge^}{0L;`0$D<1;5)N;V|U^_ zd1kU?V5LA&9`|;-j8QAkM4X2gKRW9eSOqf4p_0@LtOgR2DoLHd8X&7DNzx#&R-kB~ z#m}ov;7rKGu9liR1}+8( zn4l9sFQ337kdf@K`gwgCxCW&0Mk(`Y;5LvN+&BEZdIs(W8Nz+T&#Q0XQIt8dtW5P; z;8~RU;9{BkpukHg;hq#J;}`ftpcpAbcn0zFG6nvIRAV;FR6&9Fkyin)T`cqp4SWc) zYo0Ds!7C=Pltt9Nzl#2n18Z4C`%GCYW%2{-gUsR;kA+_21DjdI6P!fGM1Nir1G_+` z0bBlsUQ+_QLZy69Nm+}+Koe4p?kiKR2n>SE zAI+uAmw^!=@7c2Xd2I@`fmGu*^z+&pm<*EBTc+9;m<{smGo563eHAzcW!}##Fn(Tp z0;fS{Re>&3-)mpsY>=Nf>BP_LVBma^vmsK?@xbLM^I7)!{k)C`t^z5}_SsBiJ*CpL zbBm>2Jr#HmxrcGwO}9NWsjgNAE(adA6l*{?h4NaZQTr+I1X7tF>uu;V{1SK?G93r$ z<)Ks4foCC8O?lmq1Ahi7rabB=fxlYBUcZy~N;K_R;5Ey5>Ir4HOB?kp@E%eXad}*Z zw}CaSq9^R&bw9ex!tyc5VBU8yYQ-&eLF%&CO<(S_)VGRS^yD>adOOe3&?@Y_mGg4< zE@NqI75$J7g5lTFyR4!Fjj-c>Dekm))1gG{njj0-ETeKqs0X34aQ5m%m94_bQHwB%St`*h>C zu-|%rY$-r3`t#Qh-MwpDW}z0Hc!eRMd2P#Lv_@AIl{B=hwth)<{P$BmcY15pvKFbH z@QWo*??#r5sQU|!8OgF)zJbgOo>RiTn^;amvybX69+pcWJv-`}=}ijD4`2k0o^TI$8M<34j1=u$VTbI8eJzzB z^N`oxU54S7?jQ$MKQvo+V=RkDiXJtHJ?c~5v6eL>MX$Td>soufZI(^QEAWEeKBv4BEZay%(_X6gVI7v; zBgHz~CglyL5D~R_@RiAKI<(PgG8&g zV(-0_&qm92$h2VZy_C-;%dH^M$I5eWaT&H+?t`3E_4>;45XA1TYc^`TEPn-w{xdvQ zC$yGp`J2i^cfH<`)@HBe-ymUsUb>`je29qXKkt>dbBu_nsZ+%TCoNjANY#yR`Sy1^ zW2qP{R-50lm*V4dfru#c8JcP-w*qV5m*i$(r!_bs0W zi>Dl`p7P&BMBO8KoYI#TE!~hR@1(vo;P3Xr(g$S6I=wt^3~z``q*UcN_UzsDjpZ}s z-j(ANIz?$2idwW{8K=*C%W%jvWuMJucy9?ny)KtSMakM2t$~m!!&a1TFSaItG-4}i z)M{DnAPv;>s$)$9*`mDDde$tEiOM@|WX%UjRo-b6>jaQ}$~$dtod)u~^6OezXM@aF zK3iMsLXagDWSKiymx63lepE;6a*#dc^%gT~U92lW_P3X$t93QVXUYfgvaSVbp?m-z z>jsb-$_MCX-2`HuBK7pNZUG5Xvw2_ZHjoZ#Ht%oU0TQ5Q^8wbcKnANhZjg01h`FNF zJlMKdPo?H2KkGh_Zfb5CYCR5eJY1$4Zao3AOr4MNx1I)hI9197SkHmH{9yU5--DE3 zFV|%lY5fsoud>ha)+->jc%99tC0c(0xuMQAIjmPfu5s*1C$Fr(>7Znl*zXK1=5(;*^F9_^>2_=mz2q~J_T9K@t{!~V|@LS^TRIMvWV*FDNMV#DGp!{?iM_V?(UQ!u zx{ng?>!n|F!+I3GtxTUK7CUR!G+m~7i$&HUNVRyfOtr{5d{hw?H-pPVYYkR^kaRAO zASR?*rA`DbvIdM2HtLr06Bb#mC}9QmzUbtGbre#iZIO8`v4&E4=>4{;Wq40~IYTawd6Up4b}+cWn3XOAGMC7!^gDx6rmIMDkrRya2$CP z&*pCoC#};#e&xAaklE1FoZ}rAk@+a$KmBD1&srCvJhOPEoxXNKM4WUwu~X)LiDi~l zkmLvJGL*Tn!w0egWbEgX{AgV{O6+OUfjj)@e6MviYVqh>Nv>JH0{NQbWxCthx(6lP zOy9H9&tBfN?gc4JKDJKofY6zxA7!gPBqDZQi}7lz%Mdp5Sco7)c{SB#h+tAmOnvlo z86uf9ZuWo4US3Ug8KPMxnpab4znjVaIGHMziAVnbC7x;qkupuxd|~5MMr9@9q#pIW zBsoz+YL;XfN2B!CA*b@{EoB4|E8C^mj+t86S>~!m$~Z=z2oYoFrn1H>MqUmPvw0ug zL8EuFR*$?&GMaXSnpJQ4)gy0!9Hl!^b+Vqw7?NqD?BPx#qUGBp%DlcBc@xArR+2qL zis%`PWD7vIJTW=W7C?}WOVWu_g+EjK&CD44hYf| zWGC+?3(_7W-|#_mCy<#4S_XWSZFiFImXzt0I*yvwGGC8Lv>$ z&LQ8+w~+Ra^a>SL!b{C5Cy0n=`cBP*r$%-Q6;|}yrn(*)xg+~P&n5aowElE1jT{KF zO1LFv$ZJVE+??Sf{93jgpj?_|B6=|x1mUr;Pp zFObXN9W)oM8rnm)s&CM|P%#(OWeY%W@dqtL?sfah+J`Y+3na~1B{DM~C3BFKg(F224A+P$%D;P~gwEUn2GS%pyHK_X; zy0cpR=o=708}wAlbI2niQZ-mFQ{@G10;$LAt1iRjpdBEeUxXU6nNx#yp*6zU`WZD> z&>qNymyvpA1nmP!YAwl}paUR(_mgB^&_R&H!ICTrIs|f@qb)kQ7jy!o!2~I@H|PvV z4PFIx8TJKT0Qr4`lsOc15#%PvUoOM3pi5|t40V#{bkGlIjhf19`i_WbjWWDa>N0#6 zbQ!6_=`J0;4KD@#1er!LADXZwx;N)gLW-czw1Tf_ySs zjO8|&a{l@`sM%=ITQ2fSAbo=`s4K{g*;4a^An(z_VjrERlWE-_27NkO^vv_Cq>Ni| z8d5dnRV-Q!3(f+u^U4yfeFf)(v@yz5<$@=G^x+jMx`#P<8cO)%*Sb$~rD~Pn>5#e7 zQ>JPaycuLtpd@XAw}4!Ym!w1RR+Nyg4ni9mwNAm?ArmlHk}kntf%ID=N$=qO$bBcD za=%j5FZd|ha4h$qH->=VbEAt$=e(7AD*7Tz@I|Cb=G{s9vQO|YAT7U>JD5Sicc~3E z?P#Q&zk-7ALC*vBQt0MEBI4<^t*%>RzbawD_tEkvryF1)J+!FcXQPGPDEd~Pyj=!c zutt#%y^%rRf)rNNLrV%agbBAMWU-9RbAwBUiQETqpMPT*!^FgWUXU`-b7q-dFY?2K z%Oh1!x{Fe`&l7_yKxSx>E>qig36ncK#~too6kHWDUhHet_ALsoM&+TE3cWaFu{Q?S zhs=!aGOx|SjX>^kRC1yF*5GC!%h_fMB4WA5TFp2e{CSv0nk{`~s`ErdUJKYGs_lC|cvu*$R$E<$W|`nf zw9k23h0xpQZ$T*4lFGUa-HAcOK>ye=UMFu1i$e>3wUwi8hKust9jnXK_T4+G zN`x58H+ZhB?Yn0$5;i9y+Hg`Y{h1oImLWT!r|%|RMr+qA^zI3LQ&K#gyJ^Ehov{KA(9`*v zy&a?WDr6?=HG@4FItLOm3orvBx}k{u7TPBYod@z8`zL3NnFxE!tBEy#_LPqm+pby-u|td&pn* zY1<<+v_zEX^YOe2Vbq+VW1{^mE-jM{?GHpu<0 zvTSQZdm&Xlo`sFt`p~{0W5>(#YzXZSJu}NnvMF>xlo(AjcqXFJ6gm*3&HyR1IrQ@= zF}g2(p%a&3bLe1bj^}yDsGSI12bpoOcH(0uMb3(x1IbL5?A>muw~I zp106%pl4Ef(Nl%}xeWE-zP(+yXl=RgjXljXS;`W?vrc9Pr)y$CX3pd=4MzX$Oc zEy?51A3>_~${XEP75Xzsz+@@&j7cJ|s<{j=Lw|)#dtNc4+tfp^;R)Vk%SIzN^f$6`el@u9XuxKGDfZ8=+}7eYt)TxEk>7)7NePtX;H${;|J6Mq9PQ+DD5$ zvIkRSUiFBGRJ*uUNi&hLL>6$X8nwn@9UwEFTlHa&=3$+pMSt$OLFUyWtUHJ=M>k{> z!g_!tT+&;NzW){03uL^zOw}%|50#MiT=?ny-J?TTKalVE>HOWJW7r^&<@|I683J;g zpT$EW!%)I9+z%i2=oA)!yk@nLd3lD71gXd~no;u#3r4Dw{JiLmm9P-V++Zte)O^FD zAv2Amr20L3gvCPU7iG12hS?#L%=0YRVaq^{sqr2ewgRLuRF)?y zY-O~tTA%IHV+Vh?=&;p9=-sy(`g|JR^A|y=Cv;z|r~0ACuVHIJ44Wmn8nzj!%J5E2 zc+WdwhoIR(mQA;ZcfyW<)HopXdL#&GZcqNF_!+f!;YZMh?irGF3O^1KI8~Ca;oqPZ zQ&J`I4nKiby`aX0PxvWluFLyG;XS*DpN$q{XFw%A)$*Rc;pd^}F4v1rUx(j9s`F|U zJs|u(>NQENBL#*(MXC*4ccT^*{vMhKtJRfJ;chWSRG+fV^t?1JCcJKpXw?C{zA>$5 zOn7sUUF0Q--*O@?L3(l2KdonMcqfoT6*I<$cL8}gO;1JpGU44pUZ{vHHN0<(Xw@6^ z^%n6nYPsQqV#F@+cD0W-DLg(#jQ102A8mGcZj2bq*VG#9!ti{MwuyRPF2k4MV`D_` zJy%}lzCOGFdVb{+x>wm0J}E|6n+SE1XH&QfqMnu@3m%NYWGVBmCRG!Le z?`AgDqfseTPF0*Pk}Nw=1Te+kkCv>&bZeqMn(9UziV>dh?8>@d z*S1$vCJUGtwPq2=k$Y{LBgAj7d-I6%C}9&`xplA7G2$x7?v}a?-I^G24J3n~4q3>E z-|#H@Zpi?LJwJKbu<8^%Wb7b9ZNWIsI~r0*d{6ps}>GfwUBPK_uT zD@I&)ku0+-;-gqGnjUao?p2mX)Q8NWOg(CgH!O{40GTkgFT5g zS-n5MF>H$H7pqadwD&scQ+!jzK%{b0_GeSXpjctqO7aR7eX}EC2uL`u?HINF5q`0v z&$kuo=|}GiM+`*?eVcwDRuKA1EX!Pshyocx-vbhT-b1?_5f44{0;J5(5gD<FDA zWtEzdzkobo3n0j~SP={7CdxRsX5ExJ8MWGxzav#Jm+(rjI+1r`4b<{K+GM?Y zM7Fbup7~9ZEYHBmUN+I6pYq&f)P_X%flNb=w&>=H$Uz`AIofg=tdWC3ZnE#^GK5C@ zf&8IXwj(2lf&9)hno&!L90B64*0Jr80U#qNZq@rnT4W%ISC%9hkyemTIJ$8evLb^( z8n%_S7!x@PWQt3s8Xp-7vXwnOmtj(5gie-AnHiB$Af_FX%!!QA^{DlYxsf)IZE9{> z92pN{Q!5^Yk%=HNzn~J-!&gQ+Kq9J0&1)l*LH4sZ=rXK}OhwCw^K&<9J0jB|^F8~A zbbm`^F35Zpe;tU-2bruQsiTo&LAI+%>f6Wyki+Hl-0Ade>tuQs*#gG1`d=m zzeG*}Y0f@Bjh)D8AT?AZbt`f@hot0AlrEUGHTVM7K2zTNX<2)mVj(kGf2azWgvkn+G-lL66E=G zskueeYLM@?tYB=7UU++JG3?!bp~XsNv4_@bq?eq&pR}BqAq|u=%~xk z_k5!+f&5KYQ7_@Ls2@N^=Ss3N>PL`UgJr7KQCC3hv!u+{s9!(=*b}DjH$`0q8MRW% z9EiFOLLWopypBfQ1Zl^fC#_3F{RxuKa}({6Mco0J%$A?txsJLA^7(dIo<~s+Y{HMa z(ORxhJ&Sr|6Ej-BJehm3=%+}vhUWs8p>*^ckczyHZPdy}{|gewo*u1QN58X)6D9-I z+D_GIEl$|p820^KhMLi(;zVAi*?L}ISE?WV5oCT+Gh_Yeih3&c59z(F=*l2;s})+q zWoR8;733gWQTnEKbaiO%vr3oQ>)tuKW}KJ{zTnk(qt-q86Qr{BkTvZc?E%uvEJ@$! z7P@A(#`FeObSn@8k0zJl^XN7p32`#j(CBs`zp6GI9^C=tKG&4`d~_#}D_la_5sU6Z zul&)wOMJ$|s0BuMg-kQ{tjJ@G?hbODEjGD%WypU2uK(9e_V!( z(Z@hCcz$;oev1AEs9m>kSW~GbXqm~I>>vqZ}l$v21t+M zx*nH7i@6ChiX&*3p?J(Kkf+>NU4~LIw?T@yueuCnWA1{y;C|>bRE)Wg9yNm_GNV>C z<{@N8=gYjR$284Iq4UVY;62^Oo6eY#f19{KAm)>WLX#ld#E;U%g2cV|p@ke%G4XaX#ZpWCB`}SRON8?#cAaegq$@~{% z1?g8xmatOnNRaJ^^!=uIL*>{Y==qLb7#6iKYV~8|K`PSMC3Mmt)`3*}x5;`nj7>#r zTvYpUO=GiBLcgA}eVWIP0eP=1cH7tjkm00F{0yx)UsvcJyF6Z4(Xo?s&&8;v#m-6)WOsy~j85~$&Q2&p#AmiH<1#p77bJ*2 zKY-iWy-Hr}LOSC_Xa3cmOJ3|E$W$w%m+(g4{Mf}H?ORJSHntF?B1cm0RmR0GLGCO1 z$-0k=T?&~bj-==&=h*!q6V;l`ir9l7X&mnuwY9N_LB1a^^{kIQ3UY9vBpYMtTo%=0 z4o5c>)yAFxDJZM=RoYL9Jq2<=t!!_JJq>c%UFz8ydlsa6X`Rp=II-V>{LOa5W!M{g z5#;waGSz|D??FO2axrR$VlRVub5uh2+r<6^Qk!ECqjn_rXOQ@bQqR%YUqQ@$W$wpf zuYnYBd|}j1#{LFUjrW^ehEuV>gY?@Z^_-3U1H_9X4*C*7?4KZA9a8i8*gGJL*-E$! z-^bnq2~(@qS7IN4ILk@Rzs5cS$!aIb)!4@%6BbC#zr{WQDamn)QTsFY8Hjbgl(`f8 z0whqa|2&L+1u{{s|NO<|cBstjW$YWs{E#ZitJr@*s&I5e-xZ4e52PhWH}u8o*!Lih zH_KF-%`H*%mZjXET?T`#7)UXWcW6J?W(3*DJ)HK5Y$ZWHQfHgX*h+&`=jeu33vFdU zn)jDAEoUnWQkA0{n$c|KLH->i%Tvu(5o8RGiaU5S5wHCHUAZygxS6iD0$UkZ|qpPhA$Wpbg)!o((CT|w4Xlx6m_d4sIssKlrZwS5Y*e6W-mX6p`8IYN@* zwjLnmc!$Mh7-8!L@;F1vm~DMPe5Ofawe!Gt#!9ARcO!IK?&`#M)NMq}u#J?y*gvH4s}sqOitIIGUh!ep?`9 zj<3%}|lJA+9%MMwZm`a`rDC*B3GqI0~TiByj^EbCUf-vOjTy9O7A| zu9PLL78i(AXH+C!GcE|EDSHm|)>zyqkn3u__v5%wl=+Z4|5H0IjOGsdve-DOxd9Q8 z*Q2JA^o~0MJ!7~H={EkjA3(Y(ZznMB3djSs_GO9t1*9NO>KPSx737JEMnmGRgJ|lR zj*h#b>*2Y{WeAVE3G#yHCYK>L?iR>jtEA@SxZ5D-RK%JVcORsHXDgQ>J?{KHdHi_X5Pg9==hV6!!{brHUda$Gri0l_2#@ zjr$j*H~Z>zB0BCJNK^LAjoQpOElKp2a_pJYy}NM+kW%cK8?`xc#X+jFXGJ&h#+3kB zRZ8ZyAg)xB8$H4O?c^Hu!Z><6l{9~(;({;Y$|MPYzDs%iRMkJ7m&KJuswcg5@BJN- zav*yf=rTraSzLLL1N5yi-CO=Lt^!D9`s$NT*2YyrUe{GEHpNv2xuR;ZC9Vp{pQ;wy z4$$ES3ODWgB*OV-@jVW`A}R<)cx(>`iL`XSK|gH ziQap=k8F)waek0lsiMEWJmOQ5@~IYk`S$X|?OVsELuR5{gKZZ-6{HG#U-V9T zybEMb1zF}#<7c9MKBE^1Maz3=J>q94iPMJmINd0?487v#C5gG9UrYU&PHEdGem>gg z-a1)}e(_78d3Fb>c|iOMkUJ{g84DC}3qW?T)%|%*h{2S!HguWp!+NYrN==is&S4;K}Y2?QDOBTJQKYN2T3&#&k zhQ}` zx6s~Syc1+7dnrckV*EIe_9~XS6hA&$^q)oi&8d*~SK_BZrfelWFZU`B<8Ohucltp7 zM5~UQD9iIO{x)Q;u;1%4JdVE)@`Z|kp2t4~X*^X=MJK`H{{jhO--gb8#s3ZBry?M? zgl8aam&#Ozgcl&sw@Okb;Z<@GHP%X=iO7Z|yh#@JZ~@JI;&kh)nr7Rs_ZEM* z3JGtMMSp&yMs8IiqHkoXNUCardy0^`rN(KsgmNiD^IndL=$oVo;dF|%-i_X#{tRh0Y$=svf7(x>^rHHrqe>#DxYfhiggl)*{eyYqXG~sKI z=4=m*T2#V*l)0yhzhV*&LdM9}iFj(~WmXe&P9SV~#SYlK?u$xrwlxz|_G*4Tu5 zDP>5e7OyanZ=CQ~$~dZNE4FnsP7@x3v|t-GcfjO?|BzQj9;XY5ya!ppV^9!ds%ZJ0 z907?`Wm1J^2lvB;1EwTYhRi{Zzt#?znoteoTaLd3sR^=(dz2uxK@L>X+fa~(siK|3 zd7Qp6OigI2Ypy6;b!tKjJyl0ZrX{oj5nl=uKk@+*+JSheC~0m&Cy?U2!$RNaN$3hP zOvOY?6Fvp8st9OhLJyF7+ok5U34K5^RRpv#;WLo#D&EDCTm zv480LBq0o>5#7Ke$S2-U6JkIbrr*BMdkgJSC7wqc{HFiBYScco*b~inbah{spp9bUpN+#)*G}>}(=Q)5NDB1AQfFmiQc` zbburti7!D0*d%F@_!{kVl5OVUfvpn%0okWwnO2Gar3zbjnJtoYQ0qi3O^mn+uk@O} zYu-7rUYeMf|5QFem&68XqW_$pCG+Z%=z&yYxzD={pC+~i*{kB65sB?V%JWJo?NTLn z1{ta1oxns-kSfKcW^1AsNQ~N@9GU0?(yp15iAd}QvWG_#z44vs3vz@rGKWW;%P=!B zlk{lX9eNK@^h|%Z`H9(SMbx16=jdgo_mP;CTm69)AosUrbYdi#32DMxPF6A6(!|MV z`Hnna&^kck(ljyRdb4Juwl#4R@_NLP6uk|VxE(U>IWIaLk+>72BJZ9EvKyK^apX&H zb|ij_dR;6b%X2aDCddXANnJ|31=6Rtl=(jKHppESN&T4k0K_{{%KVi02xQ_|Nvi5L|K#sPQnr|j*>7vD& z_m$+2#9|{R8^k%*CzWz)soi4^j8TL1f+U>;JAo0q(c$ioZ#H@UYM~MwU zS}9-RabhEo7HWQfn%D#+P>rt_iOti+__C{>@G7w-WO9|4`!2B~$Xn&p7PEH&IjekH zqumqaLXxa$NxK(Fs|k{nw)=p5!mEY!R*StC$RqYQ=+;DgACSM42V2wLAEY|3;2E`# z?E^sCl$Dz6*av~MYAZ=S`(TiL%7blS_XC+1B4rxc13=Q02iw?g0XeCB(Ps8wkn76x zY;F$$DN=rBOZ#Y$xysLMV~@l$t>&(KUoE?~w@0I$4=8W2y*&=8=I{(cXE^PNNadsE zf`N7iWX>pWaG*U6GJY)6f9ODacDgWO4S&<)IDfan_6h02wzT<3`hLTR2&2E0qkuPt z@%C~V@CJDd(z`JBN*TiTPU*=Y9pHbUp_XoKfsS`R!Z4Ur> z#a<=ZLwg{If#VdTw$E=XEARBS z-2vjGywkh(WRPp>jK_U@D#%oxVU5~jdpgKm<*z=mXM(gXT-5m#^c^kKC zGq2u`6Ch4r%Wdh^-*Fz~3b#gEuYr!sAUnAhX0M@+>mY;Jmk9S7=D3BtO7n~#?KRwS z8)PD%nVjY|!f_X=TJF&6HPg%Fc%Cti>Xo8A`~b&Gr1Gw!%M^MAI9`F&AF7j;US`Kz z=$XLh{q}eTI@~fv9Jj(ITg>7pmMJXBXpR&{ccm3-kZ*aU&|4dh;+bN6eamfV)Pfx) zAXAomIK`fh3YntipYe|TC*IMHN|~bNlLPg<+Iq)08iI5jqZ3c>SVv=M?!YZi@u{OJ zWRCaLWqiEj9nC@7uhEIGcY>o8$USZ!I*H+EqnA+m;R%j*D9>w-N_KkN9UW2T3FCA< z`@J0wUyxzzbaL1`$r5`!yb4w2tlA1oEhfo|jRZ;n^U-7>N({2 z7d0(lD?xYZI7(!R-rJL{1bu1I@llrO^W%6FkTrIc1*x2;>!B0Bj`B$LTt!k>9Tl@g z5AUn&#tlccERlP6KFK`I>yD!*h<6uVPodXcM<0-hQ94=ab*2%Y5H45aj7f zNgg>q2kECGsmG4NAoElt_0-`9GKky9NH^LK1BvA)NGHl1BWTQ4&=xAc<&DFX_5b@V z#-v=-^gp&yMy<3URMU+rDk+;Z4n*U=O7V5lc#wGR8+5Bc(nJvF99fHMNs~crt0k$K zG!^7C6_wOZa%BmxX~P65QzwbO;zwl5B1sx1&CV*Kv2&)TzQ>_yos#B(H0-U*2=WC| zWo(qGIwh?Fv8i_hy^>aEjUmk|lu!F<(i)T}LB&L$CT&1#d{k2E>6Ww!ZCHGz9_x8% zzDZl5`RlS$#-4NvWN%xY7`&2`PDAr86-gy0or6rj0Wwue(s$5&_r1Q$IkzA!=>k&a za=qwl)Jfm#x$`^wa|?2lE|VVG5nUixK?{aO-{Ooyc%*pq`mB<-$5#_(o<2KoAd`#eRNsZ?4iv~`V%q@*a8@}MM)1(FLzo| z5kIdWkX*n$R21 z!j7f1-xidjotkY))gd$Sgi#w1P@2e&q?*~H93{OmTuADKR6BWeyNGlJvGM38ilr@tf`h91DQ|R^GxzGB*%eVt)$E3dKF8~%r4zP(>%JCr1P$&$geAx?1Y~2 zDx$BFJOwi6OGufj$u7vuRxy6fh&j$HH~8*{gl>mmo_sBW0LrQRM4(=(o@au(vyg&X~WVwA>StXbha2f!`e#{m;5u@@L#pU zkdXXKws=48KDVLEkd%BK<#{kwPxXt}q~za0&TyZWA;KSEwN21>F# z`6=>hpmxnxBtL_m7aWz`_gazs5~N$Cp6Vr$x6n-I7VzMW+Lq*!PEm^^qb1pyT-GUi z=IR1Tb|sf{in`BQ@PSlxioVf|EXm88M(z2KJ;_xd)4Z~7vMDA?t_2dgUZy&b{4q3# zs}+yK$@QE?RFdNsT}IPRBsX=65!YitX=wH!;z4<7+D{AVoCf9P?{+%517v2M)pPgI z&J!`z|8O@8?SCbAfsD7(b2-@)Wsa>=lFNKOxff)LeJ}OgNbV1^k=_Usd3k6zlLw*} zv(=i+tz;8q(&rRoncK;MAUSDL&%NXzkS|pUA16mS#eVLG+hd+4+fbf%T*Bu=UJ?;4 zzpjjIu~*4<=m}GK{g<2p@}_wy&Rt7!I>jxiqv(jYC^P+$k^`CDT#I1u;zWez-L0kO z;wkx%$$Ue1NmHt|GfSk51v$g1*3K-IG69j3kMygUG7BV@3~( zBlM6>NI8IU@mQ^9co7l(a11>!UB)NnFi1K2va?Ql2tvKL4}EuAkp4savdk%ZgIJg8 zn{ooF=#3#Jo0ym`m15E~^#pQ%Qz%=t4Ur-mDb;x%)UF2+?NZMp_glPj za@Nl)^*TKrO)JhXY52SKO1%Rz;+|~zeniGmnM*6*c%YCWVrE}!kKf?bzaSIDzLp?= zL#7G)QHO~<2dT+^lprsi!r%Byt?dj>eT`a#kJZbpX+u;01L?=>y@D8XM7=Jnb(^87 zCFvvp-RM$5Pj%MMlv*`M^q-c0$y$s~t)CY;#5m7Hc_Tp~&IZ~T}Jm>jT zkQOLc!}DXGIjDsXGOF=T+y zD4@3qM4$K2GExJer%;Wi@u`tHVoq7DdiaFY=p4~o2JqPN8#*a9F2_K5WvLsJCa0!A zX4_JI40>oTBBF1MIF%u975uf?h#E=bMI5q6^wy`?TnNZx7c7_>&> z&pPoNx*~NdWU7vmw&lyzInXm(txT>>U54B{vv)yvJEwk`BfQE#*#Dt7?@~8HW*2=X zN4E((Qa7Q+u1}{(VaG>gZFZ#YK<;P7stA!q<#rPhJ+ofC{&ZZ1{i*vvrg0=i`>?48 za*D_%v}W&1)4oYPgfiFthfYPAof}X}FXhoW2 zH0@$4o$8_7%?s$14iS^j#niJo!mcJBlk@wf)Jq_L@{NcTFQ;AxX+e6#kK*OjDqmf)f`c;r977D{>;?hK&GsgHNBepJ901N++%%yPyGWjv#M6RgUlHM|vmR2%X^yhI?bwXbUNGlCJ>silgpOR@6 zq303B4Z5C^Y1MMa)+al*S|@jhx~F{%GPjrl-3NSSE62? z6FybaT0!%otGdjOK6TPMf>fpXRQ&D^t)JEz)CG57pv3mfvn__ z;xepCdjPVHb9Wgwq&))Z!4Z(lusiKBNUc_SUM|DIv?r*=`>i@LYRA*)E18tLsf7M4 z7L_}Z_7bVaa&$xQ6sHx>6Ed5{+h-`@<+KtY&B&wB$(6LSdE$AEQtkXlTGc$!K1(^; z(zHL*s^^U%nG}xN=&hEt8hN5s8>@D{omLB)17_)YJx{)qRtF@0h%EEHv?h6CA1x$P zC+=0srpG}~1J&~7(i2b~-ymJaWvHB<0@6U`UOPPvq?XcLFFg~)rS@DJraM7WI4`5t zC_NA4*fd$5PtwPLoLweK5EXprD|_tMEX*ss^*e1rt~5_(-Pb_=#Jm?6(Gk)>N0|?*YlzecZt5S zs9Zq$1`sDjTY^M(GpBC?8F5i33Ekq-51`Cr{bXKg=_eucgzIh|o}T_KNWJA!CNup4 z%KR)+lAQG4AXBmftu3Rkj!D0T65g@P63$3}4DuPbp{C79{|~7?<-MEU!)K(w%M-K1 z&Fxb2jC8kr(N~{kNwPY4V8bsGvRP=iYnx z#&kbuzN>aUcBbbbmG`%JIP`S(rH{`SV{o!q8>D(2?6yCBB4kR600K|&Li*zTBKliL z?g^T9DSb)4sKsA(=?fi{YHq=$^rc8Oj$?efA0T}@G+$ONeA)^QMjOZ`h$17t1NYkEDbN7rvV}y@gc7{Ih z7&YIF!O+t}e2IYcSi1Mk7=lzknq?|W#%Q!gbM|{_oh>6AsRsNca}UXg8dF5ASDNh) z-Qb-OGe-3Js4(4wEj1#HE-?}^CAlBc?P(cKw7f<2=ZK6Pq`DU>Q`s{LK{Tbup0O0Q z@E!d@W*KCR|0A;;WWLgqm2n7V{!FFH$~X*}ga1R0fV}&kR7XL^D9u?J$3RB?Ppab} z??YsHvNFB_x%@xm1c=Z7Xg&!t`+qc_0=fG?slEkysPf9rI0y2z(vzKW9;BDjlb!J$ z$guw*7eHG454nieSo1%6z9*t-WhO|EC_Cc^$he7jPpEGgwFyK-U;Sj1-Z$t?_6*}# zL7F8?vMQq_$O4Xu=pNUM(qqMFT0KXXp|^}P+{YGCPw2$sUDLK?lpia`peL<;iM-|( zY{{qqJ?Rsq=3N;L$BGgznJqo5!x^7|{3&i_r&P2KNkojewmiqtjX;p0FO(_Ec8Q5w z4_Tfo8STc32r-Z6clw@YMmOX>Z?%-UmeB_!nd2S$N=`;U>W`=?|7wN=hD3cip(wkRuT!t!{(IDko$W%2lW6`Q> zdrML)GY;hmog`bML1xNWG2W|R(0eA`ZYl_sr{^)9oGaHfGaaPGB|X)-avqskAmjek zt@_%6PMLYgeV|q5)i-l4$Wo3kj9UN91t6a4ZPNjni$M~3wZ~-`nz;mJzQ@r7z3G;@ zjQ&nO$uhkSFP1ZBu0Zawn(j-?EwE&+g`VFznlNgkGdDrz%v-&LC49p(w?k$^S=olR z%mW}_u}5vxQZo-B_bu#E)0_U8M<6r4txT1Xc^sNwa@>8coHO$T$ZdmOp60%JnWvy< zzuNT}n|Tg;D)auJ%TSPc0jWkk(@WUicT(mh$UF>@c}>l{44I8Qdv^Ank@*v3uJC#k z?c!zrg7!J2=G?iNSCQ&+F}*xqz6&z1AyvIeQuETxKS2g@Twv6`%)A5AX|a@9l}S%Q z^n{MO4L?_IW99?Myxt^bHf25rdB&?x^v%S~CrD+C(`Ag>&dg^hVSk5wUSDOtMXJWF zq|BwvTH{1spQP(De*Tv;8-N^TYcsdt$IQlbx`WO%T*g!mb? zTbZ38WB6Nd)j=7zGdqtH-vMG_xNx`?~3QMf<Sg|0Y=lAUS4zEYJ0Cnl%NaDRp|-RsUvL(?QZ2>fZ8Pe~+x$APaxtC+OciYd%Q$ ze>z#{-y-V^kk{q)RDu+OY!f#bewRD`Yy_1&7_Gz6}gw|Nd&th&tm#nR5!+q?p z8a2YXQ7JT^12@cQc9f_+&7A=CVk-sfqbF)Oq{?9lC0UwAo}6$P1z-*bO1 z_>M`X5_-=(JK=|{MAWnmdnt6fCd-8qx<<=-z0X<*lFe)HE`u@q3ut~kTCeFr-_qHI z1qP}`4W4t)`&P@|f>ir>&D>?EmAx0F1N%QltzPy%a0F z@}xOGKp$UcC$!2wNrb$wOFHp)>zsWKGBL+xO}i5jCjjSfk+tZPeHof3vgbheY-j%j zGK4(`x}7QeXR;U-wBKs$^_p8SAp2L8u$MYr6O#RRfq0i8olajron1l;84#BJ95R_a zchj8@*~P|-zVS7$*t-l-*`+{c@tkYalCnPnnaT4h&9K?!KZG3{Wr!5fql($2uXSr$RU#U-&pv)S9RsR5^H8259tCvki*x+=e0rwe zaL=S$U!2p>h9|h4X$8-@3VKfQ^XeGT+_?#QhD_CK;WD&veg$IT^U0z#u z89F=nQY|WIuT?D5%eim7u(YMRe}tMEwLZ@MluFa8tk(S&f44!-W8=k)e^*5lLx~7I z^M~lU)0?EuZ;{tVeqMAg*ZC(%2Yxzq!q#~YWDCbB?o|?`s!njt?0Ws&ezaW zGqyDA8SnfDdLD4Rb1Ps95n(qh+|D$Xo&P~*0!Ki%0;W3OLnd6Uv`=*!CW!V4W!rlz zV4Ab|1fj=6t@BTFmW0f|z4bER3UE0~gDmAZMUXNePZB@Klm+o2k4yZ7OnHzF^FNS^ zAf?uQAXPvN{La2eRegeJpUGZ zJa3Rp6OhB~c?!}Dq!EoW@e`yuNV$a{NXrSLkKO3|L33*m-ptX=l&URK{lR{eIbf!< z3&`*6N0|fWIK4p1^P4Z`fVs|3L7KShn#}?8oW3CK+ek9s*%M?t`vB&E#m?R!Q+XCP z2NXK{f{f?6(j2hd*&pOG&z0tY70v-5Kl6-c4p`+J1hRr>G;_de=U|X|Jb#%3);Wiw zre}DzG6$@84u{OGvU&+?m^V7<>;(0nKX`7cVczTv0SCC5GT(>{mloQxgZ}6 z(q;Oa4>`wxJQyv>QRg_2D?H2eH-Fe)&Zn6EfDAg^C}oK7?U?A!!W#P-k}@QZT`G%sO2=74L?ZID^QJ4Xx6 z*PJ_{`3UV-eqUdlpt$bb4VmsPJ$Iw_yYm3bGeqremB=YOQCO{kteL)Vl~Z0PYEQ~N zr|LvuNqP^FdMf99JW`zdpuoWUTqs_3bX6B!25l00+0rUP;UD0e!kTSAw4V+hPiK$(}Q zxgann390)2QJPbY%t@OlR@DY=*HgI+@j1B@#kshF>x*d(OyXQzA`#JhYjx3O$cH2% zTH_JVaYk)g&U)1SCC8OUZGO&IAbVLeeNQT9H%Jw(DZRy?vlp7*`$^4Txkzq@r(Q!D1V= z138a%k}b)>oF^bA-cz9a4|ASDbA*yPobv)Q&LWxWd`{I#qDOtYQ<4ig)j>+B{enw5 zH9@*^kD_sr^D#(-+CjLUQ)f~UmF-GDT@TGFIrTu+27e%JKsF|QAnhiJ=e16i`9_Wp zG`ABSgnsl5;+)SXi6_{jsU%NxhC=3wuO!cNMu2SO{_HZm$T5*crBf&|#kIe_6lb>o z%`qc)n$w|K)86I;Qtoso7=4FV$oRXx&9Nd?UD~JCQ@tl5+GoC6F>8{W3G$Oo=H4PV z52SydB&~DDg9OZ$q+RY*Xr4v8(z<5P+*u%J6zQJ(1<1cF5Y1Raul0IhmY?OTQA9zv=Vl`10l zC{isgF7t}YJ&sfdnn@CqdjchFRHY>6Wy}2*dj6q^Ue7%-_dH}yZ!l<CyCg+hauvK)Nb&Dfd4RUs`__Kf0wkSDP%J&d{E+JU4O;lZ)v8 znl`7kpasJ3zmaR4ELKIDF)L&8y@v4<6yy}hYHkfd&VW4DyBM|V;k@&B z7FEup!H9g5_akH~i{__aZOgg5TObYQejs;1KItP{>|EY`kdquu(EDh44?vp5>Y0tO zT+e$5QgMycb3gA5p1Xm*Ah~ExDa!qR-dlR^G{@Pc=7)LjP{N3Dl03?Dn<8pDl4B71 z4ojW^q}@6x^D?g(NDFmu*uQzjL8fq&G{RCPzY=+d^rgw10y$M$mas#9 z>nUP|>L$$RSWR=QYb3(w~C{dXdjNl$5>&FOp#5i#Ok zG}5h&zgr(pb(m*!mthbQQRYLdWqF1W5q4ua#kr#H{%%9_JEO(QY}22Phh`FlTCAv* zOl8jR3YpS8GtvrhemCf$vv69YTruxN=66TkPpbWbctJ?dpVvx2#;C>T`=UHcRL@M$ zA3jB_klR$5v+@IwS8?{<5B7BC2Tu_;;T}hSMlB~l3VM#JJ;a>+SZc!xT2M(@=DhrP z5Krz2bPg>)5#$m_$Mg;B|3}t)$46B?|Nl2jmR>>?5NRS1dIzOR2k9krkN_b|4ZWjD z*v)Q|-OX;Y>1DG?=)Fo+Km?>o2Pskn1c5h2lp^Ij=XK^>K0kl^2aou4W=@+kr`>yQ z_zaLax<5yT&qCRIS(F`f_#BXyyso4(-|%_Jp@qKeEXwW~VGExR5=ie`336k&Eqnn; z(KX7BJ^Wjc!o^e{bcBb4wBmIo-Nh7cixE2~M;!&Y#uCF_$l;MNWhW&(6{NJ@Q&Pjz zL5k=-B`rJ?^>clt(n=5aBCQKm3v&)L!*f8stfxxh4bKIs+1j6Fyy1BuGvW#{$quJ` zgQ=cFSIKtwjPQl82I*Hv+F49w4M;rQ1}SPokhPRUO`Ew)HhhquFMK0pHZP~0DAd?; zCaGONkWG-On4?l(5xyC15&l?_HQ`%e`C^{3yd(TO)W)y+ndUx0s8;Xlr<41`cf#_; zIjW>ThVOyQT)pQW4F3UX6>20);Tmx$`~bAJ+?1_6e#Fu6gCO(lQsx|yLm<-&OLAlQ zvG5}xwOK}xqv#h=BUCAlhyManVy7Y}!cRjhV!pC`GW;CKs&v_co)N!fOX2rH z8htD+FCK9@{7 z?IK(t!?=~{DX)llkZI3VH0~6U1Ty_^MLI{Mz_RNfMY=|$LuLWD7d_(nWU#RE#f&y{q-vKSrIQmn)6;9J?S0s2BiCWRrVzj znqBx|w-QP#GQuBZAh!;Uj1dJvZuV3%j)-C)2gWMmj3@!Jajqf>5v4(%&VZ5BP+Dsu8i71%s>r5@W*`@O zE3ze`1xVUos_fe$TG_>{$xYuG5z#NmZ%;&fBJ_n9y*7RVp*v&g*(WJ;BBBGdM$u`G zBo_stc2C!9>@E>8i|dsl7imF$uOhmGOw&n$$nJJAM>6UCw1^^lFDOPtU5y;Hj7AhJJFf1%fW$;g4ws_T$iMaz_p9Ay_#t0l!Z*%lu~21BMJ&&TLnY>{I@ z0((iB+aoJShS-Ha&tZ?6J+f-#B&2Sp=ppS?i<}MO)K4@%jhtr}kz^q6Od7QskqaQR zg?A?DiSfuKNNX{BW|>iek@QR&<dzLHFDfWE0O+Pz(5I!InGx*HaxBa_$-`Iu}V5gOt8y5)^c-YvhA2{J z=>=GBRZ@|9OMivs7R?l?zx1kIth*=C=(+c`SbsHKdJS4X*DnHcX;jmtVueC;B%QQe zdKX#&y$Z5co27pu^}`F4|;`zqa0Z=U549$xjsp0Ifd z$nTq#Ryp&xAnkbFMBZzT1o>Ov^DJ*RJ4F3tpO87E?`fLpYm#IlXm26pFvzcpITmCl z?X!t;1^Im{2x*EAmis$G9l*eAhmpoOd=v`W9w; z9ELO|^Cl~;O!E(rx%Z7C+2(y9FWidcn)id;%~NEZ`2a|3-rJ$?_?UkLiRN8Ldc(+k z&>>>xc|Ef2GXDgbu*WC_m139qFxveoM{N2wuK5^bM%PwpeQ!PqJ8616+)qTb>C+BM z<^YrIp^98EpMuQuDT-V(p9Tr$eJzLKIuX%=uSyi)*15ql(-V}|9VTBdSL6>SZF#j$ z?zcpU~`9Y7*Z_O7$_UN(qt@)B9dh~m1{uN}6 z9{t{$FN0KOe>Q6G%vV7C^|w*pnXiHj(xb#X^EHrBdX#u?{tcumd!|v#XSo5gNRJZv zEH^=#>fd$sx7-40SVorAs1>)|k)-7Zau=jb{}1F3kVQPE2(9}d3m1Km`4i-O?t?<+ z0myCcgMvH+S*Gvq7PmYCnXd2d7PtHlZRywc@0vE&Re8bUyC2@!_)kSAEZ7$nx0Pr$?_?g0hatA#bZ^T2UrS$yrQo* zOFM%tfmKKodtCxMOr4`75Ny_qgOB;}J zw9hXsPq1_WaW7M?W3u!DX_~IICR+M}{6bIVNv(;Nejt_pk4%4%Pg=<^(Y4D|%OK>i zo9^?|EfeF!*xgO{`FWQ4kO|j)KEkpTb}m#=IW$|MK$g)hA~JQeB^G4VLX{u0#R;;C z?$A>*ZdiV&uiBz4i6GDP_Ykd?WRNC$--))QA%{-A@5ER#ATvVm7jc#xkjb@FPl>nW zff%@d(YH}7E8@hs?0JIhP;W}Mtd8@i_G&oAgcPs?Y}YNFT1kCs{>)%4mp zXbA*4D4mY-{F9|FNGU$8FlvV^^+C?~tFj-qG(?{N;PK0-{cLIM5@qkirKs5Tn57wV zs3OV8F_$eS5EVC0eSO(75k$onK_=n$J96|$T^o72kEhQ z{OG*NauKP2Ggam1ttCIr6$7+&eD-&t@jFXFx9Ee)!;1!&i24FVdHC!xC8An`C=VB; zt^5CaxX@}38Rg-EbOKQxE=Xq(<>7*K0Z|?5bO%u$E=Ug$<>Ax1 zmWcWaM0vQ7=>wuXT#&vX%EJZe2ckS&kp3Xb!vz@xqC8xXAQ0u@f(!vs9xljG5ar>5 zi~vy{F34yQ<>51_6kmfV4=);ACdve&JY0~8Aj-o9nGB*lyl8OQsOcce!v&e)77_aa z&#{eKg{Vbt5!GMujGCUgjS2_3&ogSHRyisXDl-wGc2o~QZ%?~R1}EnDS}u* zR8Pt3S~bcBI}dptZq%wpxgewZMbY3IQ5hhrUkH*3qWXm(SsU}@2kusV#fXUHfvR6tX(keSb$~X)IqAtU7jX+80_O+<1$l=(!AIM$w z+#Pys85#9Ix7c9_)nm)tsK+3?_5Qv%>Iq2g2xTWc>M2MIk0Oq!XCO6KD3TEM7f3!i zWux&lA?i6upnm?I5cN06k9r*@NBslh)$^Pd^#bJcF3NI7)Ju@7Ty~?D5%mhB;dCXF z6ZINo;ZjAGNBs*jBk2Qq1JZSsB5R}Gf_$l;q_2y52hv+V-QF1W9^_gfrL`qWqwoI) zXxr*5LeKw!e9}#kT~P**EBblLuBdzJ*j3B-AQ`du0`9Z3& zZwQ$JAXV5mXqFOH2&A`uqIxPS0AzeoW%*20$#?_#&-8|hoR2C6@}#>W7otkX3(s8r zr}E6pQRP7XrT!v)^#&2)&p+sA3ilyHUt*f2?7WKln6&8B-m1vIQI+Dw2vRgnk#|v_ zK<2_)Nsa`+kE$LoBFP)>J4Vf5tpk~#^;3p?)_Rm@dYgdyj`#)n6|pvlmRI+U5=@?j zsk8#Dtsv7@_l=U))*#Jv-za5m8}B2Fe{mgZT4`&0kRrvT9YMYXiQrXGA0BFq^qqNFf2Z9Wk{a=#Hb*O1dW*66?AVJVtvhIVHB-2Zv zdgvb|lghV*eIP41KOab5rX8PX ze2{6*CmJ6}$AJH8ecANCq-O8`lC|UhOXw>PTtTXS&hpOxhqQjCXVUiSxbw&ed$tJ#0au|EGL?Lz)bD)9dE2g{-M|H@4F{+Bf4J>d^pPJY7e0~y47 z!XHTg(*L#7pLg(t%wTw3dtQkPG7O{^-KH*o<*maJCCai#(Yra;?D$CP-MRX?US;cw zcrlkKq(|dw*42=iub)6ww{Av1&8Nrb8rE&l3ee+oP3sQGWb5&{mUTDC0zE$0w(f=2 z&91UsbbF}v2grE!_*~C=FkXzXCXO3)Q3a$GKlVW{;4 z$m4p-&T#8VkReP^%O`e9(U+Vuh!Eb^qwOUqc1U8&wyBx6$!PT z1sT3t5tH>C$WT7Zb{HmG&x1tqSvEbzZM^`JSwv~gv0emO(?F5A)=Q|LKpuA-h6UDN z;Vlz6lF;q?fW{@>JM@_T@t#p+FCe4 zjBzpR70Iy{1#$D4ol(oPmPzoD{!hR9Yu~L9&#Nu7R)U@TH4B3rnY_&U31sM=bCDGN zmRqZk9eTp8l9Zv_u&s4KdS9Y9{>V;{-#S4khpTlv+lh$LvxGi#*kNs*Ao|yBZb75A z%i05J-FK+8ezFF^PKVD_etxnJ19?fOFe0rZlMh*kgM9Sq2Qm`G$Elmf9kz~65bgDf zpBQ%-j#`6}=PPvVA@h8~Iu7+?)YCdmMC9<6{&d83>m=l`giq!0u5~7~mhrjg7uD}t zzmc`N<%5h3`Dv%;@UAr`LG;SYytxzP_rRKfv;y=w(qke%s_$iT3yuDIYE6P2t8VA1 zH3hX=OP@zQw`M`>(Gk&B;`g^T8#!F5YyEA_fmTy}uJy{g99la?rto`hT?wtSdTqS6 zu7b?ZHI>X8>ssVzT`g7fZ>;M`OVf7It+ujO-&)s0Ys{BQtAI_C%G?X+o*ml;q?N^a zwofi#+XBlwb^j?~+loAI(Px7NZ972h`b@8oZ8z#LYL-lko|Ccdh2=AB=iaztwtbMf z5T#^_+m0cv-g+qlY$uWDuP3WK2iU~(rF37)|B*S3)GwzhJLPTXKyrD;NZ;MIokv

$+Rzu%_(|v_|PU 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¬n3(-b#cKw< zS>@HfsvYmk8h8g`7V4Arx4_g~`GRe{j5cJof7MoFXx!zkoGAT-nJIQk>*JY042W71 z!2&OaR8sV6wIsuZJ4(|m{^wDw@k}mp`x;qcvG`*a_3%)bGBBR}UD&?S9JX&Xhpk6h zEPl;#f~f+@6l0%d`XdB{xjgoq!iODyl;>v-JmFaQXebv51p-L zKrY%_fZk7%7$l%qbA{>!Xd_;VT?^Y2-e2gA*D+BdKrK(CQI#<7yf!0rTrTYbKRleK z5o-H2)+xRVQNGWUDflO&zIBt0RSRzzS5ws4qc4cvi=K*}CVY#mFt?-NPxJ_0i$pB} zyAJ&PU!6v3ZXe6 zS{qO*dNcNc?Aj)m=xwJncwJA{P~kxtRAj8*!`|&s|Gw;lSqS61SbRJpbqU(n2q%?E zJ3buR8iV%d)$b}*m)vt};npO2wIHrV5XZ3=bk)vegCtUa+FACO=TWO|5PL*5GN^1N z$TL8Wp88KZeILS|d11m_cXrz~9lJi*PSc(7H+RF*Ion z?~z6)b~D%4uz zoBi4&ovtw7O+^XOvZn!+F=>xiRt~RdhL&9kUofG195I1UwGbV=QhDV`dxhEt&3=>m zj=&l&-wk*`<0K4yQ|*mBy2AT7+SC&?tR~|5glQru4M&%V(CybqYw)x5P?lM1=W_bp zY)t6X!NMWquFOD0$-qv7WITuruj1y&@luX^2+?PsXV9~$JbpLhg|a+(_%A;=kV+31 zWAp~@PA@UJP3q~Xdv>123M)TLN4HEsPlz9FZbf*I$oP##v@Jm!aYt6r7K^%e)3R^l zEim@MfZe@@mTlxAcy@FV-UoCDkv@2)5udBCqQ*(`mL&fDqa@FhW7SHj5Ahk!Ad=!` zTta0b&?UsQlXKtk0B=s0tdiagC9^< zC_@PT5IN?o<@4OXyO|F0nBrYu{HvgopzwkYcnID~*xBisJToj!$he%IkW6_^TFN_m z+COnjsp#-(I=Yua?kOl`;kPckV)T>AUVXa${928m&2?o}y2E$Nl+!Bd@dAGSO636D z`T*z3wB3I$d;$LNIP|%YY^oC7h+fHQT9^B0_yay&V)25|HkLibdb8KDR|U-|o$8?l zu%t;^7<*dKO8DqA@{ew#ukeB{qO!!|bv8hgU{H524VnRH2W5w*j>r2D$b}`hrLMn^ zdW+v-h};YIWn-GV*V=I^0?C+uJ3x2$chhhQ~&nyJN zUP~==@LIi~k+)?gFjV4z)inY7S5HLD<@mVzA!aeCWicztdLJ8@N$W_xe{ z&2h*9Ql8LHMRy#QdqDpBref7K8pKxL>E)qON6oGl|99G2l*%*?&BK7x#0{q|%}=ukk^xRcdR5vP{waJ6`E&v$#rBeopme$UVKye=LSa z9%~IkH2f7s4@2W8+~F&S70n~%UI+iFbZBBJ^$yfkjISH26mzjfRuZ8WH>*bTtpnQo zwU4WP^^oPl>9KTr5dHJ_`N^W`^reyC{`)>Zcvk!Dc=^eQJt3pJ`A7ZB<2Xa*&tLzK zjD|bA{Zh;}8@2uI7m2pySpTjK|qy^{(pn?Xmlu*nd<`2XtbzMDZFX7P)8an_nz(7Uuih3iW zen<;am5!iHh~(w$MRFK)zD%7Qfwt@X&yf8@r+^`HgLLD4JM zT84d8p8I?Pr|Fq;jM#EE4rTr8g7m7P%J)x9^*E12 zC2j)GdaM9b3s>UE*SfcUUMzf~+j$Pbw;SA2*VBBT#N9h_{y7|hi|02&AB8e#2fXh% zPMvTbu-CpVoGNTo@HiK$cjYZgugY7r*^bZ;Be0sx8h>VL8s&pUDDfD~!w4-moK~X$ z)!fAYd!Z7ETZ`SKG+S$S)GR<{5kZSJ)Q}vo4rH}o`zm-=Gc#XwOs9Kp;T5s9Lpn7s z$g}VO(ryPr37}R6E&4r;+8dO2cN%p!=-$@p^a7&42IzDvMFl;CH#{!ZF>Uv?N(9>j z0Z(3NgViOHgPwi?D&w7v0lMZ1Z~$gac7yYZh} z2de2Aa2aBS$+)b+9RxuS;68+)M{yTk(9^K*?KJZ{eSxO!hh3bdMfgI5aDEsx9c%pc zM|t*ZL8jYlN-*6xWDskfevn$A-9Keer4K~=h7nKEns3K>By_hpP;wz&b&gW&=@Otd zu$oE#?!YN0C-#YVh;!&4ZJPe7M4*&7!z5op+U_1 z2x8l8OOwX7S*gY8(gwaQx++ABxlYIacvHN458oqbyz1aJMj)IKb%aVm*9^ox_4CS| zt^WQGOM#zRpj0%^Vx`$HeyHKMr5P96v=*#z`2K*yFV`ua=Fy*RFAOI!4z%}q3y zclRT@>~bDml|#i2!K=y1A5rQLN>&cv$*6UJMjn6d$(-=efFFu@fT`UtKzR`Fj89X? zgTStPwenX3;1`g4#Ws(Z=%$=Z^kSv*-&%UV&7#7!G9@xp?fAC=$IakX4|xHmZ&YY&~NG9>DTtOqRFqP(r&a7pgoZ2rECy(I!1mfuwp9iFPZ;%!8;pq z5AD}v@4L!dv_vplq!aj1)K$w=?V3s>ij+|F<}_JXAv*Pj#z{C@9y%V=M%G{Hbj+Y{ zq4#0r*Fg;d75x=9U|3K`i-yI&uGDVjsHmSFtUi%${v#G2*C*LScMlI3lz0Z~P9x(P z>{e`|)?kN$jzZ|chgM&rQZM|-ZdZ-ct51lAFGRaNO#;f=5>+Rp(Zb@qX9jtCLTEn_ zHG(<)5UodS0p_zq^d)$o+2GzTyzZU05&C;*!MJSVzq}3HKWilu)7`@hphZM$ZpDV^ zn_eMW4yh>|Hr zAv(GEb|ZpdG1Yb-|4TIaA?gGUT&V4M%&ee11%k8(>CiU9vdpIo?gtcAwByq>+K07) zl|2f3(4fd(X(L2w7WIanl==G*UfEUDb)cf3_J}njKNVh~)}Zy^ItK4x9_~bzo>oqd zKQRjTo-hmW!9e_olV}(Ep>ISwcIyxO0{K^a#qWd0Mh_1^%pjj?h|Q09^+K;yTj3}J_#yat$lBn0cT!&jcOzwf zcUmoM2+_(!7C(U~+)^{IE2;S)sI8zKA0$%+?o}v`f8+0BajuWkV(~n9FH2D6rMMrD zH0WCFY`KyAcl;mhObMi{laNzH0zaRYxbqh`v+F{Sjvfd%(hppP=-dCEXYBzmv2?Qz zoW4Z&o1YHpcW#`WJ`ui%ww9ml?VqC1kv(EYZVgA-c*e7Hf(y$WLPb%3!xF!w5m zeY>A9-?4A^Od#PI_^n#MHBG5XgqT-ekMDe^v+p(9$Fp=z#=(!v%IRk1Hz#Wh4eJVX z?+MqvQ*BuVil%s0t^O9Vbh6F#FSmcEczPB{O{dRH?(xNXo9)>Tqzy-RL)2|q8vV3` z|7}eBbV}XDXPM44G@6jvBTq4X(G~07cnHuP$JF|I{1f;hmgKQ=|9ijvUnj3#=zjy$ z1pg~G!&2T~2B;+dqbF*{D!u|zM=71lW(M(Gb^!A4K^`^kODw**ydd|#iELT!-vX50 z3KlHX=N|*sJ*+~SSf<`Hx$U5@yTfQ=oR)+&6S5AbV?8qxkNBTp(S>((C1}daXzvRd z#Jw+T5U<286CoLx*CKB+X}l7f7{n{FEs*mh_ftZrH8_8j1c>+BHz+IjA-dGz`E|Mn z9^Fn?am{RL?PZX&+30KBQEGcL(Kh7DKH3R{7d~!9O)UrkUVma9+Ygjr}b` z^!YPsRP7q>ebKuhI|E7Y8v?=S4t|2uXEMLL5HYYjnzUtGQs^#&E_*EKp$a#N)aGB= z2kNJo60!I)$opJ27XK6{r=U-^DayjFOG%qq8M+&;*>^^9E!>*aB8Y1d#I*?GS_E+| zj6$ULs1R+y4i#!vXd<*qCifDQkWuU7Q9VERI&`!CW#6Q9>TOC4fWN4Csl3xEoyu3> zF+KAZUf?un$-T**oZNF%Dm6wLy!3AO#)alvZ2)uOtxO5k()lHuvBPkFm|UmVyBT_i zo?M@AT-XQgor*jz&$WQuW6)En_)CL!!pBAsM`>o{FZ)ZERMQ6TO~BWMTSK(fn^L@X z)ea{2b=e|zt}n6Nv$4G*=dGz_omVlWRPWUaMDg&f8Rym~@kZXAi@Rw#JZk*1NS#hB zU$Sp<0Q@M*+T5C6^r=Mp&H!=jW4;dyS_1v9%&+6yov&%$k+_X}Ew?ts>euFbx@&mW z!_LmuzQmk@E34n-_;hJCJgWjCd3v+&pWjr_rW?_2fKE0cx|w_6o7HV+i54O)7QYVs zjG)(QD4Nwm5WF?_r_bLy>@W>+0EX(+^5Jown@4{BGj~s++r^m3RvW;72R+ zAYKYurnyZpLSpsU0&AM+`rN737JR4Z*ZAzdxH9+eMZDe6-Jn@k+mrNYhNp#K8A4>b zPw;O-*Sg_91YHE}o}gDf2@PKDR`&a?h?MoONwt``Rh(nFsu0zDLGEtiR;TrK{{6dD z<9&y>m-nU8>h-)sYr@NsJ?(sQJdLcaI;g!kk3!4JcjDHjReq;2^QEGp$l8;Fn z@FMiufK9|}BS1YpT>-eh&PsQ`_u9alRYRl=$4h0=Yjbcqqum_iYyY$9!R|Rpbk?B$ zkU2wDc+J>c67 ztzTuEgYv8)`W_x&oQBuT@uH&fMWj=BgJ7~IfCSLcFX(kOBr_jDd~RWj4hru&0%T}`t?YZeW-qbr{*S;_E~LkWI(Rw zl6I_0lDiG9FHblg$!T4jS7(?m^c^hypa;*6zPiD2dV%Riy!vx(c@)9 z?>#E`Nn5Q|qp3l9{TjY+ux&>Q1(W#1;nVMWlnqe_c)`gItv=OKy{8m)wP_bywCPDH z5vI0xzz+qz3fmhpNb_g}d@mcx=(-WYiXD_r12;3pWD3G4Y}WWCH}FX6ABD~8ENarq zbio?9gkN27v@?tou{3hC=s)lVVm(}h+IYT~5gLPc0J&GOc-~%ey2RqY_f&MiqW3I% z&Z2P^^|Gj$MNx~AExOD@Io5kShuE8seI;|ueKkRRUyV^VHS^AyZ0c!IcZ<@hr<+qK zn+m2Q<{4ITHqA^`H1=INqq1q*d){f~JCo1;nQrDc7H9u)p6OV8$q3x}F{tnJia!21 z=%u~zJp6=AZo31rHe&HYyP@qeY2#qi6vTT~(2^^(mhOACmfOc_*>0a9ijgV1H3j-% zgQoOR)MvSVS8TM_GT>>%=`i0-e^LALIAjP(%YklA(CHakbDb+Rch({8=@a=i?J?V0 zH``jjmo#@}cP+6G_d29ze&JHkBe!Yp)(`Z5$5+(cr=f$A?^bTr|6tyh({PXUb6D)E z`MrF?meUGRmw1rAFw)7&gSxjq@c3+KKdc1QWruPAueQ`%JxzOS+T~y9t@&a8*1CMJRGD9Xk{!=4KMCrJ_1EoAAgn;AD-bMg9> zXj0#`sN)drf%6ERV#hunO{JGH&VI|3^Pp30DE!v#3cCRsS81c#W@!y?ZhCYVKGHv= z(Q;GYpUV-u1GibR+U;6v1FJ8e#PA34d{`p%9z4#O@`wIm?Xq7a)A4{W#teHFUIkx> zu=R=v(d5$7hM#{q3LDjG^eT&b!EfY!(?9hN6fS5N(!gbmm$AZk(3&183+~28PoEu} z;;qTf;J9UV7Wq+8ADi}~hoY3(fv89gm14p`VY;t0yzhW;LlyR!N`v^1rU2D2Y1a%O z$^)w>Vp85s^l1;~F;zB@TNSS%7gj-dC9O87+WHLdyEi(8sQ9lux-5NeLax)p1+2vr z+O4}%Xjv_;W!ROlP#Tn|4VUX`{^&MDz(fhqIE-m^NP^&UXT$rwv9`P0C7nUAxul!Cqr>UAs>~Gt&-f0bADJ1IO3xh4%Lsv>~H$ z%AgkTTe{Ss;h;H1-{sx27nX}FfZzl9aF4{IO1NsGfGff%)yW}5q#_^zJH#1G62(pYfV95F#p zgB_icDSsPI+y5VwHFPKy9BxO{Cx1Q{G7|jU7OR}s0sf~`O>37`Q@^F@;OjP;wCDbl zMueFbdjRVnB%b*v2DRx0zbYU{;hM#j(zv&ro5eLQM1VfI9)4u?a<5Yt4QK3xR9ae} zb6=mOkuHw4f`=s1L^|2?3hzs{KCCop93ObIL51t%q$|WaH{GED!}E(?N@G;`$Jwc|vgg+V8K)v*qc!@w(LGy1=hxM|+KcD_fAmgx6Umf4 zurZl_LmUlwG2jNCXb6VCoI+Xf-Slf%bTphlh@)3g%6|<`HPk2c*+kKzQ6=<#?J?Vz zA3RMUybW!x8(lX?O<=Rh)0qG5L{Gf42L#C)^TDri`Nz+dm~88Ff9}?J3!7U4+{o5k z^+7**C!(~NwCP_e>QECeQ%&OCn5ci9!BO0Uw?RX+ZkoniKEGZ6I=C0>fKLs#4iHD! zTN`+t5POh&09}xWqVyMfa29R2F%{dkjBcV{onK3cwm+@?+l=)Rx|K(=a}*qpLB%#= zbPaN60PnKPP1>z5g4Z*M$G$R!zb{&etzYRq>ZhUjkMZ$9qND zx_fs1tp2Qt{%F3PH#fR#Z-QMMa$Lji1wJ) zcuYli&Gb*uU)|w-hqpof)(q7;V@KicKg)i2e`{B&@er4rP5aHi4ePE}t%|s9T*64g zO}I-i(1&kj;&aHKWv%bO&g!i5+gt)b+=;O ztX}vO@8k6fH%9Dv&iwPq*8hC6GsnZ{dCx8d%|xo8jt z;aSaN8l=~T<9%^(BZz_mnPkyy9v9U+2955Od*C>D=d0aUc3$9tl;KH?NS-h6%^#Hd4Ju3?2 z)i$6*Ex9jlg!Ffv`auiJRBtpb z{5i=)H^KWUSl~mED;&y5gJ!{EEQozr7(wQ2pm!RoTXbCu_1!NHd01?kd5gdfw4cv~ z55RqLq{qZMGClMByr|wRancE5z#{5~#E(rWs*xz2*Ma)wI?2JWdAbBQ6$`at*{`WZ z-xZNG_$WaGR2;dG#wNj!49MA7{C}giEV~UWxoBXgV|+99vU-H8!o~710~fTsRjI z$2?98CoEoPklQN@Ey_Tw)0KwvaB+I|{B?T)6yy_~%Y~&O*O_s7<9$tg82+MC3;)|n zlk3(qb37Z77K^Vy#9fi(D)&#NJI$XDZ*+wAFny4X9cCQD`MwX7FA}`%t2X zz+Zca#z^Lyggi%K`|6Rj_7cj9?T%mT^Z$oiO*(G@`Wo3)d2M<5~NaQKE@r>Sr}~BUl8|^B;G5p$&T2`VG~(8uc?K5AaQFs&WYTf zcYWcpl0GxP%g7&p*S+N9qV9eLZ>81H)<)@ZoRS}+4WUE)PLf-b{y7@99eP{SmwT${ z|GLQ18co;lMW}Ccz;|Z7yuybl+>gS87_~&{m3zSxw%2x9E)xkYV$zuYF~W)+kV*{% z;m?b`$8%n?7|{Upoz4uXtrz(k96&w2hdXQpIBrvRN-AQ%88rJ7#1u1V|EUz3V$f0C zK#{ab!*sUZ=%>5qNsCT>p=;<{i~9Z^G?A-ttNVd84@GQR6yrJ5w4t{t{p-rDY^BOV zedePCPKXH6lO1$~o(6*N0>*EtL8q%KH^MLc3dcPU_BT0y|G>*YY&D9-ixv|rkF!0& zqY*3p*aW5rs?$$=>T2&pG_b#nDel0$tu_%Y>&|4+Z8q%4Jxz3qpI@KrL84mxeZK8L zh8HQl>15moLmU1ROk4BUr>C0#WNK6t-ua!FPSy@9`k{y*;b}M*zU=!m%v{1kR90`> zWz7hhvWfrgq4kJhX3AcBT2@2|KB`()c|G{e4JPVdgXzmfhZL#K9Nab5q|A)_BjqRI z`GeUXW7=>xUXOUbegPU=JLsKi^C20_`IZAZB>ce#_$xt0Piorn9~Ct|t*FnWRC*e1 z`04Hg-==u=WrX#7d#QvXcdEHLaw~fZ{!(HqCHkX@FQ`TF^JmCwSNB4IT)T~Y3e)acuiX%hNBsJEJ$N*JpA5d=^zTi?T9Z?^|M$8V+`1q3 zioUwgcPJ!b@D_LzV2GltS7&%>1Ktwk=$iAU@>AtfN41ScwzZ!RYg#3{8{H02uXg{O zJN`f^VZcT_4$(a`5HZ30`MuYxwwvDo743{WSC!wu{jkFNmZa_gKew*+x&7hK%HS+FH|$$6um%MSkm|FoDV#ubKct9ztC8D$c;T-NZ6<6d8bCO4nxMo+nLa- zd}s7)f5O9=&rrY|p^w8Ur14eP+^n|4)Ofq0f!VM4DS#v1>^6rwmJuj{L^H{aNzI%@pV0rR_{YtVYe@g3g(ETo8Q8Dr9PB_gH{DBNVO&u5qX zc~!uq#o|{+k_-yav~P6J@LMS|YDHhhT^^LpF|x)Eu7zR^GD*<*57Ov!q=o4WWSoO0 z*Gc~T#sfm-V7Q;OyA6 zktt@rP$r$}odW*eorBEF3#TySH(dw4&L~QMM`$c=yn!Q-@vC(L9=~Vu-*M2c z;-5he4k3;@?nK~J>!$zF?*QT`85vC1xbu8;*r7_%=tBUV`1Z2EG&NE~7fH2%QDd<;tCqkA6y{n@xRMvz*h9A%;L0(#jXrBaEs=T1NFI38$;SCCgrhn3{jqH}ca7>EY^4$Q)h&@ahY z{k`0C{&&#sbx8Kk3SEhQ&drT@w|sc#+qChA1t-I2UW9&!cWSf2>?>L0 zH0I2p1Bj-|o_6zgV^Mf{o3n!T8?_Aj08+xyWxS`Ain@3i zh$C`2WH4w5WwqY|l$aZt2Mx&`|CkHERZpG{kgfx~;svTFWgVxG=#*sZFrST%hK1;O zlT`C|7hcIhR4)EEM8CKtg-(L|MHDT}s?eri;jzlpHpjM`V`)SVDUE=A8h7=X!Xb*x zX4N%6It`jiLs^eldB$lVe;JtW(JNhHcs;y;MC%UF8+-BQeIM@g0Pw)~o>lF+tTmQH z8zL^2n_s8>1+9ZWb#BVqEFQ0#WHb}a;#u%FVI4)Y_+JGT{Zd@fOb_98GxT|p>A|ix z$+Xm1ovN1Ma~X+%EKd5$7T*|7MmFN?)Hwh3a$e)cYXQJljV^1^p3JrbTOkxf+M2m6PV*&nB zw6(H2i@lNLt~HH+-ih zF0!@kuxTeO8e~yFTg&I5&(d1Z=KgAP+uHgvt<+J|rrishm6V+ZX^~MPt**0}IBzsR zy_$lU&`j?|V%cRza$QfN0|sT(LewkV*ntggzoJpFEKAyJ@G}t911m>RH>?~%&9QO> zjmNuqf+}SrnjdP$E4{PjEDPJHtYM?oSn~kSrK9|ghB+PCt&0)s^g})&eq2iQ`Te{X z{x847jjsawazc@7H1Zrvt|I@YCZX{6~xoeTAq8F}Z!&K;zV2#5Wl}9Y({xj6cwNAt0xF9F@ zB;wqdCltBt=fCt+Q$GsWO<{2od3wq+P{)J3SJ`eQw9d(XuUhW9S}E1)=C$@qH|I_+ zbL-_RoSKzp`L%R@z0XaM##qZ4BGvQ;sK!Sc#cd#LF>y04Rre@5x=WC()9EJnY3LW_ zyG6$Y<=7Xs5q}a|*r2g)*7Q)A)(=jnrVsLnul-B>V{wZnEN3^;mZni#le-V7w?S_V zOQX0!e|)F+MDFt9eZkVOGlRyN+}dN3XwpQcDkUbR(?p~tKK*)+f`9Bl?tz|G7m+*^O6$w;iPCZ`GUiZM#|~jnCgZfc|~Wx=#K6If;63q3=R;iTz*h^NxkgL9w?w zdrl!1E9B{0?EITO{$g)Pgs``=}Wf!0&Yib?gzB7*=YbVQz0RwPmYn;`+L@z`fZaxo1%O z>>uZU``zV`|Mol4(uq}iF6f5vG)|-0V3k_ekA57aXCLDJHTqC=LH-j=Pl&{x z?v3w;|1)gS;zO{;)Y9-ly=$cOFG6{6bA`WyO|F-orXygH_~7Bc+bNpsKU4Hv4bTv1 zz@^WL#>II@yISmbAs5^08runb0kHeoDxrye@|8M-(;KTUN@6D%u4$#-|XcSIi4ydKf zWyx&at3@jXJ&sZR4+69jcik47`go@Z*P^FYVt&$ja?IV8K?hCQFt}mS;tT@1y9Udv zkAU8v$iwol@_O=a)ppo?@Cqob^@8}_s$HOtuoB`eocVDc1Aez^nL+N&s}Iqd@DU3t zr_u_OJ8BE!cNjGL2hDZzTR&L!KZ@{b3J*)C;d2<>g_w;(4?;791BKlHtsOSC%y~iY zjtqh~&`(GcnO*p7r{7pyM9Re*_-K$!^w$`;Xg;WYBKZ=k%EH7Pe=+5v2*x8q4Q6dNrh<(y)&TsLkR0(e+#6oNdQhjIXux>t0M>cTl|(&fh8i zH``rnZtVXbac>@XW7WkEuj4-Vxd%-$Bos&7D#?&eqKqk}49QI)6hexK5V@6*nGDI$ zAX9@e^AM5-B10sS%1~%RqlVvi?RBlaE}X~n{NDHdeBS@QXP;~DYhQaO^Z`&?hx!6_awsoQH;0M? z^>%16&}fHV1$x1u8-QMNs148zhwk#IUOQQxF6Hlztw*q@~FChZc$XdKbPRnSe9at`QM{wkuh4V zmTw-?R*vI_a(S*E?naP*NA6Xdbz+c4#+n3VH>6l}wMHOET;3;XPuDZ_Qjp!aWmu4* zO%aroTY3}O``uTXT}aQUusx4+6BHWA=jyEyyX$C@d4-xhkFFC^Nl9giKzo z_Y@+U@vlTpOP;%pPw5_=9(2M6?j=z^zF!=*FK%{;a`y|3p-?9lXvY!tQOY|%^Dt~kr!s?ox35=p zVJU58lyBwxURvXb@5|S|FT?N9zI1#mSI{1NaLIdTfxj0t?oLHJmTP-|x7IJ}07@gz zJ-qa`OJ2aOlCGyme-z0Odw-1hfg(!defXic=XOI5IOd)k8hA89euJkXdpW|U z2@TK*{2O;sGZ)=;dPIheb2fAZm4T2(EV$+-Z$DIW92t&BP~;z zXe+E764^cnd`(#XeXA?EmL+oIHnb9_-N?Gz)U{{aO)bnNTan{_#N%`gXkFhC{2e!f zvW@^s&;s~hi~|yT@??kDmuVTevI4|fy755#ySI zo>z_5o{ANZdusN)&14%N+w*F;GPdW{b7&^4GA$k2`zoS99cr{l zYv6LxpvLlz6x4V$6<%B8SdaM#Y{Y`7R)qMy$ovS&VHoULG1|XgG~k%I_oDO~TE@5j z39k)@7BoTpAdt-rc#Cflmx?m%ON^w*h^-5W{1&A-kShNkok}IBv>et&;{b_3>^UWjObrD9!F3g__InYJ0YctPT%|^Z0&x0 zGkkCt@($>HB%MCm&phFy&>9rS`ioExtQ={tF+AwRtL}ZTQ~1oIK3J#AVP^u}*seQo zc`elsH7+1=1jquqL;Sg-wB$Op4~v?3sT{-@B&RtOpx@>BNYLTp$in!1cuj`sr0LgI zjzHE8JSX((A%~KUsZx+I9iLQ9y$-mB=p%;VD`ou5SF!~-BN>+u9zYa{8!P4=*>l;f z&89C&mX*uy>xfd@0pbrAr5_N7!EcMwVaQ;D_P?NLXJAi>(xy_P3yRW?Kr0lbQy%61 zRpj3&ZT>}2*ylvEPr)O;uii#B7Wy3dBGs-&sZZdShIry&HQ{Z3T@|}rwNV!aC`t!B zhuj+89`(j@obY`fMQVusGD;jbA>OXG66d}Gxd$~Q!cz1@7d}LEcehmVgjt{APC4wB z@^l|gx_d#Xq~_V#RX*67=FV@VA{1rU%eNRv}u4GUS+!(tzm3cP|Ihue zGkA7SZFk4$IPRK}6EO|5)f;jI_`w31bPY0N;smazXJh}ds^9J0foPh0E)rx~MplbL zM6aVPK^@Crg#j78mwP<<9a(Po@TnX3Qe{}aWPh$7vD!;G?xyY$+(AG}>p*w0hIaSo zb>%X9xE}PYm_mcNUeGmoZN)>qQcg8NSvd19e^F`ism1)ZTGtVM0LjcUn2r5jJOu>s8 zYz%DA=*p3vzSJY^nQkXBEMzz_2D$xVJ=hHI1Ucg^zqh^jW8~A}FA9(STgboB9pe=q zahnD6AKC<~#}BA$x~~Y`l%iafc~9H|&57_EulZ>5%i$j@WrJQKN}Iwxm<@D+Lw{nd zCLqosndK}(Z|_N``tCWiS5)7VLfNkDO7x(GLmgVD1#$k{PN`k(mrcsU(J#tRmRPBM z8FG7SFjj5g4b;Z9az9RXLCZU&28g}*A9nvP*%hU(4n=@^IaCkc*0MI1eWd!oVc;Tj z+`p@_dPK8rvtTo0(ZRM#Y#ofamgt{Hmbw=n$r{au1C15s0Zq-9fGg zo3QR*bZ85rEZ%bHI5^8S4(Zs3V*r&pV&|dUQ(AOFF`DM2|DkPyf;R>Fu$UM&zz$9;XaR~It~vsse)?gr#+2)jQDay zM+e`AY>hiI-K;`y+mPrJ^dS6imxajY3=SK)mVA4LHo^0b?XVHtc%~5}{e!qHPwT#KEKK*G4ltP0Kw<(ZE%+E zIeka?TwPigF`jr1_cG>7570tzkW#jxKyEGT0be2a-0beT9E#8l{+zkHbOw!gZ+j6l zF~uRHAVxQ?zEsbsCdfW2XNu7m+ZDD~ZT}h-HA-ze+4fd*P|Vj{4{S%>)f}FM&W=4a z3!?#P8_`O5uGchPO~&uq-kMR8CsN0=zv=4#X}&+Fp(J-~--H*JQt0IvOY5i3Vr)$4&JV?+F{4oadu%&K;nUxGz=8 zY{U%Z)Z z-G8V&SjtOsXYT;xTHr;~0RBF&@%JWM_ck+3Ppg1q6kS?|t6}S4R86A2asIc{vxurV zZ7v~$f^Xzm4f7T@3uYy=6V`gAJ_PXD9)=8#Zsl;^yfxFg&oz%As}zv^3op^@@g_&5 zbmb(d+ue}q@LZVMD*cm{6P>~TvKEYyjgawmb`oR9H%JL|OWWZSBbt-J&D3YCD^{26 zp6hDCD+1otxYxKi(H~=Y4D3|16U@%Hu?bL7^dQW6*iM;sShB9+uExQTSEsQbijG=X z_8W-ZbLlJ|mpJr3+xGKw1?Ov2GRwal@nv}>&2#VE?S*^Kt?=$SvxdZoX%CEp|6iWt zUd^B%PNdLB==}`Z9U#_az!Hoy@IK4LlOvqF=m^F|=&n-Hi1&kH4@B{Z3a>vK$y)oM zCC<;M&@bQx1U0TCC`^mLZjk1Bke$=9Dm*RFm+YKpKg$Tv?_Vpr(3dUrWfgbnzaM`k zC_?+w)w|a$&=nuU`WwpYg*Ao~kt+)~)?iIC!nqnmR7q@*$hyhO*8i5~YS=19hAa3` zt(wg%qV+cA$bLq2(t4CZCkSp%#*ejNvUW@5&Y+F%U)9s#rkAfpV-p_9_dprAW#kB$ z2rpKLbadg{4ta+8MC3}O3`%{S(Rn~D|Hfz~_>GHP8Ak^fa;PorYU255JK4&tz1?XV zN%J_O*| z?>X)>^CjC{U87PKuV$RI#V1dMcN^!rig@h;JeXSJ7DFeS?gme|AMJ^zTYBn=9K>vP~9-v0I=)ZF@3;bLbwHW|^67(gDURjjp zBJ{JU!Ml=8D2u*YljeGrML&FxxNXc#7Tqv4m#d3Y4ePP0<2+8Mr$Wu1gyn4T9G>$` z+|4VxO{Jo7($Rnw?=gub!>!=(FXnjcFpp_+V`8e_5v0$d?o;xW3HrPfWEZ?mR?~Mt zi0=CU^nNa*Zz5Qs4n2aKN(HT{rl?Fd@?yDvzw4-o<$o#bfaokiP2sOCXxd^$s1}r2 zlqs)>@~%DBRn>54=v&GUam;NucxXjvAnq;{3bO7_iCc`&(7V!Tw)^)*l+AOf8OoM8 zR1#>lLmjp%^=Sv2;dEzdD1b~WELr1>2VzbTXXu_Nz2|Cd{34S!IaH-+ERfm;BR*ie zE1UayX24?(^ymbv`a-3)p_R|wbN>Q;<mb zWzik`GO57|-fzbzia$se=}l6|Bd|8p>Ct2Uy+VPxFOULnN~7_gGX+)+UyMq@bA>gF z;Tp;IVBYO%PCtbF+2x3Kp$FiRzzObis3s`zhwcUqPtYqj!fS1%?x?1D^!DOf zuB;U-2n`%!EA1ilMPeD-y60E|Z|?qO3A`)NnVgKocc1HvVEYaFoQw|xRSE26xaS*m zSaP!6un>}o<71Ul!`C+10EE`Zjp(`Bv0o zf~+dOe^$fJY2`8T9VIiJMl(FCypLFC8Sa5eX!>5`;Njid3pV=oETJj2O}@hFVhyka znf%{mV|Di1;Ozj(%V@jsw)Wh@;7q}t)N51ed3etw?_z%S^8Vl6VQW&plJ%X*``j#5 zZ+cGFvSn1#{)IL4#+mEC@X5f*B)hD2j%slZb=9)}?Hw_?2e+>B$r=6*dq)BIw3XV) z(mQjnZAbn0nYJ3%^2W+UV^{OqU54E~$szlqWIeU@r+o?cFIf$JF1*&5mOT0nzxUj4 zOIG(k)hOfSql_ik)7yA7He_Vdw4%(*^G^BkU7mgIefYih4x6nw?*EY6Ukr^MpNpei}iXpGMFTaIb=H&sJ0rS!tw3?7KB&=>sS0P27R0ftoE;UsMS)a0fEvi1 z0G-EChyH}`vpgq$H{3GkN))-a%__BZ;?D17KSeZP|33-J-)Y3(*|#)KcTa z)@na`8L>f9RvW(4!M|8_4PCFM|E6DQt+2n3w9NiK^0waK$K{L8?fGN=K9?bL##8Pc zruE|;AU-jsp)!vd8-rv%HujvgqAiDM$xKKDU*o;mIS)l}TY*D-51^p>D^da!nV1ov zqKM&;fB8OoLA!BVq@c(mZSP*JVk!F;wLcj7g<2y|UTFn9brD^~MZBi`ro38a z`*%PgEz9sV3Id6q@PSM8--TYUJjo;5=jLIrc361xRg=skmfK$}-v!pQ7GhKtSb2cV zW5H-Av}NOU75~}>(K>hz_k=*lGuNRH=Bi9L9r+_& zusZ#7W&CrTG3FijwpRkJsaQhZcV)Z|_&Z>Aga1Y)cx^<;d^t_-(NitV+gc=Hp_?Ls zP07}zj;Um(xT+UhzB%`?po!2&FtWR~p(TQ3!|MRF4;IBP8yH;+{lWFf=n^iwbQv zD=3eypwsQJGu(4*hm{=DECmW;DUj`}$S)7C-Sv15`|2EaPUBjVMKm|eDceYV-@^8V zj-FH4aGj~9@U8wGsrj@lua#Y^r+5LJ`!~57Ef7Z_YvTxLqP*=k=v8XDe@{T0a)(33QPvO$ z_Z3xwws8{Qi@Y8>ctPcm6GqU((7_9;jIkG#z}PbiuMOpVBediiXd9v73TsJ>g0z68 z>%pO}?rrcxaeXP*7#YyPnZs+jEG#D5c!lkS{NK|3Yg!W4*htRwG2p(~`viANf!eln z&#A5y)T{>4$eqaF5z;%VRx+GD?(8*wCXEoiW4=exmydacovn9FP`i52O5$JR>x6DR zfb9Qv1{Cmqj0JpFR-r1Amx-y0F<-&{{`)r~xu;>IsV)kjm1 zSF$$FP##m{&_&K9u}%D5Mt#BTxxA1%@`3h>jL2^@2`JoNi6`NSfau9H$3-+9)}B6> z%nwwoT5MCoeNTb@3Kp?IjtZZRgA>YM(R-OxU^DLk)0yY~C5?k(7Hz1?3y2B>&viBa#SJ)pB&IOxwQA;n74<6zzJsudaMVMT zuE1?5n_(S}()pR1xrO~u4jkmQI}bJ%@fqv47TQ|Z1ErJj@#=`v)Rk?9SSTx7PsA`E zVV1LBmg3Ge7pcd06I~zY9n~H>#`st4sXhBv*rU*%thEsiF%@NbzW}i=ZPOP1m)8~l z8>3lRB_B96_iFH5PUrE$Pl%{@R=0CY4lFOoZ4@Ria5SJu6D%*(xQlIfDlat5dHDCFQBs@o0cb{v-%|6S!gFi!GPlpWqH9d!gkZF&@}F#LbsvLvVK&A|TN6 z7Oam5O>3eyf*Y}d_qejU$K(#=@T%(uo_hXPu3_&O;4^+s_2>@h;d1R^n!_5A(V&ZV zR>+<5OVNsOH|t${>9@m*?9fX^aC5?aJPVbBzTlRzKhkOFZsuBkgva3GZTv4sjFkF< z=lAVPVb4RE%%(wQ;H_!Y8Z5HGPd!|5nA}9+FbiU4A8#(BKN&&_(Eb;Ejj^$)XEVmustdOh9PH%8ZU*TU*$_F)l0$?Hyl zq%P+I=S>!LO)G6BS)aSCR6R(h&&grgC2k**609|qJ`=c25#ziw%oRkao0mxKRMQ#} zI(5CCewol8$o{j)*xqHVV+GJa^)i|N4_`~~!kd&jfLjUnT*I6$_OEyHQp2mA=61gS9qS}^gu zHhq(QFYC?ZtT0Qu+34*#)5sk?soBqxSXw%Cb@sB z7tN%m@L-o*r*ab8`t!Rs6v5s5y9`%1JLkeFsR6n*mmuR`$@LG%r;ygYHnIiD@1+f=nW1rM+G+bYhQGU8&AToDwch%-9Cub-3@10qYz+Kk%D?wQ~jue?tS13nYx)uC3Kj+cCV^5SW zcj$7Q@8ZpTv@D5-U{&z@fCJjK{?3~xT;I23zc&SVz8tTw4 z&~bhnwDGu~bBsgnyK5Xv!TUv<7o&x5X3{M8@B6LvPC}j4uz%QCczhJuqpO57w&7OO zmfCysTen=N$;$L}Mut~NAunKiMLy zLOGtA4l&15A1HaB%YldOihslJU>lH}J?0zF=No6}oI#PS6nB?jSlThqDLn_FgF24; z)%J1A!yr8g7jzu4*PMX?v>34z!`;8D@SI57Wh?1(9BCnCPXS5H#p~X?D5a3xC=sFD zSHQyNS}_`C(HG{^Ym&85IMb@B$4s2egU;?dF)uwmO_50v+Q#49d)ccb^GhDx^vl!} zi*sWz9Z%44oM2h|bw0{C#Pe~tLo8Qx0Ky1i_Q%)Z^Jp(3hClt3sadh+s>?`ers&$H z%IT{n)wq^q++lK`o!flNw!)0J(0{{xL_=8O|t;a8B-#(D7fi9oFmle!K;w=gdS7`om_kEWhJp% z+ZAQ5fOml8D=h}ePOLIh{*jzhi0&w_cA*jAf<#LFHHZn0(AOSm4g>L&xZ#_#>6LH_ z_MB0v(nrKn7@^HRN7P@F)C1zpt$G{9w7}{c_DQvIHruCB2GcIsO$@cWsl{pULd`E# z{AJaW@QR2Y;F);_)+&j(?gYNG0?LpTAc8y#4rRbHTHT>uB{JwXhvv>j4F3cCobhl< zPhs5*JncXkK>6#r8s=AJGh?*QB8<$d-Tbf28&Z86!+Vf@7Wp07Iqb8@2stGhQs4ur zZwp6f>f7Spe=_cS8YlIlhP|Tyx%?AC)-dO%sO)%12Z#`q^DW~a<+K0xeBFi6L<@Da-0DRTFC_GI zDL7Dx9NLVm{NK8$(7lI6!xEw5;8a=8%R~2_!W|>72OCSJ&@6}cc~sw1sW_-qN#buS z)Gx(Fg2284Yt;>h_>1^^FLdaur}W=et>uEgbR*2^ z%jk}|L{GoUh$p$j)wuI_i4#Fa7I-svK^g8z2Tgp!{rk*J@S+ZlKqjoA4qY0ION90Z zV*o81Bv;YRmBH+bUvrzlUpY_cPFC|Tt_PiwjO4D-(8hnq@3ridyw)VP^c23F`;vgC zHh5q>C!;pTAs)52U0uyS1)BIGc>a0e?}*X+;L@b`=N=c%vMFPwvj8onZ;x-sy&U=*+_21BdBi*liu$rOL(@s_24s6^j;qnSk7}6; zw^KiWy4`f%hI`L}UEaQG_qw(Bz9cJZrO^=A-pWa$=|E;^}?f!iRYiNEd z@6d_f57gqfRL5vM60B~X8#xXsU&cz$Rp@=*)R>2k()~jSaNY=`J=+SvD!>x3Q zr#Z)_>pjW#c^B=vU50|J+31a++T`Rq?NAJ|}rJ z_|jpsPb`p)(R>>)v>p zZP@!_sZrm&7;XPJ!<{>7hZ$Lo3j9PeLyF?-|u9hHPrEX5fq3h|K}k;l~u+pG$2H zdRGs$zp!h_8efXtBd6NF-Aeg8)=ZRU#iuh zW_lk6%j_?@=aT(vb@?tF)?_8<8(4GSLyfQ%lv~;4T1lNHV;X+1`HU&T`G%X7T1;R+ z6t@3nAkq|ZBCuUv^Z+B10##cU&ZK>O39>i93WE{48-8hcFQ{#LN^p4sm1?|113yPT?Cb0sZKat>>4a?U7rf zOnRasLdVNHN#shjT;63PNdRF*{8!Fsxa-UIVQB#;Xq*v`^WRnYw(!jlLi>T|` zAwIiv9p^HZpqL!hW8;DwD#3mA zM$0z3F1n@i)(>}__6+opuBy3wJFpj%=-7Q5C*>h1M9H|2c8x@J9bObQI2 zgSI-28(xXCQDXZl%*v#7?!9k-Gw0EbP%_T^Y<}FL{K9X09yEu)!{#j<_ih}NM#U$W z8@qgzP7kNDj5r57>h@LY7tY$y5_CUKU6!rj<+F@v@~FD| zkj3sfqmIvD?TUmk3um{)!06~oCPn@?dH*ttLWA}jkCm5>LuY7*$I~2T&CX%}Vy3a# zIhR1v6vS37L6yPV3i=bCFpL`J{McTl+01BG4dv7YK?r<(VtnPOIZr`p{;193c?1;J|;WqF!e#oc(5ypWIuCEd6?|Zbs zxAHFfEFKlbKx2jO-tGC*b{?4~x`pRsU-MS(lAtKU)3j-+l3_K-=R8)hnA{`$0lY1d zr&sitnsd1T&ATpz?sZ>Tc5^1Rb*N3CdjMS}ane@eq%C9r z2E9Vom*DJ1Y+CSMlyV1uQ{RaN8>=Df~!k z5&h)q+6@asixd5ZGFjPYM&nyu>z}>@(V73(b(6if3w*{z|H6AqvT0cFKY@mxcQUjj z!L1r$zKQp_>}lnoV$}UkWOVqGzsP)gE!X7A+M0Dz^Yn%-!A33m7gX(0(MGw0=!=ow zntL;1tNwBC_`Qv4Sf26mB-Pq#SrhE7)KlD-{{9rd5WAM|DLpSmY^G)wJCt8VrSLcY_AP?3>MavW7-PSeiZQ3(KH>b z!H_=J-=Orbihu4i|F7}hrqy^piB_Y`WYuL1g#Y;U_@W5)x?X4XQOGXr0fxK~qvcl9 z@Q7P9$$$?q*OX&t;`*&|O0sNxs%TNnl+`EBGRbfYNX}{~dc1clA`j?g2{BB51+#|Ev402oU1SlJvgiN*x!Q z=?*=0_Dz@82lC<7G5#X$DQV?0?G>RrlvA90CF_*;svy(HnvT{qv#Su<%KAiP zF#^xUw;4q!9dkYj?}gtvc7dLD45i;+D*P%z3Ju};DO_h6q_n6<^&poXi zO1FTDM(Cc^noHR4}paXL9Tq>n-?9E{!Zf z;t75F>5RT$oi<6~x_bV?7I>V2*zYRpj1v{M~IRrh3k?pc%WvZhM z*U)(JhB<9LCwD?Y?q7 zcua0DPW`d3wz@JKXPboucn4FOJaj+a@qHHOkFBv*ILjD#9HQK*ygI+AO;ij>c3CMP zWa02VXa&U2!QaAv(In*R?B&XS><`_)LmNQXq|DA_J8P4j$(KMA#dnZ}bGX=$W`(yCI~irDaf9wR%bccXci47va(5=J za2!-S$j+kGWy&QI0ZW0K(HHR}<1(QKU%E0I7o)ajo3*i0uE1`K412nNdID3#Le>tM!Pz&k2Rn0GSD-BUxjO0<3SyynZ;9uW?Mvf$UPPq#)2@}XYrv1&uLzDH zVfq)=>T;&3C8#TzrWir@+EVnQxSQ>ML;$!lyZh`s@SX3vvcv5K#p%>)qAjjW`zLp# zeTG#F8LX%3pY30s1<9SyvmlY3>}m2^22*7n`#9|gIMporaV^eO_iq+r1{NdkBLH?TnL6Tf&j63O#GiMDOeYyE{=v-m#&gJ?IWvWZ0o{|+de51WQep2MrD0L} zB(O_HX(9IDHq?#M-CLEam{!AXc(e64yfv}|x{UAUon^6y7EN^gD}CbKxcOd^J z(0-s2bYe(49d_@19n|N9L#sc4CH@GHkd2G+v8L5{x`F1gW=$&J9+9A?rC}{SPe-kz zLp*BJ@ULj|7{T@qeeo0c7rNbidP=hWQqD$gFZs&0x>^IW8oXGCqP_45q3d3v5yrTG z)xIBY+4h39takA*FUo68{Bm_)LY^6-*}4zli*CGtzsS%G$m~4gG5UKVXpTd#mz4ROSLX0jfZb6L*tpRs^1m}!o%ga5Axw+BMOUYLn=Ue{cbn4}5JPcoh=iJ*`UM*hyc5>PY zX0ZVOEuK@OAml!|K6$uTKOt^RJebJK=a0-#UEhYoDS<7p8lrE7FYf+Xlm@%Hr+`K} z^vWrnttNNt7d_^`ZJI|5J<8uqy&<1~T~~Az8;YoOcW%z38MyGA2|VI=w%6Ntb^V1Y zL$aCXSs0H#CulnAHpV`bv$nZIOvAc5#MU73HsmNoJ{OXWIK1>uWd^;k<-hzYk9vXf z%lt;Z7io4NJp?Jb2W+wMDSsIHll(jj)>HFNE$(#>r=HYZG1KpWGI>=m(8BMT`rbFM z?efgvy(S5(pMu!MbG!GhoCyDMhpORZVx9~6+#oYanRyfZhEqdkKlYZQJ>VVhaCObs zz^w3(dTFOWqIBiHqRZZc#}#Tw_B}zIeXq4^<=k^_Jf@!ZVg;2b*kz@NS|DQ#v~PYl zTJ-HE@K(HQBQzX-rGm`A&c=S-ZHT?z#xrB9$!J9BgFIIJj){m)60~tJI3-9n3HliC zsEiv?WHm|bA+ILUmhoz;fq#*!2|9o#4s}I7EySzUXZwj4fFtgf9T$?EdkWc|G`5}E(q8sgCqjgombEc;#kT0Zl( zX!8rt14&Ng^Iume>b6H?T6Jwe4+0zb2kt9XMuZN&7dTp!#c54%P^5=glGC{~i6v~8 zRQUs$WuC&_2rj?!X6WWb>X`45Ni4=4F6w}oN8I^r`7D!<^B{aCN?Bmca z1(bU4>Z*33?>uVQP0Kd>Y>inyg6zrjl^1B?qXH~Gz$inLoL=H@&@L~;GfuFShB8$lFfEDstL6&iz^M2CoX;%^N4ST`q%4wLRF{6-*DymeZ7EkE; z;gKiv`&sVX0cUjCC7Ok2iPv5C-l@KCd{?*Vv$x|+k+oLiVm&`>bZyjh-NT!z4}9|= z`@qBAufJyV;GyR1tG~lrb19FX_sjiny&nT@p7fw8yuAe37gdZ{0jokFH7u=y~Zg37wK_rtu8 zMZ>6UpG9m%W=lvGU5PkciHJ;Fq`7A;-p{ho_73!aS#*Af6k6!Ks0U;GCZW$^?Tq=y zUJ|q?nY(zuh3)o(Yv|fd=A*gN`?%ViUwNh4T|R~uLS}Vjag9ceU7_d|UzT^VX8I}T zQ8ABN{jDp^q=Z|ckCnafU1iA_lZ>xR#z|*UzX|E?tjMBGc`^dj0Jp}=`CC4J=?Mw01Ix|}q z>$m0g$j-ctb>VwHn$H=tGTIJUig+Bp@eFq_!{#Nsv8ng(%;nL0kOyV_K8EBV{tQdr z$aK~|XkoDjr(edqY*Y`;N~32ee1JeVcs+-AkL@yxrLf&-G|~2;>0c&6nt0erA}#KP z-00rh4w@K2N^`=e%k>Xs(B-(nE<5M%je@celpy=7lyK|gJH(9=$67X|-0sqSGdC5Je*<8Zy86W#9 z{4(~p=N(|2YE|qAp&*aJhgpz*TUZiNStH!C*WyZ4|9Idr2j4?l~;k5yDcDahtsEEw)sUO5kF5c@g6h zww>@9HN%ye+{hl?ypN!_&7)f94evtN0(&Yrl%?r(O%{*tpU`P>U3jkisUB=fdu zl;)_gEK3$OZF-;E>!^QIG9Aw<<;ud`K>Y;D;7VB5(-_cq%-e2N!-l;39a zu{7Y32GXDKEfKxrfED1fuHv3@oO)rPFr_I19k*C%=YyZ*eUzY<&_uV#b8^ykc6F`y zyg$xd<7f9CF{8&cYC-pESd(S`b(%9%tRoUvsb3lOx0RM~kpfe&=Y)2Oy_Uy?&pf%O zhR;0F{qvcJuilkOOxwffD#rjm2-zn_)p4G`0ZlvFdy}YQX-3vli>*)goUP{`kV8xN z;WOTD)Y%ICkmTu|1AnP*u4SG}?z3rP8s_MZ&*Sw-dA#3Y9@25iL#ib%@9uMb8tvur zI^<;Q-cIpz|BI|)t273B9<08y2bD&YpbZz~ayKN~dd@=?K}+7ahQ}%aw7{Vco`nCs zLppC}`G!v*^2taJFdbdd6AI78Imy2PwMGOF;#E4A;g;vkz;74n)BQU|yjR7eTYD9y zyKWVFRe-9(mz8%O?iY%{)7aTv{(vodf@^P84s4YUS^soQ;faqLOrNnLfS5kVDBmH8 zQT0qHHQzfjwd+~2Ft{_<%a*D%( zP!g*c`Q6|{$~!blX*bAe5T&;sgf|vE$f7iRl29&4N!#@19bI*}V-8wVZY4rxTdH0q zbyhCw`3SFFzFS-TMY)FDC&K*X>6}r7o`;1)_I|P);w`*HpxKVXbo^vtWFaiebbQz7 z%m9`AJtIKRR*weg_xts^Cw$p4WJZ>{L;jE&;g;iA#Ji%oUVv9g!NK=`FOCcF$|wX}QvZe^)L@4^aAeeeUi|Mb*b@ zD_=tQAaASEUf)&?YgEc^YNsu?=%l^+654qAw-|JSf=(eLi=Yxqw8kx8Ys-8Ok^I{f zRyRf_@s+1n>mZ(_9Ir{9H{lp_J)9XtUG{*~FWjc-G0z(+Z$k`fC-wa}&_xik{$a-M1b#OhT@7lxH}wqf zMZ}Ha6mQ~MR-W4Qy9xRpTl*vYYaEniYE3@&oz_usOA(I{)8g#mkV8K4{}zr2o*S>NP8bXIdx1UWcmoBK1TJ_rz6aH=ot{B zYu?qnDpuj!>Q)HvnT9#Wp>VDenGf^(zY(5EvYt;r)g-Hw-ZKg>kieEN5;$|4${!x2yYoQlJ#x0Gd)1#NJa5WbhGi!EUXF5>*k+TXlH~*4T{#kPs@1@E zzU1E40(qi^doA2S5z7Xf+`nv@-|bM5dn7w=m~w63lIq4UJLlf71cm?o`I`(krr9}j zkwc9~H~eqP*bFz$**U$+$cSg>Oh!x$kA0k?_Y$3-VDwunB`*1-}d@kxg|A=GPdHDBHSbwr$756 zFH<_N>}2m?de9Da5p@}~7xn_S_iA74l#F>lJbSNrVqI1jl#Z%HD}KPWY&|HR0}kMB z<=li<=>YA~pLj0Jp_mufC~&^~ulNX$zL~%BnajWpJ9JGh+{Sp}>17wAOg#MTIUSb> zork;Zx1nx?EC;Mb&??^)w(y>w(UpDVvZw-1M7~$m?7C(h4xf3-8JX=9+*c=!pXps+ zk$K&l#k16UwFO!nn%Y+*bQu0gB26p{JRq>6MrP2UsyrGOBZhp0Ln|Lnr*RH_bblsI zcIbiTF`5Px9)s52PtfuMpFk}9-|o3LJ^Jx`wUL@ev%L2l-Gq0G7Pc@fU4p*61*yIV-E&9^2>JC>3hJnI!gt-*}}e+X#}ah(`GGZ1>(beP4RbQ`z8q zpF?9Ryi;4qbI9!_5mf_DYHZbFA0>289v#1#KC%0mmidVAvqvq99{mydbC6*-i}J2arwr%;a67d}Y8ik& zrwVj}HT1nzfRfLG-4}uB;1eXzx6z zQio7weJ<*BTFm=|>9b0UCQHUC(ho*=aCu=%l5vsxjx(iR(NB(Pgj_zgc;40=zTX_TCt2ufku>eQ8^ppVJi)*0ZiaR;2gk-xeYd z#;8ny!qTyR5p3W?qHfe;#GD(C{h2L`th?|oc-7s?^J{gJ_2BGLJ97>39A)S5ZGwV^ zFU}R9%(l{(?3~&)6nzhRD$m{dtfEUArv_y+aSqDAe3zP_gXe2|eAAkgy^;W@<=%Tu zA$^X0HKdIFsst?nrzvRavGf4(U2jsxcen}STi*mt@hvk=l(M2Y{RF*^(@#)iP;WtX z8l%wo^^FiH!}7hERPdd*8K?{5Hs+v zN#M!KaIf(-(8D7?2K-QPZiy`En0??wxW+c#LvE@6EZ^!ubH~uEyv5>Gzk9qfd65;N)VORb|+(>V5pt zABxOY#9t(FZTv+R;U;uVZ)HM^337KxPJFwkQ13*7v<(Y_@K@iL!wpO>-;H@)Y4$is z!CRE)FA54Gmf%7@j{YQkLuH%~!J}f`4%Q-00Y@RcPsj4g=k)Z^2t^92hru0Qr|?M` zoj3hTWZ@|wu_MSI1}&#>Q0C>Mvk;C>H|+x7_#;xxb=Bd2Ux%rReVfttPR~MXh1k*v z-FHZl&N;M=t6+bFrX)O8cP&61rY(AH%5o~}B% z^lszLt<=l$R(KAiLXQMp&|{EcfuKDC4VMwJv1$(Mzs%b*9~n{j3yqOj)(hx%=Bikt zddMNR&2|GqUL0s#uj|D<)%6$F&KSR8^570=W>>+VIzoTKyF>ai8~c(`j1Fzg9aZqqOA$S0IQx9+B*aBCUqYthKPi=nzq2+&wD4Y(;>m$Lhj=eYM-g`1UPP-Q`WLceE(0r?GxxIWL>@E z(LGtP6uLXO&;8}Y{1~+MDA{O~4P?X!y@zqRAKw-p4c6hcMVWn3SOdxHxhMWjP)@{JTvf?+oUJh;CpgYXZP=s z2T}vn=k3e@b=;O7#FCBjC=YB(;^X?nrHbP4=aN}i3EPvPA3&v!4dpYBce41{@J*sU z+}rBl7Sg93`uPr`5e`)VW!U6u^jZ(!L8sH&hq{9PokujzJ$F6$yeSS%f=2G}B+j;P z^!eBoprVjyZ59&rE41!A>g(9=acDAj?Y9n@hDz6SI7;YnS5Wx|JZj84N<2GfjN$06 zi!PzG)AA@b~ciK|A9~M!@ZeeZha!n&E=UjzNpK4kpI0M(eh{hduA(qn>0s6%5(eq zy`lVYuWZFF%&-+_=e!x9@W1V9rP37#m}~CQ5I3tiRB>*mL*eIcTa!Ys-^~&qYpeya zo|=()0h=zUJRJqElBW?{LY@Mzaw$-R<{p*&;}NPnJ{nMgPdz=DUQ#JT7hkrAtMEN988#UWj+m99CnYA(2SY*DuKxpgyzoxd*ps+44{HxmeBI!E>{FMcvpV+HgZ= zfLg%T!Sex&c8=C~6<;Lp=(H#^@ItqfWVk> zqcx#NcQwvyMpV`z^FlYRsorjeTQIQ8`r)}VZ`Ry;J2+UEA!4BWm-p64AZReKk6v-; zV|W~i|3F zeBZ3bCpXO5&_`^k4Rel+6eR19SDmfD@|0Q#`6gZ2%{b2=#~v(CGhz7=)C`s%K_&Yt zx@nZ6w$l_XTO7B|9R&mL(8rOS0^jvbj4V|kiEXS|YbvNe@*3hq2atF^vsw(=S zHDZ3;*?17^K+0*?urC^%Oy7K=Cdvcu zwW4-^D{8$+qq^Tkeif-P9A}=OH{eer=;M!7CfSATI%^yA%IOOUvOd;ag!b)Iq$dvU zEvQOVtBIa2cR0kSOB0892gqJvo=_0;go2o7<-JgV_||0hpA7pr{DnR9S~l;VmZ|WS zM0?15TL~6ahZ=58p_f3%W3=RpbhobHTLvkbXC_S1tra^z^n`#%qkl&S_!sj`$Ef{D zWVA+q;5~LWS`_uW=!zJVObhmQw<2KmT3-Nz$T z2&kJwwin7H?^|zIw!rWBi*ULKE%|)8%G0L~YkqX)>!9z1Dzv|=Yp09uBUlMN=XL^f z^q0$EVKcaRkw&Ml!-_qGR$^qF)^}H=xxETruLLZ1_*Z0No&`CN_++x%S#eXCUpZ#M z%H!j_%Hv!WF86lN@wN@%aX64~TayJl%mrYxN-z_Zd=Q<5<8? zUW`=|YsOM9=OH*BD9jI4hbQ0;lx64CgCr+tTCbD93>=L=MnYTUxnK{JDw@|JG6$ioJEZh zBg-S1Ma-%49Eqh`zW4DlL@6EEQnNJyEkp}m8>%Y^zr$#R*06U#d+u#ECH$Qc@A=zC zPE=88+wLBn;qUc0=A*DPyexS#OXcp>9t|n3WgR@)da0JZ?UCu%cCAE)#0Bi-Xu8cl ztlI?F1MSB`M401yBh(RcciUE6rn3+swXcR(-A|QMT#f9U6CTaakg{-HlT8Z`MfQen zJmTurWZIc<%WqZ1eHi!idM>gyB|wb>Wd2RK6A2NKlHL8^V>+gh%XJLC9DqnEv=XEB zg*6kPeUbGl6TPbFdZpf3VY}7)@GD?%v?yJ64=nMpZkpdAVid7DOWw(4s)vJ)rnlY% zeC|9BdYuT~vTUgQ^LFTHU8j3(-=n*TxE&s&@_DnhEnXh@vb z^9~KE4=L55#~?eiogEsI(zsIq+>!Vid^mw;>+G@w-T44KaPXY%593A(c-wISGEMJq z_d?V7KJ)0d?m2Ui+yhgjh|b%29<45{WheYCG0%Bq_xI?xnQRa59n9)=?mJ!?rEyP3 zp+goe@yk1+!M{zHYLpt^**O$7BJ@Zaa>e4bkI;%eQJUk*Y<_jrpq~H-u*m((r}$cj z%vx_&{fBOj247jIm3Spa=t10C@$eKLjrSn$Z`sNF^0B>&>>c`EP@idOZni-G;NQu; z3R5JDrcCx+n+wz3?Bkvg%5d{*^eVjbZbcrI^I<8=&iUoM^Z-R4O$*T1B{UPqsQ{Tq zt^hrbTUS{JYSA3#!}6bfW?Q!A5uXaVr-MUxL+)WNH;V?h6-{6kb-O@%FFN1u?zzF> z5BfQzv?)xvjAyVIZPT}#H=o%}&-S^CyR26O@Qyff{4cK!WHG;wXp}2E1fBF`*MozQ z`1s2clmiRzptig#z8pkO4=lXJ2$Vr17wk8&ABkLBLYiysp)-=Zd_md%^y-m1EESum2{iVehbil`4mIY5ERZr-g#WbAU#x~2FR7Ba|w@3`kU6ZA%hx`T%8bx0`zRhNk>HU-V4rFTZ_mgb#DB1*Ez5BOeGsLwz zG{^gWnMG%?*T|V%Vf2bQ{ROVB-pv7S3GbELJB`9=&ekv;Ur-{2a)A@i&KWp8>QM5m z0+uc1^z|nkxANJD9%~1l5beqOlibH&d-(lmTKehwii?zm!I$nd+xU-dxy2h{F=N&+cRF&&Owu+P5%t7P)dwa;3E-^@US^&Un_}t z=nJnuLFOIEHrIx*?!iYLGN)Man9C5pWYx}0%5*J%h*Qjy#|IwisOw|4H_jf;3hhUV3Ox))3D^@-yH)$Zx`9ZXApjeBN$}fZ`R) z8NB~nUDhE>B(-T0v}K$h{=~k}N1&X(d&HASYrw9Cd}+*8g{1`3Q=hx;>E9u}@6=DD zQqEO3*{NacH2F$2Dm5Jb5t7GdHM|mQxb^owvH;xhD6ite;H1S?e$eYc+0&$|`#0H2 zY|#>N{_fx1UjeyHg|_Op_l3Xm-tb-xubipT7NKX%i7X+S5(9X6*O*`v()Y2i|(_J0nlj%8!_+(-PKZ@&eySg#T*q;#~ZP{e7 zhB@X}V6@$K_cZ9fL`tpY?V;_xF6e5nDVh&0lkDzk9_7P6f4>XweY>r>xG(Dkz1fO9 zysj?w-tT2_<55kIH0Mv49$4l`o1;71Yv$5qS%;GG z*>Oja>bD8wu@2$p7XHG$!BuMBFt4y-45@3JO__` z=y(55utHFTmu>}=w!qzr|xg+{j~NG^&~F|SzNqh zS|g53q{?0a5;pWo>Qi4zgj#V*<=B?hT7A(ADxi57*I*FAnJuL{o^(=6v(8-KQqcRRzG^Kr;QMfPBN=5fvvYR@$ zEyRg~)oGMQbg%iKtrU;nrtV+WZ)DM57!8&Jvxq$!xo-G;(-Du*4d7qI>ha?xiYC9I zwx|4v^p=13BSK5iUT-J)%Gccui`W;g_ZvK#2kV#Y{aWN2|OqV%bVs*LZo$A6BvsbcfKv zg!7E)t@aUrt39kEkl*<3dFWZ;na*?wUiXMqz3*|}0ewfp0}MGN!oGtSNAwKXb6(V~ zQ)K2rCO}@X5n2jMh~%$RdId=?$VYaC({oko&bjzopl+wPcrLRcAH|1o59ZB43ogG! zxyF!+w()z76J*bUTTs_xJS)=TVxrfpNDD6$WcQ4gr!t7f5|2>Mu-3rU)f-@w&lasg z{^F;(FFac!o$Lkr9uh!|(&}c=jLn?iQJ+gzmY{9zaDPQFUAtE}#9V%XAAuPSN;YrT|pLU#l$->B%(RQWeXIf#SIJ(Q{A@A=ZH9Qp!_ z5qeO~p*PTjJ3wv1Ut}kVX#(wgPvLHfjQM<~+z%u(-2;5Uw4!Wh=TQ?$&hBVlx&*#B z{I-zyPUp-NdKqQeIqxk`4Nw=4>ZZxRVOit(n{>4wgRWjq$;yA|X=)k=-O2yWi*+Py zKxKOC9Q}7MR_NA-h#w>Ff(v#^)Wxjuo{3W10pd#>r8m64Bf*x%o{xwy2iLm7GH>9NY-ga5AsNp`S&msYCC=gHC9~6_e7a0eTOrw-&sp z``31!c@-Nyuw7<5%HFmXw>u8p$8k0`lFAL2rwX89u`>J}k3FMb+2wILFQfFqULBXa z_Nb@lN5eE@{y;w(ErSt)M=f@kc!cKLp=g}vJDHQd#AU$j{;fp57>!M~yUWuW_`mQz zFHaxA|AkQsZN*OJb#D|YN+02EOkcwD@$XlNdwPUtW-DTJ-a)=sXa@ps_3&&ByDWD= z;qu)h??B7YFbjR@2+tZpHl})>hiRwot+4Ov1k7MgcivIS_ND!+b;G(%+l~4hc+saE1T z5o(0U7x}hQPpT)v4|Oo&o7s=297a)eGW~mKRy~UyR*&=K-}e1-qS>989&8+}`UtZR z?nMvyjDkfB_D9)U)4<-u8t zSr6)X8>DgTI~L$l>=k^TTjYk$rJd*D(|-O9&=dCO88o_f?c>Nk|2(&n2YO{bg&O8) zykEnd{n-1z=4PvrTB`GeIDkBu4;hy>KGwtTh+N-Qd791OBjmZ^jiCF&jWCdOg4-Bj zoL&z)~fy5$ZMvGPB3O$I=&!9G-@OfDy z6Zhi`;PdjTCFudWctV;(FK&rMdo_>jtqDaGS_!cPRS+k9Rv#NF?DT3X?f*zx*76r zl&S`619rhvdY_@)aDElmu8dXf0D+=3SDnY-;E-EDZbYVioI?Culs18r7Q`8q`F@QE z2A9Em+U0w}585oA|`oIRn2{aH=a&BSNo(7Bh;{ zlwzqtnc5bStv5K2;AbD)ycng53la5DlF#YMm+F^4R!9-cjm%Sr&%y5X)hov|2}T(- zCr6lDxBbif_y*Tg+sSRaLSArX91W9efB5_jN7Bs0iv1MNC8!`M&qITB)jjIaWbn#; z9pY6t$RXyHp9hN3ygM@-Eiqagp%KA~uoEYl_T2n!krT#Kse!*M7x{N^?!$frZyVX& z7G+rth2;Y)Jcwh4Uu!63shZ_)GS;GLqlOsdh)AKD(dY4-AQ$zO_Y;y3>f=IvrB^bojx=vmtn6&oJzL3r%%LDW$x{F|LK4!3VG3jcfEh3Ryy`3zsJCW!e{p+n4{3cA*RZx`5Kz`9`h(L#|8UD^KcXIUVo7H@P6uo1?2o%wP=d|}KlAVi-923$ z;@!hLMQCZj?iubhc zc;p~yK~9br%6cu@Gs=p5P*>ob9;N-e$RX}uai9pjSL5}oRN+#eulJal-1R``7Dg-Z$jLnNz5?LDgZq;dsQztfpMZ=Tw9pYmQqBeS%X zhJnT*9JSAqQgio3rduijOQ!gEr42%?FSJ?kO@WWJtQ^ZnHWPk45}&s}pK97nSG8$Z zl;*jXx1OdEUgFBG!49qT2wNngWpLjt%FIF@qdT{!x_{yMIfUSn$Fy^3$26MRnKj#- z1D0FHJ%*qlh4C+FiT8*~*3+(D|M$Q3DnbPziQMA)_sMPGyYUY5W(oIibS%|97o$&x z5#9VBdwPEZ+@I`v`Zangd-Y$?7xDWtX~Mk1Ud29_5ufAryXFV*hM(U99&Pie`DAiq zC9D0L7nx3)oMQISyY^&KJJ+kT#|0dBFh}AGF&=sR#RFoY`%0Um^7!)gXMFj(4n*5s z%XX)LeOq6z32f@=P#5nds$*|^HO&2MuM$+G1a{*XT{%m;YBcXvC^K6JJPZAOMYcA6 z21iy6&w+!-9V6U(xkE;1N&P};bgTP!HEdLTYgB~p1(JUcVTX#Yi~9zh4(nL23%w_hdRQx&1)QbOn9!yjyeU4m{=Zre33~HxaW#_ zuW=oNun#!XwGQsN?%!%QKiktP4_aOb(d6f#MuIkB4^DrcM^dR{U{i8stN~{lAv?4& z)`7^=f>c)!qouGno_d)r%R7gq(;sfH7C)L!OVLV<<~9+#3!*9g4tUk0Tk59;yP})- z8{YMhoJGTS}FE$G;tbQ;cr7kRNh$dT;&2O?%QCg0+R1|9XXCT zFCBQ>SCJ2XETclf+o0wBH`P(ra5TaSoGC&bmwWGy#vUbn)c&}j_s|(37Fn`-+gS0~ z%b4<>Y46_4W6xz_j*NNbG2@tDV~$KvY1la!A=YRH&MaXFJgE-&hynJzsYKe;;Ra#8Q!D!beGYEPwL`(ya$Ocb1blxG{ za_rC<^bh<+SPNkh5Bj#SPV49_c#_v(ZpkQ|QJSA1?~62H{(3LsD~0QO!y}_FMpf>G zPVkQJ*dk_M)O>?_2$cf==kh_(fRLRe>pS%01>Q5uJ=zCf4JqsYtsqDf_%|KT;l2)!j^Q~e zn~Aau-M`IlP+ir_sC%y~%kMK^+xgoDc1hu{)*Vu*NY9EWRX}^YaWdgVJB>$b<=W#_ zBHS=j0nRfK<|9ncpd(bCzVC}0M^QISJFh@)VSY!LCKh}qN_)C++1wn=qpQ)?bF>Bi zg6+kXtr(K#dJv=f=_$m$ic#ORl%VXliYY<%i_TMZ1?DiZTv3i z?%l|a<=V5mop{w*eqbJ<1pS%74UH3(!hPfrKeq=6oNI8pz=JN(Ktg&iqCAcAy923o zDV!@Wa__HMi98q%eFINku@#Np1L@e6MR3LoKV%XH_pdWD>&dRT7SAQ99HQ1<12SGE zye8*^TYm%pX6LM|kP)ED;8mooF}OKK$*7e1F`6bO?$=P=c&9;-s`GPLmLk!O}$B%NlV~n`VM; zfqb3s7~3$KLIeIBT9!H5?R}yJsn2Wy$_uUYkMFX7la5+=E?X^$!ta>JihD1JdoSo3 zP!L9O#7`nqu{4d?Vcg~CksL`>E;5qxYQ8f|2;BvUAp9~^TzZUB-cpu2;6~L`RYJh)^ zpxvMr!ara4Q7$^_-ZB5h%mB6TpBf;l77I{WkJdu-E;au0s9qPb*ojnm+_h&b;(#DE1RkB^*)_snQbDVashu1UyjngTdCyY|44d@Who5kG9N~}1Ixq@4+!Yv&@ z*sB}W4`u8w*qU5f?*K{fr@6AdAL?`Su!iQMO!6`8WLMY67Y! zb9o9@sDth~8&f@Xv*@nQDQ<;jQE6lfVJRWYXRA%nBal`)OxGRI#Ua*l_jQOZSVMqt zw_30lVzl@j+GCtv2W%Ok9{YHTD^c-0D>F< z4S1&q*m}KjjM66Et6_hdWY2X*-cY8U5tz@e*V` zuR&|!QSBCxbtkc;sr*pl|1kIF;W}5}-}u`5KEr(uK2b7@lOgkvoJ?hwF^Nv53`G$_ zG-^18PD&~nq9{ruLWWc%8B!@EQ-(4mNl|G;J+HOb+V6cIe0x6M-}U_Qb6r^1>t1`U zJ-zo{d+oLNru~?w>!N&O*G*gJ<8GL$nQ#NIPp6snREs2%p4Z!ePc3Pj9im-aO0S?;Jx@YBRUI}L33_K ztmFZX9efT}?lVPMN*d^|HSqs||5d-ykk5~;G=VpI{47dWxL z)UVI|8Be^;7I{t{j&>xt{=(Wy&Tx$TLT)3*d~}a|wOQG1cF5>ho@Pu;rOn7oCcX6r zEEG_3BKM%9viIRdXh;1uk|=L+i&5p>((u;-dzp%5cxod{q^i-2EC23&TDYR+fddmX+Wp}wt{;wZe?g5AjAkEjDa*w5XFI)akE z(bZAhMnfFMBh8{GIckG<`y_sY<4OhNxYCi1kK;-ocNE8!GA29e8yxj9^1M01_BqN& zsiZ`4!?0(*i_>BEYZ9y?eq&wQm)9Do@kf%}ZJ}tx=v-=`2K|UybSJNZWNzPooV>=- zxnmzgYRJbY%K2_?-|}=3>WcG+*(zEkJhKb;Vk3qR@if@i$o*>pI{Vj})D^Q|m+yJc z)#oK6N}EA5F@JEhW(IwVucRqr%d)b^*YhV1x!3X8YpfE=$_+@^WyD^Lyj&jMsCx2Z ze?QHN)jo>#)6U+u2xm9jb@9Izc*6gB{og)q3C!nZ7IJw9VgExSaNaKEt?TeYS+HaI zM*2!Fg)iIxe0pAD0{xg6b~s?atc8c*O5XJiFF*NFS$cMToRq?udDNu5iRAZ$GwIbn zh{Al+_gLw5++&5}9(%s~m20vjD4c1)4wiVHZmx_sK^(St7jA-aCq^3W@@Gdvt@(G& zar4M3xmh(a(j?^6w_swNxgU28)u}{o%)w5<<3#T}ZK2lu+f$iT7ry_rMZQG&9mORo z=_oFdoK@g&P`)i6&yYf`v9@0eFFkIQi%z$CtbD>N$1~sYqh5Fy;1D7rc#KVnqJ_&- z9Z2C(D)e^TTpgVuFEm}gLEID!n_B90GuFvMHNzJwz3JNl>54VNjhX{d4#XTs{$f7g zJ9bVN>5 zs5Z2902S6V@|M93?$@?m)7@=CnRFrSp>eZF$~%&&G5%R3_4&1GMeNFEUB zsIx6iSI2grr?Pi=-`p?zJ@q|&((_#@!#TNd#;y#a#`n8l|G?__J4da>tvO=RhCKUI zbYhDh2cN7o=`HSI27QQ2gjH64_=50jCe5!1f6g-BmIpwEb#3Ap!L}LqQ``it^^!?j zF2(x#ZJ)M+qj;3B4GLa%)UMP<;fN}A!q3z3Xt(r2MD)noU|zIJ*c(xwAYP!2lgD4T zv_g1`ZhqvCcqXF0X_2ZckzTk#S=JFV z4H3KVe*LGqpTUYYkvFe0sZ?{s``}mcPO}a~D`7-$=2AR#VUkO0D2%p6;o)q9UvZi; zvVwvIFt>}0a7om$8GK*(;&E>|BKzglfYa4Hb!3vn_+y69+{0XaHcr<=v>41knE*o(pq7Eazp=lijE zXH6>u|MJ)8u9hG%1hpjdyn36+IHZr zUrE95LFR6ASpRzJGJ{5RVLOaRhGp0T`VMI`sO<>6OY12AH74%nhBIPCt|03DF1HNt z;r0Vno=$!sddt&Ys-rx$uO{!w!IL#Ujot!Z2Gu~De}Je{+|bYj=BSTEMnX8Zlq8g4|2cz zmE%FiIf~;!ra7tv&hm&=UkmZ=uQ;qbVsIBZY5}6WS2^l)EQdaJROt<}`oxQ3RnurY zFd3!xf+|l>m%}-+Ts2vqUW>5W-$?DgOt+&9hmqoCI`S93X(xrprlb`tuN4+3`5onN z-N>MZKj5U4!**hw!W7~|O5%+^N3AXuQ|b++aR1dnM8&#a3vKXcH~l)^(2F?#!8uJF z9k(9B-6ya+6JJCKtAy*8zy|<%iR*xmF;v@8FOK%qvr`N;aoCX8FoHXIx5DOZ4GIx&kH_hK z{Cej2vcX}Y#+U2YlS1{;T4!1caeOm7kRq{9@`&`6!*+v`)4cPeRn}nK)G++xv-QgD zEBziybrJC?38N#+lXI^ATS)XGp7*~DzTiOxXP| zTsRLk17B7)`#YI3l)r1twIF&#XLwuZv5qz8`B|6uQ!YNjb6($$@`i$;UvG%%Nx1Wo z!mXYXbktvOsjJhG)hdrtSDi>z>fq31rEE>S5$5>Vn~N1qhxrL$y*?0S`Dw#Sa~BJ4L}Ucd`NYkgfcf5WHk5>YjJ`F0Ddw%|XQAC)|; z2dCa3K4iq7Mp8I7FRMP!$;~hV%U5=JR72CXCgG3m9;1tJcH7WHousbd3%U+*_3+YR zPVFHUfT5|VQ?@~H<_uC?of6lics1@*A2RN{M*WF}Qu+zJv)7*O$@({^DqpF4bv2vN z9u*44DaX|_zhA}_A_8zqW4xoXH+Zi>lju}HxZUn+SnJ{u*%n2%c0n|s*!M-Ey-L3i zn?vu6z#EZHGJD2mI*MoFC5~dB+geBQ-2E8*qH=n9hr@VA9D(oJP$i`0vfFkJv2${k1xtLj#wQK0Z%Oyp1Gs5Mzn zdwC{-uUI*FC3$pA7#TXka$_A?*-78Ul^Q)NS*f29p&`Hi6Hyy*9!#)hc;i8+jTLc= zw3G7N6&@>A*<%kxSo=yIYxk1p%kJ-WG<;HK#H{QG_Xw7l)1mnFX;+igBC5AiiE*X8 z7JuK>3$JX1YJj!c28Z#OvjtQJRsUMB4EhYGTlrUYoErMH_BBVb>7414s@ zkwVj^CehAxrq+GwSFXwE#j=K-i`k!NQ+Rs5@NafT43d9j)E0>_Ir$$~9h|`2A$I zEXxz`fACj}x9#vk6t^JaWbm?$oN{>_J-gX*#{oS7& znirkSF7Z?vowt+gDtHaLH^P=Ju*6=+EB~)CZe(S@hnHuC;@4=I!mZC+)9HYda>2HA zT6UEE5!GOQ@knE$)g3&1QT)MA7*9XPuOUt~iF#^1Cs7f6)4Hz)|AF+dm!f!@uy3#i zuV9q>lI@ZZ^EnyuP15E+MDN&z)*oHe?+5U{f%xxBW8XlidlZ8&cdJB7Bt;`;68$_4 z{lJwd#FhFUn;2&qdMw+q-?|h$yOce`^}@4@P{HSW3HpoF+DMFPLis)(=BRU>KktxT ztbyDR0bgzre-hpAqMSRe_XUMpF~f)%;^A_QoqPN~@lW`YW!?%q#_!-em+`7-WF1}? z?b-Ci8cZz4j#woK6~^NHxQ$8f1^eY>GJW(V_m?&}Q@F`dy>}(ic1QKtRWVQg{Bemq;;{A&vB#4h}`j>^I4!nXNgGrIinu^{eSZG!5L(-Pv8}z+B@e2)g-z|!C zY7j~0ua<2K+?{~cr%-ImzlWSAwlsg!A3KcW>vn_6q(@@!Tz|2>xyRG> zPg-gQEGv89SWnrTaWawlXxw(c6U<|*#DcYpUcu<`koTLVMYDmw{Vaue&CWXwIN!5c z?nXn@vfjXzc;+Vs=hVA7ZHwXk;ButUBZ$Ac)nSidPlSIpv;wP4iJ`w5v2Rl2^KSIx z^KJOL1*7VDlzI?Rr}A#bjE(6u3~?D)2W|B8QRN-Dp$(G5*o3)G@5V^Hrzm`HA%f%u z>>gHG$nw0`Aki9T8~uKl`>(O0ulW_1$ot$fsZJfl+yM*cHKdKC7rQ==*+lMkC=UuZ zX>UoVhDd=(glO~`81<6E(cbaUXlA-3`n7KqZPN?yJXUr0v$6-Hh0E0s?NaGA7q8;; zmqLA`)(YRu{;1t1M?K=X*CpB?E7Hc;dxyNln(Q3iXBlqHnusx5X2he>j`oESbsJhn zzL_c5Rh4mkI8q4J1D3h8?{{N7-%Fd*opoaWH=T~nx9aBnnp}t0*Wv_^-M6Yu$0-D_OPFzj z{Ss!TBRJWlQE>P8(>37>eG%5-QIt26cH!LEhhLxlMGe7DZQ|T>JN&V131(#>AW zcsy%JYjF!oY;EWzVONmnp5hmCFA4qNT)iapjVEUjHTsZC$vr~)0q@94FX0_o!NQCf zTK`#$P3-$mymzKLydRGt_ZehSqKU2?{yc9<;>o@h+ZM8K#kPg)TZPqAINKbw?Yt>f{Rd&UD(vV? zK@a0yX}sVP<<|% zlC$U6+p(>H$yoP5L=B3l8UqVnKpdG{V#Y3!kT13w2t44b&AyZ zEbLG3KnhsfyOW&Fiai#!S@D%b`x?`*VPXSou4bFGT17?&i` z4QGhXZLihDxGVROeU4dIs9@XP*iC#7Np$4eJnAKWJsW;Z=b!Z2lIWL9eY@3;PBv|e zyc)r;y!90yAvq|z)9LEyyz}3se5)Rcs66iwy?)q@Ls2BY|DqDtQ9OU}`W!bQpndtI zG9so&U~PIn&nfS{BCB#k&7ug&*mZt=erq!yKY3R~yzl4#>pPcm~i-`p(5G8hwW|64pnK zE*RzGy+7S0F{H>_gf*EJ(_Q$9$i3`@yb@8(a57f*=m#J4)LiSM7jH41>KaisqhCuP z;#|`D@}9dKr(ec-64XJ6PYf1C5-msU^ow)(F7NG{`y|@-k4VNFne$>=F7KqOK z6^Qm+3q+^!!>gA#$$z=uNjjbBsVjT?*18KT7^%te9sM5Flxd!N_MnfV_B|Urys$9` ze9vX8_6S~*%IChBc|=oMIxpA|+-GzlQ(xU-b#3MEfK8!!IPoCfvX*O;siWh&si|-M zjG;cJqZxjc{j$kOA=HC6`BUfoz14+Pg_~+>VtolIhMMm6)UOv}zt>^cA^Jh6varL1 zDviBzp~494-*bSy`#o%VtOXE>hMjcg`}gm+CV8K9O{$4I-MNp~r1gjc73yBZfeJMN zaiC1`8pTtkI?MNKsA4-$?ZrNc_)0rIBYTVJL%Mrt=)@sk2YFDtBJb}za5Ke^+#X>Z z+K#WA?|ha;ypCj&TqN<;Fn-5kvEZQYFeD$!~WoaT6~)K(-Iirpd*Fm?!;fGBV}RC zdC$cYEg1h=xF_$m@vp^y;S?M5VkeV0R~h)CS^|?5)fZFwmJy3P5o+f!wdjCQ88qo$ z+^7z|3|jOM*7lCN10}y}4BtTGM>9n4v`VJGoDNSVj?X=Cj-K^~u^6%9@We=79)WEk zzj}E%8~IXfR_e znJMfAz!!ei?M!h*&y1Tn){5M zjtI!44+;@22H%<9+IN8=7NmU|?Q_&4IGw~fDDUnWW9uQ4mJPR5<~QD{=H2Ty2Uy2m zjAS!bnQmC7r;Ydu& z`w$oZ&hb8>URE_k-2=lqvVb3@xP6BL3pqeME25HQhNzyTUXq09om=7iUxE}_*$r_v zK&aO@;k^`KnY8da%wT_TjsM&q`yXBTRoL72d#WY;G=f!YCXpP4sQV`}UlyRrnC}WA zEq0Qw#Ys3&Vb%@ayaH|nzS#ZBk$Xb%?w3$4v4Rw;J?0Ol;OoN(P|c-CMZc&GsumTy z6#WHMO*&iwr-(saK=tb*>e*rbb(PSsGO!)%dzklkA_fv?Qf2(}^LglhxZU|7>`@KO z{ayO=x`>q6;3HRh=l8am0VZwKL$SnfE7+5NzC`o~a*EwPt!Lavfi~w>NbCnbr-}EW z1V3Tew`VIT{%7uf;75zZ_ygZ36MLP{74|wXn#o%gK5a%chGiuD>Tfp6AolkBhSgzs z=K^D57ks}iFZ}Hn`-^jR2UZwD@#?*d!`MG56#FN6R4z|@ABocp@Mh2i#H#VlBQjbr zhR90XU0Ktm^{W`1&QiV!94pLkM#E6cg( zoC@W0YKYIa2%rDr5u@~noJNH=6z5LbzRK?c@XplEk=XZl=aha&Udl#yk7bY_S^xJr z$fS2G;*OqEest^&N~DxH?Q5KUeL3`}<_fpcyoWk=zxwtyboCspNdM*(zE$zg1?JEP z9iQ**I--LQu`Y-KFXv{-+SL%p?9v8#er8IP;${QzB}MZVBIsVhO+WW?J#!76hc|Jt zlY#M|q@#SD%Dh?;7|v={$7TP!zk0nC+u|!6=qxco)%GHudp$)Auo91IF-h%pX$EFNtg(u^#PsAMK zo4KUS*vR!glKe(k({v8AjN zTvy|8|0Y}JiN04p%lP$wIPI|4#eap}>vxjr!-gC?UAd5)TTG!gPy2Pi6NojCNY6Hi z8GG(3mRECeGJS>=hO!r74-)c%2RD;y;*8jZ=cTEgSi(_kl~xCJW?m$g?p)fu3W`jL*Iot;!|OpfHQ`9PshiyxZq@*bps@nYcr1wkMy!n0*Sd#=B8*9N!mESGjRw7u%6-LJ}- zu29dRL}9KdM324_qrZ`&ygN~vT!6nQ??aXytP35+W4lmn>y>jD+j>H=ttZqW%&S68 zg|C3AvgD(maH?I`3%Jt-DtWx!6kL-Zf|n=uO;9BA(vswqa%d70=1OH%Sge z@~qSt9dnXv;jTocWaK&tDw7&sjD4oU{u`VH3Q@AimE>hO;(SGNuoS%A8TgXu>SAg1 zsY^SrMl>??^yifLoHg60@SR?ns??Re#K)LIQ#*O;hrhj_^=Rc}der#<+C)-<%CA6{lyn#HqHU+TaX914oV96Q`z*x&of~mX2D0)h+KbCefIPS{G5%l)}1K&mAYx zDcsO0`RfnK?I6X_?Kr8|#Zil^d#}sD*L;*2&tS3wO8LZ>Xy>zOw5TYj{o}P{nua#P zNQ1TXPDlL>y(Nn?#&hURj$#{b$55UZj%B9O*Cn|1KkFoGs}%a@#x&P=Q>awIWNo+a zf0fgKDfCLFVhO9%@puW3bC8wY7q4dvHDINu9&9gE65W8iNxy}*BszM(c%5-(d%yQ{ z_52dwRzB|IclAuh8;+dkozM9a6?xuM<6reu!>h#Gja&6_-@kkxm;QlW+M+Dw*@*Hb z!nxeby|ykbecIKiHL25yvwf}_V{c+#DbB(Eb=b$4#AEwUhpnR$$A~h|dTXiE&^~k;z zpA!_SBkXaZ+QX(6>PlF{LWTCY6Lzd%Tz_}{hu@^BQ4DYEl<{L?M^K427w7L5hxvNJ zUeO!4Q_*2Ta#({E>5qG(+^^otj(uYFvZIE$wcM}E&{{&Z#|$e}Xodg3>kYm5-%HLt z;wM*L?gv7J=-$vLLk%@;j(e?Kihr-GEYzvgTIkQ`>Mx;#=wQf?VVbdUSh+XDZ7&Y?rLZ%fz#v;6EbwY1E6h;@$U{d=~j z=)8ZkQi-;5=wYG1_&usn-v2%?|9ib>YlBavo8K*+i4jERo|=fOf6dhp&$aU%buldS zWuSt06(`JZ^ZSw)?Zo_nUt^SwvHeGv;#@a8w}X@i5F?hjYdH?K?cIZTj14w*m_PV? z+jIk`2>ssA28q3{%f4i)ehJTDTQ&-nLLcfb9!{d`+=yOx3U7QlYmU0*QR-aSCI98G z=?6ug*d-Gq-x7P@q)&FKz`b++EYkUx=Na+gaqWKLeq|rP*N)=y9(5FtFG8KG7qi#& ztMAy`cmg{-e+LdlvdBL z<6mC^zdX|7j6_+iYeC75PG?X_bYorll9Om&9sf-?!3yJcr!8NGr~ZI-E%_^$=65%r zyvW2g(VPbwwX;QW2~w57a`nlai^5m1SD47RHzt%`R|K=E1HD@17_v021+@^uI)r7hmkrG0!M5KgJdB&tE)qa+BR%8m@7E$}Y@H0+*wZgHF z*dk58_)XjVuYJ&mcY%xwXBTgy!s?q{pG(d@s1Knnyb_Z*Yh3%C zpFg%@Tx)namp4ntFv+uw#hg=?C*@@wDYON54N1F&6g<*M^bW5?gyNF_&rl3Z(dKa6*r;J?PcB-YNKp_US@j8Vr^X$!Ed?0RG4 zj>7#~Y9S}C-d}qbeY7t3jdQKkUx?P{@$q<}ryjRujcoY>aGp-TiVoRBjJM4myCv=- zyKn;%-frMNjvE9j;ItU}K?XIMo9=oi_E%p*4};eQaSC`znd>TXTnl63%2`sA7{f3d z2%lf?<7R!W=M=g+nsrmUrt4gLVr9D8iNRX`>sxQP`y60R68SA&j;M2ZA?TTL@b1^= zJojDUC7)|<^wv6jEstPZ-PxFI^Pg#7@t1NO@?g_s;gOu=V($6vrHYPXLm^+xfC zLj11$8oR*r@xP{4^3-c-{?~P%c`7UJf303cC_~d9#yu=oa@~j3&Tlsp6>wOi{hkV= z9{0L7H}E%ou2DIRNYlYn#7POQ?`NMw({u;%%uoYhK?ZW z>98)K`Z($~tR{YhT_dZQ{tn|A@eW6EoX7o+3VHr-^Ky~yAYi1qCFbe?^N~_n*)bxk)VFjqGjvEDNXf%RkA_dQ7*sVeep?V>OP^VuZjn@k~cEdwZnr`Kv9AeMG$ZhuK-=&1{O;fI|OM%Xq(liDFF=k)pAthC-}q_(FM2 zy!a8$%SvcU#Y-KCK|zlY>IOtQH7&`l&<^8E8omIm1HSQ8Xu;5j8X$%At7?d<6DqV! z2i(^@(v|n@{*vgU_3LSzheJ#Zf0v;*C5}?(>ct^fUT+FL(ag_LUT=^WVzOc`dhz*2 z>^0!Ay>&&dm(VgH_kB=~x!{v%$TuD3CCA*pB;OMgi{kkcN2!NkJ)A&_tn7J(V@hqC zoUYV$3p};zWvkfch${YFs>2fH@gBxWC+}u>{FzGp^|zUpY-83|;j?5%CH~4IW}5r; znQm68RXeeYcG$eK9xDbro3U^PHQbVMu9p}8{f4y;*+<|dex@j&guCEHPd%{2Q_rTz zy|5j!zx%{fkKryjNihzs!W1kItX-aK#;x$cRWee;pNN|-UUFC^Si*~Y@R(D$u+(V^ zot`h{#fsxs8TnJ_&u+52ltN>s$liMnO{nYF?E5~CxjNmP?dQLaNU{N5i|Whs8$J(7IP_DJ#` z`pwzCPbRiyD!fcpu%67ye&IiaFJCb>yz>6zcSx|FtkE z9^q0b9#OYs`4kOD`d{Cf>i0BTV>XuAbkoo@w~9%j`!=T09Zv7xZ>7_HOeO55J)3N4 zA+W6MjJJ$ZHERo&$X5`*E^~Zc-W4kGSN>*Jx?kCcEYy&(p5nMt#u8H$FOIv$T#D3| z$x8J)k*ZXMmjp{pv8Y%Qed1KF} z1lvDDPIn=;JEA_1sBh5kh3_TwcA=V}w+nSSz6GXamx5Q;|8BJuqM6teetaOJrcJL5 zL@=SQYMGW-5ZP8t-GG>mG)Gma3NNgq`tJ68qi||QQdGgtNMZNu%B$gpaMYKG?kMM| zR#>x(yhpzFzxLbZQ&j1U_&>*2exKLYpcr!Gu(g$OhmfOsl)+A>quyzclLwA^tQJvw zM_qv3NXg6oo+!1$_IL2uE%0Rs-$3kNN?x8t3ZYh^L?ZbH>|_eo1v{BSwY<+$H=w*y z%3mNwO8NUOUdPWPJe7?ZOw!IkRGm;;Z$XTb%T+4$ij=D`tI4n1kW<0(LbBxa5Nbop z(Gw{I>kR8lq+~*el=rhru#27K$B{oN$EQdub>ALwO9R}md0>4>TV8=4a=XK(Tm~D{ zQP*Egl9i=tA_TFl2<}|2=)FR-xJIBCz|Z?QVwk-zkY+9ij?8# zVN%LtxOH6gK8!qz-WJHSP!FK>rR4olf1IK~6rELoZf$_OAsxn%?mP|^pxX`!bpcgr zhzP4TX^5*Iit-Be6uzc)z-qaDKepCuIXh7(Z^0uvA9lN7Y?(6^bMj8LWgGL<3dCNz zx6av);9rBanHZtwXM5cGg@^?nfkWCDJ#rJG;M%dgyy!VXosGeQuZ!C>z=!g~61mt> zz8vTFICyP|uXFiRDTw+*4e|MuM88>Br-c2o1}GcHMV?#7btusVsPPyD$-WgridbZY z2fk}cqlG9Ze*Oh{s5vOyGpxwM)MP?{A&_2z6j|InP8}U`w?o!ZkuT%)D3BPfRAlw4 z7)=I(7Znt#aa%HB`37W62L6Mt#draRbzx>w)M5AR@RjV`}7WRlFJ!Jo^(i%oR?NA;w9&!9g29#`KV?&k?iX* zAJtXlMXXu46#1yJB3x3g!+g|A5w7RX(4LPvD8gmG!697~sr0g?8y(VH5SM2R-bgjo zAtBEfP_y!!pHTA!X}2Oi&jo2<1?I_#7sg7XIjDj(T#+HI@aCFB?o;HRjn?J4AdL|u zYWIRP+aW=FVM?mVl7sdl)L9X)y$DsV#5_6ihZ-k2?M0}TAW>Tsp=J&Vl8e$XMSNQn zqsJ8Sl8ezdA}5}LzRKk)Mn5RRx>`HrS4G}kBIPPZrxoeF)Vj7PM#-4DkwcfCRLgRz zI3(ofBATs;&rd1JTZL1tBcGpAbP+5MF6ptyq=%QH@`{u?D&JQrs;0>PC26jnOHrmG ze|#wUDMeQb66L29^>IkZPZ`>+h|f=1YE~_Ge#%l7{Gy5ZDN8*BiE6$q4RJ`2T#lYs z#7izu%M|e?El&k7_Oj%=uaTNBPem0OceRwXJY@*tbn&Q#*Z3R~bXA}S74f<%(gH=i zu8PzQ`#g!dDpFfPqEb|(?hXl(E73SbyyVI>TM;k0GMyGV@%8V^cTt&=FLk;i$(5;~ zLxSWg)Kn2Kxhi#6#7nM9OGHj2xhkztglmj@W>s1%NK`*nX}8Mpqk45J1FJFd`>H{m z6!E%h&|!z<#Ham**W|!mgN`dQ^9vb~YS15oM7nBFe%Mni+3UKLu2;mDs}_w_#Ota> zB@lhfZIOYSgIQNCDyzuMcdaW|Evljj=Vz1SxlEDA5dF!cUoC1Nh|3RuakZ$ALqdKo zr`?M9{M4alnXEm0adjx`az=9Etex{yhk6JSwO}0@;*cP@Ef2 zqp*hO+GtHh71;q_A@|JIlp%=I)zKk!91`lMEj_4+*VT>|DB^Xsqh?q&B=*d9)K(E5 z0a#Z%>ZHiu*uUiOy&ZK|NwRxmG(-V?|cu zehDsVCu$`~RI8n+mqUWCEP6!|uj_i+p@`RYJq>Isy8PI3Jq=gH>$;xqQ-n*(wR$~` z5yWZV>X6wE3EI0-5dd*sg-E=`RPZ?74dD+k3Qq-PH2mMv`vxyCFNW0M|%Z{%HEGo zI3(!0mFl<2t!n@cRK)8VfZ%n})m%rU0Tfr{ah!H!kpn2dBEH=RP!U0#cJ6fpsE$K| z_S8K)J`(RqxF1Pl<^r0eN`(WBANL13nbl4$5*HEesuU%pfznyw1;&t6l zCmfO!-v*yAcfi}}lpszrul{bQyzNDfAA5&UeMNjJhEpd+yyW3D&mlQ+t{;{>oR%o! z$HU>YLJ`)^{bx9>6(p*|;dIa;pAB5cKR-?*1*E7B0JGH|)>r7IL! zfj36juDh3-E3y@D#PF*2UTUYv2Y8`_SGD)jb&71qOC3d%8M#4`81`i@a!6lA${`-E zj6((~@)%z0sNj%06zPUp2AeXFbH5@z@n*-R4tYqCC;KN8!Y;uxUXiQudPxI^OjhJ^ z+(XpZAu|;Dux~oGaL7xF^vBC2Z5%RBk%O>2uW`r{MLqz61A)-BLXq=u6IoY>tW~5r z-bFxA9e6%fgjeEy9I{mrUWp^y;Q3k**UE6_0C|-s^#p5Y0+mKgPU3g*6gBEBh;QYm z=s!Ie$%)UwOGM2=SX|zI-#|DcHFpbs<5|v^a?N&Ly6wgwb-h@BFl9^7O z6!E&I(_x1MUDN5fB0S@BjZLRN6#4O}%)--gsU1s}lJaOgok}|-l=OMZR>YTdCVioZ z*FKY8!Q{w2!OyufX}%&)UM9Y{ne>(--B-vuZYHf1#Fd@3&!pWB3EE$z27Op^DEn-B zQW39xHr>>hd4iv0HVsh3`$=ZgFhx#x5vy`GjZlO=Cp_BBrqPOQMr<^XHnVA*BJ4}y z(PlPH6vXA3eQ2|3y+cBtU#HCkf8l7`dSgMeHmRgh;;=! za~Y-HmRtKWI!_U=eVL0>;@YV8gM4wzsFd<>ez?~yqe}#F`Qf$9GHUCPke}tWMiHN% z6;x$#?)^yRpB0oPNK_juXt+ay_V?)vMZES^RAFdt?W^dd zL&6BKiek4*e!TWolt+=(E5&!ZiZ1X7>>sX;Ra9J%s5VwnBZq|itfgg&`24J+(!+A+ zXB}NSJa=uZqk4+)IM4lX9W_zpiH6cQ)=_Ik3O}6g^0SVvRfH`x9uwA4S3z73XT}*B z>yVJcPpHTpk{_SL4K!5|-+MREcX#H_;RgCi5ud{i^rs+B7k?=mDF0m|+0PE2(e;XW zT^nhvB3{=k=rK5^?$y=%Uy;2)*;YJ{qyp`Gs5=q`l-5nBYV;hZA#7o{zvla1@x6^5n6U~F$ zDS3qGD)6@0E!!!dB7RM@oi0?Q_5t|{wo^$(?rJZ)Ioqk6ATEd8>$X!ThlCvNrh|(3 z9PXh$_p$acYVDyV_e*~KOudIzDB^Rtht?{>+BboH4}B_#)6O&X9-OFWIYIl^)b;^E zy!L%GQxRW3`)JsM%o9e5eKbN5x=;K+`)ITxzJB)6I7K)=JWA}NiGsNN@R+%emN_Kk z=Nm-o=g!X|nyQG;&mnq!B=dy)9HKWB@%cGK?Pmm}-$LOF#LVkXs?m4;h zbAr|=;`4KYwmqCXKPPZgw;)4?i&c4o4k_Y$%L)2Xku|T&-slPXO%cu^kKrfiZ$VrR z`D;2sRmMtw{7CXAEmy?%=f9}IBf{fz_!o_TRPw{Kd2^6|(PTlKWFA-lqS+1!Wj{$< z6!DTz(NRUbnp`<79^^l6m#4mL3^6H=1I}zwWpieiul$^H+M}C?WL}h`bjqrDl++L>6z)~ zVL_ZOp1ae{Oos$rdCj+qcwPBSk*7qv*OkxAbx2OUReqVf^O?npq~HV*_k?_Axgurm zk=0E;vqq4pr1{K2hXn2UO|yxj%WE%SrYhpK7cc`RF;7nX{>~ClQosyTWYrw0=K^Mg zA|IERF{*$Wtw?_4hkHT+GfohfA0Dv_m<0|A`MJ7vM ziun8#H(yQ_$$ma9ZuTqUJ$S{<5kVk-D%&xqgb9zZ7BbC67_Xjh!ZvOM{2k zp2bbNB5%SLWlvXebG{(16vxsTxyB)(6c?K!&*Uye8M9syUy3s3X}AKoetap)nCBJo zr6^-wQN)*`jG3eKHly zHbuO5w}RQL2-gp{as_ip5T~6-zX~SldC}!Z^~$D?BEHX8G0PP3+N+pxGdWeLjVflM zB7Gi`ue*wQRuMn%R533K5^1ku-gihSdv#NK7U56mQ8mnPMZESJ=BgK%Cupx>+AA{R zP5I(#nCk^`x_E4Mhr1X_y`(>K<1&MTJ znjI>~w_qJp>Lrovb=5W3DB{ai*Bo?6PJF>E*=?_Djw;gQ1&L6qYfcCf>8fk;zATcx zuKK2^bM)Q2Bx$k|2!?a8kh=#M7kQ7Mh*#ec%^w*5wEME zS*D2B)zGwk)#-9_+Jih7(#i3Rq|cs6C*kR%$d(OBihMiwOgR$k;SOkhLvx+2SgbjZi~S>%w>@y}sBWdUhq-c{uBZ#}YFk$$-MQg}X5WF>A?6J(1b zbw^>h(8<~5kev8iH^-@$Lk=jNB$s?s5&q#`$jJcX` zWZrhjXiC2WaoNz?$b6v4&j)ZPpp)~PrpjN$&~hM+P2L5Z!;y3hr^j{zX<~*b@;=82 z-zBp++YEuwdtrleG$FP zlG~Vmie#tYY!Z0dm^_PFP7eKmlLD-(t;ui*`p+j)uC}JPBBPQ;PFs_$$Vfy(v*fns zxFQ9cdZhCbmOPSv#4R4ebIDRce#qmI_KNr(-qu|2kkPaQ@zbM`!?vcM^0d1okCW5R ze62|S+i>p+c-omhZ;9m5BSm|AGjtgvIrI_w7;A5D?sLdQ`e!({f6rs&xFX-8y%@R1 zbbeb>z1KO-rRrd2I%FaxqXi!UPY09t9p;&c2pU1IHFqnr1T8oNJRQwpMP{P~cL3>R zR=q2!9z_d&10>5FSL6+};Lkuhn+ukU_Q!rpr9XglF%=y$1#t@2@pLtfl;`;pc^pqS zvsiidC{K4&c7@1!Tjktf>N;c!ZC0Kh<{IT$q;h(iHOlj|^7Jy7y~lD!(#T0ttG!L< zm4e*)k+fiM)9HOia%k{XsjkL)o4JbI7a>Wjgr`kQ+(4P1sJH3o5S$EqMI^&2`ha;x zQu*~F`9^b}B3EXMXF6$H}PoN`DGt!bL( zkXy_j>zPOPO4@_!Z)SbO$b=$Kwu)0Lr0Q=za!5|RCr(TAchTQ$R^&#MOOTz4{E?hT zk$sA68e!>%^EuUbg3zyTq|pF}{G&+Hd_itCMLuTjI6J2!$pACNAvtsrb})00YJi!m zNZ$I%uAT>(4>T2zHe8B9<_|@9v=QVIe8Vi+k6MFFZAJW7Imle0i2o`FnQImCU)&%w z%pswb2bpn-_*NcdCMm+LEZS$P96wtPGA9(_(NB1$Z{Qr}P~Rpv--MD5GD)8ba;qYP z&8vzOuA4@GfM=-5`0J-XXM^^D~;b1sS>5T;q_D#4X5@aUAD!<_V+d2=l%ozP(16^@{jf9brmskyL(M z9buX);@e_`>F$sTZamB?$hy`$B!|Ao89#2F2h1)-9&DQAtbzy35tYNU)y+utpsDZ$ z>l#fwTippH+dQcV&sO7rj4^v05^8m<$+wkLg)eTbxzHgwac+yHNHx}!RAed;)-~3Y zcgRTcU-u*COxtFhY3g{^7+=zHrk^4{)i~2=8*2~w8E;;7NXXB4Q*}G@jEP_UWwNtm z#+%*_nL=&J zQ`RACj8FB1ne32|YJz$7j8qfM`ZH2ZFr#*||ZH_r4q?a7^Ln#sR6 zx2|W+y$%Vfo;7nF5_COla=yx)YKB?wkdSJIss6Ro71`l4%r$~UZ85`C+Lv3-^QMhM zf}H2gV-5-0pEu|2&z)+Px!fTk)hxs3>mRWU1su#_PGg7^1;uupBQ@v;=I3(2S zOJjOBvU6KubVoDm?z|Lo*C+pki&Uq)LA@p&O#15B-Haf(-A9{M9K5b z%?=5Y=bNz(3906rgJ+~#Xo?(WIU&_TQ_&%7qS{z!8VM5hjfG~1LqfS0nLp2vv&fYA zjwJ`}i_8p%gj7q+I)?=9OUxnRiRa)%7_Xa_m>(5+90=Q5OU&yVJccg!ev~~zi)oqj0 zaPOJx6)6scSHAC=ehvvGU1@e7&z-|nX82FJC9g6Y91>EkGPQoroocmd;gFD@)#hf0 zgjB1|%rjE0HH*$jwbraTBh^|{>X+QQJ~SO15_ElNhB_qF;fH3dAWN9IO{ggk#_#-5St6Z7;LsXj5Uo{{R4v-;1crsA);YxPsp*&#vKr)H}|!gsOJ zjn3>m3qOZ87El z%AIPfY37iSYOCqvkdSJtIqzidRNGA*hlEtyO=pL!iR_>4=Djmg?KJCz$8`Tx*04Lx zKZ^L#c&Dj!Dz~m(rlUiGu3e^&LxLT(%ZydT%h_cPo*`$CDR`PC2RVC8Q-|cxikD!$ zpNAc1lcmUy%f*+n*Ys56im$}-+-v$NG7N7qvMsvT3{_-kgxsr0W+Pc~>^;lY`tOj3 zMNTx1?KQI#kiUzu_9d#T+12U9$Ud_nfhTWqqJ!p80&+f(Z%pdnp`I@S@~tVEfN;6K zGc^REwr$g?8F;=kJryx`rO`D&j+$E(X`PjhJ9iiva)z9v=E;A8E|z@MOm#@GmXDf3 zI5V6$5B_K_a!6>eAI&um38{WOE7fuH!5OKJn-gcGI(}BFpUusNwFg~4o2d>7x_&+@ z)d`bsbEi6C8aO1RI&oI2-^?3lr25V5aY#=5ovxO)mB4*s<{L%U0om=4xs^LLYZ2J(k#o`Adton)@7*L$-~4DJRWxMgF|s zDo;vk?oymImkJWkz)JkGytsA1)KjDukQ4X{pi7bF&4lNaX`@IM5au~$Iw?{>c}|<| zij+~F)26Q?<6DTFzs(>;W&&Y3f15iMnb%l&{xJ_I@;(se`Nur0$ji7bcR@*1gMC7g zWk8lXWU3-5cx#k-jGd`SNg&K)>}!h5{7QJNU8u;LK$yqccN7_=x?=VNMJB1PnEgbN z8&yt{-J;0tDksVAR-}>gB-?|EbWomT`-39ozfYwV(4Jy{Riqw})eiYvk*k#_)uzN< zo5pWZo>Y6DBD<6)ZVM}NOnKtAv?6~W5nXAvf+FWDPnxZ%$XhBW-PTp)BjriAO%$1+ zJb7$uMP@5c9@|loM{#>F?-%5?-4vM)7c?Bj~`S6%1Xrxlr~a`M~f6?swRD4;S1ED;2`U0@%GpzAQ#xr6}be+Hizs|yXBZOq!TRm4Ot)>6YWvdhrB>yjI)DB37>KYSS4(06Mjwj4<V!?XD%c2)w?v@|2T1&P1WE{XaBsbCuvbgAO+ z0vYU(xr)5HHBR>dsc1h`T6sp{9n;AuPYrumd7cKsa%$M0l&6OB)UD0o_V}+CiJVJqxt|AC(~Z7JU0Mgo=kha^0dwnp37}d<>?88 zc`mp8lxOj#6jwiW>=5Ny4}^K@*n5=c_(tKWYeytQ=XzgI6qg~uasvW?nUFi(a?UYJih>8o`&|g@?3>mqL`V6vtSKjb zV=8XBW1hw~%^@S>uK{76#`b*W$y+~<<7r}xDbK|~n5T&?qdcXPq`jKj%F0t42=g?x zmnl!3)*`2wZJ<1DfiO=q+gy20UM2ZyZrdqO0WDW^o25MYcS`-VusxKg3=o#n!rr1h zM^1}J=qfu{c}@Xgo~!KL$}=4+1ulC_o2@)^fG|%>`-t+yaeR+?TG>}kEqHWs7E?1sKDyOYoqdXf_PFwq_@>Eng?d(?N zX{>VE*}cm1pvt-09#WoZD(7l@OnIjLDfQFd{;oW)0pW7Bw^UyGM)OjsuI$&?xI;$9 zI{;yxYit4KX`N5%u!AkCJXt`Pr-Qv%c|IR0ZF;S(q&)k8FweENmh$YzeUV(x9c_K( zIRb=vI@)H+^D5?3=ILbHD$m1Ze-@U&fcIrjes!Eb+(`IMAk)?EmDz7 zI)%Q#8O)Q_v5$Y2z0ukBsLVWJ&DhyKp@`p6?QG{N;(aNdZLeys4x>4@t9{ZTVczL# zKXb^G_`=a~+E|0AtKF&y@0uNO$VrhC?Ob=YvFa>&WPC98vN`IbtIg{W*u%Ia!4KJS$bOHNp7%>l;?dQ zto;VtN_l?zO0@T|9hB!Z5a#J&yDCpwHr}2=4tv_6iWK@bRguRPx%)ivTKBY5R89^M zUU&Dj&nwSX+(OE7df8W$=Kv7q>17uv&s)mV+b&a{b;{G*u2P<#l;=kKg(6+A$>Sv7 zXb&l}8)JAUte0=JKdPJ`fZXbk-<7AB^4w(qQJyNwbCZqNa6KXZJjQvJ)5qp_$jJDc zKv+&6TU2>!U`}D4zBWU7S^#05zP6I`+^)KAwwEf;BdY6WTVHt!Y!NxP*rv);5eUn< z#kN(Rxv&#rHHrG!PRjEhkTi$fpgi4`r@!s1JcE^|zr9U)GL+|5o9$DErxfp(GdG=YW2x(3;ImFHR@tZR^6 zqdb49oZIXM<;kNwx7n@AQxX;t%NcCQ& zTS<9_!y;my;r3GH$pOMV!)<-#8T4?B@&mcUHdUUxfE02_Tj8N^n&+YNK<>2D75NRf zGgkw0k3FbJ)tO0j1&|T8^rfy8v~*p%L+-aN6?wUToL&IWgSK>S;VINSmEOe&@SyFK zDM(G!*m3Y=+Y^ec*47zmTV5_aD=(IEjkJ>#seYgMjYrzuioAKg_?Ac7Du_P8%7rpN z68{)dDUwn#jb25cA89u^B*f&5vVUC3sYbeJ4PF6_vXdGL;^S>b*-ecE@sSv#Y}*!s zaJ&Ss`bXIvig3IHBcpBhRl>vZ5{!(o8x-N_K1Lq0om&bINB3>G6uGxE6yfN;%|ITu z+Z5sGKIVDEexnG-@@)t5s6DL+$MP{U&emxqk~x;|TOg0ww-w=7K1Rmd9~9xJJVqY3 zC0a`=j=|$re!}K&&q!EpO|Um9;#XS}?30T4c!>%2nGTZ5N0d#l?>l59`B=UQc0otx z$)OWfV>G`OJjixTC(-UB)1I<*`Z%6w_I%1d=8!OZK4qs0Pkfk7rh~O{%YogbNVXyq zZM?6O6TiGy-0@7ZjTC93$YguBA|o-Qv79M(fgI=47EvF4mh!x6cPLUod0w|=2Z?syTjtsYig;i5 zTzkQg+}h{b3W8A10`Zy8wJ)5-bEc1Iu6^I}gsADcc8wxI*Z-W#`;q3_q@ic#r;kHM z(!a_1!0|{d*5zo^xpuoE9GjY1hiIPtP33r9Z`c~Qv#t;u_J++KCWw!je8XOLhamnN ze8X-~#9N+7b${+WFR<@Fz)1LZ7T7a$xWF#Y7Rf$83+>m6_`QjRw%MrM+85e_qXqG? zjtg!1M+EWtS!f$5!f|mEQT9c)^El=Sd%jEU`wj^?Tx#RvMUL++OKlNFe9bRC%T`}% zJ2{@5_(9y&UbG%!A#8U=jsYpK8+fJ=WTn*-F;E*>Q5+tv%%Y`TUmRHy{4hfQ1*b|EQ zdR}QQW-0E6+@?(+d8IAkkQ~apCy5>f^1h8fB|N?@R@>nY32nOCP8Y;|DT|S6wH-Jy zca5#F*$xR2t!wOI;UV5T-j7sk?5W8iKRk}DJ*(Z<+7?rU$CqNQ?d*^o;(hbq8gQzC zinO~uPF1f!jHZ2Is>=^`9h2^mkL_+n%Ej|gSMY4GeWnRdl?~~1Balz+AVoGk6sP_` zKC^Qb8PYqA9)`WK$;O|NRHKfh5$^_Wv6CDU&KGR8I~4H|zgum?XI-kOy|&sr9kMR% z`=JuSwbeeL$Y~(lGq>8Y38}bT+jR6>XEuK?`PpH2NGkIaqNceNyKIf=tV>#%Q|-22 zI3$PWbV{W=f$X&zGhBY+ajdd=UAf;@RHOv2yP@|w`93HUC1RaZ>Z*E@|gz{{#^o2tXD{}W+c>S$0^Tc3>u}zY5Fo|ja`O#KYWbD1EbUBb? zwt*l~>m0WgUUR7ukS86o&)kjChONruw%_Z_v(MZ=D2et!&T)IEL&BHxlYPJ;Q|O`R zE&T(YpX?I}NWLaSzt|ZGNMRtq+PMyqS*9wG-)(FT>zYD?`=q#234dx&m_jGv+qn!p zCnIEAhd4C=a@rQqRGWY_1@gBos7S-~BzI2XA6rS0jYab~gkmif>AnE3SRj>&%}}Ij zUP+Y{TcpVMnkqTA$srSn=RrOqymuhVmBoqmjWpe8=}au$;s3a$oa7oikt+pA4tJi+xa5- zvj5<1muA>~i%nAGMj&N?6pC$f$OPOBWT*y^!m<1dBvs!Ed1wTXqOtXg)aZ*B3W4BZ zw}s3zk@(EWbRZ>Smn*_&M&<%38SCVb(0@wBD!j?5LjNfh%XCPXD@(`D++islYvOoh zwAlg4rDNBq9N#lDVr>`amYi{xoQq>!9goOq+#L7t#|AlM3awn5N>>9Z6MG;5=?bKL z?9l{d0Fa8Y=?TcgK&r;xQ)DjW%mQ+0Y^Nggha}OPKrV}&P-G(zPL&xex`gvA-wylq z>c_;=+h?jS7yGb5tb*f_I^LK^m8}R_CZx!cCG>m0 z&-;BocV<4n`N!k&^m@O~zMpeHALJkn?}bmu+J~8ZU(mNy3D~i>;X)>)E6qaE3#?k$ z(M+C=7FK@8c+Pp~FRu;o@FW)_!V*Jfho^9lA+P13AW1C;en8T51bOSB4E8Sn-Q$GAau z-j&oK`vhrpxxdf`HSRWTr3tQKhuRf#kR;Fyvm56iQ-KV(dl8ZN8yUFYJIa2Z$!5M0 zJ<5K8$s6#?hI%*59?N7c5WO2_Phrw>JI$lU*fW_t0R(3kW9$V?Qh6tEti6=UBHjrc zYrn;0+dO(lHqL&R$vzZQiT0mN$^t>nMEf5mU4USJm~7u=@;nfXbF%Ga z=+cqp3z24$U6@HdAgGySmuB)zF$!z4U4h8}AQ;wUy9SdbiZoN~`b<^2p zPA)|E;-=Y~n8bHdI;?5-+^41+u`7-V^w_AIKuR8#8R`ARA zN+zZ)zib!ZOMag32VVdKKQG%&n7o?^UpEEvik-k@J-orhoynzk>qqjlcr)edGW#VW;hbM)uVjr0eVJ|jL{s};#&uc!rqttYYs96{Jd%Zm4nOz^0xh74zdu)D!b@@3LX8t4&+_CMh@};kdN%< zngspfdb5nslen@`vQ{(Yuj4$nH_Ubr%QHWveE9wsUfl`Zyrta)!MX|~$mGHEipAYA0zz`8)^Wyw#S!kj9kGwlFcJlMyZ*od00yWY|U6YGr?EtpYz8b_*u8i^3OO zUHEf6RIiX2VraSF=$Iyz(>uJ#Jvaol2a-96&eiWAbE_<6MAOAB_fl@(hax0_R$;~92xi8{}8bzv~sO?!D^rF{-!-!ZJ7LM7uST+{wZko+wECX z4|@JJ5RU`)P9_63NhYmMlAnw4+uwhH)d9OblfAHqk7++(cO#;Imx28B(IiFMbsT-( zbif`=8r|Y| zQ4E_GcbQaVf_`d()e*Y^6O$Xq>{d+PxZ+t)g64#s%B0>R-^@9P=-KvC zCfj2jT{_tjGwN*noYn;G;{VfJ(;8YAxKCPEwtYLos&F>OInBa2*M_^G*}Sey({-#o zSp6O*7-uBs!enIv^+#Gd4`?f*_GjoS;q5)PWn zc2P~JRpM#s6;4;slU%jS=Fng(xN1M83AHb*nOE(2CfK)N9lL73L{@sNM9Go>-J&xgFVulpt)gpI7>AOH5mF$dpHwQTW;F3nV7nI(|$t}`ZmkE z;OC~jfi)E%f3W4=vb&rk&zNKA`Ig*Yn$R4eJA{?bnXL(xGFs(x7UduVv}Qe#@Y$B*9M7S_Re%^&Q`&ih$^AtrpUXI_nLGpp zHD#QSn3R(=!rtp_WKstRYVLJ1G@)DfNXj~pN${8Dnz|9~l)6Zz99vE3HEeWPW9mk< zQQ0pOK+eC8szOY^O*nJ4sBion}IOVw{nGlNHXaP*crWp$VPG{S2Dw&J9gM z*1Mm0)+VTjH5~6UrF}D#nodb3PbMhq3Ru;0Dljp*QOh~aWE`C4fCMyuGD(3{5cx-w zptq^zI9D*NlyLj1<-}BSoJy@I;V^O~f{@lY1n|I{^B?t1Wpy+pk**#+dSjycIkhv?Q~ zedh)3Co9U-sQOM4g{Awt&0tmE$$yRV+2l_Hu0NSkk8_S0k`=B|4Z@-0FOcJyVlGlAP+J-}U6>>>Y3RJDNvgaH z|Nr3Au&?ec)Fed~g#5$4F4kF2Ru-lmYh5E}J;1pU3fGOsPVwuc`EUyT z@@(U9i!*6&>{QemYAFXG^u|sc6KpBi`!#ctnP5w~0GbD#xlFL7pr*NVLKA8!80Uwa z7B?vLU!mnz=mdA;os~JrW13XBNg8a+sCn3#t4UB64?CAM3CiMOr_e2JrAPCA@Gj|L zCx(dC4$j}x!B0!4XATXX@ILB{%t7#` z4M5HVdBRC%^6X}1T>{dMb2ZJn2)|}~8%PId1#5m7>sT?JVKj20Z<8OidKAdhPJbpF zX82YIAYGiK9Ar3jNqqH-zMY5^oZ9Ou+h%IXZHPcG6QNPp)NTU{wGtQkNOoR}!`gY$5l zuMTl`GWoKTZ@mGUArDx#|l~cPY z63XWgkdK_=#fV@&e+A?dr%7=ln9pZ`Y;?{t!F-l+uxrGFmrwo&l2OoXJ6Y0@>-rl*G_O)~h_%`qqghqI)E} z1nkl{?KMfWFn_QFcRM?CXqJMX@15qQ$j^th>066GI2)J@feqT9LGwdIDt>f&mk!c? z1~fl9qcll_GaHzhcZ1t3&U{Viw<&Sd`^kBQ$;3s%x>sx7WHJL*OL%tkle30NpD_7| z$*0iAkY*#3?OpOQ*~X;hGluM7vKrP0WVM&c*IkX~5R*F38giV;n_1g^g8VCiXi`_f0C=5Ye>-hHeO}%)J!D61|mGPnS*% z5$n)Hj`g4>w6+Ra4dEULTJ4WmGwydjWIy`_eSK)Z^BI#9kJ3A-{mz#}bm%yC?{|*o zAUHA}aMGfwW|j}-vo1jB2c6YS8vH^hYloeWiD*C9L37yIp-Gz6^?S#v+8y@CoPA9G z>Ec_>fgEwl+=rg2Pj~{zF{e5c>=On9`ORsmNl3ml&aox{Iq9?|qQiPolUYQpQt*Y4 z)j&=;Ddi~6?+q5#*Fb)EHZYkr)wX^Ga?aUVfiy=)C@ZQ5?AtgaD-tQ$(YHzix#*-a zc?(EIAeWpaIY=KM*PQj0(28c}Q-J*IT+k#0Gh7%4f!uKpS0)YiNPhyc-Lo-7a2|DU zPq<6tF0Doc=TVJ-DA%b@1ov`LlixkT1ovqN0V&`vs7)GNFHZ(i*uB97*UM{w6mxq* zo52|3dii@GCEOPG6T$WJQ6QzT1Z!P+w(kus2xAt<0noSYb=4?AB&->VRj(gH>g>4U=ZW;9WM5 zDiP_b>K15-o+({(K~vSOs0oc1i-A;gpVTDHdgx)-`V~kmcP?q<%-^WR)pnO?k|N&# zg6XR5zRsFA?$S%iI_@ggtOtUcI_`(8DRPHiZr<;H#-tJu)ZFi85Yf4D8bYt@?vKSd z(^*pO-Y^q(*EFL1Dc*oqnqA!tCiyQLa)QZD2pw~*s|!zk;op#T^BG@{L|xrfCR<^i zfWJKWteeT?BK%qbj#k~=B8|x^`wOK>cQ>BNZ0G?{)5E=_NmkTdw(98?X+l;L;OsaB zJoj?rHKA3>93aoRJ({8>Rlf&W45W|SUlaOz=Q1FD-I!*mp?x+?ML%~56LT`s&u#r6 zX|Oe+pMGvU6KqXL`nxBXU~9s+9?!eYnv)f_CVT}j&~3#8Tho_dmEfMxgzCl)Aj8}W z5200-Wl}oDZL0}suwR|(K9_^w9?>*6nTWLxavp2lbT>nj6l-%Ms?Vuz-WwgM?*9K_ zSZUS>xZ(EXbC6SRdWKx5zX1d#$G-0cm?olGTu6BhO&T@Zji7^c6d#Cu4 zVu|}Vlhn<$2a@Lg$E3+bI^|4rOFTkWrsbx&m6`leh^$_5n=siDP5Y3qxEq*!xrO|^ z;%;T~Ynbe0Qo1GW*S+Evc$C6gF$;1G;=I&NWU_v2Ilihw>gvLuqMK~y2@R_ zdfWcKo2f~#N0jb1e-brxo{OH--S!=b;JDK+9?1Xdz*+Z_t9GOVMj_u@;&*jmw>Ey&D`d( zl2l$B+?}l1dfT^N0nG-t#nWWXcz^EZ|IM)w43{)3a*J)qg>{>4OA=X19v5jnN6(sBOWjm@EP`k*GAh_&b>g|*qe$mE@SUAak$;q%)d>ncHCuFRgZbTN3GFDTW zm|gT8aQumXSp`ks5)jk31jO_$JKPVopP)zD>3&9@<#gzyaOSzw-NvLcd=~=i&$sRl zCjXSpXB~jt_}1O4Ns7D!G{dJ(_N{hLX3AUK}x za&KvptxPI*yZO3fZe%NyirsDjO{jEEg6Hqu=|n6CX1f^H0e1tFw>b2J?inW2;fxG5 zhupuI%x7}gz0Twe%-*rQes&A=ptAT3-s6|=izJT8BxnU~fc)Yv=!qJtKk-0*bvN`P zf-}#7K#sZa#9M2y2SDnt%>A<6I?tgMr4-|nt;;>X0P?pxhzWkdd$lGbG)a-mfuw6Pfi(vocl6kF z*`3CkY#=x`U3TZN=9ec(bH!b3G(b>u#a+&t#3i)WyXvlCV(Rl%cRQ1J`a8N+UUhdd z`49;9;aA=BM08KG9%6XStrDLvoMYR7+;DpmvDU(fwiC!L_eCa+px44$_piH@$*!-V z*8%uKoL_7r zjUH3_fu?}i#{}y}B9Ox3Y#z@=MAad>bi${lMMNtix`t!@DIyXy3F3T@m^Bowf*Hs? z;x-dg5AP8)zNcA7pH|js2>l*$YnToz?75hTej#^CiwiXzNl+HWMQKff8dY4ZWrF<} zju*uva-+Byn3&shi3m*zF+Pu`WQ3-qn3G3SDne6AtjMD&E#4WCJEf&Xx+Xy$mJ#kK zozkdF&;wvgDI=6#X%dw3ePWX)K@9H`MaJc}Dkt6=k0jMHv&wSfgeG*;0B1YpBH~j{6qtxs zG|$8}V>!_@8A%XUdC^LfAf**VnMtUj6DZ8X3gQ7KxYi@`oF;*v3L;UHz)wZ7adK`y z6~$R5#!tnF_*4|#rl3{er;-?{Ns7eZ)_$fx>`O#gRT6XaSXCC!P0by8WigbA3B9s- zO_LxMmBl7ag3x2aesB$oX^#=!H1dpVSR(Z_3H-!}7McWpszl^Q6(OgS9}}M{VjB_p zS5^3C2Bfq~L`tiO!&(z~t||tk=1yrt{ zDhR7K_t-&Lbwo3*p*T?iUwWgT2H? zNPAt8I2+@W8TIc5>JRIQHgkh?p{AZ#%fysmeL=5vGS&6=w7*eboYtBkUG>FPO@eea z5Y9_FENQG72v3v1s(~nyhcpz?ngo7gBU)Un_)}|W4;FJHHo{M=h@Ow32Ywof6PjdN zChd(PJU5E)+(;xWp!~u8sQq=}hCoC;SS=#LY9Y?$(X@=vv=sm5(L55Nc|;Ukk~^$NBQ%eS@_96^ zA~dZ;{XCk-A~cVQR(Uk7BQ&kWtUQ{>BQ%eTn|U;CBJ!|}$p3QgbhQ;RngnIhRy4_@ zc|vT-qj^FUPs{D6T|`*z#L`!CYuZO>+KcW>b8DWANY|5MRvt}<2u%lZH;?A2h@Rvr zQRLO!VRhu5mPRXVxg8^{o)-P{Sapi9>J(wsS!~K<)g>a%T}1RUj8DjFaf(hkpNZ)C zpAl1D)0*&H{TZ=9lc2qK6;CZkO)x*~D&}jFD(7s0@89%=GX=3)lc1EliXEB+ex4Pl z$x5$W20Ra^3?lYT^h`Vd*o(%A>MMwtQ6^4YdW%BGQ3l7RII;9?BG|JL$^Q-!Gcv}B zdQ8j+5+`C-k_Jacvf8Oh5N8NWlOWFB#PZc-WnN`=6Ghh`39Pz_>Y4;r-NgY-D913Y z?&3lotM0;Ci+%#D9uXzjLsWS;x29)=rl)9uaXZ(+ShVVPTS z&xx8$%q_U*BCMVh&*ag>i-DR1p~s7fc|7+KOY>Ou5mVmB&{JgFdazdqb)!#2SYV|! zL5}qe&jwBD^bOBsaNdGB-&d4P*Pit+!C@WiD_SwZ8bu`U`n|6>t2IGb{X~HeD25-w zE2V6RVLwq>lOU!2L`O{mtNsyI{Ui1h`io22Dp(6YA7S-;L~cAU@_k6gJR~BlA)>%16qac_Lq!E9#%gGU)ljiAk7k%yx}I{?)aPO1A5DT74ig17 zC8sW4jnGx_pLK^t*~g@~+m0i+x%XlwhJr z+=y1e&Oo9_*Ca?qqL{iVcPd7R(qB*v&3?iNk<7%@!x5tTX4C|JMu_H`1fh=w z3b`eBSfe7^#V9c~k7l%}uobO>RE!oqH3>o=Es`_|LLVdE_%e4Y#zd6P7_mib0;{oN z);6*-RnEEqOBxj)}Gs?tpVnhrlibXqe$0u3r(sjMc(hX1RC@GmWAR{p0E~1gaua>zsEQSVJ#8`_h}LiYf(g4fyRWj zD55MDi4xjRDBOoHiYUQFqPo`5E3K=LKZ`_NveGkQEWt$_=aBVrQAe+!7l}Sv6STp_ zVptA8egd>rF*=W*#bPEAtD&Ovrp018lWIkTg}2-nhr=q@iQdAzEKabd+sm$120W*U zXMUjCB5w-oU`x24Ao?*Wbw7L+2Q;sVkxUxg=V|h~NMZ6+JtA+41x#APjbF5SOT5Ws z(tKN!cf^O91Swr5z93CFe^!ZaHK9E02!2+HeG!@yM66fSe55Bl5qMrJmTE$N zMu29mcvF+0HLVq&5DDkuT9L`5H|Ofwh&)^?4zkAN*t_C16O&`_i7QM@j-`uyKT$rL z9Q#n*!^Gs+I#Gd%$+1sFT}^^?Z4eKVCY)m%#1m}QmCyP&h+$0P!z6ESvq3B%jXV$c zQqmxQHi)H6;6cCjmL_iz(P4c6)s*g~d?yMVC(~**oe8F^JCM`j ze@t-fMv^U_W`Z?yPdwbR5J^n1W+FK!oa^KnXTm$d>b$6MLx*k^Tf64Qt`{`xtKVs@_B$V@Cg61EQ zc!vm<>0Tf=#FD#6f?9V|tp6`B$$K_>Q*6^3%AZT%=cf2xli&-(w<2Z^x5Q1Y$yTlI z2wgXBi73m4(1S0j-V(Jn$&M=cmuHn64mU%%_sfoIaYt$LulQ7Jf*O8XWNPx8`sE(F z8FE|fW>T;yec|f1IGn?39eBPYD&)h^L$XRwx^H|}#A-r0wi`5eMJ5x>vEx82FU3Zy zAjhJ-*_xzT-@t3Q|MEj`>n+lRVz?(B?s#|`iCFbv+8&h%_ujp;noym`HNNKwhvM_y zSc;G571AU{9sq(fPtPk&8fzQ)DGPq2m$!6$526QuS?)RLGb@88Anz{7XVn2xAgl>3 z%4apnMQY5-XZ=r;cnUpy!?u9;gsWp1?&}J8$(jTuSis9W3K#IMYfYNf1K!zf)t(Co z^pj>e@GYGmffV*yFlhv@hpquB;?2^8-bCaZ0k}pDxFWxORmYUpkcT9xs3 zGr|7neIRAMm-3?~s0q;#WfASI)0&X=&OB<}(O%&K6ndSK@cl#Z6YW)IQU%BkAmzOW zn4GTf>f2crBRp5~da|Z)-a4(JULpbfRQ2xWv8wJB zFQWZOS=+WA8wGF4z4lBhFsb3CGWn<#X=-{~nCxIu%ln&%{uTv(IScfdJ75vY%Nu2;{i2fYK5kyjjR9%$-&U6`1ZHt^PJLUjXI91Xm~#)`i~73(!A zmOD3MBXZ;aBYm_LSgfL$lJ`syh(55WfIZlg}KqlYgL@mjxS_)_Jv;`^UQr?%ngiBQ*Rh+Ol~ywmJ!i@ zegZ#Dy$ns#tT9jemOmO^J$p?`1i4Wh$p5@JA`pA>+|rxHWadVgi$Zy|^v;%~_~4u^ z39KIRwv;0B^a|FNWDk%*-dat9 zv0#Xo!35``d*b0Ww-*b2lc_)X$HR9)y%kKb{*(anf)@k76oMM8KbSuwBKm|8UdQ`U zLp{I@uo~edFfn0`3TtrOLCt7ylh%Y}a&cuH0W#LR#AE@JabA_W=s6_sYfCqNle{{b zq{tdT@WyYF_W)~({Ri&?!OwW_e@tdpf^U^;(wa%qTlAK5yw`#KqyRxbi<#nm2b0d5*GS%C}L@f2Jf}ok|?PJpLD`Axc zlH%F*$*R==`hH8QSCq*^7OnbIy|PT^!WScP29oNv)P(9!dGM3!4P}C5iZvnR#WX9w#XdX2c$ZT)1CNw+6 zS-~7{B@t~k4>WVV{hClJmI0aP-5@{VHU9jF7|!>cSPY%wgX@%lVA_!^@JeeOum8F+*qb>dQF;=)tF13Zl^1}r-{fTJ*byh;dRp_MP3Ag zt$T&nmo=ZV<}Gh9Yj(2cEpHTSp6x|`-u5Q4W(*MY^R}1DnnLrGH5g*}jyIP{IUtFe z3~HuhC|`iJ@Culdtn@}`k|HMp!Fzfuy$P&2eu?&kS9vcoiN9>fQYKSwQ<<*v-XWs% zc~3m-xO$%uvF`j#yGE@dm-ry%SiVP$W+jt(put+V+H2mNGzVcnfygUN z@WmX~vDMy6CY|8T+GI%SYVS6apQ_~7J>*)i=R@Qtr8>-4q1@l~wlJBupI*Ma=RNg5 z(i}RX^sk(}=Z)4R=mFmMrfL$*cHZ|6!>8J@Prw)Gzd`8ldplZaKk}TA)_EZ5-d-jR z7Qp&TlS4#wjulNt&Gj6l43H1JQjkI%Wir7}3m_kQ6_|Vm-{isE_|S_ZqW!ejnmI(Q zV&iEKbP#gk@{0_7L&`T=uX8( z?<^A>%`rY3y&J8`%Jlpjy&{hjF*Apa-e@K`^DI0GtxmN;O;-3-!ltkvbJJjxSEwy& zg7xX9h+b=xcdyn^{dpxGzPsyHV}fyR2Vs5g)n$Tl?gZouuQ3yhb2lKHy%w5;)(x=w%Dc>DGOQG^W`5=QPhkFp?@Ke=@!Oq|vPj+r>9tmv&SWOkLgKEn#Bn>JG1Td(xP?y2E=# zlaMtBUVz3#co?h-n2scuq$mSfj86fAEHC64dY?y%U-Q_4&t$ z`uwAJL2IZ!r$OjHLdDW?mM>qntua$zuiI{>9tP1Y0ilEk~e8C|6BBAMw^Q!F-+%xpBmc=|W+d{_t0C ztR_J|{~D3czk1WOCdlVsy(OBYS#C^}m2WES^Lz2npyxC=_fndi@S?lwu;kOQUcp}* zJn3~|GK|S7??p{Qvh^i;>w4N-s7Z=^76^`vr@dvYN#fRY#(SGJv$!>#@zO~X&gX2e z`Lh^$$Vz^S+UZ$u0Fz#oX}{&Hw@?%K!Y8~r!nMpRIo7CNK1-e&ein zn5|43JnI$dPGPlQNIk$=?@>*HGCk|HV`9qmtT&0Rraea^{#kD>Ys~m{)|=H6J!e{9 zxYBY`Fg{C|%&SkUq;p=vbEu*9MH*<%d&T34m{H~rFPe!tEBV8#&cxgry5Kqe$jXc< z7rYHj%7jQ;olMU@NaL2)=)i+hp_(kerAHLU?7mo5mr~c(^?Y>*TXAb^Z*P!BuzcM>OIZm zQ5aLOy^gQ7V z#PEjKWuOk-vYXI%4{mx1ngo5qO>YGg)2rX~R03L2zj_V)-1O=&G41`9*He?MaKCZO zo2E&~O5aC)_$_ZKlYjpb)_v3A?XA~w5PF7I(1>PDcf9IDC@ic$m>YMzQOQn*Y4pOtAj!iAN%bkrmb-933oqnhDmQkHIRReEkK|VEw_I zcjQ_oSbvbXa%CcEa5oHVl#uH*32Ky(dCyAVA?XOTqWV)P6|Isq$qLsEPp)HP>V}kO zH3`Xi&<3#|Q?kNH^b?YAGx6m!Oz>+z^}us}8BZi!H}cDMM63b7*cN_Kp`c6{rTtiU z;cHr$io!CP$qe{nB(~+k@+(b(KB|b^$HeqMMP!lD=qD)mBC@$AAuEN)?jmyS7z(R1 zd`$w&;vN}2mPiB8VCY5V0wym&y6_~lsNBuu9?&2uCXX`daS`^TfE1TS#*v@OpOT*v zvK5mhi|HJsgnXKb;xCDnkb^X#o^2Q8SP40j$wUYpV^~toVe%Z4QgRCu)BBZ{&Ug%+ zdcTr0;Os^gU}Ac|du2N&SbOgS&Al?7iRt~y%EL^s_F@T^l^rIKXVd$YmHnBRySrs0 z>R4GBI}xp@j^P|TQWGuP=g^FS_(aQ*n$Ye6&h+k+$(jUxLU~C$_CYBJ#EjGIeI#2 zuq?I%sU~AmiC|e^=rtnpxu$HdH9Ef)QN>rf9bWOWx#I+?e z%Cwya!o;+%#w?rP2`R!x~aEL$-te$BSJfS(pJnMqwHE#=2d z27ndT!$;)jnxx2)KyY+;M1IYhPufsjeN_I)B?4h;Y5BCShbe)zA{^#DnL7& zts};Z*0LyDU4x+&=c29U(@gS(35^B8*JE1CIjorgcc8Gnx0bJK5|ZCT-I%UJe~&et zV8%FClZ~t~XNaw3CX?zf(AiCExu1xx&wJw0bLY7_T~W)f!S{&3&*O4}CcztoHk_{P zsD_25K2vBTm$TK&uxqpmtlG#MY}FLLgn%=Lw(_xgx+Ykk?6Gx^^n~opBoX3_rQA+F zuSs^)`#cu3;~ptH>I}4)P2jn`oWWM@^3&+~q+HG<4Qc}R#vNqOmoO|^Nn!hXO0Hc% z1nWGJO`3$l`z=pN5W-(pK~wGlF{K<3Q-T38B^VI%m6d>)5)6o`Edenl7$&aCjewZk z=xE~XnzDe8W>P9#Qx*X+W!g#hT!^_r`-i1pgmX`sp-D*YJe1Gs2&9X=!Q^Kq&&Ya< z(29D1X`tyU6PRERfaF>EI+NumeCs73adMR=sqzCLOEmeAHT9vCUjx!j9?&F3wgK{% zCdXKF71n5LfpnMFVqJn#9fcc!nkY>|@=5L`ddT8TV*a2S-a|%fk}B^9g7vV6tfEPl zsth#~Yh6#-oUFpFpr?FH6RJPB*WF9@C95biSMMzskd>7mLdP1_Tkd4dE=cK4h+%KJ zZ;8$^>-~F3(?`a=Ok`^#nuqr>BYqU#-`Eomuf60jtqEQN_LXZjq502Q@Z47>rRm(z zcQ}#slhI3w;Fv3C!}tAUJtjEj;;JM;CTc=;9@9Q3SK4cX)gXC2l%?{rw0 znA`}6S@{OU%v*-ZGkH7@lb19J=0C$_wO4iighL-LV>JmhBjgYw%JgF+W8}Y@gskoypE1%|hUv#>tFa%aV%)&%c^TB&SQ%^`lN4xtjDA{ z+?MYInuT)pyQEpb=Xwj}$3*1OUY^xgYd+T`Mg9pSL6fgpGw^fj!xzc#ne23ZYdB~Y zMZ|EC{Dm~u-X_%dE|#a69D=zz=KNyW zkxubJ@)eNfGC2o13S^~RmxC0W2Pb{AJ~~eN6s_^Gb}*MmcpI zSxxy@GRZquZj>EACe8MjT>ZtZO>za3vT#pt9fbb5EV7<7e?#rXJlrh%FfrrcW;vfp z`l@{Te0j56p$XOA4Dho>&f0)}Xf=xa#@l4fr$lfyik>qfR*@MpR%>V#>Gk{nHHkSi zSf>AWFGtg>o?X1i>v3H)*mkouZD!kUw>N~%BYUvsGa%^a8`+;V<5`m>hq7iCYqI1R)>MQyeHfn|auRFm z0zp4JWQa83I=@pc*CZ=yKAbYl1oV5+Ds6KZAKZoRl8RW-|L_f=TBH`TlS&n9n>05r0 z1-=UWq=BDbWKSlSPrKE{1(Ksueoa=`t0VbUCNaTY9mz47s!6aWIxa5| zk;~T7s`j|-v|YzpE*n98?{OJVBpm1CGLeYYr!1X%oRH~ET0oz03*vl24$RVitY@KS z;vD;=oTCZl&r^_7r{rs-341;z(}~D}@J-#u3*h8Po@P>+$r)K@hfZmDe=J)z(j+9a zKBAN2Z21stegc9k`fS;n$xZNzJ<0F#IkF0e{<|Da8okfo8FXjEV}U81bF%qPN>>Jd z)9IW{WMXbMo|9KKp&5QW_&Fz+e5>Oe{xZXPS^7I7W+ro9R@z0x%w*1U==7C2%(3&b zCu_|4&Uv|;3GQ%ihp^5|XE*sVJDe9}Zzi}ukA5!5B}}FYS}$La#lI&j+@Jpe{9KSt zn3(OGP>+rAxg?j9m5lns zv3`fpFUggfq{w1G{?z0H(uB+FZ@HB;y1dZOWx10Hwv?SP#$A@p_fmYGfju59_bW1; zi7Bruvd9mlsR?UO^m9dS(S&AAMHV92M;aLeHyiN;;hK~`YAg8wlYitxnglzy*JU@> zl!kE`L%%Nju%8M1TJf{oIrV_EVgT^RIQ^l+~Fe zLwtHdoNvlhO{m392lB6MegLg#gndnu{Y=aW)NL7ih%{I;_kiZM{P{4Y^i&aLoda@L z{>EfWXPWKYm3Np-aYoO+TA)dArkP*mJ(J3>mTL{wXWYfguhKQ49hhYBQ$W!?fqwsMPduC) zsgA#5SXohfWAa-&K~qSrJBB0(t58H(h13?Up|Fl=s}q_~tHd4Y!s<2=E0a%i?ok_# zQ@UnMvGqN)d(;skvY}1wqNplzLTlt!`0_T6j72%lL3=N%W{@U4w<)I5nY05dteM4B z+;0@t`4!5#4KXaHiku{Jgh>gNa0*E<7L?)=q?&0jhTruF6Rep?N~_&$g*CGPkTT(N zHzRBrwf?jYOMdgPZ$)d(W=&G$&p;|^lF6D^fz$wUui8x{Tr=-g*I085>UFPva0aCA zFfng5$}0DaPDS{41IwyHnuO$oDU_?xsw8Wk0D|>7T2&xTIIR0rIuR=YG}!-?Qx&px zDy(gXX%sG}8fZc}hWT7hwP($@Va*^WM?a*pD5oY9(P5G2r9|XQTa+~u(q2xj&?H5^ z4rHDt@8+<=x>{bHCXMcCKLAYyb(u6)bGZ5NIgm;Ue!Ljs9H#A1JghwnFM;<>ss)pqKuTz`jtRyG zf0ej~`jUzH7IzJ`i;4LXc#VkGR6`vmjdgSrm2ypWipiYKhWy2(?r~bj)l|2cq(UBI zd}^wZ=P6gs?n*5+fk}1|T9MUK>zSDEb=Oi~G3g1va)LFgw)#nvpjFmZr${4rr{%LA zg|KR?KS(1_18J+tRo2A9E2POl>Zsa(==jK|nB1@WGwB7tJ&mJhUA3Ia7$)`94@~Bp z-_uk-Ymy@01cGg+zByG$mZq;}CzRk%Pg zd>sg$)HGC$nG}MZKwK#_RNa}RhpkeXJa&L?IyF?wiGKdHQ8o}+#2MrsF>gYeb^%c7CG!K5vOj;)}PT7QwOhJHcszZ$8`9K?fdz6Vt8 zze%HB$!8S?(j?qNn)zx|m7q02DK}O7m|%;m3s#`HjDBeTgP}K5=}fTi#q;-OYCjX4 zuVS1ZR9mi)74AqA$z+1_RkV6gwZ2Lkb0XhdB{ISJD$d!OhvRH|^@r36*5C{_6=L|1 zYH^MH;0$&FkpHO;ngpZg!x5wB!>YU1(CCT1RzNWANLr}p$+Nuk5v=&Zb4!)1NiYt! zREvpNd;X$5qDRzDCL`di1YaFKqPqTrF$`Hqux7SW&oTM-KAQVIrV^N#xoB&(mdSVD z)7q-Fs&}1IYEF1ttJ6#_L!7a6TC1cRIxKnoj<4@bwpQzyoMZC1I>Y1+5GZ&Fw z(!*bCg7(!$HM&K9N{**`*jBYC60YHGRfvd{1amD+*AwbxCcnb$0zJ1=E17fz&qR9u zt36xK!mpG32D#c!rRE?vfOJr?w@GuN1>MhlTD4(-pcQn6SMEeGS4op~m*QjUVP|!Lh@4ZJZcTSq zG5=|ee1%CD)s0CFAn4~A)khQfC2k;?&(EmAtXa%&BD$)PtXTyFHC@$2(u8yVSv7}9 zxNnJ5?=sl|KaPR95vM+8GUouzCE`>TlgA-+((KbDNPC=$wH%!rrbfl7rA*AaAWn^p zLQSx;i&GOdp>HwanlVm&$OQWYB;C{*vXZt>HLAO^^Xaf;>O0V*r@`5uiq#|}7tN+Q zQum0lvWMzI8mlt+!QZaxsiaNu`RFLkE_$h=it(;sk|$v|@gJy8XOL z(u6|SZywbrtTAL4jy*l%Dx9IO&G z30Z4FLu3h)?(-b$53m}n&ajnf1%p+zBF{g-EsHe}#$a`piP_H_tbWRm8d~p&S5R|A zlN9;sI#`ha8KN$066ER-bx#5EycYJ}aW{UbYQf}>MXnx&hpG%F1L2o_%7LGus&+xL z+6Y$oZPlUbH2h*#&bB;E6(~%a)^NM{A+Q>zO5Z~oldfT^ITNhmm>a`X41E0x{ooi! zWF-?b#tl;^GzrO23-}cn@?1=ZC6_XJK|QHSun#a?4PsL64BhD(u4XWq3!&qDW4L;Y z{X7i6{D`3sS6i8!yF{~{;p!WeE$FOesyvrHDXgWn&7{F$UWmZns^2zSWw++ng>$pkg{tDsX+of^{FP5W7WYbqz*8_x{AHTEY2~S zkJSUsi|Q(Cu&&~s!yJ_nO);gv2W#v_^eg$RiUtoPf^dVL(L7--&CziJY+lyoJk zqE#>tPgkWi3Cb&7wbvxg+5+c#HNj81%Fu*f5H|$!p*lfU;g+&adDSRBEz5h>L!kLs zRc12x3)^Z3WTSc@ho(D_%_@<}@rpE;_);Y^={AvC+?Q%+b@Duj=Z9aaV}|&2M|zt& z%cMIH>=U-BK{e1SGpZ282Y)Yen;NYNwTsmddWKqDi*f_o#X2CFY6}zW!?yy-QZs6k z2HOSJsGVvZ6KogXf#%zYb-^yRy$)K@x&U9T?uyXtRyXo!cB^{#qg6=G8Sm@+#^0+Z zn!t(`$ewuk{+Mb>8f)1Qn)~fh&oJpPwp_zxPNMStgN44#{>JrpVXkbl+veR z&W`1^UyaZtMLq`v{p?p0ScChAxTZd!ULz8&bqCZ(M63~ide(I)i-YP1CLi5anjBJR znV22L!>U399lG`BjC@v&W$+u#s(nKwR5x%=`?J~^OEIjz%(3c$=4Z7}6PR@ac|enk ztXT~A=P?z(sOzj*2?SH|i?SMNKjAnZQO${1RmQ!ufJ&VNjeW=-c2X!N8Tz4K0{t9U z)0to^z*+ZkwNR5_Eqo%PKA%vpYYo-;3y?nn!S;pZH?>M@Lb5Nc=P<`kst+hEIRXgg z*h%#nYfi(5)lqXweaV`?fS~4-+QFLDye2xW_OfO@uZd2p!>nlpCmMGl^fT%NYgz(v zUPE$@HQ!{@oFrTQ&6>kNFsy8Ki!})uux3L{m!eYOsdw%Z#@8>&#O%jaVf)C&=$xA)&GA)PQ%;M zr-A&bmgFFDK>kwSF&SPnzmDN0b&1J)5FcF2{H?xwnEaS8AzV=xn3!63Ma8!uO&XLA z){QIb1d~(n{jnqn>xxQjNt)4{DG#rxdmkZU-oIZ_jhGCFbYYoZQ6re#euR3PD{4BE zD!f;DMa^N-zBlc`UQw?y`4G~MrxjP!K_>fwVE=qoIge84G0kZPdrehklEU9}xTe}L z84u$r#^;*4!6XCf50>CH)xH(_p_Z};QhH78V}kX0Igslr@iEevIsXlnu1PSS-iT-^ zH&n6KXhkgr{oGKkG@<#=CLlM}pd4gRJiM+_bBS2P|MRWiL339XdYn>f)^SmOX(mHK zgD>=>{3bcbb+F3k$K@dZ0df32Oia0Z{v}O-?Egn3{I!-Me)N-+QZwr=;|2Sd)+}Qj+?^ zlK$hQk!68k|5MWM$eNO{tMB!LlPo`uH5Gy2OOsN5AJ$A+M{TgQpLeBD+Mh-mE4?`E zHbah;@!w$5^HJ)5%KB^APi?q&foU)6?`I934)g-6vVP;vlpCW)(_ZC$et#xue1GFU zKku35ef}`ggv;VSe-T@q+)X=^<@~iwZuTe7$kp=xX0p=p!JCcceHuN3Z+chocWX`Xo$U(#uxBtn zzlFcEUBS=$P47TszO!AyAET|(taI>cV-DnD1umW7^tPhEOlv}u2P+k@e6j< zIj_Uopsk`cNwbpP^R1&mszj7>ReyAMZ6)_M^xzXTaMtE0YZ9cis(+F+R%!T#c7D)Q z^KUc3FUXY!Qr&ObgUVgOY!F*qEx$dJYtT;<8OdZ?I?Zir`5=V9EH}Hkqj#2S`N>+7 zX7z(E&@}d2G10H#fHd(>Gr@BZv})$pizh#L4uWAd^KUc3QxDAN2mMB{R>ZgD zFTxrP_qF~PCdbPQCM{TVe;1$0N+wGWB_ z^J*%>?n>@BkAit!ZjyaBub*0Qf|*-0<`G!2>a=(1OS#bob_Q~5s%GRRV__|mTT=si zNFtT`k)Jb-4e7|FCd|h+LwWtr&tNhdW<*FH_7kDk!?Ji22>NLeE{oYol&%(j25TBW zX~<3{W@oa6-{pDoGXm;7`B}>3)LTv-&$D2ik~^$J%2-`ut6fJZ6)pT(1IY6>xPhG8 zDtelU&pOsT#5Jmge}TzixFJbaLkDUXW-@HN(Hv!R-)X8XE&bO9ksp_Htfjw_Nk8a~$#dTRxuyTiV6;lJ{)0VF z?6Dv5$7_-;>$J(QUqC$Sr)U!N8;|;HHOaDe!QA)=l<8xp1fxvbX&oje=L6Ea4dqWj z=0^}yI)TQNPC!ik35cmb0WtL_Af~ni#MG96m=bL5cYc9N(EXY6InbCsAt0u11jN*z zfS6Jai0OXN^@ro9KmwC>jaXwD7OmIGqi z`{Utq?+(B3fuXkv6VtZ@#Pmo3F}+qmOwSe&)B6SFmZTaU5Yq|*VtW37m>xSIrdJP$ z>B9qJ`tX35K0F}rR;Jn#5Ywv%#PsR`G3`AdrggXRr*O_!hg)a4b9ETZ9CDLv*n`bY zdcdA=Zu0)?c}YiDo9EX22z^3sQod7OQUTV>xiwvRL<>^!9h{rz)?D0_*Xn1uJDFSa zQw;Utfgc}kTjbVsfExmN$X|J_^7CjO_$dSXY`Lx4^GFnEYQp^s(yY)qAFSHi_#Y9G zm+$edd~d=VUVoz|De^Xuf|_Ko=I#(-l>zdEzmqiuh6)S6Ve*8(pEVzr%5Oaens$DH z;n>@RWCoM=eoH2s8_-PeNxvKk6yJA(L+#Q&>;=&6%vYNVC(9ep@Er!@eD!a(48)GBLj)($Vk7 z!5Y&ByZK^_ z9xp7@KX>zMGcj$so1d;piiJ1EaR%GXZwPaAD0iJMoSAp?AJQaqz{86ki zDNTqdodka^Ys~nb;NM_kN+-eJpF%Oj+`!UFh)8LIKXe+!(4=dypQ=g7D#rT~gZ)<1 zbEjgkAJ4>;;9!5CCPBFm_E%~``Gc#!p}v!felo4cxy23jS7?%Dnb3zu)Rv+CtPq86 z!W!z&*CaDsGl%-=Ow5dEsDF4Sg=OYiL;Xuk%nW3xKYA8vOpXoZ{e%DHa-H<;#TSyMc28p^ z7ZVwpXvk3}8>hpUpddFA{Vq#L^HExqwGYTBe`y+#)ORUeWBlT;Ajt~9{umRn=P<@! zsx`q`+n9)&Io3bHeoWm+@*jVdJe!)3iHVs5 zB>8Df%p4%e|A>j110?x7n3y?0l7F0unFA#G*O{0(K$2f%8OAx&GIM|=zXlUC2T1ZC zVPfV0Nq!GQ{-QZRl0TY>nFA#G^O%@9K$5?TiJ1c=`QI@ybAY6Xd`|LDYE94vC-|4x z%B*fC_%W|h&YN*(g8vy4Qx+5at(s5|@GsPj3I0*mm=c`i_gbFY&m{jvCdSVsf1xJ9 zntGDIoQav4Px3dsPPuAk@00x&ZxAtUc}he|r}zuBCP-;YcpNnArhu3=NI=XQBp@cN zfS5I7K+H@yAZAXR;veQXn>lTuF>~4!U%p8>X7VS+FQQ2>?xgq&Sz}5kB_i!9{yNr} zvY75aw<5Ra>HYvF#?N&B1x+$7lRwk_H<+0GneOjnVsc};Umf-=u+E#@nC{0hF}X3_ zpT)%F>U2MYiOHYo5&1LS|C==?f2R8}Z(~?NZcO)AX%dV?)BTS$2}bi7{w7T_EfeP% z5ji%)k9mjk$K=>df9%TKIX2Uu#Kh#-On-qUnU+}#&-B$Q$_+E(&-CjuF>Ae#&cv+jW`^sknH9|RFK7*=9rq!@&uR=SNc${*xhBCVJlnsmNziA`_A9N)ovzt_ z4NZcPdbZz@HD-o3+poTstW5sQ^H0Brgho%CkInOMFu~c^khhTZc^@^ImZ=Hz{S{11 zZJF;o>7+3;&-wmPCT4t}?~nX|G-iCC?l2 z^*Z-5@9%H^e9ZH_&h|R{x#z7zg{|Nd=WR_wZ~4R-!Wt9TXy>~;p+-A%GzooUv~!t> zInx~N6#bb}Xnb|FlfuNLXSCB|0hP}?f^M*ncDgZ{l}oD$u(Oaf1s$4QjCPVW3CnP_ zlTI4jeAPQTDqo|WeH_Y^>R9KhCSfkdI>j63GN-6caPY{>-WT8-@x?(Zo;tH~3yyZ)$0uxh)Upmz_2}hzYom@?*$HvprFQfeVOQ(1? zTBcVV@x*zuQ&yAEd#5-RHOaP2`Al(^Qm9~UKE+wZcJK|i3(!A*drjacw@^d0Ufg%bXX09VTYKceZm*lQ2E- zk>~HX=X8!!gNe!M9H*`(6zYMm;ohXviZ!Oh<~cL-*qP_7%VTGrvssg{eC9d-F)<_c zJg3+?Oi#MK{89LZ4C0#Sl-4B8-Uy_QCVBUW<~tR&Cc|oblwJ#8;MCA0NB=?@?&K_V z+Op=dOte~poyCs(hmK3{|Dfex_%t~?-n?$Q#Hq^~vj?)oS*J<3qF>@vUQcCccITEj zuW1sN^Ae|*CShN<%$dibOr0)sRx&Xqzsy<3p{l`+R;=Y^PQwitS9b7L`7)lRq+7V| zCQWPBm|QG#Ue+W$w_4_;XcCrBmNSissnZqC%Nr>!v){79>90wKWp3E6a6V%49+!N! zGloN%6Q7kqshXEdS4PdORys+WC@yp2v(g#G#Q4Tar{QMOm_B@^bCQWUfdb7I(wJUr zr89wvnftAD?5(6RbI34-rkqzg-B@Er;g!yLP0}o!>0vpqbjoc*J82fq^!9=OtaNrW z!I>V8AS<2b+eu?)dMllZe-bhKHY=TVOw3GgrE{DKjwxhk&Q1zt_H9-=al47&z73`4 zMJBj!b5o~h6ce*=ljAIAg8MdjOF1XXS64Ylv?d%2);K3M$*@M;C3G8H<5b^+v4^XG zwNakA*6FA<*}+@EYn^^fOgXQ0iteRcp!Z@<*E(gG;I7g7WF!ML3CGjl*`LGq^}Dl# zHO71Ya1!_3p29zzyP25w^@meRldwnnBk)YqcK&cSX-)Vg&L7TBCRYc*7nyL+^N*-e zX1#NW<1*>Vb)5aTrzh7*Vq(&h>y*+YoDJqW$pcx@nU$gNbP=o19!GrU%&MTx4Qe z_a-Ol5ar997eIQLnD)NOIiN{eFf-p2mD5d5p~I9fQ_fqW`qeGYDAt%-$P>(3c(>D^i8;&O9knO3+nLB3vjel+InKoFz=UZw zCAQmXf0FWrvkTmT+3nnQ3JLXWt-gUbxSYB~EHlC$aF%Hjj@<{H-Aqi09f{i6KH{`J zjh1t)cO&%ez!9hPKSYfG9EtMGBSATve1*i6Pe@Eok2n>z<*;u#;$#wu88|prf17i} zIjITNX)@&Ws8jn)SQ_}c;Bn{ae~IA!4~`DUot~Od`QW+dac8(DVQHL*%KK^OFV>ix zo_5ZX9qX~>bm#W8b4`i`w%9J36kgrJQq;H3{3-IcF7XOiMZE zY|tdbUJrK$unnGbwo@qk5D;8No^$rICO_QN#Tq>C9A`}tAUNMR@0=w~u!_9k+;fS_ z(8P7gY0Jcv>LsWCRn%ly*Wq1Iw0y})yhfo+onCU3CUl;Q-g3#YuA?ShpT`kNzJVm{ z`7b%eZ;}Rm4D)r#X`xAYK6uG_i%5*wVYuW>V`6p~E;)xel$ljta_+O@bzEj-yyQH^ z#LP}FIjKy{?&T$CHxo0yUvi#_K|ASs=7}r%OHR5bH1ovW!b{Gh`A|bAhIl*uQk1V= za{6gaI9mPZ)Q+VTnz;URGBpY3b^kf1nV53^&$-N@%<2DsPSZG@!eFHS&*?@asOA5h zm70)`txtxR#GG7B!Zpz~XB6B{##*j88s4#=3cCZ&L`}jpUw6_4X`X~vAh1raJ6TLd zz&%Fvjq6UXB+X+RR&in`x@*nh# z8%{10<1II$YUhTtUu&{0Gyl2aOf7(RLXW!PlrKoctV(V;ZJC(5xZ$)cL>l88H=Kb? z%)I4>Gp8`65Z54-!lRmyC*W!F4d*HoT!UcA$B4K)Fchp|VP6YFx5ekKC5G?sv(Ta&#gT#tlCb$M!*abDocTy-^gP@%_@iP-#gAm!l1Xlqy zzD3QtyC@W{0&r(CzbFddK_37#DjY0m`rgt14;FG|5XDHzJ^2`7j# zOmNQ=zY*)pgte?Jx?`}lx2Z$s+oM5d1QdrQgQMd$(dFwJ+0)0%{JaknT?8tr5R^Mt!ak|trAlf*10Ce2A=4-=E-Bym`iFwIG#Q5m!x zjzmc!g^5{%B#9-OgyV9OC|edorRfn3+fI_G&IEfTZ0|{;w(X zWkgmvDh-qOvZCC>L`;8JR%B{IrBM~^lod(kQA4GHUjjZPb~C}!z*~#uM3)Mr!C71~ zXv&E!CfH|Udw*EGTv2O+_h8G5cQm0AdmiE{A5}h;#4lPC&Z8=c6`F+pQ%S^CLd&85 zR1!m&3|mRxxl|StGzmSbvZ(h6g)+5MSu|y0O6(CaRg-YuTScT+qfo8J(^pZCilj%0 znEkp(MT#cjNK{=URYy(enbk#d4I*ZiQeAXoVs1@W=NhECm<#1oU3{fAR2SH1))b4F zU|kSd&BW}X)fC-oVq7$nL4U3(W--A%G_0MP;xH2&zqUYJwZ!RK7%KGe+M;}IB;o9| zwy35_S};4UE$Waan3FsvT4@rNd>wI$iD}DqMBHN(muUrcgwQ0c-MSCT8reBeFE1GQ^zL5$Bnh-R8QY(&M-1w63V3Nrr9a*mcDdnxxrgj$KzYW{sJv zKOvrDjhU-IA=;5fmj-%xJ@Jkv;oR>j@f8!3_ot%r{*?Hh>;ygJQ(`TX-(!W|AA4Ht zXFH~sXdsH#)%6w3=NpKbOpMPr5c8QBpKmC#Gzq=8kuYBv8P9Aasyu;~!&N{daZQuZ z!yAc|dZ-C|(MD0_+(^(jVqu@zNDR@TLT_mzMl&(q(nS2q#FSVQk)uhrWxoDsBGzjX zjzmqwVNJrgo)M?>*l8v%Gcj>B6J6?4F7Wm&wy$Pl0Tbgt&BSU=!ZbG%DNkdlu-^bX z4UmMT`kYwD#CY#>qHjZr3)?cTk{33Jg>?9(LdAzO>%Y{#UzwW!^Q z(qr<~TFhr+yrs1m)dV%+cXq8sucj2rj6|))`DZDGnD?LIYIR$Y+>8jOxpXmjB}~lM zB+O|$k<=VD*_N4yw-e8{AYyhn+lf>rrax>amNGGGy>?7Rf_#G)rC}jhXYe6V+cNf^&YnvDr=xY)=H|{NDiSAkH(vIX|W+Se_kBOP{cNTfSP3|o0E*L7jLE1UWpSy_WS`+$n7cp6ru!rm_%D#ejLJ#jM zDl#$N+f~@zP!oD@S0P`cP{w<^is5e{p|JqH_cd{u3Hmd7?;E0N3Ti^{O%cPH81GGq z^4=7&tUHA=-kTy0Gcn$qBCP+B#&~avn8U<)Z%UN+rbKyfifG@1>=^Hb6ly}JrC5V0 z;{2Pa3H>=mH1A2o+?YxUychi$Ju^k@c#AaV94#gAUi4?uoas#(^k?*h6p_-02>LU6 zFXRiptHjvRpV52&C(86EV(ve`DULHie?~iRid6$hgZ_-(`=&U_#H?X^iZO4K2K^ax z+Eb`ONU|-n-`i7k(Im|>9^O;*dWS-xhoe9D4E)*Li0&nF-zAOl@Lo~=+)E@6Mos9? zy?DJ7dT(#>oz{e7LEm6(GWRq4M$P^DiupQJwq<;yuUNu%jQ92xdGApV5XIiZ^n~qV zKva4LhzD3>TFStv^bCwj&%mhk3=~z^j!DnJsPw!Wm7aISg!eIpR6gsI;e9sIES=J9 zz9kaW0`%ebaAgH zIhILJx+p^$J!iu-rwe=N?UsiKrAcUch)B+($q?Q0Xn=fpyPXe24^7C|#Lh zM0L0r#+q-N(Yu8s#HXxT1OzoB#21>-JPK1d5=H?0%ZWEB92F3g!cW9Z9V#crr03H> zW77PoSWB^6U%nfw;~FgvQ(XFe09T42~{O2MikDZBPKNDkTlDLw`&X=O%N7|zTZ~023j6f3p8pvc(ZX^+WRbb)& zENikD#ROj!Kr%%fXM(Q^jGt~Y-+uILriRaj2OthK!;#<0=y8y)(poCOCp*LJDUD>r)&- zvVqJJ^FEM!7ua^NE|!Z5Ot9@>zJ3#}n3#64 zLJVhu?E-ych3Ga}r_es;QJ=X&^dl0qZc9Cu|fQz9-8ju1%tgCZT4N*q%qTS?tfF*(}OT5A%h&*dnHB z5|-FDGw!(E`R&JT;zz9sa}j9b&92CH6Dqz(KH6Q`5s)eHl{(H>{|v~#@GUu!Ol>*L z#h>Eu8I)7w^E*Y-Od@99vQs?B#FWM^QALw<3*V(dU)?1>(kqbK!sn6Et|o9x)84EKn2nuIysBL>XA zJzsmpWG1G>_KDe=WLUpLiD3%&iPcOhd|*iWk7UQx#XfPFiK&bIqW&Dxm{L6;a+#RA zI3Nydl3|&B+5_S&lkIRyj&qv>BH<^pV@m#@P@04#e^6v-LM4C45O_yXe8I$&{2?)y zi7EL*Vht1Qf3T$-65E(y|ATLf9Tu0Fm|dD9Ld?bV(2g07Xh(t(7RO~AzmAF`tTE&A zU!o2Z9G9_F{}QQ8a9pl63&|Hua9qap{4J(w61MIWV&OcDJ@kzeQND2^$~R7kY#l1} zgcIVw`L~zq$*6wgWYBg@D>x;rpD|Qu=d?)FBqw-9{~u9?iFq^sA5m%nm6)lEf5b#4 zSQq#v>OWDI&jj;l^A^Ebu|f3c3so(8|`Iu*!8(NvQ( zI}^wZO$yP-Y<(POE9ipt)OR0SDT|P|D6)}bhzPLqX2NQg8i^zm!6w35$SHuM-*t21Ju82y%>YN7OCSMT^ zi3B6s712VI9LxMB*H!TrY3vekKLLBKtKw}<((DI;U~9T6^1j`7O{7z(px&=X#dTej z%EI)7aorGYHKFeU@E5^uh>6Q}n(fR1^exN{F;$Z^dmRvr{f78~H7ogDh@0YP)@%ZT znwwE6v}6{A3R*#o{EvwZmhpEGVr1>#sKiWvm{0c8Bz&napL}!$YQooO^U3B+um&6d z0Jjn3WF}aHNMhwFCgz>VIC+hUslhneDw`~u8jO?2nP9723wGjUzm=$=7yq!9^UHFp zhz#l;XYF|cNo^+mGRZR&WZatDH3>5B9-}P_Xbp{4(`LiH0(rkC;fwT%GH<;n%7&x~ zUUGJ1787hKE5MEu6_=C^*J64oF3g3L%QVTb)A_!ZlsQa3;rm)rZeWt{ANmy`S8iug z00_R3=*s;}R{Hb>mM4#El4frPg1+I&v#fbrC0NH`4&clGm_!C9TIxq6>UT_GhJ9sA zf_0B3MVY+PI=_BV)0g)%>As0xWc6ibCTXo{ufUfzHA%C_0l~4-mrt^0CTo;z!X%qD zO15J1UMI2>k?omG1cG)V@)aiEz|A6DB^8j}nJff?y-fkxhsocqD9r`sJDR|YH$c!% zLHPk|1~#C$3dxU|%v(rr&J>d4nY10|Soc9`6p~-DomYUA)nuBn!8bxK+dYwY6F5D$YO_E&4q>&+Hr`h5u*vzgKy8)y`hb})aTP!*Zn3BG|P zUqaSp@-)AaT0-{HB*!wNc?mg-HMJViEBYm5qb(Gd;4&;B`!UJo@uH+$tqJwmv2);^ zQYp4#DC)5>_WNZSCfH*W8NQ7)*kj}C)A!5O+mVE`xYAMmSZTRMYp5UF0C7cY%E*0r zG-c!&O=wQC4MLTb19s?q*?sntuRbI{V1gcwebhtpVKt5Jc?$spCo&p5@ zxuQJA8q;G}lK(IVq}YZCUxm1TrAx!gxRBJX6)9`2(aktIo^QyBRP zUM`jOiCAxg|6oh0DpQ!?Xnqf9s>wk+b?jE;iCC*FklJ!K5qokEYVVK91x#iD!F)X? zw`xLjzX}lQae0RAy!a@Mr*$RWG0TZD>%qFx-$gm?|09)HU3nLiCwth|H}AuXk+P&F z>2@n1FM{Q|vK$eeFO2I6Ih;e4Y(pu0Qch+vA6gv#lHika2a`2S>PxkoVy{(FSo;RS zyNG~o0Mhn^W0NSDc=f1fZ*FYxt5-+Bw zrM&MTYQnyywX70F^3Kp&%eq=ay-ho?+&Zd9dS14@MKcOC&&!ESF!qT++Q{~YbWZK* zPOP;9NLx9E$s#5%$Tdth^6U36%8i<&*$04NoxT_~8*C?cQYh;)n7877czY=iQ>p%( zOa9zJrZ6#c><;qrBVmc5j#P+#bE9c4Oc>|`L=vvrJ$y^|b4p{(T)7uHU) z9LJ>jzchX&bIZ*L&H|F2Uv3lYr4w6SW}iYUFE-|3EJ|j@){AV z-!F-}oxUdTIv$n=mg?)W9+O{q)%Ln<#UvT}sJMBksq+_wGHtNCY^zDQ{^}m(^W9~Y zzcCcG3-tN!vL6%U^Z%3Lgtly(KB|W-$i(zfJ)-)kRGCDYppWV)8*7piWA*`h%Au?= zeM?VyhRIXV|6q^ZQ%*g3d%oV1^EAnc$%0>s#`1YfW@{4mEpN#&rzn)^Ti%Mw`&+Wq z>D%-Emh8sFM5UaT3b8w;ZQQwr%?PzH*W#v}=STQC~StlN`(BtG_IJ z2JK{9ruXYFt1&S>WPjOQ6Z-uoeC4vgJgG@&d4RmANseXmK2XZDw_6?lpp^<2? zJW0gv3@?{HI?A#J%TnjG#_q)=O}1w;=D`H3%Y3-aBgZiLipl$OjV9@K?{e^d3B-{u zH)@h*rvbqgYr5RYq2~0W9&(60$eLw9Foi?p3D(5JyD8WoX2^4_DFg&tZic+ZnkoIs z&IdB?Jf=C_o(%-;d>~y-GVF!p;;rlOw){|8l*xneJsFPOL*)b}1)#)mZah>@W-@L9 zts;lYUznr>WQ8V>FCdtnp>iE-8UsN)AIj5AO0wk-O3eFj*^C}R``$w`YYX$+qG8`@+WioR&e7~bf9S*e= z2Z*cl^BT_(%$n+JMdeVpvaq#nG)I~O$L<@KwixdxhLKqkrx*NEKL zpUU|w*__EZDCd8n_nR!=WK!`}iv4RjfQk9Fl&|G*CQ~64mi*UpB9rWvjx_?#q`r|W znOuiAhfp(Bu4huRougN6-^$BOCU6aYFXOIL3JXD+v8SCTr!g5kCf?cwxtJEr=Nq$T zx~zDELftuqW_r`*5>2vWs(@xo1vuH~P}wnG45azS3_0y4hNAsmjB5sXC;nx}Cw~o} z>Ox#0S$)y5u6+t;{ek9F_!ULGtub4!W;@u27y8+#v&Zd_DNJ*) zyg zpiriEvgA5V=$7C_$oq16(nSs35^N3kjenD^JR*3Og#CQB{6drPoM@%|Rg(-uPiMo%IwZy}iX9OH+UN%QI;Unb3KWwH(x=JfZdvGNb;C>>W& zhU;ZRO=$MD0dl%t&SH(3i{{F|h}h@;q+T>vo@KIOJ@x##@;@fEw-^!=(Q(-u*ThHxo^6vn%w)@5)JtrVH40F^&OuLt?uG@?9nyVNAht-YTas$$(rCS#gUU{EgJDa_21?Y&+ZK-%QXlYIew&f)qPi zM$JxHh)HZgTc>B2?4b#jGir9reoU|jK(a>;EQEGwW`*h5E3@t(f_qjtg6x%6Q5~1v z>fSi3!~!I?CTaGoKuT+pcMpG`j8G_DsyJ5emv=ESBgg?+itGfdqyzGE(gd}0AXr+YkWY{B{Io7v8j>|QqvA+Z|Qq^OxL2p{!w-6Rf$Q z`CIN{(*I^YJ;OgC4>Q5h;aAX{l+8<0dhmCt_5%4w&S5ee;zDv(7Kh&(Fna|^&dENS zWCUk+7vu~gcBy$Zm$)G3GkF9Emf;1NR!YZZ|HXSU7v*pwLG4_WtBF_};WxR^e=f;# zr74B@OGD^Cmt+ejrrs~f_Dt%g(Jt{NIZKmpMRrLJDx>Y_xE@}JcD~gl$Ex{)V^s%o zMXqA2PbRp7EP!> zOo33bZmS0|R2Y}-W->8xx$bUF!ni!Q75v5zjs+$z<)&yt_Y=@Jl$*;0M@AyO%3-K9 z3rEHm-a*Z3CO9%;3L}s=NEP?k6KldL43nIg>epkf`H<#90XcLn*7^lV;eZ^4Uxio= zq-d0#I|B{c!BV|DAZTX;km3PBJNto@c9R~)G-uewVHXr@xr|#%6L`N42>MSM_hHtw zs!RJVW!$yB1#iJLS9VXb<|6!F z0Isqhae1yDW9q$%JFyDd3Fl)~-Ck9ZWXBkh3fqIM+f_!%eJ?ns861rki&MucljAYiOqeL)CO2WP<%Xl3H#(CKx+Vh1&kMQI*)+vm|d?*63-wVn0J@CBcHUX!rx)OAzfSFEsInDTkbZCH!)j&n#% zVFP!XCSgt+M#bLH{qvPruoLDqBqpbg-1*uLrDra9LSt9e#<;@tJnL>@V(PS|ds&k( zg{|EAkA*43R{6Y3JGa!9v9D|6+K-b4+cM^&joV5SiXD5cw(d`wz?(DNN40ZvH3{Qt z?|xV(j0^p+V^mz7+^MWFadmRfXhL!AfSe|~d3(s0U8^oy4&!>&9j!^&`@QCF)+DUK z*WI`$FjQD#Z@4ow3GJl13pJro_$w7X-Q^t0jMTl{lT2{5ItMB2wFc63%k_xob2DWAEqgWQ~byfP0dOiEE%+|7naX-NLwv zL0kjfUJZy~T=-kq@3;>%L_(HpfM&4UMU(KR)BEl^CdTsn?(oKx3-sq?2=%_3)RYLW ziBf^2y91eE4Wj>KxJQ|oHBp9po{6~`o8g{(CQJ{ObB0^=StMb4hPs29nDh*F>oyD1 zgK-TF;xcQrq3$f!nDh*ds?(va`KrZ~>M(a|bBf)>HQfEPMVP{IkkjGrNlkJr6Y68P z{&N(n2EV-Yi93;rvGa+W)soVTwbS(#==I!%a8_sPVg*?K)IEL+!TK8O-U+ALMuXlm z-fc|8{#?`z~va9x<8^m|Oyat#X1piijSGur5C1 zb{g)Je4)omsGWF|_mG&JPI8x!9c$7#x_dCmUCG2gN^yPZu4l6Secl6cw=*dW`{9_L z$wBO~P|qUP#vD zCGj|iYyfrwP5g3r4GBGby0H`gE8Hc%oy=sfo9-TMk15QsN*qqmH!Y_Jd4FyP?U~OA z?7Ve}?1bb9?3k@jhW!@zhPIOvQxVP?dk?X!nSq@`Y=M5TFw`}oTgyGio`w>1-!=7sK1CMM09?iMB{ z&6#dom)p~v8I|Ttx1iR9Y0h+$hy-cQbiZd}VqfIuGBL3)c9UMAG@E=ac3X8NV(MbC zo65wbaIw4N)!S3J*u6-^era`rH5zJpv3o<4G`k0oFEq*PEx))4-E>?*$^YUOA`;}{ z7xyJ5#(S5zDNIb7mqyja(x|#v>K1*C@?}b6nVZVQl*X^_B26-^J9F~s9jag5Y}S~( zXSwHJM?2KFV2jIgtv85Z--152-0i7J=yl88G}d6xwh~HXc~qVL=8n;tuugw-rxFQD z<2QF&3gyD&eMMB>SGad|CynvL6>b$KChys9q5qM_Ajg-Qt#FV)j6`y8W1# zIlxwTBoi~@Z*wOysmUY$c6SDoU#ik*wZqNQB=m$GuINqaF{Akow+s~j^|okGjT z&VIL|CNxV)fs)_vrZd6TjVDJ3+&!9v>%l`&>%l|rUs^-!!6uF1I}Z1XCK>i7_LjqL zK3K^^Ph#)oHU42&Xp&*~fs+yRs3UGc)}#YLuRG%A-LE_9CQ&GBCU`II=^b-lW@3Ef zxI36hEjZgk4?pgXVe2Y_~Kuk}Dh38+3fShoL4kBWF9Oz|JYRG!t{*@044G$(~gBT3KtJU}C;~JLNu0MEk~Ot?6(J z*$L!yRO>zykfrR0Au%Zoh})t(?7hQYN=UjhIcw~=dz&X(37z2^4MXC`CL~%N;1+I3 zJ_UlM8WQuG`oC_kThe?1()_O*_b!%CIL|!q7S$yDTKT+Ne=ut3{0mcf-pzfF2(Cfu zErDH7x8nOq(kxsdu1|(9JKSSTaIJ@5dtGu1rBhrc@Bg`#HKCS*>G{vC%^K6UA>Q*0umNTp~;B`1RzTr01B+S(C(cO%@J&(yt6=|ft+q*-PH2X~;*k|7D6=Tg#J_kwi$}xEh`raK7SCUtQ z$un)ppOd^N*iJGK?CX-e#;nPOyzhlj_ju2-<^YhxnzUn$$KNvC>vd*LN&c4MUN40- zx=zu5ig|@b>wE<#eZ{?0CRuPp0PDTDm&Ih{##rkL#8uqO9ZR9Gf5x1a^rns@(hyD} zFw}kC!{doe;xnoHyt+*GK+DB^-RGq;`2k7;LzVIdGr=*1$nO)#4vr2)&M+~%)}_3B zpOFT4w$(DUQ<%vN&P8djIFqfs7B20jeomqA4g*>)?Y+;WK*x0{K%Gf>{EKZ!JEKdQVp zh6(ORVO-_Cu@DmM+%bhAF}Dc7&gfXQ6Zl32FPkl6 zkA$;=ir$ZtDRw;RLpv3{bxcgZTG6|zNk(w1v!WL}MW-;h)mhOiNhFA?l2?t0H6Kpa zj=;WgWv>MjGnaV88_vYc3Lfzae@%IRU_70gJ>nH-(i!eL;vL{eyzxx#zDc`SRlTn? z3Fn7Zy>(1XE~;`L6_#q%s9wFQH~brnoqBb=4_VdAWrB9_4sbQE%2b^~om2l;IOFhI zeM@OJxv1e)`99QOtE}O*B4T}eBT<(|O|RQ61aJJ-^3E|adpGGn5n?-JMcO3%PhR6gV2%iqVm3QRCx=!cJcwV9yLV|wa%!-|wldufyMwMY*?+|GMPpIqVn@MTz+>vesJ>eB)GMevxKjB?w^5!Rr)<`JTC%k^M zDAZW^ZFlt5C%rG3-0Vkto=EeNK)1y1p8Ebq>X4 z>Z`H$z)xW=uy&ewl{5)UzG+mNn|ke8bK=3Wa;!Zf$=Qi<53O2YjynA^1QrZJhuw^ z3)pL=+1G!xtgNwc=il2;n!ux4dKKqWdQ9Ka%B#4L$lj&!8|YbZ!{1A1VshHno5myq zG*~-ry_8G}HBi{v=i7QyHKCS*z19ofMJCu%ki6*KyNE)WnM}JVA8Y58)|zmB*v{)p zq3k0zef`nS8%rd}S37SDTQ>P>@0DFlahY6n@TxE|bv_F6)G5B>`m$$3J>kj) z$0j^Ue>t#YO1`sKU28JznQ%MwBe2uiOJ%a0Nf+;1B0)L7;>{+a_esV>sIK0QTgZGM zuY2{EQK@1ImjmhUP0=Jglj`ARX+mXq5A2Zl@REPUP&vUZlvM8>O)~6rF!#e>k4p72 zG)c4b!M&!nU^z7^g>QNvvmH}DJ-r1?Od0m_wvc73@($`DdwJEf!aBuT?&VF=Buq~) z?-xxn?3(cP;(my|m$!mK*)4$ltx4XQLvL>#hx)q%-2v|7ZQ)Q>N4hQ6$J;|1>k+u^ zgLe9Q=WZbvfb{bcms1MOd}DxDMU$|X7~s`r4Ys(>o#7Xvy3V|YE{9XjfV|1%UGHNZD#uEmku$YW=eXZ?m{m|=f(Cf4cznoqpyOul6D zsn?xJ5y$t*qA*OpfR)y^g z--Vd&m05!%+|8ICHCj#gs%Q<3R`|Z(^r*OIcMkGk#JTHsMYzT$zVxBi=9i@4E zCfrwt^vv^?+(Ph{@_aAu57JEKP(OQvG@)GJ+Yvu|qex@l*(txZ0aCcYTg{{_lZD=O z3T0n{5c@%s=@nY9EeC1N^r{dE(!9v~kx9cVw7;>)JIut)B^G(rH&6=iI87eD$ZM60 zgi`q63d>sLjnX8;a-nyB49H^dFl(^nTL4++HP}d@a5eEFkYBymn3&Z>miH|aTtTBI z%Uj0;SJ1ehu-rSjiR|DC8a2Opahr+Y3L5YHukflf!4))Wvc0%1q`?~|zW`b3&1W(g z{(&i6tzhJ+KbzUp~8`9O_V>c@lv!VoY$@K#%#w>?^~F6tik9|YrW&FF{9pE zZ@>;6mp!Z^y^XNedry-z`*R>T=U*E&!~fm;h(ZN*y3Sikq4XRHy>6Yio(ZN0_wfJl zwsR=c3f4ziUhft9lk#r*!wuf|OxAGUm8v>@G6D{{Ac1>&Rpf5d1D6*L#)8aJcz^^VN-B4<=K9 zU>R=o`Y~x%oa}7!K4a1q2-?}?O=Z%pccOJD8*aIKvAd~uL_ga)sfo}e&At=JIZX<& z=2|bhbGyY$Vv_iZZCwS;7OxbCx(7(iN+b`n=EvF;YO7b3HA{hDFR|5ooQM?*H&L++ zw|UJel%B8l06W{f!~1S8`R(4A{koj3o4w$RG0<%HGBu&uDcafLRX;$XuvOxWdWYBW zAQ5bpTOrh+o^^-_w#v&soPT+xG|8~`Jxl$@9|lcJy=o3>N*u-%W>~}COSBpQ+3!_i(v!(S zuf8U9-?$@a4txDrGvdWW>op)pypv2yL!Ex2N%E2W+VZP^)9%Vq?<5oRYkEh$)T5}O zy|}Z3;LOjx=({;?dz+~+~>YtB!>Tj*lJwJsSsY%%4jzzV&W8UXlLoM#URhYuBnPAJU2;{i; zBNOx%y!rW;x0nff%jk}9pFbezEl5syziADP@7TUh^3L0Vn1`3p{_`nsi`LLvOxSWy zd8bccE)FD4uIgAj!4pn-k1vQp60>(5)kUcJrJB)P)S<$-PDRCa+Otn;%Q5(-6UKGg zD|zbnxK2mK6>3aery))Fm*bj~$J5?}+D?XUm00qpy~<1~ZOo_7l1_VFm>elix%kKX zn8{?G^WI(}_Fu2k%R=Y96SrvG)o`ll z75|sgyi^IRsST$In>@Zv6#ojVuCTTg=KhF6DG~qZH<6qXAu;d}sC5%1%3Ms~4rAav7i19ZN zv0r4&_oouEc4frsQ`ZE)%2kT16O8Nbm6yQ(~_|i&%TF$V3g}5+O8UI}-Q-BPc04GQOC?=TZ6JX~dKbOfSi0dYh z3ciXVJBPt?ahRc2_OmsiI(-;ORX^{kbans9d>D#)bu8!V{_~oIV?m9mP&Iryy$$EI z|CgqVwnIHF_H{MZ(*W!FOVnvIZOtXr}bcczj^{`cEVR| z-$PvW{VXO|6KQuB2>fOP*3O*5Lce+bl)oBwW09o88DfJE;4Hw;O+-TFJQm_==(vFzqlZ>pGgzHEfH&2fq1LfAMhrRpUnhEhgv{d_=ThnrPI>{ zNNc|xk)Xud_?S1%D-L z8r-0h*%$mhOfFvk|A&I&y6wBI7knc0-PZW&@M|&w!SAh7AcdU*g5O&W2J(u3lH#&= zj*GKS0qN?WXVRsuur6qFjmg|mFvr#;&ZUxfp;Ylrp00jvCP_?Q^?NbtQz~9-y7{x1 z3}y0~f0)U8@GcSBdEHO)$nt0=Z}_d4G=w+himr#>8S#fRd67wXKbuMGy0QATsQ>xb zm~>^*!>{C%Hz8Gf5qfIhzoD>^zy&wP?Le+ioTaWhc#Cq&8X?^XR_wbX|Y<<+h5L_ zGfNY!r@(R_e+`p|FCBE)lgWe2;C&LUIl$yfIa+P?@&96SwmGe3 z`uJxxNwX7L&>fFH{uS2j`Zd8yhaS7HpAX)z`tBXA1e)Ce6`DXubTNpTy)v z4)wm@kIAG4v9K_Q^BAAL7Ni~$$I}cy-yLM9=j#cU1DX$f#pHu~gcSiY)W4U>qI0(X zQs6_s9FsBw96fUw=2t92cD4?WwH|~}ANiA+oCQ)J$Vk6=QPT7W%h+Ro;upP>NE(p! z$*|Y$AHIvoJZP04L#Q!+^}C65hTaBujmG)2nEdf!td$9x@qU*i()4^U-dY3X3x5R@ zQ87W!MZfZQFsTA35jZ=Y>^Fqh*l`4zl|R-hJO*}&{kBXx!^nu5uYFmJH19(#Uj)nF z_)VEqNT5(t{Vq&!R*9j$^`|m1Gtck*IZVtL_nn_qoGhDh@H>AtlX8&4GT^=6`A3*c zgnkSyPxDm?3U!gaWx79@$!2Jk__oFje-x7^pyle7`N zZ}1%;^ZW_-6T!WLPk}7-tp|wUUcqy)HecjdXM%f!KY?bkKaC0Q4I)|M$Cjp0xLRKV zWSM_I6SG?X&9B7-SL@gYfAdqBnAQ3Uzdn39gE_@_(a{rD`16^VchR%`!%Xm9bj*9U zzXQJi!BF@v`kIYMW<5j%f3M^?kX3%6azya=O77VNdyIZBO){)!Rigf_mNkARYw#CL zF!n$E-~Y6WLVF`U92~Obq<0#n0iqh=$2i>AUJA3_6nq=6g z<~mj*$k#r9f+lJ94IsF(+viUujUEfefo8v-QkiO}aDM7n5Bj5-tbyNVTAvJe$o*-W zP#^v)ggWdOe*{BOJ4MY=zk?>>y!TjCnveN!Y7Nai$ECqOl0S?>1vA*={%5xk+)+I4 z&$)#hfY|@?3s<2u*WkB#&-hh{XgfG>IpYu4WSsRz@fa&{3%mm1uV$h$@>!*UT=XyB zqUjIhvOnulv^>tL)!MO+R)ST(f0D_EZzfu!K@+3Cs*ajZ^xo-YAn_`j$uZasn+7CN z#nm89Jk&C3q^i&4FnH!mFq2U#i%8K?jclt?1Xir7LrtA8`<_O$Q(8d1!o=(&6;R!o zBo3yVx&>5kCg;DWyQu}#ASPLS7qoyHLPVF(>);6mR5lUVtE1oTDy&Z3qQN@7L&eq7 z=?P8{il}l-9)FEyL`76>CTA0A22wxDoE`vc0!Z_HsyCCXKrlV`sdv~;gVuE7Q%Ys9=6N8PuTtt`)|fZ6?^olQ z9EJPX7}x!3GLw$5GmZ1-2h=nsZv#Qi18Or9^MZG2wTnqH*tbJXY2`ky%URdgdMNoa zsu~e%LuWeEd{8xIg70Hvul1mctwZ&`_{V(KeV@YKg}R4{c`>`3s?5Z^nEkM-&&0f# z{jhq6Nj#snKdgolu^)nViuo$9O4SWhcmh&bUVTo)s!^Ievy$4u#Q16@RqP2$q4By( zs=OxTy_djFCDnzAIi;$sKB7>%G;V;VvYMqy_^Nglb(}QTBDm3t@2XW%h3a8kWV!5C z*ppG~n3#RqYKp#f4R=nesl59()l}+}VNNT7ooZ^VCPx$N!%o%r5JyclnMjO#I>EZ5 z2a+>P>RwOOq?UTTerN|r{MsrTR_3^`zB59tskU0j#4SLrskUlyODKGK=`q!vi1quO z)N<>nfkf;SZp(F4x+ZCMe<0|+b<~Jk>|pDztERA>^*_<>!4ql$6Z1{P6Y4yZA7F;x z1oHlb`tm8A3#&*=^22&+jwV#jlVSE=Po+GKns8QGPkqhA%qr`tY$oO$t)AM;Wc|mq zzfn&WY(RFN0gu8GtEb8_!I2u@#HgoU&?KzECshw3w!Jvfx&~=}QuU=!_T518Z9_8n zmQc9bs;?#zv5xkQwa~|&QgIC_r!V!7wR{NGKviK+q}la=Q~*1T)KS)$ai?)WE?lQ?(i^LDta+|d zqBR`sgqnPT<|=Cjz#V(+>l!Os4<1cCBGdTh~$vDq^Mh#~2h;Qq++@DoLnT&-uaJ~i2vucMX8CEe~ zMK)7K8&j#8v8lOA)`Z6QkDxbht_G6E{ub_3%!Tr4q2@FBg~@a3B$EN(Bv}7|rll&? zL|e8;GijyTGkF3|flQ8i@Ei!kTM^t4m0nT*(DNCyrz5eSBAr@FGH z3+$745LbKkKPEe2SGJHQeVFttPH(5TSMRW$4}jq4*>bp9tZ}x{uU&LhG0#wm6#;^MR7aJ>Xqs#+K4qMVgUj z1>A_n9;u6Zh)LCz)N6H7t(c?^i`BKcV7t4VuYxSA#X7 z9vf@$e<}{{Jl)!3_fW-|m>#=_!rNV_F=vrI)MOX~klvy>jHt|pWoER9t46NfTqTd8UplhtrawE}XQs&Xily$1-M-K44wqzNp) zsp48wddkCY^BM@%Q)Mx^(c7^Keg=DI zZ79@_1t?Ts<+r^(@BO0Y68%(BtqIS7qBZ?hnLL{Qsv23gKly|_e1LkEN!xkUM-5P~ zG0B0`H>`^RY6z3bpe8X{T$yex3{bO}I7P_k2dMd)q}lfZL9ZL2mXanIFWy$> zq{g(1fdQETmT?zrkUCGHtXkLTT<;xq#|u;MBnO*;5J{^huf zHpN8B*PwGpUP*5D#qj+AZTZZDx(SAu}=d#8LF8kIWfia z#p|87p(d{QU2v*6J{j%+1>}2pUleQ1d6bH4&$V2I&i+QJftrM`C%qKZSTczfTJ*r%q%EK_2issmb+VXb(H#^uq*vSmtsG|!00>#*d< zs52BQ_??M{|X!mlBxW7Gp3Z;yR~>cYg7;RF*`kc)r>u}@I%noxY-<}>xVCNzV^ zdjBjcU!QZD!}9q;O=UaAH@;9=OicMqH0cRqpQuW7(zT=WwE*%pDa!I!QL%ren(I(G zmWgY!n#RP$H6<#pDM}`jCv@GE-|BoX?6j-%no!B(I(MpS4)p{r#%_6*ehKAUHI&KA zOukb~nf&&UZEb)we{bRn%K3Y>k~BJB+qH(jdJcSJMpTK-RC{%((4%Il3rtL%&N6WY zWjISkUM5d4W84p_t|nB2xbFTzHM@miPG_r*M6CAk5*^N;e^f)6bcNjmTvN|c+iwYV z8FDd4oxg=(ea(%kuldU9OzAN#WxguO#M~GCS#@DzTEWliBokAE3smtgWXH6o1*$p| zQ|}AaC`~e~&X8vOUM5pbV`9E@$yClOXoqSUd#y}WoQYY{FH*fU$qBy1Srj!^E>b78 zhQ>t4jo;KM3KgXJH+4Z1 zN^>0u^_xn1jVzmT&QZHxzdf#1QRTBrUD6sVAKd?0rNkQ;D%|H^9TjS|Dxx(MDh*;^ zt%_-q6QppBDy<2n5WQ}Vs!N)nRDV~`reItdc7K=N%~+?N*CgE@2INiX$JVJ%todqO zKI_RbaO$C6Wz7#j8fgMX;4jBDb-F&v!`G`+3KfhO>s6X2Il<_#K}}?0>NGd1AImju zImXoTM%BK%F6WqoAJO=}(P)D9zLCdD`qB-*Bip3DrBH$QZdThh$*`ZfCqdWyX0?yW z=aS}Ho7FK*((E6Aphs<1XIPU8H;ZOMU2IX8nS2D~Cr$E>j9XRQ|8&Xg(#QnORy9GB zurzkvmJ6H%>{jO~l=Tq&vKY3VJ?a{VGG4bwP3@sATQwmUI5O^4|1o)icboUBQmMMc zf>C&{>chnJ8++9lO){*;aMuXmQQW6KdXqw#es%wCDa0Akel=ffGOSNe(VXOfvU_5v zaHKw<)-f?X$pKaVEz+2E$^q4$39eJHoDZlmOmLlo^Phw2JQF;V!k1^`L4&?LjE`54WA4yk@bbnRg8cSucQ&49^?*5C?onxob+ zxw(q&C>~Mg`-C~gxQ?hQeUW6?F&$_=e?-;RB+V`i1m}K7)Kjeaw-wD-kE&-_laGIM z^Qd~BHTWhj=Ifa1$Qp~+gU8gXta(4%wu_+)s(_Z>J*d7)9CxbODg|B(wKY8m(+bsMz5m%jZ3OMli2&{&eA0{g~=aq z2N=EgvYN%@_*)d$Wp!PX46Ewm|%O~SQ&00tL(v~!S;^7JaR)dPa}fu{Q)?O zys5UnPXzBL^oM%S7rD*^?}-ABh`+ab?(J&5hqkeI{=PWG0hi9cZs0e`Gn4 zphwCd*-gaC{)5(@2@yF|TeeO=NA;BunZx8}pjmwj@poAkXg;D)4K|SfBt~8sN#yPI zh74y?KhP}Jglc&L*h!2WXJUGFC!#(^J9HoW1ZbQ{E)%TfD@`m*M9O?Z8q=%0k&{fY zmiz36_mLvWpOOY^c_t7)Qff4kaE=s-Jf}&Th4qf#h(#iK&wvU1{Ee<46e>7dFA+J<#PpCQBBRD@%lZXNv{N!t{WBt_=f5vf;Bz9T zS1-k_JHs-)`u&k4)?9>LVodV`k!&VryeJ)nGJS99NWU-0vg!FtN79%Kf?sDtJ7prX zn6!jDz?j0ak*%79eddD^H4*JlpNXL!jJ%~ucvs}1$T%YQ@Y-}v{ZQmf3T2N4g8kS- zk?&daApZ_;xyX;Ksm8y*=ANy zA<~33W>!!!(vmf1R!}k0UXyTEP$|-nLIrbx%8{W=%qshl$p607vB#JZ_L0bFCT8q@ zB(j8w8M_||Mh7!?R|$w2J*!6SugJ3T)vA#@m>B=57AeKV_*k{b;>i@s%t@+6HZw8a zTP<>ciSgb?BWIYHIZ5?MrzvE|cxH_tg=P*=GazOTP%9v2E)fzlm#7s<)s{o=trgkE z1bZa(@LG|>Ot7y*f36)l&%~TWJQf-JHKveGB5*W+EYj~AA~+T-gKys+k4#{KV*&0* zJsHWGN*Xi6e=0KfTOv5(qh~%9*{w-9c0V0y_?^}ScZr{lbkQUn&7Y2>uqHDr!D<8k z{B)!@YjWo%SRH{hhzw%QVIW;J$zVa=ESFCvm z2$oo*$TZfNcF{O8hc%;Nj*XhekwvVjz_acqk>#v;f;CMdYgseN zG_s2|eH@x^JQF#@noohC=9$Pz*1W))XCvpCylp2~Z$RFkjTHSJOEtr8KAq+y&qj)C zl4f@Xf_9#blx0nyNp#1)S)>wcJ_Lfk(JWGvH7gTo4ck0Yk2TwYpq=KCCaih+k3{P& zh`mLmC2M*E>90w9CT6|!T%;d`3g%JIMP?DP3c{N_IA3iUiJz`>VI6?^JQ2mjeE-!l z(u+ye+LXeUkv20Z)P?P|ifkF_#-z>bv}$V^>Br>nx8RozA%!g?Lz$cu6j!UrBqsGC zrx<&y$Py;4*iNfRrI{30HlCz|omP?BOs=w>=Oe!{dF>%8vF9VdYeMZ5S5j>vJD6ZQ zC31ubwo@YiGQoCA2_o_6TC}| z?X<)HW9&TRqo}?gap~j-_ZyQY-wGo3e&de5VoY$qF+PiqKJRMM;C|zj~Wn- z?B27x#-X%ENR}@A$ z(07Y(cSVVzU^UuTj)`%|t8NGx>w-b2k~sqQr})CY6J_K zZ+!{BpvIm3Ef0I9%YF5fhI$ap)#bkT$;w-NTa*|BewO>jC<5Qt12SHbiA?TRg*^p8 z(tV5As>pm=wNCeKWm3fzUX+(K=uLeW-C~N$Y%fm|z*hy0gxg_#0`kj2Wkp?E0Mu zma#5C*8BDzB!XqEFOZ*n<{=_j#zq0z?Ayfz%h-M(nZBfBq`@+F9>`AL1twU=qE15$ ze7pW64UV-mAiw%9Gr_S|0+4;a5+_jOmcv87L`6~rj=nGzhkWA|aclP>U#rt-<<{;) zz9c4iX9(u=Vc#=np41%nJ*NoO+?5deAHIg!2wENUy_JoqyL5bMM7%{mr8CZd`o2^o z#akB0HSqJNZy{^ed`6n%zU8dR0D_w1zO}5mKaft6p73pAO&-{FhUM^tZwG542Gi-+ zlfHed$qxkY8anAa!kX1_G*dX`JI$J{K(Mzu<-5e11r4LrDeTj}>#SJ;HHQYqM#v zv|REf{pI@EtTb~kxdb(reY>)e?V!2ri@WS<_5!);n@mJ}0JoYP0rIae{cl$z&ce#9 zPrIUsqq*T5#>5^~-t=uJ;-u@Auh~DYpUU9pmQP+qlH#5AD$JgNJoZ_NqR*a;O^1|Z@-N(vL{^DJ)Dvv2 zp3Yt(0`CFt3dAE5ZYV$E2)tQK1`;8?H;KG;m)1!lWzM%1k+PT4xV?F#9HmH__rnDd zVl4QHlrz~6*0295^1n+SC@s`xVtI~~^T9HJ#VM59%z*td<=kt}&a5$f^FDXRyhaq>AN`+Jp@ zw|6G&e}<EkTnCgcvYM5jQo@}V}aBI%`ysknTUwm;}x%6K+QxSSz*0M22xJ`LBz4D5LUbYi(FP# zRNqH}p9)fw%CqCAq8zGGSoW-~qMS@5n+CrYhN*BhSBYfPd}rj;{1Zk@GiT_+%1O*n zPCo;QWD6^@Ku(SQyxbU0Crvi1Rt0m0H6$*lpF2ddSsgEuQxhK64bo(@nqM?$SkITt z=_ip$HmiB@IW=pEWYc6MFlDWm+3vj|wF3mQS3Cytf-F{= ztcrJ_vFHo38xc`|Z=?uaL`|zQN~3N=`WdXM$nd3K7CP6BifTq5@ zz~rrIG2#HsbL-1yaMA$FYT>CdVzAPrGqF#|)|cK299C_()kJAp5pnXlz8ss4VCePb zeA^0Qh@_Fc$|UN$7%>g{uck7tB6)5d$RmpU1@AayB9mO8*)vD?a8RfyQ*%yzN^lNuY~e!oj_)=W-j z(jLAEm z&g5-)H-W8s7rCFw3>YsEiGPv&;L7a?@Z3el*C5hkD4fIr@|GOJWDV?a!!xt*$n{K) z{v9b^m;q<0WMoaWa$EHtGFcIKe%eFE)l#0Fr_)0YQp8kLOA$+8%es}7;oCQU3U6v>)etijvQHbc6Sxo=7nym?N5$a6#{tGljMB339RSv_g`pL7b zxqKx?JbM{dcV&+{Px=`k#}o0s^d8hE2xEYptVoJC2?)-P2guJ^6Za2k2FkgtDFp;I z1LacEI8SGg%v)E5B}$B-6`?`08Iu-JT3SMU2Ftxfypv%5Gtxq{y>OaK8LASf$9?4bXFjrxBbsO@rDrMs{M-8%`Y}87s#sa>`Qy z;*4j~$H`qx1fs?-{ypA=!Au>L^SP{bX#d?0h4QvX2aJf;4D?3~RCpU!wLtM0wB z6XZapaqpF#AbZ0q7>urCUMfd@(*&9GUfBt9Fl+3)UMI-0iqOrjFaHfIw{lYxN(HXL z?n#1kQu0?OYJCjIL@An*2G_?he?F336>;nP$8r-9r$l`$FDjBD?0o)M-eY3t^CX$K znHzdC#AmYXzyw1d3FH$gn!BMl`~Ysjk|q=T{mwLbSP?hpr^$z5nrB;}pX{1)in!%) znygA1@%0E=ZF9}tO)f5#ufP5h3xw3lj-^*tcCnSZc-W= zb$9CzYxrTQm@VmB*s!X0lJ;56mQS@&p1m(^q|j%}0Fz5U(5m%pS(J#AKeJ_BCJnd1 z*Djz0%y#A}XAaO=>DjUYYdV8xY}Mz;c0`==JVz#nkx^`gZOb@F`y4s&HH;zU#-1cN zw-b+0@=;hyhuIc z0%^7%h+f*@MYN@QmbZIgW@E`a(I6h<6=)I|ggqLYdCwXCOHG zS{PP-7RimQvCqCOl9`I6cy~VU6}up;Me z_EjWR^nrQCQDt?C36_NBP@b2_d>tt5_FK-SvNDsVU(#-$r80@hMU#4~rE+XXvN{Lr zE?5qi%9BYHI=0UR|3MPpi3qlks97#&F~Rnk$XO=#F0bV>e`m6?OTzN799u5I8T{Ov zz+Gb3IG5Np&LL6X!@L>KQn|#gU+K2zD7y}>kVjN}QoSwq(+vhIk8%&}; zgp>84Su2NjC#x8p?vVUZ&SSC?PWR$7T_-m(S;jYwtdqMGq1Fb!5WQY%$&^yNY^<00 zdlSL3fis}>vO^ytcG=h{H!-o_cW;!V`jW=(VK>T2OziTrQO;+A@4qmH8)bYyvcmUY zL?$WX_PHD79M-s=8}&!4?3&jVp>(}^6+QPRjd$Ekuew3^Cpnlj-ZUWi=IAFmiV428 z#?rD$9wsYM{9StUxJj-apu!S`9MWtckuUgO&`q)nldoZy1(w6jvOkl&@HPg?7CD*8 zgO8{u+A7nt5j>N%Ro-WEk8erMklsNQR>cH*=aL}@GU)}OFN9pkkXMK z=Fsev`QBBb3p@1PVOG0kA*D$b_NaTeY^8|XJM5NMNaM8XyPY-x+e}=&+|4Z#-3EZ= zXOHv@!O&B@TgJdCfon+O6oGRbiy}o(kp@ik)sZ4zks(aZfCl@EJ#riq?_!&L!lVmW zk!CiNW|{O%_sFG+xHsSKkv}jg2rCfyCSs4wWHJ%z7m?qYl&NNulZvEz%g&%THGAX* z(x`nhlv49O%4a(__Q8E#Lo89h%CbXMZio_m3Tdxw^ga=+?;RlRd*ygVQpFM2 z?SoePWY=M&v3rN#qe%EFgAu7B=an2#j}eY-6_@ z`(=lbWL2_i9+md}vMZD3@D*wFvtN!^gmxEWO83jlOzd`JzpONh{KTJ*6cIyF(@GKg zx;j3cgEAwV25-qYCQwk4xs^$~6u4&za^tW(qKG?3`$IlpVz)nk$VH=- zAE#vgAq$Oh3C_s=kS{9Y&d83)flTbLZyb@yW6_H0Ag1()OjYDm%+`vr>iZ5y!sckM z#-5`ck(0^F)2fzN6#5taoM0kr!wn%Y+BqW6E0QV>oXRaqmqU{CP1Z4~jdN3h@i`{x zJZy%yKAf||Ts_7uNrt!d4x4mWRvBVWu~<`uz%ilmD1Rini7;Q6G?B0pkJwJ1>)$SGOmgC}$TH0Mv6nCFQW^MbIiKqe^-tv)pa zt21&wS&0rA(V`QOvr>##eiRuB!?5-+(`mRhZbL$_KKkBJSwofqW$!`2bq}2lB&g zq)j8(FA)}&$Dgy+^7z-2mG{RpUQq%@avuK$Mbf-IVLbIEvRd5twu{yI#GLJVg@40HP%+g3nkEAkSPe?B2iw7)HrT&#)qCn@5#nclD*^ZKVK z4Lz?l;Mwc{T#;1o&s*q=Au;~BL{uNws2}VZ@UKvWzitdxdHlaCk`;6KR)jbVB%l8% zlO2tzp62tPAuI18AXuLB`7blsmI||Qcm_}TuQOQ(?`??OW0E=y-X6rECi)|MUUV-6 z`gzK4GQl$TH-!GQf0!b4jQNrIw`5EIqS{%kRkkWX6 zMjflN(xwL{aE$UP!z)Ex(; zfC6^NKTFt)qzy``4>DQ%T5u4^Arii+qKtAc7~^JNlCp zanBeg`F~I(&ATijj~EPAN&X#7M%{{0t$LDw7n8R(!kRGDizNT=Oa=qN5n7V}D3f!r z4Hq??{HK}R0D_uM{=XFY)LSSXz6}Clb@tyTji?PfKR;3=XCK$aFXmw?+_KTd|B51R zneXE7rbw2@&W$eq!-`O8IRT!#g_Vt-{<8DwDcjGzr+@uIB6iv6>EFe~)+GBcFMd*! z?0=w$8^d1y4&SIat2%h=K72LaKS~jbkN*L@KlL|SLK@un^)isY{!vSjz|0rQeD^qb z^XT8CNQ$=+kUok$V9nIhUhxfB4f0p~maG;s8SL+_NQ%nm??Lmfzpo-=RExAhkx$ub zz|+)Qz3-pNO**I&%*>SOl@D%-ZmLr)WaIac*ARqZ# zD?&5hc0eZii=~ql_B&qyndv{q1pA%8fh_W$T|pY`cS=2il|cW*l}J)W!pdA?GLTLF zIA~Llbc>D^hk@+$k5YtgR0uwXd9Hup8q}nTvc03kJ3!9*mnxDf?)Kze!Ttw|P;d1O zXtMkhf1uEDS9vZ0aq=hqNCXP6r~>4QKWROYJv(710+1X2ONwN9aM$8gc*-~ZH<*+v z7%hf^=4M!_yX6-f&<~Yf>>X}}X>R*tl*aA#Zu{ezU|V+_p2eLot2_Qt*{pC(`(K*; z8!>d(^Bw;{McfwhuHU-}HEzFrH!Q4sep6{&Kll7&*~+dd_x<%Up7e7+%+CXVYo#GS zn63x^p^4n)#u?M~Uz%tBADW8UG+R9$@H0*kx8^aP7#CVpCZ>W~0NlSJv;-#hY}BK@uZY{Sd9+1D)LyKnjbVhZ ztzKX`GcD zuhvkJOwS*KBg9Xj@oF@V%JkrVq@RJrXsyUf?djSFBv$LV1N~%rzO9j4908I?%lVEq zua>MdGy-`l!Xxr(Wq(njdw0VQ0bKjar?pZf)7jOKPkWQeN!U|S0Ic$96UhqBltife zk)GDJGkFJAAuw0-YmqxC?aSxUeo>!xgURSxG}rTKQ+JW((HC?(lTRzQn@DS3&5+t> zie!r1aN?j7gf6voCiC0F9%&$&c9N`|JPc|V6rmlPqd^nY684a1T&tV~q^P!xh+~zY z9a3b9ch(44hXYN5c2W^{k4J(welPk-5z~3^Zh}^G9}#;`MS|8zkxXGf!33=@6Z;94 z(hji|z9TCU=@F$h?{DZQO_i3)K+0&dn5>R~U0y)SYA^k+QsKn8oYqbex9*hF`YA%^ z2eFKm({lFa<+T*0q56)R@?n|^+LRoc3fi~q*{&%SwQWo=6}ZY*QQNPGTX!mISF;gZ znXIVM-Y0iuvXUnDW4heEB9*isi8$XNuB7GME8=SGb;wHE7G;$x2EUhERE6?fNjs%T zn&=E<6y#wg%{-v;*_-rlj2I8(1zV#CYAT22MinhiS*420_4A0CpsAv@CqLpSkhzMC zWrCVDK&oo%vuSn$sTStBy7n)7&R@%;>R@#(&q4K+#quGM;viU6*IrO0O+2pY5yuqi zL`22;ERYwq?%4=xYH0nKT+hrcE(56<7J8yKM`<$E-sY#_41A*2^$>=hA<|*(lt@2C z+-I7o4O1jdg@l=Th1F(SH*TV>P$a`+=U5YNd)>D}O|*?<<-P37BMN%a&vqt1*N+vQ6%l_b z&)$Pfnrc;;B-M!(b3oHf>&v7sljhnYBI*gE=N8(?<4?x0MOa_ZLR+IWbV8(cS=hg- zt+z?32z8R8g|=0ZOppBzx`noviQU%Op52tT(2gsO+ak5lE)!AX@H;Ao%}!tprwAN% z=Zk?m9kgRia0FWb$g5h?Nz&kHi_$<|)8;6WCJt80E!qHSr)j59lO_(oK%|2)Y9&vTW=7@QVj_@ES{o)yfP4z1v(}YKp?_${W>;;NB2&ctZXU55G+nj3tciIE zzM$=cU8Y*p8T3r`0$a9sG))mVSG#eIbMwb0Zf)wOl_4w9Z&;M56bs+j(^@lG52PiK z9$_^%S^Gf?ywc^wO0F1wPI%}?O0ZcBxEB!!E>^fq=>sGCpoONBx^sB#%r&b zC2M<`*ehnq+9~p^&K#Xpo-Zhp>WwW*-_1$Zt}-bM1V`P;+Fc@|1Kh-di5L z5^0l-JOa!-yl zlI6MlY_xbDtomumicIm=o&!6kf%NCzDovEQ5+yo3L1e86MFwiSloe?{0?lBp>Uj*y z9eEDbx-t1JAMK79s?AcwEeS)l_1VZe@H14aazW*WsBwZ$zmCvSnc(-APk?5GHd7I| zB#hEllSYjbth{j6S6gzC{0tpQt=1TAEtA=?@a;~}jL{PQBF%}y(c*m|6SN1HC>7Yh zp91os))i_9rVD34kAO_lre7t3v(Ym7JYuR=@fs0a^K1bmO`F98=brBa`9h2Pmozx{ z`~}E-t&bv<8|Q&6*2XE~rfW%9Em)#WQ5qV_c%Fh=|H3p&wXd^j_9Vf6q%h65+Nx|C zEOp=hhh|qcjfAkmHOsV<*)$l|GA;2srj*v}kSq`LoUZL*4d!z_@SGl|S)t{$(?woO@w*D4s+&SaQFh8rbUzCP&4CAv(yR1m6_yE2|f@xo^J#!oVq>61kZ(6Oj zU}Ep3S*>+rvVJ<1Ot8A6teny5YOM?r@2Rz3kqPNqtyNYe#d`zDZbcGV6WxvWn61$o zvBm^~Yana1mlUDZ)B|Akoz{&sYF!lltkv4yr8w6v6fN>S?GZm{Cl#TxS`^5S+W32@ zp_P*tfUMK*Gr_W&2xNoy;(gL!Sw*W&+9pNd-4?vp!~EH-X%C)E>E^I}-mH~Z8p>y~ z$~g}IFRSj^tR{`buyR^$)#hi@py#dHdWw&8ntQ93!Nfkzy;a-IB%@6wA`JG6dGEFk#YcWA@1`8f@Ke$nPXQlUF%1NUm4$3!yttLS^R{7k+{ z@`~GFwO8xKWDB%@kAUpc1~K^`jJ`1s_i3Y;wAWz|Lw?kxGkNzJ+Ew+t_JGOf@D&)` z!L?r-C}O}mRTO|z{Lh2c0qruA(%=WlAx-m;rYw^`w2n-^hWig|_J!}3YCV~ZfjDE| zbW|I{!pUOx_zBsqVWtrUfI> ziq=5zp4&gQcqZ7YW1DbXtH{LOfpbC|$Hd-Cb3&WL1ZxV0bwYc<1Y7k5koFT=-zW+T zR}?YFPHDTC;F~NYr@4ovl|T&r3=?+;@>wlDH~Mk=g0o>I^Q=};X{g4127bad=d{|{ zG#KY|T5Cn9-#H0!KBrApg!*nArCiWNvymbhiJi}vG;a)PFrV*3=$EzHOfaAE{nr((3lq#|B>!mRm|#95xvDKx1a@BW z-E`Nq)lBTSRM#{w+{cIUvG+P&({v{IEU>k?rj=!acYR>muWL=2;HoT=8(}$rQ+r!! zDCcjEhBa7ik|L>I`yApeZ5ETWdvl2s!(qi$+t1`0liOO}JQzdxJ_w9gQFBMD$D|9B zyV`q9iWZL%xqWauu$DqZwKhIQRud5>%%DpHxvv$2?}K7Jy;>|%)B*B9Ys+NluU@zr z&LbXblNF)o)d$EU?G9^RSwyu-=o9mi9~@(2Srz&WCOF2%Qs>e4GZ~i0tInR}(oZw7 z&niafSD7sNo@#f5UhgUL{81$Byo%6YV)AP%FWhP5fpx}qOz>n`8k}m0(1+Pp4d`yV zNImb<ypq z9~I{+K=SF=*z;Gg`v~iMem%dRQgIOWN3{S={xHw5JxXcFGg?V~KU?8i_6KqL_wufS$0ELmJ2zg`Kz$w4q{e_)1K);t9D=o8Us^G1pO4% zqZP@DvHcVe^HW^UuQaLRLg7ew&*l-u^+t+hc#up|q>B6C z=i?;UX`okOP4kMh^Sq|+i&IuH%V8Cv5BRC62btiC#UMqB5%J(y3-|Wa(m!Pq_>9U= zEqybSg|MFlTdi99UM6RvXmnajzsBSgp6*l{S(xJd+Kfms48p3V7gHov%!E-~$wKh` zTs=tQh;RPdOF*)Yb2hA5~hu0#Z-U3p*omFQ1*O^>vMildJW0 z{`RZKPDMk9*r{-dor;D!f5Fycr^40PF>K5lH(ibO)*QP11e-X1>?hb%AIKW}c{S5( z7k%=1HPah2v7c8n{beG~^J?y-!hT-O^<<@?T*Vw~uFq1$tpzQ@YC#Kqk{KkGVc;Q4;>O^m-)_)A3G0SVn1b<*yYD1cKLCMU4C3*m!Ho1GL_HNCNzTF z=&I9x>@26OzU7n_+v*)hW9LtIM`Pzt52qy9@#z^>GJ852I~BJmGD2I=D|bf^7sHFo|C(!XSl zoj-&0ubJ5SGe}>~sj%~Ba9I8f*0(DSwc{@^)fC2ocy#U{{9)(1XMr0?t~u^Y&z`c@`y&xsQIfu!mC z6`|JV5|HV7=Y(vbLp)~aL$Zmr{!AP-eW7G>;>pBqUqc*Yt17QHN!%}rtz*{auNvK*{%O)o=l!vxoadklb8KD{>+TsO{G3@7;X z@k|!L`LELu!(IApCZEI8X$Si%_ULPv%mgd^=EAS~P9{Ae$8Z&5uYQ`zwUO}V8vOjG z-)Dm7T=2ZrAzfCbRP=#+`R;(`4?TfNYdA3%8S;of^}0+Fpd8`}tP^@0CUxPinE2^% z7Di8IV$Um2>!+El-ke*kg>;?PZxL~3Kxb8dntcbUO=t%x=1&%DXb0(25TA<CsgK59#5cHD(e(pQO_VXyr&tpe} zelW*80cegy1k9w+PgU>};Sk$TG!tr{@pP-#(V(C9Tj72`hoGN^;3tnmY(Gzh`FYyW z*nWHtvHeJg*naddKLJOBez1(04naR{AU*{gV*4o;=BK!$K|fdyOF9JobOS%nJH+-= zF3eAPM}vN_gjaM3`WXs-UT}!*r&^ew>W&8el!fP2!y)MBf8eK}7)85gbA8aK$I0XIt1b#X? z#P-uU@F-i&#kQ_XAb&M#H}D-tmu5nA4QydD7WNHdPu(@JlgVLN!8-_^y9WMbvL9}r zJ_Dp%;2M(>qv)+!ufRPbs+B;iUV*sk6xL^>qEuM@0t<;K4f^R9*q=i)I57UjCu2A` zFuewm{t&~`&%lT%Fqg@%a0@K9qVERMnHc?Ilx9fa5R=5*w3qn3z&R%E=F*KxLj%{D z6qpG&MuO+}0}(YTF{KShX5Kqdy(Gr>}ap-&3zV1lJ?KWHWgjxoVfcN)mF zz%?dV>d8b!J#b^3u;29?G!}GcVWKQ6DCN-*4iTWx~l}R*| zAIzV5fjUg=Qa3Nqiiut7<_9`5u}j^8Kr$1%)O{To%ET^p3j^bs*rje!;4>!wz|L5F z_xDX;0h4|9+LIL^e*)zyLXM4Z~RCg5#|VbR{yh=LxmCNMr5 z2?1FbxT8pluupt%4&>a;yE(9^G5T@uEBG%>ToX#yaG6K+hW%`t0||<_yM49<8Z}iK zCx%-BLlklMu51Y;G$TKA8$_#po?8MhDgy89VrVz-mO!!Q6raEI*kmCSd(Xg@ze(d-h43vG9JlpX(7?`Yxn`1y8V{W*) zdN3@+4z<-66LK@YQ zU>!UWRtHZ8CM%6w2Tum>wZqU)Id$-4SRHgVb{#w!h-^=B{{1i5*IfqYae;D*xUJTy zKvyQ%w%|QfrvhnAFvoDe`q{t&_S0zrjT6oWRx^n^K%UPAwzHMp8lMY1`#L=f`xL;r zu$(^^sH-$o5->N;h2=(8ptaJtxsesf*Wt-r-81x*~3wzYlH2A&}HCG)C?tDPawLm+z!uOT)f&3d5*7d+!*~0oB zG}i-PD&p3`8-YcNq=~L@AO3dG+z4b4@s>H3Tl@y(R^S{H+%1pfP9XQ2nD#X9tx37X zaUk~sAto;s&LhqPxgU5T8@UGLVW4?7av#X!K$~nNs<=mZj5o6p3@gGI#bojD+{$y5 zF*6%M&(X$8CKqbv5l@4k7~?l4q85=n#!W?1z1_Z`FC*kLf=TWZtlAj%TN??AWU9Tg zxHI-?qc0PCXKa4sLne5F4@cekjc>`1I@5=zr}G>86rp|iL5Ppf$RdqXTBPwH8z~7I zX?Q!i@hJ;LH!3QU=EZbX0}?d)GQo5q2^qr_q1LY+kOIcHinysLXdGo?r=pM{I%8Pw z-h)C$XGPM)?^hy4Q}9#Bpm9Q`7zW?vcnwHlW2n-&<)^4IT9Fj*pai&06Fe3*CK6Hm z4|A1(x5>tQCRoA?=7)3Z#!*Gm#7ci|QSulPZx@VDnkWTr-ej;UW>jGkNQ+UL;zn0R z+%reTjl6H6742FaQ4-!k8|h5!efTAfjf$j-YoAg(U((pm%RjYDsvpDa(u zI;4p=PAcNwj}&hVdj~btCOibIcw?m^Zf-nhY$J_x=kRmJQAIvg`}t$yJ>ogzVh&A$ zk+Ww^Fm5UhwGve!H^Mcg3;}yU?URzIDHZ0Yw2_!igEy0xHm)h+wozrmtjdIi9vlA^rv9FxL8@QMtMb2z0)hxyX*=^ zEhdY%Mu>?JRt2M>A}QXLK=Ag43PvkMXs5v^ps8piWg}k!scd8@lIeVXzM7H02gWc} zG>0?A8$naeD9EJZ@F=kjNOhwXli`yhMDcF${@r+!Np09OiKM2{n@LMpIYE+W3}-S8 ztZ+73$C#}M-IB2jJl8e8W=;75WL3{t!^9}HB zqU|c0f4ybwC5>vMz5>l#MnWI-OncFP1oDnCfeEG^bEBs*T@h*%j({fF(E6g)DNkF- z=RH9B8rzv%y^~vP12WJ!qlg>l!C^IJu%xbvtZ8ob}U^U!W zt4OLSvmi>uJ`d+F408a*5YMnw05Z}TM#Sj{M;Vh9ac_?qW#k#Cth`60SM{(dhF=l* zdJ7P&O)17Rtck2ld*eqN#aN>Q!F7_+Mk&&W`6YR!%jn5ucO13zV+?qF@XLr=`7*_M zj4^`zsB;`R;}~m9VS*)LIHY2%@i`M5kBtM8YAjVGP2lY)9|0L}Tw!wYo7|!wkO{_3 zMN&n~r_o}TBGmG``=cfr`XKiyF9*#;<3%Fs8(7c@i^;}(Mcmb%DMpLIXqDoe6`Er7 zR>ZwYV~R0Y5jugj8$3@ja(?G%iji|IWr{IXS;4u{9aMMzOH=AyH_n)2Q;arYBivl8_4iE)aFJ&*guFo#e|@mY{&2oro3kqI8KTCGT`vqm({nD`!9 z;b_?a%`{`PB5vRPxp7w!x1N3;R^~r9Xde;Pl#1Zzb0cb~O1t-!2wKgUVdPT;?(heK z<#2`(U`-wPsx__v&ottRs2jW!!Ou)%4q2%dsXLGbJo=*6cp#8PhBnMiJAUW!8{^gC zNHRS3iqH~cvLe(*eFauajK(8KbAJFm!R1CzCYP5+sN3(C8zU8QSJl#u#frH3lWuG$ zqT;+7Jf|BMm{k2LTKoiLwGls3<%U4A1ISvV1rq_cN-nPeH`W^OFlp5yR_q7O24gxC zOhwXUxc$}WJBs{drqB+7O~xoisLbE6;O%W#S>0@SQ*M5SWZAe+l@u6`CBn4nd2AiIrGOgzw%`w3$))_?rtZNqk7(WjJJO@}2ilZ941_OHyreNxg@3cJdEf z6E!jhzR1%DZum6fRp{7(r6zN842Y%1IT%!FO$&FXmJfr99%TCiKIDGFIoi4z^aI`-6q8&#cM$RHCBH_ zn%-9W;CL<71x+ zziZ^5OsTMMS-ERmV`8`1ca4HmNMo1GyGD5?SPpS5?ygaf35Hd)tOrQWp8CG=32QKa z(qKQyePa$2%pZI^`M_Aj#9ps^U|j!%Lbq$>10xU2lQHM*TKO<6tVc#srJ<6EEy<&> zmgKQfQEA+kZUYl;^8n@d4rUC%(05lm>)@`d5kspKoeOG*2m0<=@`Q_ zaWySgyzmN~JuyutC#J@Vr$Cd>EW@PGs$8NAv|7?^z+}bhT;gTW80MQqyv?i7{Jntr zHf!(}Ydl9^!0g2YQ$b`Hlg8uWTeRS(fZ6DCiq8hv4fP|C;^tW7u3Q_Muqsp7}wbl$w0`Jy83 zJG*LTA13xYyJ}(2y_z{yY0{kBsAkSoWQunHYBZn*kz-x`92f7Y}7SJGa20gZkq?sbY2Y1ah_Lw^9EUY zo8_S#t8d+^YyZQ>+(F%y(wfQ^u5{ zpC;zJiohBy*PW(jDrubfG&QHP)#HKig%j}H)ciV|pWQ%SHrF!2J42qT;1O-jvx?BW zbqu||S#b`1W#O z#(3`>_RIZDdaIZzc4bDX(;v1bL&WqXO@Fgp4nO_P&WgBJ{ms6LxK;zqe{)z3Fz@HE z8ery~hcR@m2AbUzp><yOpLek)K-w2wCW`8Dg!D=07rkGQi>{$jkr8kD&#k|JEzOiJw znR8`(y7}}X^z4?O>1Ki=X(FRNe9I3!Pd8^RRvOhNXq8~cxY_I*B=kO|1duPxsYKwW z$2_78kT1>pOHh*)v$QsyxSVY^XR;3nKEc^s4zpq!!Ym1&@*FO!S)L>NXht^2Y{OO! zZ_szH=b9avv;l(i?z!eLCbb^q5|yDX`^sF+>HQ&6&U!)MZav~SFJ zn0yFCtxK4FndoCFtR?1fCUHPev&8(+Cbvkl)cll586c=xYOZ3kM07=H$jbzGG^+lZW|v|Ic#sJp1`&D9s1cxoo6(4*=;2 z^X_!>25Z{?PVre`dcLJ6m<$Btv%-8@kyP)}XCqa7R+@$)Dc-$6Fg`2II40N+V%b<_ zRw664F0l`u@+vc#$tpO5a0bYa<`5>0Lop)%3$Po?+|HyYll7*#4C6y>!ZV=RV0Kj` z%M$_Tj%xwgXii*C8XWiHS3x(K9ny*5xEJHI#mr!WbB8y;YKvKA1!-^%4O6kzT)L77 zo{${_nhbOLDk6A}egTjjW`{LI@Em;xkbUMICU}m%AdEBjn^nFe4W6Sv1DXTod?usd zWd*i%2hIIV@OD$w95g3W zgV{Q+VqJCGu_Z&PZMkZfRnc<~+yV}7pj;B^^@yLq&%b76`m#+ddU-J%=lT7ZJ&3;m0d98;rN^{?w!=yNq2j&eX z?_A6+DnjXfXg**v4hXI&J~TUQB0sNHqg;Jtc2y+B+Z715eviz)q*3*>CdB8lnSZmg z5?}lX-+_XB_5=qq!LP;rTM2GJ4Q^7z-H{j>Y_vsLIjeJ#!Pga`nv3gEk-=`Hanc?c zoWsOUdsOf+6Fcp>gZZ~oD(tjJ2OAMlVf_hl_6GF~iu3bOU$cPZ3C1x|aR!n%*iR9P z53WKy6&%F`+YMZ2dn(v<8~UMf)F5ano(`IsM6lgJjW0Mv5qGUX26OH|^asZ)jk{Lh z4-Vgfe%!SJe=z5&qpPvk3c!!Df*S}g&>J6rFz0ODA3RGMl^Z`pEd9Z5zhGEt;ybX~ z14IiRQiS4s7*i6w!kVj>BE<9UQ^rKq9^EDi~bA zWMO8sC=FJHf~%PPz$7l1p-86Z-tB172sDL*9d==y$BNdFc07e$B-lfdR8jW=^k1MU z8XU*uySUt{78DD9$|SLUq-r;c2j?>>-PJ2z2dfgnOeUXPic#ak_~5~81n+x)E_jVe zpPsaTH6i$zNebi-*0_YAf49n2p_Rxj-bfRoRPZ?_yVp~#EEBB4Bx){=^vVVsF!?Pm zT6C@cFF3RwA;`n zk2dGjwCkSJPu?&;yKCk2bD$gLyz99IJOS);UGh%toMFvsnbXhj6X_lp*XrwnIXzzr zBQL@ed@`&CEpmFUzA~rhwBtER^D;DxbVGluPR=-o{-V_$S5shYPR(y&WHo$+>d6@1 z4CIVqjV3uY{slSn@K^YbDwbzA^!Cljs;W~G)^kc-(qRbg9&yPM_<|e00k7s*Ri01r zsqT!6-OpX-u(uvZpCf6>wG-9x!i!y%(N=Uwsz$Hyg|U#2qVl3HCU6*Yo+_h9{U zXLdD$@%xdasdj88vW z5{y4cVGV?_D3Vu$t(k0ru_%()f}@xWhOsD;cEP1g2EkYq$?L(xOuR4_Me;^4@(_96 z)sD!U!Lm#uVJwQ8PQeaL-i5I!k}kpVOa{SN6vK*0W%4- z8WT)n(y$?salxrff*px`5ZunBbblfff;X6aIF87N!MLLo*5K(xJ_mZ z8bfWv(5I-{l>PMUr%dSd>o1_0<`6uc_Xm*A9Acl&n;D$1Jg14pFGPwfpqUl?@)X7= zO>8L?C9VVcBDj=E3+O?R%nts@WFoZuNahB&GieUr5koRBc#z2f=u?m^2%crq+KfgU>N3!0}lTtit3V^hBsx z6>Pwy3w)^x$(mqmCfL6t`99d0iQrWH5bVq3ucj2%y5I;V&Ay0HRvUs7nLMLW+J6ep zU{a$xS#1t3VuIrh3~OufJ0`uMRY$Tdn8Bpm)1>)1_#2as?~vym!IMmmSd^}v!7EH! zK)Z^5b_X9YiOfTx{~C-vL%CWHT3XcX3z|%h)+f#H!4gao{>UxvgXTc6B9qrXid5uK zunrSnwP+Dh9Zq})TQP}%I}MN=4R&PGS@Wu}{tPBF=@?I8od^zPvYMaZso;1fGrpr- zJrhi0k^p@r#`#=uK9iG7&IeaA!4V^BE(SL-!4VpgOTj%%nr6aXdO-dT9%Hf#M!`t_ z3I4?-4*F9h*MfJL963m(?s_oyS<1uKFos0U&7j6)O$w#!cCZMO1M4X_?gq;;*-`+$ zQVRKVKUkB=1gK3&9tN8+*$$-_$>U&qCOv9WSRShzlUuO5f|>|xFq6Z7!e2n5tg%dR zREZ?o`h>{`Jz^D!vF0$z^)qSmSj%j3g*5rB^-P+;s1p4=ZT-Sz<2g!~&pOQHawkfK z-^yY#m*b;bH<;9c@hbW;tX$_P53ls1(1TWfCjV}y&_h;1CQDk8rht{eWCfIG^i#;H z#v}_)^&%;3HDc2LXYy0jYQv-v?3X}IajPqnTCjHxNlB|elPDOOBYD;u#boZEq zhe&;^9uu6Wpr)bqG83GmA!%$SF}Vw4KO{}9-b~^O$A~CatZ5Om3u-=2hzqlk(8- zVCZeEt4#i3&1=>}CY@ncf||Bg?0L%7H<+}u3?}tqc8r?#Rxu`tOkTIjF{x;frh`?J zNf{<@SWTHEKb1%M>1efO@(zawczEo0xpVjsl` zOnO?L3zVzXD$`R=ww_{AiAgUj#N=Zb6<|L1w&IygVA98`#3XSVrK_)1he>rN{j8Qu z%6vfi)8FdAOu80{eW(3;ESUUMQ7tz}HE#Zu@WS?icwS`n+PKDM?q*#)B=^fSpiz+@tf zH;_!WPBU3EhH`a^^$(NY{B%CC9xy2i;|;X>)Qb6w^7#g|qDZD%0Vb7Uyn$qzRg}qE z7;hj+v&u4AHJ?KN%&NiUXBcmwX1djcNo^Q!Ao<*SjY&F;C4xX^SY4S6fU<#Prqz$h zcTiT5%(6x>$$)+t$rsj#OkRU=0+KJS=}h{-I04CQYXOsMnWULxtz_~y^j4^uYyHHe zGK>?Dd}ZxovKYn*Nak68FgXT25t8{<7L$)TJ`1etOmrA0pyq2!fJdBz`~l+xBnz#4 zOisW!0m&lEVlo}Z2}l-OC7H~CaRQQWtcpzb!Z-oR600_oBp4?kS!%UlQW?exNWQgR zXYxFZ6Ob&kx-q$Ul{Cw(K}<%$H~}^3)@UX>V4Q$tg*AyuYZxaWS!vB;vJu7!NLE>k znT&*S0+Q9%cT9eP-aHP-8fz<)Somf=lJBg&Oe|=BkbH0b$z&^(LnLdhznHXv-W#)LvN1cM=SC&<+B&Yt4P*aJ|?fjCr8&K{vZPTT4)t?lNB3HbyLlw_Q7|IZWO< zMXS3ztz}F~!<-S<{dQUF*fY)taSd&kb&xeU*F&<~I?EcIpCZ{~-C=^GxCDsduU208 zDkSFNDIloXYsE3au^(#oSrwV!3=uWIS#_A;OdQGYRuU7Oi6hx>ZD)craU=(v<;M!+a3Q5vwYb6VQ&K zpQBbICO9WT%`vMD6Py#F=1=P_TLYyR$#H8S6C7hBIbn@qf^#&C^GRz86C8D;=9D$Z z*0AT()^a8|>PF2OYanIbPZB>Ar&$1pd!4WJz_X}2@7|Nf7 z$`r#3mc?Y>b|M$8XPMw^0>k>ts?5ZAm2&Ko)tbqBu>Y$Dgmu~Kr^pzQu|7)R9ky4j zIjkwrh4Szp>lTyTJ}NC&EiIPfgR==t#Wkx86P(>(=>J+xm^2b=%s&1Xmc4+_CmC!CHx)?^ z+=tSOe(qWH?k`ou!W@LiZPo-J?L;Esz8obWAy+K4wg|INCQK4Z>-V7sN7a^@ricGBqm;m{085O!aXN34msMM?vZv$`ao*KUD9@XPEut?v^rho zYRb&Wor9DP22h^X~Ih=3P<*c81_{cgY&Kvk^;6KF2B%@&`3f zIRy8VqULFb*t^s7JES0=w{ppE8og_CNtM$Sx=SJs(|!`4<41!$#L%TfN?fJ=QU1_W zRqE12p;zEe%Np>uJv80V^?fPjm=Ri}2<<(bM|g1eY50SSg?F~QvkLHLSfD0Ga8y`R5e=%OO--j#x(f`!pfmIuF&)&Z;vhLV1S zgO@OKK%NavX0idkvUC>6^Pxt?P~+a-P&%}ih{ujk=}@=g zO5?HPQ#O=yH)i?JUZsJz3^yaiHSk@{`pYe5)`@}R<+Pn zCU#gahHfe1=4#E5C`swUuma$xW+;wHF$gOTNbOJ=Mab#{82i-?H6x7|?-h9tGz~&M zN#iwnk7A?H2qpu5&n=q58N)`Q@k}NF+0_WiF(z}OsZD4cI?H4k5UdxCLoyy?nCiX$ z2elGSLKc&UKv2^p)JTyG=gW^xLqkX-9v`AUu4!nEB5)5Cj8dvWoSTNWDUu>^2RoMM z=Ar#;RqyAV1ua9}o>OsldYP7?R7Em9 z_>I&_5PHk7=iV|jOKIr2Pg9!xOoo(+7PEo89D0z=^G+bGL(e|1!V)duBhM zd@>nv%8QO=##UlkK2s3#5H0F@gN#9UUv)2J(8S6_XH<|D)?n;BBhD z2fp8Y-!oW>DC6wo-%podc zhKP6~8J_yDwb$C`T<`kd&&TKEeLrihJ&$MawWk2-sAV&Gbxe|Y;d%I4sx>H0TE{!m z46U;^UlQ+bS7)tG8IsvmAzpk8TAejtSt3oq+Yjb^mx$cxqP3DT-n!{wGA~IPx+8V~ zEO*fq!Ttxy%Mq5lY7@h>K8JL5)z;(+t6PLtH|@(XtpZ@Vo0cg_ra0iIRCL!wicFVV z?%g#X5&7Eb)9{VCyS74-tf*0&;NCHizFOUKsFfMj9>@eBuW3z~4Bs3hW&?R$Yr`aG zV~ofEGAJU3gSFhJss?MFq*j`5^WsFg)*Gx1BI3qyur@*x?}g~W+PVmtgAwHC2y%sp zuPgYF#QW5PwVRTR^|kpFRzDEu!CF*#nLoZlgQLZ-lH_NSIEGH?4AvfH@^XWCaYo7n zn7j()k|fDY7Eg&5(RE;tQ6q14V}0nm7td@D(ZtgfR`*5}pCMW;NwVZA!TeI|xFmE^ z4(s8YTKNi6OZ+;K`kyzoI!uZUq26YM*0CbWWQpi8RPH0SnM^9IAs^8rwJVaOi2_~e zrL$35LM7D7jQST&Yy5KQSwA?2EJsEWZaDuivS6CAw!kVaU$raW_ZFCikp?BJFVnkS;j0$U_ zHd$)HyW~Gai^Gs(6SXUnq{;F0sT+`H?YXL6+A-%RX^n~aerS{=bU0TrNt?jrS0fPr_^)M=QNgg1EL;h$&h*CMiH}NCE=z%gXoihG^-XX{wr! z<%^q3C;X>sZKYOL6wX(ZA*`v|OH3-SruphL?KMdb*YB&$%;z; zAyHHTJJYlrCKZ9yl!VGXGpa4@?qY6C*OpXAE$>|1bnSCVymP|SwJnl(J^-g{Ni|T* zyRSE0OOYf^oH|Ie<>}g6MBI8fU0cXn*ke=ZI@Eq_U;n|(a|y(7y7rVLUQatit0hUA zc%0XaGqj;hHog`sE`!z#Z366_VcKzyjh1I>$0hORKQpy!VdOq&&D4UmP%BNI=)l?X zY^|0g-bgejqVJufHI_0o5*4ind)-)et+=4zdoYz9(Zl75nSxjIi9Ofs^M z!Z^>m|o@A8ebgjE2Y2qVz znHfV*=XRPVO6`GHzv0AYx|U5cZVA4l<*$u)y!?45B7fe|o{%z>KW(ywctT^a!{$yyESVrB7%7}<_h8C!cb|}urYs0-Ht&}8QNh7kSQywV;C)jaqzC>HYcGQ}2iFS@j z2CO{VLs(0+D@+zLS*o?EC-cWG!DU(}BECj&E9DEQQOmR*Oges*ASN_`^GI4hCSO*C z_o*cr%%uFC1Tj;RF-+|FG@38d{$*0A1FRyYOniMR9qidYl*D1u{z9zy3dnM8djpbr z706*AE45oN{$Z=E1a@j3g&Rg%Ug(#xhGVW?1DQ42`WJ}EyY{fg|5WSPgtU&q*>7C+ zuhq6o;`Jn-X>*&B7OqCI&VQyAYerg6#?mPKnf7FJBw6Alys1qx4Vb7t>N9OAlk+eq z>Dv&#UudT#87uH^4r;B_Znr=?nNh0T*J+bmQRsMEhh&yAQLkRE)5f$W8N97SGRK(U zZ5<-j+mMWE%j>i{Ow?WJby{Od;PyS#AJSS+#H|VIv=`cv9lZ5}r{&j0)bNLqR#MBW zz3a4|l6WoUVOpTq}; z9$MulZG)+RH7i6@hD zOz;L4$<*phcJKxkkyJ^tgxcxato3CXypu&T^O@kCtUpg;ScP9gJDH;Y&1jJZ`TUjE zS`vD(2xp96YsV#l88z>QZPn&>rO@%-7Fyn_`MMFodt10#->P+Fg7>zNY|}PKk||== z&>DZcwu4C}mmFp-yxWEE3T@Y_b*C7>O~F5gaV6ce?}m!&ObqW1K@(^fN4 zJ9yt|rPp5FJG*^9zbdwM@;m6@nLz1><%NvIwkffC%K^(G?cHphYN z)n+nz7ETeI1F~PcEeY+0AvqAy102-y{trW^mW!o)P@Bj^&EgI|L~Ch;R`ot)2eq*6 z9MldlQFk5>YN>rm2HQK!Fu{J6$TcR|ixSCUg1smavme>P7Dpt53AQ*KPY-IvUnLoA zaU|263AQ*Q&H9rJwm2fAm|%+|@);9sUqp5=!S+Sux+H17jmv27>!5ar$!;LnE)Ht3 z12C*K-yn;2?0?j%Ga1L^kT!@3zRQ8HlpfYrF}cX(h<1)iy}zQR%ukv=kSw=ma#U;0 zB=#D~9Mh&Ud5p==+BZx-$xFA4f6lIYmQg+S zuUf&^WPIdECF7 z5s*__7L)3bt7zx6c8tmO+O+$9TH7_4>@W^!4Z%j7F2SF}A$jxhOCiycOGR%BD% zxT;lWvX#j-jlA$>C8{#b<{4~Oq8f#>wSiJAD^ZQY*{+rvg*`1b3VTG2!r9s|4qbim z$<`*a<)!e&2itPCHjRlIsk60o)>7Y_u50)rCblp2z3IAkfXQCCS%&TOx|YqP!Up)> z1a;%O)?hekH3l+WlFykGD@?86FYQYvrGa28_)9x3NoJH9Wo~F^nW$0bhAX4SK~F}F zah{AC89f;_>fO-(ke0_vk1m)SH?-iJ6z76)R)k2ZB(%eTbCMfcosm+;^(uK&t3HZI z>q)eJzp1sA#QO$xQ+r90%qTTaxTy`2guGi|i@T*wl_V=leYd)$eZVr<&y&n&Ow>I5 zmbQb5nm^ytjz}_AU_T!-2Q8nMBu!j`FPLcOAMGX+_08@dt?w90#r32(@eP#MKiXVL zAniPFxuXpjhcXl7Tl3gX?`V&WN0Jq#M*O?H7S4)NBmO;?s1ZNMC2GXK?-DiQ|LYPp z;(J7m@Bg_nYJ3+u?b2jLsqsC^C2C$5?GiO}h}KP+iZs!%O`UBv09nW(WlPEVPLcE*GE4=U3*eGd~gcE{=WnW(WF zEa!TGB2KTCMs}3Pzc{@+6E(Yt(?>{>CWe0>EpldKeCkZ1RHz+~1bq{ec|TCkpP*ly zOfm&m(HWrxz1CYqez}z(3S`5(Z~A&BI}myi-VK1mx37AO&=NDiPnQc<~L8!uoM0ujV9*?|~H2J5M8-zCaEEc~l?D z4o7qWrGtx^D)?=R%_LyW-btNJ4Ybd`;l%t=^brlqVKL zZ_h+|VlnhyOq3@UQy;`cd15j3aZHpa7E7POMEPB@^o2~6-xW*$gh>rJuZQ(HsBdJV z{H_G`pP4AXE4F@tiSn{y>o=GvFDtelHIve=ysS8SekRJxilgg_+@jD!`jbqQmz9uS znThhUQe3aYM0r^$uD4{OysVVaUt*$ss+7?CGEp8>O1PGlzmyWLW#uoWgg%V4T>m7= z`XnaGZ$?Qyx8IDX^xS?kO6j@%W|Y?Fu^r_%qqJLBmEVlgI#eF`W#vV`*D-SCL28!4`qsv90rb)%dsqw0o7RNe51svG59Emb$d2-l6L zT^Ut3JfiAG1y@GZ4Uee0QPGuAb;Bd7Zg@o14Uee0;gUGzyQY$|9H;6=6_+TVDpemK z=u_nxmnfeq)m)j zGho*dXI35b;_p)EKZ73_wDY2?H3v`OLT}trZ!TrL+~}kqi6AE=nc(icb<)o>xd(f3 z7*;1e|9diqzQB1}t#{VzF_{Xp6zuss>!X;Ih5b$<8BBiX9fr>Ox02A;ldh15o%P*J zFgI}K`I3H|$-Mdrq7TTt6fw7XSueK$ga$vOl-rY^F&*Uxed4*rVyXnoD^n|a#7{hM*R3_-f8ofnz)3-?C z&F8!8`uk)VWfoa*VnH9o*{w;gP98u#`RW3Y;^a1nKJK zYK;Oi?E$jrbgY;Qq_-=x9>~H6$dtF^tV zN8iFk#juaQlZlF9UwtnV6~n&zPfSz{`{^f{s2KLse`lg%_^O^Q39Ys;hOg@P7hyhM zh*B{ep!+_MM7DQqrvvn_nN$eI2_&!UKS`1$um?agM32vq<>k)(hUqDiWD3>dhUw!Z z$r7sN4tHBzGMtExY6f?yT+$9s31W_o)Yr0>YNsRhM?ZWptWkO?Nj%G=^iP;5tQL~+y`aULVb}>u;iHVxY%+gOX zQ8SrY`tMBoe3>Agf>g}buQBO1EJ2i$F^DdSrv>xMXGC5VQS zY+6pF6L|YU@{WE*66$UG09mLvSb;L0NAX4adP&kmaXuBZD5AGn6w$9P(hGcycD(OR z50lZP46R|&H{BvVS&|EhYM%LlUXh8KXMUj9W}j63-jtQhhtisQR-^-^E1D zMVILZnW)T>-i6EzoIuHR>(YVQg??h`DF3yEqjx{ZW=tv(r!XfFy8tiM>I7qL*M9HD6uHt=sbkxl*sdGHM39N`H=tn!&Ep zc`q(eweHp2x;-DHt5v_@`XF7cH)A_$R=GxR$3)F4*XUiCs9EKwdT%CbR{5zuh>4n2 zuGLpDQM1a=^fQupeaq*%wUS!X>+rfCj;EXSQj*Y#R`emcSCn@P4A-WP&>< z_%_Pddc#%J;?x(Gt$J>ch+898cH1IWcH1LXcHih-q~!}yYWDsOuk5lCRiF8d-kU?0 zUvHreextu5Nt!4JFFv3@&rJOXCd$rE{YN717`IbDFG;%S0rSia(39+p=q0lBTe-Bd z+?A$UJ7jSwd%Gf8dcoCHdsQiarx#XG*97nrCXX`g0%9~ zRP{gm^!!Xz|Fd7$n5h0|zg~lh>VFRCjhLw3=78RgiRx_*=slRI-sYhG8WYvq9Ms1s z!oAIp`ZOl0xA{?Dz(n;nhx8RpRBv-g|AL9?Z4T=@n5e$xuzrAv>PZf}mQ}xT*tM+s zjl=p0(sFl2j_8+}sFm;0h_-VqqV4<~(RO~(@30+J=YMhQs%ksGM2vdB=uw|y38ssd z;NR~6w1QvsL?$c1zYUV(dJ##|d?lVu6i+pWZ)EyHB4XV%I^S|qzevPwUne8NI;po> zi(#Efe0O8CJWG61f04=FXXz&CNxd7BF<-;k<}Prf@F8~kN*Sv217v(MCGqY}{I1ve zjM9Z?gwQYg@A^3=rSiv$k0&81_&Lgu*Rq>n=aRlwl5|nDMWTpq0WYEG$?M2Y&3K!>&;eP9W*} z7Zld*{_q|vXl3ikn<$3pMeT1OH}qXh(2H78SX$eb5 z=PK{(MZPA2@fik|@9Vy;L~xYBJ3jyE4Vb9Ys?q*7l2A>+6-TtcFUk1QMhNjg6Uio$ zk*njBn@EzkJs5h7|EwgQof!WuB5t~3{J!m^rS53N`jfvQqP{Z3`b&LF1XF==j`jCt zqT-z3&%N?Z@DGzRULGd+C$p9c%jaLe^TDuu{!LjAhUN3$W}?E%6A@M(f82Md<%N~U zUqlkGbn^PQ{P18{dHvgWKNwbCzt}@Wg;gLTtOEXmQYKBToYTZZA>5KRALc zVy)-l9`tjq;H!s!eHfVxq=-LfFQr1gMqSiDcOQ~;aeYy&*a$L3{n<>)bxjm0u#@wc zKWe|!azlT@UqlkG&OhNV6+v=;U3$V_MaocX`US#z!e1+wWzC;k>tQ6q)2zRzv~wX5 z&voO?dMzSXH9uhZ(b@0+Pv+H#_(T%66E}Mq^mVP_4xO?r_dpVX=q?!xGDr-U;0Zw7 z9}BwV;vDd#0W!8r?&`GH2kbkNq>0)x#I8hTUhy2z7 zDrF?ifRykz3nLwXJn8QtiFa=KDgQ`G(u8^o>8XfZE#;rWGOsL;7X86aDSrkN96>Pc zrTuG}sN6{LZ)c*?{_JRBjaC^D zpGy9`OmK8SQrRDnWUOz}L>N!jf>%<1D@oEso76<{Eyz^ycVvR;`a_c2Od5Ae6!C3f zU)?|VN7+)ux^{^|2U5+S%|xZEy1&XHlEK_42{JYOQe%!G*1$k>6p0C%Dkg3;vZ%@B|miH1;26f+x6; zH1WqCBRhD43-hq4zkwuaqF0ebu?I*qf9s!7#=Fwmg9u-Ye1N||C(2KwiJl0*@BZ=$9Dm?Y_W3ie=ubo6(W zBu%#E4}iSnzrtkSGjXs74LA5A`plR86HiLZ?yTu${~Spu$8Zh%vVR*9fp4*4kJQ!w zGm|&qUM<$BZvG2QrhQF2$=&=hr_gemuMWInggf@#{m(L)QiD$5boaMl@=dZL-I&yZ zH>c`?es}*6CQZ&IF?mZ8y7_`%BD(uCB*_vt65w6wC?R^d{o$9t#fdk;PEVKYX42cg z>omsDv-67oq9kd)Lg!*+SbhB2l4M0G%YE2RX58jaV#FTE=e{o4KM(HA0(sRXH%G>c zBR~fD-#sI9Lyn9X=hysOi1SQdl) zj}VcT@#gPfe+m(SUkC8?>`?z?)>2^&^Un;^!uSmHzbi?mz;r$SIQa7NFJgk}LNda? zgbAkWPe|7&|HrxPjES%_Hp0&M2s;z~pG!Mg0?X?zSf1qniV2n%lDGVsxx$+AKv)MM zrBfdW3(0ipr7&|%4KJEgq=ANcIHLcdFO#R?}FQc?>-P`Bn$kMYg-uh&}YcO*#@&3=m&Z-LBGe+6hE zIP>fPq&VEM{K!975*iCW1DWOiOplU53l!a%<8A7_Fxj|180_gy5JTAO^LGLX&wRZQM*nk3o*`O4q(63HOx24uT` zD3jT+XEhE;rvHaONCwGtAiMm>nVf{PbDsd&?f>-($spMb8Z{O#dvs(*bp$soZP{_f8TBRa@j@gEB#80YK$Y$k0#Ag#as@Bc-1kf6+6 z|5_%?!3zzB^{@Y*8zh4SEyo7(-XwAa?vkTSVqnSN9zmG`fem2balRu$!rU0oLc>O-fAej%OMqol1Sq!9B;HCdO znYBRb1O_mv4W*OOQi%Eie-t>+hWd;IWB5X#R2caYNYg;IFoJPz5ope2C*(ZZX%%=q zn(QD!t#*M4Oin>rpiGBA;aHMEf-;>0!7zfMzZ@tRMlh`IfjUeMK+d-u03%vpbQr1C z7FOednM`g%&SO}80zW2DSV%Ce{(*Cn(Cp$rAg={{@cJ*NeeVCjGiL|*UKuFNWOQ#L z!vba)!O%wpZZjFUGEsc}3fzniG*2Qsi4$T)MX)nApk_pGzLzMTcn;=Ife%@x!pJyr z7{;B6flrw{R>mhuTHtFY?;V8O!5}j!u$#&FHt~{74*V<$rD7+9^;RHrUp{- zP<+tx67Up0J|&yF z^@G4qOjNFZ7&t45mx{%KYm(5s4!y%I4&;!G?4L0{O9Hd=dGWy=v!!kcs`xB(iHgq( zm#FxB;t~~~Re|+n*_~&uc4a1Qgnqs}+!lO*9Ip?rk3B#RLT-E-H~_viv96Ycm*DW_ z$F+g@f<&_TUCz$}MVRE}cR4=`bY+snGM@+fNy4*SsAHc8rV;UlIwr{z3+n>!5fQIE znnyHf1a|`iE13LRG>;ewbK~`aFPQWKnL$7{1a>mn3w>u?M;N~XhnSRu`V3FVicNuA zlF+z}s zPc#9tJ#dJK9Pyu*d>^PQNxCTDz>9l8_60gJX;;E0mH{~!r~Y0oPa*=0r=w{G~ zz?xikP6jf=?BMMERG<*N!iXtt5AQ_|g>;<`JQYU90r@RZBaBP|ayHPM$xzUm2jpC! z`Qv2gfAGrW8Xy+~UBk#$AXfqdCGq-%Yk^Ucr1?hi8tqyjO_H&`sl2|p7MMvg;<0*k zS}Z&8#1mf5_BTt;D!+pEQ{H88BKsMoeo3~vUiGr1K<>%p6W6-=%I!FA=|fug32 zp~$mUkxERK7o@f4-+{i8WJR6(0(_J~oc|6aTNIXRgSP@pBuVqlE&+bg3&4GczyT%; zfcyv<^bdS76=IB-WiEr;OeG-BcU;n^5}fED0$!_B8+;x}PN20U>Ec?ML_uV#B;Hq; zoItWIQ{lT=f$}gXkirDluuUp~&%HnuB5tnc1UeFt>t)dxyzm9~FxgxfwqSt#8@Qg! z&VPYBxwQTZ*nJ7A3qB++<}NeIXkAo-0I zVKNJV6f!o3$*chKn2{+7^*`HyXhv*tO8Z*}$O~V=O< z8&w+$5impvO4ssTNumMtq^6O=q;vq@HkG6f5vjEe%F8k`!nCl4hm4=Xv~X7>WZag- z+aD`#bWf%@tA4Dw(U*u@TZ$WFhzM*=*lU$A7Ba!sgnJjsMkbSAUM3%#$wuWTrDfO7 zlg0odzUVq}vP?@F*+kqDENNtvL@jUk@+spq6SaH!lwm$a`Gd0yoXI?8bS2{3Igd_) zl`;l0>HR*%u#_=^$*5M;W0x{+GKq(lf~hEFv?%ppoJ$#_iO3jY+DjWNiO4-7teItu zeM~S9iTuO_=MqFth1tRORmRBOcFG!}G=}c=qGgQ+lBA0-;V$Q-m!d>j<9HaE0i>KU zpbTn}%wix<8`(@s6p9!7fmAXomL-{%iSSwqkjh3ECUx@?scI}^GUif(i0=YB(#GmA z5(HA+*bqiu08+#FI*g0}Qq$PUWNc!hSPJA><1mvqfUE;j%Md9PpIxze#C{;p8FeM0 zxiM-zZ**W8v=jR>yzgN2WrB9{0;y}vXD!?pMVb1>IwI~ov!QWR5^AUAL8hT`T9OM< zdR4lW*~q9_4&#&Ns|y5A#=c;@KtvqMlO&!8trsH7>tUpo)S_Kt?Acy0MvxuZ3Lb-W zy>)cc^nMU}Gvk;fUg*t@N>4wS^DT_pL}chS zyTVR;MCcDAFGwvf^cKb-Nysl2mPHGrLIn)#Ow`DJvEl@*Mq3zlm<)w){wUMZ$jK$s z(#Q)Q|FM0o8v|ZeAU>^(F_KVS-2kM$(YzAM&^qpCAf1im%A{3ds82l74NhnqKQLL_ z4}8J{>0#Vv^3^cfyXbB7u0mSdne;K%hmq2t^{NqDm1JI78!xH?dCf>+f?9Qe3^ArM zxyfXhv7Jf(tMQ^K$c!)!FnPLqyl4w#q+!6T&zRDv4e_EEkkLjhCh;Yc#AqO6jJZq> zKba(^0hwT|WwHrKI*>GD50lw-;>8C*CL1@Im|*8~AXAJ%)hMh5_3}uqX~r%l@70bM z`#@%f(WN@ceEvk7I1OZ$v5LvPPm?5>V-&1GGD~jw#9tsY<dD_vheut~>ZFGJaq( z8$1-DorT6>CMmFPdJJS18G22!^F4=^VGNaIj=nE66m|F3kzpVZf6- zJB>wBCLQhrK>ol8yVE$pBmgfmBiUu7)TYpzfXoya8Fw3PnZ%xn6VpLvk1>YHxcx-- z8Jn0K`Z!)(gcu$$t}xl&DOThFIcV&vLzeqJ5+~w&z*^6^!lcvuc##*#QKLp(lG&UL zd!9g!8TFa;teqgL1Np`1!eq#@IME--abrRlc@xMJ%pb;5CQEFeNCR@&*vX_H%Um&XB%v`5=f-~; z#TucVGf|~^O?1_0&IJ299OJGUIg)sDt*b_{7o=9=6Xobz+f^gC=fJCm$ui2D-&G@p zNYs!TK9LFa`KmFRNg>!_z!#9O8j~dPQhGI_SHEh^kuubW{|cpZ)mX>`=YBDe_G`up zNz#Nm*OYA(X^e5ER7CfJGhN1HNzz2}z*zAfOogu-8;Hn}2>bcJj9n4rA4xJr>Oy!Y z0_^-{AnUIX}F~1^rZlX-h)&ryux}Ni?69Bujps#MMNS`69{q;ycj$%SmQ8 zk`Xo#%+(~buO#WdF3|sc0CtkhL8L`<03dnH@uZcA-y+d+-Uqbe;BI?fQ{AIimh+i2 z$&OHK{CwuS6qfK$ju9H9BA>aN$u9U7fTW-)no~+~&m4Ei3!6hF@ye^HIfrGwi;EUz zK&z;^B8)r-q?oxQjI;rwn@7V)7a#%iI+NMUVGRPrGLu?R=t#x_vCSvL$U8uan+=&f z{%V|9Q!+}FG$(|SsQiuo23Jbg4C zELSnNgvlgy6QZhlI!tCE$W%4+x5BiO9en@&8S^P7XlE_RJY%+&Bwg;{Z3R-zT*w6X zSNkNv>V|6_cqM%|Mt%$M$kD>|1)+v3vus_Gl&R^GGP}XsA?%_*Ywl&sg}_%styoy^ zm?y)?ehB?}^9B<;2WlqB)G=dQQ*HUEMuMnOO^AAC;V^OpwCbB>!$^_G;k=FcJd-vs zE+c7ZwhAL?r;*u($xNMOUN8rS5tM0cj$-mA$RKHAPG-^!EF)=Z(tdBci2eb-9zbhq zX3l1rH>^D3WhlYs=JqgxXV6-jXPEQ=5AZ0{+APq9Qi=p++L|d$I!DKf1L)f!Bu1?knZMbNz%n{u%9roHk>ChyQfm<6XE@Le;>FPX)X;TRe|(24=}j_ zzC(utdBtqdp0t)%g>Upg`k8x}oG2YDmI4`Irb6$DJ^z2B;>2noubT_Q$Oa%o%$rPl z-A)j@fDAV)yhvI|jsbbo>>|l5IbX%lN18WTrpvE1`x;|D-;uNy?0~fll<7FLc^FA4 z5A%65hsh7IaU!WNl8&87Yr?EJQ36Psxx6!x<@e%6k2>&$&Romn=?yR=f_c1twA8F{urZ8D=*o z2a3ju&Om0GeVJT_6-N&sv&>8;{SU-SGTUt2g~E!i3SL&=d(#|q9FsZE#z`{IT+O6e z;}|g!YTY~LaV9OHCJcERyqlU;UM4#k4dNtOU@m1+5xx!#NP_i+xr)gzMPX(F@p<1o z$0YvsXwe>O?+2#SmF&C?Z(AVw&>Y0%@m6u-oyzb%&fLnR^lLF<4%k^{o(v<~fh;%w z4I`(4d~Algk>zi9#ETpttIWD#I2zi_G40>wZ1YZGWq>_qG$y&Uz-agnI&)~ zH5kY?^D`#+F8Mn^zA?A6)+3vJqQ|RI;#)Jb2gb)6<90-hG7lp^NiA<@;9)YC!epMj z1n+G{Sk5%>hsoeo}af?=+VY zalL%+G;`0@JsCAu-)XMS71qv(u(Hf8xx&gaonDwO&&zjKL|C4T3Muh0Qul zntd1}d#$793MS7^N`jN#@P@Vdbr`|X^SHSujNl&8Df3Ji!ILw;nK?}UTbL*;uyfw5 z`3i;p_St=&K6c$=Wt(#^?CKciR3mjAaHhVF-3Tuaspmoa}&!iFbTDOM4y&H2C zlP%$iHT47zqr3k0sVpCLM|;iH1O8tm9#% zJCInbc|Wp)GH(Ehx59h=*+3Gl?^y=Nf`vfxSmISrYhh1#d&tVi1k<$?Wb#`ElQDf0 z#OFW?TBX7W=3ybLHItqovma!NSPPkyggvw~KpwO7{uEZ%YVmTH=5ecR7{R*wgjFw$ zTmvoL>d2(=zF5(EAe{TM3JxGUGxH^hL`aEYRb%o4c-ZR?GNzTvWHRixqyw?7RZPAa z10yVukQF>!DL4el3M&6(_n+0&}YLOf}8VN&DuB;f~{lGbKPyw+XH%DuWNWnCH` z@Akdtq3x8icIMJ59idg)Iw)nR$DRTDkuqhhbGc;7Smj>BRCqmGS*x)mUXPt(O<!{`Jx1?CTB{}2nx1?CP`|uQN0L!SpF2x!{BwtD`hC{Z$mz(SeGS97h5{V%Q;&)>+wNUUPyj;1HLXCSB){kJhs&yw!2FWv4*})V#dc8Xaq?*-<$)h#m#dRPx ztpQAKj*b=uhr(*h`jE-u)$lqb^w`f^hndvA9xob!Ol|Aj5VTCIfR}*Ow=&wfw`RW%mnIi-??WVLd5jDChTs zRtu}KB#lWAielQQX|N@Y01FbwV>SkDfpv^QkZ)@m(@SEJflpbEdte9HU1N0j&b zc2*a*GZlRI{Z#<`5m~QE;=KcvYE59G_ViM%<4ly#{8SZI9Qw=;LHFzt^qG&Oy;b2& zjB{2LhJ~bq^*oc!OkRvgdq=Bk==jK-xQ61owuvXNzaTTQ}9)NojPTAi5WJrgT}K>AsInK(@PTO%a#&I1gze4{XQ zua6oSQF{kk<)n-^%YB$kod}s!Nxb?q(5gNf!QpOfq2nYT5|a-If?jb}HwI6Q6+A5Njcm5zoYm-~NHS6;?KribeBCGR&$o zjM;OCYzeXi621bO>3Pb)FWYgA8DOtg8LHqU1pRuVZ6*S zxyC1wJb?(Vq=iSJer z!--ZKCPRR90Fq{PW-^P(WUDWexo{%B56HZ24Pw#@O8GS)Q><}J@YEq%o@%|#so!xvapBuNwfV&T*foK{_6b(G{x z)I!)_#eROFwU$Xkyxl1Y?X-LE6D@R8q3$6rw5m*cFs%2jT9Qx<=Rtq?zV(VE>Eb!~ zMz*mwl9^%T0;J-7YYme*Aaf1KB5O|=ISr%U2i9Mb(E1B^Q$MhLlQHykv2t93NE{g@ zGOUhFR=*O~#7H{LVrQS6azTa;C=1*1b}e&KTI=s(V?88KAY&IxJ

MXMScPV%ovz8F6tocm3!_Lxau(QgFosBZym*UlyGlz&eFR_|O zPnvIF{aF)HGuK$77$&_GH zYQ9h4$*a$;7EJEEPH!%(vqm$S125B|%zA4DljiWs8shYbcX?{fTV0_AuG>8j&xpz%neBXK)n_u4L*HTzV3N+3zqT@&Tz-}8 zY_*ClAUosO@;0k4lP9{8%yw%#ll~l^Z>%B@E~)?_AXuC>Ej z^}e*@&USWKM=iiWxB(9DMIEoNysvO7vAxZIFAj}!nxKCi~1;U zZIx-wlrr9KSf;f)1LNcEP-RA}q&yk5lFGC;NG&g=nbuV%Dy5lL=)(t7nrS^RiPz#X zt)`ODtm)8bxNBy$Wr8Ex&yu_pW(UuZ@3i_$lI|;e9L}YH%y-sICO5K(e9vjm68Hwz zJ&@ULt(P)c;ykQ?DvW_0Dpv+ceIWa+=*1Z4ERj<N*8`lj=1bz`;aO|%5}9LS<6q>R`>b_@$qtvC zl!S6DrX0Mv5K$A(T8}M7JD%UUvsN=EcoP|WiL+L3CUtDOiG0>N%;d?YG{!y5a0i$zx0WBLF+<9J^bA|##&fg_SFKvMwYpT z(ysi{{B8}9gl0rI!v1cpWf|-Nu&(}Y4f~X|l<)oDt%Z`Li6JAXKL2jTuazkk6+cN3 zgD1efQL7LWm8%!6Qj&}n%2&fhEAQuIS-rw=(HhSLeKp`Xc+r~6M7>#d$?CF>!Ws?v zgE72hZ6V^;x=U7(^(f=b3NBeWOw_F4l9hMEgED_udzdJhKe!%xWqLUxpD$a#NG-3n zT(+_$3Dhj}>Zn<%;zd6RaBv z25K#l1YS{uJ{`_r#Dhh@~1WEE3%BWwAZdOkP|>|Th2ZtUTwK+ z^*TUA^&5Asp-hyQr@K~#gCwJB)LpkmVQs-0b=R8lBZZ}E)IBRh5_%;WOZlF4_%O++ z8gkP?Yzkwvj8u1$u>^G3yxALANqTa>(*E-Hby^Hs+ z_3?R>NrU&jiJ-5TuVAc92v)d*1a{{>gZn8!e8CQPiFCW= z6Q{sVVsIRj8_QzF1t3YmRZKpenIvK-!?&AY^&F|?wzz!3>i;3}T3o(h?j9*$Fee5Q z4EGCE+sPNK97{yCoqWOEZ6|-Q7R#u%lRwy;h}$FO4~}7?>S6w1Y8+bjYF&ZgqIe>z z))ffSjC!n4wXQ&L70akvS0JeRF;(jd1ji@HIJ^B=!Qfm;yjoWBiuaL_44VfFecTJ(g{0U0J6XZR#3 z7ECTeGI(F_U6Any+cKHBCRVJ;11I-_gPGhv277T3LnAnbNq^WM+Y4G|aB@+yQ{)cR z4IrUlN--o}49f)vNRlS0(2_1ThMB9a{u*d(UeXtfQgj@vfa#!TFM;iM#Cor&Z9=DfDhZIt$t= zxQfYaXge66R>3NMl%Y9)p|{~CMQ|DuHAiX{OlP7-J+Q+B>rXMzY8@;X;FKPtv9g_8 zSFs<%9tf~0kEALU_c@U$fKQWee|oFK9cXn3wk}Tud$z+sItS-6!JaLC3Va<1 zuCGio*pF2K(j(aAIU@LKVOt=*gVk#j!B-210O=RpQ^>swM*c$9CWxV)o4Zb3Yw~pHy9Lhw^-nTx)PNtMe6H_)O ziTM!L)?ksg7&^5SB-?_GnP5vnvOS_d{3bY`Ww7mh3o_qC$b1`IDP_EGH{S*`nW#4S zZSXYN@%;#2Ax$Il8PivoF4_Zkl@zpx4}A+cy&HAn76%@aZ4~O zSV0mm$FhR2k&N%X0g2)|#5pTCoXM}SbDJZ{I3hybxy}l{#{}==&ln9m9l=#$r2I7S z?GudZKr!6dCssTIWOuMg80iRPU$Czv-g@xIpm>qA_CUGM1DPL#y@|M~I1-VoM}lcm zhH~{w(2A7#Dfn)f%r_wOQ*aeo_GO%plfEdA2G@s$g*RJ|27e~vru|s(HWN%&H@HWB zENFJ5IJboR!n?roFTue?T+1hdBbi{X9tW8d!HG6XdgT*_OjGBv{45lzqIe#)ZnF+=a$AU9F1MzCYnTT9H6FeieC|6&A z(9Z;Kk{vf)zXfxMxN-h1_~=U%A5~k<21_z&+?ZybXM+uxV0>DF<#WMRL|n@kgX@`K z&Flp-7lT`vV2-^h$vGl!=of=ayF8dxggL8B{%MLD($Vt6@NUXnE5q#W=`2;@re8A&|vomYZ&NJgw} z;uE)}%q}LqA59cRVC2gV4(dkfdhy=`@pCGi#R@K!#A`dZg11S=Z7H{cdAdt2U%AI% z2L|li3Kk*a=Gd)Z10v$LrLYPBnSX+lnW(hi4HoS|c9xB$x7h9mpCjVhxf>irM7%m4 zR%EbRzZX0$NtRG{?guCLq*SEOrMz%WIQ+egLyE7@ke&h4o+lja_%x{nBL-A3)O#!<|UnE}JDPY%> z#A`bR>;{r#MX9nVU}rE<%G}tL>FJy8RJeU3f15 zp%|{51?w-n4HJyvmp}}=8xxG-k3dYjuO!|+q-9SSjPddAv0C6cY?98)S;xIZV_(NwV#KnvWrL=uPjR0M~S#)Q7WP=JQ-CMrR>vE%Nuh`+1*EbF}z&>e2>_t znW&XQX?x5Vl2J4B()LXzSXVJOO52UcdZ{4NTN1D3mbTYQ;KJ7*RZJxGAFloiFy+3WQXEKmU1^bF5V|`;w z!A=jPw4$9lLs}LGSA+M4u|ia`w=wD8Ggb_MuqxYUn7q@2NEJKZOwy{@K0yovnW}a% zCc8eMoPWly!zABd@nRduJYyG}MOyEHO!T{On%B;ljf84u3XmH1{y8M`5yS^`qn3S# zNj%(UB9eD5$^04zXSzVEmOYBeQ3Gb?K%TSbGdTn~HUr4>_6;Vb8peopAhqox^C)zz z^NWDgwJS)HCI;@Oot*l1KS|)VIM^$|(CgbHSVpze`nE_%J6Y~-YJGcvBx&N)C5hq& zSgvpHVDkHbSaAuzNCW`ZNp_V?ffvb{-?G%*)){tS?& z_8unNH`AL_&1`c%<zERa+? z=RLBs-G=*LKswmn7kK13ARX<73yF+Kix)^FDgGKhQ$XRTKP8EDt}&?Coy47b-VMnd0MbAXJu&q?CVu_xFamyp)dhU6P+f<1-_ zdUzeY5Ka=>tCo6}X8@UDA7*l-K$7?hNVS!Ca25`dP z4Zo~>li_=1BM99ie@>*{#wBqRAb;9JeRfH{+E6oFg4Sx+PD>!E50LFo(`!U)luX?0 zZ>Zn!$RBWO5o_-nd*#QN8y6B)=%3n~n5YD2l zS!@5oM8)Sb`=TT?7A%1F^_hL^6B&AxO6hvLte+R5Y`4BFD^u>RD9tQm5MLy zS4b;S#d)Lsnj~JFH`;Hqj7sSydomN1icR)RCMp%1?01={RBX0ClEiy;ceA}-5=z%+ zkgm;k!Bv=wtf)>Dp#5lv-I)DmS*<#u~Ka<>5DW z6-ly$3MOVSWDd}+G_{aOFM3S_D00VlTq>6YbTSIym5)~*=zUy>cRNz zjmXt~_7EvUG0gh`?48<^iHIk@q<4z_Z{XzSm$i9U8YN>{R1Eu>@G~orO}CnKkeg^ zc)4-a{_7hrH+}-Gt9HR}$qwemSs*vu-Z=O|g183crv0vzq1KIY{@Y&1T53l0xBU$f z-;mSs(vQdA_C6-#f#5dJ-}Z5~bK$WV>0k7g8&<`Jv6B3wNWLR)l82((F1Y{%#{!Rt z7WBUP9arWbcoP{-auVZ`mUSuTV_g#8fkwSJmn?^~2Qe9NOVlN&n!tT4AU>D81#@g1&6Av) z9K)*($airbCwd2!SMmKc#^rVLNRk=#3D5oVIl3eh#LtJKMQ`Zq@;k#N@y<{caHcX* zHN1e6`$kv+H$JLYCldaxt)P^Nfe{41wc$8e$R+r#tpud2uuIgpwnv?BGcgreaz$Sa zWFB*NOX9V`$DNZ*RBQ5x`kwo^bCYE-6|KR}<4)h5XqonQ@XLtqtYm`iv6%=<)(t56C zyd<@pR3;9S=bfRFcr~hyvx|u;!Fo=w-Dt<#fobGSWTHx^ku#qOmd;m@ibl=~CRi4G zfV|)&?;$%_7AxStO`Y~kun+$kWSTh>nc(al_Z(U|bD5~qn5~@4OmOyI4o(uZc6@u$ zvRB92I-SD^uGZUfUG-)u?VJHp#+#+Ia|Z20J7?TkK|3e+ZlNcmW(Dn>5mJjn$FSN( zgq7+{CCjd_hE!+p{s+TKjR?z=QDLPzBc+xXR%%38?VYJ)*$u0`Q~$t&VYQD4%ac)I zwRf6HEw9|$J6)Nma&PYpl_X6R+mk5Ey}dL4AcjRV&s|VD9h^N(uqGS?@}hH760f{E zImVBul_p2(pFyUR(_E4Za&C-mxto*wi%&P_ebSQa!M{K&Qs$Kityi31q!!I`W0$~v zPv?pxUO(T*>3B%S$6aamaRx||E_OYVAR2>KA7`~Blv0dgA7=|`i5oLx#8fGh_b{dF z(OEHKFOa@YcS)$HMe?e%g=OZArghu^$2sy~=mVTOl2Bd6um(5>n5Z4a0nX`MG6S97 zN70TqTOQ~PWukT+Uvst`dr;;zXAcu4^SZO}=Lcn8cUDP~E?#^rPIO%ccS4=yUr+{o zF?}2(h5#AjbPXe8fDCm8gpmb6MmRZ=(7wbM@Dj>6C;3;jL$}zDfXsL&g9&;QMKaO( z=QzqxuZ6iW$tiMzh?;#(ax5llE-~3D%S6qi-g4?NQS+#`ot8v=Y92Mk>A*zIqoz3B zn5cQwRA(R)HIJI+j3Oe`tZAAvm5G`)O?S>QQM0Bw&Lbx&6>8Qr&ndw~&6?7kicHk3 z=^dvI6E#Pg@0@0$=1A{3T~Co^HAh5lBJB-KQDH!6LI_J#S#6OC!_kY#m*h6mF1S{ zVkhd1%nhF^)5T5_5uxhO5~sK%-pp#Llfp8pMlE&dW%(?ja(nJb-{MBp(6n!T@zsCBEIO{}GA-D>AF6IJWhINi@u zSgO{obJj6Yv*iuWE+(oTe&JkXqUzyBr{FoVqw3)%r?MoOLd~c*JB=lwIyMGs)Rz%8 z>PzP(vg4M{mrgGxs&u||b5-TfS1wWcv&9)eT5bt`9Z`Z?ovAFNa(=5*=RDN}m8)AL za&?>2mt@?wyv>=*MCIysr}>2kb9JZl0TY#n-#Ocvs65=|Tx6p1@O!7=?_@{Su^-%& zsyepYC900?b*iwIs$=_|mn2COBVkuI4RZc~Gm1&g%JdTD5$7{Wyz=@fqP&heS)}ET zgGb%f&D=TQR}CzCq~3&hu@J~FuFR8Nz#nxj5k^*y$xTMVd*UBIpfz$+y!Z;pao0}j zG@tkm$O)H3ZJ_%^F3DGIT)a3GE|YIJkYB?|9Nx>u7Uyck<%b>Vvk%A=OwJ?Y?8*Gz z2O1sBMNdTZekWyo!dG^R(8?|jPJfoPU`NFHJkZmz+l~Vr{vQ*e;b`g}CHodr-RqGcJ_B;q z8O3CDjXYvIkZfm~Bxzzg?4l#N?kr@P3x$&;`O8_!GT#rOGcY%tb1d`Q6`v@#0`^;+ z>_0H9G!dE|BkBS9+ljl3#M|NgC!)OmaUPK}G+OlnEsx;r6v^#~72+L7ms)9J=tjtm zbnukr%#wuWe)7(Uvx13Q!`_Rq^Dtswp;TaxG!{a?=PYE>+0Nm~E%jc*a!B?-mnFvy5d?yvSSp?9vLmN%b|2`!bx8{cC>hluzd-IORQfOt&k zS0=OXCNMe6mGy_OJK%tW25Obi`hqDm(*bS0Z|L+#`w zhIU<-p-anX2V{u&YJ5nZYVw4fzbJ+cnB)z0WHK@P!waijy*rga$D=&!kXj6_Zm-6QxYy&^adAOp1i`n`HTPFAA$@ zs5O&+m^>Pq%4FdL3hS{@CX+QxiiL8RoF7jzkB2J!O_pync_P%8NrBIkWPG&HQYJbR zJ#<`=rtwn7A1ZQ->?AV@gc=eN|ASQ|_RmJBH>Cp8sJD7@;P=UK>*_-#Kgqkx^p{ImW?@@gA!rMCY zq}CWBGCpKyktA7SER4C>-cv%GnOw_Bl;r7%7*-1XC}q4gb)`_g9Ey+H)2kF}K*Tq9 zChQ@#fO|lp&XT0T+XYk>l|p@)JPIcSvLIJ0g=RAO8T#-`K&pn+O|Gvh()onyp^v0Y zx=`*M7wgakCi9*F@5&HXtx&Q1lwd4DNo{ z4XIU0ESzt_vZ&{hHJ54rQ_qc0L09IKwCs%q^+JD1;*F>ELb-Qf>V;lzg>{U^Q!5BB z-Ma+K3rYRZzhRbff2;w=+1rb27%KQ5rpsIFH4L30;;!`?hH~%4c`|CP*D!QRYI&^y zEDHz{_6k%zY#i#&MAgG)p_!6+X>S?&L=vx*TZWD^QLUh5C?^Unr->h%)2oFoLw%!( z6sb*LG+Kp@6LH%`>(H7QDdXD@K1}d5LhH~Ml6YaY4xMA7!fGA5Nm`=y4^)D!L%H7> zX&o98D=oWWwR3B)zXY9FXct;9WxO*v?LxcaD9+!{OB8G0h26_gv3Mda3(`rR_MtjV z)OgxHG>M2CR{PL$UfMe2Kj z_#RAY*NE9p*U)4sL*FI_u7=4yk}U}-lPFmtOO1W|opaB*?>jT^9^c2$ALa3M&bjxVd+)jH`@UWY#*`+R$xp_L zU%*c9U`81v`gHQuV1Xq1C8$?}mCB+_C`z5Vyc(=7NviniONutH1{+IqII3EE>fNt~ z`^9<~sj=tw36pj_#%VJ7QHph%9N0kpU6Y$U4r=lx%q5Ci&VH=8oh7{~hg$1C9+x#~ z(xkYZ!EK7$Sva2ROKUY~T3oAgZt=8Yc|6rxm*MQMXr2cgEKcsbpZbN?`sW0-UQND( zc}r0{sXPbJGUJkp%WSJ$yj-_L_;54KzKUAThLqjGuX&^OqF>%GB{60#lk z4JI>5fg4=e5D1gQ^+hbQJ9uY*CK-&I2#gJgQ%?y(H;@xiGi69oF6bg6|Ls zN0NRKqfEcxTq!e3lpFwWfj}ROl<6Pb%QDqjrhkN;0m0Z?Fh8S2BbL!50HYOJemz)C z%A|`|E>qbD2G=t=2VWq?5q4nkY&_aY7r#7QMxN2X5sWFXNr_5A3<^3->cSn)K2WD` z1s@6q45!;@ zc}Q@cBuAt0=EECbz}|asOa;s#yj#encssaXl62AfE3z{*Xx%1D5jfa@?n4gcnZwbj z`m0OJ-`Ncdrjtzgw=lzknMA@l92VRriJmzOi>QlX!JniI%^W5}4u=H~Nuu*SJlMQq z(LBEsk)IL4kd#Rm=NFX_e}J74!RD2yE|81{Z;T9XmxRU?{I$;ig2O74jB{_a=-NC= zj1EpB5-!D<;1-raAKtYDe#0BQ=XTOUA7bsi7g4V9!ImT=?X(5)@!?*nz9%&y*ip*p z+0KMu!zyU`aCo*eA!4?pWz=kELa>?CN)H@t4DVS%ekKH4GdTqW=b{sW9VF3Softe! zGGf`C^qao-gO`}x=tA?BjNq24m>=?3Yxs7SY75vru8V0DZ$lu zQ4Up|P7NA&6Tv!d0W#Br?IqEzcV%HTjLlNx9Yzqk4fWL5?zv(~9qF>+14 zGB}&bc_0``Rt6L9lXW4w7-htExZ|-Z*jN(XyH^LNGEs57hrz*2YW+;(U?})5 zlb8dFjAl|XOfn?VJ`4pr*yNuWc#jC@NSlKpNp$qv9O1FNpyw6!SYGf`BGO}MCoh;I zNuC^q-7n!@ZiL6S2CMtz4Heb527^pgRNoq`#pK_gX%)FG*nr7(AUI3e7R-=Dmuq{l z;{8;vPW<-Bj^GSQbh&m!lxt_Oa&6Ljp63ZWgEfhS+s4k|d`WbF-x*P^oxv}q47J0n zQ1+eSIRM5?oCACx{DWmMW}?ilunfjbl=&gpU7m4_k~jQgm&30d!vtd{k{^TMZ1i`@ zS@6Z8szCOHiFY+1flPXMp4wFCo#)~PqUYfS!Imte@>3A3Rj+7%E=J_%a`0J}QTe$V?8!vs=XzL6<>zKFe`sl0c9owf zqxeW2W1M0;DnIb`_Xb7t6KhmuqWlwQ6wgl?!($nhpK``jCMrL-8pZQdJ|aIAjSr<( zdZ6!adc&=vk8N>S|hS8kK`@EB57&Dmcd6ib0hOwQ=Mc#8Tj2ld< z-A?-ehH-Zbv`jPV(@;B5QYLD*&@ysc$<)K~*)r-psR_;{EQ5Bx^&YHkG?p@YRbm^< zh=f-qwo!Z!R?DbWiEVr(wL;u+xT6QJkbO8zP3LD_i~MxiP2E5khtd1 z8n>+uR@M57$IscSTDjpYi7N9vRjoq^Oh=mcEbsUKmdzR^-@=^fYl zM)9+o`o=CPlNPv8md+yU8>JGZ4+Gtv49Hb>eZyq3XeUL0`o{f|=rh*(Mq`o@Z}3@d zedA*$s^``>mNGf`J)JVtH}*Uw(-LcJnt{|e-hLX1-WRQJq%pzK6I*Y6BfkyF;OI%@ zk|gQk+JlOi$V0|WCPTj}AtnQP*a)=8wDQCVkVyv8(D+aiZMli@sU#tI)g)FtxDrlA zjKxf%^7!<`_)!viJr7IT#Q2M4o`rYgiBJmC~G>q~6qst%oupp)5D$z7rBRU=Qu$9<)>3ax>$mOiNpC7Gb%W5!(U15fZ9g%?w`> zU9M)v!z`mxZ}uN)HI*`j(@JDJ>W+OgW4t7E)ADWbYBOWdGqTK`W#B zvnZ1)&)RT@p_Sn<@s|kk8)&sM5}0gzONc)unat!M5d3vRD`U1KN2BnbLtF>AA8y1y zhn9~ILnL-b_?4XlG3L>uzi<9gNvba1PlEWI7lbFOUqbyWarP(df~Y2(G&^_0GmXCb;e< zlF9_v-DtV9F;9}CQOBo5iwaP#&PK0pWCvH`DD%8AUXr6xSE^B*f8IF4WLI@Xs6E46 z9d1xm?vGkCx|1Dz^$zWHF|uAnqFX{2W4R={cXu&Dg=8=obcq-XUNH7Z89f%fU{vpc zmh}$R3lU?1mQiED3r0|CQGPJ37b4Q?Y9x^5@O|~JMzx+r)9M z2r*G@zK3y*iE8sbjp4n}vTi>w8-Z7dsMgZUNMfQ|OD`_FZY`Rq9`}k7l3MAa;WIJf zuGMf8-l+YmEQS2lAx6k#V|uhhZepI(jh3k-gRgFmgukX6{qcW=B4oNTQ4$>?(~XY`$zaqZD`p>Ea1k7hu~MA2CZAZ@fq{fx2)8jjd(8k;TLX zf)zEv$d-iW&nPp&Fh`T+R`IkmInijrq3~K^v>H8bgjNVMt{f!w$wj^X3 zUsC{j{R3!G>81Z(>lbK)y>%dvh#0*OsVPGtJuOnGpb0UcNnsbBqr(|hHN8d z25M0)qkpmuUlJWfvm>I7mQm3r+jvlF>ByEH5!n_P&B<~&vMn$s7fWkFL|R%#rM1AA zMQH`bb%U>+!d~~3KO)9WV11Ua?w@x7US00nEDj? zh4HVz@)pCDBvr=41NRH@ozX~=bn(@{0kH*E*;|bQCT&N>ihR)8Ze)B&r3e<37AGVr zzLT@l_=jYqY%5Yv_oGL`_x*guj zH5z154si}?=E7IMjd@IPrk4q?js0sJVS+QgCq@fVz->NN;7so=(7F&NIMW*iI!hUfKRdg_ zuNxv{t{X#($y_&PNund$jR>t9#{5EBZP&tg$&D{0Nf!r4(hC?jBgO(@ZX+4lHeLZO zVg4mao~YfAUY3qAZ=a9l(y7OoH6?*NCqKl96wrz>i=T1CnWLr5;i!HfGaY2&%o(I5 z(|X|>cwfRC{ux>(J5zz&YNmZoK3oM_%Yalgr$~|>xUrGGL34-sfh4Jc@|)u1Z08Ph z9?3|{*fOh{zeti7zNK@gc~+8;2=0m&uda&{cbac3#I*9no$y_=kwB`OsZ8p(i50C| z!8*-+p9z-qQ;@maoWsODT|(>va*w%~N%uZl{2HoDbT8E z?qhOfCH%SyG7>atY|0Y@b7`h$m}jL7tjIRRiIVGKuiG562=kmNUfUWco&sW-)?y?S zA*Tbe%`_sicD@7Rm?M^;%;BiXP>Mr9?l&h$k{NjK(-NZ3hA5F>u9iec+62>ErY&Pn zNiY{jko^&)_Ls%AG9t-MFjr^>l3*?+8JXv?GC##z)I(;OZe5i(88YSKYu00-je82JZ+X-S=4e{)09M8 zZf7P+qAj;KFG-^F+`$y9&`w?;YZu)j=wOzUq_9jCN%W3=2XhP)HP7r|7Lb;R3D8QR zgV}O53vny8y(HBCDGBQqj`X2 z0s;6PBF^VKntw==8mP>_Ozdc$VwsvO)5$EgMp_Ou?M>$?oy@9CZu}l6#zX3z%vwam z?SI6Hsgg8e5>+c!dvvp@fVZ zFPMqBB!f5D@$H(f<{~CLYLt9@4o)^G}z0B{KV5>v&ig`#9?Ze*YtZ%SfG~2;fD z;Y}x$dDT3^GT3^N^f6nmll}>pqOaLY68$y3zGi<(bSe5ql(eroOv+Fx@a@^YW*QUB zPs%3P8#Lc%f~lj-YvzZNP|wBjq8~>sy}sygE|M~OPo}@Qcs=G>uO|AN#ZNG`jGE#1 zH&;llP~g;vSb6KUznLour5=JD_BXc^5s&qw{rLfA`wh}RVpShH&mCZrljzJ3^e_Xs1*`FjV>*E0vTj>VAAC6fOs3o5c49FTY!uKGR%zIgj(9q z!%a^TJ+B*XHrg!99;N1W!%a|uKY8Vj!Pk-ScU$j-$)@u$;zQUq(_}S}I-6m?E-Z8V z(P&Y>5DAr2{uyB=%Cz)1wMUq{BuSTh7dsonPM}#OkNnexZ&r^mvm~LGNixS-X4}$e z@l+nB-uPS8N)y;N{sGUYnAwuh8QEHpNi(}_K^ba?7lDj6XMKl+PP_gDGR9mj3B3zi z=Ue!`x!GtdY2p0&WgrvG@sgy;`SVdoYod9A3C^E?0y4?G!~}Ore*-ebbheQl+$l|I z2Kz1Su~12@1 zPHUMNvxl^lo#kfIzM^)Po86fxnH;mx&qZZ&%tR(iW`#NLm!dK&%p4|4W~I3_zo^Vg z^BYMr1Kmr&n_%#dtIW+rMD6h<#o?_{K#nu{8pti%qQq)*_^)V(ddlrUzA~pW!E<4h z`PwXZP|AeAik@rU6+w#6S948uPY>rv_m78fMVXG&(lLCk*<2DG!@n^@Ot7Rl+W~S2 zQ>Q3_E$SQd5EG0EM6NSYbFFX8s)teQa9rCuG$;8cBJzJ@-pev7@_%F2CK5HgVL;4> zvVUW~%cMe+fE+8oF-J>sG)_g)Z_M|ZsF?YUIh~1$tKXPeOjHzIXJ$*Hy|K>RC`qRH z-=z|=H?23%N}}WZdb8B;SS~#_tvAa_LUxuwp4Xc-iHMXpONl%n8_h+e6&__ao4c5( z`1754Ns>&_9!8l%ptapx^oLAKj#f8->@uT{Akq2R9nn*Eo8_bo^^_Ld;eMuBO%fde zel+(Sm9-Ndn|?HpNRlqvPbeYZJ=kLoIF2$plI%6}iG*h$d(AVF==|)B$j@H0_|Cvy z^QzR+bEJJ{*%O#ns+h5vqSih$hl!fu?=urlk_@)G_jbS@k(qUhayV`%d=2e>_*%JH z^KX*DcDMv&elcsFCW3SRZ9wwP6ehTna}CHrGvOS{P#>(j6W-r2hyQ~lQ>=xXx<}#5 zM`z4kOisQYC)$C`Kc*-^8LD^e1?SB-CDG+NZ>BL(x_&gvpyAgZ{b0>Jo!ml;@aT@b0A*UsBo;XW=BGJCM7qYH>&?+Pn^=hLy-f`Ul88 zmRFjz>eh=Br=VOltqdk}Hc(nMt>a9T4{KV;$deWr-xVEg^|vS>=el z@KZqC02$NTB}t}0t@s~cjJImsf-*EKcmRlRr7*!cz{@~tTNQ65nIq8ZW&o*c9b&Qq zTHR_O^{k2UD3d9EbzqhP#QWYmRni(RzjKdz`Z@_#$7AR zW8wnAm1ZkzDiPVDaPQ(tYY&qdy(!MOwk|RGp_d|6Doe`(TS6+N-rCAxf_`2Ac5Z$fL zOz>M9)j{S(Yoa7NYW1+@Nuqmh4~urgs2w%|tsYjwU6dbehi!rMv{LRSg3+ckkY3g) zCg|rrKwhzi*B}{;HYn5EI?e>=y(vImwbtH)GP*AMTE$26zE**h(W7u*t9el8=OEbW zYt3MS`Khu8ey3?2F;IqjTsm)bPW!*j<6lf&)1OpP%GwsSqf3E2dxl?SxHPv@eb#(2+PB)*;0n?rsA4tn017S zI=vlc?WwKHj;G|qtYebsat*hxNTPE%+$viKwe%=F+!|7sh?<8Fx6&n{RU4i-zhk}6 zM4dQ~u(Ft_6Xy|Dr3Z9=MnZs3u{CcZlry|FGO30rSIaPieU$lSh7|vw+ly{EW0lvdrtTbZS2`LS~e;zL4cV!SbjG znKbK^l+i6J%^Ln7<)_CsieqWkdra_Nfx8dhw6qp8xsp$>jg7H>V6tF0X^pk6N>KJ9FSo0c^46aX+Otrj6 zh~PaUB-5-ej}gIpL`@q)gteAQ0^hgV4Bh~l=~h0=;LRc=Gpq(pNK4%;nrZD}f;Wps zfXqy*c2ktmJ>>%{nMj}=dA1Tn#D4-#@`L(<1oQB{%=6$S^GGL-QXrFj=7&&SDEZ72Ym<1HQzE@P${a^ z38TRoZFUl5SqSYVBL9PLoq(LbMC-Jc-KuiPCFCm}xz zt+hnLmKR$`B+<9`7hC^psqJ8^TWoD%g8hQXq9@5R_PEPG!CrwST9X#`3zYf7I>H3| z1(y8_YkVTfsM|hEtffyA!JdLLORVEeu&1D%rB<~zB!fML$RH-zQ;3XZqI$|wD~pM` zIlR=m#sqr`z6-I`N=PEh>c-tND~*Y|aktF+fr*L$%d8m8DEJwB3Z}ly>d8d)lx0?S zdy>JPf-!uV)v*H+yn{ztiO&!jl?vyp`{4^ORt}TYsU)-9I?e>|;9(-mE$dm*Qtdg% z8X$@8gE_n*Pd) zXA(OJ=4|kfYpgDkObWc|L0<K5@UMq9Sk=0a%#JBE-`HT?^McGz_}1$Nt34C!7ZrvJvB4U{MD>D=)=x~-3~i%z zg$cI#>JP(yf>pLFS;jU$ArZcDZh75_sGhRfs?(E*s`t&-Lrhe^*lcx{~8B3B&0vzj&jGdhtdR_2P{t>ctyP)QdNos26WEQ7_(TqF%hwM7?;k*?Orbmh^Cx zdhtffsP}C&QSaMmqTaXBM7?jLiF)5g6ZMvkChEl-P1K7wny43VG*K_!Xrf-c(L}v? zqltR)MiceojV9`So4jxhs`qWa4HNag&6Y4x@7rji-naQKETi7H(L}v(Q;6_OHJYfm zYcx@B*J!eY-^tNLz0RbGdO2rnI6vy;oUK-JPizS~vTe2em#G(EX709DOPO@>B)l6p z0#c8Z+0SX|@m&)&qV12cyx;29tElJqTfK>hDsXf7{jpJEzcr_r%+FRf%NSm)_~8J2 zg(AZ80c*@F(z3v{1MWE-u(Bl4qeH%Rnq^M&dsg`ocJd?2rHLxne`#G~%kpJ%$YH)! z{JoTe5v}E*mDpQ*qe4FHF@hFhrt!yUu z)hQ*l{;+b`4ieNlVg+6$|KKgb7C`>A;w1@*f-7_q`lscw%&l+|isy`fT2m$26deca zWgHogTAN5FJPIGPwi5|dEr=F#!SXRHrjJZ3P>0EJ>mf-(aY`Slsw8<)&jG<4p0pM+Iq)UT98OtVm>dW4 zGid#7mFtT+3`Ir#0sD~fR`B1JA<3o^s-$PEj*{rTl(W|7lH^78KOHMmKWi;#GUs}n zBH{2he;X{@ie?H7<&+9zGN~2Uw;L1-8#hNCXo6-ZdmaH(Q=wlzoWltb(Dnm***oC zo7P-Ov{$3-10)kZ#f!3!MaZ0qAQvOZO(KDB-+}%P`G~S(-=LDd3NHrWt8P&?jSl)g zK$Lwe$%r&4XZnWH~UV349|AvL9_B(~7mby(v8wE@{A~cPjD%Rc2DJ)MVxdiu9IRd7{o?`lU(0 z{w2cB??l3FBVeCpqDGlOgf{~AA5L0W`!m@Vz-SQoHA z8C<;VizLx?`d>LLKHmt~C5E6K@;vtLfL)D=TJ;C)2PFwbjfL-Jlgy(`vQp@`?=(CS?~owNc}eZmUqcN4S`_l z747?&+{hxC%65GwWj`jF+wDY2jz-mibNmpT%iLib(yMsax~g3+h5U?O#Wy7H zv}+QP`RQ;7*539-B4T$rI;E;%*GQ#W##r|@)O!uPBNNr%@3C(iDJ@GoxL8B&HUKQuUsINC%k)cF)ly^D5hU*#3@5#_*D2BFHqf zFEOdqy0n-JHbw|snyC(V{+R)Wn}8D?L|!5H;xexRE1B4 z+JUiXhidtEu=8|;f7;l|QYKTJnMQTd#@@x`$@fc%&wq!P86vcvvCED}%T%X%AoGk} zQ4(Dj&qioHYu6~I^{o8>6O0LH=Q+Cx6I|6c{sT@C>{d*0Rof0oC%Y39T-81gq_h1Z z6I|8y1oC{C;O-NWE;hXtGfLpv9MgKiPL^8Kq8@@?+0|Z6M2uYuuX{lWyW2?rdT{eU4AW47-`MO=V5cvUQ-mqISG0((`Ux5s^J2DvpesAR0D10>Zh%cK|l zinckBQFhBhGTnfr*$+)YE#2xyN3^=pb_*#(Z53~okG9)MqQ}!Qc4sE)=FAv7g^8L~ zjbBEqDxaIL2-?jmWfKbiVw)eNqzYl`(%tiTCZ8Oj!!~ zHp}?>P#(L1B$;9wdqsWNQkZ6MDA3vX^~y+V=6n|oXLg!EVgqcp|YdQQhVwrQbu|eeYnhq|G=NTlKAQ!k>V?b zW%fF$l_@sE{U00$m)Tbe5gg5z+hymXWgRzi?AsO;C&ex2*mp}A^6I82`0cIzpd^%M zY~d^IK}^)DWThQqqRw1a+TQ1w7TsVUc^rPRYiCQ6F8Zg(3Y=1{vb!uK864xVq^s>y zi;1X{$JKV(B}8zHTMc$r+w+zZ!7*+tkTrJ4WkhiQ`2diw?eR?TDp>HSVxxMX+dYBTkZYpk>m;WQq4BI-3F5Jy1@7bf8B0pFi9Rj<=SBn z+DJ01Mk#Wf$&yS(-r7VmX$#=@G~oFib`FyfW#E1kcx;D#T#|Ir?n-I#F_4{h{AScj z7i&6|7GD7Q-o7SDs#vrO>Kw=q_Srm=>3^{>ffDeQR(rq}N?k?c zz4o>5q)fQy?zI!PA<;cDN%TrQKO$=7+x#YBpv5-&4P8FZ7(;bw5RXWpXZXC0Z5)tbD&oMjZ2ehLj|1mqT8;On*$L!fmRFpVoUuB}A z#4)?kk7P%U7su>*OmMtF&mXh*?bN~#68gmx#^)1u%ul3+;|0c+ z6Lv=?I9?$6%Wk=!WYkTSlXmvcMAS`{lXmZ4h~RjEqs&Qr#sMNYUSNFw+xGH_sGBOM z?JOoZUf?Km+TMPUWK@(mtLjv|Tb|~|XYKeyB!gp0my_@XNxOk0x;>w>cSxcm$vOK^ z)>3nlbM{pxYL`zFwNG-+E^(OBQnho=uE<2?@SL42N#WEtkW9F3oU`|{ma4&XcE;~$ zIbHk@#zAa#=j^3NC@nPyIA@DLN#^>CCB@iN@MX;Kn2WWHV{U={nv}^Csy&~#he$%T zjF!*a7nrD$YNASd-oC*ys-)-b+m6cA!}0mN-At0yz@XRR-9Gpp;(7aJCTfTLygiu7 zU4POWZs+ayiO5r-UVp=PIqi>_s1|-9OjPO@>}-}%9=l*yIabs^7wq0l&>OhQzF?m{ zPBJ(nLUPgG{}&N#;Ycpofxn4h3rBL+X}qVrtI zDZT=#jf(luFL9LYAKb|5SD|iO5}%4nV3ni<$flUp2xp z_fBU$lXhEZhoPF&H-LH8`Kjg%mqh2env)SHy(%rg4wkDqN0_9<#)*|cf=*f)lBx4t zNpTX0>2xng-axNLorO0;oE#?De#!x<T6xq;3k=v>Qr2=qr;8+dU#p?>)NLrE=RXad!Aw+qZs@FHqEc_@9AcuP zRzoMHBH2OzV61z@sZ~kGgGm$iVN)kp68&4DW=?!%vaIGd z&77FqiKw>P%*kegaUK_f&71~RNCxA48^}jkA^_G!ODBs7MgSyFIzxk$ zLp91IIunV6NBl%*xg^>@iB3oo-C7czD{MzaNKI6POmt!l%8x30qBH9Y$Y7zmc-o1v zNk&Dsr=1Q&0=vghxt?}LNs=a1%Y53&Vl8F)X~%SAxx%GLa+*k@OOfPskVOBwGs&sw zp%(49b~*T_IJnK}cO)|K@ zItNH+r)(V}=a0nCgT5% z6aNC~<9zubX<<7Q|G=9V&LK(Ymx(wI4s@2(Lm6F)flf#gT{{DvSL#a{(dc8E^AB{! zFliMgha}M><3J~-0i~{D)Ig^|lC*Fs20Gaf6-|ARlP`%*eUNia68O#0+JJZzN-@Y; z|1fH0ijKYGL?Vzk9jhUc#CPIEXCQ+k+VeZkjz?r#ftU7C?0v`CD+$b>foz4f@H@^y zmf3N+w3r1m>JiS+t}uCo-#or`h+Zff;hbcdGQZGEH6xsVncNKof9*BGxyGaekd+Yq z-gROgrPN;qg8TFDI^~!Q{+ps!ic?9F)W8%V7^700yGTaff_odvmFgrh!Tl(lON@>v z>1b!Ul+ivM?Sx1x+y_THKN1NniJ^N1qn!gxlz&D$e@LSJGuk;NNoJtWg;;S2@-xP% z@tE{{U<8w~P6sB_n2dAAFj>gtJ?Cpl(gPz;lot8l!s&>!Ns`pSI3Qn?L9(4>!e6PF z;3PK2v~;YS;3P|uF4Eye7u@NZ;9OvGta(W$cQzp{6%QvkwV0@QIKgQmNxEn?g?9BJ zEh1r$O>jPzM0<6Dvw>s+HOIz^E8vX@&UZ{Qexx=w!P!GZJbX7y*8fGB+D&ySZUd6x ze8vPvYFq_OcGgOgE@DBeCdf>4F0u@c7pOJeso9L|;3(V-$V_K86C8z+%yKF=Cm9@t zk$m8cVS=MDlG)A`Nz%pRkX9S;?}yGUEl5l4Fns8!H6yOJaLxFk(^$&rxG~4+Ac^+R z9A`4yQTw!WoUfRu-yqC!eqf?TkU35P6E%OH<0L&!`9c5SFURLN$xPJRe2z1k33_7$ zlxvQY%>=!HB+JQRg5E&#iPPZ;vW(t9GS7)=S+wl)ofb^g?#g`URVM0pK=YjmOw>wq zzO#gh+FhCN>|uf{P29HG0gqO?Ju3pgFyh|?OAT6wSe0lO~XABe7>T;b+ zlIXJMI!Vu@H<%j{vDZ4?NhUl8SnFi6 zmg+leojFX@Jaes+%|u1Ewa#TGDzdG0DnC~=hijcgCYZx%P(rZ71an9vrXy*o+F9## zVWN86S|^u@x?i`}u{x2Kn)|JFl9*t9-GsVW=iJ(vWYkJwgOkJrYo`t5XM;0?iCQUa zaE>#_A9(Q~$tbBc+o<&e|m1uBdNzxmh+s4q>L_mo|DL0YS$=_<3?)umT8`o+pVY% z^PHa~(Y+wg`HhKcnR(7NCdxl~j@4b-5r;BpgoU(TLP9hAMNorz&aR$BaE5;p$Zn^` z%SiNI(_W_w6Se=m*XhuUWK>(->ojTGQ<>npU^9^4oCbYK2G<39fE;xuOOhI16P<7tOQPH1 z31=T^g;xqEoMREB_)g9V=U*v9XW6GAtrN}-Np#En%c+=*`O$NvznmjXuy?nCe*^Lw z$*8{kS42Df%ef|H(gVL%r!VFG<;3(ut@OZOKroK|<&={|w}g{URVJ#B!nSzkzIALRL_bG{J48GcE(`2E#VZp^*cMucRPfNMOnJCYfa&wrVS26kp+*3?c`w6(k_X+~;fHyJEy6ge> zs3bb|fE)W3c~wQWfLlot+K|5G1;G%D8VxqH|crog#_uJ7wH?OqAs^ZnL*3&+0aB8Fz>zg)P6wGHRqQ<9zxty|oilIT+0;?@{OIaD=xi#wZ% zioNk}!ElmMH5l(^yh{Z81%9VE-d!Y#POH4zGX-UITIJn@RMJuq!EnHKVcQYi(6loPoiMV&*EWj;b8SIsNAW!Apr_xCadnMYr&F#kodnFMy ztHfT3vx3{)43@!pLYFJBv*sRQg0uI&K<;!Kj3&!!q`uc}G?s{}3n0^p;0%8cXx;0E zW+O=#&F9c-*!R1;BuSO8I9>pm+V1Q*q=j>SoU7M$8+}9s=ls~;A8?mu5y3fs8?cz* zcK?`&n)4^PEk7Zme(9g!#(#<=T`ZnY?I*$gkjY13a)?NH#hTz2e1=-O1{2(r1=3C- znc|~Ng4^+PDHE7wmJvrD#2jWYSeX{=Gr_ij^;ORu&ji~c zk>ir&MJdnMbGs}eJE}d`bHA4)T?9U*-@Y|);}**tia%S$$sOQ_+-6K_Eu=3AKJ323 z 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%0D$9ilbMAn%*t#*(8DpCMW%6TE-* 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/>7MWYrc3{+55Un{^^9YzK#e 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́F6te+DcWcKu`(`Wq`({O>|2w*W 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

((Z1!}1VhN+XaIkfX968k=6r+rWS)|?+ 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