diff --git a/Live/CWX_DebugTool/types/callbacks/BotCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/BotCallbacks.d.ts
index 2db60dc..827015e 100644
--- a/Live/CWX_DebugTool/types/callbacks/BotCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/BotCallbacks.d.ts
@@ -8,8 +8,29 @@ export declare class BotCallbacks {
     protected botController: BotController;
     protected httpResponse: HttpResponseUtil;
     constructor(botController: BotController, httpResponse: HttpResponseUtil);
+    /**
+     * Handle singleplayer/settings/bot/limit
+     * @returns string
+     */
     getBotLimit(url: string, info: IEmptyRequestData, sessionID: string): string;
+    /**
+     * Handle singleplayer/settings/bot/difficulty
+     * @returns string
+     */
     getBotDifficulty(url: string, info: IEmptyRequestData, sessionID: string): string;
+    /**
+     * Handle client/game/bot/generate
+     * @returns IGetBodyResponseData
+     */
     generateBots(url: string, info: IGenerateBotsRequestData, sessionID: string): IGetBodyResponseData<IBotBase[]>;
+    /**
+     * Handle singleplayer/settings/bot/maxCap
+     * @returns string
+     */
     getBotCap(): string;
+    /**
+     * Handle singleplayer/settings/bot/getBotBehaviours
+     * @returns string
+     */
+    getBotBehaviours(): string;
 }
diff --git a/Live/CWX_DebugTool/types/callbacks/CustomizationCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/CustomizationCallbacks.d.ts
index 3bab8c0..75d5701 100644
--- a/Live/CWX_DebugTool/types/callbacks/CustomizationCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/CustomizationCallbacks.d.ts
@@ -3,6 +3,7 @@ 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 { IGetSuitsResponse } from "../models/eft/customization/IGetSuitsResponse";
 import { IWearClothingRequestData } from "../models/eft/customization/IWearClothingRequestData";
 import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData";
 import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse";
@@ -13,10 +14,15 @@ export declare class CustomizationCallbacks {
     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[];
-    }>;
+    /**
+     * Handles client/trading/customization/storage
+     * @returns
+     */
+    getSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IGetSuitsResponse>;
+    /**
+     * Handles client/trading/customization
+     * @returns ISuit[]
+     */
     getTraderSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ISuit[]>;
     wearClothing(pmcData: IPmcData, body: IWearClothingRequestData, sessionID: string): IItemEventRouterResponse;
     buyClothing(pmcData: IPmcData, body: IBuyClothingRequestData, sessionID: string): IItemEventRouterResponse;
diff --git a/Live/CWX_DebugTool/types/callbacks/DataCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/DataCallbacks.d.ts
index 04566ff..2efcf81 100644
--- a/Live/CWX_DebugTool/types/callbacks/DataCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/DataCallbacks.d.ts
@@ -12,15 +12,42 @@ import { ILanguageBase } from "../models/spt/server/ILocaleBase";
 import { ISettingsBase } from "../models/spt/server/ISettingsBase";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { HttpResponseUtil } from "../utils/HttpResponseUtil";
