diff --git a/project/src/context/ContextVariableType.ts b/project/src/context/ContextVariableType.ts index e928a5a2..ad54aae7 100644 --- a/project/src/context/ContextVariableType.ts +++ b/project/src/context/ContextVariableType.ts @@ -8,4 +8,6 @@ export enum ContextVariableType { /** When player is loading into map and loot is requested */ REGISTER_PLAYER_REQUEST = 3, RAID_ADJUSTMENTS = 4, + /** Data returned from client request object from endLocalRaid() */ + TRANSIT_INFO = 5, } diff --git a/project/src/services/LocationLifecycleService.ts b/project/src/services/LocationLifecycleService.ts index df684f31..41774853 100644 --- a/project/src/services/LocationLifecycleService.ts +++ b/project/src/services/LocationLifecycleService.ts @@ -11,7 +11,11 @@ import { ILocationBase } from "@spt/models/eft/common/ILocationBase"; import { IPmcData } from "@spt/models/eft/common/IPmcData"; import { Common, IQuestStatus, ITraderInfo } from "@spt/models/eft/common/tables/IBotBase"; import { IItem } from "@spt/models/eft/common/tables/IItem"; -import { IEndLocalRaidRequestData, IEndRaidResult } from "@spt/models/eft/match/IEndLocalRaidRequestData"; +import { + IEndLocalRaidRequestData, + IEndRaidResult, + ILocationTransit, +} from "@spt/models/eft/match/IEndLocalRaidRequestData"; import { IStartLocalRaidRequestData } from "@spt/models/eft/match/IStartLocalRaidRequestData"; import { IStartLocalRaidResponseData } from "@spt/models/eft/match/IStartLocalRaidResponseData"; import { ConfigTypes } from "@spt/models/enums/ConfigTypes"; @@ -107,9 +111,24 @@ export class LocationLifecycleService { // Only has value when transitioning into map from previous one if (request.transition) { + // TODO - why doesnt the second raid after transit have any transition data? result.transition = request.transition; } + // Get data stored at end of previous raid (if any) + const transitionData = this.applicationContext + .getLatestValue(ContextVariableType.TRANSIT_INFO) + ?.getValue(); + if (transitionData) { + result.transition.isLocationTransition = true; + result.transition.transitionRaidId = transitionData.transitionRaidId; + result.transition.transitionCount += 1; + result.transition.visitedLocations.push(transitionData.location); // TODO - check doesnt exist before adding to prevent dupes + + // Complete, clean up + this.applicationContext.clearValues(ContextVariableType.TRANSIT_INFO); + } + // Apply changes from pmcConfig to bot hostility values this.adjustBotHostilitySettings(result.locationLoot); @@ -293,6 +312,7 @@ export class LocationLifecycleService { return locationBaseClone; } + /** Handle client/match/local/end */ public endLocalRaid(sessionId: string, request: IEndLocalRaidRequestData): void { // Clear bot loot cache this.botLootCacheService.clearCache(); @@ -321,9 +341,15 @@ export class LocationLifecycleService { const isTransfer = this.isMapToMapTransfer(request.results); const isSurvived = this.isPlayerSurvived(request.results); - // Handle items transferred via BTR or transit to player mail + // Handle items transferred via BTR or transit to player mailbox this.handleItemTransferEvent(sessionId, request); + // Player is moving between maps + if (isTransfer) { + // Store transfer data for later use in `startLocalRaid()` when next raid starts + this.applicationContext.addValue(ContextVariableType.TRANSIT_INFO, request.locationTransit); + } + if (!isPmc) { this.handlePostRaidPlayerScav(sessionId, pmcProfile, scavProfile, isDead, isTransfer, request);