+/**
+ * Handle client requests
+ */
 export declare class DataCallbacks {
     protected httpResponse: HttpResponseUtil;
     protected databaseServer: DatabaseServer;
     constructor(httpResponse: HttpResponseUtil, databaseServer: DatabaseServer);
+    /**
+     * Handles client/settings
+     * @returns ISettingsBase
+     */
     getSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ISettingsBase>;
+    /**
+     * Handles client/globals
+     * @returns IGlobals
+     */
     getGlobals(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IGlobals>;
+    /**
+     * Handles client/items
+     * @returns string
+     */
     getTemplateItems(url: string, info: IEmptyRequestData, sessionID: string): string;
+    /**
+     * Handles client/handbook/templates
+     * @returns IHandbookBase
+     */
     getTemplateHandbook(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IHandbookBase>;
+    /**
+     * Handles client/customization
+     * @returns Record<string, ICustomizationItem
+     */
     getTemplateSuits(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<Record<string, ICustomizationItem>>;
+    /**
+     * Handles client/account/customization
+     * @returns string[]
+     */
     getTemplateCharacter(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<string[]>;
     getTemplateQuests(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IQuest[]>;
     getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IHideoutSettingsBase>;
@@ -28,6 +55,6 @@ export declare class DataCallbacks {
     gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IHideoutProduction[]>;
     getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IHideoutScavCase[]>;
     getLocalesLanguages(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ILanguageBase[]>;
-    getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<any>;
+    getLocalesMenu(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<string>;
     getLocalesGlobal(url: string, info: IEmptyRequestData, sessionID: string): string;
 }
diff --git a/Live/CWX_DebugTool/types/callbacks/DialogueCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/DialogueCallbacks.d.ts
index 634f90b..7b2eeae 100644
--- a/Live/CWX_DebugTool/types/callbacks/DialogueCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/DialogueCallbacks.d.ts
@@ -26,15 +26,27 @@ export declare class DialogueCallbacks extends OnUpdate {
     protected httpResponse: HttpResponseUtil;
     protected dialogueController: DialogueController;
     constructor(hashUtil: HashUtil, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, dialogueController: DialogueController);
+    /**
+     * Handles client/friend/list
+     * @returns IGetFriendListDataResponse
+     */
     getFriendList(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IGetFriendListDataResponse>;
+    /**
+     * Handles client/chatServer/list
+     * @returns
+     */
     getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData<any[]>;
     getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData<DialogueInfo[]>;
     getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData<IGetMailDialogViewResponseData>;
-    getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData<any>;
+    getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData<DialogueInfo>;
     removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData<any[]>;
     pinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData<any[]>;
     unpinDialog(url: string, info: IPinDialogRequestData, sessionID: string): IGetBodyResponseData<any[]>;
     setRead(url: string, info: ISetDialogReadRequestData, sessionID: string): IGetBodyResponseData<any[]>;
+    /**
+     * Handles client/mail/dialog/getAllAttachments
+     * @returns IGetAllAttachmentsResponse
+     */
     getAllAttachments(url: string, info: IGetAllAttachmentsRequestData, sessionID: string): IGetBodyResponseData<IGetAllAttachmentsResponse>;
     listOutbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<any[]>;
     listInbox(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<any[]>;
diff --git a/Live/CWX_DebugTool/types/callbacks/GameCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/GameCallbacks.d.ts
index 5e4c240..3a6b7e6 100644
--- a/Live/CWX_DebugTool/types/callbacks/GameCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/GameCallbacks.d.ts
@@ -3,6 +3,9 @@ import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData";
 import { ICheckVersionResponse } from "../models/eft/game/ICheckVersionResponse";
 import { IGameConfigResponse } from "../models/eft/game/IGameConfigResponse";
 import { IGameEmptyCrcRequestData } from "../models/eft/game/IGameEmptyCrcRequestData";
+import { IGameKeepAliveResponse } from "../models/eft/game/IGameKeepAliveResponse";
+import { IGameLogoutResponseData } from "../models/eft/game/IGameLogoutResponseData";
+import { IGameStartResponse } from "../models/eft/game/IGameStartResponse";
 import { IReportNicknameRequestData } from "../models/eft/game/IReportNicknameRequestData";
 import { IServerDetails } from "../models/eft/game/IServerDetails";
 import { IVersionValidateRequestData } from "../models/eft/game/IVersionValidateRequestData";
@@ -15,13 +18,37 @@ declare class GameCallbacks {
     protected watermark: Watermark;
     protected gameController: GameController;
     constructor(httpResponse: HttpResponseUtil, watermark: Watermark, gameController: GameController);
+    /**
+     * Handle client/game/version/validate
+     * @returns INullResponseData
+     */
     versionValidate(url: string, info: IVersionValidateRequestData, sessionID: string): INullResponseData;
-    gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<any>;
-    gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<any>;
+    /**
+     * Handle client/game/start
+     * @returns IGameStartResponse
+     */
+    gameStart(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IGameStartResponse>;
+    /**
+     * Handle client/game/logout
+     * @returns IGameLogoutResponseData
+     */
+    gameLogout(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IGameLogoutResponseData>;
+    /**
+     * Handle client/game/config
+     * @returns IGameConfigResponse
+     */
     getGameConfig(url: string, info: IGameEmptyCrcRequestData, sessionID: string): IGetBodyResponseData<IGameConfigResponse>;
     getServer(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IServerDetails[]>;
     validateGameVersion(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ICheckVersionResponse>;
-    gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<any>;
+    /**
+     * Handle client/game/keepalive
+     * @returns IGameKeepAliveResponse
+     */
+    gameKeepalive(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IGameKeepAliveResponse>;
+    /**
+     * Handle singleplayer/settings/version
+     * @returns string
+     */
     getVersion(url: string, info: IEmptyRequestData, sessionID: string): string;
     reportNickname(url: string, info: IReportNicknameRequestData, sessionID: string): INullResponseData;
 }
diff --git a/Live/CWX_DebugTool/types/callbacks/HealthCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/HealthCallbacks.d.ts
index 8672be7..7edf03e 100644
--- a/Live/CWX_DebugTool/types/callbacks/HealthCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/HealthCallbacks.d.ts
@@ -21,7 +21,19 @@ export declare class HealthCallbacks {
      * @returns empty response, no data sent back to client
      */
     syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData<string>;
+    /**
+     * Handle Eat
+     * @returns IItemEventRouterResponse
+     */
     offraidEat(pmcData: IPmcData, body: IOffraidEatRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle Heal
+     * @returns IItemEventRouterResponse
+     */
     offraidHeal(pmcData: IPmcData, body: IOffraidHealRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle RestoreHealth
+     * @returns IItemEventRouterResponse
+     */
     healthTreatment(pmcData: IPmcData, info: IHealthTreatmentRequestData, sessionID: string): IItemEventRouterResponse;
 }
diff --git a/Live/CWX_DebugTool/types/callbacks/HideoutCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/HideoutCallbacks.d.ts
index 99ab4c9..e39e806 100644
--- a/Live/CWX_DebugTool/types/callbacks/HideoutCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/HideoutCallbacks.d.ts
@@ -19,14 +19,77 @@ export declare class HideoutCallbacks extends OnUpdate {
     protected hideoutConfig: IHideoutConfig;
     constructor(hideoutController: HideoutController, // TODO: delay needed
     configServer: ConfigServer);
+    /**
+     * Handle HideoutUpgrade
+     * @param pmcData
+     * @param body
+     * @param sessionID
+     * @returns
+     */
     upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle HideoutUpgradeComplete
+     * @param pmcData
+     * @param body
+     * @param sessionID
+     * @returns
+     */
     upgradeComplete(pmcData: IPmcData, body: IHideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle HideoutPutItemsInAreaSlots
+     * @param pmcData
+     * @param body
+     * @param sessionID
+     * @returns
+     */
     putItemsInAreaSlots(pmcData: IPmcData, body: IHideoutPutItemInRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle HideoutTakeItemsFromAreaSlots
+     * @param pmcData
+     * @param body
+     * @param sessionID
+     * @returns
+     */
     takeItemsFromAreaSlots(pmcData: IPmcData, body: IHideoutTakeItemOutRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle HideoutToggleArea
+     * @param pmcData
+     * @param body
+     * @param sessionID
+     * @returns
+     */
     toggleArea(pmcData: IPmcData, body: IHideoutToggleAreaRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle HideoutSingleProductionStart
+     * @param pmcData
+     * @param body
+     * @param sessionID
+     * @returns
+     */
     singleProductionStart(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle HideoutScavCaseProductionStart
+     * @param pmcData
+     * @param body
+     * @param sessionID
+     * @returns
+     */
     scavCaseProductionStart(pmcData: IPmcData, body: IHideoutScavCaseStartRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle HideoutContinuousProductionStart
+     * @param pmcData
+     * @param body
+     * @param sessionID
+     * @returns
+     */
     continuousProductionStart(pmcData: IPmcData, body: IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle HideoutTakeProduction
+     * @param pmcData
+     * @param body
+     * @param sessionID
+     * @returns
+     */
     takeProduction(pmcData: IPmcData, body: IHideoutTakeProductionRequestData, sessionID: string): IItemEventRouterResponse;
     onUpdate(timeSinceLastRun: number): boolean;
     getRoute(): string;
diff --git a/Live/CWX_DebugTool/types/callbacks/InraidCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/InraidCallbacks.d.ts
index 05bcce4..918bfaf 100644
--- a/Live/CWX_DebugTool/types/callbacks/InraidCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/InraidCallbacks.d.ts
@@ -1,23 +1,49 @@
 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";
+/**
+ * Handle client requests
+ */
 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);
+    constructor(inraidController: InraidController, httpResponse: HttpResponseUtil);
+    /**
+     * Handle client/location/getLocalloot
+     * @param url
+     * @param info register player request
+     * @param sessionID Session id
+     * @returns Null http response
+     */
     registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData;
+    /**
+     * Handle raid/profile/save
+     * @param url
+     * @param info Save progress request
+     * @param sessionID Session id
+     * @returns Null http response
+     */
     saveProgress(url: string, info: ISaveProgressRequestData, sessionID: string): INullResponseData;
+    /**
+     * Handle singleplayer/settings/raid/endstate
+     * @returns
+     */
     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;
+    /**
+     * Handle singleplayer/settings/raid/menu
+     * @returns JSON as string
+     */
+    getRaidMenuSettings(): string;
+    /**
+     * Handle singleplayer/settings/weapon/durability
+     * @returns
+     */
+    getWeaponDurability(): string;
+    /**
+     * Handle singleplayer/airdrop/config
+     * @returns JSON as string
+     */
+    getAirdropConfig(): string;
 }
diff --git a/Live/CWX_DebugTool/types/callbacks/InsuranceCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/InsuranceCallbacks.d.ts
index 8835ba2..a171e1c 100644
--- a/Live/CWX_DebugTool/types/callbacks/InsuranceCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/InsuranceCallbacks.d.ts
@@ -17,7 +17,15 @@ export declare class InsuranceCallbacks extends OnUpdate {
     protected configServer: ConfigServer;
     protected insuranceConfig: IInsuranceConfig;
     constructor(insuranceController: InsuranceController, insuranceService: InsuranceService, httpResponse: HttpResponseUtil, configServer: ConfigServer);
+    /**
+     * Handle client/insurance/items/list/cost
+     * @returns IGetInsuranceCostResponseData
+     */
     getInsuranceCost(url: string, info: IGetInsuranceCostRequestData, sessionID: string): IGetBodyResponseData<IGetInsuranceCostResponseData>;
+    /**
+     * Handle Insure
+     * @returns IItemEventRouterResponse
+     */
     insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse;
     onUpdate(secondsSinceLastRun: number): boolean;
     getRoute(): string;
diff --git a/Live/CWX_DebugTool/types/callbacks/InventoryCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/InventoryCallbacks.d.ts
index 9ab1486..46bf6fd 100644
--- a/Live/CWX_DebugTool/types/callbacks/InventoryCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/InventoryCallbacks.d.ts
@@ -16,6 +16,7 @@ import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwa
 import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData";
 import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData";
 import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData";
+import { IOpenRandomLootContainerRequestData } from "../models/eft/inventory/IOpenRandomLootContainerRequestData";
 import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse";
 export declare class InventoryCallbacks {
     protected inventoryController: InventoryController;
@@ -36,4 +37,5 @@ export declare class InventoryCallbacks {
     createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse;
     deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse;
     editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse;
+    openRandomLootContainer(pmcData: IPmcData, body: IOpenRandomLootContainerRequestData, sessionID: string): IItemEventRouterResponse;
 }
diff --git a/Live/CWX_DebugTool/types/callbacks/ItemEventCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/ItemEventCallbacks.d.ts
index f4f04f9..fbb0b5f 100644
--- a/Live/CWX_DebugTool/types/callbacks/ItemEventCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/ItemEventCallbacks.d.ts
@@ -1,4 +1,5 @@
 import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData";
+import { Warning } from "../models/eft/itemEvent/IItemEventRouterBase";
 import { IItemEventRouterRequest } from "../models/eft/itemEvent/IItemEventRouterRequest";
 import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse";
 import { ItemEventRouter } from "../routers/ItemEventRouter";
@@ -8,4 +9,5 @@ export declare class ItemEventCallbacks {
     protected itemEventRouter: ItemEventRouter;
     constructor(httpResponse: HttpResponseUtil, itemEventRouter: ItemEventRouter);
     handleEvents(url: string, info: IItemEventRouterRequest, sessionID: string): IGetBodyResponseData<IItemEventRouterResponse>;
+    protected getErrorCode(warnings: Warning[]): number;
 }
diff --git a/Live/CWX_DebugTool/types/callbacks/MatchCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/MatchCallbacks.d.ts
index 2a92ef5..10fbc44 100644
--- a/Live/CWX_DebugTool/types/callbacks/MatchCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/MatchCallbacks.d.ts
@@ -34,6 +34,10 @@ export declare class MatchCallbacks {
     serverAvailable(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<any> | IGetBodyResponseData<true>;
     joinMatch(url: string, info: IJoinMatchRequestData, sessionID: string): IGetBodyResponseData<IJoinMatchResult[]>;
     getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData<string>;
+    /**
+     * Handle client/match/group/status
+     * @returns
+     */
     getGroupStatus(url: string, info: IGetGroupStatusRequestData, sessionID: string): IGetBodyResponseData<any>;
     createGroup(url: string, info: ICreateGroupRequestData, sessionID: string): IGetBodyResponseData<any>;
     deleteGroup(url: string, info: any, sessionID: string): INullResponseData;
diff --git a/Live/CWX_DebugTool/types/callbacks/NotifierCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/NotifierCallbacks.d.ts
index c42058f..fab325b 100644
--- a/Live/CWX_DebugTool/types/callbacks/NotifierCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/NotifierCallbacks.d.ts
@@ -4,6 +4,7 @@ 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 { ISelectProfileResponse } from "../models/eft/notifier/ISelectProfileResponse";
 import { HttpResponseUtil } from "../utils/HttpResponseUtil";
 export declare class NotifierCallbacks {
     protected httpServerHelper: HttpServerHelper;
@@ -19,6 +20,10 @@ export declare class NotifierCallbacks {
     sendNotification(sessionID: string, req: any, resp: any, data: any): void;
     getNotifier(url: string, info: any, sessionID: string): IGetBodyResponseData<any[]>;
     createNotifierChannel(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<INotifierChannel>;
-    selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData<any>;
+    /**
+     * Handle client/game/profile/select
+     * @returns ISelectProfileResponse
+     */
+    selectProfile(url: string, info: ISelectProfileRequestData, sessionID: string): IGetBodyResponseData<ISelectProfileResponse>;
     notify(url: string, info: any, sessionID: string): string;
 }
diff --git a/Live/CWX_DebugTool/types/callbacks/QuestCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/QuestCallbacks.d.ts
index 559c29e..2a3eb20 100644
--- a/Live/CWX_DebugTool/types/callbacks/QuestCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/QuestCallbacks.d.ts
@@ -21,6 +21,13 @@ export declare class QuestCallbacks {
     acceptQuest(pmcData: IPmcData, body: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse;
     completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse;
     handoverQuest(pmcData: IPmcData, body: IHandoverQuestRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle client/quest/list
+     * @param url
+     * @param info
+     * @param sessionID
+     * @returns
+     */
     listQuests(url: string, info: IListQuestsRequestData, sessionID: string): IGetBodyResponseData<IQuest[]>;
     activityPeriods(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IPmcDataRepeatableQuest[]>;
 }
diff --git a/Live/CWX_DebugTool/types/callbacks/RagfairCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/RagfairCallbacks.d.ts
index c609f2f..37f3807 100644
--- a/Live/CWX_DebugTool/types/callbacks/RagfairCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/RagfairCallbacks.d.ts
@@ -35,7 +35,7 @@ export declare class RagfairCallbacks extends OnLoadOnUpdate {
     getRoute(): string;
     search(url: string, info: ISearchRequestData, sessionID: string): IGetBodyResponseData<IGetOffersResult>;
     getMarketPrice(url: string, info: IGetMarketPriceRequestData, sessionID: string): IGetBodyResponseData<IGetItemPriceResult>;
-    getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<any>;
+    getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<Record<string, number>>;
     addOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse;
     removeOffer(pmcData: IPmcData, info: IRemoveOfferRequestData, sessionID: string): IItemEventRouterResponse;
     extendOffer(pmcData: IPmcData, info: IExtendOfferRequestData, sessionID: string): IItemEventRouterResponse;
diff --git a/Live/CWX_DebugTool/types/callbacks/TraderCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/TraderCallbacks.d.ts
index e4fd099..40a1455 100644
--- a/Live/CWX_DebugTool/types/callbacks/TraderCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/TraderCallbacks.d.ts
@@ -12,6 +12,10 @@ export declare class TraderCallbacks extends OnLoadOnUpdate {
     onUpdate(): boolean;
     getRoute(): string;
     getTraderSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ITraderBase[]>;
+    /**
+     * Handle client/trading/api/getUserAssortPrice/trader
+     * @returns
+     */
     getProfilePurchases(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<Record<string, IBarterScheme[][]>>;
     getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ITraderBase>;
     getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ITraderAssort>;
diff --git a/Live/CWX_DebugTool/types/callbacks/WeatherCallbacks.d.ts b/Live/CWX_DebugTool/types/callbacks/WeatherCallbacks.d.ts
index ae784c8..f9d2002 100644
--- a/Live/CWX_DebugTool/types/callbacks/WeatherCallbacks.d.ts
+++ b/Live/CWX_DebugTool/types/callbacks/WeatherCallbacks.d.ts
@@ -1,10 +1,15 @@
 import { WeatherController } from "../controllers/WeatherController";
 import { IEmptyRequestData } from "../models/eft/common/IEmptyRequestData";
 import { IGetBodyResponseData } from "../models/eft/httpResponse/IGetBodyResponseData";
+import { IWeatherData } from "../models/eft/weather/IWeatherData";
 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<any>;
+    /**
+     * Handle client/weather
+     * @returns IWeatherData
+     */
+    getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IWeatherData>;
 }
diff --git a/Live/CWX_DebugTool/types/context/ContextVariableType.d.ts b/Live/CWX_DebugTool/types/context/ContextVariableType.d.ts
index 5fc1704..a7dd9b5 100644
--- a/Live/CWX_DebugTool/types/context/ContextVariableType.d.ts
+++ b/Live/CWX_DebugTool/types/context/ContextVariableType.d.ts
@@ -1,4 +1,8 @@
 export declare enum ContextVariableType {
+    /** Logged in users session id */
     SESSION_ID = 0,
-    MATCH_INFO = 1
+    /** Currently acive raid information */
+    MATCH_INFO = 1,
+    /** Timestamp when client first connected */
+    CLIENT_START_TIMESTAMP = 2
 }
diff --git a/Live/CWX_DebugTool/types/controllers/BotController.d.ts b/Live/CWX_DebugTool/types/controllers/BotController.d.ts
index a5111d5..51c0c68 100644
--- a/Live/CWX_DebugTool/types/controllers/BotController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/BotController.d.ts
@@ -1,6 +1,9 @@
 import { ApplicationContext } from "../context/ApplicationContext";
 import { BotGenerator } from "../generators/BotGenerator";
+import { BotDifficultyHelper } from "../helpers/BotDifficultyHelper";
 import { BotHelper } from "../helpers/BotHelper";
+import { ProfileHelper } from "../helpers/ProfileHelper";
+import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper";
 import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData";
 import { IBotBase } from "../models/eft/common/tables/IBotBase";
 import { IBotCore } from "../models/eft/common/tables/IBotCore";
@@ -10,24 +13,34 @@ import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { BotGenerationCacheService } from "../services/BotGenerationCacheService";
-import { PmcAiService } from "../services/PmcAiService";
+import { LocalisationService } from "../services/LocalisationService";
+import { JsonUtil } from "../utils/JsonUtil";
 export declare class BotController {
     protected logger: ILogger;
     protected databaseServer: DatabaseServer;
     protected botGenerator: BotGenerator;
     protected botHelper: BotHelper;
-    protected pmcAiService: PmcAiService;
+    protected botDifficultyHelper: BotDifficultyHelper;
     protected botGenerationCacheService: BotGenerationCacheService;
+    protected localisationService: LocalisationService;
+    protected weightedRandomHelper: WeightedRandomHelper;
+    protected profileHelper: ProfileHelper;
     protected configServer: ConfigServer;
     protected applicationContext: ApplicationContext;
+    protected jsonUtil: JsonUtil;
     protected botConfig: IBotConfig;
-    constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, configServer: ConfigServer, applicationContext: ApplicationContext);
+    static readonly pmcTypeLabel = "PMC";
+    constructor(logger: ILogger, databaseServer: DatabaseServer, botGenerator: BotGenerator, botHelper: BotHelper, botDifficultyHelper: BotDifficultyHelper, botGenerationCacheService: BotGenerationCacheService, localisationService: LocalisationService, weightedRandomHelper: WeightedRandomHelper, profileHelper: ProfileHelper, configServer: ConfigServer, applicationContext: ApplicationContext, jsonUtil: JsonUtil);
     /**
      * Return the number of bot loadout varieties to be generated
      * @param type bot Type we want the loadout gen count for
-     * @returns
+     * @returns number of bots to generate
      */
     getBotPresetGenerationLimit(type: string): number;
+    /**
+     * Get the core.json difficulty settings from database\bots
+     * @returns IBotCore
+     */
     getBotCoreDifficulty(): IBotCore;
     /**
      * Get bot difficulty settings
@@ -37,7 +50,6 @@ export declare class BotController {
      * @returns Difficulty object
      */
     getBotDifficulty(type: string, difficulty: string): Difficulty;
-    protected getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty;
     /**
      * Generate bot profiles and store in cache
      * @param sessionId Session id
@@ -51,4 +63,5 @@ export declare class BotController {
      * @returns cap number
      */
     getBotCap(): number;
+    getPmcBotTypes(): Record<string, Record<string, Record<string, number>>>;
 }
diff --git a/Live/CWX_DebugTool/types/controllers/DialogueController.d.ts b/Live/CWX_DebugTool/types/controllers/DialogueController.d.ts
index 1b72522..9c8b728 100644
--- a/Live/CWX_DebugTool/types/controllers/DialogueController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/DialogueController.d.ts
@@ -23,7 +23,7 @@ export declare class DialogueController {
      * Get the content of a dialogue
      * @param dialogueID Dialog id
      * @param sessionID Session Id
-     * @returns
+     * @returns DialogueInfo
      */
     getDialogueInfo(dialogueID: string, sessionID: string): DialogueInfo;
     /**
diff --git a/Live/CWX_DebugTool/types/controllers/GameController.d.ts b/Live/CWX_DebugTool/types/controllers/GameController.d.ts
index 3bfbdb1..f4f5849 100644
--- a/Live/CWX_DebugTool/types/controllers/GameController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/GameController.d.ts
@@ -1,3 +1,4 @@
+import { ApplicationContext } from "../context/ApplicationContext";
 import { GameEventHelper } from "../helpers/GameEventHelper";
 import { HttpServerHelper } from "../helpers/HttpServerHelper";
 import { ProfileHelper } from "../helpers/ProfileHelper";
@@ -14,6 +15,7 @@ import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { LocaleService } from "../services/LocaleService";
+import { LocalisationService } from "../services/LocalisationService";
 import { ProfileFixerService } from "../services/ProfileFixerService";
 import { Watermark } from "../utils/Watermark";
 export declare class GameController {
@@ -24,14 +26,33 @@ export declare class GameController {
     protected localeService: LocaleService;
     protected profileHelper: ProfileHelper;
     protected profileFixerService: ProfileFixerService;
+    protected localisationService: LocalisationService;
     protected gameEventHelper: GameEventHelper;
+    protected applicationContext: ApplicationContext;
     protected configServer: ConfigServer;
     protected httpConfig: IHttpConfig;
     protected coreConfig: ICoreConfig;
-    constructor(logger: ILogger, databaseServer: DatabaseServer, watermark: Watermark, httpServerHelper: HttpServerHelper, localeService: LocaleService, profileHelper: ProfileHelper, profileFixerService: ProfileFixerService, gameEventHelper: GameEventHelper, configServer: ConfigServer);
-    gameStart(_url: string, _info: IEmptyRequestData, sessionID: string): void;
+    constructor(logger: ILogger, databaseServer: DatabaseServer, watermark: Watermark, httpServerHelper: HttpServerHelper, localeService: LocaleService, profileHelper: ProfileHelper, profileFixerService: ProfileFixerService, localisationService: LocalisationService, gameEventHelper: GameEventHelper, applicationContext: ApplicationContext, configServer: ConfigServer);
+    gameStart(_url: string, _info: IEmptyRequestData, sessionID: string, startTimeStampMS: number): void;
+    /**
+     * Check if current date falls inside any of the seasons events pased in, if so, handle them
+     * @param seasonalEvents events to check for
+     */
     protected checkForAndEnableSeasonalEvents(seasonalEvents: ISeasonalEvent[]): void;
+    /**
+     * Make adjusted to server code based on the name of the event passed in
+     * @param globalConfig globals.json
+     * @param eventName Name of the event to enable. e.g. Christmas
+     */
     protected updateGlobalEvents(globalConfig: Config, eventName: string): void;
+    /**
+     * Read in data from seasonalEvents.json and add found equipment items to bots
+     * @param eventName Name of the event to read equipment in from config
+     */
+    protected addEventGearToScavs(eventName: string): void;
+    /**
+     * Set Khorovod(dancing tree) chance to 100% on all maps that support it
+     */
     protected enableDancingTree(): void;
     /**
      * Make non-trigger-spawned raiders spawn earlier + always
@@ -40,5 +61,6 @@ export declare class GameController {
     protected logProfileDetails(fullProfile: IAkiProfile): void;
     getGameConfig(sessionID: string): IGameConfigResponse;
     getServer(): IServerDetails[];
+    protected addPumpkinsToScavBackpacks(): void;
     getValidGameVersion(): ICheckVersionResponse;
 }
diff --git a/Live/CWX_DebugTool/types/controllers/HideoutController.d.ts b/Live/CWX_DebugTool/types/controllers/HideoutController.d.ts
index ada5bd9..5b6507b 100644
--- a/Live/CWX_DebugTool/types/controllers/HideoutController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/HideoutController.d.ts
@@ -23,12 +23,13 @@ import { EventOutputHolder } from "../routers/EventOutputHolder";
 import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { SaveServer } from "../servers/SaveServer";
+import { LocalisationService } from "../services/LocalisationService";
 import { PlayerService } from "../services/PlayerService";
 import { HashUtil } from "../utils/HashUtil";
 import { HttpResponseUtil } from "../utils/HttpResponseUtil";
+import { JsonUtil } from "../utils/JsonUtil";
 import { RandomUtil } from "../utils/RandomUtil";
 import { TimeUtil } from "../utils/TimeUtil";
-import { JsonUtil } from "../utils/JsonUtil";
 export declare class HideoutController {
     protected logger: ILogger;
     protected hashUtil: HashUtil;
@@ -45,11 +46,12 @@ export declare class HideoutController {
     protected profileHelper: ProfileHelper;
     protected hideoutHelper: HideoutHelper;
     protected scavCaseRewardGenerator: ScavCaseRewardGenerator;
+    protected localisationService: LocalisationService;
     protected configServer: ConfigServer;
     protected jsonUtil: JsonUtil;
     protected static nameBackendCountersCrafting: string;
     protected hideoutConfig: IHideoutConfig;
-    constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, eventOutputHolder: EventOutputHolder, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, scavCaseRewardGenerator: ScavCaseRewardGenerator, configServer: ConfigServer, jsonUtil: JsonUtil);
+    constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, eventOutputHolder: EventOutputHolder, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, scavCaseRewardGenerator: ScavCaseRewardGenerator, localisationService: LocalisationService, configServer: ConfigServer, jsonUtil: JsonUtil);
     upgrade(pmcData: IPmcData, body: IHideoutUpgradeRequestData, sessionID: string): IItemEventRouterResponse;
     upgradeComplete(pmcData: IPmcData, body: HideoutUpgradeCompleteRequestData, sessionID: string): IItemEventRouterResponse;
     /**
diff --git a/Live/CWX_DebugTool/types/controllers/InraidController.d.ts b/Live/CWX_DebugTool/types/controllers/InraidController.d.ts
index e84eea1..39a6396 100644
--- a/Live/CWX_DebugTool/types/controllers/InraidController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/InraidController.d.ts
@@ -6,6 +6,7 @@ import { ProfileHelper } from "../helpers/ProfileHelper";
 import { QuestHelper } from "../helpers/QuestHelper";
 import { TraderHelper } from "../helpers/TraderHelper";
 import { IPmcData } from "../models/eft/common/IPmcData";
+import { Item } from "../models/eft/common/tables/IItem";
 import { IRegisterPlayerRequestData } from "../models/eft/inRaid/IRegisterPlayerRequestData";
 import { ISaveProgressRequestData } from "../models/eft/inRaid/ISaveProgressRequestData";
 import { IAirdropConfig } from "../models/spt/config/IAirdropConfig";
@@ -17,6 +18,9 @@ import { SaveServer } from "../servers/SaveServer";
 import { InsuranceService } from "../services/InsuranceService";
 import { JsonUtil } from "../utils/JsonUtil";
 import { TimeUtil } from "../utils/TimeUtil";
+/**
+ * Logic for handling In Raid callbacks
+ */
 export declare class InraidController {
     protected logger: ILogger;
     protected saveServer: SaveServer;
@@ -35,14 +39,42 @@ export declare class InraidController {
     protected airdropConfig: IAirdropConfig;
     protected inraidConfig: IInRaidConfig;
     constructor(logger: ILogger, saveServer: SaveServer, jsonUtil: JsonUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, questHelper: QuestHelper, itemHelper: ItemHelper, profileHelper: ProfileHelper, playerScavGenerator: PlayerScavGenerator, healthHelper: HealthHelper, traderHelper: TraderHelper, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, configServer: ConfigServer);
-    addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void;
-    saveProgress(offraidData: ISaveProgressRequestData, sessionID: string): void;
     /**
-     * Handle updating the profile post-pmc raid
+     * Save locationid to active profiles inraid object
+     * @param sessionID Session id
+     * @param info Register player request
+     */
+    addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void;
+    /**
+     * Save profile state to disk
+     * Handles pmc/pscav
+     * @param offraidData post-raid request data
+     * @param sessionID Session id
+     */
+    savePostRaidProgress(offraidData: ISaveProgressRequestData, sessionID: string): void;
+    /**
+     * Handle updating player profile post-pmc raid
      * @param sessionID session id
-     * @param offraidData post-raid data of raid
+     * @param offraidData post-raid data
      */
     protected savePmcProgress(sessionID: string, offraidData: ISaveProgressRequestData): void;
+    /**
+     * Make changes to pmc profile after they left raid dead,
+     * alter bodypart hp, handle insurance, delete inventory items, remove carried quest items
+     * @param postRaidSaveRequest post-raid save request
+     * @param pmcData pmc profile
+     * @param insuranceEnabled is insurance enabled
+     * @param preRaidGear gear player had before raid
+     * @param sessionID Session id
+     * @returns Updated profile object
+     */
+    protected performPostRaidActionsWhenDead(postRaidSaveRequest: ISaveProgressRequestData, pmcData: IPmcData, insuranceEnabled: boolean, preRaidGear: Item[], sessionID: string): IPmcData;
+    /**
+     * Adjust player characters bodypart hp if they left raid early
+     * @param postRaidSaveRequest post raid data
+     * @param pmcData player profile
+     */
+    protected updatePmcHealthPostRaid(postRaidSaveRequest: ISaveProgressRequestData, pmcData: IPmcData): void;
     /**
      * Reduce body part hp to % of max
      * @param pmcData profile to edit
@@ -68,7 +100,31 @@ export declare class InraidController {
      * @param isPlayerScav Was the player a pScav
      */
     protected markOrRemoveFoundInRaidItems(offraidData: ISaveProgressRequestData, pmcData: IPmcData, isPlayerScav: boolean): void;
+    /**
+     * Update profile after player completes scav raid
+     * @param scavData Scav profile
+     * @param sessionID Session id
+     * @param offraidData Post-raid save request
+     * @param pmcData Pmc profile
+     * @param isDead Is player dead
+     */
     protected handlePostRaidPlayerScavProcess(scavData: IPmcData, sessionID: string, offraidData: ISaveProgressRequestData, pmcData: IPmcData, isDead: boolean): void;
+    /**
+     * Update profile with scav karma values based on in-raid actions
+     * @param pmcData Pmc profile
+     * @param offraidData Post-raid save request
+     * @param scavData Scav profile
+     * @param sessionID Session id
+     */
     protected handlePostRaidPlayerScavKarmaChanges(pmcData: IPmcData, offraidData: ISaveProgressRequestData, scavData: IPmcData, sessionID: string): void;
+    /**
+     * Get the inraid config from configs/inraid.json
+     * @returns InRaid Config
+     */
+    getInraidConfig(): IInRaidConfig;
+    /**
+     * Get airdrop config from configs/airdrop.json
+     * @returns Airdrop config
+     */
     getAirdropConfig(): IAirdropConfig;
 }
diff --git a/Live/CWX_DebugTool/types/controllers/InsuranceController.d.ts b/Live/CWX_DebugTool/types/controllers/InsuranceController.d.ts
index 14bf129..54f31b5 100644
--- a/Live/CWX_DebugTool/types/controllers/InsuranceController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/InsuranceController.d.ts
@@ -30,8 +30,7 @@ export declare class InsuranceController {
     protected insuranceService: InsuranceService;
     protected configServer: ConfigServer;
     protected insuranceConfig: IInsuranceConfig;
-    constructor(logger: ILogger, randomUtil: RandomUtil, eventOutputHolder: EventOutputHolder, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, // TODO: delay required
-    insuranceService: InsuranceService, configServer: ConfigServer);
+    constructor(logger: ILogger, randomUtil: RandomUtil, eventOutputHolder: EventOutputHolder, timeUtil: TimeUtil, saveServer: SaveServer, databaseServer: DatabaseServer, itemHelper: ItemHelper, profileHelper: ProfileHelper, dialogueHelper: DialogueHelper, paymentService: PaymentService, insuranceService: InsuranceService, configServer: ConfigServer);
     processReturn(): void;
     insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse;
     /**
diff --git a/Live/CWX_DebugTool/types/controllers/InventoryController.d.ts b/Live/CWX_DebugTool/types/controllers/InventoryController.d.ts
index 6a1a21e..e1c08c0 100644
--- a/Live/CWX_DebugTool/types/controllers/InventoryController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/InventoryController.d.ts
@@ -1,8 +1,8 @@
-import { EventOutputHolder } from "../routers/EventOutputHolder";
 import { InventoryHelper } from "../helpers/InventoryHelper";
 import { PaymentHelper } from "../helpers/PaymentHelper";
 import { PresetHelper } from "../helpers/PresetHelper";
 import { ProfileHelper } from "../helpers/ProfileHelper";
+import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper";
 import { IPmcData } from "../models/eft/common/IPmcData";
 import { IAddItemRequestData } from "../models/eft/inventory/IAddItemRequestData";
 import { IInventoryBindRequestData } from "../models/eft/inventory/IInventoryBindRequestData";
@@ -21,33 +21,46 @@ import { IInventorySwapRequestData } from "../models/eft/inventory/IInventorySwa
 import { IInventoryTagRequestData } from "../models/eft/inventory/IInventoryTagRequestData";
 import { IInventoryToggleRequestData } from "../models/eft/inventory/IInventoryToggleRequestData";
 import { IInventoryTransferRequestData } from "../models/eft/inventory/IInventoryTransferRequestData";
+import { IOpenRandomLootContainerRequestData } from "../models/eft/inventory/IOpenRandomLootContainerRequestData";
 import { IItemEventRouterResponse } from "../models/eft/itemEvent/IItemEventRouterResponse";
 import { ILogger } from "../models/spt/utils/ILogger";
+import { EventOutputHolder } from "../routers/EventOutputHolder";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { FenceService } from "../services/FenceService";
+import { LocalisationService } from "../services/LocalisationService";
 import { RagfairOfferService } from "../services/RagfairOfferService";
 import { HashUtil } from "../utils/HashUtil";
+import { HttpResponseUtil } from "../utils/HttpResponseUtil";
 import { JsonUtil } from "../utils/JsonUtil";
+import { RandomUtil } from "../utils/RandomUtil";
 export declare class InventoryController {
     protected logger: ILogger;
     protected hashUtil: HashUtil;
     protected jsonUtil: JsonUtil;
+    protected randomUtil: RandomUtil;
     protected databaseServer: DatabaseServer;
     protected fenceService: FenceService;
     protected presetHelper: PresetHelper;
     protected inventoryHelper: InventoryHelper;
     protected ragfairOfferService: RagfairOfferService;
     protected profileHelper: ProfileHelper;
+    protected weightedRandomHelper: WeightedRandomHelper;
     protected paymentHelper: PaymentHelper;
+    protected localisationService: LocalisationService;
     protected eventOutputHolder: EventOutputHolder;
-    constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, fenceService: FenceService, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, ragfairOfferService: RagfairOfferService, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, eventOutputHolder: EventOutputHolder);
+    protected httpResponseUtil: HttpResponseUtil;
+    constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, fenceService: FenceService, presetHelper: PresetHelper, inventoryHelper: InventoryHelper, ragfairOfferService: RagfairOfferService, profileHelper: ProfileHelper, weightedRandomHelper: WeightedRandomHelper, paymentHelper: PaymentHelper, localisationService: LocalisationService, eventOutputHolder: EventOutputHolder, httpResponseUtil: HttpResponseUtil);
     /**
     * 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;
+     * @param pmcData Profile
+     * @param moveRequest Move request data
+     * @param sessionID Session id
+     * @returns IItemEventRouterResponse
+     */
+    moveItem(pmcData: IPmcData, moveRequest: IInventoryMoveRequestData, sessionID: string): IItemEventRouterResponse;
     /**
     * Remove Item from Profile
     * Deep tree item deletion, also removes items from insurance list
@@ -122,4 +135,12 @@ export declare class InventoryController {
     createMapMarker(pmcData: IPmcData, body: IInventoryCreateMarkerRequestData, sessionID: string): IItemEventRouterResponse;
     deleteMapMarker(pmcData: IPmcData, body: IInventoryDeleteMarkerRequestData, sessionID: string): IItemEventRouterResponse;
     editMapMarker(pmcData: IPmcData, body: IInventoryEditMarkerRequestData, sessionID: string): IItemEventRouterResponse;
+    /**
+     * Handle event fired when a container is unpacked (currently only the halloween pumpkin)
+     * @param pmcData Profile data
+     * @param body open loot container request data
+     * @param sessionID Session id
+     * @returns IItemEventRouterResponse
+     */
+    openRandomLootContainer(pmcData: IPmcData, body: IOpenRandomLootContainerRequestData, sessionID: string): IItemEventRouterResponse;
 }
diff --git a/Live/CWX_DebugTool/types/controllers/LocationController.d.ts b/Live/CWX_DebugTool/types/controllers/LocationController.d.ts
index 9db3205..b6feba8 100644
--- a/Live/CWX_DebugTool/types/controllers/LocationController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/LocationController.d.ts
@@ -7,6 +7,7 @@ import { LootItem } from "../models/spt/services/LootItem";
 import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
+import { LocalisationService } from "../services/LocalisationService";
 import { HashUtil } from "../utils/HashUtil";
 import { JsonUtil } from "../utils/JsonUtil";
 import { TimeUtil } from "../utils/TimeUtil";
@@ -15,12 +16,13 @@ export declare class LocationController {
     protected hashUtil: HashUtil;
     protected logger: ILogger;
     protected locationGenerator: LocationGenerator;
+    protected localisationService: LocalisationService;
     protected lootGenerator: LootGenerator;
     protected databaseServer: DatabaseServer;
     protected timeUtil: TimeUtil;
     protected configServer: ConfigServer;
     protected airdropConfig: IAirdropConfig;
-    constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger, locationGenerator: LocationGenerator, lootGenerator: LootGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil, configServer: ConfigServer);
+    constructor(jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger, locationGenerator: LocationGenerator, localisationService: LocalisationService, lootGenerator: LootGenerator, databaseServer: DatabaseServer, timeUtil: TimeUtil, configServer: ConfigServer);
     get(location: string): ILocationBase;
     generate(name: string): ILocationBase;
     generateAll(): ILocationsGenerateAllResponse;
diff --git a/Live/CWX_DebugTool/types/controllers/MatchController.d.ts b/Live/CWX_DebugTool/types/controllers/MatchController.d.ts
index dac6a3f..2b0d150 100644
--- a/Live/CWX_DebugTool/types/controllers/MatchController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/MatchController.d.ts
@@ -19,7 +19,6 @@ import { SaveServer } from "../servers/SaveServer";
 import { BotGenerationCacheService } from "../services/BotGenerationCacheService";
 import { BotLootCacheService } from "../services/BotLootCacheService";
 import { MatchLocationService } from "../services/MatchLocationService";
-import { PmcAiService } from "../services/PmcAiService";
 import { ProfileSnapshotService } from "../services/ProfileSnapshotService";
 export declare class MatchController {
     protected logger: ILogger;
@@ -30,13 +29,12 @@ export declare class MatchController {
     protected botLootCacheService: BotLootCacheService;
     protected configServer: ConfigServer;
     protected profileSnapshotService: ProfileSnapshotService;
-    protected pmcAiService: PmcAiService;
     protected botGenerationCacheService: BotGenerationCacheService;
     protected applicationContext: ApplicationContext;
     protected matchConfig: IMatchConfig;
     protected inraidConfig: IInRaidConfig;
     protected botConfig: IBotConfig;
-    constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, pmcAiService: PmcAiService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext);
+    constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, botGenerationCacheService: BotGenerationCacheService, applicationContext: ApplicationContext);
     getEnabled(): boolean;
     getProfile(info: IGetProfileRequestData): IPmcData[];
     createGroup(sessionID: string, info: ICreateGroupRequestData): any;
diff --git a/Live/CWX_DebugTool/types/controllers/RagfairController.d.ts b/Live/CWX_DebugTool/types/controllers/RagfairController.d.ts
index 5440458..95702f2 100644
--- a/Live/CWX_DebugTool/types/controllers/RagfairController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/RagfairController.d.ts
@@ -29,6 +29,7 @@ import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { RagfairServer } from "../servers/RagfairServer";
 import { SaveServer } from "../servers/SaveServer";
+import { LocalisationService } from "../services/LocalisationService";
 import { PaymentService } from "../services/PaymentService";
 import { RagfairOfferService } from "../services/RagfairOfferService";
 import { RagfairPriceService } from "../services/RagfairPriceService";
@@ -62,9 +63,10 @@ export declare class RagfairController {
     protected ragfairOfferService: RagfairOfferService;
     protected ragfairRequiredItemsService: RagfairRequiredItemsService;
     protected ragfairOfferGenerator: RagfairOfferGenerator;
+    protected localisationService: LocalisationService;
     protected configServer: ConfigServer;
     protected ragfairConfig: IRagfairConfig;
-    constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, eventOutputHolder: EventOutputHolder, 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, traderHelper: TraderHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, configServer: ConfigServer);
+    constructor(logger: ILogger, timeUtil: TimeUtil, httpResponse: HttpResponseUtil, eventOutputHolder: EventOutputHolder, 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, traderHelper: TraderHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, ragfairOfferGenerator: RagfairOfferGenerator, localisationService: LocalisationService, configServer: ConfigServer);
     getOffers(sessionID: string, info: ISearchRequestData): IGetOffersResult;
     /**
      * Get offers for the client based on type of search being performed
@@ -103,7 +105,12 @@ export declare class RagfairController {
     protected isLinkedSearch(info: ISearchRequestData): boolean;
     protected isRequiredSearch(info: ISearchRequestData): boolean;
     update(): void;
-    getItemPrice(info: IGetMarketPriceRequestData): IGetItemPriceResult;
+    /**
+     * Called when creating an offer on flea, fills values in top right corner
+     * @param getPriceRequest
+     * @returns min/avg/max values for an item based on flea offers available
+     */
+    getItemMinAvgMaxFleaPriceValues(getPriceRequest: IGetMarketPriceRequestData): IGetItemPriceResult;
     addPlayerOffer(pmcData: IPmcData, info: IAddOfferRequestData, sessionID: string): IItemEventRouterResponse;
     createPlayerOffer(profile: IAkiProfile, requirements: Requirement[], items: Item[], sellInOnePiece: boolean, amountToSend: number): IRagfairOffer;
     getAllFleaPrices(): Record<string, number>;
diff --git a/Live/CWX_DebugTool/types/controllers/RepeatableQuestController.d.ts b/Live/CWX_DebugTool/types/controllers/RepeatableQuestController.d.ts
index 7db5886..333583b 100644
--- a/Live/CWX_DebugTool/types/controllers/RepeatableQuestController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/RepeatableQuestController.d.ts
@@ -17,6 +17,7 @@ import { EventOutputHolder } from "../routers/EventOutputHolder";
 import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { ItemFilterService } from "../services/ItemFilterService";
+import { LocalisationService } from "../services/LocalisationService";
 import { PaymentService } from "../services/PaymentService";
 import { ProfileFixerService } from "../services/ProfileFixerService";
 import { JsonUtil } from "../utils/JsonUtil";
@@ -64,12 +65,13 @@ export declare class RepeatableQuestController {
     protected profileFixerService: ProfileFixerService;
     protected ragfairServerHelper: RagfairServerHelper;
     protected eventOutputHolder: EventOutputHolder;
+    protected localisationService: LocalisationService;
     protected paymentService: PaymentService;
     protected objectId: ObjectId;
     protected itemFilterService: ItemFilterService;
     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, profileFixerService: ProfileFixerService, ragfairServerHelper: RagfairServerHelper, eventOutputHolder: EventOutputHolder, paymentService: PaymentService, objectId: ObjectId, itemFilterService: ItemFilterService, configServer: ConfigServer);
+    constructor(timeUtil: TimeUtil, logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, jsonUtil: JsonUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, profileFixerService: ProfileFixerService, ragfairServerHelper: RagfairServerHelper, eventOutputHolder: EventOutputHolder, localisationService: LocalisationService, paymentService: PaymentService, objectId: ObjectId, itemFilterService: ItemFilterService, 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.
diff --git a/Live/CWX_DebugTool/types/controllers/WeatherController.d.ts b/Live/CWX_DebugTool/types/controllers/WeatherController.d.ts
index ca7f5eb..631a90c 100644
--- a/Live/CWX_DebugTool/types/controllers/WeatherController.d.ts
+++ b/Live/CWX_DebugTool/types/controllers/WeatherController.d.ts
@@ -1,11 +1,18 @@
 import { WeatherGenerator } from "../generators/WeatherGenerator";
 import { IWeatherData } from "../models/eft/weather/IWeatherData";
 import { IWeatherConfig } from "../models/spt/config/IWeatherConfig";
+import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
 export declare class WeatherController {
     protected weatherGenerator: WeatherGenerator;
+    protected logger: ILogger;
     protected configServer: ConfigServer;
     protected weatherConfig: IWeatherConfig;
-    constructor(weatherGenerator: WeatherGenerator, configServer: ConfigServer);
+    constructor(weatherGenerator: WeatherGenerator, logger: ILogger, configServer: ConfigServer);
     generate(): IWeatherData;
+    /**
+     * Get the current in-raid time (MUST HAVE PLAYER LOGGED INTO CLIENT TO WORK)
+     * @returns Date object
+     */
+    getCurrentInRaidTime(): Date;
 }
diff --git a/Live/CWX_DebugTool/types/generators/BotGenerator.d.ts b/Live/CWX_DebugTool/types/generators/BotGenerator.d.ts
index 2ac51db..08ad50a 100644
--- a/Live/CWX_DebugTool/types/generators/BotGenerator.d.ts
+++ b/Live/CWX_DebugTool/types/generators/BotGenerator.d.ts
@@ -1,25 +1,21 @@
+import { BotDifficultyHelper } from "../helpers/BotDifficultyHelper";
 import { BotHelper } from "../helpers/BotHelper";
 import { GameEventHelper } from "../helpers/GameEventHelper";
 import { ProfileHelper } from "../helpers/ProfileHelper";
-import { IGenerateBotsRequestData } from "../models/eft/bot/IGenerateBotsRequestData";
+import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper";
 import { Health as PmcHealth, IBotBase, Skills } from "../models/eft/common/tables/IBotBase";
 import { Health, IBotType, Inventory } from "../models/eft/common/tables/IBotType";
+import { BotGenerationDetails } from "../models/spt/bots/BotGenerationDetails";
 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 { BotEquipmentFilterService } from "../services/BotEquipmentFilterService";
-import { PmcAiService } from "../services/PmcAiService";
 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;
-    }
-}
+import { BotLevelGenerator } from "./BotLevelGenerator";
 export declare class BotGenerator {
     protected logger: ILogger;
     protected hashUtil: HashUtil;
@@ -28,13 +24,15 @@ export declare class BotGenerator {
     protected profileHelper: ProfileHelper;
     protected databaseServer: DatabaseServer;
     protected botInventoryGenerator: BotInventoryGenerator;
+    protected botLevelGenerator: BotLevelGenerator;
     protected botEquipmentFilterService: BotEquipmentFilterService;
+    protected weightedRandomHelper: WeightedRandomHelper;
     protected botHelper: BotHelper;
+    protected botDifficultyHelper: BotDifficultyHelper;
     protected gameEventHelper: GameEventHelper;
-    protected pmcAiService: PmcAiService;
     protected configServer: ConfigServer;
     protected botConfig: IBotConfig;
-    constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botEquipmentFilterService: BotEquipmentFilterService, botHelper: BotHelper, gameEventHelper: GameEventHelper, pmcAiService: PmcAiService, configServer: ConfigServer);
+    constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, jsonUtil: JsonUtil, profileHelper: ProfileHelper, databaseServer: DatabaseServer, botInventoryGenerator: BotInventoryGenerator, botLevelGenerator: BotLevelGenerator, botEquipmentFilterService: BotEquipmentFilterService, weightedRandomHelper: WeightedRandomHelper, botHelper: BotHelper, botDifficultyHelper: BotDifficultyHelper, gameEventHelper: GameEventHelper, configServer: ConfigServer);
     /**
      * Generate a player scav bot object
      * @param role e.g. assault / pmcbot
@@ -44,12 +42,18 @@ export declare class BotGenerator {
      */
     generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase;
     /**
-     * Generate an array of bot objects for populate a raid with
+     * Generate an array of bot objects based on a condition for a raid with
      * @param sessionId session id
-     * @param info request object
-     * @returns bot array
+     * @param botGenerationDetails details on how to generate the bots
+     * @returns Generated bots in array
      */
-    generate(sessionId: string, info: IGenerateBotsRequestData): IBotBase[];
+    generateByCondition(sessionId: string, botGenerationDetails: BotGenerationDetails): IBotBase[];
+    /**
+     * Get the PMCs wildSpawnType value
+     * @param role "usec" / "bear"
+     * @returns wildSpawnType value as string
+     */
+    protected getPmcRoleByDescription(role: string): string;
     /**
      * Get a randomised PMC side based on bot config value 'isUsec'
      * @returns pmc side as string
@@ -64,26 +68,24 @@ export declare class BotGenerator {
      * Create a IBotBase object with equipment/loot/exp etc
      * @param sessionId Session id
      * @param bot bots base file
-     * @param role botRole bot will use
-     * @param node Bot template from db/bots/x.json
-     * @param isPmc Is bot to be a PMC
-     * @param isPlayerScav is bot to be a p scav bot
+     * @param botJsonTemplate Bot template from db/bots/x.json
+     * @param botGenerationDetails details on how to generate the bot
      * @returns IBotBase object
      */
-    protected generateBot(sessionId: string, bot: IBotBase, role: string, node: IBotType, isPmc: boolean, isPlayerScav?: boolean): IBotBase;
+    protected generateBot(sessionId: string, bot: IBotBase, botJsonTemplate: IBotType, botGenerationDetails: BotGenerationDetails): IBotBase;
+    /**
+     * Create a bot nickname
+     * @param botJsonTemplate x.json from database
+     * @param isPlayerScav Will bot be player scav
+     * @param botRole role of bot e.g. assault
+     * @returns Nickname for bot
+     */
+    protected generateBotNickname(botJsonTemplate: IBotType, isPlayerScav: boolean, botRole: string): string;
     /**
      * Log the number of PMCs generated to the debug console
      * @param output Generated bot array, ready to send to client
      */
     protected logPmcGeneratedCount(output: IBotBase[]): void;
-    /**
-     * Return a randomised bot level and exp value
-     * @param role botRole being generated for
-     * @param min Min exp value
-     * @param max Max exp value
-     * @returns IRandomisedBotLevelResult object
-     */
-    protected generateRandomLevel(role: string, min: number, max: number): BotGenerator.IRandomisedBotLevelResult;
     /**
      * Converts health object to the required format
      * @param healthObj health object from bot json
@@ -117,4 +119,3 @@ export declare class BotGenerator {
      */
     protected generateDogtag(bot: IBotBase): IBotBase;
 }
-export {};
diff --git a/Live/CWX_DebugTool/types/generators/BotInventoryGenerator.d.ts b/Live/CWX_DebugTool/types/generators/BotInventoryGenerator.d.ts
index c5ed545..a3b5eaa 100644
--- a/Live/CWX_DebugTool/types/generators/BotInventoryGenerator.d.ts
+++ b/Live/CWX_DebugTool/types/generators/BotInventoryGenerator.d.ts
@@ -1,12 +1,14 @@
 import { BotGeneratorHelper } from "../helpers/BotGeneratorHelper";
+import { BotHelper } from "../helpers/BotHelper";
 import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper";
 import { Inventory as PmcInventory } from "../models/eft/common/tables/IBotBase";
-import { Chances, Generation, Inventory, Mods } from "../models/eft/common/tables/IBotType";
+import { Chances, Generation, IBotType, Inventory, Mods } from "../models/eft/common/tables/IBotType";
 import { EquipmentSlots } from "../models/enums/EquipmentSlots";
-import { IBotConfig } from "../models/spt/config/IBotConfig";
+import { IBotConfig, RandomisationDetails } from "../models/spt/config/IBotConfig";
 import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
+import { LocalisationService } from "../services/LocalisationService";
 import { HashUtil } from "../utils/HashUtil";
 import { RandomUtil } from "../utils/RandomUtil";
 import { BotLootGenerator } from "./BotLootGenerator";
@@ -19,15 +21,81 @@ export declare class BotInventoryGenerator {
     protected botWeaponGenerator: BotWeaponGenerator;
     protected botLootGenerator: BotLootGenerator;
     protected botGeneratorHelper: BotGeneratorHelper;
+    protected botHelper: BotHelper;
     protected weightedRandomHelper: WeightedRandomHelper;
+    protected localisationService: LocalisationService;
     protected configServer: ConfigServer;
     protected botConfig: IBotConfig;
-    constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, weightedRandomHelper: WeightedRandomHelper, configServer: ConfigServer);
-    generateInventory(sessionId: string, templateInventory: Inventory, equipmentChances: Chances, itemGenerationLimitsMinMax: Generation, botRole: string, isPmc: boolean): PmcInventory;
+    constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, botHelper: BotHelper, weightedRandomHelper: WeightedRandomHelper, localisationService: LocalisationService, configServer: ConfigServer);
+    /**
+     * Add equipment/weapons/loot to bot
+     * @param sessionId Session id
+     * @param botJsonTemplate bot/x.json data from db
+     * @param botRole Role bot has (assault/pmcBot)
+     * @param isPmc Is bot being converted into a pmc
+     * @param botLevel Level of bot being generated
+     * @returns PmcInventory object with equipment/weapons/loot
+     */
+    generateInventory(sessionId: string, botJsonTemplate: IBotType, botRole: string, isPmc: boolean, botLevel: number): PmcInventory;
+    /**
+     * Create a pmcInventory object with all the base/generic items needed
+     * @returns PmcInventory object
+     */
+    protected generateInventoryBase(): PmcInventory;
+    /**
+     * Add equipment to a bot
+     * @param templateInventory bot/x.json data from db
+     * @param equipmentChances Chances items will be added to bot
+     * @param botRole Role bot has (assault/pmcBot)
+     * @param botInventory Inventory to add equipment to
+     * @param botLevel Level of bot
+     */
+    protected generateAndAddEquipmentToBot(templateInventory: Inventory, equipmentChances: Chances, botRole: string, botInventory: PmcInventory, botLevel: number): void;
+    /**
+     * Add a piece of equipment with mods to inventory from the provided pools
+     * @param equipmentSlot Slot to select an item for
+     * @param equipmentPool Possible items to choose from
+     * @param modPool Possible mods to apply to item chosen
+     * @param spawnChances Chances items will be chosen to be added
+     * @param botRole Role of bot e.g. assault
+     * @param inventory Inventory to add item into
+     * @param randomisationDetails settings from bot.json to adjust how item is generated
+     */
+    protected generateEquipment(equipmentSlot: string, equipmentPool: Record<string, number>, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory, randomisationDetails: RandomisationDetails): void;
+    /**
+     * Work out what weapons bot should have equipped and add them to bot inventory
+     * @param templateInventory bot/x.json data from db
+     * @param equipmentChances Chances bot can have equipment equipped
+     * @param sessionId Session id
+     * @param botInventory Inventory to add weapons to
+     * @param botRole assault/pmcBot/bossTagilla etc
+     * @param isPmc Is the bot being generated as a pmc
+     * @param botLevel level of bot having weapon generated
+     * @param itemGenerationLimitsMinMax Limits for items the bot can have
+     */
+    protected generateAndAddWeaponsToBot(templateInventory: Inventory, equipmentChances: Chances, sessionId: string, botInventory: PmcInventory, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation, botLevel: number): void;
+    /**
+     * Calculate if the bot should have weapons in Primary/Secondary/Holster slots
+     * @param equipmentChances Chances bot has certain equipment
+     * @returns What slots bot should have weapons generated for
+     */
+    protected getDesiredWeaponsForBot(equipmentChances: Chances): {
+        slot: EquipmentSlots;
+        shouldSpawn: boolean;
+    }[];
+    /**
+     * Add weapon + spare mags/ammo to bots inventory
+     * @param sessionId Session id
+     * @param weaponSlot Weapon slot being generated
+     * @param templateInventory bot/x.json data from db
+     * @param botInventory Inventory to add weapon+mags/ammo to
+     * @param equipmentChances Chances bot can have equipment equipped
+     * @param botRole assault/pmcBot/bossTagilla etc
+     * @param isPmc Is the bot being generated as a pmc
+     * @param itemGenerationLimitsMinMax
+     */
     protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: {
         slot: EquipmentSlots;
         shouldSpawn: boolean;
-    }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation): void;
-    protected generateEquipment(equipmentSlot: string, equipmentPool: Record<string, number>, modPool: Mods, spawnChances: Chances, botRole: string, inventory: PmcInventory): void;
-    protected generateInventoryBase(): PmcInventory;
+    }, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation, botLevel: number): void;
 }
diff --git a/Live/CWX_DebugTool/types/generators/BotLevelGenerator.d.ts b/Live/CWX_DebugTool/types/generators/BotLevelGenerator.d.ts
new file mode 100644
index 0000000..751e6e6
--- /dev/null
+++ b/Live/CWX_DebugTool/types/generators/BotLevelGenerator.d.ts
@@ -0,0 +1,29 @@
+import { MinMax } from "../models/common/MinMax";
+import { IRandomisedBotLevelResult } from "../models/eft/bot/IRandomisedBotLevelResult";
+import { ExpTable } from "../models/eft/common/IGlobals";
+import { IBotBase } from "../models/eft/common/tables/IBotBase";
+import { BotGenerationDetails } from "../models/spt/bots/BotGenerationDetails";
+import { ILogger } from "../models/spt/utils/ILogger";
+import { DatabaseServer } from "../servers/DatabaseServer";
+import { RandomUtil } from "../utils/RandomUtil";
+export declare class BotLevelGenerator {
+    protected logger: ILogger;
+    protected randomUtil: RandomUtil;
+    protected databaseServer: DatabaseServer;
+    constructor(logger: ILogger, randomUtil: RandomUtil, databaseServer: DatabaseServer);
+    /**
+     * Return a randomised bot level and exp value
+     * @param levelDetails min and max of level for bot
+     * @param botGenerationDetails Deatils to help generate a bot
+     * @param bot being level is being generated for
+     * @returns IRandomisedBotLevelResult object
+     */
+    generateBotLevel(levelDetails: MinMax, botGenerationDetails: BotGenerationDetails, bot: IBotBase): IRandomisedBotLevelResult;
+    /**
+     * Get the highest level a bot can be relative to the players level, but no futher than the max size from globals.exp_table
+     * @param playerLevel Players current level
+     * @param relativeDeltaMax max delta above player level to go
+     * @returns highest level possible for bot
+     */
+    protected getHighestRelativeBotLevel(playerLevel: number, relativeDeltaMax: number, levelDetails: MinMax, expTable: ExpTable[]): number;
+}
diff --git a/Live/CWX_DebugTool/types/generators/BotLootGenerator.d.ts b/Live/CWX_DebugTool/types/generators/BotLootGenerator.d.ts
index c1f5310..6273a11 100644
--- a/Live/CWX_DebugTool/types/generators/BotLootGenerator.d.ts
+++ b/Live/CWX_DebugTool/types/generators/BotLootGenerator.d.ts
@@ -10,6 +10,7 @@ import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { BotLootCacheService } from "../services/BotLootCacheService";
+import { LocalisationService } from "../services/LocalisationService";
 import { HashUtil } from "../utils/HashUtil";
 import { RandomUtil } from "../utils/RandomUtil";
 import { BotWeaponGenerator } from "./BotWeaponGenerator";
@@ -23,10 +24,22 @@ export declare class BotLootGenerator {
     protected botWeaponGenerator: BotWeaponGenerator;
     protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper;
     protected botLootCacheService: BotLootCacheService;
+    protected localisationService: LocalisationService;
     protected configServer: ConfigServer;
     protected botConfig: IBotConfig;
-    constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, botWeaponGenerator: BotWeaponGenerator, botWeaponGeneratorHelper: BotWeaponGeneratorHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer);
-    generateLoot(sessionId: string, templateInventory: Inventory, itemCounts: ItemMinMax, isPmc: boolean, botRole: string, botInventory: PmcInventory, equipmentChances: Chances): void;
+    constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, botGeneratorHelper: BotGeneratorHelper, botWeaponGenerator: BotWeaponGenerator, botWeaponGeneratorHelper: BotWeaponGeneratorHelper, botLootCacheService: BotLootCacheService, localisationService: LocalisationService, configServer: ConfigServer);
+    /**
+     * Add loot to bots containers
+     * @param sessionId Session id
+     * @param templateInventory x.json from database/bots
+     * @param itemCounts Liits on item types to be added as loot
+     * @param isPmc Will bot be a pmc
+     * @param botRole Role of bot, e.g. asssult
+     * @param botInventory Inventory to add loot to
+     * @param equipmentChances
+     * @param botLevel Level of bot
+     */
+    generateLoot(sessionId: string, templateInventory: Inventory, itemCounts: ItemMinMax, isPmc: boolean, botRole: string, botInventory: PmcInventory, equipmentChances: Chances, botLevel: number): void;
     protected getRandomisedCount(min: number, max: number, nValue: number): number;
     /**
      * Take random items from a pool and add to an inventory until totalItemCount or totalValueLimit is reached
@@ -49,7 +62,7 @@ export declare class BotLootGenerator {
      * @param botRole bots role, .e.g. pmcBot
      * @param isPmc are we generating for a pmc
      */
-    protected addLooseWeaponsToInventorySlot(sessionId: string, botInventory: PmcInventory, equipmentSlot: string, templateInventory: Inventory, modChances: ModsChances, botRole: string, isPmc: boolean): void;
+    protected addLooseWeaponsToInventorySlot(sessionId: string, botInventory: PmcInventory, equipmentSlot: string, templateInventory: Inventory, modChances: ModsChances, botRole: string, isPmc: boolean, botLevel: number): void;
     /**
      * Get a random item from the pool parameter using the biasedRandomNumber system
      * @param pool pool of items to pick an item from
@@ -113,7 +126,7 @@ export declare class BotLootGenerator {
      * If no limit found for a non pmc bot, fall back to defaults
      * @param isPmc is the bot we want limits for a pmc
      * @param botRole what role does the bot have
-     * @returns dictionary of tplIds and limit
+     * @returns Dictionary of tplIds and limit
      */
     protected getItemSpawnLimitsForBotType(isPmc: boolean, botRole: string): Record<string, number>;
     /**
diff --git a/Live/CWX_DebugTool/types/generators/BotWeaponGenerator.d.ts b/Live/CWX_DebugTool/types/generators/BotWeaponGenerator.d.ts
index 487901b..b2eaf3b 100644
--- a/Live/CWX_DebugTool/types/generators/BotWeaponGenerator.d.ts
+++ b/Live/CWX_DebugTool/types/generators/BotWeaponGenerator.d.ts
@@ -12,6 +12,7 @@ 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 { LocalisationService } from "../services/LocalisationService";
 import { HashUtil } from "../utils/HashUtil";
 import { JsonUtil } from "../utils/JsonUtil";
 import { RandomUtil } from "../utils/RandomUtil";
@@ -27,10 +28,11 @@ export declare class BotWeaponGenerator {
     protected randomUtil: RandomUtil;
     protected configServer: ConfigServer;
     protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper;
+    protected localisationService: LocalisationService;
     protected inventoryMagGenComponents: IInventoryMagGen[];
     protected readonly modMagazineSlotId = "mod_magazine";
     protected botConfig: IBotConfig;
-    constructor(jsonUtil: JsonUtil, logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil, configServer: ConfigServer, botWeaponGeneratorHelper: BotWeaponGeneratorHelper, inventoryMagGenComponents: IInventoryMagGen[]);
+    constructor(jsonUtil: JsonUtil, logger: ILogger, hashUtil: HashUtil, databaseServer: DatabaseServer, itemHelper: ItemHelper, weightedRandomHelper: WeightedRandomHelper, botGeneratorHelper: BotGeneratorHelper, randomUtil: RandomUtil, configServer: ConfigServer, botWeaponGeneratorHelper: BotWeaponGeneratorHelper, localisationService: LocalisationService, inventoryMagGenComponents: IInventoryMagGen[]);
     /**
      * Pick a random weapon based on weightings and generate a functional weapon
      * @param equipmentSlot Primary/secondary/holster
@@ -41,7 +43,7 @@ export declare class BotWeaponGenerator {
      * @param isPmc Is weapon generated for a pmc
      * @returns GenerateWeaponResult object
      */
-    generateRandomWeapon(sessionId: string, equipmentSlot: string, botTemplateInventory: Inventory, weaponParentId: string, modChances: ModsChances, botRole: string, isPmc: boolean): GenerateWeaponResult;
+    generateRandomWeapon(sessionId: string, equipmentSlot: string, botTemplateInventory: Inventory, weaponParentId: string, modChances: ModsChances, botRole: string, isPmc: boolean, botLevel: number): GenerateWeaponResult;
     /**
      * Get a random weighted weapon from a bots pool of weapons
      * @param equipmentSlot Primary/secondary/holster
@@ -60,7 +62,7 @@ export declare class BotWeaponGenerator {
      * @param isPmc
      * @returns GenerateWeaponResult object
      */
-    generateWeaponByTpl(sessionId: string, weaponTpl: string, equipmentSlot: string, botTemplateInventory: Inventory, weaponParentId: string, modChances: ModsChances, botRole: string, isPmc: boolean): GenerateWeaponResult;
+    generateWeaponByTpl(sessionId: string, weaponTpl: string, equipmentSlot: string, botTemplateInventory: Inventory, weaponParentId: string, modChances: ModsChances, botRole: string, isPmc: boolean, botLevel: number): GenerateWeaponResult;
     /**
      * Create array with weapon base as only element and
      * add additional properties based on weapon type
diff --git a/Live/CWX_DebugTool/types/generators/RagfairOfferGenerator.d.ts b/Live/CWX_DebugTool/types/generators/RagfairOfferGenerator.d.ts
index b64a7e7..23882d2 100644
--- a/Live/CWX_DebugTool/types/generators/RagfairOfferGenerator.d.ts
+++ b/Live/CWX_DebugTool/types/generators/RagfairOfferGenerator.d.ts
@@ -1,16 +1,19 @@
+import { HandbookHelper } from "../helpers/HandbookHelper";
 import { ItemHelper } from "../helpers/ItemHelper";
+import { PaymentHelper } from "../helpers/PaymentHelper";
 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 { IRagfairOffer, OfferRequirement } 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 { LocalisationService } from "../services/LocalisationService";
 import { RagfairCategoriesService } from "../services/RagfairCategoriesService";
 import { RagfairOfferService } from "../services/RagfairOfferService";
 import { RagfairPriceService } from "../services/RagfairPriceService";
@@ -27,18 +30,31 @@ export declare class RagfairOfferGenerator {
     protected timeUtil: TimeUtil;
     protected databaseServer: DatabaseServer;
     protected ragfairServerHelper: RagfairServerHelper;
+    protected handbookHelper: HandbookHelper;
     protected saveServer: SaveServer;
     protected presetHelper: PresetHelper;
     protected ragfairAssortGenerator: RagfairAssortGenerator;
     protected ragfairOfferService: RagfairOfferService;
     protected ragfairPriceService: RagfairPriceService;
+    protected localisationService: LocalisationService;
+    protected paymentHelper: PaymentHelper;
     protected ragfairCategoriesService: RagfairCategoriesService;
     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, ragfairCategoriesService: RagfairCategoriesService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer);
+    protected allowedFleaPriceItemsForBarter: {
+        tpl: string;
+        price: number;
+    }[];
+    constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, databaseServer: DatabaseServer, ragfairServerHelper: RagfairServerHelper, handbookHelper: HandbookHelper, saveServer: SaveServer, presetHelper: PresetHelper, ragfairAssortGenerator: RagfairAssortGenerator, ragfairOfferService: RagfairOfferService, ragfairPriceService: RagfairPriceService, localisationService: LocalisationService, paymentHelper: PaymentHelper, ragfairCategoriesService: RagfairCategoriesService, fenceService: FenceService, itemHelper: ItemHelper, configServer: ConfigServer);
     createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer;
+    /**
+     * Calculate the offer price that's listed on the flea listing
+     * @param offerRequirements barter requirements for offer
+     * @returns rouble cost of offer
+     */
+    protected calculateOfferListingPrice(offerRequirements: OfferRequirement[]): number;
     /**
      * Get avatar url from trader table in db
      * @param isTrader Is user we're getting avatar for a trader
@@ -87,20 +103,36 @@ export declare class RagfairOfferGenerator {
      * @returns Item with conditions added
      */
     protected addMissingCondition(item: Item): Item;
-    protected getOfferRequirements(items: Item[]): {
-        count: number;
-        _tpl: string;
+    /**
+     * Create a barter-based barter scheme, if not possible, fall back to making barter scheme currency based
+     * @param offerItems Items for sale in offer
+     * @returns barter scheme
+     */
+    protected createBarterRequirement(offerItems: Item[]): IBarterScheme[];
+    /**
+     * Get an array of flea prices + item tpl, cached in generator class
+     * @returns array with tpl/price values
+     */
+    protected getFleaPricesAsArray(): {
+        tpl: string;
+        price: number;
     }[];
+    /**
+     * Create a random currency-based barter scheme for an array of items
+     * @param offerItems Items on offer
+     * @returns Barter scheme for offer
+     */
+    protected createCurrencyRequirement(offerItems: Item[]): IBarterScheme[];
     /**
      * Create a flea offer and store it in the Ragfair server offers array
      * @param userID owner of the offer
      * @param time time offer is put up
      * @param items items in the offer
-     * @param barterScheme
-     * @param loyalLevel
+     * @param barterScheme cost of item (currency or barter)
+     * @param loyalLevel Loyalty level needed to buy item
      * @param price price of offer
      * @param sellInOnePiece
-     * @returns
+     * @returns Ragfair offer
      */
     createFleaOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, price: number, sellInOnePiece?: boolean): IRagfairOffer;
 }
diff --git a/Live/CWX_DebugTool/types/generators/WeatherGenerator.d.ts b/Live/CWX_DebugTool/types/generators/WeatherGenerator.d.ts
index 8ddbe49..65d2c76 100644
--- a/Live/CWX_DebugTool/types/generators/WeatherGenerator.d.ts
+++ b/Live/CWX_DebugTool/types/generators/WeatherGenerator.d.ts
@@ -1,38 +1,54 @@
+import { ApplicationContext } from "../context/ApplicationContext";
 import { WeightedRandomHelper } from "../helpers/WeightedRandomHelper";
-import { IWeatherData } from "../models/eft/weather/IWeatherData";
+import { IWeather, IWeatherData } from "../models/eft/weather/IWeatherData";
+import { WindDirection } from "../models/enums/WindDirection";
 import { IWeatherConfig } from "../models/spt/config/IWeatherConfig";
+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 WeatherGenerator {
     protected weightedRandomHelper: WeightedRandomHelper;
+    protected logger: ILogger;
     protected randomUtil: RandomUtil;
     protected timeUtil: TimeUtil;
+    protected applicationContext: ApplicationContext;
     protected configServer: ConfigServer;
     protected weatherConfig: IWeatherConfig;
-    constructor(weightedRandomHelper: WeightedRandomHelper, randomUtil: RandomUtil, timeUtil: TimeUtil, configServer: ConfigServer);
-    calculateTime(data: IWeatherData): IWeatherData;
+    constructor(weightedRandomHelper: WeightedRandomHelper, logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, applicationContext: ApplicationContext, configServer: ConfigServer);
+    calculateGameTime(data: IWeatherData): IWeatherData;
     /**
      * Get server uptime seconds multiplied by a multiplier and add to current time as seconds
      * Format to BSGs requirements
-     * @param computedDate current date
+     * @param currentDate current date
      * @returns formatted time
      */
-    protected getAcceleratedTime(computedDate: Date): string;
+    protected getBsgFormattedInRaidTime(currentDate: Date): string;
+    /**
+     * Get the current in-raid time
+     * @param currentDate (new Date())
+     * @returns Date object of current in-raid time
+     */
+    getInRaidTime(currentDate: Date): Date;
     /**
      * Get current time formatted to fit BSGs requirement
-     * @param computedDate date to format into bsg style
+     * @param date date to format into bsg style
      * @returns
      */
-    protected getNormalTime(computedDate: Date): string;
+    protected getBSGFormattedTime(date: Date): string;
     /**
-     * Return randomised Weather data
-     * @param weatherData weather input data
+     * Return randomised Weather data with help of config/weather.json
      * @returns Randomised weather data
      */
-    generateWeather(weatherData: IWeatherData): IWeatherData;
-    protected getWeightedFog(): string;
+    generateWeather(): IWeather;
+    /**
+     * Set IWeather date/time/timestamp values to now
+     * @param weather Object to update
+     */
+    protected setCurrentDateTime(weather: IWeather): void;
+    protected getWeightedWindDirection(): WindDirection;
+    protected getWeightedWindSpeed(): number;
+    protected getWeightedFog(): number;
     protected getWeightedRain(): number;
     protected getRandomFloat(node: string): number;
-    protected getRandomInt(node: string): number;
 }
diff --git a/Live/CWX_DebugTool/types/generators/weapongen/implementations/ExternalInventoryMagGen.d.ts b/Live/CWX_DebugTool/types/generators/weapongen/implementations/ExternalInventoryMagGen.d.ts
index 4fcb1e2..1589707 100644
--- a/Live/CWX_DebugTool/types/generators/weapongen/implementations/ExternalInventoryMagGen.d.ts
+++ b/Live/CWX_DebugTool/types/generators/weapongen/implementations/ExternalInventoryMagGen.d.ts
@@ -1,13 +1,15 @@
 import { BotWeaponGeneratorHelper } from "../../../helpers/BotWeaponGeneratorHelper";
 import { ItemHelper } from "../../../helpers/ItemHelper";
 import { ILogger } from "../../../models/spt/utils/ILogger";
+import { LocalisationService } from "../../../services/LocalisationService";
 import { IInventoryMagGen } from "../IInventoryMagGen";
 import { InventoryMagGen } from "../InventoryMagGen";
 export declare class ExternalInventoryMagGen implements IInventoryMagGen {
     protected logger: ILogger;
     protected itemHelper: ItemHelper;
+    protected localisationService: LocalisationService;
     protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper;
-    constructor(logger: ILogger, itemHelper: ItemHelper, botWeaponGeneratorHelper: BotWeaponGeneratorHelper);
+    constructor(logger: ILogger, itemHelper: ItemHelper, localisationService: LocalisationService, botWeaponGeneratorHelper: BotWeaponGeneratorHelper);
     getPriority(): number;
     canHandleInventoryMagGen(inventoryMagGen: InventoryMagGen): boolean;
     process(inventoryMagGen: InventoryMagGen): void;
diff --git a/Live/CWX_DebugTool/types/helpers/BotDifficultyHelper.d.ts b/Live/CWX_DebugTool/types/helpers/BotDifficultyHelper.d.ts
new file mode 100644
index 0000000..a58ebdb
--- /dev/null
+++ b/Live/CWX_DebugTool/types/helpers/BotDifficultyHelper.d.ts
@@ -0,0 +1,46 @@
+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 { LocalisationService } from "../services/LocalisationService";
+import { JsonUtil } from "../utils/JsonUtil";
+import { RandomUtil } from "../utils/RandomUtil";
+import { BotHelper } from "./BotHelper";
+export declare class BotDifficultyHelper {
+    protected logger: ILogger;
+    protected jsonUtil: JsonUtil;
+    protected databaseServer: DatabaseServer;
+    protected randomUtil: RandomUtil;
+    protected localisationService: LocalisationService;
+    protected botHelper: BotHelper;
+    protected configServer: ConfigServer;
+    protected botConfig: IBotConfig;
+    constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, localisationService: LocalisationService, botHelper: BotHelper, configServer: ConfigServer);
+    getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty;
+    /**
+     * Get difficulty settings for desired bot type, if not found use assault bot types
+     * @param type bot type to retreive difficulty of
+     * @param difficulty difficulty to get settings for (easy/normal etc)
+     * @returns Difficulty object
+     */
+    getBotDifficultySettings(type: string, difficulty: string): Difficulty;
+    /**
+     * Get difficulty settings for a PMC
+     * @param type "usec" / "bear"
+     * @param difficulty what difficulty to retrieve
+     * @returns Difficulty object
+     */
+    protected getDifficultySettings(type: string, difficulty: string): Difficulty;
+    /**
+     * Translate chosen value from pre-raid difficulty dropdown into bot difficulty value
+     * @param dropDownDifficulty Dropdown difficulty value to convert
+     * @returns bot difficulty
+     */
+    convertBotDifficultyDropdownToBotDifficulty(dropDownDifficulty: string): string;
+    /**
+     * Choose a random difficulty from - easy/normal/hard/impossible
+     * @returns random difficulty
+     */
+    chooseRandomDifficulty(): string;
+}
diff --git a/Live/CWX_DebugTool/types/helpers/BotGeneratorHelper.d.ts b/Live/CWX_DebugTool/types/helpers/BotGeneratorHelper.d.ts
index 5e3e501..9ee017f 100644
--- a/Live/CWX_DebugTool/types/helpers/BotGeneratorHelper.d.ts
+++ b/Live/CWX_DebugTool/types/helpers/BotGeneratorHelper.d.ts
@@ -8,9 +8,11 @@ import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { BotEquipmentFilterService } from "../services/BotEquipmentFilterService";
 import { ItemFilterService } from "../services/ItemFilterService";
+import { LocalisationService } from "../services/LocalisationService";
 import { HashUtil } from "../utils/HashUtil";
 import { JsonUtil } from "../utils/JsonUtil";
 import { RandomUtil } from "../utils/RandomUtil";
+import { BotHelper } from "./BotHelper";
 import { BotWeaponGeneratorHelper } from "./BotWeaponGeneratorHelper";
 import { ContainerHelper } from "./ContainerHelper";
 import { InventoryHelper } from "./InventoryHelper";
@@ -43,9 +45,11 @@ export declare class BotGeneratorHelper {
     protected itemFilterService: ItemFilterService;
     protected profileHelper: ProfileHelper;
     protected botWeaponGeneratorHelper: BotWeaponGeneratorHelper;
+    protected botHelper: BotHelper;
+    protected localisationService: LocalisationService;
     protected configServer: ConfigServer;
     protected botConfig: IBotConfig;
-    constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, probabilityHelper: ProbabilityHelper, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, botEquipmentFilterService: BotEquipmentFilterService, itemFilterService: ItemFilterService, profileHelper: ProfileHelper, botWeaponGeneratorHelper: BotWeaponGeneratorHelper, configServer: ConfigServer);
+    constructor(logger: ILogger, jsonUtil: JsonUtil, hashUtil: HashUtil, randomUtil: RandomUtil, probabilityHelper: ProbabilityHelper, databaseServer: DatabaseServer, durabilityLimitsHelper: DurabilityLimitsHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, containerHelper: ContainerHelper, botEquipmentFilterService: BotEquipmentFilterService, itemFilterService: ItemFilterService, profileHelper: ProfileHelper, botWeaponGeneratorHelper: BotWeaponGeneratorHelper, botHelper: BotHelper, localisationService: LocalisationService, configServer: ConfigServer);
     /**
      * Check mods are compatible and add to array
      * @param equipment Equipment item to add mods to
@@ -53,10 +57,13 @@ export declare class BotGeneratorHelper {
      * @param parentId parentid of item to add mod to
      * @param parentTemplate template objet of item to add mods to
      * @param modSpawnChances dictionary of mod items and their chance to spawn for this bot type
+     * @param botRole the bot role being generated for
+     * @param forceSpawn should this mod be forced to spawn
      * @returns Item + compatible mods as an array
      */
-    generateModsForEquipment(equipment: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances): Item[];
+    generateModsForEquipment(equipment: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem, modSpawnChances: ModsChances, botRole: string, forceSpawn?: boolean): Item[];
     /**
+     * Add mods to a weapon using the provided mod pool
      * @param sessionId session id
      * @param weapon Weapon to add mods to
      * @param modPool Pool of compatible mods to attach to weapon
@@ -67,18 +74,18 @@ export declare class BotGeneratorHelper {
      * @param botRole Role of bot weapon is generated for
      * @returns Weapon + mods array
      */
-    generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentWeaponTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string): Item[];
+    generateModsForWeapon(sessionId: string, weapon: Item[], modPool: Mods, weaponParentId: string, parentWeaponTemplate: ITemplateItem, modSpawnChances: ModsChances, ammoTpl: string, botRole: string, botLevel: number): Item[];
     /**
      *
-     * @param modSlot
-     * @param isRandomisableSlot
-     * @param modsParent
-     * @param botEquipBlacklist
-     * @param itemModPool
+     * @param modSlot Slot mod will fit into
+     * @param isRandomisableSlot Will generate a randomised mod pool if true
+     * @param modsParent Parent slot the item will be a part of
+     * @param botEquipBlacklist Blacklist to prevent mods from being picked
+     * @param itemModPool Pool of items to pick from
      * @param weapon array with only weapon tpl in it, ready for mods to be added
      * @param ammoTpl ammo tpl to use if slot requires a cartridge to be added (e.g. mod_magazine)
-     * @param parentTemplate
-     * @returns
+     * @param parentTemplate Parent item the mod will go into
+     * @returns ITemplateItem
      */
     protected chooseModToPutIntoSlot(modSlot: string, isRandomisableSlot: boolean, modsParent: Slot, botEquipBlacklist: EquipmentFilterDetails, itemModPool: Record<string, string[]>, weapon: Item[], ammoTpl: string, parentTemplate: ITemplateItem): [boolean, ITemplateItem];
     /**
@@ -114,8 +121,10 @@ export declare class BotGeneratorHelper {
      * Find all compatible mods for equipment item and add to modPool
      * @param itemDetails item to find mods for
      * @param modPool ModPool to add mods to
+     * @param equipmentBlacklist equipment not allowed to be used by the bot
+     * @param botEquipmentRole bot type to generate pool for (e.g. assault, pmcBot, pmc for usec/bear)
      */
-    generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods): void;
+    generateDynamicModPool(itemDetails: ITemplateItem, modPool: Mods, equipmentBlacklist: EquipmentFilterDetails[], botEquipmentRole: string): void;
     /**
      * Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist
      * @param allowedMods base mods to filter
@@ -153,7 +162,7 @@ export declare class BotGeneratorHelper {
      * @param modTemplate Used to add additional properites in the upd object
      * @returns Item object
      */
-    protected createModItem(modId: string, modTpl: string, parentId: string, modSlot: string, modTemplate: ITemplateItem): Item;
+    protected createModItem(modId: string, modTpl: string, parentId: string, modSlot: string, modTemplate: ITemplateItem, botRole: string): Item;
     /**
      * randomly choose if a mod should be spawned, 100% for required mods OR mod is ammo slot
      * never return true for an item that has 0% spawn chance
@@ -170,10 +179,10 @@ export declare class BotGeneratorHelper {
      */
     protected getAmmoContainers(): string[];
     /**
-     * Get the slot details for an item (chamber/cartridge/slot)
+     * Get a Slot property for an item (chamber/cartridge/slot)
      * @param modSlot e.g patron_in_weapon
      * @param parentTemplate item template
-     * @returns
+     * @returns Slot item
      */
     protected getModItemSlot(modSlot: string, parentTemplate: ITemplateItem): Slot;
     /**
@@ -185,7 +194,6 @@ export declare class BotGeneratorHelper {
      * @param modPool modPool which should include available cartrigdes
      * @param parentId The CylinderMagazine's UID
      * @param parentTemplate The CylinderMagazine's template
-     * @returns
      */
     protected fillCamora(items: Item[], modPool: Mods, parentId: string, parentTemplate: ITemplateItem): void;
     /**
@@ -197,11 +205,11 @@ export declare class BotGeneratorHelper {
     /**
      * Adds properties to an item
      * e.g. Repairable / HasHinge / Foldable / MaxDurability
-     * @param itemTemplate
-     * @param botRole Used by weapons to randomise the durability values
+     * @param itemTemplate Item extra properties are being generated for
+     * @param botRole Used by weapons to randomise the durability values. Null for non-equipped items
      * @returns Item Upd object with extra properties
      */
-    generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: any): {
+    generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: string): {
         upd?: Upd;
     };
     /**
@@ -220,21 +228,27 @@ export declare class BotGeneratorHelper {
     protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole: string): Repairable;
     /**
      * Get a random mod from an items compatible mods Filter array
-     * @param modTpl
-     * @param parentSlot
-     * @param modSlot
-     * @param items
+     * @param modTpl ????
+     * @param parentSlot item mod will go into, used to get combatible items
+     * @param modSlot Slot to get mod to fill
+     * @param items items to ensure picked mod is compatible with
      * @returns item tpl
      */
     protected getModTplFromItemDb(modTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string;
     /**
      * Can an item be added to an item without issue
-     * @param items
-     * @param tplToCheck
-     * @param equipmentSlot
-     * @returns true if possible
+     * @param items items to check compatiblilities with
+     * @param tplToCheck tpl of the item to check for incompatibilities
+     * @param equipmentSlot Slot the item will be placed into
+     * @returns false if no incompatibilties
      */
     isItemIncompatibleWithCurrentItems(items: Item[], tplToCheck: string, equipmentSlot: string): boolean;
+    /**
+     * Convert a bots role to the equipment role used in config/bot.json
+     * @param botRole Role to convert
+     * @returns Equipment role (e.g. pmc / assault / bossTagilla)
+     */
+    getBotEquipmentRole(botRole: string): string;
 }
 /** TODO - move into own class */
 export declare class ExhaustableArray<T> {
diff --git a/Live/CWX_DebugTool/types/helpers/BotHelper.d.ts b/Live/CWX_DebugTool/types/helpers/BotHelper.d.ts
index 67a6384..2752a0e 100644
--- a/Live/CWX_DebugTool/types/helpers/BotHelper.d.ts
+++ b/Live/CWX_DebugTool/types/helpers/BotHelper.d.ts
@@ -1,8 +1,9 @@
 import { Difficulty, IBotType } from "../models/eft/common/tables/IBotType";
-import { IBotConfig } from "../models/spt/config/IBotConfig";
+import { EquipmentFilters, IBotConfig, RandomisationDetails } from "../models/spt/config/IBotConfig";
 import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
+import { LocalisationService } from "../services/LocalisationService";
 import { JsonUtil } from "../utils/JsonUtil";
 import { RandomUtil } from "../utils/RandomUtil";
 export declare class BotHelper {
@@ -10,46 +11,27 @@ export declare class BotHelper {
     protected jsonUtil: JsonUtil;
     protected databaseServer: DatabaseServer;
     protected randomUtil: RandomUtil;
+    protected localisationService: LocalisationService;
     protected configServer: ConfigServer;
     protected botConfig: IBotConfig;
-    constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, configServer: ConfigServer);
-    /**
-     * Get difficulty settings for desired bot type, if not found use assault bot types
-     * @param type bot type to retreive difficulty of
-     * @param difficulty difficulty to get settings for (easy/normal etc)
-     * @returns Difficulty object
-     */
-    getBotDifficultySettings(type: string, difficulty: string): Difficulty;
+    constructor(logger: ILogger, jsonUtil: JsonUtil, databaseServer: DatabaseServer, randomUtil: RandomUtil, localisationService: LocalisationService, configServer: ConfigServer);
     /**
      * Get a template object for the specified botRole from bots.types db
      * @param role botRole to get template for
      * @returns IBotType object
      */
     getBotTemplate(role: string): IBotType;
-    /**
-     * Get difficulty settings for a PMC
-     * @param type "usec" / "bear"
-     * @param difficulty what difficulty to retrieve
-     * @returns Difficulty object
-     */
-    getPmcDifficultySettings(type: string, difficulty: string): Difficulty;
-    /**
-     * Translate chosen value from pre-raid difficulty dropdown into bot difficulty value
-     * @param dropDownDifficulty Dropdown difficulty value to convert
-     * @returns bot difficulty
-     */
-    convertBotDifficultyDropdownToBotDifficulty(dropDownDifficulty: string): string;
-    /**
-     * Choose a random difficulty from - easy/normal/hard/impossible
-     * @returns random difficulty
-     */
-    chooseRandomDifficulty(): string;
     /**
      * Randomise the chance the PMC will attack their own side
      * Look up value in bot.json/chanceSameSideIsHostilePercent
      * @param difficultySettings pmc difficulty settings
      */
     randomisePmcHostility(difficultySettings: Difficulty): void;
+    /**
+     * Is the passed in bot role a PMC (usec/bear/pmc)
+     * @param botRole bot role to check
+     * @returns true if is pmc
+     */
     isBotPmc(botRole: string): boolean;
     isBotBoss(botRole: string): boolean;
     isBotFollower(botRole: string): boolean;
@@ -77,4 +59,11 @@ export declare class BotHelper {
      * @returns true if should be a pmc
      */
     shouldBotBePmc(botRole: string): boolean;
+    /**
+     * Get randomisation settings for bot from config/bot.json
+     * @param botLevel level of bot
+     * @param botEquipConfig bot equipment json
+     * @returns RandomisationDetails
+     */
+    getBotRandomisationDetails(botLevel: number, botEquipConfig: EquipmentFilters): RandomisationDetails;
 }
diff --git a/Live/CWX_DebugTool/types/helpers/GameEventHelper.d.ts b/Live/CWX_DebugTool/types/helpers/GameEventHelper.d.ts
index fca87be..fa25eff 100644
--- a/Live/CWX_DebugTool/types/helpers/GameEventHelper.d.ts
+++ b/Live/CWX_DebugTool/types/helpers/GameEventHelper.d.ts
@@ -15,4 +15,15 @@ export declare class GameEventHelper {
      * @returns Record with event name + start/end date
      */
     getEventDetails(): ISeasonalEvent[];
+    /**
+     * Is detection of seasonal events enabled (halloween / christmas)
+     * @returns true if seasonal events should be checked for
+     */
+    isAutomaticEventDetectionEnabled(): boolean;
+    /**
+     * Get a dictionary of gear changes to apply to bots for a specific event e.g. Christmas/Halloween
+     * @param eventName Name of event to get gear changes for
+     * @returns bots with equipment changes
+     */
+    getEventBotGear(eventName: string): Record<string, Record<string, Record<string, number>>>;
 }
diff --git a/Live/CWX_DebugTool/types/helpers/HideoutHelper.d.ts b/Live/CWX_DebugTool/types/helpers/HideoutHelper.d.ts
index 5f7e3b7..9d51fed 100644
--- a/Live/CWX_DebugTool/types/helpers/HideoutHelper.d.ts
+++ b/Live/CWX_DebugTool/types/helpers/HideoutHelper.d.ts
@@ -11,6 +11,7 @@ import { ILogger } from "../models/spt/utils/ILogger";
 import { EventOutputHolder } from "../routers/EventOutputHolder";
 import { ConfigServer } from "../servers/ConfigServer";
 import { DatabaseServer } from "../servers/DatabaseServer";
+import { LocalisationService } from "../services/LocalisationService";
 import { PlayerService } from "../services/PlayerService";
 import { HashUtil } from "../utils/HashUtil";
 import { HttpResponseUtil } from "../utils/HttpResponseUtil";
@@ -29,13 +30,14 @@ export declare class HideoutHelper {
     protected profileHelper: ProfileHelper;
     protected inventoryHelper: InventoryHelper;
     protected playerService: PlayerService;
+    protected localisationService: LocalisationService;
     protected configServer: ConfigServer;
     static bitcoinFarm: string;
     static waterCollector: string;
     static bitcoin: string;
     static expeditionaryFuelTank: string;
     protected hideoutConfig: IHideoutConfig;
-    constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, eventOutputHolder: EventOutputHolder, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, configServer: ConfigServer);
+    constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, randomUtil: RandomUtil, databaseServer: DatabaseServer, eventOutputHolder: EventOutputHolder, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, inventoryHelper: InventoryHelper, playerService: PlayerService, localisationService: LocalisationService, configServer: ConfigServer);
     registerProduction(pmcData: IPmcData, body: IHideoutSingleProductionStartRequestData | IHideoutContinousProductionStartRequestData, sessionID: string): IItemEventRouterResponse;
     /**
      * This convinience function intialies new Production Object
diff --git a/Live/CWX_DebugTool/types/helpers/InventoryHelper.d.ts b/Live/CWX_DebugTool/types/helpers/InventoryHelper.d.ts
index b8e5c9d..6419f93 100644
--- a/Live/CWX_DebugTool/types/helpers/InventoryHelper.d.ts
+++ b/Live/CWX_DebugTool/types/helpers/InventoryHelper.d.ts
@@ -5,11 +5,12 @@ 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 { IInventoryConfig, RewardDetails } 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 { LocalisationService } from "../services/LocalisationService";
 import { HashUtil } from "../utils/HashUtil";
 import { HttpResponseUtil } from "../utils/HttpResponseUtil";
 import { JsonUtil } from "../utils/JsonUtil";
@@ -38,9 +39,10 @@ export declare class InventoryHelper {
     protected itemHelper: ItemHelper;
     protected containerHelper: ContainerHelper;
     protected profileHelper: ProfileHelper;
+    protected localisationService: LocalisationService;
     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);
+    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, localisationService: LocalisationService, 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;
     removeItemByCount(pmcData: IPmcData, itemId: string, count: number, sessionID: string, output?: IItemEventRouterResponse): IItemEventRouterResponse;
@@ -76,6 +78,12 @@ export declare class InventoryHelper {
     * Internal helper function to handle cartridges in inventory if any of them exist.
     */
     protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void;
+    /**
+     * Get details for how a random loot container should be handled, max rewards, possible reward tpls
+     * @param itemTpl Container being opened
+     * @returns Reward details
+     */
+    getRandomLootContainerRewardDetails(itemTpl: string): RewardDetails;
 }
 declare namespace InventoryHelper {
     interface InventoryItemHash {
diff --git a/Live/CWX_DebugTool/types/helpers/ItemHelper.d.ts b/Live/CWX_DebugTool/types/helpers/ItemHelper.d.ts
index 0effaf2..fc88a46 100644
--- a/Live/CWX_DebugTool/types/helpers/ItemHelper.d.ts
+++ b/Live/CWX_DebugTool/types/helpers/ItemHelper.d.ts
@@ -5,6 +5,7 @@ import { IStaticAmmoDetails } from "../models/eft/common/tables/ILootBase";
 import { ITemplateItem } from "../models/eft/common/tables/ITemplateItem";
 import { ILogger } from "../models/spt/utils/ILogger";
 import { DatabaseServer } from "../servers/DatabaseServer";
+import { LocaleService } from "../services/LocaleService";
 import { HashUtil } from "../utils/HashUtil";
 import { JsonUtil } from "../utils/JsonUtil";
 import { MathUtil } from "../utils/MathUtil";
@@ -18,7 +19,8 @@ declare class ItemHelper {
     protected objectId: ObjectId;
     protected mathUtil: MathUtil;
     protected databaseServer: DatabaseServer;
-    constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer);
+    protected localeService: LocaleService;
+    constructor(logger: ILogger, hashUtil: HashUtil, jsonUtil: JsonUtil, randomUtil: RandomUtil, objectId: ObjectId, mathUtil: MathUtil, databaseServer: DatabaseServer, localeService: LocaleService);
     /**
      * Checks if an id is a valid item. Valid meaning that it's an item that be stored in stash
      * @param       {string}    tpl       the template id / tpl
@@ -212,6 +214,12 @@ declare class ItemHelper {
      * @returns size of stack
      */
     getItemStackSize(item: Item): number;
+    /**
+     * Get the name of an item from the locale file using the item tpl
+     * @param itemTpl Tpl of item to get name of
+     * @returns Name of item
+     */
+    getItemName(itemTpl: string): string;
 }
 declare namespace ItemHelper {
     interface ItemSize {
diff --git a/Live/CWX_DebugTool/types/helpers/QuestHelper.d.ts b/Live/CWX_DebugTool/types/helpers/QuestHelper.d.ts
index a6b4892..edbd2e1 100644
--- a/Live/CWX_DebugTool/types/helpers/QuestHelper.d.ts
+++ b/Live/CWX_DebugTool/types/helpers/QuestHelper.d.ts
@@ -50,6 +50,12 @@ export declare class QuestHelper {
      * @returns true if player level is greater than or equal to quest
      */
     doesPlayerLevelFulfilCondition(playerLevel: number, condition: AvailableForConditions): boolean;
+    /**
+     * Get the quests found in both arrays (inner join)
+     * @param before Array of qeusts #1
+     * @param after Array of quests #2
+     * @returns Reduction of cartesian product between two quest arrays
+     */
     getDeltaQuests(before: IQuest[], after: IQuest[]): IQuest[];
     /**
      * Increase skill points of a skill on player profile
@@ -66,38 +72,85 @@ export declare class QuestHelper {
      * quest list in question.
      */
     dumpQuests(quests: any): void;
-    loyaltyRequirementCheck(loyaltyRequirementProperties: AvailableForProps, profile: IPmcData): boolean;
-    protected processReward(reward: Reward): any[];
+    /**
+     * Check if trader has sufficient loyalty to fullfill quest requirement
+     * @param questProperties Quest props
+     * @param profile Player profile
+     * @returns true if loyalty is high enough to fulfil quest requirement
+     */
+    traderStandingRequirementCheck(questProperties: AvailableForProps, profile: IPmcData): boolean;
+    protected processReward(reward: Reward): Reward[];
+    /**
+     * Gets a flat list of reward items for the given quest at a specific state (e.g. Fail/Success)
+     * @param quest quest to get rewards for
+     * @param state Quest status that holds the items (Started, Success, Fail)
+     * @returns array of items with the correct maxStack
+     */
     getQuestRewardItems(quest: IQuest, state: QuestStatus): Reward[];
     /**
-     * Add quest with new state value to pmc profile
+     * Update player profile with quest status (e.g. Fail/Success)
      * @param pmcData profile to add quest to
      * @param newState state the new quest should be in when added
      * @param acceptedQuest Details of quest being added
      */
     addQuestToPMCData(pmcData: IPmcData, newState: QuestStatus, 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
+     * TODO: what is going on here
+     * @param acceptedQuestId Quest to add to profile
+     * @param sessionID Session id
+     * @returns Array of quests in profile + quest passed in as param
+     */
+    acceptedUnlocked(acceptedQuestId: string, sessionID: string): IQuest[];
+    /**
+     * TODO: what is going on here
+     * @param failedQuestId
+     * @param sessionID Session id
+     * @returns
+     */
+    failedUnlocked(failedQuestId: string, sessionID: string): IQuest[];
+    /**
+     * Adjust quest money rewards by passed in multipler
+     * @param quest Quest to multiple money rewards
+     * @param multipler Value to adjust money rewards by
+     * @returns Updated quest
+     */
+    applyMoneyBoost(quest: IQuest, multipler: number): IQuest;
+    /**
+     * Sets the item stack to new value, or delete the item if value <= 0
+     * // TODO maybe merge this function and the one from customization
+     * @param pmcData Profile
+     * @param itemId id of item to adjust stack size of
+     * @param newStackSize Stack size to adjust to
+     * @param sessionID Session id
+     * @param output ItemEvent router response
+     */
+    changeItemStack(pmcData: IPmcData, itemId: string, newStackSize: number, sessionID: string, output: IItemEventRouterResponse): void;
+    /**
+     * Get List of All Quests from db
+     * NOT CLONED
      * @returns Array of IQuest objects
      */
-    questValues(): IQuest[];
+    getQuestsFromDb(): IQuest[];
     /**
-     * Reest AvailableForStart conditions for quests
-     * @param quests queststo clean
+     * Get quests, strip all requirement conditions except level
+     * @param quests quests to process
      * @returns quest array without conditions
      */
-    protected cleanQuestList(quests: IQuest[]): IQuest[];
+    protected getQuestsWithOnlyLevelRequirementStartCondition(quests: IQuest[]): IQuest[];
     /**
-     * Reset AvailableForStart conditions on a quest
+     * Remove all quest conditions except for level requirement
      * @param quest quest to clean
      * @returns reset IQuest object
      */
-    cleanQuestConditions(quest: IQuest): IQuest;
-    failQuest(pmcData: IPmcData, body: any, sessionID: string): any;
+    getQuestWithOnlyLevelRequirementStartCondition(quest: IQuest): IQuest;
+    /**
+     * Fail a quest in a player profile
+     * @param pmcData Profile
+     * @param failRequest fail quest request data
+     * @param sessionID Session id
+     * @returns Item event router response
+     */
+    failQuest(pmcData: IPmcData, failRequest: any, sessionID: string): IItemEventRouterResponse;
     /**
      * Get quest by id from database
      * @param questId questid to look for
@@ -105,7 +158,12 @@ export declare class QuestHelper {
      * @returns IQuest object
      */
     getQuestFromDb(questId: string, pmcData: IPmcData): IQuest;
-    getQuestLocaleIdFromDb(messageId: string): string;
+    /**
+     * Get the locale Id from locale db for a quest message
+     * @param questMessageId Quest mesage id to look up
+     * @returns Locale Id from locale db
+     */
+    getQuestLocaleIdFromDb(questMessageId: string): string;
     /**
      * Alter a quests state + Add a record to tis status timers object
      * @param pmcData Profile to update
@@ -128,5 +186,10 @@ export declare class QuestHelper {
      * @returns bonus in percent
      */
     protected getIntelCenterRewardBonus(pmcData: IPmcData): number;
-    getFindItemIdForQuestItem(itemTpl: string): string;
+    /**
+     * Find quest with 'findItem' requirement that needs the item tpl be handed in
+     * @param itemTpl item tpl to look for
+     * @returns 'FindItem' condition id
+     */
+    getFindItemIdForQuestHandIn(itemTpl: string): string;
 }
diff --git a/Live/CWX_DebugTool/types/helpers/RagfairServerHelper.d.ts b/Live/CWX_DebugTool/types/helpers/RagfairServerHelper.d.ts
index a03cdda..ec388d8 100644
--- a/Live/CWX_DebugTool/types/helpers/RagfairServerHelper.d.ts
+++ b/Live/CWX_DebugTool/types/helpers/RagfairServerHelper.d.ts
@@ -44,10 +44,20 @@ export declare class RagfairServerHelper {
     isPlayer(userID: string): boolean;
     returnItems(sessionID: string, items: any[]): void;
     calculateDynamicStackCount(tplId: string, isWeaponPreset: boolean): number;
+    /**
+     * Choose a currency at random with bias
+     * @returns currency tpl
+     */
     getDynamicOfferCurrency(): string;
     getMemberType(userID: string): MemberCategory;
     getNickname(userID: string): string;
     getPresetItems(item: any): Item[];
     getPresetItemsByTpl(item: Item): Item[];
+    /**
+     * Generate new unique ids for the children while preserving hierarchy
+     * @param item base item
+     * @param preset
+     * @returns Item array with new IDs
+     */
     reparentPresets(item: Item, preset: Item[]): Item[];
 }
diff --git a/Live/CWX_DebugTool/types/helpers/RagfairSortHelper.d.ts b/Live/CWX_DebugTool/types/helpers/RagfairSortHelper.d.ts
index 28d1d38..4669ce6 100644
--- a/Live/CWX_DebugTool/types/helpers/RagfairSortHelper.d.ts
+++ b/Live/CWX_DebugTool/types/helpers/RagfairSortHelper.d.ts
@@ -18,7 +18,7 @@ export declare class RagfairSortHelper {
     protected sortOffersByRating(a: IRagfairOffer, b: IRagfairOffer): number;
     protected sortOffersByName(a: IRagfairOffer, b: IRagfairOffer): number;
     /**
-     * Order two offers by price value
+     * Order two offers by rouble price value
      * @param a Offer a
      * @param b Offer b
      * @returns
diff --git a/Live/CWX_DebugTool/types/loaders/PreAkiModLoader.d.ts b/Live/CWX_DebugTool/types/loaders/PreAkiModLoader.d.ts
index 7a687a5..f486a28 100644
--- a/Live/CWX_DebugTool/types/loaders/PreAkiModLoader.d.ts
+++ b/Live/CWX_DebugTool/types/loaders/PreAkiModLoader.d.ts
@@ -1,29 +1,31 @@
 import { DependencyContainer } from "tsyringe";
+import { IPostAkiLoadMod } from "../models/external/IPostAkiLoadMod";
+import { IPostDBLoadMod } from "../models/external/IPostDBLoadMod";
+import { IPreAkiLoadMod } from "../models/external/IPreAkiLoadMod";
 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 { LocalisationService } from "../services/LocalisationService";
 import { ModCompilerService } from "../services/ModCompilerService";
 import { JsonUtil } from "../utils/JsonUtil";
 import { VFS } from "../utils/VFS";
 import { BundleLoader } from "./BundleLoader";
-import { IPostAkiLoadMod } from "../models/external/IPostAkiLoadMod";
-import { IPreAkiLoadMod } from "../models/external/IPreAkiLoadMod";
-import { IPostDBLoadMod } from "../models/external/IPostDBLoadMod";
 export declare class PreAkiModLoader implements IModLoader {
     protected logger: ILogger;
     protected vfs: VFS;
     protected jsonUtil: JsonUtil;
     protected modCompilerService: ModCompilerService;
     protected bundleLoader: BundleLoader;
+    protected localisationService: LocalisationService;
     protected configServer: ConfigServer;
     protected static container: DependencyContainer;
     protected readonly basepath = "user/mods/";
     protected imported: Record<string, ModLoader.IMod>;
     protected akiConfig: ICoreConfig;
-    constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, configServer: ConfigServer);
+    constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, modCompilerService: ModCompilerService, bundleLoader: BundleLoader, localisationService: LocalisationService, configServer: ConfigServer);
     load(container: DependencyContainer): Promise<void>;
     getBundles(local: boolean): string;
     getBundle(key: string, local: boolean): void;
diff --git a/Live/CWX_DebugTool/types/models/eft/bot/IGenerateBotsRequestData.d.ts b/Live/CWX_DebugTool/types/models/eft/bot/IGenerateBotsRequestData.d.ts
index c49cef7..f1f7013 100644
--- a/Live/CWX_DebugTool/types/models/eft/bot/IGenerateBotsRequestData.d.ts
+++ b/Live/CWX_DebugTool/types/models/eft/bot/IGenerateBotsRequestData.d.ts
@@ -2,6 +2,7 @@ export interface IGenerateBotsRequestData {
     conditions: Condition[];
 }
 export interface Condition {
+    /** e.g. assault/pmcBot/bossKilla */
     Role: string;
     Limit: number;
     Difficulty: string;
diff --git a/Live/CWX_DebugTool/types/models/eft/bot/IRandomisedBotLevelResult.d.ts b/Live/CWX_DebugTool/types/models/eft/bot/IRandomisedBotLevelResult.d.ts
new file mode 100644
index 0000000..75bd936
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/eft/bot/IRandomisedBotLevelResult.d.ts
@@ -0,0 +1,4 @@
+export interface IRandomisedBotLevelResult {
+    level: number;
+    exp: number;
+}
diff --git a/Live/CWX_DebugTool/types/models/eft/common/IGlobals.d.ts b/Live/CWX_DebugTool/types/models/eft/common/IGlobals.d.ts
index 81e2023..b53f106 100644
--- a/Live/CWX_DebugTool/types/models/eft/common/IGlobals.d.ts
+++ b/Live/CWX_DebugTool/types/models/eft/common/IGlobals.d.ts
@@ -591,6 +591,7 @@ export interface HealPrice {
 export interface ProfileHealthSettings {
     BodyPartsSettings: BodyPartsSettings;
     HealthFactorsSettings: HealthFactorsSettings;
+    DefaultStimulatorBuff: string;
 }
 export interface BodyPartsSettings {
     Head: BodyPartsSetting;
diff --git a/Live/CWX_DebugTool/types/models/eft/common/tables/IBotType.d.ts b/Live/CWX_DebugTool/types/models/eft/common/tables/IBotType.d.ts
index c1fe579..55b4bd9 100644
--- a/Live/CWX_DebugTool/types/models/eft/common/tables/IBotType.d.ts
+++ b/Live/CWX_DebugTool/types/models/eft/common/tables/IBotType.d.ts
@@ -13,8 +13,8 @@ export interface IBotType {
     skills: Skills;
 }
 export interface Appearance {
-    body: string[];
-    feet: string[];
+    body: Record<string, number>;
+    feet: Record<string, number>;
     hands: string[];
     head: string[];
     voice: string[];
diff --git a/Live/CWX_DebugTool/types/models/eft/common/tables/ITemplateItem.d.ts b/Live/CWX_DebugTool/types/models/eft/common/tables/ITemplateItem.d.ts
index 8569e61..0fa7e18 100644
--- a/Live/CWX_DebugTool/types/models/eft/common/tables/ITemplateItem.d.ts
+++ b/Live/CWX_DebugTool/types/models/eft/common/tables/ITemplateItem.d.ts
@@ -254,7 +254,7 @@ export interface Props {
     foodUseTime?: number;
     foodEffectType?: string;
     StimulatorBuffs?: string;
-    effects_health?: any;
+    effects_health?: IHealthEffect[] | Record<string, Record<string, number>>;
     effects_damage?: any;
     MaximumNumberOfUsage?: number;
     knifeHitDelay?: number;
@@ -366,6 +366,10 @@ export interface Props {
     MinTimeToContactExplode?: number;
     ExplosionEffectType?: string;
 }
+export interface IHealthEffect {
+    type: string;
+    value: number;
+}
 export interface Prefab {
     path: string;
     rcid: string;
diff --git a/Live/CWX_DebugTool/types/models/eft/customization/IGetSuitsResponse.d.ts b/Live/CWX_DebugTool/types/models/eft/customization/IGetSuitsResponse.d.ts
new file mode 100644
index 0000000..cbb909d
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/eft/customization/IGetSuitsResponse.d.ts
@@ -0,0 +1,4 @@
+export interface IGetSuitsResponse {
+    _id: string;
+    suites: string[];
+}
diff --git a/Live/CWX_DebugTool/types/models/eft/game/IGameKeepAliveResponse.d.ts b/Live/CWX_DebugTool/types/models/eft/game/IGameKeepAliveResponse.d.ts
new file mode 100644
index 0000000..170ce6a
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/eft/game/IGameKeepAliveResponse.d.ts
@@ -0,0 +1,4 @@
+export interface IGameKeepAliveResponse {
+    msg: string;
+    utc_time: number;
+}
diff --git a/Live/CWX_DebugTool/types/models/eft/game/IGameLogoutResponseData.d.ts b/Live/CWX_DebugTool/types/models/eft/game/IGameLogoutResponseData.d.ts
new file mode 100644
index 0000000..0f52050
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/eft/game/IGameLogoutResponseData.d.ts
@@ -0,0 +1,3 @@
+export interface IGameLogoutResponseData {
+    status: string;
+}
diff --git a/Live/CWX_DebugTool/types/models/eft/game/IGameStartResponse.d.ts b/Live/CWX_DebugTool/types/models/eft/game/IGameStartResponse.d.ts
new file mode 100644
index 0000000..9f0ab6d
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/eft/game/IGameStartResponse.d.ts
@@ -0,0 +1,3 @@
+export interface IGameStartResponse {
+    utc_time: number;
+}
diff --git a/Live/CWX_DebugTool/types/models/eft/inventory/IOpenRandomLootContainerRequestData.d.ts b/Live/CWX_DebugTool/types/models/eft/inventory/IOpenRandomLootContainerRequestData.d.ts
new file mode 100644
index 0000000..3c45124
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/eft/inventory/IOpenRandomLootContainerRequestData.d.ts
@@ -0,0 +1,11 @@
+import { IInventoryBaseActionRequestData } from "./IInventoryBaseActionRequestData";
+export interface IOpenRandomLootContainerRequestData extends IInventoryBaseActionRequestData {
+    Action: "OpenRandomLootContainer";
+    /** Container item opened */
+    item: string;
+    to: To[];
+}
+export interface To {
+    /** Player character (pmc/scav) id items will be sent to */
+    id: string;
+}
diff --git a/Live/CWX_DebugTool/types/models/eft/itemEvent/IItemEventRouterBase.d.ts b/Live/CWX_DebugTool/types/models/eft/itemEvent/IItemEventRouterBase.d.ts
index 4841cfd..60ab284 100644
--- a/Live/CWX_DebugTool/types/models/eft/itemEvent/IItemEventRouterBase.d.ts
+++ b/Live/CWX_DebugTool/types/models/eft/itemEvent/IItemEventRouterBase.d.ts
@@ -10,8 +10,9 @@ export interface IItemEventRouterBase {
 export declare type TProfileChanges = Record<string, ProfileChange>;
 export interface Warning {
     index: number;
-    err: string;
     errmsg: string;
+    code?: string;
+    data?: any;
 }
 export interface ProfileChange {
     _id: string;
diff --git a/Live/CWX_DebugTool/types/models/eft/match/IStartOffineRaidRequestData.d.ts b/Live/CWX_DebugTool/types/models/eft/match/IStartOffineRaidRequestData.d.ts
index af0625e..1983728 100644
--- a/Live/CWX_DebugTool/types/models/eft/match/IStartOffineRaidRequestData.d.ts
+++ b/Live/CWX_DebugTool/types/models/eft/match/IStartOffineRaidRequestData.d.ts
@@ -2,8 +2,10 @@ import { BotAmount } from "../../enums/BotAmount";
 import { BotDifficulty } from "../../enums/BotDifficulty";
 export interface IStartOfflineRaidRequestData {
     locationName: string;
+    /** Current time, not in-game time */
     startTime: number;
-    dateTime: string;
+    /** CURR = am, past = pm */
+    dateTime: "CURR" | "PAST";
     gameSettings: GameSettings;
 }
 export interface GameSettings {
diff --git a/Live/CWX_DebugTool/types/models/eft/notifier/ISelectProfileResponse.d.ts b/Live/CWX_DebugTool/types/models/eft/notifier/ISelectProfileResponse.d.ts
new file mode 100644
index 0000000..ecb668a
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/eft/notifier/ISelectProfileResponse.d.ts
@@ -0,0 +1,6 @@
+import { INotifierChannel } from "./INotifier";
+export interface ISelectProfileResponse {
+    status: string;
+    notifier: INotifierChannel;
+    notifierServer: string;
+}
diff --git a/Live/CWX_DebugTool/types/models/eft/ragfair/IRagfairOffer.d.ts b/Live/CWX_DebugTool/types/models/eft/ragfair/IRagfairOffer.d.ts
index 3251a37..792ec7d 100644
--- a/Live/CWX_DebugTool/types/models/eft/ragfair/IRagfairOffer.d.ts
+++ b/Live/CWX_DebugTool/types/models/eft/ragfair/IRagfairOffer.d.ts
@@ -7,19 +7,19 @@ export interface IRagfairOffer {
     requirements: OfferRequirement[];
     root: string;
     intId: number;
+    /** Handbook price */
     itemsCost: number;
+    /** Rouble price */
     requirementsCost: number;
-    sptRequirementsCostRouble: number;
     startTime: number;
     endTime: number;
     sellInOnePiece: boolean;
-    name?: string;
-    shortName?: string;
     loyaltyLevel: number;
     buyRestrictionMax?: number;
     buyRestrictionCurrent?: number;
     locked: boolean;
     unlimitedCount: boolean;
+    /** Rouble price */
     summaryCost: number;
     user: IRagfairOfferUser;
     notAvailable: boolean;
@@ -33,11 +33,11 @@ export interface OfferRequirement {
 }
 export interface IRagfairOfferUser {
     id: string;
-    nickname: string;
-    rating: number;
+    nickname?: string;
+    rating?: number;
     memberType: MemberCategory;
-    avatar: string;
-    isRatingGrowing: boolean;
+    avatar?: string;
+    isRatingGrowing?: boolean;
 }
 export interface SellResult {
     sellTime: number;
diff --git a/Live/CWX_DebugTool/types/models/eft/weather/IWeatherData.d.ts b/Live/CWX_DebugTool/types/models/eft/weather/IWeatherData.d.ts
index ecc96ce..1f5d5b5 100644
--- a/Live/CWX_DebugTool/types/models/eft/weather/IWeatherData.d.ts
+++ b/Live/CWX_DebugTool/types/models/eft/weather/IWeatherData.d.ts
@@ -1,17 +1,18 @@
+import { WindDirection } from "../../../models/enums/WindDirection";
 export interface IWeatherData {
     acceleration: number;
     time: string;
     date: string;
-    weather: IWeather;
+    weather?: IWeather;
 }
 export interface IWeather {
     pressure: number;
     temp: number;
-    fog: string;
+    fog: number;
     rain_intensity: number;
-    rain: any;
+    rain: number;
     wind_gustiness: number;
-    wind_direction: any;
+    wind_direction: WindDirection;
     wind_speed: number;
     cloud: number;
     time: string;
diff --git a/Live/CWX_DebugTool/types/models/enums/BackendErrorCodes.d.ts b/Live/CWX_DebugTool/types/models/enums/BackendErrorCodes.d.ts
new file mode 100644
index 0000000..6614b75
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/enums/BackendErrorCodes.d.ts
@@ -0,0 +1,67 @@
+export declare enum BackendErrorCodes {
+    NONE = 0,
+    UNKNOWN_ERROR = 200,
+    NOT_AUTHORIZED = 201,
+    NEED_AUTHORIZATION_CODE = 209,
+    WRONG_AUTHORIZATION_CODE = 211,
+    NEED_CAPTCHA = 214,
+    NO_NEED_CAPTCHA = 215,
+    CAPTCHA_FAILED = 218,
+    CAPTCHA_BRUTE_FORCED = 219,
+    NO_ROOM_IN_STASH = 223,
+    NICKNAME_NOT_UNIQUE = 225,
+    NICKNAME_NOT_VALID = 226,
+    UNSUPPORTED_CLIENT_VERSION = 232,
+    REPORT_NOT_ALLOWED = 238,
+    NICKNAME_IS_ABUSIVE = 241,
+    NICKNAME_CHANGE_TIMEOUT = 242,
+    NOT_MODIFIED = 304,
+    HTTP_BAD_REQUEST = 400,
+    HTTP_NOT_AUTHORIZED = 401,
+    HTTP_FORBIDDEN = 403,
+    HTTP_NOT_FOUND = 404,
+    HTTP_METHOD_NOT_ALLOWED = 405,
+    UNKNOWN_TRADING_ERROR = 500,
+    HTTPNOTIMPLEMENTED = 501,
+    HTTPBADGATEWAY = 502,
+    HTTPSERVICEUNAVAILABLE = 503,
+    HTTPGATEWAYTIMEOUT = 504,
+    TRADEROUTOFMONEY = 505,
+    HTTPVARIANTALSONEGOTIATES = 506,
+    PRICECHANGED = 509,
+    TRADERDISABLED = 512,
+    ITEMHASBEENSOLD = 513,
+    NOTENOUGHSPACEFORMONEY = 518,
+    HTTPINVALIDSSLCERTIFICATE = 526,
+    UNKNOWNRAGFAIRERROR = 550,
+    UNKNOWNRAGFAIRERROR2 = 551,
+    UNKNOWNMATCHMAKERERROR = 600,
+    SESSIONPARAMETERSERROR = 601,
+    SESSIONLOST = 602,
+    SERVERNOTREGISTERED = 604,
+    UNKNOWNQUESTERROR = 700,
+    QUESTBADPARAM = 702,
+    QUESTNOTFOUND = 703,
+    QUESTISUNAVAILABLE = 704,
+    NOFREESPACEFORREWARDS = 705,
+    WRONGQUESTSTATUS = 706,
+    CANTCOMPLETEQUEST = 707,
+    UNKNOWNMAILERROR = 900,
+    TOOMANYFRIENDREQUESTS = 925,
+    UNKNOWNSCRIPTEXECUTIONERROR = 1000,
+    UNKNOWNREPAIRINGERROR = 1200,
+    UNKNOWNINSURANCEERROR = 1300,
+    UNKNOWNCURRENCYEXCHANGEERROR = 1400,
+    OFFERNOTFOUND = 1503,
+    NOTENOUGHSPACE = 1505,
+    OFFEROUTOFSTOCK = 1506,
+    OFFERSOLD = 1507,
+    RAGFAIRUNAVAILABLE = 1511,
+    BANNEDERRORCODE = 1513,
+    INSUFFICIENTNUMBERINSTOCK = 1516,
+    TOOMANYITEMSTOSELL = 1517,
+    EXAMINATIONFAILED = 22001,
+    ITEMALREADYEXAMINED = 22002,
+    UNKNOWNNGINXERROR = 9000,
+    PARSERESPONSEERROR = 9001
+}
diff --git a/Live/CWX_DebugTool/types/models/enums/HideoutEventActions.d.ts b/Live/CWX_DebugTool/types/models/enums/HideoutEventActions.d.ts
new file mode 100644
index 0000000..e441477
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/enums/HideoutEventActions.d.ts
@@ -0,0 +1,11 @@
+export declare enum HideoutEventActions {
+    HIDEOUT_UPGRADE = "HideoutUpgrade",
+    HIDEOUT_UPGRADE_COMPLETE = "HideoutUpgradeComplete",
+    HIDEOUT_PUT_ITEMS_IN_AREA_SLOTS = "HideoutPutItemsInAreaSlots",
+    HIDEOUT_TAKE_ITEMS_FROM_AREA_SLOTS = "HideoutTakeItemsFromAreaSlots",
+    HIDEOUT_TOGGLE_AREA = "HideoutToggleArea",
+    HIDEOUT_SINGLE_PRODUCTION_START = "HideoutSingleProductionStart",
+    HIDEOUT_SCAV_CASE_PRODUCTION_START = "HideoutScavCaseProductionStart",
+    HIDEOUT_CONTINUOUS_PRODUCTION_START = "HideoutContinuousProductionStart",
+    HIDEOUT_TAKE_PRODUCTION = "HideoutTakeProduction"
+}
diff --git a/Live/CWX_DebugTool/types/models/enums/ItemEventActions.d.ts b/Live/CWX_DebugTool/types/models/enums/ItemEventActions.d.ts
new file mode 100644
index 0000000..0e65453
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/enums/ItemEventActions.d.ts
@@ -0,0 +1,19 @@
+export declare enum ItemEventActions {
+    MOVE = "Move",
+    REMOVE = "Remove",
+    SPLIT = "Split",
+    MERGE = "Merge",
+    TRANSFER = "Transfer",
+    SWAP = "Swap",
+    FOLD = "Fold",
+    TOGGLE = "Toggle",
+    TAG = "Tag",
+    BIND = "Bind",
+    EXAMINE = "Examine",
+    READ_ENCYCLOPEDIA = "ReadEncyclopedia",
+    APPLY_INVENTORY_CHANGES = "ApplyInventoryChanges",
+    CREATE_MAP_MARKER = "CreateMapMarker",
+    DELETE_MAP_MARKER = "DeleteMapMarker",
+    EDIT_MAP_MARKER = "EditMapMarker",
+    OPEN_RANDOM_LOOT_CONTAINER = "OpenRandomLootContainer"
+}
diff --git a/Live/CWX_DebugTool/types/models/enums/WeatherType.d.ts b/Live/CWX_DebugTool/types/models/enums/WeatherType.d.ts
new file mode 100644
index 0000000..d31fefe
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/enums/WeatherType.d.ts
@@ -0,0 +1,19 @@
+export declare enum WeatherType {
+    CLEAR_DAY = 1,
+    CLEAR_WIND = 2,
+    CLEAR_NIGHT = 3,
+    PARTLY_CLOUD_DAY = 4,
+    PARTLY_CLOUD_NIGHT = 5,
+    CLEAR_FOG_DAY = 6,
+    CLEAR_FOG_NIGHT = 7,
+    CLOUDFOG = 8,
+    FOG = 9,
+    MOSTLY_CLOUD = 10,
+    LIGHT_RAIN = 11,
+    RAIN = 12,
+    CLOUD_WIND = 13,
+    CLOUD_WIND_RAIN = 14,
+    FULL_CLOUD = 15,
+    THUNDER_CLOUD = 16,
+    NONE = 0
+}
diff --git a/Live/CWX_DebugTool/types/models/enums/WildSpawnTypeNumber.d.ts b/Live/CWX_DebugTool/types/models/enums/WildSpawnTypeNumber.d.ts
new file mode 100644
index 0000000..ff806fe
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/enums/WildSpawnTypeNumber.d.ts
@@ -0,0 +1,33 @@
+export declare enum WildSpawnTypeNumber {
+    ASSAULT = 1,
+    MARKSMAN = 2,
+    BOSSTEST = 4,
+    BOSSBULLY = 8,
+    FOLLOWERTEST = 16,
+    FOLLOWERBULLY = 32,
+    BOSSKILLA = 64,
+    BOSSKOJANIY = 128,
+    FOLLOWERKOJANIY = 256,
+    PMCBOT = 512,
+    CURSEDASSAULT = 1024,
+    BOSSGLUHAR = 2048,
+    FOLLOWERGLUHARASSAULT = 4096,
+    FOLLOWERGLUHARSECURITY = 8192,
+    FOLLOWERGLUHARSCOUT = 16384,
+    FOLLOWERGLUHARSNIPE = 32768,
+    FOLLOWERSANITAR = 65536,
+    BOSSSANITAR = 131072,
+    TEST = 262144,
+    ASSAULTGROUP = 524288,
+    SECTANTWARRIOR = 1048576,
+    SECTANTPRIEST = 2097152,
+    BOSSTAGILLA = 4194304,
+    FOLLOWERTAGILLA = 8388608,
+    EXUSEC = 16777216,
+    GIFTER = 33554432,
+    BOSSKNIGHT = 67108864,
+    FOLLOWERBIGPIPE = 134217728,
+    FOLLOWERBIRDEYE = 268435456,
+    SPTUSEC = 536870912,
+    SPTBEAR = 1073741824
+}
diff --git a/Live/CWX_DebugTool/types/models/enums/WindDirection.d.ts b/Live/CWX_DebugTool/types/models/enums/WindDirection.d.ts
new file mode 100644
index 0000000..fb30b20
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/enums/WindDirection.d.ts
@@ -0,0 +1,10 @@
+export declare enum WindDirection {
+    EAST = 1,
+    NORTH = 2,
+    WEST = 3,
+    SOUTH = 4,
+    SE = 5,
+    SW = 6,
+    NW = 7,
+    NE = 8
+}
diff --git a/Live/CWX_DebugTool/types/models/spt/bots/BotGenerationDetails.d.ts b/Live/CWX_DebugTool/types/models/spt/bots/BotGenerationDetails.d.ts
new file mode 100644
index 0000000..256de03
--- /dev/null
+++ b/Live/CWX_DebugTool/types/models/spt/bots/BotGenerationDetails.d.ts
@@ -0,0 +1,16 @@
+export interface BotGenerationDetails {
+    /** Should the bot be generated as a PMC */
+    isPmc: boolean;
+    /** assault/pmcBot etc */
+    role: string;
+    /** Active players current level */
+    playerLevel: number;
+    /** Delta of highest level of bot */
+    botRelativeLevelDeltaMax: number;
+    /** How many to create and store */
+    botCountToGenerate: number;
+    /** Desired difficulty of the bot */
+    botDifficulty: string;
+    /** Will the generated bot be a player scav */
+    isPlayerScav: boolean;
+}
diff --git a/Live/CWX_DebugTool/types/models/spt/config/IBotConfig.d.ts b/Live/CWX_DebugTool/types/models/spt/config/IBotConfig.d.ts
index af8ceba..83897db 100644
--- a/Live/CWX_DebugTool/types/models/spt/config/IBotConfig.d.ts
+++ b/Live/CWX_DebugTool/types/models/spt/config/IBotConfig.d.ts
@@ -27,6 +27,8 @@ export interface IBotConfig extends IBaseConfig {
     maxBotCap: Record<string, number>;
     /** How many stacks of secret ammo should a bot have in its bot secure container */
     secureContainerAmmoStackCount: number;
+    /** Batch generation size when type not available in cache */
+    botGenerationBatchSizePerType: number;
 }
 export interface PresetBatch {
     assault: number;
@@ -64,10 +66,13 @@ export interface LootNvalue {
 }
 export interface EquipmentFilters {
     weaponModLimits: ModLimits;
-    randomisedWeaponModSlots?: string[];
-    randomisedArmorSlots?: string[];
+    faceShieldIsActiveChancePercent?: number;
+    lightLaserIsActiveChancePercent?: number;
+    randomisation: RandomisationDetails[];
     blacklist: EquipmentFilterDetails[];
     whitelist: EquipmentFilterDetails[];
+    clothing: WeightingAdjustmentDetails[];
+    weightingAdjustments: WeightingAdjustmentDetails[];
 }
 export interface ModLimits {
     /** How many scopes are allowed on a weapon - hard coded to work with OPTIC_SCOPE, ASSAULT_SCOPE, COLLIMATOR, COMPACT_COLLIMATOR */
@@ -75,8 +80,27 @@ export interface ModLimits {
     /** How many lasers or lights are allowed on a weapon - hard coded to work with TACTICAL_COMBO, and FLASHLIGHT */
     lightLaserLimit?: number;
 }
+export interface RandomisationDetails {
+    levelRange: MinMax;
+    randomisedWeaponModSlots?: string[];
+    randomisedArmorSlots?: string[];
+    /** Equipment chances */
+    equipment?: Record<string, number>;
+    /** Modc chances */
+    mods?: Record<string, number>;
+}
 export interface EquipmentFilterDetails {
     levelRange: MinMax;
     equipment: Record<string, string[]>;
     cartridge: Record<string, string[]>;
 }
+export interface WeightingAdjustmentDetails {
+    levelRange: MinMax;
+    ammo?: AdjustmentDetails;
+    equipment?: AdjustmentDetails;
+    clothing?: AdjustmentDetails;
+}
+export interface AdjustmentDetails {
+    add: Record<string, Record<string, number>>;
+    edit: Record<string, Record<string, number>>;
+}
diff --git a/Live/CWX_DebugTool/types/models/spt/config/IInventoryConfig.d.ts b/Live/CWX_DebugTool/types/models/spt/config/IInventoryConfig.d.ts
index ffffa41..4642b9b 100644
--- a/Live/CWX_DebugTool/types/models/spt/config/IInventoryConfig.d.ts
+++ b/Live/CWX_DebugTool/types/models/spt/config/IInventoryConfig.d.ts
@@ -2,4 +2,10 @@ import { IBaseConfig } from "./IBaseConfig";
 export interface IInventoryConfig extends IBaseConfig {
     kind: "aki-inventory";
     newItemsMarkedFound: boolean;
+    randomLootContainers: Record<string, RewardDetails>;
+}
+export interface RewardDetails {
+    rewardCount: number;
+    foundInRaid: boolean;
+    rewardTplPool: Record<string, number>;
 }
diff --git a/Live/CWX_DebugTool/types/models/spt/config/ILocaleConfig.d.ts b/Live/CWX_DebugTool/types/models/spt/config/ILocaleConfig.d.ts
index fe9abf7..0a8955c 100644
--- a/Live/CWX_DebugTool/types/models/spt/config/ILocaleConfig.d.ts
+++ b/Live/CWX_DebugTool/types/models/spt/config/ILocaleConfig.d.ts
@@ -1,5 +1,10 @@
 import { IBaseConfig } from "./IBaseConfig";
 export interface ILocaleConfig extends IBaseConfig {
     kind: "aki-locale";
-    desiredLocale: string;
+    /** e.g. ru/en/cn/fr etc, or 'system', will take computer locale setting */
+    gameLocale: string;
+    /** e.g. ru/en/cn/fr etc, or 'system', will take computer locale setting */
+    serverLocale: string;
+    /** Languages server can be translated into */
+    serverSupportedLocales: string[];
 }
diff --git a/Live/CWX_DebugTool/types/models/spt/config/IPmcConfig.d.ts b/Live/CWX_DebugTool/types/models/spt/config/IPmcConfig.d.ts
index 9db2ba1..979122c 100644
--- a/Live/CWX_DebugTool/types/models/spt/config/IPmcConfig.d.ts
+++ b/Live/CWX_DebugTool/types/models/spt/config/IPmcConfig.d.ts
@@ -6,14 +6,17 @@ export interface IPmcConfig {
     looseWeaponInBackpackChancePercent: number;
     looseWeaponInBackpackLootMinMax: MinMax;
     isUsec: number;
+    usecType: string;
+    bearType: string;
     chanceSameSideIsHostilePercent: number;
     /** key: location, value: type for usec/bear */
-    pmcType: Record<string, PmcTypes>;
+    pmcType: Record<string, Record<string, Record<string, number>>>;
     maxBackpackLootTotalRub: number;
     maxPocketLootTotalRub: number;
     maxVestLootTotalRub: number;
     convertIntoPmcChance: Record<string, MinMax>;
     enemyTypes: string[];
+    botRelativeLevelDeltaMax: number;
 }
 export interface PmcTypes {
     usec: string;
diff --git a/Live/CWX_DebugTool/types/models/spt/config/IRagfairConfig.d.ts b/Live/CWX_DebugTool/types/models/spt/config/IRagfairConfig.d.ts
index c1b8763..6786417 100644
--- a/Live/CWX_DebugTool/types/models/spt/config/IRagfairConfig.d.ts
+++ b/Live/CWX_DebugTool/types/models/spt/config/IRagfairConfig.d.ts
@@ -28,12 +28,8 @@ export interface Reputation {
     gain: number;
     loss: number;
 }
-export declare class OfferAdjustment {
-    maxPriceDifferenceBelowHandbookPercent: number;
-    handbookPriceMultipier: number;
-    priceThreshholdRub: number;
-}
 export interface Dynamic {
+    barter: Barter;
     offerAdjustment: OfferAdjustment;
     expiredOfferThreshold: number;
     offerItemCount: MinMax;
@@ -49,6 +45,20 @@ export interface Dynamic {
     showAsSingleStack: string[];
     blacklist: Blacklist;
 }
+export declare class Barter {
+    enable: boolean;
+    chancePercent: number;
+    itemCountMin: number;
+    itemCountMax: number;
+    priceRangeVariancePercent: number;
+    minRoubleCostToBecomeBarter: number;
+    itemTypeBlacklist: string[];
+}
+export declare class OfferAdjustment {
+    maxPriceDifferenceBelowHandbookPercent: number;
+    handbookPriceMultipier: number;
+    priceThreshholdRub: number;
+}
 export interface Condition {
     conditionChance: number;
     min: number;
diff --git a/Live/CWX_DebugTool/types/models/spt/config/ISeasonalEventConfig.d.ts b/Live/CWX_DebugTool/types/models/spt/config/ISeasonalEventConfig.d.ts
index bc60618..e410925 100644
--- a/Live/CWX_DebugTool/types/models/spt/config/ISeasonalEventConfig.d.ts
+++ b/Live/CWX_DebugTool/types/models/spt/config/ISeasonalEventConfig.d.ts
@@ -1,6 +1,9 @@
 import { IBaseConfig } from "./IBaseConfig";
 export interface ISeasonalEventConfig extends IBaseConfig {
     kind: "aki-seasonalevents";
+    enableSeasonalEventDetection: boolean;
+    /** event / botType / equipSlot / itemid */
+    eventGear: Record<string, Record<string, Record<string, Record<string, number>>>>;
     events: ISeasonalEvent[];
 }
 export interface ISeasonalEvent {
diff --git a/Live/CWX_DebugTool/types/models/spt/config/IWeatherConfig.d.ts b/Live/CWX_DebugTool/types/models/spt/config/IWeatherConfig.d.ts
index bbdc43e..41a1c83 100644
--- a/Live/CWX_DebugTool/types/models/spt/config/IWeatherConfig.d.ts
+++ b/Live/CWX_DebugTool/types/models/spt/config/IWeatherConfig.d.ts
@@ -1,3 +1,4 @@
+import { WindDirection } from "../../../models/enums/WindDirection";
 import { MinMax } from "../../common/MinMax";
 import { IBaseConfig } from "./IBaseConfig";
 export interface IWeatherConfig extends IBaseConfig {
@@ -7,12 +8,16 @@ export interface IWeatherConfig extends IBaseConfig {
 }
 export interface Weather {
     clouds: MinMax;
-    windSpeed: MinMax;
-    windDirection: MinMax;
+    windSpeed: WeatherSettings<number>;
+    windDirection: WeatherSettings<WindDirection>;
     windGustiness: MinMax;
-    rain: MinMax;
+    rain: WeatherSettings<number>;
     rainIntensity: MinMax;
-    fog: MinMax;
+    fog: WeatherSettings<string>;
     temp: MinMax;
     pressure: MinMax;
 }
+export interface WeatherSettings<T> {
+    values: T[];
+    weights: number[];
+}
diff --git a/Live/CWX_DebugTool/types/routers/item_events/HideoutItemEventRouter.d.ts b/Live/CWX_DebugTool/types/routers/item_events/HideoutItemEventRouter.d.ts
index e1e98af..44bd1cd 100644
--- a/Live/CWX_DebugTool/types/routers/item_events/HideoutItemEventRouter.d.ts
+++ b/Live/CWX_DebugTool/types/routers/item_events/HideoutItemEventRouter.d.ts
@@ -1,7 +1,7 @@
-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";
+import { IPmcData } from "../../models/eft/common/IPmcData";
+import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse";
 export declare class HideoutItemEventRouter extends ItemEventRouterDefinition {
     protected hideoutCallbacks: HideoutCallbacks;
     constructor(hideoutCallbacks: HideoutCallbacks);
diff --git a/Live/CWX_DebugTool/types/routers/item_events/InventoryItemEventRouter.d.ts b/Live/CWX_DebugTool/types/routers/item_events/InventoryItemEventRouter.d.ts
index 2619bb9..953d322 100644
--- a/Live/CWX_DebugTool/types/routers/item_events/InventoryItemEventRouter.d.ts
+++ b/Live/CWX_DebugTool/types/routers/item_events/InventoryItemEventRouter.d.ts
@@ -1,7 +1,7 @@
-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";
+import { IPmcData } from "../../models/eft/common/IPmcData";
+import { IItemEventRouterResponse } from "../../models/eft/itemEvent/IItemEventRouterResponse";
 export declare class InventoryItemEventRouter extends ItemEventRouterDefinition {
     protected inventoryCallbacks: InventoryCallbacks;
     constructor(inventoryCallbacks: InventoryCallbacks);
diff --git a/Live/CWX_DebugTool/types/servers/HttpServer.d.ts b/Live/CWX_DebugTool/types/servers/HttpServer.d.ts
index bbca8af..80c1d48 100644
--- a/Live/CWX_DebugTool/types/servers/HttpServer.d.ts
+++ b/Live/CWX_DebugTool/types/servers/HttpServer.d.ts
@@ -4,6 +4,7 @@ import { ApplicationContext } from "../context/ApplicationContext";
 import { HttpServerHelper } from "../helpers/HttpServerHelper";
 import { IHttpConfig } from "../models/spt/config/IHttpConfig";
 import { ILogger } from "../models/spt/utils/ILogger";
+import { LocalisationService } from "../services/LocalisationService";
 import { ConfigServer } from "./ConfigServer";
 import { DatabaseServer } from "./DatabaseServer";
 import { IHttpListener } from "./http/IHttpListener";
@@ -12,11 +13,12 @@ export declare class HttpServer {
     protected logger: ILogger;
     protected databaseServer: DatabaseServer;
     protected httpServerHelper: HttpServerHelper;
+    protected localisationService: LocalisationService;
     protected httpListeners: IHttpListener[];
     protected configServer: ConfigServer;
     protected applicationContext: ApplicationContext;
     protected webSocketServer: WebSocketServer;
-    constructor(logger: ILogger, databaseServer: DatabaseServer, httpServerHelper: HttpServerHelper, httpListeners: IHttpListener[], configServer: ConfigServer, applicationContext: ApplicationContext, webSocketServer: WebSocketServer);
+    constructor(logger: ILogger, databaseServer: DatabaseServer, httpServerHelper: HttpServerHelper, localisationService: LocalisationService, httpListeners: IHttpListener[], configServer: ConfigServer, applicationContext: ApplicationContext, webSocketServer: WebSocketServer);
     protected httpConfig: IHttpConfig;
     getCookies(req: http.IncomingMessage): any;
     handleRequest(req: IncomingMessage, resp: ServerResponse): void;
diff --git a/Live/CWX_DebugTool/types/servers/SaveServer.d.ts b/Live/CWX_DebugTool/types/servers/SaveServer.d.ts
index cb28f49..4dca514 100644
--- a/Live/CWX_DebugTool/types/servers/SaveServer.d.ts
+++ b/Live/CWX_DebugTool/types/servers/SaveServer.d.ts
@@ -1,20 +1,22 @@
+import { SaveLoadRouter } from "../di/Router";
 import { IAkiProfile, Info } from "../models/eft/profile/IAkiProfile";
+import { ILogger } from "../models/spt/utils/ILogger";
+import { LocalisationService } from "../services/LocalisationService";
 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 localisationService: LocalisationService;
     protected logger: ILogger;
     protected profileFilepath: string;
     protected profiles: {};
     protected onSave: {};
     protected saveMd5: {};
-    constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, logger: ILogger);
+    constructor(vfs: VFS, saveLoadRouters: SaveLoadRouter[], jsonUtil: JsonUtil, hashUtil: HashUtil, localisationService: LocalisationService, logger: ILogger);
     load(): void;
     save(): void;
     getProfile(sessionId: string): IAkiProfile;
diff --git a/Live/CWX_DebugTool/types/servers/WebSocketServer.d.ts b/Live/CWX_DebugTool/types/servers/WebSocketServer.d.ts
index f33d214..5d40e6e 100644
--- a/Live/CWX_DebugTool/types/servers/WebSocketServer.d.ts
+++ b/Live/CWX_DebugTool/types/servers/WebSocketServer.d.ts
@@ -1,18 +1,20 @@
 /// <reference types="node" />
-import { HttpServerHelper } from "../helpers/HttpServerHelper";
-import WebSocket from "ws";
 import http, { IncomingMessage } from "http";
-import { ILogger } from "../models/spt/utils/ILogger";
-import { RandomUtil } from "../utils/RandomUtil";
+import WebSocket from "ws";
+import { HttpServerHelper } from "../helpers/HttpServerHelper";
 import { INotification } from "../models/eft/notifier/INotifier";
-import { ConfigServer } from "./ConfigServer";
 import { IHttpConfig } from "../models/spt/config/IHttpConfig";
+import { ILogger } from "../models/spt/utils/ILogger";
+import { LocalisationService } from "../services/LocalisationService";
+import { RandomUtil } from "../utils/RandomUtil";
+import { ConfigServer } from "./ConfigServer";
 export declare class WebSocketServer {
     protected logger: ILogger;
     protected randomUtil: RandomUtil;
     protected configServer: ConfigServer;
+    protected localisationService: LocalisationService;
     protected httpServerHelper: HttpServerHelper;
-    constructor(logger: ILogger, randomUtil: RandomUtil, configServer: ConfigServer, httpServerHelper: HttpServerHelper);
+    constructor(logger: ILogger, randomUtil: RandomUtil, configServer: ConfigServer, localisationService: LocalisationService, httpServerHelper: HttpServerHelper);
     protected httpConfig: IHttpConfig;
     protected defaultNotification: INotification;
     protected webSockets: Record<string, WebSocket.WebSocket>;
diff --git a/Live/CWX_DebugTool/types/servers/http/AkiHttpListener.d.ts b/Live/CWX_DebugTool/types/servers/http/AkiHttpListener.d.ts
index 6f78939..acf92aa 100644
--- a/Live/CWX_DebugTool/types/servers/http/AkiHttpListener.d.ts
+++ b/Live/CWX_DebugTool/types/servers/http/AkiHttpListener.d.ts
@@ -1,22 +1,24 @@
 /// <reference types="node" />
 /// <reference types="node" />
 import { IncomingMessage, ServerResponse } from "http";
-import { IHttpListener } from "./IHttpListener";
 import { Serializer } from "../../di/Serializer";
 import { ILogger } from "../../models/spt/utils/ILogger";
 import { HttpRouter } from "../../routers/HttpRouter";
+import { LocalisationService } from "../../services/LocalisationService";
 import { HttpResponseUtil } from "../../utils/HttpResponseUtil";
 import { JsonUtil } from "../../utils/JsonUtil";
 import { HttpBufferHandler } from "./HttpBufferHandler";
+import { IHttpListener } from "./IHttpListener";
 export declare class AkiHttpListener implements IHttpListener {
     protected httpRouter: HttpRouter;
     protected serializers: Serializer[];
     protected logger: ILogger;
     protected jsonUtil: JsonUtil;
     protected httpResponse: HttpResponseUtil;
+    protected localisationService: LocalisationService;
     protected httpBufferHandler: HttpBufferHandler;
     constructor(httpRouter: HttpRouter, // TODO: delay required
-    serializers: Serializer[], logger: ILogger, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, httpBufferHandler: HttpBufferHandler);
+    serializers: Serializer[], logger: ILogger, jsonUtil: JsonUtil, httpResponse: HttpResponseUtil, localisationService: LocalisationService, httpBufferHandler: HttpBufferHandler);
     canHandle(_: string, req: IncomingMessage): boolean;
     handle(sessionId: string, req: IncomingMessage, resp: ServerResponse): void;
     sendResponse(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: Buffer, output: string): void;
diff --git a/Live/CWX_DebugTool/types/services/BotEquipmentFilterService.d.ts b/Live/CWX_DebugTool/types/services/BotEquipmentFilterService.d.ts
index 632f961..43e64b0 100644
--- a/Live/CWX_DebugTool/types/services/BotEquipmentFilterService.d.ts
+++ b/Live/CWX_DebugTool/types/services/BotEquipmentFilterService.d.ts
@@ -1,21 +1,29 @@
-import { IBotType } from "../models/eft/common/tables/IBotType";
-import { EquipmentFilters, EquipmentFilterDetails, IBotConfig } from "../models/spt/config/IBotConfig";
+import { BotHelper } from "../helpers/BotHelper";
+import { EquipmentChances, IBotType, ModsChances } from "../models/eft/common/tables/IBotType";
+import { BotGenerationDetails } from "../models/spt/bots/BotGenerationDetails";
+import { AdjustmentDetails, EquipmentFilterDetails, EquipmentFilters, IBotConfig, WeightingAdjustmentDetails } from "../models/spt/config/IBotConfig";
 import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
 export declare class BotEquipmentFilterService {
     protected logger: ILogger;
+    protected botHelper: BotHelper;
     protected configServer: ConfigServer;
     protected botConfig: IBotConfig;
-    protected botEquipmentFilterlists: Record<string, EquipmentFilters>;
-    constructor(logger: ILogger, configServer: ConfigServer);
+    protected botEquipmentConfig: Record<string, EquipmentFilters>;
+    constructor(logger: ILogger, botHelper: BotHelper, configServer: ConfigServer);
     /**
      * Filter a bots data to exclude equipment and cartridges defines in the botConfig
      * @param baseBotNode bots json data to filter
-     * @param playerLevel Level of the currently playing player
-     * @param isPmc Is the bot we're filtering a PMC
-     * @param role Role of the bot we're filtering
+     * @param botLevel Level of the bot
+     * @param botGenerationDetails details on how to generate a bot
      */
-    filterBotEquipment(baseBotNode: IBotType, playerLevel: number, isPmc: boolean, role: string): void;
+    filterBotEquipment(baseBotNode: IBotType, botLevel: number, botGenerationDetails: BotGenerationDetails): void;
+    /**
+     * Iterate over the changes passed in and alter data in baseValues
+     * @param equipmentChanges Changes to apply
+     * @param baseValues Values to update
+     */
+    protected adjustChances(equipmentChanges: Record<string, number>, baseValues: EquipmentChances | ModsChances): void;
     /**
      * Get an object that contains equipment and cartridge blacklists for a specified bot type
      * @param botRole Role of the bot we want the blacklist for
@@ -30,6 +38,20 @@ export declare class BotEquipmentFilterService {
      * @returns EquipmentFilterDetails object
      */
     protected getBotEquipmentWhitelist(botRole: string, playerLevel: number): EquipmentFilterDetails;
+    /**
+     * Retreive clothing weighting adjustments from bot.json config
+     * @param botRole Bot type to get adjustments for
+     * @param playerLevel level of player
+     * @returns Weighting adjustments for bots clothing
+     */
+    protected getBotClothingAdjustments(botRole: string, playerLevel: number): WeightingAdjustmentDetails;
+    /**
+     * Retreive item weighting adjustments from bot.json config
+     * @param botRole Bot type to get adjustments for
+     * @param playerLevel level of player
+     * @returns Weighting adjustments for bot items
+     */
+    protected getBotWeightingAdjustments(botRole: string, playerLevel: number): WeightingAdjustmentDetails;
     /**
      * Filter bot equipment based on blacklist and whitelist from config/bot.json
      * Prioritises whitelist first, if one is found blacklist is ignored
@@ -47,4 +69,10 @@ export declare class BotEquipmentFilterService {
      * @returns Filtered bot file
      */
     protected filterCartridges(baseBotNode: IBotType, blacklist: EquipmentFilterDetails, whitelist: EquipmentFilterDetails): void;
+    /**
+     * Add/Edit weighting changes to bot items using values from config/bot.json/equipment
+     * @param weightingAdjustments Weighting change to apply to bot
+     * @param botItemPool Bot item dictionary to adjust
+     */
+    protected adjustWeighting(weightingAdjustments: AdjustmentDetails, botItemPool: Record<string, any>, showEditWarnings?: boolean): void;
 }
diff --git a/Live/CWX_DebugTool/types/services/BotGenerationCacheService.d.ts b/Live/CWX_DebugTool/types/services/BotGenerationCacheService.d.ts
index ba53fec..0be0576 100644
--- a/Live/CWX_DebugTool/types/services/BotGenerationCacheService.d.ts
+++ b/Live/CWX_DebugTool/types/services/BotGenerationCacheService.d.ts
@@ -8,11 +8,11 @@ export declare class BotGenerationCacheService {
     protected randomUtil: RandomUtil;
     protected jsonUtil: JsonUtil;
     protected botHelper: BotHelper;
-    protected storedBots: IBotBase[];
+    protected storedBots: Map<string, IBotBase[]>;
     constructor(logger: ILogger, randomUtil: RandomUtil, jsonUtil: JsonUtil, botHelper: BotHelper);
     /**
      * Store array of bots in cache, shuffle results before storage
-     * @param botsToStore
+     * @param botsToStore Bots we want to store in the cache
      */
     storeBots(botsToStore: IBotBase[]): void;
     /**
@@ -21,25 +21,7 @@ export declare class BotGenerationCacheService {
      * @param role role to retreive (assault/bossTagilla etc)
      * @returns IBotBase object
      */
-    getBot(role: string): IBotBase[];
-    /**
-     * Find a bot by its index from cache
-     * @param indexOfBotToReturn index to find bot by
-     * @returns bot profile
-     */
-    protected getBotFromCache(indexOfBotToReturn: number): IBotBase;
-    /**
-     * Remove bot profile by index from cache
-     * @param indexOfBotToReturn Index of bot profile to remove
-     */
-    protected removeBotFromCache(indexOfBotToReturn: number): void;
-    /**
-     * Get index of bot profile that matches criteria
-     * @param role Role of bot wanted
-     * @param getPmc Requested bot a pmc
-     * @returns index of found bot, -1 if not found
-     */
-    protected getIndexOfBotToReturn(role: string, getPmc: boolean): number;
+    getBot(role: string): IBotBase;
     /**
      * Remove all cached bot profiles
      */
@@ -48,5 +30,5 @@ export declare class BotGenerationCacheService {
      * Does cache have bots
      * @returns true if empty
      */
-    cacheIsEmpty(): boolean;
+    cacheHasBotOfRole(role: string): boolean;
 }
diff --git a/Live/CWX_DebugTool/types/services/LocaleService.d.ts b/Live/CWX_DebugTool/types/services/LocaleService.d.ts
index 33bea7b..8275b75 100644
--- a/Live/CWX_DebugTool/types/services/LocaleService.d.ts
+++ b/Live/CWX_DebugTool/types/services/LocaleService.d.ts
@@ -1,14 +1,42 @@
 import { ILocaleConfig } from "../models/spt/config/ILocaleConfig";
+import { ILocaleGlobalBase } from "../models/spt/server/ILocaleBase";
 import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
+import { DatabaseServer } from "../servers/DatabaseServer";
+/**
+ * Handles getting locales from config or users machine
+ */
 export declare class LocaleService {
     protected logger: ILogger;
+    protected databaseServer: DatabaseServer;
     protected configServer: ConfigServer;
     protected localeConfig: ILocaleConfig;
-    constructor(logger: ILogger, configServer: ConfigServer);
+    constructor(logger: ILogger, databaseServer: DatabaseServer, configServer: ConfigServer);
     /**
-     * Gets the locale key from the locale.json file
+     * Get the eft globals db file based on the configured locale in config/locale.json, if not found, fall back to 'en'
+     * @returns ILocaleGlobalBase
+     */
+    getLocaleDb(): ILocaleGlobalBase;
+    /**
+     * Gets the game locale key from the locale.json file,
+     * if value is 'system' get system locale
      * @returns locale e.g en/ge/cz/cn
      */
-    getDesiredLocale(): string;
+    getDesiredGameLocale(): string;
+    /**
+     * Gets the game locale key from the locale.json file,
+     * if value is 'system' get system locale
+     * @returns locale e.g en/ge/cz/cn
+     */
+    getDesiredServerLocale(): string;
+    /**
+     * Get array of languages supported for localisation
+     * @returns array of locales e.g. en/fr/cn
+     */
+    getServerSupportedLocales(): string[];
+    /**
+     * Get the locale of the computer running the server
+     * @returns langage part of locale e.g. 'en' part of 'en-US'
+     */
+    protected getPlatformLocale(): string;
 }
diff --git a/Live/CWX_DebugTool/types/services/LocalisationService.d.ts b/Live/CWX_DebugTool/types/services/LocalisationService.d.ts
new file mode 100644
index 0000000..519325d
--- /dev/null
+++ b/Live/CWX_DebugTool/types/services/LocalisationService.d.ts
@@ -0,0 +1,21 @@
+import { I18n } from "i18n";
+import { ILocaleConfig } from "../models/spt/config/ILocaleConfig";
+import { ILogger } from "../models/spt/utils/ILogger";
+import { LocaleService } from "./LocaleService";
+/**
+ * Handles translating server text into different langauges
+ */
+export declare class LocalisationService {
+    protected logger: ILogger;
+    protected localeService: LocaleService;
+    protected localeConfig: ILocaleConfig;
+    protected i18n: I18n;
+    constructor(logger: ILogger, localeService: LocaleService);
+    /**
+     * Get a localised value using the passed in key
+     * @param key Key to loop up locale for
+     * @param args optional arguments
+     * @returns Localised string
+     */
+    getText(key: string, args?: any): string;
+}
diff --git a/Live/CWX_DebugTool/types/services/PaymentService.d.ts b/Live/CWX_DebugTool/types/services/PaymentService.d.ts
index a5e538f..c9ce95a 100644
--- a/Live/CWX_DebugTool/types/services/PaymentService.d.ts
+++ b/Live/CWX_DebugTool/types/services/PaymentService.d.ts
@@ -11,6 +11,7 @@ import { IProcessSellTradeRequestData } from "../models/eft/trade/IProcessSellTr
 import { ILogger } from "../models/spt/utils/ILogger";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { HttpResponseUtil } from "../utils/HttpResponseUtil";
+import { LocalisationService } from "./LocalisationService";
 export declare class PaymentService {
     protected logger: ILogger;
     protected httpResponse: HttpResponseUtil;
@@ -19,8 +20,9 @@ export declare class PaymentService {
     protected traderHelper: TraderHelper;
     protected itemHelper: ItemHelper;
     protected inventoryHelper: InventoryHelper;
+    protected localisationService: LocalisationService;
     protected paymentHelper: PaymentHelper;
-    constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, paymentHelper: PaymentHelper);
+    constructor(logger: ILogger, httpResponse: HttpResponseUtil, databaseServer: DatabaseServer, handbookHelper: HandbookHelper, traderHelper: TraderHelper, itemHelper: ItemHelper, inventoryHelper: InventoryHelper, localisationService: LocalisationService, paymentHelper: PaymentHelper);
     /**
      * Take money and insert items into return to server request
      * @param {Object} pmcData
@@ -50,7 +52,7 @@ export declare class PaymentService {
      * @param pmcData Player profile to find and remove currency from
      * @param currencyTpl Type of currency to pay
      * @param amountToPay money value to pay
-     * @param sessionID Sessino id
+     * @param sessionID Session id
      * @param output output object to send to client
      * @returns IItemEventRouterResponse
      */
diff --git a/Live/CWX_DebugTool/types/services/PlayerService.d.ts b/Live/CWX_DebugTool/types/services/PlayerService.d.ts
index 519b7e5..2f364d5 100644
--- a/Live/CWX_DebugTool/types/services/PlayerService.d.ts
+++ b/Live/CWX_DebugTool/types/services/PlayerService.d.ts
@@ -2,10 +2,12 @@ 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";
+import { LocalisationService } from "./LocalisationService";
 export declare class PlayerService {
     protected logger: ILogger;
+    protected localisationService: LocalisationService;
     protected databaseServer: DatabaseServer;
-    constructor(logger: ILogger, databaseServer: DatabaseServer);
+    constructor(logger: ILogger, localisationService: LocalisationService, databaseServer: DatabaseServer);
     /**
      * increases the profile skill and updates any output
      * @param {Object} pmcData
diff --git a/Live/CWX_DebugTool/types/services/PmcAiService.d.ts b/Live/CWX_DebugTool/types/services/PmcAiService.d.ts
deleted file mode 100644
index 0690f1f..0000000
--- a/Live/CWX_DebugTool/types/services/PmcAiService.d.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { IBotConfig } from "../models/spt/config/IBotConfig";
-import { ILogger } from "../models/spt/utils/ILogger";
-import { ConfigServer } from "../servers/ConfigServer";
-/** Storing/retreving pmcRoles set at the start of a raid - its done at that point as we know what location the player is heading to */
-export declare class PmcAiService {
-    protected logger: ILogger;
-    protected configServer: ConfigServer;
-    protected botConfig: IBotConfig;
-    protected usecRole: string;
-    protected bearRole: string;
-    constructor(logger: ILogger, configServer: ConfigServer);
-    /**
-     * Convert from pmc side (usec/bear) to the side as defined in the bot config (usecType/bearType)
-     * @param pmcSide eft side (usec/bear)
-     * @returns pmc side as defined in config
-     */
-    getPmcRole(pmcSide: "usec" | "bear" | string): string;
-    /**
-     * Set the roles for pmcs
-     * @param location map location to look up and use as pmc types
-     */
-    setPmcRolesByLocation(location: string): void;
-    /**
-     * Clear the saved role from usec/bear PMCs
-     */
-    clearPmcRoles(): void;
-}
diff --git a/Live/CWX_DebugTool/types/services/ProfileFixerService.d.ts b/Live/CWX_DebugTool/types/services/ProfileFixerService.d.ts
index e772919..86a6af8 100644
--- a/Live/CWX_DebugTool/types/services/ProfileFixerService.d.ts
+++ b/Live/CWX_DebugTool/types/services/ProfileFixerService.d.ts
@@ -8,12 +8,14 @@ import { HideoutAreas } from "../models/enums/HideoutAreas";
 import { ILogger } from "../models/spt/utils/ILogger";
 import { DatabaseServer } from "../servers/DatabaseServer";
 import { Watermark } from "../utils/Watermark";
+import { LocalisationService } from "./LocalisationService";
 export declare class ProfileFixerService {
     protected logger: ILogger;
     protected watermark: Watermark;
     protected hideoutHelper: HideoutHelper;
+    protected localisationService: LocalisationService;
     protected databaseServer: DatabaseServer;
-    constructor(logger: ILogger, watermark: Watermark, hideoutHelper: HideoutHelper, databaseServer: DatabaseServer);
+    constructor(logger: ILogger, watermark: Watermark, hideoutHelper: HideoutHelper, localisationService: LocalisationService, databaseServer: DatabaseServer);
     /**
      * Find issues in the pmc profile data that may cause issues and fix them
      * @param pmcProfile profile to check and fix
diff --git a/Live/CWX_DebugTool/types/services/RagfairOfferService.d.ts b/Live/CWX_DebugTool/types/services/RagfairOfferService.d.ts
index a6f6b6d..86c1e52 100644
--- a/Live/CWX_DebugTool/types/services/RagfairOfferService.d.ts
+++ b/Live/CWX_DebugTool/types/services/RagfairOfferService.d.ts
@@ -11,6 +11,7 @@ import { DatabaseServer } from "../servers/DatabaseServer";
 import { SaveServer } from "../servers/SaveServer";
 import { HttpResponseUtil } from "../utils/HttpResponseUtil";
 import { TimeUtil } from "../utils/TimeUtil";
+import { LocalisationService } from "./LocalisationService";
 import { RagfairCategoriesService } from "./RagfairCategoriesService";
 export declare class RagfairOfferService {
     protected logger: ILogger;
@@ -22,12 +23,14 @@ export declare class RagfairOfferService {
     protected profileHelper: ProfileHelper;
     protected eventOutputHolder: EventOutputHolder;
     protected httpResponse: HttpResponseUtil;
+    protected localisationService: LocalisationService;
     protected configServer: ConfigServer;
     protected playerOffersLoaded: boolean;
     protected expiredOffers: Item[];
-    protected offers: IRagfairOffer[];
+    /** offerId, offer */
+    protected offers: Record<string, IRagfairOffer>;
     protected ragfairConfig: IRagfairConfig;
-    constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, ragfairCategoriesService: RagfairCategoriesService, profileHelper: ProfileHelper, eventOutputHolder: EventOutputHolder, httpResponse: HttpResponseUtil, configServer: ConfigServer);
+    constructor(logger: ILogger, timeUtil: TimeUtil, databaseServer: DatabaseServer, saveServer: SaveServer, ragfairServerHelper: RagfairServerHelper, ragfairCategoriesService: RagfairCategoriesService, profileHelper: ProfileHelper, eventOutputHolder: EventOutputHolder, httpResponse: HttpResponseUtil, localisationService: LocalisationService, configServer: ConfigServer);
     /**
      * Get all offers
      * @returns IRagfairOffer array
diff --git a/Live/CWX_DebugTool/types/utils/App.d.ts b/Live/CWX_DebugTool/types/utils/App.d.ts
index dcc2669..cc8a5af 100644
--- a/Live/CWX_DebugTool/types/utils/App.d.ts
+++ b/Live/CWX_DebugTool/types/utils/App.d.ts
@@ -1,14 +1,16 @@
-import { TimeUtil } from "./TimeUtil";
 import { OnLoad } from "../di/OnLoad";
 import { OnUpdate } from "../di/OnUpdate";
 import { ILogger } from "../models/spt/utils/ILogger";
+import { LocalisationService } from "../services/LocalisationService";
+import { TimeUtil } from "./TimeUtil";
 export declare class App {
     protected logger: ILogger;
     protected timeUtil: TimeUtil;
+    protected localisationService: LocalisationService;
     protected onLoadComponents: OnLoad[];
     protected onUpdateComponents: OnUpdate[];
     protected onUpdateLastRun: {};
-    constructor(logger: ILogger, timeUtil: TimeUtil, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]);
+    constructor(logger: ILogger, timeUtil: TimeUtil, localisationService: LocalisationService, onLoadComponents: OnLoad[], onUpdateComponents: OnUpdate[]);
     load(): void;
     protected update(onUpdateComponents: OnUpdate[]): void;
     protected logUpdateException(err: any, updateable: OnUpdate): void;
diff --git a/Live/CWX_DebugTool/types/utils/DatabaseImporter.d.ts b/Live/CWX_DebugTool/types/utils/DatabaseImporter.d.ts
index 483e135..31670ae 100644
--- a/Live/CWX_DebugTool/types/utils/DatabaseImporter.d.ts
+++ b/Live/CWX_DebugTool/types/utils/DatabaseImporter.d.ts
@@ -3,15 +3,17 @@ import { IDatabaseTables } from "../models/spt/server/IDatabaseTables";
 import { ILogger } from "../models/spt/utils/ILogger";
 import { ImageRouter } from "../routers/ImageRouter";
 import { DatabaseServer } from "../servers/DatabaseServer";
+import { LocalisationService } from "../services/LocalisationService";
 import { JsonUtil } from "./JsonUtil";
 import { VFS } from "./VFS";
 export declare class DatabaseImporter extends OnLoad {
     protected logger: ILogger;
     protected vfs: VFS;
     protected jsonUtil: JsonUtil;
+    protected localisationService: LocalisationService;
     protected databaseServer: DatabaseServer;
     protected imageRouter: ImageRouter;
-    constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, databaseServer: DatabaseServer, imageRouter: ImageRouter);
+    constructor(logger: ILogger, vfs: VFS, jsonUtil: JsonUtil, localisationService: LocalisationService, databaseServer: DatabaseServer, imageRouter: ImageRouter);
     onLoad(): void;
     /**
      * Read all json files in database folder and map into a json object
diff --git a/Live/CWX_DebugTool/types/utils/HttpResponseUtil.d.ts b/Live/CWX_DebugTool/types/utils/HttpResponseUtil.d.ts
index 29502be..3a78618 100644
--- a/Live/CWX_DebugTool/types/utils/HttpResponseUtil.d.ts
+++ b/Live/CWX_DebugTool/types/utils/HttpResponseUtil.d.ts
@@ -1,10 +1,13 @@
-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";
+import { BackendErrorCodes } from "../models/enums/BackendErrorCodes";
+import { LocalisationService } from "../services/LocalisationService";
+import { JsonUtil } from "./JsonUtil";
 export declare class HttpResponseUtil {
     protected jsonUtil: JsonUtil;
-    constructor(jsonUtil: JsonUtil);
+    protected localisationService: LocalisationService;
+    constructor(jsonUtil: JsonUtil, localisationService: LocalisationService);
     protected clearString(s: string): any;
     noBody(data: any): any;
     getBody<T>(data: T, err?: number, errmsg?: any): IGetBodyResponseData<T>;
@@ -12,5 +15,5 @@ export declare class HttpResponseUtil {
     emptyResponse(): IGetBodyResponseData<string>;
     nullResponse(): INullResponseData;
     emptyArrayResponse(): IGetBodyResponseData<any[]>;
-    appendErrorToOutput(output: IItemEventRouterResponse, message?: string, title?: string): IItemEventRouterResponse;
+    appendErrorToOutput(output: IItemEventRouterResponse, message?: string, errorCode?: BackendErrorCodes): IItemEventRouterResponse;
 }
diff --git a/Live/CWX_DebugTool/types/utils/Logger.d.ts b/Live/CWX_DebugTool/types/utils/Logger.d.ts
index 3d9013f..1088701 100644
--- a/Live/CWX_DebugTool/types/utils/Logger.d.ts
+++ b/Live/CWX_DebugTool/types/utils/Logger.d.ts
@@ -53,6 +53,12 @@ export declare class WinstonLogger implements ILogger {
     warning(data: string | Record<string, unknown>): Promise<void>;
     success(data: string | Record<string, unknown>): Promise<void>;
     info(data: string | Record<string, unknown>): Promise<void>;
+    /**
+     * Log to console text with a customisable text and background color. Background defaults to black
+     * @param data text to log
+     * @param textColor color of text
+     * @param backgroundColor color of background
+     */
     logWithColor(data: string | Record<string, unknown>, textColor: LogTextColor, backgroundColor?: LogBackgroundColor): Promise<void>;
     debug(data: string | Record<string, unknown>, onlyShowInConsole?: boolean): Promise<void>;
 }
diff --git a/Live/CWX_DebugTool/types/utils/RandomUtil.d.ts b/Live/CWX_DebugTool/types/utils/RandomUtil.d.ts
index 633e472..aa556e3 100644
--- a/Live/CWX_DebugTool/types/utils/RandomUtil.d.ts
+++ b/Live/CWX_DebugTool/types/utils/RandomUtil.d.ts
@@ -110,6 +110,12 @@ export declare class RandomUtil {
     getIntEx(max: number): number;
     getFloat(min: number, max: number): number;
     getBool(): boolean;
+    /**
+     * Check if number passes a check out of 100
+     * @param chancePercent value check needs to be above
+     * @returns true if value passes check
+     */
+    getChance100(chancePercent: number): boolean;
     getStringArrayValue(arr: string[]): string;
     getArrayValue<T>(arr: T[]): T;
     getKey(node: any): string;
diff --git a/Live/CWX_DebugTool/types/utils/Watermark.d.ts b/Live/CWX_DebugTool/types/utils/Watermark.d.ts
index c6dc120..e02eba2 100644
--- a/Live/CWX_DebugTool/types/utils/Watermark.d.ts
+++ b/Live/CWX_DebugTool/types/utils/Watermark.d.ts
@@ -1,20 +1,15 @@
 import { ICoreConfig } from "../models/spt/config/ICoreConfig";
 import { ILogger } from "../models/spt/utils/ILogger";
 import { ConfigServer } from "../servers/ConfigServer";
+import { LocalisationService } from "../services/LocalisationService";
 export declare class WatermarkLocale {
-    protected locales: {
-        "en-US": {
-            description: string[];
-            warning: string[];
-            modding: string[];
-        };
-        "zh-CN": {
-            description: string[];
-            warning: string[];
-            modding: string[];
-        };
+    protected localisationService: LocalisationService;
+    constructor(localisationService: LocalisationService);
+    protected watermark: {
+        description: string[];
+        warning: string[];
+        modding: string[];
     };
-    getLocale(): string;
     getDescription(): string[];
     getWarning(): string[];
     getModding(): string[];
@@ -22,9 +17,10 @@ export declare class WatermarkLocale {
 export declare class Watermark {
     protected logger: ILogger;
     protected configServer: ConfigServer;
+    protected localisationService: LocalisationService;
     protected watermarkLocale?: WatermarkLocale;
     protected akiConfig: ICoreConfig;
-    constructor(logger: ILogger, configServer: ConfigServer, watermarkLocale?: WatermarkLocale);
+    constructor(logger: ILogger, configServer: ConfigServer, localisationService: LocalisationService, watermarkLocale?: WatermarkLocale);
     protected text: string[];
     protected versionLabel: string;
     initialize(): void;
diff --git a/Live/CWX_WeatherPatcher/CWX_WeatherPatcher 2.4.7/BepInEx/plugins/CWX-WeatherPatcher.dll b/Live/CWX_WeatherPatcher/CWX_WeatherPatcher 2.4.7/BepInEx/plugins/CWX-WeatherPatcher.dll
new file mode 100644
index 0000000..6fe37cc
Binary files /dev/null and b/Live/CWX_WeatherPatcher/CWX_WeatherPatcher 2.4.7/BepInEx/plugins/CWX-WeatherPatcher.dll differ