Update to SPT 3.10.0 (#38)

Co-authored-by: Dev <dev@dev.sp-tarkov.com>
Co-authored-by: Chomp <dev@dev.sp-tarkov.com>
Reviewed-on: #38
This commit is contained in:
chomp 2024-11-26 15:03:02 +00:00
parent b7d81c52d3
commit 8675689cb6
8319 changed files with 123542 additions and 76782 deletions

View File

@ -1,7 +1,7 @@
{
"name": "ScopesAndTypes",
"version": "1.0.0",
"sptVersion": "~3.9",
"sptVersion": "~3.10",
"loadBefore": [],
"loadAfter": [],
"incompatibilities": [],

View File

@ -1,14 +1,16 @@
import { ApplicationContext } from "@spt/context/ApplicationContext";
import { BotController } from "@spt/controllers/BotController";
import { IGenerateBotsRequestData } from "@spt/models/eft/bot/IGenerateBotsRequestData";
import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData";
import { IBotBase } from "@spt/models/eft/common/tables/IBotBase";
import { Difficulties } from "@spt/models/eft/common/tables/IBotType";
import { IDifficulties } from "@spt/models/eft/common/tables/IBotType";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
export declare class BotCallbacks {
protected botController: BotController;
protected httpResponse: HttpResponseUtil;
constructor(botController: BotController, httpResponse: HttpResponseUtil);
protected applicationContext: ApplicationContext;
constructor(botController: BotController, httpResponse: HttpResponseUtil, applicationContext: ApplicationContext);
/**
* Handle singleplayer/settings/bot/limit
* Is called by client to define each bot roles wave limit
@ -24,7 +26,7 @@ export declare class BotCallbacks {
* Handle singleplayer/settings/bot/difficulties
* @returns dictionary of every bot and its diffiulty settings
*/
getAllBotDifficulties(url: string, info: IEmptyRequestData, sessionID: string): Record<string, Difficulties>;
getAllBotDifficulties(url: string, info: IEmptyRequestData, sessionID: string): Record<string, IDifficulties>;
/**
* Handle client/game/bot/generate
* @returns IGetBodyResponseData
@ -34,7 +36,7 @@ export declare class BotCallbacks {
* Handle singleplayer/settings/bot/maxCap
* @returns string
*/
getBotCap(url: string, info: any, sessionID: string): string;
getBotCap(url: string, info: IEmptyRequestData, sessionID: string): string;
/**
* Handle singleplayer/settings/bot/getBotBehaviours
* @returns string

View File

@ -1,5 +1,5 @@
import { HideoutController } from "@spt/controllers/HideoutController";
import { RagfairController } from "@spt/controllers/RagfairController";
import { TraderController } from "@spt/controllers/TraderController";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData";
import { IGlobals } from "@spt/models/eft/common/IGlobals";
@ -7,8 +7,7 @@ import { ICustomizationItem } from "@spt/models/eft/common/tables/ICustomization
import { IHandbookBase } from "@spt/models/eft/common/tables/IHandbookBase";
import { IGetItemPricesResponse } from "@spt/models/eft/game/IGetItemPricesResponse";
import { IHideoutArea } from "@spt/models/eft/hideout/IHideoutArea";
import { IHideoutProduction } from "@spt/models/eft/hideout/IHideoutProduction";
import { IHideoutScavCase } from "@spt/models/eft/hideout/IHideoutScavCase";
import { IHideoutProductionData } from "@spt/models/eft/hideout/IHideoutProduction";
import { IHideoutSettingsBase } from "@spt/models/eft/hideout/IHideoutSettingsBase";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { ISettingsBase } from "@spt/models/spt/server/ISettingsBase";
@ -23,9 +22,9 @@ export declare class DataCallbacks {
protected timeUtil: TimeUtil;
protected traderHelper: TraderHelper;
protected databaseService: DatabaseService;
protected ragfairController: RagfairController;
protected traderController: TraderController;
protected hideoutController: HideoutController;
constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, traderHelper: TraderHelper, databaseService: DatabaseService, ragfairController: RagfairController, hideoutController: HideoutController);
constructor(httpResponse: HttpResponseUtil, timeUtil: TimeUtil, traderHelper: TraderHelper, databaseService: DatabaseService, traderController: TraderController, hideoutController: HideoutController);
/**
* Handle client/settings
* @returns ISettingsBase
@ -62,8 +61,7 @@ export declare class DataCallbacks {
*/
getHideoutSettings(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IHideoutSettingsBase>;
getHideoutAreas(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IHideoutArea[]>;
gethideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IHideoutProduction[]>;
getHideoutScavcase(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IHideoutScavCase[]>;
getHideoutProduction(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IHideoutProductionData>;
/**
* Handle client/languages
*/
@ -83,7 +81,6 @@ export declare class DataCallbacks {
/**
* Handle client/items/prices/
* Called when viewing a traders assorts
* TODO - fully implement this
*/
getItemPrices(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IGetItemPricesResponse>;
}

View File

@ -27,7 +27,7 @@ import { ISendMessageRequest } from "@spt/models/eft/dialog/ISendMessageRequest"
import { ISetDialogReadRequestData } from "@spt/models/eft/dialog/ISetDialogReadRequestData";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { INullResponseData } from "@spt/models/eft/httpResponse/INullResponseData";
import { DialogueInfo } from "@spt/models/eft/profile/ISptProfile";
import { IDialogueInfo } from "@spt/models/eft/profile/ISptProfile";
import { HashUtil } from "@spt/utils/HashUtil";
import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
import { TimeUtil } from "@spt/utils/TimeUtil";
@ -48,11 +48,11 @@ export declare class DialogueCallbacks implements OnUpdate {
*/
getChatServerList(url: string, info: IGetChatServerListRequestData, sessionID: string): IGetBodyResponseData<IChatServer[]>;
/** Handle client/mail/dialog/list */
getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData<DialogueInfo[]>;
getMailDialogList(url: string, info: IGetMailDialogListRequestData, sessionID: string): IGetBodyResponseData<IDialogueInfo[]>;
/** Handle client/mail/dialog/view */
getMailDialogView(url: string, info: IGetMailDialogViewRequestData, sessionID: string): IGetBodyResponseData<IGetMailDialogViewResponseData>;
/** Handle client/mail/dialog/info */
getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData<DialogueInfo>;
getMailDialogInfo(url: string, info: IGetMailDialogInfoRequestData, sessionID: string): IGetBodyResponseData<IDialogueInfo>;
/** Handle client/mail/dialog/remove */
removeDialog(url: string, info: IRemoveDialogRequestData, sessionID: string): IGetBodyResponseData<any[]>;
/** Handle client/mail/dialog/pin */

View File

@ -13,7 +13,9 @@ import { IGameModeResponse } from "@spt/models/eft/game/IGameModeResponse";
import { IGameStartResponse } from "@spt/models/eft/game/IGameStartResponse";
import { IGetRaidTimeRequest } from "@spt/models/eft/game/IGetRaidTimeRequest";
import { IGetRaidTimeResponse } from "@spt/models/eft/game/IGetRaidTimeResponse";
import { ISendSurveyOpinionRequest } from "@spt/models/eft/game/ISendSurveyOpinionRequest";
import { IServerDetails } from "@spt/models/eft/game/IServerDetails";
import { ISurveyResponseData } from "@spt/models/eft/game/ISurveyResponseData";
import { IVersionValidateRequestData } from "@spt/models/eft/game/IVersionValidateRequestData";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { INullResponseData } from "@spt/models/eft/httpResponse/INullResponseData";
@ -76,10 +78,29 @@ export declare class GameCallbacks implements OnLoad {
* @returns string
*/
getVersion(url: string, info: IEmptyRequestData, sessionID: string): string;
/**
* Handle /client/report/send & /client/reports/lobby/send
* @returns INullResponseData
*/
reportNickname(url: string, info: IUIDRequestData, sessionID: string): INullResponseData;
/**
* Handle singleplayer/settings/getRaidTime
* @returns string
*/
getRaidTime(url: string, request: IGetRaidTimeRequest, sessionID: string): IGetRaidTimeResponse;
/**
* Handle /client/survey
* @returns INullResponseData
*/
getSurvey(url: string, request: IEmptyRequestData, sessionId: string): INullResponseData | IGetBodyResponseData<ISurveyResponseData>;
/**
* Handle client/survey/view
* @returns INullResponseData
*/
getSurveyView(url: string, request: any, sessionId: string): INullResponseData;
/**
* Handle client/survey/opinion
* @returns INullResponseData
*/
sendSurveyOpinion(url: string, request: ISendSurveyOpinionRequest, sessionId: string): INullResponseData;
}

View File

@ -4,7 +4,6 @@ import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IHealthTreatmentRequestData } from "@spt/models/eft/health/IHealthTreatmentRequestData";
import { IOffraidEatRequestData } from "@spt/models/eft/health/IOffraidEatRequestData";
import { IOffraidHealRequestData } from "@spt/models/eft/health/IOffraidHealRequestData";
import { ISyncHealthRequestData } from "@spt/models/eft/health/ISyncHealthRequestData";
import { IWorkoutData } from "@spt/models/eft/health/IWorkoutData";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
@ -14,14 +13,6 @@ export declare class HealthCallbacks {
protected profileHelper: ProfileHelper;
protected healthController: HealthController;
constructor(httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, healthController: HealthController);
/**
* Custom spt server request found in modules/HealthSynchronizer.cs
* @param url
* @param info HealthListener.Instance.CurrentHealth class
* @param sessionID session id
* @returns empty response, no data sent back to client
*/
syncHealth(url: string, info: ISyncHealthRequestData, sessionID: string): IGetBodyResponseData<string>;
/**
* Custom spt server request found in modules/QTEPatch.cs
* @param url

View File

@ -3,7 +3,9 @@ import { OnUpdate } from "@spt/di/OnUpdate";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IHandleQTEEventRequestData } from "@spt/models/eft/hideout/IHandleQTEEventRequestData";
import { IHideoutCancelProductionRequestData } from "@spt/models/eft/hideout/IHideoutCancelProductionRequestData";
import { IHideoutCircleOfCultistProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutCircleOfCultistProductionStartRequestData";
import { IHideoutContinuousProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutContinuousProductionStartRequestData";
import { IHideoutDeleteProductionRequestData } from "@spt/models/eft/hideout/IHideoutDeleteProductionRequestData";
import { IHideoutImproveAreaRequestData } from "@spt/models/eft/hideout/IHideoutImproveAreaRequestData";
import { IHideoutPutItemInRequestData } from "@spt/models/eft/hideout/IHideoutPutItemInRequestData";
import { IHideoutScavCaseStartRequestData } from "@spt/models/eft/hideout/IHideoutScavCaseStartRequestData";
@ -75,6 +77,14 @@ export declare class HideoutCallbacks implements OnUpdate {
* Handle client/game/profile/items/moving - HideoutCancelProductionCommand
*/
cancelProduction(pmcData: IPmcData, request: IHideoutCancelProductionRequestData, sessionId: string): IItemEventRouterResponse;
/**
* Handle client/game/profile/items/moving - HideoutCircleOfCultistProductionStart
*/
circleOfCultistProductionStart(pmcData: IPmcData, request: IHideoutCircleOfCultistProductionStartRequestData, sessionId: string): IItemEventRouterResponse;
/**
* Handle client/game/profile/items/moving - HideoutDeleteProductionCommand
*/
hideoutDeleteProductionCommand(pmcData: IPmcData, request: IHideoutDeleteProductionRequestData, sessionId: string): IItemEventRouterResponse;
onUpdate(timeSinceLastRun: number): Promise<boolean>;
getRoute(): string;
}

View File

@ -1,9 +1,8 @@
import { InraidController } from "@spt/controllers/InraidController";
import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData";
import { INullResponseData } from "@spt/models/eft/httpResponse/INullResponseData";
import { IItemDeliveryRequestData } from "@spt/models/eft/inRaid/IItemDeliveryRequestData";
import { IRegisterPlayerRequestData } from "@spt/models/eft/inRaid/IRegisterPlayerRequestData";
import { ISaveProgressRequestData } from "@spt/models/eft/inRaid/ISaveProgressRequestData";
import { IScavSaveRequestData } from "@spt/models/eft/inRaid/IScavSaveRequestData";
import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
/**
* Handle client requests
@ -22,42 +21,18 @@ export declare class InraidCallbacks {
*/
registerPlayer(url: string, info: IRegisterPlayerRequestData, sessionID: string): INullResponseData;
/**
* Handle raid/profile/save
* Handle raid/profile/scavsave
* @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;
saveProgress(url: string, info: IScavSaveRequestData, sessionID: string): INullResponseData;
/**
* Handle singleplayer/settings/raid/menu
* @returns JSON as string
*/
getRaidMenuSettings(): string;
/**
* Handle singleplayer/airdrop/config
* @returns JSON as string
*/
getAirdropConfig(): string;
/**
* Handle singleplayer/btr/config
* @returns JSON as string
*/
getBTRConfig(): string;
/**
* Handle singleplayer/traderServices/getTraderServices
*/
getTraderServices(url: string, info: IEmptyRequestData, sessionId: string): string;
/**
* Handle singleplayer/traderServices/itemDelivery
*/
itemDelivery(url: string, request: IItemDeliveryRequestData, sessionId: string): INullResponseData;
getTraitorScavHostileChance(url: string, info: IEmptyRequestData, sessionId: string): string;
getSandboxMaxPatrolValue(url: string, info: IEmptyRequestData, sessionId: string): string;
getBossConvertSettings(url: string, info: IEmptyRequestData, sessionId: string): string;
}

View File

@ -18,6 +18,7 @@ import { IInventoryTagRequestData } from "@spt/models/eft/inventory/IInventoryTa
import { IInventoryToggleRequestData } from "@spt/models/eft/inventory/IInventoryToggleRequestData";
import { IInventoryTransferRequestData } from "@spt/models/eft/inventory/IInventoryTransferRequestData";
import { IOpenRandomLootContainerRequestData } from "@spt/models/eft/inventory/IOpenRandomLootContainerRequestData";
import { IPinOrLockItemRequest } from "@spt/models/eft/inventory/IPinOrLockItemRequest";
import { IRedeemProfileRequestData } from "@spt/models/eft/inventory/IRedeemProfileRequestData";
import { ISetFavoriteItems } from "@spt/models/eft/inventory/ISetFavoriteItems";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
@ -58,4 +59,5 @@ export declare class InventoryCallbacks {
* Handle game/profile/items/moving - QuestFail
*/
failQuest(pmcData: IPmcData, request: IFailQuestRequestData, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse;
pinOrLock(pmcData: IPmcData, request: IPinOrLockItemRequest, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse;
}

View File

@ -1,9 +1,9 @@
import { LocationController } from "@spt/controllers/LocationController";
import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData";
import { ILocationBase } from "@spt/models/eft/common/ILocationBase";
import { ILocationsGenerateAllResponse } from "@spt/models/eft/common/ILocationsSourceDestinationBase";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { IGetLocationRequestData } from "@spt/models/eft/location/IGetLocationRequestData";
import { IGetAirdropLootRequest } from "@spt/models/eft/location/IGetAirdropLootRequest";
import { IGetAirdropLootResponse } from "@spt/models/eft/location/IGetAirdropLootResponse";
import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
export declare class LocationCallbacks {
protected httpResponse: HttpResponseUtil;
@ -11,8 +11,6 @@ export declare class LocationCallbacks {
constructor(httpResponse: HttpResponseUtil, locationController: LocationController);
/** Handle client/locations */
getLocationData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ILocationsGenerateAllResponse>;
/** Handle client/location/getLocalloot */
getLocation(url: string, info: IGetLocationRequestData, sessionID: string): IGetBodyResponseData<ILocationBase>;
/** Handle client/location/getAirdropLoot */
getAirdropLoot(url: string, info: IEmptyRequestData, sessionID: string): string;
/** Handle client/airdrop/loot */
getAirdropLoot(url: string, info: IGetAirdropLootRequest, sessionID: string): IGetBodyResponseData<IGetAirdropLootResponse>;
}

View File

@ -1,8 +1,9 @@
import { MatchController } from "@spt/controllers/MatchController";
import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData";
import { IMetrics } from "@spt/models/eft/common/tables/IMatch";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { INullResponseData } from "@spt/models/eft/httpResponse/INullResponseData";
import { IEndOfflineRaidRequestData } from "@spt/models/eft/match/IEndOfflineRaidRequestData";
import { IEndLocalRaidRequestData } from "@spt/models/eft/match/IEndLocalRaidRequestData";
import { IGetRaidConfigurationRequestData } from "@spt/models/eft/match/IGetRaidConfigurationRequestData";
import { IGroupCharacter } from "@spt/models/eft/match/IGroupCharacter";
import { IMatchGroupCurrentResponse } from "@spt/models/eft/match/IMatchGroupCurrentResponse";
@ -15,6 +16,8 @@ import { IMatchGroupTransferRequest } from "@spt/models/eft/match/IMatchGroupTra
import { IProfileStatusResponse } from "@spt/models/eft/match/IProfileStatusResponse";
import { IPutMetricsRequestData } from "@spt/models/eft/match/IPutMetricsRequestData";
import { IRequestIdRequest } from "@spt/models/eft/match/IRequestIdRequest";
import { IStartLocalRaidRequestData } from "@spt/models/eft/match/IStartLocalRaidRequestData";
import { IStartLocalRaidResponseData } from "@spt/models/eft/match/IStartLocalRaidResponseData";
import { IUpdatePingRequestData } from "@spt/models/eft/match/IUpdatePingRequestData";
import { DatabaseService } from "@spt/services/DatabaseService";
import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
@ -29,9 +32,12 @@ export declare class MatchCallbacks {
updatePing(url: string, info: IUpdatePingRequestData, sessionID: string): INullResponseData;
exitMatch(url: string, info: IEmptyRequestData, sessionID: string): INullResponseData;
/** Handle client/match/group/exit_from_menu */
exitToMenu(url: string, info: IEmptyRequestData, sessionID: string): INullResponseData;
exitFromMenu(url: string, info: IEmptyRequestData, sessionID: string): INullResponseData;
/** Handle client/match/group/current */
groupCurrent(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IMatchGroupCurrentResponse>;
/** Handle client/match/group/looking/start */
startGroupSearch(url: string, info: IEmptyRequestData, sessionID: string): INullResponseData;
/** Handle client/match/group/looking/stop */
stopGroupSearch(url: string, info: IEmptyRequestData, sessionID: string): INullResponseData;
/** Handle client/match/group/invite/send */
sendGroupInvite(url: string, info: IMatchGroupInviteSendRequest, sessionID: string): IGetBodyResponseData<string>;
@ -45,13 +51,15 @@ export declare class MatchCallbacks {
transferGroup(url: string, info: IMatchGroupTransferRequest, sessionId: string): IGetBodyResponseData<boolean>;
/** Handle client/match/group/invite/cancel-all */
cancelAllGroupInvite(url: string, info: IEmptyRequestData, sessionId: string): IGetBodyResponseData<boolean>;
/** @deprecated - not called on raid start/end or game start/exit */
putMetrics(url: string, info: IPutMetricsRequestData, sessionId: string): INullResponseData;
/** Handle client/putMetrics */
putMetrics(url: string, request: IPutMetricsRequestData, sessionId: string): INullResponseData;
/** Handle client/analytics/event-disconnect */
eventDisconnect(url: string, request: IPutMetricsRequestData, sessionId: string): INullResponseData;
serverAvailable(url: string, info: IEmptyRequestData, sessionId: string): IGetBodyResponseData<boolean>;
/** Handle match/group/start_game */
joinMatch(url: string, info: IMatchGroupStartGameRequest, sessionID: string): IGetBodyResponseData<IProfileStatusResponse>;
/** Handle client/getMetricsConfig */
getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData<string>;
getMetrics(url: string, info: any, sessionID: string): IGetBodyResponseData<IMetrics>;
/**
* Called periodically while in a group
* Handle client/match/group/status
@ -63,8 +71,10 @@ export declare class MatchCallbacks {
leaveGroup(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<boolean>;
/** Handle client/match/group/player/remove */
removePlayerFromGroup(url: string, info: IMatchGroupPlayerRemoveRequest, sessionID: string): IGetBodyResponseData<boolean>;
/** Handle client/match/offline/end */
endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData;
/** Handle client/match/local/start */
startLocalRaid(url: string, info: IStartLocalRaidRequestData, sessionID: string): IGetBodyResponseData<IStartLocalRaidResponseData>;
/** Handle client/match/local/end */
endLocalRaid(url: string, info: IEndLocalRaidRequestData, sessionID: string): INullResponseData;
/** Handle client/raid/configuration */
getRaidConfiguration(url: string, info: IGetRaidConfigurationRequestData, sessionID: string): INullResponseData;
/** Handle client/raid/configuration-by-profile */

View File

@ -5,7 +5,7 @@ import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { INullResponseData } from "@spt/models/eft/httpResponse/INullResponseData";
import { IGetMiniProfileRequestData } from "@spt/models/eft/launcher/IGetMiniProfileRequestData";
import { GetProfileStatusResponseData } from "@spt/models/eft/profile/GetProfileStatusResponseData";
import { IGetProfileStatusResponseData } from "@spt/models/eft/profile/GetProfileStatusResponseData";
import { ICreateProfileResponse } from "@spt/models/eft/profile/ICreateProfileResponse";
import { IGetOtherProfileRequest } from "@spt/models/eft/profile/IGetOtherProfileRequest";
import { IGetOtherProfileResponse } from "@spt/models/eft/profile/IGetOtherProfileResponse";
@ -65,7 +65,7 @@ export declare class ProfileCallbacks {
* Handle client/profile/status
* Called when creating a character when choosing a character face/voice
*/
getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<GetProfileStatusResponseData>;
getProfileStatus(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IGetProfileStatusResponseData>;
/**
* Handle client/profile/view
* Called when viewing another players profile

View File

@ -4,12 +4,15 @@ import { OnUpdate } from "@spt/di/OnUpdate";
import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData";
import { ITraderAssort, ITraderBase } from "@spt/models/eft/common/tables/ITrader";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { IModdedTraders } from "@spt/models/spt/config/ITraderConfig";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
export declare class TraderCallbacks implements OnLoad, OnUpdate {
protected httpResponse: HttpResponseUtil;
protected traderController: TraderController;
protected configServer: ConfigServer;
constructor(httpResponse: HttpResponseUtil, // TODO: delay required
traderController: TraderController);
traderController: TraderController, configServer: ConfigServer);
onLoad(): Promise<void>;
onUpdate(): Promise<boolean>;
getRoute(): string;
@ -19,4 +22,6 @@ export declare class TraderCallbacks implements OnLoad, OnUpdate {
getTrader(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ITraderBase>;
/** Handle client/trading/api/getTraderAssort */
getAssort(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<ITraderAssort>;
/** Handle /singleplayer/moddedTraders */
getModdedTraderData(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IModdedTraders>;
}

View File

@ -2,6 +2,7 @@ import { WeatherController } from "@spt/controllers/WeatherController";
import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData";
import { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData";
import { IWeatherData } from "@spt/models/eft/weather/IWeatherData";
import { IGetLocalWeatherResponseData } from "@spt/models/spt/weather/IGetLocalWeatherResponseData";
import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
export declare class WeatherCallbacks {
protected httpResponse: HttpResponseUtil;
@ -12,4 +13,6 @@ export declare class WeatherCallbacks {
* @returns IWeatherData
*/
getWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IWeatherData>;
/** Handle client/localGame/weather */
getLocalWeather(url: string, info: IEmptyRequestData, sessionID: string): IGetBodyResponseData<IGetLocalWeatherResponseData>;
}

View File

@ -1,12 +1,16 @@
import { WishlistController } from "@spt/controllers/WishlistController";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { IWishlistActionData } from "@spt/models/eft/wishlist/IWishlistActionData";
import { IAddToWishlistRequest } from "@spt/models/eft/wishlist/IAddToWishlistRequest";
import { IChangeWishlistItemCategoryRequest } from "@spt/models/eft/wishlist/IChangeWishlistItemCategoryRequest";
import { IRemoveFromWishlistRequest } from "@spt/models/eft/wishlist/IRemoveFromWishlistRequest";
export declare class WishlistCallbacks {
protected wishlistController: WishlistController;
constructor(wishlistController: WishlistController);
/** Handle AddToWishList event */
addToWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse;
addToWishlist(pmcData: IPmcData, request: IAddToWishlistRequest, sessionID: string): IItemEventRouterResponse;
/** Handle RemoveFromWishList event */
removeFromWishlist(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse;
removeFromWishlist(pmcData: IPmcData, request: IRemoveFromWishlistRequest, sessionID: string): IItemEventRouterResponse;
/** Handle ChangeWishlistItemCategory */
changeWishlistItemCategory(pmcData: IPmcData, request: IChangeWishlistItemCategoryRequest, sessionID: string): IItemEventRouterResponse;
}

View File

@ -3,9 +3,11 @@ export declare enum ContextVariableType {
SESSION_ID = 0,
/** Currently acive raid information */
RAID_CONFIGURATION = 1,
/** Timestamp when client first connected */
/** SessionID + Timestamp when client first connected, has _ between values */
CLIENT_START_TIMESTAMP = 2,
/** When player is loading into map and loot is requested */
REGISTER_PLAYER_REQUEST = 3,
RAID_ADJUSTMENTS = 4
RAID_ADJUSTMENTS = 4,
/** Data returned from client request object from endLocalRaid() */
TRANSIT_INFO = 5
}

View File

@ -5,12 +5,13 @@ import { BotHelper } from "@spt/helpers/BotHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { MinMax } from "@spt/models/common/MinMax";
import { Condition, IGenerateBotsRequestData } from "@spt/models/eft/bot/IGenerateBotsRequestData";
import { ICondition, IGenerateBotsRequestData } from "@spt/models/eft/bot/IGenerateBotsRequestData";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IBotBase } from "@spt/models/eft/common/tables/IBotBase";
import { IBotCore } from "@spt/models/eft/common/tables/IBotCore";
import { Difficulty } from "@spt/models/eft/common/tables/IBotType";
import { BotGenerationDetails } from "@spt/models/spt/bots/BotGenerationDetails";
import { IDifficultyCategories } from "@spt/models/eft/common/tables/IBotType";
import { IGetRaidConfigurationRequestData } from "@spt/models/eft/match/IGetRaidConfigurationRequestData";
import { IBotGenerationDetails } from "@spt/models/spt/bots/BotGenerationDetails";
import { IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { IPmcConfig } from "@spt/models/spt/config/IPmcConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -58,10 +59,11 @@ export declare class BotController {
* Adjust PMC settings to ensure they engage the correct bot types
* @param type what bot the server is requesting settings for
* @param diffLevel difficulty level server requested settings for
* @param raidConfig OPTIONAL - applicationContext Data stored at start of raid
* @param ignoreRaidSettings should raid settings chosen pre-raid be ignored
* @returns Difficulty object
*/
getBotDifficulty(type: string, diffLevel: string, ignoreRaidSettings?: boolean): Difficulty;
getBotDifficulty(type: string, diffLevel: string, raidConfig?: IGetRaidConfigurationRequestData, ignoreRaidSettings?: boolean): IDifficultyCategories;
getAllBotDifficulties(): Record<string, any>;
/**
* Generate bot profiles and store in cache
@ -75,20 +77,27 @@ export declare class BotController {
* @param request Bot generation request object
* @param pmcProfile Player profile
* @param sessionId Session id
* @returns
* @returns IBotBase[]
*/
generateBotsFirstTime(request: IGenerateBotsRequestData, pmcProfile: IPmcData, sessionId: string): Promise<IBotBase[]>;
protected generateMultipleBotsAndCache(request: IGenerateBotsRequestData, pmcProfile: IPmcData, sessionId: string): Promise<IBotBase[]>;
protected getMostRecentRaidSettings(): IGetRaidConfigurationRequestData;
/**
* Get min/max level range values for a specific map
* @param location Map name e.g. factory4_day
* @returns MinMax
*/
protected getPmcLevelRangeForMap(location: string): MinMax;
/**
* Create a BotGenerationDetails for the bot generator to use
* @param condition Client data defining bot type and difficulty
* @param pmcProfile Player who is generating bots
* @param allPmcsHaveSameNameAsPlayer Should all PMCs have same name as player
* @param pmcLevelRangeForMap Min/max levels for PMCs to generate within
* @param raidSettings Settings chosen pre-raid by player
* @param botCountToGenerate How many bots to generate
* @param generateAsPmc Force bot being generated a PMC
* @returns BotGenerationDetails
*/
protected getBotGenerationDetailsForWave(condition: Condition, pmcProfile: IPmcData, allPmcsHaveSameNameAsPlayer: boolean, pmcLevelRangeForMap: MinMax, botCountToGenerate: number, generateAsPmc: boolean): BotGenerationDetails;
protected getBotGenerationDetailsForWave(condition: ICondition, pmcProfile: IPmcData, allPmcsHaveSameNameAsPlayer: boolean, raidSettings: IGetRaidConfigurationRequestData, botCountToGenerate: number, generateAsPmc: boolean): IBotGenerationDetails;
/**
* Get players profile level
* @param pmcProfile Profile to get level from
@ -102,7 +111,7 @@ export declare class BotController {
* @param sessionId Session id
* @returns A promise for the bots to be done generating
*/
protected generateWithBotDetails(condition: Condition, botGenerationDetails: BotGenerationDetails, sessionId: string): Promise<void>;
protected generateWithBotDetails(condition: ICondition, botGenerationDetails: IBotGenerationDetails, sessionId: string): Promise<void>;
/**
* Generate a single bot and store in the cache
* @param botGenerationDetails the bot details to generate the bot with
@ -110,15 +119,16 @@ export declare class BotController {
* @param cacheKey the cache key to store the bot with
* @returns A promise for the bot to be stored
*/
protected generateSingleBotAndStoreInCache(botGenerationDetails: BotGenerationDetails, sessionId: string, cacheKey: string): Promise<void>;
protected generateSingleBotAndStoreInCache(botGenerationDetails: IBotGenerationDetails, sessionId: string, cacheKey: string): Promise<void>;
/**
* Pull a single bot out of cache and return, if cache is empty add bots to it and then return
* @param sessionId Session id
* @param request Bot generation request object
* @returns Single IBotBase object
*/
returnSingleBotFromCache(sessionId: string, request: IGenerateBotsRequestData): Promise<IBotBase[]>;
protected updateBotGenerationDetailsToRandomBoss(botGenerationDetails: BotGenerationDetails, possibleBossTypeWeights: Record<string, number>): void;
protected returnSingleBotFromCache(sessionId: string, request: IGenerateBotsRequestData): Promise<IBotBase[]>;
protected getPmcConversionMinMaxForLocation(requestedBotRole: string, location: string): MinMax;
protected updateBotGenerationDetailsToRandomBoss(botGenerationDetails: IBotGenerationDetails, possibleBossTypeWeights: Record<string, number>): void;
/**
* Get the difficulty passed in, if its not "asonline", get selected difficulty from config
* @param requestedDifficulty

View File

@ -1,7 +1,7 @@
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { ISuit } from "@spt/models/eft/common/tables/ITrader";
import { ClothingItem, IBuyClothingRequestData } from "@spt/models/eft/customization/IBuyClothingRequestData";
import { IBuyClothingRequestData, IPaymentItemForClothing } from "@spt/models/eft/customization/IBuyClothingRequestData";
import { IWearClothingRequestData } from "@spt/models/eft/customization/IWearClothingRequestData";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -54,17 +54,17 @@ export declare class CustomizationController {
* Update output object and player profile with purchase details
* @param sessionId Session id
* @param pmcData Player profile
* @param clothingItems Clothing purchased
* @param itemsToPayForClothingWith Clothing purchased
* @param output Client response
*/
protected payForClothingItems(sessionId: string, pmcData: IPmcData, clothingItems: ClothingItem[], output: IItemEventRouterResponse): void;
protected payForClothingItems(sessionId: string, pmcData: IPmcData, itemsToPayForClothingWith: IPaymentItemForClothing[], output: IItemEventRouterResponse): void;
/**
* Update output object and player profile with purchase details for single piece of clothing
* @param sessionId Session id
* @param pmcData Player profile
* @param clothingItem Clothing item purchased
* @param paymentItemDetails Payment details
* @param output Client response
*/
protected payForClothingItem(sessionId: string, pmcData: IPmcData, clothingItem: ClothingItem, output: IItemEventRouterResponse): void;
protected payForClothingItem(sessionId: string, pmcData: IPmcData, paymentItemDetails: IPaymentItemForClothing, output: IItemEventRouterResponse): void;
protected getAllTraderSuits(sessionID: string): ISuit[];
}

View File

@ -7,7 +7,7 @@ import { IGetFriendListDataResponse } from "@spt/models/eft/dialog/IGetFriendLis
import { IGetMailDialogViewRequestData } from "@spt/models/eft/dialog/IGetMailDialogViewRequestData";
import { IGetMailDialogViewResponseData } from "@spt/models/eft/dialog/IGetMailDialogViewResponseData";
import { ISendMessageRequest } from "@spt/models/eft/dialog/ISendMessageRequest";
import { Dialogue, DialogueInfo, ISptProfile, IUserDialogInfo, Message } from "@spt/models/eft/profile/ISptProfile";
import { IDialogue, IDialogueInfo, IMessage, ISptProfile, IUserDialogInfo } from "@spt/models/eft/profile/ISptProfile";
import { MessageType } from "@spt/models/enums/MessageType";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -40,14 +40,14 @@ export declare class DialogueController {
* @param sessionID Session Id
* @returns array of dialogs
*/
generateDialogueList(sessionID: string): DialogueInfo[];
generateDialogueList(sessionID: string): IDialogueInfo[];
/**
* Get the content of a dialogue
* @param dialogueID Dialog id
* @param sessionID Session Id
* @returns DialogueInfo
*/
getDialogueInfo(dialogueID: string, sessionID: string): DialogueInfo;
getDialogueInfo(dialogueID: string, sessionID: string): IDialogueInfo;
/**
* Get the users involved in a dialog (player + other party)
* @param dialog The dialog to check for users
@ -55,7 +55,7 @@ export declare class DialogueController {
* @param sessionID Player id
* @returns IUserDialogInfo array
*/
getDialogueUsers(dialog: Dialogue, messageType: MessageType, sessionID: string): IUserDialogInfo[] | undefined;
getDialogueUsers(dialog: IDialogue, messageType: MessageType, sessionID: string): IUserDialogInfo[] | undefined;
/**
* Handle client/mail/dialog/view
* Handle player clicking 'messenger' and seeing all the messages they've recieved
@ -72,7 +72,7 @@ export declare class DialogueController {
* @param request get dialog request (params used when dialog doesnt exist in profile)
* @returns Dialogue
*/
protected getDialogByIdFromProfile(profile: ISptProfile, request: IGetMailDialogViewRequestData): Dialogue;
protected getDialogByIdFromProfile(profile: ISptProfile, request: IGetMailDialogViewRequestData): IDialogue;
/**
* Get the users involved in a mail between two entities
* @param fullProfile Player profile
@ -92,7 +92,7 @@ export declare class DialogueController {
* @param messages Messages to check
* @returns true if uncollected rewards found
*/
protected messagesHaveUncollectedRewards(messages: Message[]): boolean;
protected messagesHaveUncollectedRewards(messages: IMessage[]): boolean;
/**
* Handle client/mail/dialog/remove
* Remove an entire dialog with an entity (trader/user)
@ -125,13 +125,13 @@ export declare class DialogueController {
* @param dialogueId Dialog to get mail attachments from
* @returns Message array
*/
protected getActiveMessagesFromDialog(sessionId: string, dialogueId: string): Message[];
protected getActiveMessagesFromDialog(sessionId: string, dialogueId: string): IMessage[];
/**
* Return array of messages with uncollected items (includes expired)
* @param messages Messages to parse
* @returns messages with items to collect
*/
protected getMessagesWithAttachments(messages: Message[]): Message[];
protected getMessagesWithAttachments(messages: IMessage[]): IMessage[];
/**
* Delete expired items from all messages in player profile. triggers when updating traders.
* @param sessionId Session id
@ -148,7 +148,7 @@ export declare class DialogueController {
* @param message Message to check expiry of
* @returns true or false
*/
protected messageHasExpired(message: Message): boolean;
protected messageHasExpired(message: IMessage): boolean;
/** Handle client/friend/request/send */
sendFriendRequest(sessionID: string, request: IFriendRequestData): IFriendRequestSendResponse;
}

View File

@ -1,6 +1,7 @@
import { ApplicationContext } from "@spt/context/ApplicationContext";
import { HideoutHelper } from "@spt/helpers/HideoutHelper";
import { HttpServerHelper } from "@spt/helpers/HttpServerHelper";
import { InventoryHelper } from "@spt/helpers/InventoryHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { PreSptModLoader } from "@spt/loaders/PreSptModLoader";
import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData";
@ -13,14 +14,12 @@ import { IGameModeRequestData } from "@spt/models/eft/game/IGameModeRequestData"
import { IGetRaidTimeRequest } from "@spt/models/eft/game/IGetRaidTimeRequest";
import { IGetRaidTimeResponse } from "@spt/models/eft/game/IGetRaidTimeResponse";
import { IServerDetails } from "@spt/models/eft/game/IServerDetails";
import { ISurveyResponseData } from "@spt/models/eft/game/ISurveyResponseData";
import { ISptProfile } from "@spt/models/eft/profile/ISptProfile";
import { IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { ICoreConfig } from "@spt/models/spt/config/ICoreConfig";
import { IHideoutConfig } from "@spt/models/spt/config/IHideoutConfig";
import { IHttpConfig } from "@spt/models/spt/config/IHttpConfig";
import { ILocationConfig } from "@spt/models/spt/config/ILocationConfig";
import { ILootConfig } from "@spt/models/spt/config/ILootConfig";
import { IPmcConfig } from "@spt/models/spt/config/IPmcConfig";
import { IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -30,6 +29,7 @@ import { GiftService } from "@spt/services/GiftService";
import { ItemBaseClassService } from "@spt/services/ItemBaseClassService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { OpenZoneService } from "@spt/services/OpenZoneService";
import { PostDbLoadService } from "@spt/services/PostDbLoadService";
import { ProfileActivityService } from "@spt/services/ProfileActivityService";
import { ProfileFixerService } from "@spt/services/ProfileFixerService";
import { RaidTimeAdjustmentService } from "@spt/services/RaidTimeAdjustmentService";
@ -45,11 +45,13 @@ export declare class GameController {
protected hashUtil: HashUtil;
protected preSptModLoader: PreSptModLoader;
protected httpServerHelper: HttpServerHelper;
protected inventoryHelper: InventoryHelper;
protected randomUtil: RandomUtil;
protected hideoutHelper: HideoutHelper;
protected profileHelper: ProfileHelper;
protected profileFixerService: ProfileFixerService;
protected localisationService: LocalisationService;
protected postDbLoadService: PostDbLoadService;
protected customLocationWaveService: CustomLocationWaveService;
protected openZoneService: OpenZoneService;
protected seasonalEventService: SeasonalEventService;
@ -62,32 +64,16 @@ export declare class GameController {
protected cloner: ICloner;
protected httpConfig: IHttpConfig;
protected coreConfig: ICoreConfig;
protected locationConfig: ILocationConfig;
protected ragfairConfig: IRagfairConfig;
protected hideoutConfig: IHideoutConfig;
protected pmcConfig: IPmcConfig;
protected lootConfig: ILootConfig;
protected botConfig: IBotConfig;
constructor(logger: ILogger, databaseService: DatabaseService, timeUtil: TimeUtil, hashUtil: HashUtil, preSptModLoader: PreSptModLoader, httpServerHelper: HttpServerHelper, randomUtil: RandomUtil, hideoutHelper: HideoutHelper, profileHelper: ProfileHelper, profileFixerService: ProfileFixerService, localisationService: LocalisationService, customLocationWaveService: CustomLocationWaveService, openZoneService: OpenZoneService, seasonalEventService: SeasonalEventService, itemBaseClassService: ItemBaseClassService, giftService: GiftService, raidTimeAdjustmentService: RaidTimeAdjustmentService, profileActivityService: ProfileActivityService, applicationContext: ApplicationContext, configServer: ConfigServer, cloner: ICloner);
constructor(logger: ILogger, databaseService: DatabaseService, timeUtil: TimeUtil, hashUtil: HashUtil, preSptModLoader: PreSptModLoader, httpServerHelper: HttpServerHelper, inventoryHelper: InventoryHelper, randomUtil: RandomUtil, hideoutHelper: HideoutHelper, profileHelper: ProfileHelper, profileFixerService: ProfileFixerService, localisationService: LocalisationService, postDbLoadService: PostDbLoadService, customLocationWaveService: CustomLocationWaveService, openZoneService: OpenZoneService, seasonalEventService: SeasonalEventService, itemBaseClassService: ItemBaseClassService, giftService: GiftService, raidTimeAdjustmentService: RaidTimeAdjustmentService, profileActivityService: ProfileActivityService, applicationContext: ApplicationContext, configServer: ConfigServer, cloner: ICloner);
load(): void;
/**
* Handle client/game/start
*/
gameStart(_url: string, _info: IEmptyRequestData, sessionID: string, startTimeStampMS: number): void;
protected adjustHideoutCraftTimes(overrideSeconds: number): void;
/**
* Adjust all hideout craft times to be no higher than the override
*/
protected adjustHideoutBuildTimes(overrideSeconds: number): void;
protected adjustLocationBotValues(): void;
/**
* Out of date/incorrectly made trader mods forget this data
*/
protected checkTraderRepairValuesExist(): void;
protected addCustomLooseLootPositions(): void;
protected adjustLooseLootSpawnProbabilities(): void;
/** Apply custom limits on bot types as defined in configs/location.json/botTypeLimits */
protected adjustMapBotLimits(): void;
protected migrate39xProfile(fullProfile: ISptProfile): void;
/**
* Handle client/game/config
*/
@ -116,48 +102,26 @@ export declare class GameController {
* Handle singleplayer/settings/getRaidTime
*/
getRaidTime(sessionId: string, request: IGetRaidTimeRequest): IGetRaidTimeResponse;
/**
* BSG have two values for shotgun dispersion, we make sure both have the same value
*/
protected fixShotgunDispersions(): void;
/**
* Players set botReload to a high value and don't expect the crazy fast reload speeds, give them a warn about it
* @param pmcProfile Player profile
*/
protected warnOnActiveBotReloadSkill(pmcProfile: IPmcData): void;
protected setAllDbItemsAsSellableOnFlea(): void;
/**
* When player logs in, iterate over all active effects and reduce timer
* @param pmcProfile Profile to adjust values for
*/
protected updateProfileHealthValues(pmcProfile: IPmcData): void;
/**
* Waves with an identical min/max values spawn nothing, the number of bots that spawn is the difference between min and max
*/
protected fixBrokenOfflineMapWaves(): void;
/**
* Make Rogues spawn later to allow for scavs to spawn first instead of rogues filling up all spawn positions
*/
protected fixRoguesSpawningInstantlyOnLighthouse(): void;
/**
* Send starting gifts to profile after x days
* @param pmcProfile Profile to add gifts to
*/
protected sendPraporGiftsToNewProfiles(pmcProfile: IPmcData): void;
/**
* Find and split waves with large numbers of bots into smaller waves - BSG appears to reduce the size of these
* waves to one bot when they're waiting to spawn for too long
*/
protected splitBotWavesIntoSingleWaves(): void;
/**
* Get a list of installed mods and save their details to the profile being used
* @param fullProfile Profile to add mod details to
*/
protected saveActiveModsToProfile(fullProfile: ISptProfile): void;
/**
* Check for any missing assorts inside each traders assort.json data, checking against traders questassort.json
*/
protected validateQuestAssortUnlocksExist(): void;
/**
* Add the logged in players name to PMC name pool
* @param pmcProfile Profile of player to get name from
@ -168,13 +132,6 @@ export declare class GameController {
* @param fullProfile Profile to check for dialog in
*/
protected checkForAndRemoveUndefinedDialogs(fullProfile: ISptProfile): void;
/**
* Blank out the "test" mail message from prapor
*/
protected removePraporTestMessage(): void;
/**
* Make non-trigger-spawned raiders spawn earlier + always
*/
protected adjustLabsRaiderSpawnRate(): void;
protected logProfileDetails(fullProfile: ISptProfile): void;
getSurvey(sessionId: string): ISurveyResponseData;
}

View File

@ -5,7 +5,6 @@ import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IHealthTreatmentRequestData } from "@spt/models/eft/health/IHealthTreatmentRequestData";
import { IOffraidEatRequestData } from "@spt/models/eft/health/IOffraidEatRequestData";
import { IOffraidHealRequestData } from "@spt/models/eft/health/IOffraidHealRequestData";
import { ISyncHealthRequestData } from "@spt/models/eft/health/ISyncHealthRequestData";
import { IWorkoutData } from "@spt/models/eft/health/IWorkoutData";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -25,15 +24,6 @@ export declare class HealthController {
protected healthHelper: HealthHelper;
protected cloner: ICloner;
constructor(logger: ILogger, eventOutputHolder: EventOutputHolder, itemHelper: ItemHelper, paymentService: PaymentService, inventoryHelper: InventoryHelper, localisationService: LocalisationService, httpResponse: HttpResponseUtil, healthHelper: HealthHelper, cloner: ICloner);
/**
* stores in-raid player health
* @param pmcData Player profile
* @param info Request data
* @param sessionID Player id
* @param addEffects Should effects found be added or removed from profile
* @param deleteExistingEffects Should all prior effects be removed before apply new ones
*/
saveVitality(pmcData: IPmcData, info: ISyncHealthRequestData, sessionID: string, addEffects?: boolean, deleteExistingEffects?: boolean): void;
/**
* When healing in menu
* @param pmcData Player profile

View File

@ -6,12 +6,13 @@ import { PaymentHelper } from "@spt/helpers/PaymentHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { HideoutArea, ITaskConditionCounter, Product } from "@spt/models/eft/common/tables/IBotBase";
import { HideoutUpgradeCompleteRequestData } from "@spt/models/eft/hideout/HideoutUpgradeCompleteRequestData";
import { IBotHideoutArea, IProduct, ITaskConditionCounter } from "@spt/models/eft/common/tables/IBotBase";
import { IHandleQTEEventRequestData } from "@spt/models/eft/hideout/IHandleQTEEventRequestData";
import { IHideoutArea, Stage } from "@spt/models/eft/hideout/IHideoutArea";
import { IHideoutArea, IStage } from "@spt/models/eft/hideout/IHideoutArea";
import { IHideoutCancelProductionRequestData } from "@spt/models/eft/hideout/IHideoutCancelProductionRequestData";
import { IHideoutCircleOfCultistProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutCircleOfCultistProductionStartRequestData";
import { IHideoutContinuousProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutContinuousProductionStartRequestData";
import { IHideoutDeleteProductionRequestData } from "@spt/models/eft/hideout/IHideoutDeleteProductionRequestData";
import { IHideoutImproveAreaRequestData } from "@spt/models/eft/hideout/IHideoutImproveAreaRequestData";
import { IHideoutProduction } from "@spt/models/eft/hideout/IHideoutProduction";
import { IHideoutPutItemInRequestData } from "@spt/models/eft/hideout/IHideoutPutItemInRequestData";
@ -20,8 +21,9 @@ import { IHideoutSingleProductionStartRequestData } from "@spt/models/eft/hideou
import { IHideoutTakeItemOutRequestData } from "@spt/models/eft/hideout/IHideoutTakeItemOutRequestData";
import { IHideoutTakeProductionRequestData } from "@spt/models/eft/hideout/IHideoutTakeProductionRequestData";
import { IHideoutToggleAreaRequestData } from "@spt/models/eft/hideout/IHideoutToggleAreaRequestData";
import { IHideoutUpgradeCompleteRequestData } from "@spt/models/eft/hideout/IHideoutUpgradeCompleteRequestData";
import { IHideoutUpgradeRequestData } from "@spt/models/eft/hideout/IHideoutUpgradeRequestData";
import { IQteData } from "@spt/models/eft/hideout/IQteData";
import { IQteData, IQteResult } from "@spt/models/eft/hideout/IQteData";
import { IRecordShootingRangePoints } from "@spt/models/eft/hideout/IRecordShootingRangePoints";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { HideoutAreas } from "@spt/models/enums/HideoutAreas";
@ -30,6 +32,7 @@ import { ILogger } from "@spt/models/spt/utils/ILogger";
import { EventOutputHolder } from "@spt/routers/EventOutputHolder";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { SaveServer } from "@spt/servers/SaveServer";
import { CircleOfCultistService } from "@spt/services/CircleOfCultistService";
import { DatabaseService } from "@spt/services/DatabaseService";
import { FenceService } from "@spt/services/FenceService";
import { LocalisationService } from "@spt/services/LocalisationService";
@ -61,11 +64,12 @@ export declare class HideoutController {
protected profileActivityService: ProfileActivityService;
protected configServer: ConfigServer;
protected fenceService: FenceService;
protected circleOfCultistService: CircleOfCultistService;
protected cloner: ICloner;
/** Key used in TaskConditionCounters array */
protected static nameTaskConditionCountersCrafting: string;
protected static nameTaskConditionCountersCraftingId: string;
protected hideoutConfig: IHideoutConfig;
constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseService: DatabaseService, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, itemHelper: ItemHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, eventOutputHolder: EventOutputHolder, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, scavCaseRewardGenerator: ScavCaseRewardGenerator, localisationService: LocalisationService, profileActivityService: ProfileActivityService, configServer: ConfigServer, fenceService: FenceService, cloner: ICloner);
constructor(logger: ILogger, hashUtil: HashUtil, timeUtil: TimeUtil, databaseService: DatabaseService, randomUtil: RandomUtil, inventoryHelper: InventoryHelper, itemHelper: ItemHelper, saveServer: SaveServer, playerService: PlayerService, presetHelper: PresetHelper, paymentHelper: PaymentHelper, eventOutputHolder: EventOutputHolder, httpResponse: HttpResponseUtil, profileHelper: ProfileHelper, hideoutHelper: HideoutHelper, scavCaseRewardGenerator: ScavCaseRewardGenerator, localisationService: LocalisationService, profileActivityService: ProfileActivityService, configServer: ConfigServer, fenceService: FenceService, circleOfCultistService: CircleOfCultistService, cloner: ICloner);
/**
* Handle HideoutUpgrade event
* Start a hideout area upgrade
@ -83,12 +87,12 @@ export declare class HideoutController {
* @param sessionID Session id
* @param output Client response
*/
upgradeComplete(pmcData: IPmcData, request: HideoutUpgradeCompleteRequestData, sessionID: string, output: IItemEventRouterResponse): void;
upgradeComplete(pmcData: IPmcData, request: IHideoutUpgradeCompleteRequestData, sessionID: string, output: IItemEventRouterResponse): void;
/**
* Upgrade wall status to visible in profile if medstation/water collector are both level 1
* @param pmcData Player profile
*/
protected checkAndUpgradeWall(pmcData: IPmcData): void;
protected SetWallVisibleIfPrereqsMet(pmcData: IPmcData): void;
/**
* @param pmcData Profile to edit
* @param output Object to send back to client
@ -97,14 +101,23 @@ export declare class HideoutController {
* @param dbHideoutArea Hideout area being upgraded
* @param hideoutStage Stage hideout area is being upgraded to
*/
protected addContainerImprovementToProfile(output: IItemEventRouterResponse, sessionID: string, pmcData: IPmcData, profileParentHideoutArea: HideoutArea, dbHideoutArea: IHideoutArea, hideoutStage: Stage): void;
protected addContainerImprovementToProfile(output: IItemEventRouterResponse, sessionID: string, pmcData: IPmcData, profileParentHideoutArea: IBotHideoutArea, dbHideoutArea: IHideoutArea, hideoutStage: IStage): void;
/**
* Add stand1/stand2/stand3 inventory items to profile, depending on passed in hideout stage
* @param sessionId Session id
* @param equipmentPresetStage Current EQUIPMENT_PRESETS_STAND stage data
* @param pmcData Player profile
* @param equipmentPresetHideoutArea
* @param output Response to send back to client
*/
protected addMissingPresetStandItemsToProfile(sessionId: string, equipmentPresetStage: IStage, pmcData: IPmcData, equipmentPresetHideoutArea: IHideoutArea, output: IItemEventRouterResponse): void;
/**
* Add an inventory item to profile from a hideout area stage data
* @param pmcData Profile to update
* @param dbHideoutData Hideout area from db being upgraded
* @param dbHideoutArea Hideout area from db being upgraded
* @param hideoutStage Stage area upgraded to
*/
protected addUpdateInventoryItemToProfile(pmcData: IPmcData, dbHideoutData: IHideoutArea, hideoutStage: Stage): void;
protected addUpdateInventoryItemToProfile(sessionId: string, pmcData: IPmcData, dbHideoutArea: IHideoutArea, hideoutStage: IStage): void;
/**
* @param output Object to send to client
* @param sessionID Session/player id
@ -112,7 +125,7 @@ export declare class HideoutController {
* @param hideoutDbData Hideout area that caused addition of stash
* @param hideoutStage Hideout area upgraded to this
*/
protected addContainerUpgradeToClientOutput(output: IItemEventRouterResponse, sessionID: string, areaType: HideoutAreas, hideoutDbData: IHideoutArea, hideoutStage: Stage): void;
protected addContainerUpgradeToClientOutput(sessionID: string, areaType: HideoutAreas, hideoutDbData: IHideoutArea, hideoutStage: IStage, output: IItemEventRouterResponse): void;
/**
* Handle HideoutPutItemsInAreaSlots
* Create item in hideout slot item array, remove item from player inventory
@ -140,7 +153,7 @@ export declare class HideoutController {
* @param hideoutArea Area fuel is being removed from
* @returns IItemEventRouterResponse response
*/
protected removeResourceFromArea(sessionID: string, pmcData: IPmcData, removeResourceRequest: IHideoutTakeItemOutRequestData, output: IItemEventRouterResponse, hideoutArea: HideoutArea): IItemEventRouterResponse;
protected removeResourceFromArea(sessionID: string, pmcData: IPmcData, removeResourceRequest: IHideoutTakeItemOutRequestData, output: IItemEventRouterResponse, hideoutArea: IBotHideoutArea): IItemEventRouterResponse;
/**
* Handle HideoutToggleArea event
* Toggle area on/off
@ -182,7 +195,7 @@ export declare class HideoutController {
* @param rewards reward items to add to profile
* @param recipeId recipe id to save into Production dict
*/
protected addScavCaseRewardsToProfile(pmcData: IPmcData, rewards: Product[], recipeId: string): void;
protected addScavCaseRewardsToProfile(pmcData: IPmcData, rewards: IProduct[], recipeId: string): void;
/**
* Start production of continuously created item
* @param pmcData Player profile
@ -239,6 +252,12 @@ export declare class HideoutController {
* @param request QTE result object
*/
handleQTEEventOutcome(sessionId: string, pmcData: IPmcData, request: IHandleQTEEventRequestData, output: IItemEventRouterResponse): void;
/**
* Apply mild/severe muscle pain after gym use
* @param pmcData Profile to apply effect to
* @param finishEffect Effect data to apply after completing QTE gym event
*/
protected handleMusclePain(pmcData: IPmcData, finishEffect: IQteResult): void;
/**
* Record a high score from the shooting range into a player profiles overallcounters
* @param sessionId Session id
@ -263,7 +282,22 @@ export declare class HideoutController {
*/
cancelProduction(sessionId: string, pmcData: IPmcData, request: IHideoutCancelProductionRequestData): IItemEventRouterResponse;
/**
* Function called every x seconds as part of onUpdate event
* Handle client/game/profile/items/moving - HideoutCircleOfCultistProductionStart
* @param sessionId Session id
* @param pmcData Profile of crafter
* @param request Request data
*/
circleOfCultistProductionStart(sessionId: string, pmcData: IPmcData, request: IHideoutCircleOfCultistProductionStartRequestData): IItemEventRouterResponse;
/**
* Handle HideoutDeleteProductionCommand event
* @param sessionId Session id
* @param pmcData Player profile
* @param request Client request data
* @returns IItemEventRouterResponse
*/
hideoutDeleteProductionCommand(sessionId: string, pmcData: IPmcData, request: IHideoutDeleteProductionRequestData): IItemEventRouterResponse;
/**
* Function called every `hideoutConfig.runIntervalSeconds` seconds as part of onUpdate event
*/
update(): void;
}

View File

@ -1,70 +1,26 @@
import { ApplicationContext } from "@spt/context/ApplicationContext";
import { PlayerScavGenerator } from "@spt/generators/PlayerScavGenerator";
import { HealthHelper } from "@spt/helpers/HealthHelper";
import { InRaidHelper } from "@spt/helpers/InRaidHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { QuestHelper } from "@spt/helpers/QuestHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IRegisterPlayerRequestData } from "@spt/models/eft/inRaid/IRegisterPlayerRequestData";
import { ISaveProgressRequestData } from "@spt/models/eft/inRaid/ISaveProgressRequestData";
import { PlayerRaidEndState } from "@spt/models/enums/PlayerRaidEndState";
import { IAirdropConfig } from "@spt/models/spt/config/IAirdropConfig";
import { IBTRConfig } from "@spt/models/spt/config/IBTRConfig";
import { IScavSaveRequestData } from "@spt/models/eft/inRaid/IScavSaveRequestData";
import { IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { IHideoutConfig } from "@spt/models/spt/config/IHideoutConfig";
import { IInRaidConfig } from "@spt/models/spt/config/IInRaidConfig";
import { ILocationConfig } from "@spt/models/spt/config/ILocationConfig";
import { IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
import { ITraderConfig } from "@spt/models/spt/config/ITraderConfig";
import { ITraderServiceModel } from "@spt/models/spt/services/ITraderServiceModel";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { SaveServer } from "@spt/servers/SaveServer";
import { DatabaseService } from "@spt/services/DatabaseService";
import { InsuranceService } from "@spt/services/InsuranceService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { MailSendService } from "@spt/services/MailSendService";
import { MatchBotDetailsCacheService } from "@spt/services/MatchBotDetailsCacheService";
import { PmcChatResponseService } from "@spt/services/PmcChatResponseService";
import { TraderServicesService } from "@spt/services/TraderServicesService";
import { RandomUtil } from "@spt/utils/RandomUtil";
import { TimeUtil } from "@spt/utils/TimeUtil";
/**
* Logic for handling In Raid callbacks
*/
export declare class InraidController {
protected logger: ILogger;
protected saveServer: SaveServer;
protected timeUtil: TimeUtil;
protected databaseService: DatabaseService;
protected pmcChatResponseService: PmcChatResponseService;
protected matchBotDetailsCacheService: MatchBotDetailsCacheService;
protected questHelper: QuestHelper;
protected itemHelper: ItemHelper;
protected profileHelper: ProfileHelper;
protected playerScavGenerator: PlayerScavGenerator;
protected healthHelper: HealthHelper;
protected traderHelper: TraderHelper;
protected traderServicesService: TraderServicesService;
protected localisationService: LocalisationService;
protected insuranceService: InsuranceService;
protected inRaidHelper: InRaidHelper;
protected applicationContext: ApplicationContext;
protected configServer: ConfigServer;
protected mailSendService: MailSendService;
protected randomUtil: RandomUtil;
protected airdropConfig: IAirdropConfig;
protected btrConfig: IBTRConfig;
protected inRaidConfig: IInRaidConfig;
protected traderConfig: ITraderConfig;
protected locationConfig: ILocationConfig;
protected ragfairConfig: IRagfairConfig;
protected hideoutConfig: IHideoutConfig;
protected botConfig: IBotConfig;
constructor(logger: ILogger, saveServer: SaveServer, timeUtil: TimeUtil, databaseService: DatabaseService, pmcChatResponseService: PmcChatResponseService, matchBotDetailsCacheService: MatchBotDetailsCacheService, questHelper: QuestHelper, itemHelper: ItemHelper, profileHelper: ProfileHelper, playerScavGenerator: PlayerScavGenerator, healthHelper: HealthHelper, traderHelper: TraderHelper, traderServicesService: TraderServicesService, localisationService: LocalisationService, insuranceService: InsuranceService, inRaidHelper: InRaidHelper, applicationContext: ApplicationContext, configServer: ConfigServer, mailSendService: MailSendService, randomUtil: RandomUtil);
constructor(logger: ILogger, saveServer: SaveServer, profileHelper: ProfileHelper, localisationService: LocalisationService, applicationContext: ApplicationContext, configServer: ConfigServer);
/**
* Save locationId to active profiles inraid object AND app context
* @param sessionID Session id
@ -72,124 +28,18 @@ export declare class InraidController {
*/
addPlayer(sessionID: string, info: IRegisterPlayerRequestData): void;
/**
* Handle raid/profile/save
* Handle raid/profile/scavsave
* Save profile state to disk
* Handles pmc/pscav
* @param offraidData post-raid request data
* @param offraidProfileData Post-raid scav profile data
* @param sessionID Session id
*/
savePostRaidProgress(offraidData: ISaveProgressRequestData, sessionID: string): void;
/**
* Handle updating player profile post-pmc raid
* @param sessionID Session id
* @param postRaidRequest Post-raid data
*/
protected savePmcProgress(sessionID: string, postRaidRequest: ISaveProgressRequestData): void;
/**
* Make changes to PMC profile after they've died in raid,
* Alter body part hp, handle insurance, delete inventory items, remove carried quest items
* @param postRaidSaveRequest Post-raid save request
* @param pmcData Pmc profile
* @param sessionID Session id
* @returns Updated profile object
*/
protected performPostRaidActionsWhenDead(postRaidSaveRequest: ISaveProgressRequestData, pmcData: IPmcData, sessionID: string): IPmcData;
/**
* Adjust player characters body part hp post-raid
* @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
* @param multiplier multiplier to apply to max health
*/
protected reducePmcHealthToPercent(pmcData: IPmcData, multiplier: number): void;
/**
* Handle updating the profile post-pscav raid
* @param sessionID Session id
* @param postRaidRequest Post-raid data of raid
*/
protected savePlayerScavProgress(sessionID: string, postRaidRequest: ISaveProgressRequestData): void;
/**
* merge two dictionaries together
* Prioritise pair that has true as a value
* @param primary main dictionary
* @param secondary Secondary dictionary
*/
protected mergePmcAndScavEncyclopedias(primary: IPmcData, secondary: IPmcData): void;
/**
* Post-scav-raid any charisma increase must be propigated into PMC profile
* @param postRaidServerScavProfile Scav profile after adjustments made from raid
* @param postRaidServerPmcProfile Pmc profile after raid
* @param preRaidScavCharismaProgress charisma progress value pre-raid
*/
protected updatePmcCharismaSkillPostScavRaid(postRaidServerScavProfile: IPmcData, postRaidServerPmcProfile: IPmcData, preRaidScavCharismaProgress: number): void;
/**
* Does provided profile contain any condition counters
* @param profile Profile to check for condition counters
* @returns Profile has condition counters
*/
protected profileHasConditionCounters(profile: IPmcData): boolean;
/**
* Scav quest progress isnt transferred automatically from scav to pmc, we do this manually
* @param scavProfile Scav profile with quest progress post-raid
* @param pmcProfile Server pmc profile to copy scav quest progress into
*/
protected migrateScavQuestProgressToPmcProfile(scavProfile: IPmcData, pmcProfile: IPmcData): void;
/**
* Is the player dead after a raid - dead is anything other than "survived" / "runner"
* @param statusOnExit exit value from offraidData object
* @returns true if dead
*/
protected isPlayerDead(statusOnExit: PlayerRaidEndState): boolean;
/**
* Mark inventory items as FiR if player survived raid, otherwise remove FiR from them
* @param offraidData Save Progress Request
*/
protected markOrRemoveFoundInRaidItems(offraidData: ISaveProgressRequestData): 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
*/
protected handlePostRaidPlayerScavKarmaChanges(pmcData: IPmcData, offraidData: ISaveProgressRequestData, scavData: IPmcData): void;
savePostRaidProfileForScav(offraidProfileData: IScavSaveRequestData, 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;
/**
* Get BTR config from configs/btr.json
* @returns Airdrop config
*/
getBTRConfig(): IBTRConfig;
/**
* Handle singleplayer/traderServices/getTraderServices
* @returns Trader services data
*/
getTraderServices(sessionId: string, traderId: string): ITraderServiceModel[];
/**
* Handle singleplayer/traderServices/itemDelivery
*/
itemDelivery(sessionId: string, traderId: string, items: Item[]): void;
getTraitorScavHostileChance(url: string, sessionID: string): number;
getSandboxMaxPatrolValue(url: string, sessionID: string): number;
getBossConvertSettings(url: string, sessionId: string): string[];
}

View File

@ -4,12 +4,12 @@ import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IGetInsuranceCostRequestData } from "@spt/models/eft/insurance/IGetInsuranceCostRequestData";
import { IGetInsuranceCostResponseData } from "@spt/models/eft/insurance/IGetInsuranceCostResponseData";
import { IInsureRequestData } from "@spt/models/eft/insurance/IInsureRequestData";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { Insurance } from "@spt/models/eft/profile/ISptProfile";
import { IInsurance } from "@spt/models/eft/profile/ISptProfile";
import { IInsuranceConfig } from "@spt/models/spt/config/IInsuranceConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { EventOutputHolder } from "@spt/routers/EventOutputHolder";
@ -68,7 +68,7 @@ export declare class InsuranceController {
* @param time The time to check ready status against. Current time by default.
* @returns All insured items that are ready to be processed.
*/
protected filterInsuredItems(sessionID: string, time?: number): Insurance[];
protected filterInsuredItems(sessionID: string, time?: number): IInsurance[];
/**
* This method orchestrates the processing of insured items in a profile.
*
@ -76,13 +76,13 @@ export declare class InsuranceController {
* @param sessionID The session ID that should receive the processed items.
* @returns void
*/
protected processInsuredItems(insuranceDetails: Insurance[], sessionID: string): void;
protected processInsuredItems(insuranceDetails: IInsurance[], sessionID: string): void;
/**
* Count all items in all insurance packages.
* @param insurance
* @returns
*/
protected countAllInsuranceItems(insurance: Insurance[]): number;
protected countAllInsuranceItems(insurance: IInsurance[]): number;
/**
* Remove an insurance package from a profile using the package's system data information.
*
@ -90,7 +90,7 @@ export declare class InsuranceController {
* @param index The array index of the insurance package to remove.
* @returns void
*/
protected removeInsurancePackageFromProfile(sessionID: string, insPackage: Insurance): void;
protected removeInsurancePackageFromProfile(sessionID: string, insPackage: IInsurance): void;
/**
* Finds the items that should be deleted based on the given Insurance object.
*
@ -98,7 +98,7 @@ export declare class InsuranceController {
* @param insured - The insurance object containing the items to evaluate for deletion.
* @returns A Set containing the IDs of items that should be deleted.
*/
protected findItemsToDelete(rootItemParentID: string, insured: Insurance): Set<string>;
protected findItemsToDelete(rootItemParentID: string, insured: IInsurance): Set<string>;
/**
* Initialize a Map object that holds main-parents to all of their attachments. Note that "main-parent" in this
* context refers to the parent item that an attachment is attached to. For example, a suppressor attached to a gun,
@ -109,7 +109,7 @@ export declare class InsuranceController {
* @param itemsMap - A Map object for quick item look-up by item ID.
* @returns A Map object containing parent item IDs to arrays of their attachment items.
*/
protected populateParentAttachmentsMap(rootItemParentID: string, insured: Insurance, itemsMap: Map<string, Item>): Map<string, Item[]>;
protected populateParentAttachmentsMap(rootItemParentID: string, insured: IInsurance, itemsMap: Map<string, IItem>): Map<string, IItem[]>;
/**
* Remove attachments that can not be moddable in-raid from the parentAttachmentsMap. If no moddable attachments
* remain, the parent is removed from the map as well.
@ -118,7 +118,7 @@ export declare class InsuranceController {
* @param itemsMap - A Map object for quick item look-up by item ID.
* @returns A Map object containing parent item IDs to arrays of their attachment items which are not moddable in-raid.
*/
protected removeNonModdableAttachments(parentAttachmentsMap: Map<string, Item[]>, itemsMap: Map<string, Item>): Map<string, Item[]>;
protected removeNonModdableAttachments(parentAttachmentsMap: Map<string, IItem[]>, itemsMap: Map<string, IItem>): Map<string, IItem[]>;
/**
* Process "regular" insurance items. Any insured item that is not an attached, attachment is considered a "regular"
* item. This method iterates over them, preforming item deletion rolls to see if they should be deleted. If so,
@ -129,7 +129,7 @@ export declare class InsuranceController {
* @param parentAttachmentsMap A Map object containing parent item IDs to arrays of their attachment items.
* @returns void
*/
protected processRegularItems(insured: Insurance, toDelete: Set<string>, parentAttachmentsMap: Map<string, Item[]>): void;
protected processRegularItems(insured: IInsurance, toDelete: Set<string>, parentAttachmentsMap: Map<string, IItem[]>): void;
/**
* Process parent items and their attachments, updating the toDelete Set accordingly.
*
@ -138,7 +138,7 @@ export declare class InsuranceController {
* @param traderId The trader ID from the Insurance object.
* @param toDelete A Set object to keep track of items marked for deletion.
*/
protected processAttachments(mainParentToAttachmentsMap: Map<string, Item[]>, itemsMap: Map<string, Item>, traderId: string, toDelete: Set<string>): void;
protected processAttachments(mainParentToAttachmentsMap: Map<string, IItem[]>, itemsMap: Map<string, IItem>, traderId: string, toDelete: Set<string>): void;
/**
* Takes an array of attachment items that belong to the same main-parent item, sorts them in descending order by
* their maximum price. For each attachment, a roll is made to determine if a deletion should be made. Once the
@ -150,9 +150,9 @@ export declare class InsuranceController {
* @param toDelete The array that accumulates the IDs of the items to be deleted.
* @returns void
*/
protected processAttachmentByParent(attachments: Item[], traderId: string, toDelete: Set<string>): void;
protected logAttachmentsBeingRemoved(attachmentIdsToRemove: string[], attachments: Item[], attachmentPrices: Record<string, number>): void;
protected weightAttachmentsByPrice(attachments: Item[]): Record<string, number>;
protected processAttachmentByParent(attachments: IItem[], traderId: string, toDelete: Set<string>): void;
protected logAttachmentsBeingRemoved(attachmentIdsToRemove: string[], attachments: IItem[], attachmentPrices: Record<string, number>): void;
protected weightAttachmentsByPrice(attachments: IItem[]): Record<string, number>;
/**
* Get count of items to remove from weapon (take into account trader + price of attachment)
* @param weightedAttachmentByPrice Dict of item Tpls and thier rouble price
@ -167,7 +167,7 @@ export declare class InsuranceController {
* @param toDelete The items that should be deleted.
* @returns void
*/
protected removeItemsFromInsurance(insured: Insurance, toDelete: Set<string>): void;
protected removeItemsFromInsurance(insured: IInsurance, toDelete: Set<string>): void;
/**
* Handle sending the insurance message to the user that potentially contains the valid insurance items.
*
@ -175,7 +175,12 @@ export declare class InsuranceController {
* @param insurance The context of insurance to use.
* @returns void
*/
protected sendMail(sessionID: string, insurance: Insurance): void;
protected sendMail(sessionID: string, insurance: IInsurance): void;
protected IsMapLabsAndInsuranceDisabled(insurance: IInsurance, labsId?: string): boolean;
/**
* Update IInsurance object with new messageTemplateId and wipe out items array data
*/
protected handleLabsInsurance(traderDialogMessages: Record<string, string[]>, insurance: IInsurance): void;
/**
* Determines whether an insured item should be removed from the player's inventory based on a random roll and
* trader-specific return chance.
@ -184,7 +189,7 @@ export declare class InsuranceController {
* @param insuredItem Optional. The item to roll for. Only used for logging.
* @returns true if the insured item should be removed from inventory, false otherwise, or undefined on error.
*/
protected rollForDelete(traderId: string, insuredItem?: Item): boolean | undefined;
protected rollForDelete(traderId: string, insuredItem?: IItem): boolean | undefined;
/**
* Handle Insure event
* Add insurance to an item
@ -195,6 +200,14 @@ export declare class InsuranceController {
* @returns IItemEventRouterResponse object to send to client
*/
insure(pmcData: IPmcData, body: IInsureRequestData, sessionID: string): IItemEventRouterResponse;
/**
* Insure softinserts of Armor that has softinsert slots
* Allows armors to come back after being lost correctly
* @param item Armor item to be insured
* @param pmcData Player profile
* @param body Insurance request data
*/
insureSoftInserts(item: IItem, pmcData: IPmcData, body: IInsureRequestData): void;
/**
* Handle client/insurance/items/list/cost
* Calculate insurance cost

View File

@ -25,6 +25,7 @@ import { IInventoryTagRequestData } from "@spt/models/eft/inventory/IInventoryTa
import { IInventoryToggleRequestData } from "@spt/models/eft/inventory/IInventoryToggleRequestData";
import { IInventoryTransferRequestData } from "@spt/models/eft/inventory/IInventoryTransferRequestData";
import { IOpenRandomLootContainerRequestData } from "@spt/models/eft/inventory/IOpenRandomLootContainerRequestData";
import { IPinOrLockItemRequest } from "@spt/models/eft/inventory/IPinOrLockItemRequest";
import { IRedeemProfileRequestData } from "@spt/models/eft/inventory/IRedeemProfileRequestData";
import { ISetFavoriteItems } from "@spt/models/eft/inventory/ISetFavoriteItems";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
@ -228,4 +229,13 @@ export declare class InventoryController {
openRandomLootContainer(pmcData: IPmcData, body: IOpenRandomLootContainerRequestData, sessionID: string, output: IItemEventRouterResponse): void;
redeemProfileReward(pmcData: IPmcData, request: IRedeemProfileRequestData, sessionId: string): void;
setFavoriteItem(pmcData: IPmcData, request: ISetFavoriteItems, sessionId: string): void;
/**
* Handle /client/game/profile/items/moving - PinLock
* Requires no response to client, only server change
* @param pmcData Players profile
* @param request Pin/Lock request data
* @param sessionID Session id
* @param output data to send back to client
*/
pinOrLock(pmcData: IPmcData, request: IPinOrLockItemRequest, sessionID: string, output: IItemEventRouterResponse): IItemEventRouterResponse;
}

View File

@ -5,7 +5,7 @@ import { IChangeRequestData } from "@spt/models/eft/launcher/IChangeRequestData"
import { ILoginRequestData } from "@spt/models/eft/launcher/ILoginRequestData";
import { IRegisterData } from "@spt/models/eft/launcher/IRegisterData";
import { IConnectResponse } from "@spt/models/eft/profile/IConnectResponse";
import { Info, ModDetails } from "@spt/models/eft/profile/ISptProfile";
import { IModDetails, Info } from "@spt/models/eft/profile/ISptProfile";
import { ICoreConfig } from "@spt/models/spt/config/ICoreConfig";
import { IPackageJsonData } from "@spt/models/spt/mod/IPackageJsonData";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -61,5 +61,5 @@ export declare class LauncherController {
* @param sessionId Player id
* @returns Array of mod details
*/
getServerModsProfileUsed(sessionId: string): ModDetails[];
getServerModsProfileUsed(sessionId: string): IModDetails[];
}

View File

@ -1,57 +1,20 @@
import { ApplicationContext } from "@spt/context/ApplicationContext";
import { LocationGenerator } from "@spt/generators/LocationGenerator";
import { LootGenerator } from "@spt/generators/LootGenerator";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { ILocationBase } from "@spt/models/eft/common/ILocationBase";
import { ILocationsGenerateAllResponse } from "@spt/models/eft/common/ILocationsSourceDestinationBase";
import { IAirdropLootResult } from "@spt/models/eft/location/IAirdropLootResult";
import { IGetLocationRequestData } from "@spt/models/eft/location/IGetLocationRequestData";
import { AirdropTypeEnum } from "@spt/models/enums/AirdropType";
import { IAirdropConfig } from "@spt/models/spt/config/IAirdropConfig";
import { IGetAirdropLootRequest } from "@spt/models/eft/location/IGetAirdropLootRequest";
import { IGetAirdropLootResponse } from "@spt/models/eft/location/IGetAirdropLootResponse";
import { ILocationConfig } from "@spt/models/spt/config/ILocationConfig";
import { LootRequest } from "@spt/models/spt/services/LootRequest";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { AirdropService } from "@spt/services/AirdropService";
import { DatabaseService } from "@spt/services/DatabaseService";
import { ItemFilterService } from "@spt/services/ItemFilterService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { RaidTimeAdjustmentService } from "@spt/services/RaidTimeAdjustmentService";
import { HashUtil } from "@spt/utils/HashUtil";
import { RandomUtil } from "@spt/utils/RandomUtil";
import { TimeUtil } from "@spt/utils/TimeUtil";
import { ICloner } from "@spt/utils/cloners/ICloner";
export declare class LocationController {
protected hashUtil: HashUtil;
protected randomUtil: RandomUtil;
protected weightedRandomHelper: WeightedRandomHelper;
protected logger: ILogger;
protected locationGenerator: LocationGenerator;
protected localisationService: LocalisationService;
protected raidTimeAdjustmentService: RaidTimeAdjustmentService;
protected itemFilterService: ItemFilterService;
protected lootGenerator: LootGenerator;
protected databaseService: DatabaseService;
protected timeUtil: TimeUtil;
protected airdropService: AirdropService;
protected configServer: ConfigServer;
protected applicationContext: ApplicationContext;
protected cloner: ICloner;
protected airdropConfig: IAirdropConfig;
protected locationConfig: ILocationConfig;
constructor(hashUtil: HashUtil, randomUtil: RandomUtil, weightedRandomHelper: WeightedRandomHelper, logger: ILogger, locationGenerator: LocationGenerator, localisationService: LocalisationService, raidTimeAdjustmentService: RaidTimeAdjustmentService, itemFilterService: ItemFilterService, lootGenerator: LootGenerator, databaseService: DatabaseService, timeUtil: TimeUtil, configServer: ConfigServer, applicationContext: ApplicationContext, cloner: ICloner);
/**
* Handle client/location/getLocalloot
* Get a location (map) with generated loot data
* @param sessionId Player id
* @param request Map request to generate
* @returns ILocationBase
*/
get(sessionId: string, request: IGetLocationRequestData): ILocationBase;
/**
* Generate a maps base location and loot
* @param name Map name
* @returns ILocationBase
*/
protected generate(name: string): ILocationBase;
constructor(logger: ILogger, databaseService: DatabaseService, airdropService: AirdropService, configServer: ConfigServer, cloner: ICloner);
/**
* Handle client/locations
* Get all maps base location properties without loot data
@ -59,22 +22,6 @@ export declare class LocationController {
* @returns ILocationsGenerateAllResponse
*/
generateAll(sessionId: string): ILocationsGenerateAllResponse;
/**
* Handle client/location/getAirdropLoot
* Get loot for an airdrop container
* Generates it randomly based on config/airdrop.json values
* @returns Array of LootItem objects
*/
getAirdropLoot(): IAirdropLootResult;
/**
* Randomly pick a type of airdrop loot using weighted values from config
* @returns airdrop type value
*/
protected chooseAirdropType(): AirdropTypeEnum;
/**
* Get the configuration for a specific type of airdrop
* @param airdropType Type of airdrop to get settings for
* @returns LootRequest
*/
protected getAirdropLootConfigByType(airdropType: AirdropTypeEnum): LootRequest;
/** Handle client/airdrop/loot */
getAirdropLoot(request: IGetAirdropLootRequest): IGetAirdropLootResponse;
}

View File

@ -1,50 +1,31 @@
import { ApplicationContext } from "@spt/context/ApplicationContext";
import { LootGenerator } from "@spt/generators/LootGenerator";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IEndOfflineRaidRequestData } from "@spt/models/eft/match/IEndOfflineRaidRequestData";
import { IEndLocalRaidRequestData } from "@spt/models/eft/match/IEndLocalRaidRequestData";
import { IGetRaidConfigurationRequestData } from "@spt/models/eft/match/IGetRaidConfigurationRequestData";
import { IMatchGroupStartGameRequest } from "@spt/models/eft/match/IMatchGroupStartGameRequest";
import { IMatchGroupStatusRequest } from "@spt/models/eft/match/IMatchGroupStatusRequest";
import { IMatchGroupStatusResponse } from "@spt/models/eft/match/IMatchGroupStatusResponse";
import { IProfileStatusResponse } from "@spt/models/eft/match/IProfileStatusResponse";
import { IInRaidConfig } from "@spt/models/spt/config/IInRaidConfig";
import { IStartLocalRaidRequestData } from "@spt/models/eft/match/IStartLocalRaidRequestData";
import { IStartLocalRaidResponseData } from "@spt/models/eft/match/IStartLocalRaidResponseData";
import { IMatchConfig } from "@spt/models/spt/config/IMatchConfig";
import { IPmcConfig } from "@spt/models/spt/config/IPmcConfig";
import { ITraderConfig } from "@spt/models/spt/config/ITraderConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { SaveServer } from "@spt/servers/SaveServer";
import { BotGenerationCacheService } from "@spt/services/BotGenerationCacheService";
import { BotLootCacheService } from "@spt/services/BotLootCacheService";
import { MailSendService } from "@spt/services/MailSendService";
import { LocationLifecycleService } from "@spt/services/LocationLifecycleService";
import { MatchLocationService } from "@spt/services/MatchLocationService";
import { ProfileSnapshotService } from "@spt/services/ProfileSnapshotService";
import { HashUtil } from "@spt/utils/HashUtil";
import { RandomUtil } from "@spt/utils/RandomUtil";
import { TimeUtil } from "@spt/utils/TimeUtil";
import { ICloner } from "@spt/utils/cloners/ICloner";
export declare class MatchController {
protected logger: ILogger;
protected saveServer: SaveServer;
protected timeUtil: TimeUtil;
protected randomUtil: RandomUtil;
protected hashUtil: HashUtil;
protected profileHelper: ProfileHelper;
protected matchLocationService: MatchLocationService;
protected traderHelper: TraderHelper;
protected botLootCacheService: BotLootCacheService;
protected configServer: ConfigServer;
protected profileSnapshotService: ProfileSnapshotService;
protected botGenerationCacheService: BotGenerationCacheService;
protected mailSendService: MailSendService;
protected lootGenerator: LootGenerator;
protected applicationContext: ApplicationContext;
protected locationLifecycleService: LocationLifecycleService;
protected cloner: ICloner;
protected matchConfig: IMatchConfig;
protected inRaidConfig: IInRaidConfig;
protected traderConfig: ITraderConfig;
protected pmcConfig: IPmcConfig;
constructor(logger: ILogger, saveServer: SaveServer, timeUtil: TimeUtil, randomUtil: RandomUtil, hashUtil: HashUtil, profileHelper: ProfileHelper, matchLocationService: MatchLocationService, traderHelper: TraderHelper, botLootCacheService: BotLootCacheService, configServer: ConfigServer, profileSnapshotService: ProfileSnapshotService, botGenerationCacheService: BotGenerationCacheService, mailSendService: MailSendService, lootGenerator: LootGenerator, applicationContext: ApplicationContext);
constructor(logger: ILogger, saveServer: SaveServer, matchLocationService: MatchLocationService, configServer: ConfigServer, applicationContext: ApplicationContext, locationLifecycleService: LocationLifecycleService, cloner: ICloner);
getEnabled(): boolean;
/** Handle client/match/group/delete */
deleteGroup(info: any): void;
@ -57,48 +38,15 @@ export declare class MatchController {
* @param request Raid config request
* @param sessionID Session id
*/
startOfflineRaid(request: IGetRaidConfigurationRequestData, sessionID: string): void;
configureOfflineRaid(request: IGetRaidConfigurationRequestData, sessionID: string): void;
/**
* Convert a difficulty value from pre-raid screen to a bot difficulty
* @param botDifficulty dropdown difficulty value
* @returns bot difficulty
*/
protected convertDifficultyDropdownIntoBotDifficulty(botDifficulty: string): string;
/** Handle client/match/offline/end */
endOfflineRaid(info: IEndOfflineRaidRequestData, sessionId: string): void;
/**
* Did player take a COOP extract
* @param extractName Name of extract player took
* @returns True if coop extract
*/
protected extractWasViaCoop(extractName: string): boolean;
protected sendCoopTakenFenceMessage(sessionId: string): void;
/**
* Handle when a player extracts using a coop extract - add rep to fence
* @param sessionId Session/player id
* @param pmcData Profile
* @param extractName Name of extract taken
*/
protected handleCoopExtract(sessionId: string, pmcData: IPmcData, extractName: string): void;
/**
* Was extract by car
* @param extractName name of extract
* @returns true if car extract
*/
protected extractWasViaCar(extractName: string): boolean;
/**
* Handle when a player extracts using a car - Add rep to fence
* @param extractName name of the extract used
* @param pmcData Player profile
* @param sessionId Session id
*/
protected handleCarExtract(extractName: string, pmcData: IPmcData, sessionId: string): void;
/**
* Get the fence rep gain from using a car or coop extract
* @param pmcData Profile
* @param baseGain amount gained for the first extract
* @param extractCount Number of times extract was taken
* @returns Fence standing after taking extract
*/
protected getFenceStandingAfterExtract(pmcData: IPmcData, baseGain: number, extractCount: number): number;
/** Handle client/match/local/start */
startLocalRaid(sessionId: string, request: IStartLocalRaidRequestData): IStartLocalRaidResponseData;
/** Handle client/match/local/end */
endLocalRaid(sessionId: string, request: IEndLocalRaidRequestData): void;
}

View File

@ -7,7 +7,7 @@ import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { IMiniProfile } from "@spt/models/eft/launcher/IMiniProfile";
import { GetProfileStatusResponseData } from "@spt/models/eft/profile/GetProfileStatusResponseData";
import { IGetProfileStatusResponseData } from "@spt/models/eft/profile/GetProfileStatusResponseData";
import { IGetOtherProfileRequest } from "@spt/models/eft/profile/IGetOtherProfileRequest";
import { IGetOtherProfileResponse } from "@spt/models/eft/profile/IGetOtherProfileResponse";
import { IGetProfileSettingsRequest } from "@spt/models/eft/profile/IGetProfileSettingsRequest";
@ -117,7 +117,7 @@ export declare class ProfileController {
/**
* Handle client/profile/status
*/
getProfileStatus(sessionId: string): GetProfileStatusResponseData;
getProfileStatus(sessionId: string): IGetProfileStatusResponseData;
getOtherProfile(sessionId: string, request: IGetOtherProfileRequest): IGetOtherProfileResponse;
/**
* Handle client/profile/settings

View File

@ -5,8 +5,7 @@ import { QuestConditionHelper } from "@spt/helpers/QuestConditionHelper";
import { QuestHelper } from "@spt/helpers/QuestHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IQuestStatus } from "@spt/models/eft/common/tables/IBotBase";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IQuest, IQuestCondition } from "@spt/models/eft/common/tables/IQuest";
import { IRepeatableQuest } from "@spt/models/eft/common/tables/IRepeatableQuests";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
@ -54,13 +53,6 @@ export declare class QuestController {
* @returns array of IQuest
*/
getClientQuests(sessionID: string): IQuest[];
/**
* Does a provided quest have a level requirement equal to or below defined level
* @param quest Quest to check
* @param playerLevel level of player to test against quest
* @returns true if quest can be seen/accepted by player of defined level
*/
protected playerLevelFulfillsQuestRequirement(quest: IQuest, playerLevel: number): boolean;
/**
* Handle QuestAccept event
* Handle the client accepting a quest and starting it
@ -72,6 +64,13 @@ export declare class QuestController {
* @returns Client response
*/
acceptQuest(pmcData: IPmcData, acceptedQuest: IAcceptQuestRequestData, sessionID: string): IItemEventRouterResponse;
/**
*
* @param questConditions Conditions to iterate over and possibly add to profile
* @param pmcData Profile to add to
* @param questId Quest conditions came from
*/
protected addTaskConditionCountersToProfile(questConditions: IQuestCondition[], pmcData: IPmcData, questId: string): void;
/**
* Handle the client accepting a repeatable quest and starting it
* Send starting rewards if any to player and
@ -101,49 +100,6 @@ export declare class QuestController {
* @returns ItemEvent client response
*/
completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse;
/**
* Return a list of quests that would fail when supplied quest is completed
* @param completedQuestId quest completed id
* @returns array of IQuest objects
*/
protected getQuestsFailedByCompletingQuest(completedQuestId: string, pmcProfile: IPmcData): IQuest[];
/**
* Remove a quest entirely from a profile
* @param sessionId Player id
* @param questIdToRemove Qid of quest to remove
*/
protected removeQuestFromScavProfile(sessionId: string, questIdToRemove: string): void;
/**
* Return quests that have different statuses
* @param preQuestStatusus Quests before
* @param postQuestStatuses Quests after
* @returns QuestStatusChange array
*/
protected getQuestsWithDifferentStatuses(preQuestStatusus: IQuestStatus[], postQuestStatuses: IQuestStatus[]): IQuestStatus[] | undefined;
/**
* Send a popup to player on successful completion of a quest
* @param sessionID session id
* @param pmcData Player profile
* @param completedQuestId Completed quest id
* @param questRewards Rewards given to player
*/
protected sendSuccessDialogMessageOnQuestComplete(sessionID: string, pmcData: IPmcData, completedQuestId: string, questRewards: Item[]): void;
/**
* Look for newly available quests after completing a quest with a requirement to wait x minutes (time-locked) before being available and add data to profile
* @param pmcData Player profile to update
* @param quests Quests to look for wait conditions in
* @param completedQuestId Quest just completed
*/
protected addTimeLockedQuestsToProfile(pmcData: IPmcData, quests: IQuest[], completedQuestId: string): void;
/**
* Fail the provided quests
* Update quest in profile, otherwise add fresh quest object with failed status
* @param sessionID session id
* @param pmcData player profile
* @param questsToFail quests to fail
* @param output Client output
*/
protected failQuests(sessionID: string, pmcData: IPmcData, questsToFail: IQuest[], output: IItemEventRouterResponse): void;
/**
* Handle QuestHandover event
* @param pmcData Player profile
@ -167,7 +123,7 @@ export declare class QuestController {
* @param output Response to send to user
* @returns IItemEventRouterResponse
*/
protected showQuestItemHandoverMatchError(handoverQuestRequest: IHandoverQuestRequestData, itemHandedOver: Item, handoverRequirements: IQuestCondition, output: IItemEventRouterResponse): IItemEventRouterResponse;
protected showQuestItemHandoverMatchError(handoverQuestRequest: IHandoverQuestRequestData, itemHandedOver: IItem, handoverRequirements: IQuestCondition, output: IItemEventRouterResponse): IItemEventRouterResponse;
/**
* Increment a backend counter stored value by an amount,
* Create counter if it does not exist

View File

@ -10,11 +10,11 @@ import { RagfairSellHelper } from "@spt/helpers/RagfairSellHelper";
import { RagfairSortHelper } from "@spt/helpers/RagfairSortHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITraderAssort } from "@spt/models/eft/common/tables/ITrader";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { ISptProfile } from "@spt/models/eft/profile/ISptProfile";
import { IAddOfferRequestData, Requirement } from "@spt/models/eft/ragfair/IAddOfferRequestData";
import { IAddOfferRequestData, IRequirement } from "@spt/models/eft/ragfair/IAddOfferRequestData";
import { IExtendOfferRequestData } from "@spt/models/eft/ragfair/IExtendOfferRequestData";
import { IGetItemPriceResult } from "@spt/models/eft/ragfair/IGetItemPriceResult";
import { IGetMarketPriceRequestData } from "@spt/models/eft/ragfair/IGetMarketPriceRequestData";
@ -137,10 +137,11 @@ export declare class RagfairController {
update(): void;
/**
* Called when creating an offer on flea, fills values in top right corner
* @param getPriceRequest
* @param getPriceRequest Client request object
* @param ignoreTraderOffers Should trader offers be ignored in the calcualtion
* @returns min/avg/max values for an item based on flea offers available
*/
getItemMinAvgMaxFleaPriceValues(getPriceRequest: IGetMarketPriceRequestData): IGetItemPriceResult;
getItemMinAvgMaxFleaPriceValues(getPriceRequest: IGetMarketPriceRequestData, ignoreTraderOffers?: boolean): IGetItemPriceResult;
/**
* List item(s) on flea for sale
* @param pmcData Player profile
@ -199,7 +200,7 @@ export declare class RagfairController {
* @param output IItemEventRouterResponse
* @returns True if charging tax to player failed
*/
protected chargePlayerTaxFee(sessionID: string, rootItem: Item, pmcData: IPmcData, requirementsPriceInRub: number, itemStackCount: number, offerRequest: IAddOfferRequestData, output: IItemEventRouterResponse): boolean;
protected chargePlayerTaxFee(sessionID: string, rootItem: IItem, pmcData: IPmcData, requirementsPriceInRub: number, itemStackCount: number, offerRequest: IAddOfferRequestData, output: IItemEventRouterResponse): boolean;
/**
* Is the item to be listed on the flea valid
* @param offerRequest Client offer request
@ -212,7 +213,7 @@ export declare class RagfairController {
* @param requirements
* @returns Rouble price
*/
protected calculateRequirementsPriceInRub(requirements: Requirement[]): number;
protected calculateRequirementsPriceInRub(requirements: IRequirement[]): number;
/**
* Using item ids from flea offer request, find corresponding items from player inventory and return as array
* @param pmcData Player profile
@ -220,10 +221,10 @@ export declare class RagfairController {
* @returns Array of items from player inventory
*/
protected getItemsToListOnFleaFromInventory(pmcData: IPmcData, itemIdsFromFleaOfferRequest: string[]): {
items: Item[][] | undefined;
items: IItem[][] | undefined;
errorMessage: string | undefined;
};
createPlayerOffer(sessionId: string, requirements: Requirement[], items: Item[], sellInOnePiece: boolean): IRagfairOffer;
createPlayerOffer(sessionId: string, requirements: IRequirement[], items: IItem[], sellInOnePiece: boolean): IRagfairOffer;
getAllFleaPrices(): Record<string, number>;
getStaticPrices(): Record<string, number>;
/**

View File

@ -4,7 +4,7 @@ import { RagfairOfferHelper } from "@spt/helpers/RagfairOfferHelper";
import { TradeHelper } from "@spt/helpers/TradeHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITraderBase } from "@spt/models/eft/common/tables/ITrader";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { IRagfairOffer } from "@spt/models/eft/ragfair/IRagfairOffer";
@ -101,5 +101,5 @@ export declare class TradeController {
* @param traderDetails Trader being sold to to perform buy category check against
* @returns Rouble price
*/
protected getPriceOfItemAndChildren(parentItemId: string, items: Item[], handbookPrices: Record<string, number>, traderDetails: ITraderBase): number;
protected getPriceOfItemAndChildren(parentItemId: string, items: IItem[], handbookPrices: Record<string, number>, traderDetails: ITraderBase): number;
}

View File

@ -3,11 +3,13 @@ import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { TraderAssortHelper } from "@spt/helpers/TraderAssortHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { ITraderAssort, ITraderBase } from "@spt/models/eft/common/tables/ITrader";
import { IGetItemPricesResponse } from "@spt/models/eft/game/IGetItemPricesResponse";
import { ITraderConfig } from "@spt/models/spt/config/ITraderConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { DatabaseService } from "@spt/services/DatabaseService";
import { FenceService } from "@spt/services/FenceService";
import { RagfairPriceService } from "@spt/services/RagfairPriceService";
import { TraderAssortService } from "@spt/services/TraderAssortService";
import { TraderPurchasePersisterService } from "@spt/services/TraderPurchasePersisterService";
import { TimeUtil } from "@spt/utils/TimeUtil";
@ -20,13 +22,14 @@ export declare class TraderController {
protected profileHelper: ProfileHelper;
protected traderHelper: TraderHelper;
protected traderAssortService: TraderAssortService;
protected ragfairPriceService: RagfairPriceService;
protected traderPurchasePersisterService: TraderPurchasePersisterService;
protected fenceService: FenceService;
protected fenceBaseAssortGenerator: FenceBaseAssortGenerator;
protected configServer: ConfigServer;
protected cloner: ICloner;
protected traderConfig: ITraderConfig;
constructor(logger: ILogger, timeUtil: TimeUtil, databaseService: DatabaseService, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, traderAssortService: TraderAssortService, traderPurchasePersisterService: TraderPurchasePersisterService, fenceService: FenceService, fenceBaseAssortGenerator: FenceBaseAssortGenerator, configServer: ConfigServer, cloner: ICloner);
constructor(logger: ILogger, timeUtil: TimeUtil, databaseService: DatabaseService, traderAssortHelper: TraderAssortHelper, profileHelper: ProfileHelper, traderHelper: TraderHelper, traderAssortService: TraderAssortService, ragfairPriceService: RagfairPriceService, traderPurchasePersisterService: TraderPurchasePersisterService, fenceService: FenceService, fenceBaseAssortGenerator: FenceBaseAssortGenerator, configServer: ConfigServer, cloner: ICloner);
/**
* Runs when onLoad event is fired
* Iterate over traders, ensure a pristine copy of their assorts is stored in traderAssortService
@ -58,4 +61,6 @@ export declare class TraderController {
getTrader(sessionID: string, traderID: string): ITraderBase;
/** Handle client/trading/api/getTraderAssort */
getAssort(sessionId: string, traderId: string): ITraderAssort;
/** Handle client/items/prices/TRADERID */
getItemPrices(sessionId: string, traderId: string): IGetItemPricesResponse;
}

View File

@ -1,19 +1,23 @@
import { WeatherGenerator } from "@spt/generators/WeatherGenerator";
import { WeatherHelper } from "@spt/helpers/WeatherHelper";
import { IWeatherData } from "@spt/models/eft/weather/IWeatherData";
import { IWeatherConfig } from "@spt/models/spt/config/IWeatherConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { IGetLocalWeatherResponseData } from "@spt/models/spt/weather/IGetLocalWeatherResponseData";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { RaidWeatherService } from "@spt/services/RaidWeatherService";
import { SeasonalEventService } from "@spt/services/SeasonalEventService";
export declare class WeatherController {
protected weatherGenerator: WeatherGenerator;
protected logger: ILogger;
protected configServer: ConfigServer;
protected seasonalEventService: SeasonalEventService;
protected raidWeatherService: RaidWeatherService;
protected weatherHelper: WeatherHelper;
protected weatherConfig: IWeatherConfig;
constructor(weatherGenerator: WeatherGenerator, logger: ILogger, configServer: ConfigServer);
constructor(weatherGenerator: WeatherGenerator, logger: ILogger, configServer: ConfigServer, seasonalEventService: SeasonalEventService, raidWeatherService: RaidWeatherService, weatherHelper: WeatherHelper);
/** Handle client/weather */
generate(): IWeatherData;
/**
* Get the current in-raid time (MUST HAVE PLAYER LOGGED INTO CLIENT TO WORK)
* @returns Date object
*/
getCurrentInRaidTime(): Date;
/** Handle client/localGame/weather */
generateLocal(sesssionId: string): IGetLocalWeatherResponseData;
}

View File

@ -1,12 +1,16 @@
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { IWishlistActionData } from "@spt/models/eft/wishlist/IWishlistActionData";
import { IAddToWishlistRequest } from "@spt/models/eft/wishlist/IAddToWishlistRequest";
import { IChangeWishlistItemCategoryRequest } from "@spt/models/eft/wishlist/IChangeWishlistItemCategoryRequest";
import { IRemoveFromWishlistRequest } from "@spt/models/eft/wishlist/IRemoveFromWishlistRequest";
import { EventOutputHolder } from "@spt/routers/EventOutputHolder";
export declare class WishlistController {
protected eventOutputHolder: EventOutputHolder;
constructor(eventOutputHolder: EventOutputHolder);
/** Handle AddToWishList */
addToWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse;
addToWishList(pmcData: IPmcData, request: IAddToWishlistRequest, sessionID: string): IItemEventRouterResponse;
/** Handle RemoveFromWishList event */
removeFromWishList(pmcData: IPmcData, body: IWishlistActionData, sessionID: string): IItemEventRouterResponse;
removeFromWishList(pmcData: IPmcData, request: IRemoveFromWishlistRequest, sessionID: string): IItemEventRouterResponse;
/** Handle changeWishlistItemCategory event */
changeWishlistItemCategory(pmcData: IPmcData, request: IChangeWishlistItemCategoryRequest, sessionID: string): IItemEventRouterResponse;
}

View File

@ -1,5 +1,5 @@
import { IncomingMessage, ServerResponse } from "node:http";
export declare class Serializer {
serialize(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any): void;
serialize(sessionID: string, req: IncomingMessage, resp: ServerResponse, body: any): Promise<void>;
canHandle(something: string): boolean;
}

View File

@ -7,16 +7,17 @@ import { ProbabilityHelper } from "@spt/helpers/ProbabilityHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { IPreset } from "@spt/models/eft/common/IGlobals";
import { Mods, ModsChances } from "@spt/models/eft/common/tables/IBotType";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem, Slot } from "@spt/models/eft/common/tables/ITemplateItem";
import { IMods, IModsChances } from "@spt/models/eft/common/tables/IBotType";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ISlot, ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { ModSpawn } from "@spt/models/enums/ModSpawn";
import { IChooseRandomCompatibleModResult } from "@spt/models/spt/bots/IChooseRandomCompatibleModResult";
import { IFilterPlateModsForSlotByLevelResult } from "@spt/models/spt/bots/IFilterPlateModsForSlotByLevelResult";
import { IGenerateEquipmentProperties } from "@spt/models/spt/bots/IGenerateEquipmentProperties";
import { IGenerateWeaponRequest } from "@spt/models/spt/bots/IGenerateWeaponRequest";
import { IModToSpawnRequest } from "@spt/models/spt/bots/IModToSpawnRequest";
import { EquipmentFilterDetails, EquipmentFilters, IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { EquipmentFilters, IBotConfig, IEquipmentFilterDetails } from "@spt/models/spt/config/IBotConfig";
import { ExhaustableArray } from "@spt/models/spt/server/ExhaustableArray";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { BotEquipmentFilterService } from "@spt/services/BotEquipmentFilterService";
@ -55,11 +56,12 @@ export declare class BotEquipmentModGenerator {
* @param equipment Equipment item to add mods to
* @param modPool Mod list to choose frm
* @param parentId parentid of item to add mod to
* @param parentTemplate template objet of item to add mods to
* @param parentTemplate Template object of item to add mods to
* @param specificBlacklist The relevant blacklist from bot.json equipment dictionary
* @param forceSpawn should this mod be forced to spawn
* @returns Item + compatible mods as an array
*/
generateModsForEquipment(equipment: Item[], parentId: string, parentTemplate: ITemplateItem, settings: IGenerateEquipmentProperties, shouldForceSpawn?: boolean): Item[];
generateModsForEquipment(equipment: IItem[], parentId: string, parentTemplate: ITemplateItem, settings: IGenerateEquipmentProperties, specificBlacklist: IEquipmentFilterDetails, shouldForceSpawn?: boolean): IItem[];
/**
* Filter a bots plate pool based on its current level
* @param settings Bot equipment generation settings
@ -75,7 +77,7 @@ export declare class BotEquipmentModGenerator {
* @param request Data used to generate the weapon
* @returns Weapon + mods array
*/
generateModsForWeapon(sessionId: string, request: IGenerateWeaponRequest): Item[];
generateModsForWeapon(sessionId: string, request: IGenerateWeaponRequest): IItem[];
/**
* Should the provided bot have its stock chance values altered to 100%
* @param modSlot Slot to check
@ -101,7 +103,7 @@ export declare class BotEquipmentModGenerator {
* Set mod spawn chances to defined amount
* @param modSpawnChances Chance dictionary to update
*/
protected adjustSlotSpawnChances(modSpawnChances: ModsChances, modSlotsToAdjust: string[], newChancePercent: number): void;
protected adjustSlotSpawnChances(modSpawnChances: IModsChances, modSlotsToAdjust: string[], newChancePercent: number): void;
/**
* Does the provided modSlot allow muzzle-related items
* @param modSlot Slot id to check
@ -121,16 +123,16 @@ export declare class BotEquipmentModGenerator {
* @param parentTemplate item template
* @returns Slot item
*/
protected getModItemSlotFromDb(modSlot: string, parentTemplate: ITemplateItem): Slot;
protected getModItemSlotFromDb(modSlot: string, parentTemplate: ITemplateItem): ISlot;
/**
* Randomly choose if a mod should be spawned, 100% for required mods OR mod is ammo slot
* @param itemSlot slot the item sits in
* @param modSlot slot the mod sits in
* @param itemSlot slot the item sits in from db
* @param modSlotName Name of slot the mod sits in
* @param modSpawnChances Chances for various mod spawns
* @param botEquipConfig Various config settings for generating this type of bot
* @returns ModSpawn.SPAWN when mod should be spawned, ModSpawn.DEFAULT_MOD when default mod should spawn, ModSpawn.SKIP when mod is skipped
*/
protected shouldModBeSpawned(itemSlot: Slot, modSlot: string, modSpawnChances: ModsChances, botEquipConfig: EquipmentFilters): ModSpawn;
protected shouldModBeSpawned(itemSlot: ISlot, modSlotName: string, modSpawnChances: IModsChances, botEquipConfig: EquipmentFilters): ModSpawn;
/**
* Choose a mod to fit into the desired slot
* @param request Data used to choose an appropriate mod with
@ -138,7 +140,15 @@ export declare class BotEquipmentModGenerator {
*/
protected chooseModToPutIntoSlot(request: IModToSpawnRequest): [boolean, ITemplateItem] | undefined;
/**
*
* Given the passed in array of magaizne tpls, look up the min size set in config and return only those that have that size or larger
* @param modSpawnRequest Request data
* @param modPool Pool of magazine tpls to filter
* @returns Filtered pool of magazine tpls
*/
protected getFilterdMagazinePoolByCapacity(modSpawnRequest: IModToSpawnRequest, modPool: string[]): string[];
/**
* Choose a weapon mod tpl for a given slot from a pool of choices
* Checks chosen tpl is compatible with all existing weapon items
* @param modPool Pool of mods that can be picked from
* @param parentSlot Slot the picked mod will have as a parent
* @param choiceTypeEnum How should chosen tpl be treated: DEFAULT_MOD/SPAWN/SKIP
@ -146,22 +156,36 @@ export declare class BotEquipmentModGenerator {
* @param modSlotName Name of slot picked mod will be placed into
* @returns Chosen weapon details
*/
protected pickWeaponModTplForSlotFromPool(modPool: string[], parentSlot: Slot, choiceTypeEnum: ModSpawn, weapon: Item[], modSlotName: string): IChooseRandomCompatibleModResult;
protected getCompatibleWeaponModTplForSlotFromPool(request: IModToSpawnRequest, modPool: string[], parentSlot: ISlot, choiceTypeEnum: ModSpawn, weapon: IItem[], modSlotName: string): IChooseRandomCompatibleModResult;
/**
*
* @param modPool Pool of item Tpls to choose from
* @param modSpawnType How should the slot choice be handled - forced/normal etc
* @param weapon Weapon mods at current time
* @param modSlotName Name of mod slot being filled
* @returns IChooseRandomCompatibleModResult
*/
protected getCompatibleModFromPool(modPool: string[], modSpawnType: ModSpawn, weapon: IItem[]): IChooseRandomCompatibleModResult;
protected createExhaustableArray<T>(itemsToAddToArray: T[]): ExhaustableArray<T>;
/**
* Get a list of mod tpls that are compatible with the current weapon
* @param modPool
* @param tplBlacklist Tpls that are incompatible and should not be used
* @returns string array of compatible mod tpls with weapon
*/
protected getFilteredModPool(modPool: string[], tplBlacklist: Set<string>): string[];
/**
* Filter mod pool down based on various criteria:
* Is slot flagged as randomisable
* Is slot required
* Is slot flagged as default mod only
* @param itemModPool Existing pool of mods to choose
* @param itemSpawnCategory How should slot be handled
* @param parentTemplate Mods parent
* @param request
* @param weaponTemplate Mods root parent (weapon/equipment)
* @param modSlot name of mod slot to choose for
* @param botEquipBlacklist A blacklist of items not allowed to be picked
* @param isRandomisableSlot Slot is flagged as a randomisable slot
* @returns Array of mod tpls
*/
protected getModPoolForSlot(itemModPool: Record<string, string[]>, itemSpawnCategory: ModSpawn, parentTemplate: ITemplateItem, weaponTemplate: ITemplateItem, modSlot: string, botEquipBlacklist: EquipmentFilterDetails, isRandomisableSlot: boolean): string[];
protected getModPoolForSlot(request: IModToSpawnRequest, weaponTemplate: ITemplateItem): string[];
protected getModPoolForDefaultSlot(request: IModToSpawnRequest, weaponTemplate: ITemplateItem): string[];
protected getMatchingModFromPreset(request: IModToSpawnRequest, weaponTemplate: ITemplateItem): IItem;
/**
* Get default preset for weapon OR get specific weapon presets for edge cases (mp5/silenced dvl)
* @param weaponTemplate Weapons db template
@ -175,7 +199,7 @@ export declare class BotEquipmentModGenerator {
* @param modTpl Mod to check compatibility with weapon
* @returns True if incompatible
*/
protected weaponModComboIsIncompatible(weapon: Item[], modTpl: string): boolean;
protected weaponModComboIsIncompatible(weapon: IItem[], modTpl: string): boolean;
/**
* Create a mod item with provided parameters as properties + add upd property
* @param modId _id
@ -186,7 +210,7 @@ export declare class BotEquipmentModGenerator {
* @param botRole The bots role mod is being created for
* @returns Item object
*/
protected createModItem(modId: string, modTpl: string, parentId: string, modSlot: string, modTemplate: ITemplateItem, botRole: string): Item;
protected createModItem(modId: string, modTpl: string, parentId: string, modSlot: string, modTemplate: ITemplateItem, botRole: string): IItem;
/**
* Get a list of containers that hold ammo
* e.g. mod_magazine / patron_in_weapon_000
@ -201,7 +225,7 @@ export declare class BotEquipmentModGenerator {
* @param items Items to ensure picked mod is compatible with
* @returns Item tpl
*/
protected getRandomModTplFromItemDb(fallbackModTpl: string, parentSlot: Slot, modSlot: string, items: Item[]): string | undefined;
protected getRandomModTplFromItemDb(fallbackModTpl: string, parentSlot: ISlot, modSlot: string, items: IItem[]): string | undefined;
/**
* Check if mod exists in db + is for a required slot
* @param modToAdd Db template of mod to check
@ -211,7 +235,7 @@ export declare class BotEquipmentModGenerator {
* @param botRole Bots wildspawntype (assault/pmcBot/exUsec etc)
* @returns True if valid for slot
*/
protected isModValidForSlot(modToAdd: [boolean, ITemplateItem], slotAddedToTemplate: Slot, modSlot: string, parentTemplate: ITemplateItem, botRole: string): boolean;
protected isModValidForSlot(modToAdd: [boolean, ITemplateItem], slotAddedToTemplate: ISlot, modSlot: string, parentTemplate: ITemplateItem, botRole: string): boolean;
/**
* Find mod tpls of a provided type and add to modPool
* @param desiredSlotName Slot to look up and add we are adding tpls for (e.g mod_scope)
@ -219,7 +243,7 @@ export declare class BotEquipmentModGenerator {
* @param modPool Pool of mods we are adding to
* @param botEquipBlacklist A blacklist of items that cannot be picked
*/
protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: Mods, botEquipBlacklist: EquipmentFilterDetails): void;
protected addCompatibleModsForProvidedMod(desiredSlotName: string, modTemplate: ITemplateItem, modPool: IMods, botEquipBlacklist: IEquipmentFilterDetails): void;
/**
* Get the possible items that fit a slot
* @param parentItemId item tpl to get compatible items for
@ -227,7 +251,7 @@ export declare class BotEquipmentModGenerator {
* @param botEquipBlacklist Equipment that should not be picked
* @returns Array of compatible items for that slot
*/
protected getDynamicModPool(parentItemId: string, modSlot: string, botEquipBlacklist: EquipmentFilterDetails): string[];
protected getDynamicModPool(parentItemId: string, modSlot: string, botEquipBlacklist: IEquipmentFilterDetails): string[];
/**
* Take a list of tpls and filter out blacklisted values using itemFilterService + botEquipmentBlacklist
* @param allowedMods Base mods to filter
@ -235,7 +259,7 @@ export declare class BotEquipmentModGenerator {
* @param modSlot Slot mods belong to
* @returns Filtered array of mod tpls
*/
protected filterWeaponModsByBlacklist(allowedMods: string[], botEquipBlacklist: EquipmentFilterDetails, modSlot: string): string[];
protected filterModsByBlacklist(allowedMods: string[], botEquipBlacklist: IEquipmentFilterDetails, modSlot: string): string[];
/**
* With the shotgun revolver (60db29ce99594040e04c4a27) 12.12 introduced CylinderMagazines.
* Those magazines (e.g. 60dc519adf4c47305f6d410d) have a "Cartridges" entry with a _max_count=0.
@ -246,7 +270,7 @@ export declare class BotEquipmentModGenerator {
* @param cylinderMagParentId The CylinderMagazine's UID
* @param cylinderMagTemplate The CylinderMagazine's template
*/
protected fillCamora(items: Item[], modPool: Mods, cylinderMagParentId: string, cylinderMagTemplate: ITemplateItem): void;
protected fillCamora(items: IItem[], modPool: IMods, cylinderMagParentId: string, cylinderMagTemplate: ITemplateItem): void;
/**
* Take a record of camoras and merge the compatible shells into one array
* @param camorasWithShells Dictionary of camoras we want to merge into one array
@ -262,5 +286,5 @@ export declare class BotEquipmentModGenerator {
* @param botWeaponSightWhitelist Whitelist of scope types by weapon base type
* @returns Array of scope tpls that have been filtered to just ones allowed for that weapon type
*/
protected filterSightsByWeaponType(weapon: Item, scopes: string[], botWeaponSightWhitelist: Record<string, string[]>): string[];
protected filterSightsByWeaponType(weapon: IItem, scopes: string[], botWeaponSightWhitelist: Record<string, string[]>): string[];
}

View File

@ -1,20 +1,21 @@
import { BotInventoryGenerator } from "@spt/generators/BotInventoryGenerator";
import { BotLevelGenerator } from "@spt/generators/BotLevelGenerator";
import { BotDifficultyHelper } from "@spt/helpers/BotDifficultyHelper";
import { BotGeneratorHelper } from "@spt/helpers/BotGeneratorHelper";
import { BotHelper } from "@spt/helpers/BotHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { IBaseJsonSkills, IBaseSkill, IBotBase, Info, Health as PmcHealth, Skills as botSkills } from "@spt/models/eft/common/tables/IBotBase";
import { Appearance, Health, IBotType, Inventory } from "@spt/models/eft/common/tables/IBotType";
import { BotGenerationDetails } from "@spt/models/spt/bots/BotGenerationDetails";
import { MinMax } from "@spt/models/common/MinMax";
import { IBaseJsonSkills, IBaseSkill, IBotBase, IInfo, IHealth as PmcHealth, ISkills as botSkills } from "@spt/models/eft/common/tables/IBotBase";
import { IAppearance, IBodyPart, IBotType, IHealth, IInventory } from "@spt/models/eft/common/tables/IBotType";
import { IBotGenerationDetails } from "@spt/models/spt/bots/BotGenerationDetails";
import { IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { IPmcConfig } from "@spt/models/spt/config/IPmcConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { BotEquipmentFilterService } from "@spt/services/BotEquipmentFilterService";
import { BotNameService } from "@spt/services/BotNameService";
import { DatabaseService } from "@spt/services/DatabaseService";
import { ItemFilterService } from "@spt/services/ItemFilterService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { SeasonalEventService } from "@spt/services/SeasonalEventService";
import { HashUtil } from "@spt/utils/HashUtil";
import { RandomUtil } from "@spt/utils/RandomUtil";
@ -32,15 +33,15 @@ export declare class BotGenerator {
protected botEquipmentFilterService: BotEquipmentFilterService;
protected weightedRandomHelper: WeightedRandomHelper;
protected botHelper: BotHelper;
protected botDifficultyHelper: BotDifficultyHelper;
protected botGeneratorHelper: BotGeneratorHelper;
protected seasonalEventService: SeasonalEventService;
protected localisationService: LocalisationService;
protected itemFilterService: ItemFilterService;
protected botNameService: BotNameService;
protected configServer: ConfigServer;
protected cloner: ICloner;
protected botConfig: IBotConfig;
protected pmcConfig: IPmcConfig;
constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, profileHelper: ProfileHelper, databaseService: DatabaseService, botInventoryGenerator: BotInventoryGenerator, botLevelGenerator: BotLevelGenerator, botEquipmentFilterService: BotEquipmentFilterService, weightedRandomHelper: WeightedRandomHelper, botHelper: BotHelper, botDifficultyHelper: BotDifficultyHelper, seasonalEventService: SeasonalEventService, localisationService: LocalisationService, itemFilterService: ItemFilterService, configServer: ConfigServer, cloner: ICloner);
constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, timeUtil: TimeUtil, profileHelper: ProfileHelper, databaseService: DatabaseService, botInventoryGenerator: BotInventoryGenerator, botLevelGenerator: BotLevelGenerator, botEquipmentFilterService: BotEquipmentFilterService, weightedRandomHelper: WeightedRandomHelper, botHelper: BotHelper, botGeneratorHelper: BotGeneratorHelper, seasonalEventService: SeasonalEventService, itemFilterService: ItemFilterService, botNameService: BotNameService, configServer: ConfigServer, cloner: ICloner);
/**
* Generate a player scav bot object
* @param role e.g. assault / pmcbot
@ -50,12 +51,12 @@ export declare class BotGenerator {
*/
generatePlayerScav(sessionId: string, role: string, difficulty: string, botTemplate: IBotType): IBotBase;
/**
* Create 1 bots of the type/side/difficulty defined in botGenerationDetails
* Create 1 bot of the type/side/difficulty defined in botGenerationDetails
* @param sessionId Session id
* @param botGenerationDetails details on how to generate bots
* @returns constructed bot
*/
prepareAndGenerateBot(sessionId: string, botGenerationDetails: BotGenerationDetails): IBotBase;
prepareAndGenerateBot(sessionId: string, botGenerationDetails: IBotGenerationDetails): IBotBase;
/**
* Get a clone of the default bot base object and adjust its role/side/difficulty values
* @param botRole Role bot should have
@ -77,31 +78,50 @@ export declare class BotGenerator {
* @param botGenerationDetails details on how to generate the bot
* @returns IBotBase object
*/
protected generateBot(sessionId: string, bot: IBotBase, botJsonTemplate: IBotType, botGenerationDetails: BotGenerationDetails): IBotBase;
protected generateBot(sessionId: string, bot: IBotBase, botJsonTemplate: IBotType, botGenerationDetails: IBotGenerationDetails): IBotBase;
/**
* Get exp for kill by bot difficulty
* @param experience Dict of difficulties and experience
* @param botDifficulty the killed bots difficulty
* @param role Role of bot (optional, used for error logging)
* @returns Experience for kill
*/
protected getExperienceRewardForKillByDifficulty(experience: Record<string, MinMax>, botDifficulty: string, role: string): number;
/**
* Get the standing value change when player kills a bot
* @param standingForKill Dictionary of standing values keyed by bot difficulty
* @param botDifficulty Difficulty of bot to look up
* @param role Role of bot (optional, used for error logging)
* @returns Standing change value
*/
protected getStandingChangeForKillByDifficulty(standingForKill: Record<string, number>, botDifficulty: string, role: string): number;
/**
* Get the agressor bonus value when player kills a bot
* @param standingForKill Dictionary of standing values keyed by bot difficulty
* @param botDifficulty Difficulty of bot to look up
* @param role Role of bot (optional, used for error logging)
* @returns Standing change value
*/
protected getAgressorBonusByDifficulty(aggressorBonus: Record<string, number>, botDifficulty: string, role: string): number;
/**
* Set weighting of flagged equipment to 0
* @param botJsonTemplate Bot data to adjust
* @param botGenerationDetails Generation details of bot
*/
protected filterBlacklistedGear(botJsonTemplate: IBotType, botGenerationDetails: IBotGenerationDetails): void;
protected addAdditionalPocketLootWeightsForUnheardBot(botJsonTemplate: IBotType): void;
/**
* Remove items from item.json/lootableItemBlacklist from bots inventory
* @param botInventory Bot to filter
*/
protected removeBlacklistedLootFromBotTemplate(botInventory: Inventory): void;
protected removeBlacklistedLootFromBotTemplate(botInventory: IInventory): void;
/**
* Choose various appearance settings for a bot using weights: head/body/feet/hands
* @param bot Bot to adjust
* @param appearance Appearance settings to choose from
* @param botGenerationDetails Generation details
*/
protected setBotAppearance(bot: IBotBase, appearance: Appearance, botGenerationDetails: BotGenerationDetails): void;
/**
* Create a bot nickname
* @param botJsonTemplate x.json from database
* @param botGenerationDetails
* @param botRole role of bot e.g. assault
* @param sessionId OPTIONAL: profile session id
* @returns Nickname for bot
*/
protected generateBotNickname(botJsonTemplate: IBotType, botGenerationDetails: BotGenerationDetails, botRole: string, sessionId?: string): string;
protected shouldSimulatePlayerScavName(botRole: string, isPlayerScav: boolean): boolean;
protected addPlayerScavNameSimulationSuffix(nickname: string): string;
protected setBotAppearance(bot: IBotBase, appearance: IAppearance, botGenerationDetails: IBotGenerationDetails): void;
/**
* Log the number of PMCs generated to the debug console
* @param output Generated bot array, ready to send to client
@ -113,7 +133,13 @@ export declare class BotGenerator {
* @param playerScav Is a pscav bot being generated
* @returns PmcHealth object
*/
protected generateHealth(healthObj: Health, playerScav?: boolean): PmcHealth;
protected generateHealth(healthObj: IHealth, playerScav?: boolean): PmcHealth;
/**
* Sum up body parts max hp values, return the bodypart collection with lowest value
* @param bodies Body parts to sum up
* @returns Lowest hp collection
*/
protected getLowestHpBody(bodies: IBodyPart[]): IBodyPart | undefined;
/**
* Get a bots skills with randomsied progress value between the min and max values
* @param botSkills Skills that should have their progress value randomised
@ -146,7 +172,7 @@ export declare class BotGenerator {
* @param botInfo bot info object to update
* @returns Chosen game version
*/
protected setRandomisedGameVersionAndCategory(botInfo: Info): string;
protected setRandomisedGameVersionAndCategory(botInfo: IInfo): string;
/**
* Add a side-specific (usec/bear) dogtag item to a bots inventory
* @param bot bot to add dogtag to

View File

@ -1,17 +1,22 @@
import { ApplicationContext } from "@spt/context/ApplicationContext";
import { BotEquipmentModGenerator } from "@spt/generators/BotEquipmentModGenerator";
import { BotLootGenerator } from "@spt/generators/BotLootGenerator";
import { BotWeaponGenerator } from "@spt/generators/BotWeaponGenerator";
import { BotGeneratorHelper } from "@spt/helpers/BotGeneratorHelper";
import { BotHelper } from "@spt/helpers/BotHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { WeatherHelper } from "@spt/helpers/WeatherHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { Inventory as PmcInventory } from "@spt/models/eft/common/tables/IBotBase";
import { Chances, Equipment, Generation, IBotType, Inventory } from "@spt/models/eft/common/tables/IBotType";
import { IInventory as PmcInventory } from "@spt/models/eft/common/tables/IBotBase";
import { IBotType, IChances, IEquipment, IGeneration, IInventory } from "@spt/models/eft/common/tables/IBotType";
import { IGetRaidConfigurationRequestData } from "@spt/models/eft/match/IGetRaidConfigurationRequestData";
import { EquipmentSlots } from "@spt/models/enums/EquipmentSlots";
import { IGenerateEquipmentProperties } from "@spt/models/spt/bots/IGenerateEquipmentProperties";
import { EquipmentFilterDetails, IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { BotEquipmentFilterService } from "@spt/services/BotEquipmentFilterService";
import { BotEquipmentModPoolService } from "@spt/services/BotEquipmentModPoolService";
import { DatabaseService } from "@spt/services/DatabaseService";
import { LocalisationService } from "@spt/services/LocalisationService";
@ -22,18 +27,22 @@ export declare class BotInventoryGenerator {
protected hashUtil: HashUtil;
protected randomUtil: RandomUtil;
protected databaseService: DatabaseService;
protected applicationContext: ApplicationContext;
protected botWeaponGenerator: BotWeaponGenerator;
protected botLootGenerator: BotLootGenerator;
protected botGeneratorHelper: BotGeneratorHelper;
protected profileHelper: ProfileHelper;
protected botHelper: BotHelper;
protected weightedRandomHelper: WeightedRandomHelper;
protected itemHelper: ItemHelper;
protected weatherHelper: WeatherHelper;
protected localisationService: LocalisationService;
protected botEquipmentFilterService: BotEquipmentFilterService;
protected botEquipmentModPoolService: BotEquipmentModPoolService;
protected botEquipmentModGenerator: BotEquipmentModGenerator;
protected configServer: ConfigServer;
protected botConfig: IBotConfig;
constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseService: DatabaseService, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, botHelper: BotHelper, weightedRandomHelper: WeightedRandomHelper, itemHelper: ItemHelper, localisationService: LocalisationService, botEquipmentModPoolService: BotEquipmentModPoolService, botEquipmentModGenerator: BotEquipmentModGenerator, configServer: ConfigServer);
constructor(logger: ILogger, hashUtil: HashUtil, randomUtil: RandomUtil, databaseService: DatabaseService, applicationContext: ApplicationContext, botWeaponGenerator: BotWeaponGenerator, botLootGenerator: BotLootGenerator, botGeneratorHelper: BotGeneratorHelper, profileHelper: ProfileHelper, botHelper: BotHelper, weightedRandomHelper: WeightedRandomHelper, itemHelper: ItemHelper, weatherHelper: WeatherHelper, localisationService: LocalisationService, botEquipmentFilterService: BotEquipmentFilterService, botEquipmentModPoolService: BotEquipmentModPoolService, botEquipmentModGenerator: BotEquipmentModGenerator, configServer: ConfigServer);
/**
* Add equipment/weapons/loot to bot
* @param sessionId Session id
@ -52,6 +61,7 @@ export declare class BotInventoryGenerator {
protected generateInventoryBase(): PmcInventory;
/**
* Add equipment to a bot
* @param sessionId Session id
* @param templateInventory bot/x.json data from db
* @param wornItemChances Chances items will be added to bot
* @param botRole Role bot has (assault/pmcBot)
@ -59,19 +69,23 @@ export declare class BotInventoryGenerator {
* @param botLevel Level of bot
* @param chosenGameVersion Game version for bot, only really applies for PMCs
*/
protected generateAndAddEquipmentToBot(templateInventory: Inventory, wornItemChances: Chances, botRole: string, botInventory: PmcInventory, botLevel: number, chosenGameVersion: string): void;
protected generateAndAddEquipmentToBot(sessionId: string, templateInventory: IInventory, wornItemChances: IChances, botRole: string, botInventory: PmcInventory, botLevel: number, chosenGameVersion: string, raidConfig: IGetRaidConfigurationRequestData): void;
/**
* Remove non-armored rigs from parameter data
* @param templateEquipment Equpiment to filter TacticalVest of
* @param botRole Role of bot vests are being filtered for
*/
protected filterRigsToThoseWithProtection(templateEquipment: Equipment): void;
protected filterRigsToThoseWithProtection(templateEquipment: IEquipment, botRole: string): void;
/**
* Remove armored rigs from parameter data
* @param templateEquipment Equpiment to filter TacticalVest of
* @param botRole Role of bot vests are being filtered for
* @param allowEmptyResult Should the function return all rigs when 0 unarmored are found
*/
protected filterRigsToThoseWithoutProtection(templateEquipment: Equipment): void;
protected filterRigsToThoseWithoutProtection(templateEquipment: IEquipment, botRole: string, allowEmptyResult?: boolean): void;
/**
* Add a piece of equipment with mods to inventory from the provided pools
* @param sessionId Session id
* @param settings Values to adjust how item is chosen and added to bot
* @returns true when item added
*/
@ -79,10 +93,10 @@ export declare class BotInventoryGenerator {
/**
* Get all possible mods for item and filter down based on equipment blacklist from bot.json config
* @param itemTpl Item mod pool is being retrieved and filtered
* @param equipmentBlacklist blacklist to filter mod pool with
* @param equipmentBlacklist Blacklist to filter mod pool with
* @returns Filtered pool of mods
*/
protected getFilteredDynamicModsForItem(itemTpl: string, equipmentBlacklist: EquipmentFilterDetails[]): Record<string, string[]>;
protected getFilteredDynamicModsForItem(itemTpl: string, equipmentBlacklist: Record<string, string[]>): Record<string, string[]>;
/**
* Work out what weapons bot should have equipped and add them to bot inventory
* @param templateInventory bot/x.json data from db
@ -94,13 +108,13 @@ export declare class BotInventoryGenerator {
* @param itemGenerationLimitsMinMax Limits for items the bot can have
* @param botLevel level of bot having weapon generated
*/
protected generateAndAddWeaponsToBot(templateInventory: Inventory, equipmentChances: Chances, sessionId: string, botInventory: PmcInventory, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: Generation, botLevel: number): void;
protected generateAndAddWeaponsToBot(templateInventory: IInventory, equipmentChances: IChances, sessionId: string, botInventory: PmcInventory, botRole: string, isPmc: boolean, itemGenerationLimitsMinMax: IGeneration, 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): {
protected getDesiredWeaponsForBot(equipmentChances: IChances): {
slot: EquipmentSlots;
shouldSpawn: boolean;
}[];
@ -118,5 +132,5 @@ export declare class BotInventoryGenerator {
protected addWeaponAndMagazinesToInventory(sessionId: string, weaponSlot: {
slot: EquipmentSlots;
shouldSpawn: boolean;
}, templateInventory: Inventory, botInventory: PmcInventory, equipmentChances: Chances, botRole: string, isPmc: boolean, itemGenerationWeights: Generation, botLevel: number): void;
}, templateInventory: IInventory, botInventory: PmcInventory, equipmentChances: IChances, botRole: string, isPmc: boolean, itemGenerationWeights: IGeneration, botLevel: number): void;
}

View File

@ -1,7 +1,7 @@
import { MinMax } from "@spt/models/common/MinMax";
import { IRandomisedBotLevelResult } from "@spt/models/eft/bot/IRandomisedBotLevelResult";
import { IBotBase } from "@spt/models/eft/common/tables/IBotBase";
import { BotGenerationDetails } from "@spt/models/spt/bots/BotGenerationDetails";
import { IBotGenerationDetails } from "@spt/models/spt/bots/BotGenerationDetails";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { DatabaseService } from "@spt/services/DatabaseService";
import { MathUtil } from "@spt/utils/MathUtil";
@ -19,7 +19,7 @@ export declare class BotLevelGenerator {
* @param bot Bot the level is being generated for
* @returns IRandomisedBotLevelResult object
*/
generateBotLevel(levelDetails: MinMax, botGenerationDetails: BotGenerationDetails, bot: IBotBase): IRandomisedBotLevelResult;
generateBotLevel(levelDetails: MinMax, botGenerationDetails: IBotGenerationDetails, bot: IBotBase): IRandomisedBotLevelResult;
protected chooseBotLevel(min: number, max: number, shift: number, number: number): number;
/**
* Return the min and max bot level based on a relative delta from the PMC level
@ -28,5 +28,5 @@ export declare class BotLevelGenerator {
* @param maxlevel Max level allowed
* @returns A MinMax of the lowest and highest level to generate the bots
*/
protected getRelativeBotLevelRange(botGenerationDetails: BotGenerationDetails, levelDetails: MinMax, maxAvailableLevel: number): MinMax;
protected getRelativeBotLevelRange(botGenerationDetails: IBotGenerationDetails, levelDetails: MinMax, maxAvailableLevel: number): MinMax;
}

View File

@ -5,9 +5,9 @@ import { HandbookHelper } from "@spt/helpers/HandbookHelper";
import { InventoryHelper } from "@spt/helpers/InventoryHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { Inventory as PmcInventory } from "@spt/models/eft/common/tables/IBotBase";
import { IBotType, Inventory, ModsChances } from "@spt/models/eft/common/tables/IBotType";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IInventory as PmcInventory } from "@spt/models/eft/common/tables/IBotBase";
import { IBotType, IInventory, IModsChances } from "@spt/models/eft/common/tables/IBotType";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { EquipmentSlots } from "@spt/models/enums/EquipmentSlots";
import { IItemSpawnLimitSettings } from "@spt/models/spt/bots/IItemSpawnLimitSettings";
@ -51,6 +51,14 @@ export declare class BotLootGenerator {
* @param botLevel Level of bot
*/
generateLoot(sessionId: string, botJsonTemplate: IBotType, isPmc: boolean, botRole: string, botInventory: PmcInventory, botLevel: number): void;
/**
* Gets the rouble cost total for loot in a bots backpack by the bots levl
* Will return 0 for non PMCs
* @param botLevel Bots level
* @param isPmc Is the bot a PMC
* @returns number
*/
protected getBackpackRoubleTotalByLevel(botLevel: number, isPmc: boolean): number;
/**
* Get an array of the containers a bot has on them (pockets/backpack/vest)
* @param botInventory Bot to check
@ -63,14 +71,6 @@ export declare class BotLootGenerator {
* @param botRole Role of bot (pmcBEAR/pmcUSEC)
*/
protected addForcedMedicalItemsToPmcSecure(botInventory: PmcInventory, botRole: string): void;
/**
* Get a biased random number
* @param min Smallest size
* @param max Biggest size
* @param nValue Value to bias choice
* @returns Chosen number
*/
protected getRandomisedCount(min: number, max: number, nValue: number): number;
/**
* Take random items from a pool and add to an inventory until totalItemCount or totalValueLimit or space limit is reached
* @param pool Pool of items to pick from with weight
@ -83,7 +83,7 @@ export declare class BotLootGenerator {
* @param isPmc Is bot being generated for a pmc
*/
protected addLootFromPool(pool: Record<string, number>, equipmentSlots: string[], totalItemCount: number, inventoryToAddItemsTo: PmcInventory, botRole: string, itemSpawnLimits?: IItemSpawnLimitSettings, totalValueLimitRub?: number, isPmc?: boolean, containersIdFull?: Set<string>): void;
protected createWalletLoot(walletId: string): Item[][];
protected createWalletLoot(walletId: string): IItem[][];
/**
* Some items need child items to function, add them to the itemToAddChildrenTo array
* @param itemToAddTemplate Db template of item to check
@ -91,7 +91,7 @@ export declare class BotLootGenerator {
* @param isPmc Is the item being generated for a pmc (affects money/ammo stack sizes)
* @param botRole role bot has that owns item
*/
protected addRequiredChildItemsToParent(itemToAddTemplate: ITemplateItem, itemToAddChildrenTo: Item[], isPmc: boolean, botRole: string): void;
protected addRequiredChildItemsToParent(itemToAddTemplate: ITemplateItem, itemToAddChildrenTo: IItem[], isPmc: boolean, botRole: string): void;
/**
* Add generated weapons to inventory as loot
* @param botInventory inventory to add preset to
@ -101,7 +101,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, botLevel: number, containersIdFull?: Set<string>): void;
protected addLooseWeaponsToInventorySlot(sessionId: string, botInventory: PmcInventory, equipmentSlot: string, templateInventory: IInventory, modChances: IModsChances, botRole: string, isPmc: boolean, botLevel: number, containersIdFull?: Set<string>): void;
/**
* Hydrate item limit array to contain items that have a limit for a specific bot type
* All values are set to 0
@ -123,14 +123,14 @@ export declare class BotLootGenerator {
* @param itemTemplate item details from db
* @param moneyItem Money item to randomise
*/
protected randomiseMoneyStackSize(botRole: string, itemTemplate: ITemplateItem, moneyItem: Item): void;
protected randomiseMoneyStackSize(botRole: string, itemTemplate: ITemplateItem, moneyItem: IItem): void;
/**
* Randomise the size of an ammo stack
* @param isPmc Is ammo on a PMC bot
* @param itemTemplate item details from db
* @param ammoItem Ammo item to randomise
*/
protected randomiseAmmoStackSize(isPmc: boolean, itemTemplate: ITemplateItem, ammoItem: Item): void;
protected randomiseAmmoStackSize(isPmc: boolean, itemTemplate: ITemplateItem, ammoItem: IItem): void;
/**
* Get spawn limits for a specific bot type from bot.json config
* If no limit found for a non pmc bot, fall back to defaults

View File

@ -4,11 +4,11 @@ import { BotGeneratorHelper } from "@spt/helpers/BotGeneratorHelper";
import { BotWeaponGeneratorHelper } from "@spt/helpers/BotWeaponGeneratorHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { Inventory as PmcInventory } from "@spt/models/eft/common/tables/IBotBase";
import { GenerationData, Inventory, ModsChances } from "@spt/models/eft/common/tables/IBotType";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IInventory as PmcInventory } from "@spt/models/eft/common/tables/IBotBase";
import { IGenerationData, IInventory, IModsChances } from "@spt/models/eft/common/tables/IBotType";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { GenerateWeaponResult } from "@spt/models/spt/bots/GenerateWeaponResult";
import { IGenerateWeaponResult } from "@spt/models/spt/bots/IGenerateWeaponResult";
import { IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { IPmcConfig } from "@spt/models/spt/config/IPmcConfig";
import { IRepairConfig } from "@spt/models/spt/config/IRepairConfig";
@ -52,18 +52,18 @@ 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, botLevel: number): GenerateWeaponResult;
generateRandomWeapon(sessionId: string, equipmentSlot: string, botTemplateInventory: IInventory, weaponParentId: string, modChances: IModsChances, botRole: string, isPmc: boolean, botLevel: number): IGenerateWeaponResult;
/**
* Get a random weighted weapon from a bots pool of weapons
* @param equipmentSlot Primary/secondary/holster
* @param botTemplateInventory e.g. assault.json
* @returns weapon tpl
*/
pickWeightedWeaponTplFromPool(equipmentSlot: string, botTemplateInventory: Inventory): string;
pickWeightedWeaponTplFromPool(equipmentSlot: string, botTemplateInventory: IInventory): string;
/**
* Generated a weapon based on the supplied weapon tpl
* @param weaponTpl weapon tpl to generate (use pickWeightedWeaponTplFromPool())
* @param equipmentSlot slot to fit into, primary/secondary/holster
* @param weaponTpl Weapon tpl to generate (use pickWeightedWeaponTplFromPool())
* @param slotName Slot to fit into, primary/secondary/holster
* @param botTemplateInventory e.g. assault.json
* @param weaponParentId ParentId of the weapon being generated
* @param modChances Dictionary of item types and % chance weapon will have that mod
@ -71,7 +71,7 @@ export declare class BotWeaponGenerator {
* @param isPmc Is weapon being generated for a pmc
* @returns GenerateWeaponResult object
*/
generateWeaponByTpl(sessionId: string, weaponTpl: string, equipmentSlot: string, botTemplateInventory: Inventory, weaponParentId: string, modChances: ModsChances, botRole: string, isPmc: boolean, botLevel: number): GenerateWeaponResult;
generateWeaponByTpl(sessionId: string, weaponTpl: string, slotName: string, botTemplateInventory: IInventory, weaponParentId: string, modChances: IModsChances, botRole: string, isPmc: boolean, botLevel: number): IGenerateWeaponResult;
/**
* Insert a cartridge(s) into a weapon
* Handles all chambers - patron_in_weapon, patron_in_weapon_000 etc
@ -79,7 +79,7 @@ export declare class BotWeaponGenerator {
* @param ammoTpl Cartridge to add to weapon
* @param chamberSlotIds name of slots to create or add ammo to
*/
protected addCartridgeToChamber(weaponWithModsArray: Item[], ammoTpl: string, chamberSlotIds: string[]): void;
protected addCartridgeToChamber(weaponWithModsArray: IItem[], ammoTpl: string, chamberSlotIds: string[]): void;
/**
* Create array with weapon base as only element and
* add additional properties based on weapon type
@ -90,7 +90,7 @@ export declare class BotWeaponGenerator {
* @param botRole for durability values
* @returns Base weapon item in array
*/
protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): Item[];
protected constructWeaponBaseArray(weaponTpl: string, weaponParentId: string, equipmentSlot: string, weaponItemTemplate: ITemplateItem, botRole: string): IItem[];
/**
* Get the mods necessary to kit out a weapon to its preset level
* @param weaponTpl weapon to find preset for
@ -98,14 +98,14 @@ export declare class BotWeaponGenerator {
* @param weaponParentId Value used for the parentid
* @returns array of weapon mods
*/
protected getPresetWeaponMods(weaponTpl: string, equipmentSlot: string, weaponParentId: string, itemTemplate: ITemplateItem, botRole: string): Item[];
protected getPresetWeaponMods(weaponTpl: string, equipmentSlot: string, weaponParentId: string, itemTemplate: ITemplateItem, botRole: string): IItem[];
/**
* Checks if all required slots are occupied on a weapon and all it's mods
* @param weaponItemArray Weapon + mods
* @param botRole role of bot weapon is for
* @returns true if valid
*/
protected isWeaponValid(weaponItemArray: Item[], botRole: string): boolean;
protected isWeaponValid(weaponItemArray: IItem[], botRole: string): boolean;
/**
* Generates extra magazines or bullets (if magazine is internal) and adds them to TacticalVest and Pockets.
* Additionally, adds extra bullets to SecuredContainer
@ -114,14 +114,14 @@ export declare class BotWeaponGenerator {
* @param inventory Inventory to add magazines to
* @param botRole The bot type we're getting generating extra mags for
*/
addExtraMagazinesToInventory(generatedWeaponResult: GenerateWeaponResult, magWeights: GenerationData, inventory: PmcInventory, botRole: string): void;
addExtraMagazinesToInventory(generatedWeaponResult: IGenerateWeaponResult, magWeights: IGenerationData, inventory: PmcInventory, botRole: string): void;
/**
* Add Grendaes for UBGL to bots vest and secure container
* @param weaponMods Weapon array with mods
* @param generatedWeaponResult result of weapon generation
* @param inventory bot inventory to add grenades to
*/
protected addUbglGrenadesToBotInventory(weaponMods: Item[], generatedWeaponResult: GenerateWeaponResult, inventory: PmcInventory): void;
protected addUbglGrenadesToBotInventory(weaponMods: IItem[], generatedWeaponResult: IGenerateWeaponResult, inventory: PmcInventory): void;
/**
* Add ammo to the secure container
* @param stackCount How many stacks of ammo to add
@ -137,14 +137,20 @@ export declare class BotWeaponGenerator {
* @param botRole the bot type we are getting the magazine for
* @returns magazine tpl string
*/
protected getMagazineTplFromWeaponTemplate(weaponMods: Item[], weaponTemplate: ITemplateItem, botRole: string): string;
protected getMagazineTplFromWeaponTemplate(weaponMods: IItem[], weaponTemplate: ITemplateItem, botRole: string): string;
/**
* Finds and return a compatible ammo tpl based on the bots ammo weightings (x.json/inventory/equipment/ammo)
* @param ammo a list of ammo tpls the weapon can use
* @param weaponTemplate the weapon we want to pick ammo for
* @returns an ammo tpl that works with the desired gun
* @param cartridgePool Dict of all cartridges keyed by type e.g. Caliber556x45NATO
* @param weaponTemplate Weapon details from db we want to pick ammo for
* @returns Ammo tpl that works with the desired gun
*/
protected getWeightedCompatibleAmmo(ammo: Record<string, Record<string, number>>, weaponTemplate: ITemplateItem): string;
protected getWeightedCompatibleAmmo(cartridgePool: Record<string, Record<string, number>>, weaponTemplate: ITemplateItem): string;
/**
* Get the cartridge ids from a weapon template that work with the weapon
* @param weaponTemplate Weapon db template to get cartridges for
* @returns Array of cartridge tpls
*/
protected getCompatibleCartridgesFromWeaponTemplate(weaponTemplate: ITemplateItem): string[];
/**
* Get a weapons compatible cartridge caliber
* @param weaponTemplate Weapon to look up caliber of
@ -157,14 +163,14 @@ export declare class BotWeaponGenerator {
* @param magazine Magazine item
* @param cartridgeTpl Cartridge to insert into magazine
*/
protected fillExistingMagazines(weaponMods: Item[], magazine: Item, cartridgeTpl: string): void;
protected fillExistingMagazines(weaponMods: IItem[], magazine: IItem, cartridgeTpl: string): void;
/**
* Add desired ammo tpl as item to weaponmods array, placed as child to UBGL
* @param weaponMods Weapon with children
* @param ubglMod UBGL item
* @param ubglAmmoTpl Grenade ammo tpl
*/
protected fillUbgl(weaponMods: Item[], ubglMod: Item, ubglAmmoTpl: string): void;
protected fillUbgl(weaponMods: IItem[], ubglMod: IItem, ubglAmmoTpl: string): void;
/**
* Add cartridge item to weapon Item array, if it already exists, update
* @param weaponWithMods Weapon items array to amend
@ -173,12 +179,12 @@ export declare class BotWeaponGenerator {
* @param newStackSize how many cartridges should go into the magazine
* @param magazineTemplate magazines db template
*/
protected addOrUpdateMagazinesChildWithAmmo(weaponWithMods: Item[], magazine: Item, chosenAmmoTpl: string, magazineTemplate: ITemplateItem): void;
protected addOrUpdateMagazinesChildWithAmmo(weaponWithMods: IItem[], magazine: IItem, chosenAmmoTpl: string, magazineTemplate: ITemplateItem): void;
/**
* Fill each Camora with a bullet
* @param weaponMods Weapon mods to find and update camora mod(s) from
* @param magazineId magazine id to find and add to
* @param ammoTpl ammo template id to hydate with
*/
protected fillCamorasWithAmmo(weaponMods: Item[], magazineId: string, ammoTpl: string): void;
protected fillCamorasWithAmmo(weaponMods: IItem[], magazineId: string, ammoTpl: string): void;
}

View File

@ -1,7 +1,7 @@
import { HandbookHelper } from "@spt/helpers/HandbookHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { ITraderConfig } from "@spt/models/spt/config/ITraderConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -47,7 +47,7 @@ export declare class FenceBaseAssortGenerator {
* @param armor Armor item array to add mods into
* @param itemDbDetails Armor items db template
*/
protected addChildrenToArmorModSlots(armor: Item[], itemDbDetails: ITemplateItem): void;
protected addChildrenToArmorModSlots(armor: IItem[], itemDbDetails: ITemplateItem): void;
/**
* Check if item is valid for being added to fence assorts
* @param item Item to check

View File

@ -3,8 +3,8 @@ import { ItemHelper } from "@spt/helpers/ItemHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
import { IContainerMinMax, IStaticAmmoDetails, IStaticContainer, IStaticContainerData, IStaticForcedProps, IStaticLootDetails } from "@spt/models/eft/common/ILocation";
import { ILocationBase } from "@spt/models/eft/common/ILocationBase";
import { ILooseLoot, Spawnpoint, SpawnpointTemplate, SpawnpointsForced } from "@spt/models/eft/common/ILooseLoot";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { ILooseLoot, ISpawnpointTemplate, ISpawnpointsForced } from "@spt/models/eft/common/ILooseLoot";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ILocationConfig } from "@spt/models/spt/config/ILocationConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -17,7 +17,7 @@ import { ObjectId } from "@spt/utils/ObjectId";
import { ProbabilityObjectArray, RandomUtil } from "@spt/utils/RandomUtil";
import { ICloner } from "@spt/utils/cloners/ICloner";
export interface IContainerItem {
items: Item[];
items: IItem[];
width: number;
height: number;
}
@ -27,7 +27,7 @@ export interface IContainerGroupCount {
/** How many containers the map should spawn with this group id */
chosenCount: number;
}
export declare class LocationGenerator {
export declare class LocationLootGenerator {
protected logger: ILogger;
protected databaseService: DatabaseService;
protected objectId: ObjectId;
@ -49,7 +49,7 @@ export declare class LocationGenerator {
* @param staticAmmoDist Static ammo distribution
* @returns Array of container objects
*/
generateStaticContainers(locationBase: ILocationBase, staticAmmoDist: Record<string, IStaticAmmoDetails[]>): SpawnpointTemplate[];
generateStaticContainers(locationBase: ILocationBase, staticAmmoDist: Record<string, IStaticAmmoDetails[]>): ISpawnpointTemplate[];
/**
* Get containers with a non-100% chance to spawn OR are NOT on the container type randomistion blacklist
* @param staticContainers
@ -117,14 +117,14 @@ export declare class LocationGenerator {
* @param locationName Location to generate loot for
* @returns Array of spawn points with loot in them
*/
generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record<string, IStaticAmmoDetails[]>, locationName: string): SpawnpointTemplate[];
generateDynamicLoot(dynamicLootDist: ILooseLoot, staticAmmoDist: Record<string, IStaticAmmoDetails[]>, locationName: string): ISpawnpointTemplate[];
/**
* Add forced spawn point loot into loot parameter array
* @param lootLocationTemplates array to add forced loot spawn locations to
* @param forcedSpawnPoints forced Forced loot locations that must be added
* @param locationName Name of map currently having force loot created for
*/
protected addForcedLoot(lootLocationTemplates: SpawnpointTemplate[], forcedSpawnPoints: SpawnpointsForced[], locationName: string): void;
protected addForcedLoot(lootLocationTemplates: ISpawnpointTemplate[], forcedSpawnPoints: ISpawnpointsForced[], locationName: string, staticAmmoDist: Record<string, IStaticAmmoDetails[]>): void;
/**
* Create array of item (with child items) and return
* @param chosenComposedKey Key we want to look up items for
@ -132,19 +132,13 @@ export declare class LocationGenerator {
* @param staticAmmoDist ammo distributions
* @returns IContainerItem
*/
protected createDynamicLootItem(chosenComposedKey: string, spawnPoint: Spawnpoint, staticAmmoDist: Record<string, IStaticAmmoDetails[]>): IContainerItem;
/**
* Replace the _id value for base item + all children items parentid value
* @param itemWithChildren Item with mods to update
* @param newId new id to add on chidren of base item
*/
protected reparentItemAndChildren(itemWithChildren: Item[], newId?: string): void;
protected createDynamicLootItem(chosenComposedKey: string, items: IItem[], staticAmmoDist: Record<string, IStaticAmmoDetails[]>): IContainerItem;
/**
* Find an item in array by its _tpl, handle differently if chosenTpl is a weapon
* @param items Items array to search
* @param chosenTpl Tpl we want to get item with
* @returns Item object
*/
protected getItemInArray(items: Item[], chosenTpl: string): Item | undefined;
protected getItemInArray(items: IItem[], chosenTpl: string): IItem | undefined;
protected createStaticLootItem(chosenTpl: string, staticAmmoDist: Record<string, IStaticAmmoDetails[]>, parentId?: string): IContainerItem;
}

View File

@ -2,12 +2,12 @@ import { InventoryHelper } from "@spt/helpers/InventoryHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { MinMax } from "@spt/models/common/MinMax";
import { IPreset } from "@spt/models/eft/common/IGlobals";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { ISealedAirdropContainerSettings, RewardDetails } from "@spt/models/spt/config/IInventoryConfig";
import { LootItem } from "@spt/models/spt/services/LootItem";
import { LootRequest } from "@spt/models/spt/services/LootRequest";
import { IRewardDetails, ISealedAirdropContainerSettings } from "@spt/models/spt/config/IInventoryConfig";
import { ILootRequest } from "@spt/models/spt/services/ILootRequest";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { DatabaseService } from "@spt/services/DatabaseService";
import { ItemFilterService } from "@spt/services/ItemFilterService";
@ -37,14 +37,33 @@ export declare class LootGenerator {
* @param options parameters to adjust how loot is generated
* @returns An array of loot items
*/
createRandomLoot(options: LootRequest): LootItem[];
createRandomLoot(options: ILootRequest): IItem[];
/**
* Generate An array of items
* TODO - handle weapon presets/ammo packs
* @param forcedLootDict Dictionary of item tpls with minmax values
* @returns Array of IItem
*/
createForcedLoot(forcedLootDict: Record<string, MinMax>): IItem[];
/**
* Get pool of items from item db that fit passed in param criteria
* @param itemTplBlacklist Prevent these items
* @param itemTypeWhitelist Only allow these items
* @param useRewardItemBlacklist Should item.json reward item config be used
* @param allowBossItems Should boss items be allowed in result
* @returns results of filtering + blacklist used
*/
protected getItemRewardPool(itemTplBlacklist: string[], itemTypeWhitelist: string[], useRewardItemBlacklist: boolean, allowBossItems: boolean): {
itemPool: [string, ITemplateItem][];
blacklist: Set<string>;
};
/**
* Filter armor items by their front plates protection level - top if its a helmet
* @param armor Armor preset to check
* @param options Loot request options - armor level etc
* @returns True if item has desired armor level
*/
protected isArmorOfDesiredProtectionLevel(armor: IPreset, options: LootRequest): boolean;
protected isArmorOfDesiredProtectionLevel(armor: IPreset, options: ILootRequest): boolean;
/**
* Construct item limit record to hold max and current item count for each item type
* @param limits limits as defined in config
@ -62,14 +81,14 @@ export declare class LootGenerator {
protected findAndAddRandomItemToLoot(items: [string, ITemplateItem][], itemTypeCounts: Record<string, {
current: number;
max: number;
}>, options: LootRequest, result: LootItem[]): boolean;
}>, options: ILootRequest, result: IItem[]): boolean;
/**
* Get a randomised stack count for an item between its StackMinRandom and StackMaxSize values
* @param item item to get stack count of
* @param options loot options
* @returns stack count
*/
protected getRandomisedStackCount(item: ITemplateItem, options: LootRequest): number;
protected getRandomisedStackCount(item: ITemplateItem, options: ILootRequest): number;
/**
* Find a random item in items.json and add to result array
* @param presetPool Presets to choose from
@ -81,20 +100,20 @@ export declare class LootGenerator {
protected findAndAddRandomPresetToLoot(presetPool: IPreset[], itemTypeCounts: Record<string, {
current: number;
max: number;
}>, itemBlacklist: string[], result: LootItem[]): boolean;
}>, itemBlacklist: string[], result: IItem[]): boolean;
/**
* Sealed weapon containers have a weapon + associated mods inside them + assortment of other things (food/meds)
* @param containerSettings sealed weapon container settings
* @returns Array of item with children arrays
*/
getSealedWeaponCaseLoot(containerSettings: ISealedAirdropContainerSettings): Item[][];
getSealedWeaponCaseLoot(containerSettings: ISealedAirdropContainerSettings): IItem[][];
/**
* Get non-weapon mod rewards for a sealed container
* @param containerSettings Sealed weapon container settings
* @param weaponDetailsDb Details for the weapon to reward player
* @returns Array of item with children arrays
*/
protected getSealedContainerNonWeaponModRewards(containerSettings: ISealedAirdropContainerSettings, weaponDetailsDb: ITemplateItem): Item[][];
protected getSealedContainerNonWeaponModRewards(containerSettings: ISealedAirdropContainerSettings, weaponDetailsDb: ITemplateItem): IItem[][];
/**
* Iterate over the container weaponModRewardLimits settings and create an array of weapon mods to reward player
* @param containerSettings Sealed weapon container settings
@ -102,12 +121,18 @@ export declare class LootGenerator {
* @param chosenWeaponPreset The weapon preset given to player as reward
* @returns Array of item with children arrays
*/
protected getSealedContainerWeaponModRewards(containerSettings: ISealedAirdropContainerSettings, linkedItemsToWeapon: ITemplateItem[], chosenWeaponPreset: IPreset): Item[][];
protected getSealedContainerWeaponModRewards(containerSettings: ISealedAirdropContainerSettings, linkedItemsToWeapon: ITemplateItem[], chosenWeaponPreset: IPreset): IItem[][];
/**
* Handle event-related loot containers - currently just the halloween jack-o-lanterns that give food rewards
* @param rewardContainerDetails
* @returns Array of item with children arrays
*/
getRandomLootContainerLoot(rewardContainerDetails: RewardDetails): Item[][];
getRandomLootContainerLoot(rewardContainerDetails: IRewardDetails): IItem[][];
/**
* Pick a reward item based on the reward details data
* @param rewardContainerDetails
* @returns Single tpl
*/
protected pickRewardItem(rewardContainerDetails: IRewardDetails): string;
}
export {};

View File

@ -4,9 +4,9 @@ import { BotHelper } from "@spt/helpers/BotHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IBotBase, Skills, Stats } from "@spt/models/eft/common/tables/IBotBase";
import { IBotBase, ISkills, IStats } from "@spt/models/eft/common/tables/IBotBase";
import { IBotType } from "@spt/models/eft/common/tables/IBotType";
import { IPlayerScavConfig, KarmaLevel } from "@spt/models/spt/config/IPlayerScavConfig";
import { IKarmaLevel, IPlayerScavConfig } from "@spt/models/spt/config/IPlayerScavConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { SaveServer } from "@spt/servers/SaveServer";
@ -67,10 +67,10 @@ export declare class PlayerScavGenerator {
* @param karmaSettings Values to modify the bot template with
* @param baseBotNode bot template to modify according to karama level settings
*/
protected adjustBotTemplateWithKarmaSpecificSettings(karmaSettings: KarmaLevel, baseBotNode: IBotType): void;
protected getScavSkills(scavProfile: IPmcData): Skills;
protected getDefaultScavSkills(): Skills;
protected getScavStats(scavProfile: IPmcData): Stats;
protected adjustBotTemplateWithKarmaSpecificSettings(karmaSettings: IKarmaLevel, baseBotNode: IBotType): void;
protected getScavSkills(scavProfile: IPmcData): ISkills;
protected getDefaultScavSkills(): ISkills;
protected getScavStats(scavProfile: IPmcData): IStats;
protected getScavLevel(scavProfile: IPmcData): number;
protected getScavExperience(scavProfile: IPmcData): number;
/**

View File

@ -1,7 +1,7 @@
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
import { IPreset } from "@spt/models/eft/common/IGlobals";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { DatabaseServer } from "@spt/servers/DatabaseServer";
@ -14,7 +14,7 @@ export declare class RagfairAssortGenerator {
protected databaseServer: DatabaseServer;
protected seasonalEventService: SeasonalEventService;
protected configServer: ConfigServer;
protected generatedAssortItems: Item[][];
protected generatedAssortItems: IItem[][];
protected ragfairConfig: IRagfairConfig;
protected ragfairItemInvalidBaseTypes: string[];
constructor(hashUtil: HashUtil, itemHelper: ItemHelper, presetHelper: PresetHelper, databaseServer: DatabaseServer, seasonalEventService: SeasonalEventService, configServer: ConfigServer);
@ -23,7 +23,7 @@ export declare class RagfairAssortGenerator {
* Each sub array contains item + children (if any)
* @returns array of arrays
*/
getAssortItems(): Item[][];
getAssortItems(): IItem[][];
/**
* Check internal generatedAssortItems array has objects
* @returns true if array has objects
@ -33,7 +33,7 @@ export declare class RagfairAssortGenerator {
* Generate an array of arrays (item + children) the flea can sell
* @returns array of arrays (item + children)
*/
protected generateRagfairAssortItems(): Item[][];
protected generateRagfairAssortItems(): IItem[][];
/**
* Get presets from globals to add to flea
* ragfairConfig.dynamic.showDefaultPresetsOnly decides if its all presets or just defaults
@ -46,5 +46,5 @@ export declare class RagfairAssortGenerator {
* @param id id to add to item
* @returns Hydrated Item object
*/
protected createRagfairAssortRootItem(tplId: string, id?: string): Item;
protected createRagfairAssortRootItem(tplId: string, id?: string): IItem;
}

View File

@ -6,11 +6,13 @@ import { PaymentHelper } from "@spt/helpers/PaymentHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { RagfairServerHelper } from "@spt/helpers/RagfairServerHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { IBarterScheme } from "@spt/models/eft/common/tables/ITrader";
import { IRagfairOffer, IRagfairOfferUser, OfferRequirement } from "@spt/models/eft/ragfair/IRagfairOffer";
import { Dynamic, IArmorPlateBlacklistSettings, IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
import { IOfferRequirement, IRagfairOffer, IRagfairOfferUser } from "@spt/models/eft/ragfair/IRagfairOffer";
import { IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { IArmorPlateBlacklistSettings, IBarterDetails, IDynamic, IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
import { ITplWithFleaPrice } from "@spt/models/spt/ragfair/ITplWithFleaPrice";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { SaveServer } from "@spt/servers/SaveServer";
@ -45,6 +47,7 @@ export declare class RagfairOfferGenerator {
protected configServer: ConfigServer;
protected cloner: ICloner;
protected ragfairConfig: IRagfairConfig;
protected botConfig: IBotConfig;
protected allowedFleaPriceItemsForBarter: {
tpl: string;
price: number;
@ -62,7 +65,7 @@ export declare class RagfairOfferGenerator {
* @param sellInOnePiece Flags sellInOnePiece to be true
* @returns Created flea offer
*/
createAndAddFleaOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, sellInOnePiece?: boolean): IRagfairOffer;
createAndAddFleaOffer(userID: string, time: number, items: IItem[], barterScheme: IBarterScheme[], loyalLevel: number, sellInOnePiece?: boolean): IRagfairOffer;
/**
* Create an offer object ready to send to ragfairOfferService.addOffer()
* @param userID Owner of the offer
@ -73,7 +76,7 @@ export declare class RagfairOfferGenerator {
* @param isPackOffer Is offer being created flaged as a pack
* @returns IRagfairOffer
*/
protected createOffer(userID: string, time: number, items: Item[], barterScheme: IBarterScheme[], loyalLevel: number, isPackOffer?: boolean): IRagfairOffer;
protected createOffer(userID: string, time: number, items: IItem[], barterScheme: IBarterScheme[], loyalLevel: number, isPackOffer?: boolean): IRagfairOffer;
/**
* Create the user object stored inside each flea offer object
* @param userID user creating the offer
@ -86,7 +89,7 @@ export declare class RagfairOfferGenerator {
* @param offerRequirements barter requirements for offer
* @returns rouble cost of offer
*/
protected convertOfferRequirementsIntoRoubles(offerRequirements: OfferRequirement[]): number;
protected convertOfferRequirementsIntoRoubles(offerRequirements: IOfferRequirement[]): number;
/**
* Get avatar url from trader table in db
* @param isTrader Is user we're getting avatar for a trader
@ -130,28 +133,29 @@ export declare class RagfairOfferGenerator {
* Create multiple offers for items by using a unique list of items we've generated previously
* @param expiredOffers optional, expired offers to regenerate
*/
generateDynamicOffers(expiredOffers?: Item[][]): Promise<void>;
generateDynamicOffers(expiredOffers?: IItem[][]): Promise<void>;
/**
* @param assortItemWithChildren Item with its children to process into offers
* @param isExpiredOffer is an expired offer
* @param config Ragfair dynamic config
*/
protected createOffersFromAssort(assortItemWithChildren: Item[], isExpiredOffer: boolean, config: Dynamic): Promise<void>;
protected createOffersFromAssort(assortItemWithChildren: IItem[], isExpiredOffer: boolean, config: IDynamic): Promise<void>;
/**
* iterate over an items chidren and look for plates above desired level and remove them
* @param presetWithChildren preset to check for plates
* @param plateSettings Settings
* @returns True if plate removed
*/
protected removeBannedPlatesFromPreset(presetWithChildren: Item[], plateSettings: IArmorPlateBlacklistSettings): boolean;
protected removeBannedPlatesFromPreset(presetWithChildren: IItem[], plateSettings: IArmorPlateBlacklistSettings): boolean;
/**
* Create one flea offer for a specific item
* @param sellerId Id of seller
* @param itemWithChildren Item to create offer for
* @param isPreset Is item a weapon preset
* @param itemDetails raw db item details
* @param itemToSellDetails Raw db item details
* @returns Item array
*/
protected createSingleOfferForItem(itemWithChildren: Item[], isPreset: boolean, itemDetails: [boolean, ITemplateItem]): Promise<void>;
protected createSingleOfferForItem(sellerId: string, itemWithChildren: IItem[], isPreset: boolean, itemToSellDetails: ITemplateItem): Promise<void>;
/**
* Generate trader offers on flea using the traders assort data
* @param traderID Trader to generate offers for
@ -164,7 +168,7 @@ export declare class RagfairOfferGenerator {
* @param itemWithMods Item and mods, get condition of first item (only first array item is modified)
* @param itemDetails db details of first item
*/
protected randomiseOfferItemUpdProperties(userID: string, itemWithMods: Item[], itemDetails: ITemplateItem): void;
protected randomiseOfferItemUpdProperties(userID: string, itemWithMods: IItem[], itemDetails: ITemplateItem): void;
/**
* Get the relevant condition id if item tpl matches in ragfair.json/condition
* @param tpl Item to look for matching condition object
@ -177,7 +181,7 @@ export declare class RagfairOfferGenerator {
* @param itemWithMods Item to adjust condition details of
* @param itemDetails db item details of first item in array
*/
protected randomiseItemCondition(conditionSettingsId: string, itemWithMods: Item[], itemDetails: ITemplateItem): void;
protected randomiseItemCondition(conditionSettingsId: string, itemWithMods: IItem[], itemDetails: ITemplateItem): void;
/**
* Adjust an items durability/maxDurability value
* @param item item (weapon/armor) to Adjust
@ -185,35 +189,33 @@ export declare class RagfairOfferGenerator {
* @param maxMultiplier Value to multiply max durability by
* @param currentMultiplier Value to multiply current durability by
*/
protected randomiseWeaponDurability(item: Item, itemDbDetails: ITemplateItem, maxMultiplier: number, currentMultiplier: number): void;
protected randomiseWeaponDurability(item: IItem, itemDbDetails: ITemplateItem, maxMultiplier: number, currentMultiplier: number): void;
/**
* Randomise the durabiltiy values for an armors plates and soft inserts
* @param armorWithMods Armor item with its child mods
* @param currentMultiplier Chosen multipler to use for current durability value
* @param maxMultiplier Chosen multipler to use for max durability value
*/
protected randomiseArmorDurabilityValues(armorWithMods: Item[], currentMultiplier: number, maxMultiplier: number): void;
protected randomiseArmorDurabilityValues(armorWithMods: IItem[], currentMultiplier: number, maxMultiplier: number): void;
/**
* Add missing conditions to an item if needed
* Durabiltiy for repairable items
* HpResource for medical items
* @param item item to add conditions to
*/
protected addMissingConditions(item: Item): void;
protected addMissingConditions(item: IItem): void;
/**
* Create a barter-based barter scheme, if not possible, fall back to making barter scheme currency based
* @param offerItems Items for sale in offer
* @param barterConfig Barter config from ragfairConfig.dynamic.barter
* @returns Barter scheme
*/
protected createBarterBarterScheme(offerItems: Item[]): IBarterScheme[];
protected createBarterBarterScheme(offerItems: IItem[], barterConfig: IBarterDetails): IBarterScheme[];
/**
* Get an array of flea prices + item tpl, cached in generator class inside `allowedFleaPriceItemsForBarter`
* @returns array with tpl/price values
*/
protected getFleaPricesAsArray(): {
tpl: string;
price: number;
}[];
protected getFleaPricesAsArray(): ITplWithFleaPrice[];
/**
* Create a random currency-based barter scheme for an array of items
* @param offerWithChildren Items on offer
@ -221,5 +223,5 @@ export declare class RagfairOfferGenerator {
* @param multipler What to multiply the resulting price by
* @returns Barter scheme for offer
*/
protected createCurrencyBarterScheme(offerWithChildren: Item[], isPackOffer: boolean, multipler?: number): IBarterScheme[];
protected createCurrencyBarterScheme(offerWithChildren: IItem[], isPackOffer: boolean, multipler?: number): IBarterScheme[];
}

View File

@ -1,8 +1,8 @@
import { RepeatableQuestRewardGenerator } from "@spt/generators/RepeatableQuestRewardGenerator";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { RepeatableQuestHelper } from "@spt/helpers/RepeatableQuestHelper";
import { Exit } from "@spt/models/eft/common/ILocationBase";
import { TraderInfo } from "@spt/models/eft/common/tables/IBotBase";
import { IExit } from "@spt/models/eft/common/ILocationBase";
import { ITraderInfo } from "@spt/models/eft/common/tables/IBotBase";
import { IQuestCondition, IQuestConditionCounterCondition } from "@spt/models/eft/common/tables/IQuest";
import { IRepeatableQuest } from "@spt/models/eft/common/tables/IRepeatableQuests";
import { IBossInfo, IEliminationConfig, IQuestConfig, IRepeatableQuestConfig } from "@spt/models/spt/config/IQuestConfig";
@ -39,7 +39,7 @@ export declare class RepeatableQuestGenerator {
* @param repeatableConfig Repeatable quest config
* @returns IRepeatableQuest
*/
generateRepeatableQuest(pmcLevel: number, pmcTraderInfo: Record<string, TraderInfo>, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest;
generateRepeatableQuest(pmcLevel: number, pmcTraderInfo: Record<string, ITraderInfo>, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest;
/**
* Generate a randomised Elimination quest
* @param pmcLevel Player's level for requested items and reward generation
@ -109,7 +109,7 @@ export declare class RepeatableQuestGenerator {
* @param playerSide Scav/Pmc
* @returns Array of Exit objects
*/
protected getLocationExitsForSide(locationKey: string, playerSide: string): Exit[];
protected getLocationExitsForSide(locationKey: string, playerSide: string): IExit[];
protected generatePickupQuest(pmcLevel: number, traderId: string, questTypePool: IQuestTypePool, repeatableConfig: IRepeatableQuestConfig): IRepeatableQuest;
/**
* Convert a location into an quest code can read (e.g. factory4_day into 55f2d3fd4bdc2d5f408b4567)
@ -124,7 +124,7 @@ export declare class RepeatableQuestGenerator {
* @param {string} exit The exit name to generate the condition for
* @returns {object} Exit condition
*/
protected generateExplorationExitCondition(exit: Exit): IQuestConditionCounterCondition;
protected generateExplorationExitCondition(exit: IExit): IQuestConditionCounterCondition;
/**
* Generates the base object of quest type format given as templates in assets/database/templates/repeatableQuests.json
* The templates include Elimination, Completion and Extraction quest types

View File

@ -1,7 +1,7 @@
import { HandbookHelper } from "@spt/helpers/HandbookHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IQuestReward, IQuestRewards } from "@spt/models/eft/common/tables/IQuest";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { IBaseQuestConfig, IQuestConfig, IRepeatableQuestConfig, IRewardScaling } from "@spt/models/spt/config/IQuestConfig";
@ -33,26 +33,30 @@ export declare class RepeatableQuestRewardGenerator {
protected questConfig: IQuestConfig;
constructor(logger: ILogger, randomUtil: RandomUtil, mathUtil: MathUtil, databaseService: DatabaseService, itemHelper: ItemHelper, presetHelper: PresetHelper, handbookHelper: HandbookHelper, localisationService: LocalisationService, objectId: ObjectId, itemFilterService: ItemFilterService, seasonalEventService: SeasonalEventService, configServer: ConfigServer, cloner: ICloner);
/**
* Generate the reward for a mission. A reward can consist of
* Generate the reward for a mission. A reward can consist of:
* - Experience
* - Money
* - GP coins
* - Weapon preset
* - Items
* - Trader Reputation
* - Skill level experience
*
* The reward is dependent on the player level as given by the wiki. The exact mapping of pmcLevel to
* experience / money / items / trader reputation can be defined in QuestConfig.js
*
* There's also a random variation of the reward the spread of which can be also defined in the config.
* There's also a random variation of the reward the spread of which can be also defined in the config
*
* Additionally, a scaling factor w.r.t. quest difficulty going from 0.2...1 can be used
*
* @param {integer} pmcLevel player's level
* @param {number} difficulty a reward scaling factor from 0.2 to 1
* @param {string} traderId the trader for reputation gain (and possible in the future filtering of reward item type based on trader)
* @param {object} repeatableConfig The configuration for the repeatable kind (daily, weekly) as configured in QuestConfig for the requested quest
* @returns {object} object of "Reward"-type that can be given for a repeatable mission
* @param pmcLevel Level of player reward is being generated for
* @param difficulty Reward scaling factor from 0.2 to 1
* @param traderId Trader reward will be given by
* @param repeatableConfig Config for quest type (daily, weekly)
* @param questConfig
* @param rewardTplBlacklist OPTIONAL: list of tpls to NOT use when picking a reward
* @returns IQuestRewards
*/
generateReward(pmcLevel: number, difficulty: number, traderId: string, repeatableConfig: IRepeatableQuestConfig, questConfig: IBaseQuestConfig): IQuestRewards;
generateReward(pmcLevel: number, difficulty: number, traderId: string, repeatableConfig: IRepeatableQuestConfig, questConfig: IBaseQuestConfig, rewardTplBlacklist?: string[]): IQuestRewards;
protected getQuestRewardValues(rewardScaling: IRewardScaling, difficulty: number, pmcLevel: number): IQuestRewardValues;
/**
* Get an array of items + stack size to give to player as reward that fit inside of a rouble budget
@ -133,7 +137,7 @@ export declare class RepeatableQuestRewardGenerator {
* @param preset Optional array of preset items
* @returns {object} Object of "Reward"-item-type
*/
protected generatePresetReward(tpl: string, count: number, index: number, preset?: Item[]): IQuestReward;
protected generatePresetReward(tpl: string, count: number, index: number, preset?: IItem[]): IQuestReward;
/**
* Picks rewardable items from items.json
* This means they must:

View File

@ -1,10 +1,10 @@
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { PresetHelper } from "@spt/helpers/PresetHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { IHideoutScavCase } from "@spt/models/eft/hideout/IHideoutScavCase";
import { IScavRecipe } from "@spt/models/eft/hideout/IHideoutProduction";
import { IScavCaseConfig } from "@spt/models/spt/config/IScavCaseConfig";
import { RewardCountAndPriceDetails, ScavCaseRewardCountsAndPrices } from "@spt/models/spt/hideout/ScavCaseRewardCountsAndPrices";
import { IRewardCountAndPriceDetails, IScavCaseRewardCountsAndPrices } from "@spt/models/spt/hideout/ScavCaseRewardCountsAndPrices";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { DatabaseService } from "@spt/services/DatabaseService";
@ -36,7 +36,7 @@ export declare class ScavCaseRewardGenerator {
* @param recipeId recipe of the scav case craft
* @returns Product array
*/
generate(recipeId: string): Item[][];
generate(recipeId: string): IItem[][];
/**
* Get all db items that are not blacklisted in scavcase config or global blacklist
* Store in class field
@ -48,7 +48,7 @@ export declare class ScavCaseRewardGenerator {
* @param itemFilters how the rewards should be filtered down (by item count)
* @returns
*/
protected pickRandomRewards(items: ITemplateItem[], itemFilters: RewardCountAndPriceDetails, rarity: string): ITemplateItem[];
protected pickRandomRewards(items: ITemplateItem[], itemFilters: IRewardCountAndPriceDetails, rarity: string): ITemplateItem[];
/**
* Choose if money should be a reward based on the moneyRewardChancePercent config chance in scavCaseConfig
* @returns true if reward should be money
@ -75,19 +75,19 @@ export declare class ScavCaseRewardGenerator {
* @param rewardItems items to convert
* @returns Product array
*/
protected randomiseContainerItemRewards(rewardItems: ITemplateItem[], rarity: string): Item[][];
protected randomiseContainerItemRewards(rewardItems: ITemplateItem[], rarity: string): IItem[][];
/**
* @param dbItems all items from the items.json
* @param itemFilters controls how the dbItems will be filtered and returned (handbook price)
* @returns filtered dbItems array
*/
protected getFilteredItemsByPrice(dbItems: ITemplateItem[], itemFilters: RewardCountAndPriceDetails): ITemplateItem[];
protected getFilteredItemsByPrice(dbItems: ITemplateItem[], itemFilters: IRewardCountAndPriceDetails): ITemplateItem[];
/**
* Gathers the reward min and max count params for each reward quality level from config and scavcase.json into a single object
* @param scavCaseDetails scavcase.json values
* @param scavCaseDetails production.json/scavRecipes object
* @returns ScavCaseRewardCountsAndPrices object
*/
protected getScavCaseRewardCountsAndPrices(scavCaseDetails: IHideoutScavCase): ScavCaseRewardCountsAndPrices;
protected getScavCaseRewardCountsAndPrices(scavCaseDetails: IScavRecipe): IScavCaseRewardCountsAndPrices;
/**
* Randomises the size of ammo and money stacks
* @param itemToCalculate ammo or money item

View File

@ -1,6 +1,8 @@
import { ApplicationContext } from "@spt/context/ApplicationContext";
import { WeatherHelper } from "@spt/helpers/WeatherHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { IWeather, IWeatherData } from "@spt/models/eft/weather/IWeatherData";
import { Season } from "@spt/models/enums/Season";
import { WindDirection } from "@spt/models/enums/WindDirection";
import { IWeatherConfig } from "@spt/models/spt/config/IWeatherConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -10,6 +12,7 @@ import { RandomUtil } from "@spt/utils/RandomUtil";
import { TimeUtil } from "@spt/utils/TimeUtil";
export declare class WeatherGenerator {
protected weightedRandomHelper: WeightedRandomHelper;
protected weatherHelper: WeatherHelper;
protected logger: ILogger;
protected randomUtil: RandomUtil;
protected timeUtil: TimeUtil;
@ -18,7 +21,7 @@ export declare class WeatherGenerator {
protected configServer: ConfigServer;
protected weatherConfig: IWeatherConfig;
private serverStartTimestampMS;
constructor(weightedRandomHelper: WeightedRandomHelper, logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, seasonalEventService: SeasonalEventService, applicationContext: ApplicationContext, configServer: ConfigServer);
constructor(weightedRandomHelper: WeightedRandomHelper, weatherHelper: WeatherHelper, logger: ILogger, randomUtil: RandomUtil, timeUtil: TimeUtil, seasonalEventService: SeasonalEventService, applicationContext: ApplicationContext, configServer: ConfigServer);
/**
* Get current + raid datetime and format into correct BSG format and return
* @param data Weather data
@ -32,12 +35,6 @@ export declare class WeatherGenerator {
* @returns formatted time
*/
protected getBsgFormattedInRaidTime(): string;
/**
* Get the current in-raid time
* @param currentDate (new Date())
* @returns Date object of current in-raid time
*/
getInRaidTime(): Date;
/**
* Get current time formatted to fit BSGs requirement
* @param date date to format into bsg style
@ -46,18 +43,28 @@ export declare class WeatherGenerator {
protected getBSGFormattedTime(date: Date): string;
/**
* Return randomised Weather data with help of config/weather.json
* @param currentSeason the currently active season
* @param timestamp OPTIONAL what timestamp to generate the weather data at, defaults to now when not supplied
* @returns Randomised weather data
*/
generateWeather(): IWeather;
generateWeather(currentSeason: Season, timestamp?: number): IWeather;
/**
* Choose a temprature for the raid based on time of day and current season
* @param currentSeason What season tarkov is currently in
* @param inRaidTimestamp What time is the raid running at
* @returns Timestamp
*/
protected getRaidTemperature(currentSeason: Season, inRaidTimestamp: number): number;
/**
* Set IWeather date/time/timestamp values to now
* @param weather Object to update
* @param timestamp OPTIONAL, define timestamp used
*/
protected setCurrentDateTime(weather: IWeather): void;
protected setCurrentDateTime(weather: IWeather, timestamp?: number): void;
protected getWeightedWindDirection(): WindDirection;
protected getWeightedClouds(): number;
protected getWeightedWindSpeed(): number;
protected getWeightedFog(): number;
protected getWeightedRain(): number;
protected getRandomFloat(node: string): number;
protected getRandomFloat(node: string, precision?: number): number;
}

View File

@ -1,5 +1,5 @@
import { Inventory } from "@spt/models/eft/common/tables/IBotBase";
import { GenerationData } from "@spt/models/eft/common/tables/IBotType";
import { IInventory } from "@spt/models/eft/common/tables/IBotBase";
import { IGenerationData } from "@spt/models/eft/common/tables/IBotType";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
export declare class InventoryMagGen {
private magCounts;
@ -7,10 +7,10 @@ export declare class InventoryMagGen {
private weaponTemplate;
private ammoTemplate;
private pmcInventory;
constructor(magCounts: GenerationData, magazineTemplate: ITemplateItem, weaponTemplate: ITemplateItem, ammoTemplate: ITemplateItem, pmcInventory: Inventory);
getMagCount(): GenerationData;
constructor(magCounts: IGenerationData, magazineTemplate: ITemplateItem, weaponTemplate: ITemplateItem, ammoTemplate: ITemplateItem, pmcInventory: IInventory);
getMagCount(): IGenerationData;
getMagazineTemplate(): ITemplateItem;
getWeaponTemplate(): ITemplateItem;
getAmmoTemplate(): ITemplateItem;
getPmcInventory(): Inventory;
getPmcInventory(): IInventory;
}

View File

@ -1,5 +1,6 @@
import { BotHelper } from "@spt/helpers/BotHelper";
import { Difficulty } from "@spt/models/eft/common/tables/IBotType";
import { IDifficultyCategories } from "@spt/models/eft/common/tables/IBotType";
import { IBots } from "@spt/models/spt/bots/IBots";
import { IPmcConfig } from "@spt/models/spt/config/IPmcConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -17,42 +18,21 @@ export declare class BotDifficultyHelper {
protected cloner: ICloner;
protected pmcConfig: IPmcConfig;
constructor(logger: ILogger, databaseService: DatabaseService, randomUtil: RandomUtil, localisationService: LocalisationService, botHelper: BotHelper, configServer: ConfigServer, cloner: ICloner);
/**
* Get a difficulty object modified to handle fighting other PMCs
* @param pmcType 'bear or 'usec'
* @param difficulty easy / normal / hard / impossible
* @param usecType pmcUSEC
* @param bearType pmcBEAR
* @returns Difficulty object
*/
getPmcDifficultySettings(pmcType: "bear" | "usec", difficulty: string, usecType: string, bearType: string): Difficulty;
/**
* Add bot types to ENEMY_BOT_TYPES array
* @param difficultySettings Bot settings to alter
* @param typesToAdd Bot types to add to enemy list
* @param typeBeingEdited Bot type to ignore and not add to enemy list
*/
protected addBotToEnemyList(difficultySettings: Difficulty, typesToAdd: string[], typeBeingEdited?: string): void;
/**
* Configure difficulty settings to be hostile to USEC and BEAR
* Look up value in bot.json/chanceSameSideIsHostilePercent
* @param difficultySettings pmc difficulty settings
*/
protected setDifficultyToHostileToBearAndUsec(difficultySettings: Difficulty): void;
/**
* Get difficulty settings for desired bot type, if not found use assault bot types
* @param type bot type to retrieve difficulty of
* @param difficulty difficulty to get settings for (easy/normal etc)
* @param botDb bots from database
* @returns Difficulty object
*/
getBotDifficultySettings(type: string, difficulty: string): Difficulty;
getBotDifficultySettings(type: string, difficulty: string, botDb: IBots): IDifficultyCategories;
/**
* 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;
protected getDifficultySettings(type: string, difficulty: string): IDifficultyCategories;
/**
* Translate chosen value from pre-raid difficulty dropdown into bot difficulty value
* @param dropDownDifficulty Dropdown difficulty value to convert

View File

@ -3,9 +3,9 @@ import { ContainerHelper } from "@spt/helpers/ContainerHelper";
import { DurabilityLimitsHelper } from "@spt/helpers/DurabilityLimitsHelper";
import { InventoryHelper } from "@spt/helpers/InventoryHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { Inventory } from "@spt/models/eft/common/tables/IBotBase";
import { Item, Repairable, Upd } from "@spt/models/eft/common/tables/IItem";
import { Grid, ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { IInventory } from "@spt/models/eft/common/tables/IBotBase";
import { IItem, IUpd, IUpdRepairable } from "@spt/models/eft/common/tables/IItem";
import { IGrid, ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { ItemAddedResult } from "@spt/models/enums/ItemAddedResult";
import { IChooseRandomCompatibleModResult } from "@spt/models/spt/bots/IChooseRandomCompatibleModResult";
import { EquipmentFilters, IBotConfig, IRandomisedResourceValues } from "@spt/models/spt/config/IBotConfig";
@ -37,7 +37,7 @@ export declare class BotGeneratorHelper {
* @returns Item Upd object with extra properties
*/
generateExtraPropertiesForItem(itemTemplate: ITemplateItem, botRole?: string): {
upd?: Upd;
upd?: IUpd;
};
/**
* Randomize the HpResource for bots e.g (245/400 resources)
@ -60,15 +60,14 @@ export declare class BotGeneratorHelper {
* @param botRole type of bot being generated for
* @returns Repairable object
*/
protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole?: string): Repairable;
protected generateWeaponRepairableProperties(itemTemplate: ITemplateItem, botRole?: string): IUpdRepairable;
/**
* Create a repairable object for an armor that containers durability + max durability properties
* @param itemTemplate weapon object being generated for
* @param botRole type of bot being generated for
* @returns Repairable object
*/
protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole?: string): Repairable;
isWeaponModIncompatibleWithCurrentMods(itemsEquipped: Item[], tplToCheck: string, modSlot: string): IChooseRandomCompatibleModResult;
protected generateArmorRepairableProperties(itemTemplate: ITemplateItem, botRole?: string): IUpdRepairable;
/**
* Can item be added to another item without conflict
* @param itemsEquipped Items to check compatibilities with
@ -76,7 +75,7 @@ export declare class BotGeneratorHelper {
* @param equipmentSlot Slot the item will be placed into
* @returns false if no incompatibilities, also has incompatibility reason
*/
isItemIncompatibleWithCurrentItems(itemsEquipped: Item[], tplToCheck: string, equipmentSlot: string): IChooseRandomCompatibleModResult;
isItemIncompatibleWithCurrentItems(itemsEquipped: IItem[], tplToCheck: string, equipmentSlot: string): IChooseRandomCompatibleModResult;
/**
* Convert a bots role to the equipment role used in config/bot.json
* @param botRole Role to convert
@ -92,12 +91,12 @@ export declare class BotGeneratorHelper {
* @param inventory Inventory to add item+children into
* @returns ItemAddedResult result object
*/
addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], rootItemId: string, rootItemTplId: string, itemWithChildren: Item[], inventory: Inventory, containersIdFull?: Set<string>): ItemAddedResult;
addItemWithChildrenToEquipmentSlot(equipmentSlots: string[], rootItemId: string, rootItemTplId: string, itemWithChildren: IItem[], inventory: IInventory, containersIdFull?: Set<string>): ItemAddedResult;
/**
* Is the provided item allowed inside a container
* @param slotGrid Items sub-grid we want to place item inside
* @param itemTpl Item tpl being placed
* @returns True if allowed
*/
protected itemAllowedInContainer(slotGrid: Grid, itemTpl: string): boolean;
protected itemAllowedInContainer(slotGrid: IGrid, itemTpl: string): boolean;
}

View File

@ -1,6 +1,6 @@
import { MinMax } from "@spt/models/common/MinMax";
import { Difficulty, IBotType } from "@spt/models/eft/common/tables/IBotType";
import { EquipmentFilters, IBotConfig, RandomisationDetails } from "@spt/models/spt/config/IBotConfig";
import { IBotType, IDifficultyCategories } from "@spt/models/eft/common/tables/IBotType";
import { EquipmentFilters, IBotConfig, IRandomisationDetails } from "@spt/models/spt/config/IBotConfig";
import { IPmcConfig } from "@spt/models/spt/config/IPmcConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -33,20 +33,15 @@ export declare class BotHelper {
* @param difficultySettings bot settings to alter
* @param typeToAdd bot type to add to friendly list
*/
addBotToFriendlyList(difficultySettings: Difficulty, typeToAdd: string): void;
addBotToFriendlyList(difficultySettings: IDifficultyCategories, typeToAdd: string): void;
/**
* Add a bot to the REVENGE_BOT_TYPES array
* @param difficultySettings bot settings to alter
* @param typesToAdd bot type to add to revenge list
*/
addBotToRevengeList(difficultySettings: Difficulty, typesToAdd: string[]): void;
/**
* Choose if a bot should become a PMC by checking if bot type is allowed to become a Pmc in botConfig.convertFromChances and doing a random int check
* @param botRole the bot role to check if should be a pmc
* @returns true if should be a pmc
*/
shouldBotBePmc(botRole: string): boolean;
rollChanceToBePmc(role: string, botConvertMinMax: MinMax): boolean;
addBotToRevengeList(difficultySettings: IDifficultyCategories, typesToAdd: string[]): void;
rollChanceToBePmc(botConvertMinMax: MinMax): boolean;
protected getPmcConversionValuesForLocation(location: string): Record<string, MinMax>;
/**
* is the provided role a PMC, case-agnostic
* @param botRole Role to check
@ -59,7 +54,7 @@ export declare class BotHelper {
* @param botEquipConfig bot equipment json
* @returns RandomisationDetails
*/
getBotRandomizationDetails(botLevel: number, botEquipConfig: EquipmentFilters): RandomisationDetails | undefined;
getBotRandomizationDetails(botLevel: number, botEquipConfig: EquipmentFilters): IRandomisationDetails | undefined;
/**
* Choose between pmcBEAR and pmcUSEC at random based on the % defined in pmcConfig.isUsec
* @returns pmc role
@ -76,5 +71,11 @@ export declare class BotHelper {
* @returns pmc side as string
*/
protected getRandomizedPmcSide(): string;
getPmcNicknameOfMaxLength(userId: string, maxLength: number): string;
/**
* Get a name from a PMC that fits the desired length
* @param maxLength Max length of name, inclusive
* @param side OPTIONAL - what side PMC to get name from (usec/bear)
* @returns name of PMC
*/
getPmcNicknameOfMaxLength(maxLength: number, side?: string): string;
}

View File

@ -1,9 +1,9 @@
import { BotGeneratorHelper } from "@spt/helpers/BotGeneratorHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { WeightedRandomHelper } from "@spt/helpers/WeightedRandomHelper";
import { Inventory } from "@spt/models/eft/common/tables/IBotBase";
import { GenerationData } from "@spt/models/eft/common/tables/IBotType";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IInventory } from "@spt/models/eft/common/tables/IBotBase";
import { IGenerationData } from "@spt/models/eft/common/tables/IBotType";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { EquipmentSlots } from "@spt/models/enums/EquipmentSlots";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -27,13 +27,13 @@ export declare class BotWeaponGeneratorHelper {
* @param magTemplate magazine to generate bullet count for
* @returns bullet count number
*/
getRandomizedBulletCount(magCounts: GenerationData, magTemplate: ITemplateItem): number;
getRandomizedBulletCount(magCounts: IGenerationData, magTemplate: ITemplateItem): number;
/**
* Get a randomized count of magazines
* @param magCounts min and max value returned value can be between
* @returns numerical value of magazine count
*/
getRandomizedMagazineCount(magCounts: GenerationData): number;
getRandomizedMagazineCount(magCounts: IGenerationData): number;
/**
* Is this magazine cylinder related (revolvers and grenade launchers)
* @param magazineParentName the name of the magazines parent
@ -47,7 +47,7 @@ export declare class BotWeaponGeneratorHelper {
* @param magTemplate template object of magazine
* @returns Item array
*/
createMagazineWithAmmo(magazineTpl: string, ammoTpl: string, magTemplate: ITemplateItem): Item[];
createMagazineWithAmmo(magazineTpl: string, ammoTpl: string, magTemplate: ITemplateItem): IItem[];
/**
* Add a specific number of cartridges to a bots inventory (defaults to vest and pockets)
* @param ammoTpl Ammo tpl to add to vest/pockets
@ -55,7 +55,7 @@ export declare class BotWeaponGeneratorHelper {
* @param inventory bot inventory to add cartridges to
* @param equipmentSlotsToAddTo what equipment slots should bullets be added into
*/
addAmmoIntoEquipmentSlots(ammoTpl: string, cartridgeCount: number, inventory: Inventory, equipmentSlotsToAddTo?: EquipmentSlots[]): void;
addAmmoIntoEquipmentSlots(ammoTpl: string, cartridgeCount: number, inventory: IInventory, equipmentSlotsToAddTo?: EquipmentSlots[]): void;
/**
* Get a weapons default magazine template id
* @param weaponTemplate weapon to get default magazine for

View File

@ -6,17 +6,21 @@ import { ICoreConfig } from "@spt/models/spt/config/ICoreConfig";
import { IWeatherConfig } from "@spt/models/spt/config/IWeatherConfig";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { GiftService } from "@spt/services/GiftService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { MailSendService } from "@spt/services/MailSendService";
import { SeasonalEventService } from "@spt/services/SeasonalEventService";
import { RandomUtil } from "@spt/utils/RandomUtil";
export declare class SptDialogueChatBot implements IDialogueChatBot {
protected profileHelper: ProfileHelper;
protected randomUtil: RandomUtil;
protected mailSendService: MailSendService;
protected seasonalEventService: SeasonalEventService;
protected localisationService: LocalisationService;
protected giftService: GiftService;
protected configServer: ConfigServer;
protected coreConfig: ICoreConfig;
protected weatherConfig: IWeatherConfig;
constructor(profileHelper: ProfileHelper, randomUtil: RandomUtil, mailSendService: MailSendService, giftService: GiftService, configServer: ConfigServer);
constructor(profileHelper: ProfileHelper, randomUtil: RandomUtil, mailSendService: MailSendService, seasonalEventService: SeasonalEventService, localisationService: LocalisationService, giftService: GiftService, configServer: ConfigServer);
getChatBot(): IUserDialogInfo;
/**
* Send responses back to player when they communicate with SPT friend on friends list

View File

@ -1,8 +1,8 @@
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { NotificationSendHelper } from "@spt/helpers/NotificationSendHelper";
import { NotifierHelper } from "@spt/helpers/NotifierHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { Dialogue, MessagePreview } from "@spt/models/eft/profile/ISptProfile";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IDialogue, IMessagePreview } from "@spt/models/eft/profile/ISptProfile";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { DatabaseServer } from "@spt/servers/DatabaseServer";
import { SaveServer } from "@spt/servers/SaveServer";
@ -23,7 +23,7 @@ export declare class DialogueHelper {
* @param dialogue
* @returns MessagePreview
*/
getMessagePreview(dialogue: Dialogue): MessagePreview;
getMessagePreview(dialogue: IDialogue): IMessagePreview;
/**
* Get the item contents for a particular message.
* @param messageID
@ -31,11 +31,11 @@ export declare class DialogueHelper {
* @param itemId Item being moved to inventory
* @returns
*/
getMessageItemContents(messageID: string, sessionID: string, itemId: string): Item[];
getMessageItemContents(messageID: string, sessionID: string, itemId: string): IItem[];
/**
* Get the dialogs dictionary for a profile, create if doesnt exist
* @param sessionId Session/player id
* @returns Dialog dictionary
*/
getDialogsForProfile(sessionId: string): Record<string, Dialogue>;
getDialogsForProfile(sessionId: string): Record<string, IDialogue>;
}

View File

@ -1,5 +1,5 @@
import { Category } from "@spt/models/eft/common/tables/IHandbookBase";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IHandbookCategory } from "@spt/models/eft/common/tables/IHandbookBase";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IItemConfig } from "@spt/models/spt/config/IItemConfig";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { DatabaseService } from "@spt/services/DatabaseService";
@ -33,7 +33,7 @@ export declare class HandbookHelper {
* @returns price in roubles
*/
getTemplatePrice(tpl: string): number;
getTemplatePriceForItems(items: Item[]): number;
getTemplatePriceForItems(items: IItem[]): number;
/**
* Get all items in template with the given parent category
* @param parentId
@ -66,6 +66,6 @@ export declare class HandbookHelper {
* @returns currency count in desired type
*/
fromRUB(roubleCurrencyCount: number, currencyTypeTo: string): number;
getCategoryById(handbookId: string): Category;
getCategoryById(handbookId: string): IHandbookCategory;
}
export {};

View File

@ -1,6 +1,7 @@
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IBodyPartsHealth, IHealth } from "@spt/models/eft/common/tables/IBotBase";
import { ISyncHealthRequestData } from "@spt/models/eft/health/ISyncHealthRequestData";
import { Effects, ISptProfile } from "@spt/models/eft/profile/ISptProfile";
import { IEffects, ISptProfile } from "@spt/models/eft/profile/ISptProfile";
import { IHealthConfig } from "@spt/models/spt/config/IHealthConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -21,6 +22,23 @@ export declare class HealthHelper {
* @returns updated profile
*/
resetVitality(sessionID: string): ISptProfile;
/**
* Update player profile vitality values with changes from client request object
* @param pmcData Player profile
* @param postRaidHealth Post raid data
* @param sessionID Session id
* @param isDead Is player dead
* @param addEffects Should effects be added to profile (default - true)
* @param deleteExistingEffects Should all prior effects be removed before apply new ones (default - true)
*/
updateProfileHealthPostRaid(pmcData: IPmcData, postRaidHealth: IHealth, sessionID: string, isDead: boolean): void;
protected storeHydrationEnergyTempInProfile(fullProfile: ISptProfile, hydration: number, energy: number, temprature: number): void;
/**
* Take body part effects from client profile and apply to server profile
* @param postRaidBodyParts Post-raid body part data
* @param profileData Player profile on server
*/
protected transferPostRaidLimbEffectsToProfile(postRaidBodyParts: IBodyPartsHealth, profileData: IPmcData): void;
/**
* Update player profile vitality values with changes from client request object
* @param pmcData Player profile
@ -45,7 +63,7 @@ export declare class HealthHelper {
* @param bodyPartsWithEffects dict of body parts with effects that should be added to profile
* @param addEffects Should effects be added back to profile
*/
protected saveEffects(pmcData: IPmcData, sessionId: string, bodyPartsWithEffects: Effects, deleteExistingEffects?: boolean): void;
protected saveEffects(pmcData: IPmcData, sessionId: string, bodyPartsWithEffects: IEffects, deleteExistingEffects?: boolean): void;
/**
* Add effect to body part in profile
* @param pmcData Player profile

View File

@ -2,14 +2,15 @@ import { InventoryHelper } from "@spt/helpers/InventoryHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { HideoutArea, IHideoutImprovement, Production, Productive } from "@spt/models/eft/common/tables/IBotBase";
import { Item, Upd } from "@spt/models/eft/common/tables/IItem";
import { StageBonus } from "@spt/models/eft/hideout/IHideoutArea";
import { IBotHideoutArea, IHideoutImprovement, IProduction, IProductive } from "@spt/models/eft/common/tables/IBotBase";
import { IItem, IUpd } from "@spt/models/eft/common/tables/IItem";
import { IHideoutArea, IStageBonus } from "@spt/models/eft/hideout/IHideoutArea";
import { IHideoutContinuousProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutContinuousProductionStartRequestData";
import { IHideoutProduction } from "@spt/models/eft/hideout/IHideoutProduction";
import { IHideoutSingleProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutSingleProductionStartRequestData";
import { IHideoutTakeProductionRequestData } from "@spt/models/eft/hideout/IHideoutTakeProductionRequestData";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { HideoutAreas } from "@spt/models/enums/HideoutAreas";
import { SkillTypes } from "@spt/models/enums/SkillTypes";
import { IHideoutConfig } from "@spt/models/spt/config/IHideoutConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -37,6 +38,7 @@ export declare class HideoutHelper {
protected configServer: ConfigServer;
protected cloner: ICloner;
static bitcoinFarm: string;
static cultistCircleCraftId: string;
static bitcoinProductionId: string;
static waterCollector: string;
static maxSkillPoint: number;
@ -54,19 +56,19 @@ export declare class HideoutHelper {
* This convenience function initializes new Production Object
* with all the constants.
*/
initProduction(recipeId: string, productionTime: number, needFuelForAllProductionTime: boolean): Production;
initProduction(recipeId: string, productionTime: number, needFuelForAllProductionTime: boolean): IProduction;
/**
* Is the provided object a Production type
* @param productive
* @returns
*/
isProductionType(productive: Productive): productive is Production;
isProductionType(productive: IProductive): productive is IProduction;
/**
* Apply bonus to player profile given after completing hideout upgrades
* @param pmcData Profile to add bonus to
* @param bonus Bonus to add to profile
*/
applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: StageBonus): void;
applyPlayerUpgradesBonuses(pmcData: IPmcData, bonus: IStageBonus): void;
/**
* Process a players hideout, update areas that use resources + increment production timers
* @param sessionID Session id
@ -82,7 +84,7 @@ export declare class HideoutHelper {
isGeneratorOn: boolean;
waterCollectorHasFilter: boolean;
};
protected doesWaterCollectorHaveFilter(waterCollector: HideoutArea): boolean;
protected doesWaterCollectorHaveFilter(waterCollector: IBotHideoutArea): boolean;
/**
* Iterate over productions and update their progress timers
* @param pmcData Profile to check for productions and update
@ -93,6 +95,21 @@ export declare class HideoutHelper {
isGeneratorOn: boolean;
waterCollectorHasFilter: boolean;
}): void;
/**
* Is a craft from a particular hideout area
* @param craft Craft to check
* @param hideoutType Type to check craft against
* @returns True it is from that area
*/
protected isCraftOfType(craft: IProduction, hideoutType: HideoutAreas): boolean;
/**
* Has the craft completed
* Ignores bitcoin farm/cultist circle as they're continuous crafts
* @param craft Craft to check
* @returns True when craft is compelte
*/
protected isCraftComplete(craft: IProduction): boolean;
/**
* Update progress timer for water collector
* @param pmcData profile to update
@ -116,6 +133,8 @@ export declare class HideoutHelper {
isGeneratorOn: boolean;
waterCollectorHasFilter?: boolean;
}): void;
protected updateCultistCircleCraftProgress(pmcData: IPmcData, prodId: string): void;
protected flagCultistCircleCraftAsComplete(production: IProductive): void;
/**
* Check if a productions progress value matches its corresponding recipes production time value
* @param pmcData Player profile
@ -147,8 +166,8 @@ export declare class HideoutHelper {
* @param pmcData Player profile
* @param isGeneratorOn Is the generator turned on since last update
*/
protected updateFuel(generatorArea: HideoutArea, pmcData: IPmcData, isGeneratorOn: boolean): void;
protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: HideoutArea, hideoutProperties: {
protected updateFuel(generatorArea: IBotHideoutArea, pmcData: IPmcData, isGeneratorOn: boolean): void;
protected updateWaterCollector(sessionId: string, pmcData: IPmcData, area: IBotHideoutArea, hideoutProperties: {
btcFarmCGs: number;
isGeneratorOn: boolean;
waterCollectorHasFilter: boolean;
@ -168,7 +187,7 @@ export declare class HideoutHelper {
* @param isGeneratorOn is generator enabled
* @param pmcData Player profile
*/
protected updateWaterFilters(waterFilterArea: HideoutArea, production: Production, isGeneratorOn: boolean, pmcData: IPmcData): void;
protected updateWaterFilters(waterFilterArea: IBotHideoutArea, production: IProduction, isGeneratorOn: boolean, pmcData: IPmcData): void;
/**
* Get an adjusted water filter drain rate based on time elapsed since last run,
* handle edge case when craft time has gone on longer than total production time
@ -198,15 +217,15 @@ export declare class HideoutHelper {
* @param resourceUnitsConsumed
* @returns Upd
*/
protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number, isFoundInRaid: boolean): Upd;
protected updateAirFilters(airFilterArea: HideoutArea, pmcData: IPmcData, isGeneratorOn: boolean): void;
protected updateBitcoinFarm(pmcData: IPmcData, btcFarmCGs: number, isGeneratorOn: boolean): Production | undefined;
protected getAreaUpdObject(stackCount: number, resourceValue: number, resourceUnitsConsumed: number, isFoundInRaid: boolean): IUpd;
protected updateAirFilters(airFilterArea: IBotHideoutArea, pmcData: IPmcData, isGeneratorOn: boolean): void;
protected updateBitcoinFarm(pmcData: IPmcData, btcProduction: IProductive, btcFarmCGs: number, isGeneratorOn: boolean): void;
/**
* Add bitcoin object to btc production products array and set progress time
* @param btcProd Bitcoin production object
* @param coinCraftTimeSeconds Time to craft a bitcoin
*/
protected addBtcToProduction(btcProd: Production, coinCraftTimeSeconds: number): void;
protected addBtcToProduction(btcProd: IProduction, coinCraftTimeSeconds: number): void;
/**
* Get number of ticks that have passed since hideout areas were last processed, reduced when generator is off
* @param pmcData Player profile
@ -248,7 +267,7 @@ export declare class HideoutHelper {
* @returns Seconds to reduce craft time by
*/
getSkillProductionTimeReduction(pmcData: IPmcData, productionTime: number, skill: SkillTypes, amountPerLevel: number): number;
isProduction(productive: Productive): productive is Production;
isProduction(productive: IProductive): productive is IProduction;
/**
* Gather crafted BTC from hideout area and add to inventory
* Reset production start timestamp if hideout area at full coin capacity
@ -286,5 +305,12 @@ export declare class HideoutHelper {
* @param activeDogtags Active dogtags in place of fame dogtag slots
* @returns combat bonus
*/
protected getDogtagCombatSkillBonusPercent(pmcData: IPmcData, activeDogtags: Item[]): number;
protected getDogtagCombatSkillBonusPercent(pmcData: IPmcData, activeDogtags: IItem[]): number;
/**
* The wall pollutes a profile with various temp buffs/debuffs,
* Remove them all
* @param wallAreaDb Hideout area data
* @param pmcData Player profile
*/
removeHideoutWallBuffsAndDebuffs(wallAreaDb: IHideoutArea, pmcData: IPmcData): void;
}

View File

@ -1,122 +1,35 @@
import { QuestController } from "@spt/controllers/QuestController";
import { InventoryHelper } from "@spt/helpers/InventoryHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { PaymentHelper } from "@spt/helpers/PaymentHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { QuestHelper } from "@spt/helpers/QuestHelper";
import { IPmcData, IPostRaidPmcData } from "@spt/models/eft/common/IPmcData";
import { IQuestStatus, TraderInfo } from "@spt/models/eft/common/tables/IBotBase";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { ISaveProgressRequestData } from "@spt/models/eft/inRaid/ISaveProgressRequestData";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IInRaidConfig } from "@spt/models/spt/config/IInRaidConfig";
import { ILostOnDeathConfig } from "@spt/models/spt/config/ILostOnDeathConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { SaveServer } from "@spt/servers/SaveServer";
import { DatabaseService } from "@spt/services/DatabaseService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { ProfileFixerService } from "@spt/services/ProfileFixerService";
import { RandomUtil } from "@spt/utils/RandomUtil";
import { TimeUtil } from "@spt/utils/TimeUtil";
import { ICloner } from "@spt/utils/cloners/ICloner";
import { ProfileHelper } from "./ProfileHelper";
import { QuestHelper } from "./QuestHelper";
export declare class InRaidHelper {
protected logger: ILogger;
protected timeUtil: TimeUtil;
protected saveServer: SaveServer;
protected itemHelper: ItemHelper;
protected databaseService: DatabaseService;
protected inventoryHelper: InventoryHelper;
protected itemHelper: ItemHelper;
protected configServer: ConfigServer;
protected cloner: ICloner;
protected databaseService: DatabaseService;
protected questController: QuestController;
protected profileHelper: ProfileHelper;
protected questHelper: QuestHelper;
protected paymentHelper: PaymentHelper;
protected localisationService: LocalisationService;
protected profileFixerService: ProfileFixerService;
protected configServer: ConfigServer;
protected randomUtil: RandomUtil;
protected cloner: ICloner;
protected lostOnDeathConfig: ILostOnDeathConfig;
protected inRaidConfig: IInRaidConfig;
constructor(logger: ILogger, timeUtil: TimeUtil, saveServer: SaveServer, itemHelper: ItemHelper, databaseService: DatabaseService, inventoryHelper: InventoryHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, paymentHelper: PaymentHelper, localisationService: LocalisationService, profileFixerService: ProfileFixerService, configServer: ConfigServer, randomUtil: RandomUtil, cloner: ICloner);
/**
* Lookup quest item loss from lostOnDeath config
* @returns True if items should be removed from inventory
*/
shouldQuestItemsBeRemovedOnDeath(): boolean;
/**
* Check items array and add an upd object to money with a stack count of 1
* Single stack money items have no upd object and thus no StackObjectsCount, causing issues
* @param items Items array to check
*/
addStackCountToMoneyFromRaid(items: Item[]): void;
/**
* Reset a profile to a baseline, used post-raid
* Reset points earned during session property
* Increment exp
* @param profileData Profile to update
* @param saveProgressRequest post raid save data request data
* @param sessionID Session id
* @returns Reset profile object
*/
updateProfileBaseStats(profileData: IPmcData, saveProgressRequest: ISaveProgressRequestData, sessionID: string): void;
constructor(logger: ILogger, inventoryHelper: InventoryHelper, itemHelper: ItemHelper, configServer: ConfigServer, cloner: ICloner, databaseService: DatabaseService, questController: QuestController, profileHelper: ProfileHelper, questHelper: QuestHelper);
/**
* @deprecated
* Reset the skill points earned in a raid to 0, ready for next raid
* @param profile Profile to update
*/
protected resetSkillPointsEarnedDuringRaid(profile: IPmcData): void;
/** Check counters are correct in profile */
protected validateTaskConditionCounters(saveProgressRequest: ISaveProgressRequestData, profileData: IPmcData): void;
/**
* Update various serverPMC profile values; quests/limb hp/trader standing with values post-raic
* @param pmcData Server PMC profile
* @param saveProgressRequest Post-raid request data
* @param sessionId Session id
*/
updatePmcProfileDataPostRaid(pmcData: IPmcData, saveProgressRequest: ISaveProgressRequestData, sessionId: string): void;
/**
* Update scav quest values on server profile with updated values post-raid
* @param scavData Server scav profile
* @param saveProgressRequest Post-raid request data
* @param sessionId Session id
*/
updateScavProfileDataPostRaid(scavData: IPmcData, saveProgressRequest: ISaveProgressRequestData, sessionId: string): void;
/**
* Look for quests with a status different from what it began the raid with
* @param sessionId Player id
* @param pmcData Player profile
* @param preRaidQuests Quests prior to starting raid
* @param postRaidProfile Profile sent by client with post-raid quests
*/
protected processAlteredQuests(sessionId: string, pmcData: IPmcData, preRaidQuests: IQuestStatus[], postRaidProfile: IPostRaidPmcData): void;
protected handleFailRestartableQuestStatus(pmcData: IPmcData, postRaidProfile: IPostRaidPmcData, postRaidQuest: IQuestStatus): void;
/**
* Take body part effects from client profile and apply to server profile
* @param saveProgressRequest post-raid request
* @param profileData player profile on server
*/
protected transferPostRaidLimbEffectsToProfile(saveProgressRequest: ISaveProgressRequestData, profileData: IPmcData): void;
/**
* Adjust server trader settings if they differ from data sent by client
* @param tradersServerProfile Server
* @param tradersClientProfile Client
*/
protected applyTraderStandingAdjustments(tradersServerProfile: Record<string, TraderInfo>, tradersClientProfile: Record<string, TraderInfo>): void;
/**
* Transfer client achievements into profile
* @param profile Player pmc profile
* @param clientAchievements Achievements from client
*/
protected updateProfileAchievements(profile: IPmcData, clientAchievements: Record<string, number>): void;
/**
* Set the SPT inraid location Profile property to 'none'
* @param sessionID Session id
*/
protected setPlayerInRaidLocationStatusToNone(sessionID: string): void;
/**
* Iterate over inventory items and remove the property that defines an item as Found in Raid
* Only removes property if item had FiR when entering raid
* @param postRaidProfile profile to update items for
* @returns Updated profile with SpawnedInSession removed
*/
removeSpawnedInSessionPropertyFromItems(postRaidProfile: IPostRaidPmcData): IPostRaidPmcData;
/**
* Update a players inventory post-raid
* Remove equipped items from pre-raid
@ -126,7 +39,18 @@ export declare class InRaidHelper {
* @param serverProfile Profile to update
* @param postRaidProfile Profile returned by client after a raid
*/
setInventory(sessionID: string, serverProfile: IPmcData, postRaidProfile: IPmcData): void;
setInventory(sessionID: string, serverProfile: IPmcData, postRaidProfile: IPmcData, isSurvived: boolean, isTransfer: boolean): void;
/**
* Remove FiR status from items
* @param items Items to process
*/
protected removeFiRStatusFromCertainItems(items: IItem[]): void;
/**
* Add items from one parameter into another
* @param itemsToAdd Items we want to add
* @param serverInventoryItems Location to add items to
*/
protected addItemsToInventory(itemsToAdd: IItem[], serverInventoryItems: IItem[]): void;
/**
* Clear PMC inventory of all items except those that are exempt
* Used post-raid to remove items after death
@ -134,29 +58,24 @@ export declare class InRaidHelper {
* @param sessionId Session id
*/
deleteInventory(pmcData: IPmcData, sessionId: string): void;
/**
* Remove FiR status from designated container
* @param sessionId Session id
* @param pmcData Player profile
* @param secureContainerSlotId Container slot id to find items for and remove FiR from
*/
removeFiRStatusFromItemsInContainer(sessionId: string, pmcData: IPmcData, secureContainerSlotId: string): void;
/**
* Get an array of items from a profile that will be lost on death
* @param pmcProfile Profile to get items from
* @returns Array of items lost on death
*/
protected getInventoryItemsLostOnDeath(pmcProfile: IPmcData): Item[];
/**
* Get items in vest/pocket/backpack inventory containers (excluding children)
* @param pmcData Player profile
* @returns Item array
*/
protected getBaseItemsInRigPocketAndBackpack(pmcData: IPmcData): Item[];
protected getInventoryItemsLostOnDeath(pmcProfile: IPmcData): IItem[];
/**
* Does the provided items slotId mean its kept on the player after death
* @pmcData Player profile
* @itemToCheck Item to check should be kept
* @returns true if item is kept after death
*/
protected isItemKeptAfterDeath(pmcData: IPmcData, itemToCheck: Item): boolean;
/**
* Return the equipped items from a players inventory
* @param items Players inventory to search through
* @returns an array of equipped items
*/
getPlayerGear(items: Item[]): Item[];
protected isItemKeptAfterDeath(pmcData: IPmcData, itemToCheck: IItem): boolean;
}

View File

@ -6,8 +6,8 @@ import { PresetHelper } from "@spt/helpers/PresetHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { TraderAssortHelper } from "@spt/helpers/TraderAssortHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Inventory } from "@spt/models/eft/common/tables/IBotBase";
import { Item, Upd } from "@spt/models/eft/common/tables/IItem";
import { IInventory } from "@spt/models/eft/common/tables/IBotBase";
import { IItem, IItemLocation, IUpd } from "@spt/models/eft/common/tables/IItem";
import { IAddItemDirectRequest } from "@spt/models/eft/inventory/IAddItemDirectRequest";
import { IAddItemsDirectRequest } from "@spt/models/eft/inventory/IAddItemsDirectRequest";
import { IInventoryMergeRequestData } from "@spt/models/eft/inventory/IInventoryMergeRequestData";
@ -16,7 +16,7 @@ import { IInventoryRemoveRequestData } from "@spt/models/eft/inventory/IInventor
import { IInventorySplitRequestData } from "@spt/models/eft/inventory/IInventorySplitRequestData";
import { IInventoryTransferRequestData } from "@spt/models/eft/inventory/IInventoryTransferRequestData";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { IInventoryConfig, RewardDetails } from "@spt/models/spt/config/IInventoryConfig";
import { IInventoryConfig, IRewardDetails } from "@spt/models/spt/config/IInventoryConfig";
import { IOwnerInventoryItems } from "@spt/models/spt/inventory/IOwnerInventoryItems";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -65,33 +65,33 @@ export declare class InventoryHelper {
* @param itemWithChildren An item
* @param foundInRaid Item was found in raid
*/
protected setFindInRaidStatusForItem(itemWithChildren: Item[], foundInRaid: boolean): void;
protected setFindInRaidStatusForItem(itemWithChildren: IItem[], foundInRaid: boolean): void;
/**
* Remove properties from a Upd object used by a trader/ragfair that are unnecessary to a player
* @param upd Object to update
*/
protected removeTraderRagfairRelatedUpdProperties(upd: Upd): void;
protected removeTraderRagfairRelatedUpdProperties(upd: IUpd): void;
/**
* Can all probided items be added into player inventory
* Can all provided items be added into player inventory
* @param sessionId Player id
* @param itemsWithChildren array of items with children to try and fit
* @returns True all items fit
*/
canPlaceItemsInInventory(sessionId: string, itemsWithChildren: Item[][]): boolean;
canPlaceItemsInInventory(sessionId: string, itemsWithChildren: IItem[][]): boolean;
/**
* Do the provided items all fit into the grid
* @param containerFS2D Container grid to fit items into
* @param itemsWithChildren items to try and fit into grid
* @returns True all fit
*/
canPlaceItemsInContainer(containerFS2D: number[][], itemsWithChildren: Item[][]): boolean;
canPlaceItemsInContainer(containerFS2D: number[][], itemsWithChildren: IItem[][]): boolean;
/**
* Does an item fit into a container grid
* @param containerFS2D Container grid
* @param itemWithChildren item to check fits
* @returns True it fits
*/
canPlaceItemInContainer(containerFS2D: number[][], itemWithChildren: Item[]): boolean;
canPlaceItemInContainer(containerFS2D: number[][], itemWithChildren: IItem[]): boolean;
/**
* Find a free location inside a container to fit the item
* @param containerFS2D Container grid to add item to
@ -99,7 +99,7 @@ export declare class InventoryHelper {
* @param containerId Id of the container we're fitting item into
* @param desiredSlotId slot id value to use, default is "hideout"
*/
placeItemInContainer(containerFS2D: number[][], itemWithChildren: Item[], containerId: string, desiredSlotId?: string): void;
placeItemInContainer(containerFS2D: number[][], itemWithChildren: IItem[], containerId: string, desiredSlotId?: string): void;
/**
* Find a location to place an item into inventory and place it
* @param stashFS2D 2-dimensional representation of the container slots
@ -109,7 +109,7 @@ export declare class InventoryHelper {
* @param useSortingTable Should sorting table to be used if main stash has no space
* @param output output to send back to client
*/
protected placeItemInInventory(stashFS2D: number[][], sortingTableFS2D: number[][], itemWithChildren: Item[], playerInventory: Inventory, useSortingTable: boolean, output: IItemEventRouterResponse): void;
protected placeItemInInventory(stashFS2D: number[][], sortingTableFS2D: number[][], itemWithChildren: IItem[], playerInventory: IInventory, useSortingTable: boolean, output: IItemEventRouterResponse): void;
/**
* Handle Remove event
* Remove item from player inventory + insured items array
@ -144,7 +144,7 @@ export declare class InventoryHelper {
* @param inventoryItems
* @returns [width, height]
*/
getItemSize(itemTpl: string, itemID: string, inventoryItems: Item[]): number[];
getItemSize(itemTpl: string, itemID: string, inventoryItems: IItem[]): number[];
/**
* Calculates the size of an item including attachements
* takes into account if item is folded
@ -162,14 +162,16 @@ export declare class InventoryHelper {
*/
protected getBlankContainerMap(containerH: number, containerY: number): number[][];
/**
* Get a 2d mapping of a container with what grid slots are filled
* @param containerH Horizontal size of container
* @param containerV Vertical size of container
* @param itemList
* @param itemList Players inventory items
* @param containerId Id of the container
* @returns Two-dimensional representation of container
*/
getContainerMap(containerH: number, containerV: number, itemList: Item[], containerId: string): number[][];
protected getInventoryItemHash(inventoryItem: Item[]): InventoryHelper.InventoryItemHash;
getContainerMap(containerH: number, containerV: number, itemList: IItem[], containerId: string): number[][];
protected isVertical(itemLocation: IItemLocation): boolean;
protected getInventoryItemHash(inventoryItem: IItem[]): InventoryHelper.InventoryItemHash;
/**
* Return the inventory that needs to be modified (scav/pmc etc)
* Changes made to result apply to character inventory
@ -217,7 +219,7 @@ export declare class InventoryHelper {
* @param toItems Inventory of the destination
* @param request Move request
*/
moveItemToProfile(sourceItems: Item[], toItems: Item[], request: IInventoryMoveRequestData): void;
moveItemToProfile(sourceItems: IItem[], toItems: IItem[], request: IInventoryMoveRequestData): void;
/**
* Internal helper function to move item within the same profile_f.
* @param pmcData profile to edit
@ -225,7 +227,7 @@ export declare class InventoryHelper {
* @param moveRequest client move request
* @returns True if move was successful
*/
moveItemInternal(pmcData: IPmcData, inventoryItems: Item[], moveRequest: IInventoryMoveRequestData): {
moveItemInternal(pmcData: IPmcData, inventoryItems: IItem[], moveRequest: IInventoryMoveRequestData): {
success: boolean;
errorMessage?: string;
};
@ -234,17 +236,17 @@ export declare class InventoryHelper {
* @param pmcData Player profile
* @param itemBeingMoved item being moved
*/
protected updateFastPanelBinding(pmcData: IPmcData, itemBeingMoved: Item): void;
protected updateFastPanelBinding(pmcData: IPmcData, itemBeingMoved: IItem): void;
/**
* Internal helper function to handle cartridges in inventory if any of them exist.
*/
protected handleCartridges(items: Item[], request: IInventoryMoveRequestData): void;
protected handleCartridges(items: IItem[], request: 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;
getRandomLootContainerRewardDetails(itemTpl: string): IRewardDetails;
getInventoryConfig(): IInventoryConfig;
/**
* Recursively checks if the given item is
@ -254,12 +256,21 @@ export declare class InventoryHelper {
* @param itemToCheck Item to look for
* @returns True if item exists inside stash
*/
isItemInStash(pmcData: IPmcData, itemToCheck: Item): boolean;
isItemInStash(pmcData: IPmcData, itemToCheck: IItem): boolean;
validateInventoryUsesMonogoIds(itemsToValidate: IItem[]): void;
/**
* Does the provided item have a root item with the provided id
* @param pmcData Profile with items
* @param item Item to check
* @param rootId Root item id to check for
* @returns True when item has rootId, false when not
*/
doesItemHaveRootId(pmcData: IPmcData, item: IItem, rootId: string): boolean;
}
declare namespace InventoryHelper {
interface InventoryItemHash {
byItemId: Record<string, Item>;
byParentId: Record<string, Item[]>;
byItemId: Record<string, IItem>;
byParentId: Record<string, IItem[]>;
}
}
export {};

View File

@ -1,8 +1,8 @@
import { HandbookHelper } from "@spt/helpers/HandbookHelper";
import { IStaticAmmoDetails } from "@spt/models/eft/common/ILocation";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { InsuredItem } from "@spt/models/eft/common/tables/IBotBase";
import { Item, Repairable, Upd } from "@spt/models/eft/common/tables/IItem";
import { IInsuredItem } from "@spt/models/eft/common/tables/IBotBase";
import { IItem, IUpd, IUpdRepairable } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { ItemTpl } from "@spt/models/enums/ItemTpl";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -42,7 +42,7 @@ export declare class ItemHelper {
* @param slotId OPTIONAL - slotid of desired item
* @returns True if pool contains item
*/
hasItemWithTpl(itemPool: Item[], item: ItemTpl, slotId?: string): boolean;
hasItemWithTpl(itemPool: IItem[], item: ItemTpl, slotId?: string): boolean;
/**
* Get the first item from provided pool with the desired tpl
* @param itemPool Item collection to search
@ -50,7 +50,7 @@ export declare class ItemHelper {
* @param slotId OPTIONAL - slotid of desired item
* @returns Item or undefined
*/
getItemFromPoolByTpl(itemPool: Item[], item: ItemTpl, slotId?: string): Item | undefined;
getItemFromPoolByTpl(itemPool: IItem[], item: ItemTpl, slotId?: string): IItem | undefined;
/**
* This method will compare two items (with all its children) and see if the are equivalent.
* This method will NOT compare IDs on the items
@ -59,7 +59,7 @@ export declare class ItemHelper {
* @param compareUpdProperties Upd properties to compare between the items
* @returns true if they are the same, false if they arent
*/
isSameItems(item1: Item[], item2: Item[], compareUpdProperties?: Set<string>): boolean;
isSameItems(item1: IItem[], item2: IItem[], compareUpdProperties?: Set<string>): boolean;
/**
* This method will compare two items and see if the are equivalent.
* This method will NOT compare IDs on the items
@ -68,13 +68,13 @@ export declare class ItemHelper {
* @param compareUpdProperties Upd properties to compare between the items
* @returns true if they are the same, false if they arent
*/
isSameItem(item1: Item, item2: Item, compareUpdProperties?: Set<string>): boolean;
isSameItem(item1: IItem, item2: IItem, compareUpdProperties?: Set<string>): boolean;
/**
* Helper method to generate a Upd based on a template
* @param itemTemplate the item template to generate a Upd for
* @returns A Upd with all the default properties set
*/
generateUpdForItem(itemTemplate: ITemplateItem): Upd;
generateUpdForItem(itemTemplate: ITemplateItem): IUpd;
/**
* Checks if a tpl is a valid item. Valid meaning that it's an item that be stored in stash
* Valid means:
@ -171,7 +171,7 @@ export declare class ItemHelper {
* @param item Item to update
* @returns Fixed item
*/
fixItemStackCount(item: Item): Item;
fixItemStackCount(item: IItem): IItem;
/**
* Get cloned copy of all item data from items.json
* @returns array of ITemplateItem objects
@ -191,7 +191,7 @@ export declare class ItemHelper {
* @param skipArmorItemsWithoutDurability Skip over armor items without durability
* @returns % quality modifer between 0 and 1
*/
getItemQualityModifierForItems(items: Item[], skipArmorItemsWithoutDurability?: boolean): number;
getItemQualityModifierForItems(items: IItem[], skipArmorItemsWithoutDurability?: boolean): number;
/**
* get normalized value (0-1) based on item condition
* Will return -1 for base armor items with 0 durability
@ -199,7 +199,7 @@ export declare class ItemHelper {
* @param skipArmorItemsWithoutDurability return -1 for armor items that have maxdurability of 0
* @returns Number between 0 and 1
*/
getItemQualityModifier(item: Item, skipArmorItemsWithoutDurability?: boolean): number;
getItemQualityModifier(item: IItem, skipArmorItemsWithoutDurability?: boolean): number;
/**
* Get a quality value based on a repairable items (weapon/armor) current state between current and max durability
* @param itemDetails Db details for item we want quality value for
@ -207,14 +207,14 @@ export declare class ItemHelper {
* @param item Item quality value is for
* @returns A number between 0 and 1
*/
protected getRepairableItemQualityValue(itemDetails: ITemplateItem, repairable: Repairable, item: Item): number;
protected getRepairableItemQualityValue(itemDetails: ITemplateItem, repairable: IUpdRepairable, item: IItem): number;
/**
* Recursive function that looks at every item from parameter and gets their childrens Ids + includes parent item in results
* @param items Array of items (item + possible children)
* @param baseItemId Parent items id
* @returns an array of strings
*/
findAndReturnChildrenByItems(items: Item[], baseItemId: string): string[];
findAndReturnChildrenByItems(items: IItem[], baseItemId: string): string[];
/**
* A variant of findAndReturnChildren where the output is list of item objects instead of their ids.
* @param items Array of items (item + possible children)
@ -222,20 +222,20 @@ export declare class ItemHelper {
* @param modsOnly Include only mod items, exclude items stored inside root item
* @returns An array of Item objects
*/
findAndReturnChildrenAsItems(items: Item[], baseItemId: string, modsOnly?: boolean): Item[];
findAndReturnChildrenAsItems(items: IItem[], baseItemId: string, modsOnly?: boolean): IItem[];
/**
* Find children of the item in a given assort (weapons parts for example, need recursive loop function)
* @param itemIdToFind Template id of item to check for
* @param assort Array of items to check in
* @returns Array of children of requested item
*/
findAndReturnChildrenByAssort(itemIdToFind: string, assort: Item[]): Item[];
findAndReturnChildrenByAssort(itemIdToFind: string, assort: IItem[]): IItem[];
/**
* Check if the passed in item has buy count restrictions
* @param itemToCheck Item to check
* @returns true if it has buy restrictions
*/
hasBuyRestrictions(itemToCheck: Item): boolean;
hasBuyRestrictions(itemToCheck: IItem): boolean;
/**
* is the passed in template id a dog tag
* @param tpl Template id to check
@ -247,7 +247,7 @@ export declare class ItemHelper {
* @param item
* @returns "slotId OR slotid,locationX,locationY"
*/
getChildId(item: Item): string;
getChildId(item: IItem): string;
/**
* Can the passed in item be stacked
* @param tpl item to check
@ -259,21 +259,28 @@ export declare class ItemHelper {
* @param itemToSplit Item to split into smaller stacks
* @returns Array of root item + children
*/
splitStack(itemToSplit: Item): Item[];
splitStack(itemToSplit: IItem): IItem[];
/**
* Turn items like money into separate stacks that adhere to max stack size
* @param itemToSplit Item to split into smaller stacks
* @returns
*/
splitStackIntoSeparateItems(itemToSplit: Item): Item[][];
splitStackIntoSeparateItems(itemToSplit: IItem): IItem[][];
/**
* Find Barter items from array of items
* @param {string} by tpl or id
* @param {Item[]} itemsToSearch Array of items to iterate over
* @param {IItem[]} itemsToSearch Array of items to iterate over
* @param {string} desiredBarterItemIds
* @returns Array of Item objects
*/
findBarterItems(by: "tpl" | "id", itemsToSearch: Item[], desiredBarterItemIds: string | string[]): Item[];
findBarterItems(by: "tpl" | "id", itemsToSearch: IItem[], desiredBarterItemIds: string | string[]): IItem[];
/**
* Replace the _id value for base item + all children that are children of it
* REPARENTS ROOT ITEM ID, NOTHING ELSE
* @param itemWithChildren Item with mods to update
* @param newId new id to add on chidren of base item
*/
replaceRootItemID(itemWithChildren: IItem[], newId?: string): void;
/**
* Regenerate all GUIDs with new IDs, for the exception of special item types (e.g. quest, sorting table, etc.) This
* function will not mutate the original items array, but will return a new array with new GUIDs.
@ -284,13 +291,13 @@ export declare class ItemHelper {
* @param fastPanel Quick slot panel
* @returns Item[]
*/
replaceIDs(originalItems: Item[], pmcData?: IPmcData, insuredItems?: InsuredItem[], fastPanel?: any): Item[];
replaceIDs(originalItems: IItem[], pmcData?: IPmcData, insuredItems?: IInsuredItem[], fastPanel?: any): IItem[];
/**
* Mark the passed in array of items as found in raid.
* Modifies passed in items
* @param items The list of items to mark as FiR
*/
setFoundInRaid(items: Item[]): void;
setFoundInRaid(items: IItem[]): void;
/**
* WARNING, SLOW. Recursively loop down through an items hierarchy to see if any of the ids match the supplied list, return true if any do
* @param {string} tpl Items tpl to check parents of
@ -315,7 +322,7 @@ export declare class ItemHelper {
* @param parent The parent of the item to be checked
* @returns True if the item is actually moddable, false if it is not, and undefined if the check cannot be performed.
*/
isRaidModdable(item: Item, parent: Item): boolean | undefined;
isRaidModdable(item: IItem, parent: IItem): boolean | undefined;
/**
* Retrieves the main parent item for a given attachment item.
*
@ -332,14 +339,14 @@ export declare class ItemHelper {
* @param itemsMap - A Map containing item IDs mapped to their corresponding Item objects for quick lookup.
* @returns The Item object representing the top-most parent of the given item, or `undefined` if no such parent exists.
*/
getAttachmentMainParent(itemId: string, itemsMap: Map<string, Item>): Item | undefined;
getAttachmentMainParent(itemId: string, itemsMap: Map<string, IItem>): IItem | undefined;
/**
* Determines if an item is an attachment that is currently attached to it's parent item.
*
* @param item The item to check.
* @returns true if the item is attached attachment, otherwise false.
*/
isAttachmentAttached(item: Item): boolean;
isAttachmentAttached(item: IItem): boolean;
/**
* Retrieves the equipment parent item for a given item.
*
@ -355,14 +362,14 @@ export declare class ItemHelper {
* @param itemsMap - A Map containing item IDs mapped to their corresponding Item objects for quick lookup.
* @returns The Item object representing the equipment parent of the given item, or `undefined` if no such parent exists.
*/
getEquipmentParent(itemId: string, itemsMap: Map<string, Item>): Item | undefined;
getEquipmentParent(itemId: string, itemsMap: Map<string, IItem>): IItem | undefined;
/**
* Get the inventory size of an item
* @param items Item with children
* @param rootItemId
* @returns ItemSize object (width and height)
*/
getItemSize(items: Item[], rootItemId: string): ItemHelper.ItemSize;
getItemSize(items: IItem[], rootItemId: string): ItemHelper.IItemSize;
/**
* Get a random cartridge from an items Filter property
* @param item Db item template to look up Cartridge filter values from
@ -374,21 +381,21 @@ export declare class ItemHelper {
* @param ammoBox Box to add cartridges to
* @param ammoBoxDetails Item template from items db
*/
addCartridgesToAmmoBox(ammoBox: Item[], ammoBoxDetails: ITemplateItem): void;
addCartridgesToAmmoBox(ammoBox: IItem[], ammoBoxDetails: ITemplateItem): void;
/**
* Add a single stack of cartridges to the ammo box
* @param ammoBox Box to add cartridges to
* @param ammoBoxDetails Item template from items db
*/
addSingleStackCartridgesToAmmoBox(ammoBox: Item[], ammoBoxDetails: ITemplateItem): void;
addSingleStackCartridgesToAmmoBox(ammoBox: IItem[], ammoBoxDetails: ITemplateItem): void;
/**
* Check if item is stored inside of a container
* @param item Item to check is inside of container
* @param itemToCheck Item to check is inside of container
* @param desiredContainerSlotId Name of slot to check item is in e.g. SecuredContainer/Backpack
* @param items Inventory with child parent items to check
* @returns True when item is in container
*/
itemIsInsideContainer(item: Item, desiredContainerSlotId: string, items: Item[]): boolean;
itemIsInsideContainer(itemToCheck: IItem, desiredContainerSlotId: string, items: IItem[]): boolean;
/**
* Add child items (cartridges) to a magazine
* @param magazine Magazine to add child items to
@ -399,15 +406,15 @@ export declare class ItemHelper {
* @param defaultCartridgeTpl Cartridge to use when none found
* @param weapon Weapon the magazine will be used for (if passed in uses Chamber as whitelist)
*/
fillMagazineWithRandomCartridge(magazine: Item[], magTemplate: ITemplateItem, staticAmmoDist: Record<string, IStaticAmmoDetails[]>, caliber?: string, minSizePercent?: number, defaultCartridgeTpl?: string, weapon?: ITemplateItem): void;
fillMagazineWithRandomCartridge(magazine: IItem[], magTemplate: ITemplateItem, staticAmmoDist: Record<string, IStaticAmmoDetails[]>, caliber?: string, minSizePercent?: number, defaultCartridgeTpl?: string, weapon?: ITemplateItem): void;
/**
* Add child items to a magazine of a specific cartridge
* @param magazineWithChildCartridges Magazine to add child items to
* @param magTemplate Db template of magazine
* @param cartridgeTpl Cartridge to add to magazine
* @param minSizePercent % the magazine must be filled to
* @param minSizeMultiplier % the magazine must be filled to
*/
fillMagazineWithCartridge(magazineWithChildCartridges: Item[], magTemplate: ITemplateItem, cartridgeTpl: string, minSizePercent?: number): void;
fillMagazineWithCartridge(magazineWithChildCartridges: IItem[], magTemplate: ITemplateItem, cartridgeTpl: string, minSizeMultiplier?: number): void;
/**
* Choose a random bullet type from the list of possible a magazine has
* @param magTemplate Magazine template from Db
@ -432,13 +439,13 @@ export declare class ItemHelper {
* @param foundInRaid OPTIONAL - Are cartridges found in raid (SpawnedInSession)
* @returns Item
*/
createCartridges(parentId: string, ammoTpl: string, stackCount: number, location: number, foundInRaid?: boolean): Item;
createCartridges(parentId: string, ammoTpl: string, stackCount: number, location: number, foundInRaid?: boolean): IItem;
/**
* Get the size of a stack, return 1 if no stack object count property found
* @param item Item to get stack size of
* @returns size of stack
*/
getItemStackSize(item: Item): number;
getItemStackSize(item: IItem): number;
/**
* Get the name of an item from the locale file using the item tpl
* @param itemTpl Tpl of item to get name of
@ -459,7 +466,7 @@ export declare class ItemHelper {
* @param requiredOnly Only add required mods
* @returns Item with children
*/
addChildSlotItems(itemToAdd: Item[], itemToAddTemplate: ITemplateItem, modSpawnChanceDict?: Record<string, number>, requiredOnly?: boolean): Item[];
addChildSlotItems(itemToAdd: IItem[], itemToAddTemplate: ITemplateItem, modSpawnChanceDict?: Record<string, number>, requiredOnly?: boolean): IItem[];
/**
* Get a compatible tpl from the array provided where it is not found in the provided incompatible mod tpls parameter
* @param possibleTpls Tpls to randomly choose from
@ -484,14 +491,14 @@ export declare class ItemHelper {
* @param itemWithChildren Primary item + children of primary item
* @returns Item array with updated IDs
*/
reparentItemAndChildren(rootItem: Item, itemWithChildren: Item[]): Item[];
reparentItemAndChildren(rootItem: IItem, itemWithChildren: IItem[]): IItem[];
/**
* Update a root items _id property value to be unique
* @param itemWithChildren Item to update root items _id property
* @param newId Optional: new id to use
* @returns New root id
*/
remapRootItemId(itemWithChildren: Item[], newId?: string): string;
remapRootItemId(itemWithChildren: IItem[], newId?: string): string;
/**
* Adopts orphaned items by resetting them as root "hideout" items. Helpful in situations where a parent has been
* deleted from a group of items and there are children still referencing the missing parent. This method will
@ -501,24 +508,42 @@ export declare class ItemHelper {
* @param items Array of Items that should be adjusted.
* @returns Array of Items that have been adopted.
*/
adoptOrphanedItems(rootId: string, items: Item[]): Item[];
adoptOrphanedItems(rootId: string, items: IItem[]): IItem[];
/**
* Populate a Map object of items for quick lookup using their ID.
*
* @param items An array of Items that should be added to a Map.
* @returns A Map where the keys are the item IDs and the values are the corresponding Item objects.
*/
generateItemsMap(items: Item[]): Map<string, Item>;
generateItemsMap(items: IItem[]): Map<string, IItem>;
/**
* Add a blank upd object to passed in item if it does not exist already
* @param item item to add upd to
* @param warningMessageWhenMissing text to write to log when upd object was not found
* @returns True when upd object was added
*/
addUpdObjectToItem(item: Item, warningMessageWhenMissing?: string): boolean;
addUpdObjectToItem(item: IItem, warningMessageWhenMissing?: string): boolean;
/**
* Return all tpls from Money enum
* @returns string tpls
*/
getMoneyTpls(): string[];
/**
* Get a randomsied stack size for the passed in ammo
* @param ammoItemTemplate Ammo to get stack size for
* @param maxLimit default: Limit to 60 to prevent crazy values when players use stack increase mods
* @returns number
*/
getRandomisedAmmoStackSize(ammoItemTemplate: ITemplateItem, maxLimit?: number): number;
getItemBaseType(tpl: string, rootOnly?: boolean): string;
/**
* Remove FiR status from passed in items
* @param items Items to update FiR status of
*/
removeSpawnedInSessionPropertyFromItems(items: IItem[]): void;
}
declare namespace ItemHelper {
interface ItemSize {
interface IItemSize {
width: number;
height: number;
}

View File

@ -1,4 +1,4 @@
import { Dialogue, IUserDialogInfo } from "@spt/models/eft/profile/ISptProfile";
import { IDialogue, IUserDialogInfo } from "@spt/models/eft/profile/ISptProfile";
import { IWsNotificationEvent } from "@spt/models/eft/ws/IWsNotificationEvent";
import { MessageType } from "@spt/models/enums/MessageType";
import { SaveServer } from "@spt/servers/SaveServer";
@ -32,5 +32,5 @@ export declare class NotificationSendHelper {
* @param senderDetails Who is sending the message
* @returns Dialogue
*/
protected getDialog(sessionId: string, messageType: MessageType, senderDetails: IUserDialogInfo): Dialogue;
protected getDialog(sessionId: string, messageType: MessageType, senderDetails: IUserDialogInfo): IDialogue;
}

View File

@ -1,5 +1,5 @@
import { HttpServerHelper } from "@spt/helpers/HttpServerHelper";
import { Message, MessageContentRagfair } from "@spt/models/eft/profile/ISptProfile";
import { IMessage, IMessageContentRagfair } from "@spt/models/eft/profile/ISptProfile";
import { IWsChatMessageReceived } from "@spt/models/eft/ws/IWsChatMessageReceived";
import { IWsNotificationEvent } from "@spt/models/eft/ws/IWsNotificationEvent";
import { IWsRagfairOfferSold } from "@spt/models/eft/ws/IWsRagfairOfferSold";
@ -17,12 +17,12 @@ export declare class NotifierHelper {
* @param ragfairData Ragfair data to attach to notification
* @returns
*/
createRagfairOfferSoldNotification(dialogueMessage: Message, ragfairData: MessageContentRagfair): IWsRagfairOfferSold;
createRagfairOfferSoldNotification(dialogueMessage: IMessage, ragfairData: IMessageContentRagfair): IWsRagfairOfferSold;
/**
* Create a new notification with the specified dialogueMessage object
* @param dialogueMessage
* @returns
*/
createNewMessageNotification(dialogueMessage: Message): IWsChatMessageReceived;
createNewMessageNotification(dialogueMessage: IMessage): IWsChatMessageReceived;
getWebSocketServer(sessionID: string): string;
}

View File

@ -40,9 +40,9 @@ export declare class PresetHelper {
getAllPresets(): IPreset[];
getPresets(templateId: string): IPreset[];
/**
* Get the default preset for passed in item id
* @param templateId Item id to get preset for
* @returns Null if no default preset, otherwise IPreset
* Get a cloned default preset for passed in item tpl
* @param templateId Item tpl to get preset for
* @returns undefined if no default preset, otherwise IPreset
*/
getDefaultPreset(templateId: string): IPreset | undefined;
getBaseItemTpl(presetId: string): string;

View File

@ -1,6 +1,7 @@
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Common, CounterKeyValue, Stats } from "@spt/models/eft/common/tables/IBotBase";
import { Common, ICounterKeyValue, IStats } from "@spt/models/eft/common/tables/IBotBase";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ISptProfile } from "@spt/models/eft/profile/ISptProfile";
import { IValidateNicknameRequestData } from "@spt/models/eft/profile/IValidateNicknameRequestData";
import { BonusType } from "@spt/models/enums/BonusType";
@ -11,7 +12,6 @@ import { ConfigServer } from "@spt/servers/ConfigServer";
import { SaveServer } from "@spt/servers/SaveServer";
import { DatabaseService } from "@spt/services/DatabaseService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { ProfileSnapshotService } from "@spt/services/ProfileSnapshotService";
import { HashUtil } from "@spt/utils/HashUtil";
import { TimeUtil } from "@spt/utils/TimeUtil";
import { Watermark } from "@spt/utils/Watermark";
@ -24,12 +24,11 @@ export declare class ProfileHelper {
protected saveServer: SaveServer;
protected databaseService: DatabaseService;
protected itemHelper: ItemHelper;
protected profileSnapshotService: ProfileSnapshotService;
protected localisationService: LocalisationService;
protected configServer: ConfigServer;
protected cloner: ICloner;
protected inventoryConfig: IInventoryConfig;
constructor(logger: ILogger, hashUtil: HashUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseService: DatabaseService, itemHelper: ItemHelper, profileSnapshotService: ProfileSnapshotService, localisationService: LocalisationService, configServer: ConfigServer, cloner: ICloner);
constructor(logger: ILogger, hashUtil: HashUtil, watermark: Watermark, timeUtil: TimeUtil, saveServer: SaveServer, databaseService: DatabaseService, itemHelper: ItemHelper, localisationService: LocalisationService, configServer: ConfigServer, cloner: ICloner);
/**
* Remove/reset a completed quest condtion from players profile quest data
* @param sessionID Session id
@ -48,18 +47,10 @@ export declare class ProfileHelper {
*/
getCompleteProfile(sessionId: string): IPmcData[];
/**
* Fix xp doubling on post-raid xp reward screen by sending a 'dummy' profile to the post-raid screen
* Server saves the post-raid changes prior to the xp screen getting the profile, this results in the xp screen using
* the now updated profile values as a base, meaning it shows x2 xp gained
* Instead, clone the post-raid profile (so we dont alter its values), apply the pre-raid xp values to the cloned objects and return
* Delete snapshot of pre-raid profile prior to returning profile data
* @param sessionId Session id
* @param output pmc and scav profiles array
* @param pmcProfile post-raid pmc profile
* @param scavProfile post-raid scav profile
* @returns Updated profile array
* Sanitize any information from the profile that the client does not expect to receive
* @param clonedProfile A clone of the full player profile
*/
protected postRaidXpWorkaroundFix(sessionId: string, pmcProfile: IPmcData, scavProfile: IPmcData, output: IPmcData[]): IPmcData[];
protected sanitizeProfileForClient(clonedProfile: ISptProfile): void;
/**
* Check if a nickname is used by another profile loaded by the server
* @param nicknameRequest nickname request object
@ -121,7 +112,7 @@ export declare class ProfileHelper {
* Get baseline counter values for a fresh profile
* @returns Default profile Stats object
*/
getDefaultCounters(): Stats;
getDefaultCounters(): IStats;
/**
* is this profile flagged for data removal
* @param sessionID Profile id
@ -155,7 +146,7 @@ export declare class ProfileHelper {
* @param counters Counters to search for key
* @param keyToIncrement Key
*/
incrementStatCounter(counters: CounterKeyValue[], keyToIncrement: string): void;
incrementStatCounter(counters: ICounterKeyValue[], keyToIncrement: string): void;
/**
* Check if player has a skill at elite level
* @param skillType Skill to check
@ -206,4 +197,16 @@ export declare class ProfileHelper {
*/
addAchievementToProfile(pmcProfile: IPmcData, achievementId: string): void;
hasAccessToRepeatableFreeRefreshSystem(pmcProfile: IPmcData): boolean;
/**
* Find a profiles "Pockets" item and replace its tpl with passed in value
* @param pmcProfile Player profile
* @param newPocketTpl New tpl to set profiles Pockets to
*/
replaceProfilePocketTpl(pmcProfile: IPmcData, newPocketTpl: string): void;
/**
* Return all quest items current in the supplied profile
* @param profile Profile to get quest items from
* @returns Array of item objects
*/
getQuestItemsInProfile(profile: IPmcData): IItem[];
}

View File

@ -8,10 +8,11 @@ import { RagfairServerHelper } from "@spt/helpers/RagfairServerHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Common, IQuestStatus } from "@spt/models/eft/common/tables/IBotBase";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IQuest, IQuestCondition, IQuestReward } from "@spt/models/eft/common/tables/IQuest";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { IAcceptQuestRequestData } from "@spt/models/eft/quests/IAcceptQuestRequestData";
import { ICompleteQuestRequestData } from "@spt/models/eft/quests/ICompleteQuestRequestData";
import { IFailQuestRequestData } from "@spt/models/eft/quests/IFailQuestRequestData";
import { QuestStatus } from "@spt/models/enums/QuestStatus";
import { IQuestConfig } from "@spt/models/spt/config/IQuestConfig";
@ -22,6 +23,7 @@ import { DatabaseService } from "@spt/services/DatabaseService";
import { LocaleService } from "@spt/services/LocaleService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { MailSendService } from "@spt/services/MailSendService";
import { PlayerService } from "@spt/services/PlayerService";
import { SeasonalEventService } from "@spt/services/SeasonalEventService";
import { HashUtil } from "@spt/utils/HashUtil";
import { TimeUtil } from "@spt/utils/TimeUtil";
@ -44,10 +46,11 @@ export declare class QuestHelper {
protected traderHelper: TraderHelper;
protected presetHelper: PresetHelper;
protected mailSendService: MailSendService;
protected playerService: PlayerService;
protected configServer: ConfigServer;
protected cloner: ICloner;
protected questConfig: IQuestConfig;
constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseService: DatabaseService, questConditionHelper: QuestConditionHelper, eventOutputHolder: EventOutputHolder, localeService: LocaleService, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, localisationService: LocalisationService, seasonalEventService: SeasonalEventService, traderHelper: TraderHelper, presetHelper: PresetHelper, mailSendService: MailSendService, configServer: ConfigServer, cloner: ICloner);
constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, itemHelper: ItemHelper, databaseService: DatabaseService, questConditionHelper: QuestConditionHelper, eventOutputHolder: EventOutputHolder, localeService: LocaleService, ragfairServerHelper: RagfairServerHelper, dialogueHelper: DialogueHelper, profileHelper: ProfileHelper, paymentHelper: PaymentHelper, localisationService: LocalisationService, seasonalEventService: SeasonalEventService, traderHelper: TraderHelper, presetHelper: PresetHelper, mailSendService: MailSendService, playerService: PlayerService, configServer: ConfigServer, cloner: ICloner);
/**
* Get status of a quest in player profile by its id
* @param pmcData Profile to search
@ -102,20 +105,20 @@ export declare class QuestHelper {
* @param questReward Reward item to fix
* @returns Fixed rewards
*/
protected processReward(questReward: IQuestReward): Item[];
protected processReward(questReward: IQuestReward): IItem[];
/**
* Add missing mod items to a quest armor reward
* @param originalRewardRootItem Original armor reward item from IQuestReward.items object
* @param questReward Armor reward from quest
*/
protected generateArmorRewardChildSlots(originalRewardRootItem: Item, questReward: IQuestReward): void;
protected generateArmorRewardChildSlots(originalRewardRootItem: IItem, questReward: IQuestReward): void;
/**
* Gets a flat list of reward items for the given quest at a specific state (e.g. Fail/Success)
* Gets a flat list of reward items for the given quest at a specific state for the specified game version (e.g. Fail/Success)
* @param quest quest to get rewards for
* @param status Quest status that holds the items (Started, Success, Fail)
* @returns array of items with the correct maxStack
*/
getQuestRewardItems(quest: IQuest, status: QuestStatus): Item[];
getQuestRewardItems(quest: IQuest, status: QuestStatus, gameVersion: string): IItem[];
/**
* Look up quest in db by accepted quest id and construct a profile-ready object ready to store in profile
* @param pmcData Player profile
@ -142,6 +145,22 @@ export declare class QuestHelper {
* @param questId QuestId to check
*/
questIsForOtherSide(playerSide: string, questId: string): boolean;
/**
* Is the provided quest prevented from being viewed by the provided game version
* (Inclusive filter)
* @param gameVersion Game version to check against
* @param questId Quest id to check
* @returns True Quest should not be visible to game version
*/
protected questIsProfileBlacklisted(gameVersion: string, questId: string): boolean;
/**
* Is the provided quest able to be seen by the provided game version
* (Exclusive filter)
* @param gameVersion Game version to check against
* @param questId Quest id to check
* @returns True Quest should be visible to game version
*/
protected questIsProfileWhitelisted(gameVersion: string, questId: string): boolean;
/**
* Get quests that can be shown to player after failing a quest
* @param failedQuestId Id of the quest failed by player
@ -152,7 +171,7 @@ export declare class QuestHelper {
/**
* Adjust quest money rewards by passed in multiplier
* @param quest Quest to multiple money rewards
* @param bonusPercent Value to adjust money rewards by
* @param bonusPercent Pecent to adjust money rewards by
* @param questStatus Status of quest to apply money boost to rewards of
* @returns Updated quest
*/
@ -173,7 +192,7 @@ export declare class QuestHelper {
* @param sessionId Session id
* @param item Item that was adjusted
*/
protected addItemStackSizeChangeIntoEventResponse(output: IItemEventRouterResponse, sessionId: string, item: Item): void;
protected addItemStackSizeChangeIntoEventResponse(output: IItemEventRouterResponse, sessionId: string, item: IItem): void;
/**
* Get quests, strip all requirement conditions except level
* @param quests quests to process
@ -243,7 +262,14 @@ export declare class QuestHelper {
* @param questResponse Response to send back to client
* @returns Array of reward objects
*/
applyQuestReward(profileData: IPmcData, questId: string, state: QuestStatus, sessionId: string, questResponse: IItemEventRouterResponse): Item[];
applyQuestReward(profileData: IPmcData, questId: string, state: QuestStatus, sessionId: string, questResponse: IItemEventRouterResponse): IItem[];
/**
* Does the provided quest reward have a game version requirement to be given and does it match
* @param reward Reward to check
* @param gameVersion Version of game to check reward against
* @returns True if it has requirement, false if it doesnt pass check
*/
protected questRewardIsForGameEdition(reward: IQuestReward, gameVersion: string): boolean;
/**
* WIP - Find hideout craft id and add to unlockedProductionRecipe array in player profile
* also update client response recipeUnlocked array with craft id
@ -259,7 +285,7 @@ export declare class QuestHelper {
* @param pmcData player profile
* @returns bonus as a percent
*/
protected getQuestMoneyRewardBonus(pmcData: IPmcData): number;
protected getQuestMoneyRewardBonusMultiplier(pmcData: IPmcData): number;
/**
* Find quest with 'findItem' condition that needs the item tpl be handed in
* @param itemTpl item tpl to look for
@ -286,4 +312,72 @@ export declare class QuestHelper {
* @returns Hours item will be available for
*/
getMailItemRedeemTimeHoursForProfile(pmcData: IPmcData): number;
completeQuest(pmcData: IPmcData, body: ICompleteQuestRequestData, sessionID: string): IItemEventRouterResponse;
/**
* Handle client/quest/list
* Get all quests visible to player
* Exclude quests with incomplete preconditions (level/loyalty)
* @param sessionID session id
* @returns array of IQuest
*/
getClientQuests(sessionID: string): IQuest[];
/**
* Create a clone of the given quest array with the rewards updated to reflect the
* given game version
*
* @param quests The list of quests to check
* @param gameVersion The game version of the profile
* @returns array of IQuest objects with the rewards filtered correctly for the game version
*/
protected updateQuestsForGameEdition(quests: IQuest[], gameVersion: string): IQuest[];
/**
* Return a list of quests that would fail when supplied quest is completed
* @param completedQuestId quest completed id
* @returns array of IQuest objects
*/
protected getQuestsFromProfileFailedByCompletingQuest(completedQuestId: string, pmcProfile: IPmcData): IQuest[];
/**
* Fail the provided quests
* Update quest in profile, otherwise add fresh quest object with failed status
* @param sessionID session id
* @param pmcData player profile
* @param questsToFail quests to fail
* @param output Client output
*/
protected failQuests(sessionID: string, pmcData: IPmcData, questsToFail: IQuest[], output: IItemEventRouterResponse): void;
/**
* Send a popup to player on successful completion of a quest
* @param sessionID session id
* @param pmcData Player profile
* @param completedQuestId Completed quest id
* @param questRewards Rewards given to player
*/
protected sendSuccessDialogMessageOnQuestComplete(sessionID: string, pmcData: IPmcData, completedQuestId: string, questRewards: IItem[]): void;
/**
* Look for newly available quests after completing a quest with a requirement to wait x minutes (time-locked) before being available and add data to profile
* @param pmcData Player profile to update
* @param quests Quests to look for wait conditions in
* @param completedQuestId Quest just completed
*/
protected addTimeLockedQuestsToProfile(pmcData: IPmcData, quests: IQuest[], completedQuestId: string): void;
/**
* Remove a quest entirely from a profile
* @param sessionId Player id
* @param questIdToRemove Qid of quest to remove
*/
protected removeQuestFromScavProfile(sessionId: string, questIdToRemove: string): void;
/**
* Return quests that have different statuses
* @param preQuestStatusus Quests before
* @param postQuestStatuses Quests after
* @returns QuestStatusChange array
*/
protected getQuestsWithDifferentStatuses(preQuestStatusus: IQuestStatus[], postQuestStatuses: IQuestStatus[]): IQuestStatus[] | undefined;
/**
* Does a provided quest have a level requirement equal to or below defined level
* @param quest Quest to check
* @param playerLevel level of player to test against quest
* @returns true if quest can be seen/accepted by player of defined level
*/
protected playerLevelFulfillsQuestRequirement(quest: IQuest, playerLevel: number): boolean;
}

View File

@ -2,7 +2,7 @@ import { HandbookHelper } from "@spt/helpers/HandbookHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { TraderAssortHelper } from "@spt/helpers/TraderAssortHelper";
import { UtilityHelper } from "@spt/helpers/UtilityHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITraderAssort } from "@spt/models/eft/common/tables/ITrader";
import { ISearchRequestData } from "@spt/models/eft/ragfair/ISearchRequestData";
import { IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
@ -36,7 +36,7 @@ export declare class RagfairHelper {
* Iterate over array of identical items and merge stack count
* Ragfair allows abnormally large stacks.
*/
mergeStackable(items: Item[]): Item[];
mergeStackable(items: IItem[]): IItem[];
/**
* Return the symbol for a currency
* e.g. 5449016a4bdc2d6f028b456f return

View File

@ -9,14 +9,15 @@ import { RagfairServerHelper } from "@spt/helpers/RagfairServerHelper";
import { RagfairSortHelper } from "@spt/helpers/RagfairSortHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITraderAssort } from "@spt/models/eft/common/tables/ITrader";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { ISptProfile } from "@spt/models/eft/profile/ISptProfile";
import { IRagfairOffer } from "@spt/models/eft/ragfair/IRagfairOffer";
import { ISearchRequestData } from "@spt/models/eft/ragfair/ISearchRequestData";
import { IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { IQuestConfig } from "@spt/models/spt/config/IQuestConfig";
import { IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
import { IRagfairConfig, ITieredFlea } from "@spt/models/spt/config/IRagfairConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { EventOutputHolder } from "@spt/routers/EventOutputHolder";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -55,6 +56,7 @@ export declare class RagfairOfferHelper {
protected static goodSoldTemplate: string;
protected ragfairConfig: IRagfairConfig;
protected questConfig: IQuestConfig;
protected botConfig: IBotConfig;
constructor(logger: ILogger, timeUtil: TimeUtil, hashUtil: HashUtil, eventOutputHolder: EventOutputHolder, databaseService: DatabaseService, traderHelper: TraderHelper, saveServer: SaveServer, itemHelper: ItemHelper, botHelper: BotHelper, paymentHelper: PaymentHelper, presetHelper: PresetHelper, profileHelper: ProfileHelper, questHelper: QuestHelper, ragfairServerHelper: RagfairServerHelper, ragfairSortHelper: RagfairSortHelper, ragfairHelper: RagfairHelper, ragfairOfferService: RagfairOfferService, ragfairRequiredItemsService: RagfairRequiredItemsService, localeService: LocaleService, localisationService: LocalisationService, mailSendService: MailSendService, configServer: ConfigServer);
/**
* Passthrough to ragfairOfferService.getOffers(), get flea offers a player should see
@ -65,6 +67,7 @@ export declare class RagfairOfferHelper {
* @returns Offers the player should see
*/
getValidOffers(searchRequest: ISearchRequestData, itemsToAdd: string[], traderAssorts: Record<string, ITraderAssort>, pmcData: IPmcData): IRagfairOffer[];
protected checkAndLockOfferFromPlayerTieredFlea(tieredFlea: ITieredFlea, offer: IRagfairOffer, tieredFleaLimitTypes: string[], playerLevel: number): void;
/**
* Get matching offers that require the desired item and filter out offers from non traders if player is below ragfair unlock level
* @param searchRequest Search request from client
@ -125,7 +128,7 @@ export declare class RagfairOfferHelper {
* @param itemsInInventoryToList items to sum up
* @returns Total count
*/
getTotalStackCountSize(itemsInInventoryToList: Item[][]): number;
getTotalStackCountSize(itemsInInventoryToList: IItem[][]): number;
/**
* Add amount to players ragfair rating
* @param sessionId Profile to update
@ -173,7 +176,7 @@ export declare class RagfairOfferHelper {
* @param offer The flea offer
* @returns True if the given item is functional
*/
isItemFunctional(offerRootItem: Item, offer: IRagfairOffer): boolean;
isItemFunctional(offerRootItem: IItem, offer: IRagfairOffer): boolean;
/**
* Should a ragfair offer be visible to the player
* @param searchRequest Search request
@ -190,7 +193,7 @@ export declare class RagfairOfferHelper {
* @param item Item to check
* @returns True if has condition
*/
protected isConditionItem(item: Item): boolean;
protected isConditionItem(item: IItem): boolean;
/**
* Is items quality value within desired range
* @param item Item to check quality of
@ -198,5 +201,5 @@ export declare class RagfairOfferHelper {
* @param max Desired maximum quality
* @returns True if in range
*/
protected itemQualityInRange(item: Item, min: number, max: number): boolean;
protected itemQualityInRange(item: IItem, min: number, max: number): boolean;
}

View File

@ -1,4 +1,4 @@
import { SellResult } from "@spt/models/eft/ragfair/IRagfairOffer";
import { ISellResult } from "@spt/models/eft/ragfair/IRagfairOffer";
import { IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -28,5 +28,5 @@ export declare class RagfairSellHelper {
* @param sellInOneGo All items listed get sold at once
* @returns Array of purchases of item(s) listed
*/
rollForSale(sellChancePercent: number, itemSellCount: number, sellInOneGo?: boolean): SellResult[];
rollForSale(sellChancePercent: number, itemSellCount: number, sellInOneGo?: boolean): ISellResult[];
}

View File

@ -1,7 +1,7 @@
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { IQuestConfig } from "@spt/models/spt/config/IQuestConfig";
import { IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
@ -65,7 +65,7 @@ export declare class RagfairServerHelper {
* @param sessionID Player to send items to
* @param returnedItems Items to send to player
*/
returnItems(sessionID: string, returnedItems: Item[]): void;
returnItems(sessionID: string, returnedItems: IItem[]): void;
calculateDynamicStackCount(tplId: string, isWeaponPreset: boolean): number;
/**
* Choose a currency at random with bias
@ -77,11 +77,11 @@ export declare class RagfairServerHelper {
* @param item Preset item
* @returns Array of weapon and its children
*/
getPresetItems(item: Item): Item[];
getPresetItems(item: IItem): IItem[];
/**
* Possible bug, returns all items associated with an items tpl, could be multiple presets from globals.json
* @param item Preset item
* @returns
*/
getPresetItemsByTpl(item: Item): Item[];
getPresetItemsByTpl(item: IItem): IItem[];
}

View File

@ -1,5 +1,5 @@
import { Item } from "@spt/models/eft/common/tables/IItem";
import { ITemplateItem, Props } from "@spt/models/eft/common/tables/ITemplateItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IProps, ITemplateItem } from "@spt/models/eft/common/tables/ITemplateItem";
import { IRepairConfig } from "@spt/models/spt/config/IRepairConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
@ -24,7 +24,7 @@ export declare class RepairHelper {
* @param traderQualityMultipler Trader quality value from traders base json
* @param applyMaxDurabilityDegradation should item have max durability reduced
*/
updateItemDurability(itemToRepair: Item, itemToRepairDetails: ITemplateItem, isArmor: boolean, amountToRepair: number, useRepairKit: boolean, traderQualityMultipler: number, applyMaxDurabilityDegradation?: boolean): void;
updateItemDurability(itemToRepair: IItem, itemToRepairDetails: ITemplateItem, isArmor: boolean, amountToRepair: number, useRepairKit: boolean, traderQualityMultipler: number, applyMaxDurabilityDegradation?: boolean): void;
/**
* Repairing armor reduces the total durability value slightly, get a randomised (to 2dp) amount based on armor material
* @param armorMaterial What material is the armor being repaired made of
@ -42,5 +42,5 @@ export declare class RepairHelper {
* @param traderQualityMultipler Different traders produce different loss values
* @returns Amount to reduce max durability by
*/
protected getRandomisedWeaponRepairDegradationValue(itemProps: Props, isRepairKit: boolean, weaponMax: number, traderQualityMultipler: number): number;
protected getRandomisedWeaponRepairDegradationValue(itemProps: IProps, isRepairKit: boolean, weaponMax: number, traderQualityMultipler: number): number;
}

View File

@ -1,8 +1,8 @@
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
export interface OwnerInventoryItems {
from: Item[];
to: Item[];
import { IItem } from "@spt/models/eft/common/tables/IItem";
export interface IOwnerInventoryItems {
from: IItem[];
to: IItem[];
sameInventory: boolean;
isMail: boolean;
}
@ -14,5 +14,5 @@ export declare class SecureContainerHelper {
* @param items Inventory items to look for secure container in
* @returns Array of ids
*/
getSecureContainerItems(items: Item[]): string[];
getSecureContainerItems(items: IItem[]): string[];
}

View File

@ -3,7 +3,7 @@ import { ItemHelper } from "@spt/helpers/ItemHelper";
import { TraderAssortHelper } from "@spt/helpers/TraderAssortHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
import { IProcessBuyTradeRequestData } from "@spt/models/eft/trade/IProcessBuyTradeRequestData";
import { IProcessSellTradeRequestData } from "@spt/models/eft/trade/IProcessSellTradeRequestData";
@ -13,6 +13,7 @@ import { ILogger } from "@spt/models/spt/utils/ILogger";
import { EventOutputHolder } from "@spt/routers/EventOutputHolder";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { RagfairServer } from "@spt/servers/RagfairServer";
import { DatabaseService } from "@spt/services/DatabaseService";
import { FenceService } from "@spt/services/FenceService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { PaymentService } from "@spt/services/PaymentService";
@ -21,6 +22,7 @@ import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
import { ICloner } from "@spt/utils/cloners/ICloner";
export declare class TradeHelper {
protected logger: ILogger;
protected databaseService: DatabaseService;
protected eventOutputHolder: EventOutputHolder;
protected traderHelper: TraderHelper;
protected itemHelper: ItemHelper;
@ -36,7 +38,7 @@ export declare class TradeHelper {
protected cloner: ICloner;
protected traderConfig: ITraderConfig;
protected inventoryConfig: IInventoryConfig;
constructor(logger: ILogger, eventOutputHolder: EventOutputHolder, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, localisationService: LocalisationService, httpResponse: HttpResponseUtil, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer, traderAssortHelper: TraderAssortHelper, traderPurchasePersisterService: TraderPurchasePersisterService, configServer: ConfigServer, cloner: ICloner);
constructor(logger: ILogger, databaseService: DatabaseService, eventOutputHolder: EventOutputHolder, traderHelper: TraderHelper, itemHelper: ItemHelper, paymentService: PaymentService, fenceService: FenceService, localisationService: LocalisationService, httpResponse: HttpResponseUtil, inventoryHelper: InventoryHelper, ragfairServer: RagfairServer, traderAssortHelper: TraderAssortHelper, traderPurchasePersisterService: TraderPurchasePersisterService, configServer: ConfigServer, cloner: ICloner);
/**
* Buy item from flea or trader
* @param pmcData Player profile
@ -56,6 +58,7 @@ export declare class TradeHelper {
* @param output IItemEventRouterResponse
*/
sellItem(profileWithItemsToSell: IPmcData, profileToReceiveMoney: IPmcData, sellRequest: IProcessSellTradeRequestData, sessionID: string, output: IItemEventRouterResponse): void;
protected incrementCirculateSoldToTraderCounter(profileWithItemsToSell: IPmcData, profileToReceiveMoney: IPmcData, sellRequest: IProcessSellTradeRequestData): void;
/**
* Traders allow a limited number of purchases per refresh cycle (default 60 mins)
* @param sessionId Session id
@ -65,5 +68,5 @@ export declare class TradeHelper {
* @param assortId Id of assort being purchased
* @param count How many of the item are being bought
*/
protected checkPurchaseIsWithinTraderItemLimit(sessionId: string, pmcData: IPmcData, traderId: string, assortBeingPurchased: Item, assortId: string, count: number): void;
protected checkPurchaseIsWithinTraderItemLimit(sessionId: string, pmcData: IPmcData, traderId: string, assortBeingPurchased: IItem, assortId: string, count: number): void;
}

View File

@ -4,7 +4,7 @@ import { AssortHelper } from "@spt/helpers/AssortHelper";
import { PaymentHelper } from "@spt/helpers/PaymentHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { TraderHelper } from "@spt/helpers/TraderHelper";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { ITrader, ITraderAssort } from "@spt/models/eft/common/tables/ITrader";
import { ITraderConfig } from "@spt/models/spt/config/ITraderConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
@ -58,7 +58,7 @@ export declare class TraderAssortHelper {
* Reset every traders root item `BuyRestrictionCurrent` property to 0
* @param assortItems Items to adjust
*/
protected resetBuyRestrictionCurrentValue(assortItems: Item[]): void;
protected resetBuyRestrictionCurrentValue(assortItems: IItem[]): void;
/**
* Create a dict of all assort id = quest id mappings used to work out what items should be shown to player based on the quests they've started/completed/failed
*/
@ -85,7 +85,7 @@ export declare class TraderAssortHelper {
* @param traderId trader id
* @returns array of Items
*/
protected getPristineTraderAssorts(traderId: string): Item[];
protected getPristineTraderAssorts(traderId: string): IItem[];
/**
* Returns generated ragfair offers in a trader assort format
* @returns Trader assort object

View File

@ -2,9 +2,9 @@ import { HandbookHelper } from "@spt/helpers/HandbookHelper";
import { ItemHelper } from "@spt/helpers/ItemHelper";
import { ProfileHelper } from "@spt/helpers/ProfileHelper";
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { ProfileTraderTemplate } from "@spt/models/eft/common/tables/IProfileTemplate";
import { ITraderAssort, ITraderBase, LoyaltyLevel } from "@spt/models/eft/common/tables/ITrader";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { IProfileTraderTemplate } from "@spt/models/eft/common/tables/IProfileTemplate";
import { ITraderAssort, ITraderBase, ITraderLoyaltyLevel } from "@spt/models/eft/common/tables/ITrader";
import { ISptProfile } from "@spt/models/eft/profile/ISptProfile";
import { Traders } from "@spt/models/enums/Traders";
import { ITraderConfig } from "@spt/models/spt/config/ITraderConfig";
@ -39,7 +39,7 @@ export declare class TraderHelper {
* @param sessionID Players id
* @returns Trader base
*/
getTrader(traderID: string, sessionID: string): ITraderBase | undefined;
getTrader(traderID: string, sessionID: string): ITraderBase | any;
/**
* Get all assort data for a particular trader
* @param traderId Trader to get assorts for
@ -52,7 +52,7 @@ export declare class TraderHelper {
* @param assortId Id of assort to find
* @returns Item object
*/
getTraderAssortItemByAssortId(traderId: string, assortId: string): Item | undefined;
getTraderAssortItemByAssortId(traderId: string, assortId: string): IItem | undefined;
/**
* Reset a profiles trader data back to its initial state as seen by a level 1 player
* Does NOT take into account different profile levels
@ -66,7 +66,7 @@ export declare class TraderHelper {
* @param rawProfileTemplate Raw profile from profiles.json to look up standing from
* @returns Standing value
*/
protected getStartingStanding(traderId: string, rawProfileTemplate: ProfileTraderTemplate): number;
protected getStartingStanding(traderId: string, rawProfileTemplate: IProfileTraderTemplate): number;
/**
* Add an array of suit ids to a profiles suit array, no duplicates
* @param fullProfile Profile to add to
@ -118,7 +118,7 @@ export declare class TraderHelper {
* @returns Time in seconds
*/
getTraderUpdateSeconds(traderId: string): number | undefined;
getLoyaltyLevel(traderID: string, pmcData: IPmcData): LoyaltyLevel;
getLoyaltyLevel(traderID: string, pmcData: IPmcData): ITraderLoyaltyLevel;
/**
* Store the purchase of an assort from a trader in the player profile
* @param sessionID Session id
@ -130,7 +130,7 @@ export declare class TraderHelper {
count: number;
}[];
traderId: string;
}, itemPurchased: Item): void;
}, itemPurchased: IItem): void;
/**
* EoD and Unheard get a 20% bonus to personal trader limit purchases
* @param buyRestrictionMax Existing value from trader item

View File

@ -0,0 +1,25 @@
import { DateTime } from "@spt/models/enums/DateTime";
import { IWeatherConfig } from "@spt/models/spt/config/IWeatherConfig";
import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer";
import { TimeUtil } from "@spt/utils/TimeUtil";
export declare class WeatherHelper {
protected logger: ILogger;
protected timeUtil: TimeUtil;
protected configServer: ConfigServer;
protected weatherConfig: IWeatherConfig;
constructor(logger: ILogger, timeUtil: TimeUtil, configServer: ConfigServer);
/**
* Get the current in-raid time - does not include an accurate date, only time
* @param currentDate (new Date())
* @returns Date object of current in-raid time
*/
getInRaidTime(timestamp?: number): Date;
/**
* Is the current raid at nighttime
* @param timeVariant PASS OR CURR (from raid settings)
* @returns True when nighttime
*/
isNightTime(timeVariant: DateTime): boolean;
isHourAtNightTime(currentHour: number): boolean;
}

View File

@ -1,13 +1,4 @@
export declare class WeightedRandomHelper {
/**
* @deprecated USE getWeightedValue() WHERE POSSIBLE
* Gets a tplId from a weighted dictionary
* @param {tplId: weighting[]} itemArray
* @returns tplId
*/
getWeightedInventoryItem(itemArray: {
[tplId: string]: unknown;
} | ArrayLike<unknown>): string;
/**
* Choos an item from the passed in array based on the weightings of each
* @param itemArray Items and weights to use

View File

@ -8,7 +8,7 @@ export declare class BundleInfo {
filename: string;
crc: number;
dependencies: string[];
constructor(modpath: string, bundle: BundleManifestEntry, bundleHash: number);
constructor(modpath: string, bundle: IBundleManifestEntry, bundleHash: number);
}
export declare class BundleLoader {
protected httpServerHelper: HttpServerHelper;
@ -26,10 +26,10 @@ export declare class BundleLoader {
addBundles(modpath: string): void;
addBundle(key: string, b: BundleInfo): void;
}
export interface BundleManifest {
manifest: BundleManifestEntry[];
export interface IBundleManifest {
manifest: IBundleManifestEntry[];
}
export interface BundleManifestEntry {
export interface IBundleManifestEntry {
key: string;
dependencyKeys: string[];
}

View File

@ -1,6 +1,6 @@
import { ModLoadOrder } from "@spt/loaders/ModLoadOrder";
import { ModTypeCheck } from "@spt/loaders/ModTypeCheck";
import { ModDetails } from "@spt/models/eft/profile/ISptProfile";
import { IModDetails } from "@spt/models/eft/profile/ISptProfile";
import { ICoreConfig } from "@spt/models/spt/config/ICoreConfig";
import { IModLoader } from "@spt/models/spt/mod/IModLoader";
import { IPackageJsonData } from "@spt/models/spt/mod/IPackageJsonData";
@ -36,7 +36,7 @@ export declare class PreSptModLoader implements IModLoader {
*/
getImportedModsNames(): string[];
getImportedModDetails(): Record<string, IPackageJsonData>;
getProfileModsGroupedByModName(profileMods: ModDetails[]): ModDetails[];
getProfileModsGroupedByModName(profileMods: IModDetails[]): IModDetails[];
getModPath(mod: string): string;
protected importModsAsync(): Promise<void>;
protected sortMods(prev: string, next: string, missingFromOrderJSON: Record<string, boolean>): number;

View File

@ -1,7 +1,7 @@
export interface IGenerateBotsRequestData {
conditions: Condition[];
conditions: ICondition[];
}
export interface Condition {
export interface ICondition {
/** e.g. assault/pmcBot/bossKilla */
Role: string;
Limit: number;

View File

@ -1,15 +1,101 @@
import { Ixyz } from "@spt/models/eft/common/Ixyz";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
export interface IGlobals {
time: number;
config: IConfig;
LocationInfection: ILocationInfection;
bot_presets: IBotPreset[];
AudioSettings: IAudioSettings;
EnvironmentSettings: IEnvironmentSettings;
BotWeaponScatterings: IBotWeaponScattering[];
ItemPresets: Record<string, IPreset>;
}
export interface ILocationInfection {
Interchange: number;
Lighthouse: number;
RezervBase: number;
Sandbox: number;
Shoreline: number;
TarkovStreets: number;
Woods: number;
bigmap: number;
factory4: number;
laboratory: number;
}
export interface IArtilleryShelling {
ArtilleryMapsConfigs: Record<string, IArtilleryMapSettings>;
ProjectileExplosionParams: IProjectileExplosionParams;
MaxCalledShellingCount: number;
}
export interface IArtilleryMapSettings {
PlanedShellingOn: boolean;
InitShellingTimer: number;
BeforeShellingSignalTime: number;
ShellingCount: number;
ZonesInShelling: number;
NewZonesForEachShelling: boolean;
InitCalledShellingTime: number;
ShellingZones: IShellingZone[];
Brigades: IBrigade[];
ArtilleryShellingAirDropSettings: IArtilleryShellingAirDropSettings;
PauseBetweenShellings: Ixyz;
}
export interface IShellingZone {
ID: number;
PointsInShellings: Ixyz;
ShellingRounds: number;
ShotCount: number;
PauseBetweenRounds: Ixyz;
PauseBetweenShots: Ixyz;
Center: Ixyz;
Rotate: number;
GridStep: Ixyz;
Points: Ixyz;
PointRadius: number;
ExplosionDistanceRange: Ixyz;
AlarmStages: IAlarmStage[];
BeforeShellingSignalTime: number;
UsedInPlanedShelling: boolean;
UseInCalledShelling: boolean;
IsActive: boolean;
}
export interface IAlarmStage {
Value: {
x: number;
y: number;
};
}
export interface IBrigade {
ID: number;
ArtilleryGuns: IArtilleryGun[];
}
export interface IArtilleryGun {
Position: Ixyz;
}
export interface IArtilleryShellingAirDropSettings {
UseAirDrop: boolean;
AirDropTime: number;
AirDropPosition: Ixyz;
LootTemplateId: string;
}
export interface IProjectileExplosionParams {
Blindness: Ixyz;
Contusion: Ixyz;
ArmorDistanceDistanceDamage: Ixyz;
MinExplosionDistance: number;
MaxExplosionDistance: number;
FragmentsCount: number;
Strength: number;
ArmorDamage: number;
StaminaBurnRate: number;
PenetrationPower: number;
DirectionalDamageAngle: number;
DirectionalDamageMultiplier: number;
FragmentType: string;
DeadlyDistance: number;
}
export interface IConfig {
ArtilleryShelling: IArtilleryShelling;
content: IContent;
AimPunchMagnitude: number;
WeaponSkillProgressRate: number;
@ -23,14 +109,19 @@ export interface IConfig {
MaxBotsAliveOnMapPvE: number;
SavagePlayCooldown: number;
SavagePlayCooldownNdaFree: number;
SeasonActivity: ISeasonActivity;
MarksmanAccuracy: number;
SavagePlayCooldownDevelop: number;
TODSkyDate: string;
Mastering: IMastering[];
GlobalItemPriceModifier: number;
TradingUnlimitedItems: boolean;
TransitSettings: ITransitSettings;
TripwiresSettings: ITripwiresSettings;
MaxLoyaltyLevelForAll: boolean;
MountingSettings: IMountingSettings;
GlobalLootChanceModifier: number;
GlobalLootChanceModifierPvE: number;
GraphicSettings: IGraphicSettings;
TimeBeforeDeploy: number;
TimeBeforeDeployLocal: number;
@ -47,8 +138,10 @@ export interface IConfig {
UncheckOnShot: boolean;
BotsEnabled: boolean;
BufferZone: IBufferZone;
Airdrop: IAirdropGlobalSettings;
ArmorMaterials: IArmorMaterials;
ArenaEftTransferSettings: IArenaEftTransferSettings;
KarmaCalculationSettings: IKarmaCalculationSettings;
LegsOverdamage: number;
HandsOverdamage: number;
StomachOverdamage: number;
@ -103,6 +196,14 @@ export interface IConfig {
Ballistic: IBallistic;
RepairSettings: IRepairSettings;
}
export interface ISeasonActivity {
InfectionHalloween: ISeasonActivityHalloween;
}
export interface ISeasonActivityHalloween {
DisplayUIEnabled: boolean;
Enabled: boolean;
ZombieBleedMul: number;
}
export interface IEnvironmentSetting2 {
EnvironmentUIData: IEnvironmentUIData;
}
@ -173,6 +274,81 @@ export interface IEventWeather {
Wind: number;
WindDirection: number;
}
export interface ITransitSettings {
BearPriceMod: number;
ClearAllPlayerEffectsOnTransit: boolean;
CoefficientDiscountCharisma: number;
DeliveryMinPrice: number;
DeliveryPrice: number;
ModDeliveryCost: number;
PercentageOfMissingEnergyRestore: number;
PercentageOfMissingHealthRestore: number;
PercentageOfMissingWaterRestore: number;
RestoreHealthOnDestroyedParts: boolean;
ScavPriceMod: number;
UsecPriceMod: number;
active: boolean;
}
export interface ITripwiresSettings {
CollisionCapsuleCheckCoef: number;
CollisionCapsuleRadius: number;
DefuseTimeSeconds: number;
DestroyedSeconds: number;
GroundDotProductTolerance: number;
InertSeconds: number;
InteractionSqrDistance: number;
MaxHeightDifference: number;
MaxLength: number;
MaxPreviewLength: number;
MaxTripwireToPlayerDistance: number;
MinLength: number;
MultitoolDefuseTimeSeconds: number;
ShotSqrDistance: number;
}
export interface IMountingSettings {
MovementSettings: IMountingMovementSettings;
PointDetectionSettings: IMountingPointDetectionSettings;
}
export interface IMountingMovementSettings {
ApproachTime: number;
ApproachTimeDeltaAngleModifier: number;
ExitTime: number;
MaxApproachTime: number;
MaxPitchLimitExcess: number;
MaxVerticalMountAngle: number;
MaxYawLimitExcess: number;
MinApproachTime: number;
MountingCameraSpeed: number;
MountingSwayFactorModifier: number;
PitchLimitHorizontal: Ixyz;
PitchLimitHorizontalBipod: Ixyz;
PitchLimitVertical: Ixyz;
RotationSpeedClamp: number;
SensitivityMultiplier: number;
}
export interface IMountingPointDetectionSettings {
CheckHorizontalSecondaryOffset: number;
CheckWallOffset: number;
EdgeDetectionDistance: number;
GridMaxHeight: number;
GridMinHeight: number;
HorizontalGridFromTopOffset: number;
HorizontalGridSize: number;
HorizontalGridStepsAmount: number;
MaxFramesForRaycast: number;
MaxHorizontalMountAngleDotDelta: number;
MaxProneMountAngleDotDelta: number;
MaxVerticalMountAngleDotDelta: number;
PointHorizontalMountOffset: number;
PointVerticalMountOffset: number;
RaycastDistance: number;
SecondCheckVerticalDistance: number;
SecondCheckVerticalGridOffset: number;
SecondCheckVerticalGridSize: number;
SecondCheckVerticalGridSizeStepsAmount: number;
VerticalGridSize: number;
VerticalGridStepsAmount: number;
}
export interface IGraphicSettings {
ExperimentalFogInCity: boolean;
}
@ -229,6 +405,8 @@ export interface IMatchEnd {
survivedMult: number;
runnerMult: number;
killedMult: number;
transit_exp_reward: number;
transit_mult: number[][];
}
export interface IKill {
combo: ICombo[];
@ -392,10 +570,30 @@ export interface IBodyParts {
Feet: string;
Hands: string;
}
export interface IArenaEftTransferSettings {
ArenaEftTransferSettings: ArenaEftTransferSettings;
export interface IAirdropGlobalSettings {
ParachuteEndOpenHeight: number;
ParachuteStartOpenHeight: number;
PlaneAdditionalDistance: number;
PlaneAirdropDuration: number;
PlaneAirdropFlareWait: number;
PlaneAirdropSmoke: number;
PlaneMaxFlightHeight: number;
PlaneMinFlightHeight: number;
PlaneSpeed: number;
SmokeActivateHeight: number;
}
export interface ArenaEftTransferSettings {
export interface IKarmaCalculationSettings {
defaultPveKarmaValue: number;
enable: boolean;
expireDaysAfterLastRaid: number;
maxKarmaThresholdPercentile: number;
minKarmaThresholdPercentile: number;
minSurvivedRaidCount: number;
}
export interface IArenaEftTransferSettings {
ArenaEftTransferSettings: IArenaEftTransferSettings;
}
export interface IArenaEftTransferSettings {
ArenaManagerReputationTaxMultiplier: number;
CharismaTaxMultiplier: number;
CreditPriceTaxMultiplier: number;
@ -459,6 +657,12 @@ export interface IEffects {
HeavyBleeding: IHeavyBleeding;
LightBleeding: ILightBleeding;
BodyTemperature: IBodyTemperature;
ZombieInfection: IZombieInfection;
}
export interface IZombieInfection {
Dehydration: number;
HearingDebuffPercentage: number;
СumulativeTime: number;
}
export interface IExistence {
EnergyLoopTime: number;
@ -805,6 +1009,7 @@ export interface IRagFair {
balancerAveragePriceCoefficient: number;
delaySinceOfferAdd: number;
uniqueBuyerTimeoutInDays: number;
userRatingChangeFrequencyMultiplayer: number;
ratingSumForIncrease: number;
ratingIncreaseCount: number;
ratingSumForDecrease: number;
@ -813,6 +1018,7 @@ export interface IRagFair {
maxSumForDecreaseRatingPerOneSale: number;
maxSumForRarity: IMaxSumForRarity;
ChangePriceCoef: number;
ItemRestrictions: IItemGlobalRestrictions[];
balancerUserItemSaleCooldownEnabled: boolean;
balancerUserItemSaleCooldown: number;
youSellOfferMaxStorageTimeInHour: number;
@ -820,11 +1026,15 @@ export interface IRagFair {
isOnlyFoundInRaidAllowed: boolean;
sellInOnePiece: number;
}
export interface IItemGlobalRestrictions {
MaxFlea: number;
MaxFleaStacked: number;
TemplateId: string;
}
export interface IMaxActiveOfferCount {
from: number;
to: number;
count: number;
countForSpecialEditions: number;
}
export interface IMaxSumForRarity {
Common: IRarityMaxSum;
@ -842,7 +1052,10 @@ export interface IStamina {
Capacity: number;
SprintDrainRate: number;
BaseRestorationRate: number;
BipodAimDrainRateMultiplier: number;
JumpConsumption: number;
MountingHorizontalAimDrainRateMultiplier: number;
MountingVerticalAimDrainRateMultiplier: number;
GrenadeHighThrow: number;
GrenadeLowThrow: number;
AimDrainRate: number;
@ -913,8 +1126,9 @@ export interface IAlpinist {
RequirementTip: string;
}
export interface IRestrictionsInRaid {
MaxInLobby: number;
MaxInRaid: number;
TemplateId: string;
Value: number;
}
export interface IFavoriteItemsSettings {
WeaponStandMaxItemsCount: number;
@ -1013,10 +1227,12 @@ export interface ISquadSettings {
SendRequestDelaySeconds: number;
}
export interface IInsurance {
ChangeForReturnItemsInOfflineRaid: number;
MaxStorageTimeInHour: number;
CoefOfSendingMessageTime: number;
CoefOfHavingMarkOfUnknown: number;
EditionSendingMessageTime: Record<string, IMessageSendTImeMultipler>;
OnlyInDeathCase: boolean;
}
export interface IMessageSendTImeMultipler {
multiplier: number;
@ -1028,6 +1244,7 @@ export interface ISkillsSettings {
HideoutManagement: IHideoutManagement;
Crafting: ICrafting;
Metabolism: IMetabolism;
MountingErgonomicsBonusPerLevel: number;
Immunity: Immunity;
Endurance: IEndurance;
Strength: IStrength;
@ -1053,6 +1270,7 @@ export interface ISkillsSettings {
BearAksystems: any[];
BearHeavycaliber: any[];
BearRawpower: any[];
BipodErgonomicsBonusPerLevel: number;
UsecArsystems: any[];
UsecDeepweaponmodding_Settings: any[];
UsecLongrangeoptics_Settings: any[];
@ -1112,6 +1330,7 @@ export interface IArmorCounters {
export interface IHideoutManagement {
SkillPointsPerAreaUpgrade: number;
SkillPointsPerCraft: number;
CircleOfCultistsBonusPercent: number;
ConsumptionReductionPerLevel: number;
SkillBoostPercent: number;
SkillPointsRate: ISkillPointsRate;
@ -1417,6 +1636,7 @@ export interface IFenceLevel {
PaidExitCostModifier: number;
BotFollowChance: number;
ScavEquipmentSpawnChanceModifier: number;
TransitGridSize: Ixyz;
PriceModifier: number;
HostileBosses: boolean;
HostileScavs: boolean;
@ -1435,6 +1655,7 @@ export interface IFenceLevel {
ReactOnMarkOnUnknownsPVE: boolean;
DeliveryGridSize: Ixyz;
CanInteractWithBtr: boolean;
CircleOfCultistsBonusPercent: number;
}
export interface IInertia {
InertiaLimits: Ixyz;
@ -1550,7 +1771,7 @@ export interface IPreset {
_changeWeaponName: boolean;
_name: string;
_parent: string;
_items: Item[];
_items: IItem[];
/** Default presets have this property */
_encyclopedia?: string;
}

View File

@ -1,7 +1,7 @@
import { Exit, ILocationBase } from "@spt/models/eft/common/ILocationBase";
import { ILooseLoot } from "@spt/models/eft/common/ILooseLoot";
import { IExit, ILocationBase } from "@spt/models/eft/common/ILocationBase";
import { IGroupPostion, ILooseLoot } from "@spt/models/eft/common/ILooseLoot";
import { Ixyz } from "@spt/models/eft/common/Ixyz";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
export interface ILocation {
/** Map meta-data */
base: ILocationBase;
@ -15,7 +15,7 @@ export interface ILocation {
/** All possible static containers on map + their assign groupings */
statics: IStaticContainer;
/** All possible map extracts */
allExtracts: Exit[];
allExtracts: IExit[];
}
export interface IStaticContainer {
containersGroups: Record<string, IContainerMinMax>;
@ -51,12 +51,12 @@ export interface IStaticPropsBase {
Rotation: Ixyz;
IsGroupPosition: boolean;
IsAlwaysSpawn: boolean;
GroupPositions: any[];
GroupPositions: IGroupPostion[];
Root: string;
Items: any[];
Items: IItem[];
}
export interface IStaticWeaponProps extends IStaticPropsBase {
Items: Item[];
Items: IItem[];
}
export interface IStaticContainerDetails {
staticWeapons: IStaticWeaponProps[];
@ -76,9 +76,9 @@ export interface IStaticForcedProps {
itemTpl: string;
}
export interface IStaticContainerProps extends IStaticPropsBase {
Items: StaticItem[];
Items: IStaticItem[];
}
export interface StaticItem {
export interface IStaticItem {
_id: string;
_tpl: string;
}

View File

@ -1,18 +1,20 @@
import { MinMax } from "@spt/models/common/MinMax";
import { Ixyz } from "@spt/models/eft/common/Ixyz";
import { ISpawnpointTemplate } from "./ILooseLoot";
export interface ILocationBase {
AccessKeys: string[];
AirdropParameters: AirdropParameter[];
AccessKeysPvE: string[];
AirdropParameters: IAirdropParameter[];
Area: number;
AveragePlayTime: number;
AveragePlayerLevel: number;
Banners: Banner[];
BossLocationSpawn: BossLocationSpawn[];
Banners: IBanner[];
BossLocationSpawn: IBossLocationSpawn[];
BotAssault: number;
BotEasy: number;
BotHard: number;
BotImpossible: number;
BotLocationModifier: BotLocationModifier;
BotLocationModifier: IBotLocationModifier;
BotMarksman: number;
BotMax: number;
BotMaxPlayer: number;
@ -41,14 +43,14 @@ export interface ILocationBase {
Insurance: boolean;
IsSecret: boolean;
Locked: boolean;
Loot: any[];
MatchMakerMinPlayersByWaitTime: MinPlayerWaitTime[];
Loot: ISpawnpointTemplate[];
MatchMakerMinPlayersByWaitTime: IMinPlayerWaitTime[];
MaxBotPerZone: number;
MaxDistToFreePoint: number;
MaxPlayers: number;
MinDistToExitPoint: number;
MinDistToFreePoint: number;
MinMaxBots: MinMaxBot[];
MinMaxBots: IMinMaxBot[];
MinPlayers: number;
MaxCoopGroup: number;
Name: string;
@ -57,7 +59,7 @@ export interface ILocationBase {
OcculsionCullingEnabled: boolean;
OldSpawn: boolean;
OpenZones: string;
Preview: Preview;
Preview: IPreview;
PlayersRequestCount: number;
RequiredPlayerLevel?: number;
RequiredPlayerLevelMin?: number;
@ -67,30 +69,44 @@ export interface ILocationBase {
ScavMaxPlayersInGroup: number;
Rules: string;
SafeLocation: boolean;
Scene: Scene;
SpawnPointParams: SpawnPointParam[];
Scene: IScene;
SpawnPointParams: ISpawnPointParam[];
UnixDateTime: number;
_Id: string;
doors: any[];
EscapeTimeLimit: number;
EscapeTimeLimitCoop: number;
EscapeTimeLimitPVE: number;
Events: ILocationEvents;
exit_access_time: number;
ForceOnlineRaidInPVE: boolean;
exit_count: number;
exit_time: number;
exits: Exit[];
exits: IExit[];
filter_ex: string[];
limits: ILimit[];
matching_min_seconds: number;
GenerateLocalLootCache: boolean;
maxItemCountInLocation: MaxItemCountInLocation[];
maxItemCountInLocation: IMaxItemCountInLocation[];
sav_summon_seconds: number;
tmp_location_field_remove_me: number;
transits: ITransit[];
users_gather_seconds: number;
users_spawn_seconds_n: number;
users_spawn_seconds_n2: number;
users_summon_seconds: number;
waves: Wave[];
waves: IWave[];
}
export interface ITransit {
activateAfterSec: string;
active: boolean;
name: string;
conditions: string;
description: string;
id: number;
location: string;
target: string;
time: number;
}
export interface INonWaveGroupScenario {
Chance: number;
@ -101,7 +117,7 @@ export interface INonWaveGroupScenario {
export interface ILimit extends MinMax {
items: any[];
}
export interface AirdropParameter {
export interface IAirdropParameter {
AirdropPointDeactivateDistance: number;
MinPlayersCountToSpawnAirdrop: number;
PlaneAirdropChance: number;
@ -113,15 +129,15 @@ export interface AirdropParameter {
PlaneAirdropStartMin: number;
UnsuccessfulTryPenalty: number;
}
export interface Banner {
export interface IBanner {
id: string;
pic: Pic;
pic: IPic;
}
export interface Pic {
export interface IPic {
path: string;
rcid: string;
}
export interface BossLocationSpawn {
export interface IBossLocationSpawn {
BossChance: number;
BossDifficult: string;
BossEscortAmount: string;
@ -135,48 +151,73 @@ export interface BossLocationSpawn {
TriggerId: string;
TriggerName: string;
Delay?: number;
DependKarma?: boolean;
DependKarmaPVE?: boolean;
ForceSpawn?: boolean;
IgnoreMaxBots?: boolean;
Supports?: BossSupport[];
Supports?: IBossSupport[];
sptId?: string;
spawnMode: string[];
}
export interface BossSupport {
export interface IBossSupport {
BossEscortAmount: string;
BossEscortDifficult: string[];
BossEscortType: string;
}
export interface BotLocationModifier {
export interface IBotLocationModifier {
AccuracySpeed: number;
AdditionalHostilitySettings: IAdditionalHostilitySettings[];
DistToActivate: number;
DistToActivatePvE: number;
DistToPersueAxemanCoef: number;
DistToSleep: number;
DistToSleepPvE: number;
GainSight: number;
KhorovodChance: number;
MagnetPower: number;
MarksmanAccuratyCoef: number;
Scattering: number;
VisibleDistance: number;
MaxExfiltrationTime: number;
MinExfiltrationTime: number;
}
export interface MinMaxBot extends MinMax {
export interface IAdditionalHostilitySettings {
AlwaysEnemies: string[];
AlwaysFriends: string[];
BearEnemyChance: number;
BearPlayerBehaviour: string;
BotRole: string;
ChancedEnemies: IChancedEnemy[];
Neutral: string[];
SavagePlayerBehaviour: string;
SavageEnemyChance?: number;
UsecEnemyChance: number;
UsecPlayerBehaviour: string;
Warn: string[];
}
export interface IChancedEnemy {
EnemyChance: number;
Role: string;
}
export interface IMinMaxBot extends MinMax {
WildSpawnType: WildSpawnType | string;
}
export interface MinPlayerWaitTime {
export interface IMinPlayerWaitTime {
minPlayers: number;
time: number;
}
export interface Preview {
export interface IPreview {
path: string;
rcid: string;
}
export interface Scene {
export interface IScene {
path: string;
rcid: string;
}
export interface SpawnPointParam {
export interface ISpawnPointParam {
BotZoneName: string;
Categories: string[];
ColliderParams: ColliderParams;
ColliderParams: IColliderParams;
CorePointId: number;
DelayToCanSpawnSec: number;
Id: string;
@ -185,15 +226,15 @@ export interface SpawnPointParam {
Rotation: number;
Sides: string[];
}
export interface ColliderParams {
export interface IColliderParams {
_parent: string;
_props: Props;
_props: IProps;
}
export interface Props {
export interface IProps {
Center: Ixyz;
Radius: number;
}
export interface Exit {
export interface IExit {
/** % Chance out of 100 exit will appear in raid */
Chance: number;
ChancePVE: number;
@ -217,11 +258,11 @@ export interface Exit {
RequirementTip: string;
Side?: string;
}
export interface MaxItemCountInLocation {
export interface IMaxItemCountInLocation {
TemplateId: string;
Value: number;
}
export interface Wave {
export interface IWave {
BotPreset: string;
BotSide: string;
SpawnPoints: string;
@ -232,11 +273,40 @@ export interface Wave {
slots_min: number;
time_max: number;
time_min: number;
/** OPTIONAL - Needs to be unique - Used by custom wave service to ensure same wave isnt added multiple times */
sptId?: string;
ChanceGroup?: number;
/** 'pve' and/or 'regular' */
SpawnMode: string[];
}
export interface ILocationEvents {
Halloween2024: IHalloween2024;
}
export interface IHalloween2024 {
CrowdAttackBlockRadius: number;
CrowdAttackSpawnParams: CrowdAttackSpawnParam[];
CrowdCooldownPerPlayerSec: number;
CrowdsLimit: number;
InfectedLookCoeff: number;
MaxCrowdAttackSpawnLimit: number;
MinInfectionPercentage: number;
MinSpawnDistToPlayer: number;
TargetPointSearchRadiusLimit: number;
ZombieCallDeltaRadius: number;
ZombieCallPeriodSec: number;
ZombieCallRadiusLimit: number;
ZombieMultiplier: number;
InfectionPercentage: number;
}
export interface CrowdAttackSpawnParam {
Difficulty: string;
Role: string;
Weight: number;
}
export declare enum WildSpawnType {
ASSAULT = "assault",
MARKSMAN = "marksman",
PMCBOT = "pmcbot"
PMCBOT = "pmcbot",
BOSSKILLA = "bosskilla",
BOSSKNIGHT = "bossknight"
}

View File

@ -1,9 +1,9 @@
import { ILocations } from "@spt/models/spt/server/ILocations";
export interface ILocationsGenerateAllResponse {
locations: ILocations;
paths: Path[];
paths: IPath[];
}
export interface Path {
export interface IPath {
Source: string;
Destination: string;
}

View File

@ -1,20 +1,20 @@
import { Ixyz } from "@spt/models/eft/common/Ixyz";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
export interface ILooseLoot {
spawnpointCount: SpawnpointCount;
spawnpointsForced: SpawnpointsForced[];
spawnpoints: Spawnpoint[];
spawnpointCount: ISpawnpointCount;
spawnpointsForced: ISpawnpointsForced[];
spawnpoints: ISpawnpoint[];
}
export interface SpawnpointCount {
export interface ISpawnpointCount {
mean: number;
std: number;
}
export interface SpawnpointsForced {
export interface ISpawnpointsForced {
locationId: string;
probability: number;
template: SpawnpointTemplate;
template: ISpawnpointTemplate;
}
export interface SpawnpointTemplate {
export interface ISpawnpointTemplate {
Id: string;
IsContainer: boolean;
useGravity: boolean;
@ -23,20 +23,26 @@ export interface SpawnpointTemplate {
Rotation: Ixyz;
IsAlwaysSpawn: boolean;
IsGroupPosition: boolean;
GroupPositions: any[];
GroupPositions: IGroupPostion[];
Root: string;
Items: Item[];
Items: IItem[];
}
export interface Spawnpoint {
export interface IGroupPostion {
Name: string;
Weight: number;
Postion: Ixyz;
Rotation: Ixyz;
}
export interface ISpawnpoint {
locationId: string;
probability: number;
template: SpawnpointTemplate;
template: ISpawnpointTemplate;
itemDistribution: ItemDistribution[];
}
export interface ItemDistribution {
composedKey: ComposedKey;
composedKey: IComposedKey;
relativeProbability: number;
}
export interface ComposedKey {
export interface IComposedKey {
key: string;
}

View File

@ -1,4 +1,4 @@
import { Item, Upd } from "@spt/models/eft/common/tables/IItem";
import { IItem, IUpd } from "@spt/models/eft/common/tables/IItem";
import { IPmcDataRepeatableQuest } from "@spt/models/eft/common/tables/IRepeatableQuests";
import { IRagfairOffer } from "@spt/models/eft/ragfair/IRagfairOffer";
import { BonusSkillType } from "@spt/models/enums/BonusSkillType";
@ -12,29 +12,30 @@ export interface IBotBase {
/** SPT property - use to store player id - TODO - move to AID ( account id as guid of choice) */
sessionId: string;
savage?: string;
Info: Info;
Customization: Customization;
Health: Health;
Inventory: Inventory;
Skills: Skills;
Stats: Stats;
karmaValue: number;
Info: IInfo;
Customization: ICustomization;
Health: IHealth;
Inventory: IInventory;
Skills: ISkills;
Stats: IStats;
Encyclopedia: Record<string, boolean>;
TaskConditionCounters: Record<string, ITaskConditionCounter>;
InsuredItems: InsuredItem[];
Hideout: Hideout;
InsuredItems: IInsuredItem[];
Hideout: IHideout;
Quests: IQuestStatus[];
TradersInfo: Record<string, TraderInfo>;
TradersInfo: Record<string, ITraderInfo>;
UnlockedInfo: IUnlockedInfo;
RagfairInfo: RagfairInfo;
RagfairInfo: IRagfairInfo;
/** Achievement id and timestamp */
Achievements: Record<string, number>;
RepeatableQuests: IPmcDataRepeatableQuest[];
Bonuses: Bonus[];
Notes: Notes;
Bonuses: IBonus[];
Notes: INotes;
CarExtractCounts: Record<string, number>;
CoopExtractCounts: Record<string, number>;
SurvivorClass: SurvivorClass;
WishList: string[];
WishList: Record<string, number>;
moneyTransferLimitData: IMoneyTransferLimits;
/** SPT specific property used during bot generation in raid */
sptIsPmc?: boolean;
@ -56,13 +57,14 @@ export interface ITaskConditionCounter {
export interface IUnlockedInfo {
unlockedProductionRecipe: string[];
}
export interface Info {
export interface IInfo {
EntryPoint: string;
Nickname: string;
LowerNickname: string;
Side: string;
SquadInviteRestriction: boolean;
HasCoopExtension: boolean;
HasPveGame: boolean;
Voice: string;
Level: number;
Experience: number;
@ -70,27 +72,28 @@ export interface Info {
GameVersion: string;
AccountType: number;
MemberCategory: MemberCategory;
SelectedMemberCategory: MemberCategory;
lockedMoveCommands: boolean;
SavageLockTime: number;
LastTimePlayedAsSavage: number;
Settings: Settings;
Settings: IBotInfoSettings;
NicknameChangeDate: number;
NeedWipeOptions: any[];
lastCompletedWipe: LastCompleted;
lastCompletedWipe: ILastCompleted;
Bans: IBan[];
BannedState: boolean;
BannedUntil: number;
IsStreamerModeAvailable: boolean;
lastCompletedEvent?: LastCompleted;
SelectedMemberCategory: number;
lastCompletedEvent?: ILastCompleted;
isMigratedSkills: boolean;
}
export interface Settings {
export interface IBotInfoSettings {
Role: string;
BotDifficulty: string;
Experience: number;
StandingForKill: number;
AggressorBonus: number;
UseSimpleAnimator: boolean;
}
export interface IBan {
banType: BanType;
@ -105,42 +108,43 @@ export declare enum BanType {
FRIENDS = 5,
CHANGE_NICKNAME = 6
}
export interface Customization {
export interface ICustomization {
Head: string;
Body: string;
Feet: string;
Hands: string;
}
export interface Health {
Hydration: CurrentMax;
Energy: CurrentMax;
Temperature: CurrentMax;
BodyParts: BodyPartsHealth;
export interface IHealth {
Hydration: ICurrentMax;
Energy: ICurrentMax;
Temperature: ICurrentMax;
BodyParts: IBodyPartsHealth;
UpdateTime: number;
Immortal?: boolean;
}
export interface BodyPartsHealth {
Head: BodyPartHealth;
Chest: BodyPartHealth;
Stomach: BodyPartHealth;
LeftArm: BodyPartHealth;
RightArm: BodyPartHealth;
LeftLeg: BodyPartHealth;
RightLeg: BodyPartHealth;
export interface IBodyPartsHealth {
Head: IBodyPartHealth;
Chest: IBodyPartHealth;
Stomach: IBodyPartHealth;
LeftArm: IBodyPartHealth;
RightArm: IBodyPartHealth;
LeftLeg: IBodyPartHealth;
RightLeg: IBodyPartHealth;
}
export interface BodyPartHealth {
Health: CurrentMax;
Effects?: Record<string, BodyPartEffectProperties>;
export interface IBodyPartHealth {
Health: ICurrentMax;
Effects?: Record<string, IBodyPartEffectProperties>;
}
export interface BodyPartEffectProperties {
export interface IBodyPartEffectProperties {
ExtraData?: any;
Time: number;
}
export interface CurrentMax {
export interface ICurrentMax {
Current: number;
Maximum: number;
}
export interface Inventory {
items: Item[];
export interface IInventory {
items: IItem[];
equipment: string;
stash: string;
sortingTable: string;
@ -149,16 +153,16 @@ export interface Inventory {
/** Key is hideout area enum numeric as string e.g. "24", value is area _id */
hideoutAreaStashes: Record<string, string>;
fastPanel: Record<string, string>;
favoriteItems: string[];
favoriteItems: IItem[];
}
export interface IBaseJsonSkills {
Common: Record<string, Common>;
Mastering: Record<string, Mastering>;
Mastering: Record<string, IMastering>;
Points: number;
}
export interface Skills {
export interface ISkills {
Common: Common[];
Mastering: Mastering[];
Mastering: IMastering[];
Points: number;
}
export interface IBaseSkill {
@ -171,26 +175,26 @@ export interface Common extends IBaseSkill {
PointsEarnedDuringSession?: number;
LastAccess?: number;
}
export interface Mastering extends IBaseSkill {
export interface IMastering extends IBaseSkill {
}
export interface Stats {
export interface IStats {
Eft?: IEftStats;
}
export interface IEftStats {
CarriedQuestItems: string[];
Victims: Victim[];
Victims: IVictim[];
TotalSessionExperience: number;
LastSessionDate: number;
SessionCounters: SessionCounters;
OverallCounters: OverallCounters;
SessionCounters: ISessionCounters;
OverallCounters: IOverallCounters;
SessionExperienceMult?: number;
ExperienceBonusMult?: number;
Aggressor?: Aggressor;
Aggressor?: IAggressor;
DroppedItems?: IDroppedItem[];
FoundInRaidItems?: FoundInRaidItem[];
DamageHistory?: DamageHistory;
DeathCause?: DeathCause;
LastPlayerState?: LastPlayerState;
FoundInRaidItems?: IFoundInRaidItem[];
DamageHistory?: IDamageHistory;
DeathCause?: IDeathCause;
LastPlayerState?: ILastPlayerState;
TotalInGameTime: number;
SurvivorClass?: string;
sptLastRaidFenceRepChange?: number;
@ -200,11 +204,11 @@ export interface IDroppedItem {
ItemId: string;
ZoneId: string;
}
export interface FoundInRaidItem {
export interface IFoundInRaidItem {
QuestId: string;
ItemId: string;
}
export interface Victim {
export interface IVictim {
AccountId: string;
ProfileId: string;
Name: string;
@ -215,18 +219,19 @@ export interface Victim {
Level: number;
Weapon: string;
Role: string;
Location: string;
}
export interface SessionCounters {
Items: CounterKeyValue[];
export interface ISessionCounters {
Items: ICounterKeyValue[];
}
export interface OverallCounters {
Items: CounterKeyValue[];
export interface IOverallCounters {
Items: ICounterKeyValue[];
}
export interface CounterKeyValue {
export interface ICounterKeyValue {
Key: string[];
Value: number;
}
export interface Aggressor {
export interface IAggressor {
AccountId: string;
ProfileId: string;
MainProfileNickname: string;
@ -237,12 +242,12 @@ export interface Aggressor {
WeaponName: string;
Category: string;
}
export interface DamageHistory {
export interface IDamageHistory {
LethalDamagePart: string;
LethalDamage: LethalDamage;
BodyParts: BodyPartsDamageHistory;
LethalDamage: ILethalDamage;
BodyParts: IBodyPartsDamageHistory;
}
export interface LethalDamage {
export interface ILethalDamage {
Amount: number;
Type: string;
SourceId: string;
@ -250,17 +255,17 @@ export interface LethalDamage {
Blunt: boolean;
ImpactsCount: number;
}
export interface BodyPartsDamageHistory {
Head: DamageStats[];
Chest: DamageStats[];
Stomach: DamageStats[];
LeftArm: DamageStats[];
RightArm: DamageStats[];
LeftLeg: DamageStats[];
RightLeg: DamageStats[];
Common: DamageStats[];
export interface IBodyPartsDamageHistory {
Head: IDamageStats[];
Chest: IDamageStats[];
Stomach: IDamageStats[];
LeftArm: IDamageStats[];
RightArm: IDamageStats[];
LeftLeg: IDamageStats[];
RightLeg: IDamageStats[];
Common: IDamageStats[];
}
export interface DamageStats {
export interface IDamageStats {
Amount: number;
Type: string;
SourceId: string;
@ -268,55 +273,63 @@ export interface DamageStats {
Blunt: boolean;
ImpactsCount: number;
}
export interface DeathCause {
export interface IDeathCause {
DamageType: string;
Side: string;
Role: string;
WeaponId: string;
}
export interface LastPlayerState {
Info: LastPlayerStateInfo;
export interface ILastPlayerState {
Info: ILastPlayerStateInfo;
Customization: Record<string, string>;
Equipment: any;
}
export interface LastPlayerStateInfo {
export interface ILastPlayerStateInfo {
Nickname: string;
Side: string;
Level: number;
MemberCategory: MemberCategory;
}
export interface BackendCounter {
export interface IBackendCounter {
id: string;
qid?: string;
value: number;
}
export interface InsuredItem {
export interface IInsuredItem {
/** Trader Id item was insured by */
tid: string;
itemId: string;
}
export interface Hideout {
Production: Record<string, Productive>;
Areas: HideoutArea[];
Improvement: Record<string, IHideoutImprovement>;
export interface IHideout {
Production: Record<string, IProduction>;
Areas: IBotHideoutArea[];
Improvements: Record<string, IHideoutImprovement>;
HideoutCounters: IHideoutCounters;
Seed: number;
MannequinPoses: string[];
sptUpdateLastRunTimestamp: number;
}
export interface IHideoutCounters {
fuelCounter: number;
airFilterCounter: number;
waterFilterCounter: number;
craftingTimeCounter: number;
}
export interface IHideoutImprovement {
completed: boolean;
improveCompleteTimestamp: number;
}
export interface Productive {
Products: Product[];
export interface IProductive {
Products: IProduct[];
/** Seconds passed of production */
Progress?: number;
/** Is craft in some state of being worked on by client (crafting/ready to pick up) */
inProgress?: boolean;
StartTimestamp?: number;
StartTimestamp?: string;
SkipTime?: number;
/** Seconds needed to fully craft */
ProductionTime?: number;
GivenItemsInStart?: string[];
GivenItemsInStart?: IItem[];
Interrupted?: boolean;
Code?: string;
Decoded?: boolean;
@ -331,22 +344,23 @@ export interface Productive {
/** Is the craft a Continuous, e.g bitcoins/water collector */
sptIsContinuous?: boolean;
/** Stores a list of tools used in this craft and whether they're FiR, to give back once the craft is done */
sptRequiredTools?: Item[];
sptRequiredTools?: IItem[];
sptIsCultistCircle?: boolean;
}
export interface Production extends Productive {
export interface IProduction extends IProductive {
RecipeId: string;
SkipTime: number;
ProductionTime: number;
SkipTime?: number;
ProductionTime?: number;
}
export interface ScavCase extends Productive {
export interface IScavCase extends IProductive {
RecipeId: string;
}
export interface Product {
export interface IProduct {
_id: string;
_tpl: string;
upd?: Upd;
upd?: IUpd;
}
export interface HideoutArea {
export interface IBotHideoutArea {
type: HideoutAreas;
level: number;
active: boolean;
@ -354,26 +368,25 @@ export interface HideoutArea {
/** Must be integer */
completeTime: number;
constructing: boolean;
slots: HideoutSlot[];
slots: IHideoutSlot[];
lastRecipe: string;
}
export interface HideoutSlot {
export interface IHideoutSlot {
/** SPT specific value to keep track of what index this slot is (0,1,2,3 etc) */
locationIndex: number;
item?: HideoutItem[];
item?: IHideoutItem[];
}
export interface HideoutItem {
export interface IHideoutItem {
_id: string;
_tpl: string;
upd?: Upd;
upd?: IUpd;
}
export interface LastCompleted {
export interface ILastCompleted {
$oid: string;
}
export interface Notes {
Notes: Note[];
export interface INotes {
Notes: INote[];
}
export type CarExtractCounts = {};
export declare enum SurvivorClass {
UNKNOWN = 0,
NEUTRALIZER = 1,
@ -390,20 +403,20 @@ export interface IQuestStatus {
completedConditions?: string[];
availableAfter?: number;
}
export interface TraderInfo {
loyaltyLevel: number;
export interface ITraderInfo {
loyaltyLevel?: number;
salesSum: number;
standing: number;
nextResupply: number;
unlocked: boolean;
disabled: boolean;
}
export interface RagfairInfo {
export interface IRagfairInfo {
rating: number;
isRatingGrowing: boolean;
offers: IRagfairOffer[];
}
export interface Bonus {
export interface IBonus {
id?: string;
type: BonusType;
templateId?: string;
@ -415,7 +428,7 @@ export interface Bonus {
filter?: string[];
skillType?: BonusSkillType;
}
export interface Note {
export interface INote {
Time: number;
Text: string;
}

View File

@ -1,28 +1,28 @@
import { MinMax } from "@spt/models/common/MinMax";
import { Skills } from "@spt/models/eft/common/tables/IBotBase";
import { ISkills } from "@spt/models/eft/common/tables/IBotBase";
export interface IBotType {
appearance: Appearance;
chances: Chances;
difficulty: Difficulties;
experience: Experience;
appearance: IAppearance;
chances: IChances;
difficulty: IDifficulties;
experience: IExperience;
firstName: string[];
generation: Generation;
health: Health;
inventory: Inventory;
generation: IGeneration;
health: IHealth;
inventory: IInventory;
lastName: string[];
skills: Skills;
skills: ISkills;
}
export interface Appearance {
export interface IAppearance {
body: Record<string, number>;
feet: Record<string, number>;
hands: Record<string, number>;
head: Record<string, number>;
voice: Record<string, number>;
}
export interface Chances {
export interface IChances {
equipment: EquipmentChances;
weaponMods: ModsChances;
equipmentMods: ModsChances;
weaponMods: IModsChances;
equipmentMods: IModsChances;
}
export interface EquipmentChances {
ArmBand: number;
@ -40,7 +40,7 @@ export interface EquipmentChances {
SecuredContainer: number;
TacticalVest: number;
}
export interface ModsChances {
export interface IModsChances {
mod_charge: number;
mod_equipment: number;
mod_equipment_000: number;
@ -74,13 +74,13 @@ export interface ModsChances {
mod_tactical_003: number;
mod_handguard: number;
}
export interface Difficulties {
easy: Difficulty;
normal: Difficulty;
hard: Difficulty;
impossible: Difficulty;
export interface IDifficulties {
easy: IDifficultyCategories;
normal: IDifficultyCategories;
hard: IDifficultyCategories;
impossible: IDifficultyCategories;
}
export interface Difficulty {
export interface IDifficultyCategories {
Aiming: Record<string, string | number | boolean>;
Boss: Record<string, string | number | boolean>;
Change: Record<string, string | number | boolean>;
@ -96,42 +96,46 @@ export interface Difficulty {
Scattering: Record<string, string | number | boolean>;
Shoot: Record<string, string | number | boolean>;
}
export interface Experience {
aggressorBonus: number;
export interface IExperience {
/** key = bot difficulty */
aggressorBonus: Record<string, number>;
level: MinMax;
reward: MinMax;
standingForKill: number;
/** key = bot difficulty */
reward: Record<string, MinMax>;
/** key = bot difficulty */
standingForKill: Record<string, number>;
useSimpleAnimator: boolean;
}
export interface Generation {
items: GenerationWeightingItems;
export interface IGeneration {
items: IGenerationWeightingItems;
}
export interface GenerationWeightingItems {
grenades: GenerationData;
healing: GenerationData;
drugs: GenerationData;
food: GenerationData;
drink: GenerationData;
currency: GenerationData;
stims: GenerationData;
backpackLoot: GenerationData;
pocketLoot: GenerationData;
vestLoot: GenerationData;
magazines: GenerationData;
specialItems: GenerationData;
export interface IGenerationWeightingItems {
grenades: IGenerationData;
healing: IGenerationData;
drugs: IGenerationData;
food: IGenerationData;
drink: IGenerationData;
currency: IGenerationData;
stims: IGenerationData;
backpackLoot: IGenerationData;
pocketLoot: IGenerationData;
vestLoot: IGenerationData;
magazines: IGenerationData;
specialItems: IGenerationData;
}
export interface GenerationData {
export interface IGenerationData {
/** key: number of items, value: weighting */
weights: Record<string, number>;
/** Array of item tpls */
whitelist: Record<string, number>;
}
export interface Health {
BodyParts: BodyPart[];
export interface IHealth {
BodyParts: IBodyPart[];
Energy: MinMax;
Hydration: MinMax;
Temperature: MinMax;
}
export interface BodyPart {
export interface IBodyPart {
Chest: MinMax;
Head: MinMax;
LeftArm: MinMax;
@ -140,13 +144,13 @@ export interface BodyPart {
RightLeg: MinMax;
Stomach: MinMax;
}
export interface Inventory {
equipment: Equipment;
Ammo: Record<string, Record<string, number>>;
items: Items;
mods: Mods;
export interface IInventory {
equipment: IEquipment;
Ammo: IAmmo;
items: IItemPools;
mods: IMods;
}
export interface Equipment {
export interface IEquipment {
ArmBand: Record<string, number>;
ArmorVest: Record<string, number>;
Backpack: Record<string, number>;
@ -162,11 +166,12 @@ export interface Equipment {
SecuredContainer: Record<string, number>;
TacticalVest: Record<string, number>;
}
export interface Items {
export interface IItemPools {
Backpack: Record<string, number>;
Pockets: Record<string, number>;
SecuredContainer: Record<string, number>;
SpecialLoot: Record<string, number>;
TacticalVest: Record<string, number>;
}
export type Mods = Record<string, Record<string, string[]>>;
export type IAmmo = Record<string, Record<string, number>>;
export type IMods = Record<string, Record<string, string[]>>;

View File

@ -4,26 +4,27 @@ export interface ICustomizationItem {
_name: string;
_parent: string;
_type: string;
_props: Props;
_props: IProps;
_proto: string;
}
export interface Props {
export interface IProps {
Name: string;
ShortName: string;
Description: string;
Game: string[];
Side: string[];
BodyPart: string;
AvailableAsDefault?: boolean;
Body: string;
Hands: string;
Feet: string;
Prefab: Prefab;
WatchPrefab: Prefab;
Prefab: IPrefab;
WatchPrefab: IPrefab;
IntegratedArmorVest: boolean;
WatchPosition: Ixyz;
WatchRotation: Ixyz;
}
export interface Prefab {
export interface IPrefab {
path: string;
rcid: string;
}

View File

@ -1,15 +1,15 @@
export interface IHandbookBase {
Categories: Category[];
Items: HandbookItem[];
Categories: IHandbookCategory[];
Items: IHandbookItem[];
}
export interface Category {
export interface IHandbookCategory {
Id: string;
ParentId?: string;
Icon: string;
Color: string;
Order: string;
}
export interface HandbookItem {
export interface IHandbookItem {
Id: string;
ParentId: string;
Price: number;

View File

@ -1,99 +1,113 @@
export interface Item {
export interface IItem {
_id: string;
_tpl: string;
parentId?: string;
slotId?: string;
location?: Location | number;
upd?: Upd;
location?: IItemLocation | number;
upd?: IUpd;
}
export interface Upd {
Buff?: Buff;
export interface IItemLocation {
x: number;
y: number;
r: string | number;
isSearched?: boolean;
/** SPT property? */
rotation?: string | boolean;
}
export interface IUpd {
Buff?: IUpdBuff;
OriginalStackObjectsCount?: number;
Togglable?: Togglable;
Map?: Map;
Tag?: Tag;
Togglable?: IUpdTogglable;
Map?: IUpdMap;
Tag?: IUpdTag;
/** SPT specific property, not made by BSG */
sptPresetId?: string;
FaceShield?: FaceShield;
FaceShield?: IUpdFaceShield;
StackObjectsCount?: number;
UnlimitedCount?: boolean;
Repairable?: Repairable;
RecodableComponent?: RecodableComponent;
FireMode?: FireMode;
Repairable?: IUpdRepairable;
RecodableComponent?: IUpdRecodableComponent;
FireMode?: IUpdFireMode;
SpawnedInSession?: boolean;
Light?: Light;
Key?: Key;
Resource?: Resource;
Sight?: Sight;
MedKit?: MedKit;
FoodDrink?: FoodDrink;
Dogtag?: Dogtag;
Light?: IUpdLight;
Key?: IUpdKey;
Resource?: IUpdResource;
Sight?: IUpdSight;
MedKit?: IUpdMedKit;
FoodDrink?: IUpdFoodDrink;
Dogtag?: IUpdDogtag;
BuyRestrictionMax?: number;
BuyRestrictionCurrent?: number;
Foldable?: Foldable;
SideEffect?: SideEffect;
RepairKit?: RepairKit;
CultistAmulet?: ICultistAmulet;
Foldable?: IUpdFoldable;
SideEffect?: IUpdSideEffect;
RepairKit?: IUpdRepairKit;
CultistAmulet?: IUpdCultistAmulet;
PinLockState?: PinLockState;
}
export interface Buff {
rarity: string;
buffType: string;
value: number;
thresholdDurability?: number;
export declare enum PinLockState {
FREE = "Free",
LOCKED = "Locked",
PINNED = "Pinned"
}
export interface Togglable {
export interface IUpdBuff {
Rarity: string;
BuffType: string;
Value: number;
ThresholdDurability?: number;
}
export interface IUpdTogglable {
On: boolean;
}
export interface Map {
Markers: MapMarker[];
export interface IUpdMap {
Markers: IMapMarker[];
}
export interface MapMarker {
export interface IMapMarker {
X: number;
Y: number;
}
export interface Tag {
export interface IUpdTag {
Color: number;
Name: string;
}
export interface FaceShield {
export interface IUpdFaceShield {
Hits: number;
}
export interface Repairable {
export interface IUpdRepairable {
Durability: number;
MaxDurability: number;
}
export interface RecodableComponent {
export interface IUpdRecodableComponent {
IsEncoded: boolean;
}
export interface MedKit {
export interface IUpdMedKit {
HpResource: number;
}
export interface Sight {
export interface IUpdSight {
ScopesCurrentCalibPointIndexes: number[];
ScopesSelectedModes: number[];
SelectedScope: number;
}
export interface Foldable {
export interface IUpdFoldable {
Folded: boolean;
}
export interface FireMode {
export interface IUpdFireMode {
FireMode: string;
}
export interface FoodDrink {
export interface IUpdFoodDrink {
HpPercent: number;
}
export interface Key {
export interface IUpdKey {
NumberOfUsages: number;
}
export interface Resource {
export interface IUpdResource {
Value: number;
UnitsConsumed: number;
}
export interface Light {
export interface IUpdLight {
IsActive: boolean;
SelectedMode: number;
}
export interface Dogtag {
export interface IUpdDogtag {
AccountId: string;
ProfileId: string;
Nickname: string;
@ -106,20 +120,12 @@ export interface Dogtag {
KillerName: string;
WeaponName: string;
}
export interface Location {
x: number;
y: number;
r: string | number;
isSearched?: boolean;
/** SPT property? */
rotation?: string | boolean;
}
export interface SideEffect {
export interface IUpdSideEffect {
Value: number;
}
export interface RepairKit {
export interface IUpdRepairKit {
Resource: number;
}
export interface ICultistAmulet {
export interface IUpdCultistAmulet {
NumberOfUsages: number;
}

View File

@ -0,0 +1,71 @@
import { Ixyz } from "@spt/models/eft/common/Ixyz";
export interface ILocationServices {
TraderServerSettings: ITraderServerSettings;
BTRServerSettings: IBtrServerSettings;
}
export interface ITraderServerSettings {
TraderServices: ITraderServices;
}
export interface ITraderServices {
ExUsecLoyalty: ITraderService;
ZryachiyAid: ITraderService;
CultistsAid: ITraderService;
PlayerTaxi: ITraderService;
BtrItemsDelivery: ITraderService;
BtrBotCover: ITraderService;
TransitItemsDelivery: ITraderService;
}
export interface ITraderService {
TraderId: string;
TraderServiceType: string;
Requirements: IServiceRequirements;
ServiceItemCost: Record<string, IServiceItemCostDetails>;
UniqueItems: string[];
}
export interface IServiceRequirements {
CompletedQuests: ICompletedQuest[];
Standings: Record<string, IStandingRequirement>;
}
export interface ICompletedQuest {
QuestId: string;
}
export interface IStandingRequirement {
Value: number;
}
export interface IServiceItemCostDetails {
Count: number;
}
export interface IBtrServerSettings {
ChanceSpawn: number;
SpawnPeriod: Ixyz;
MoveSpeed: number;
ReadyToDepartureTime: number;
CheckTurnDistanceTime: number;
TurnCheckSensitivity: number;
DecreaseSpeedOnTurnLimit: number;
EndSplineDecelerationDistance: number;
AccelerationSpeed: number;
DecelerationSpeed: number;
PauseDurationRange: Ixyz;
BodySwingReturnSpeed: number;
BodySwingDamping: number;
BodySwingIntensity: number;
ServerMapBTRSettings: Record<string, IServerMapBtrsettings>;
}
export interface IServerMapBtrsettings {
MapID: string;
ChanceSpawn: number;
SpawnPeriod: Ixyz;
MoveSpeed: number;
ReadyToDepartureTime: number;
CheckTurnDistanceTime: number;
TurnCheckSensitivity: number;
DecreaseSpeedOnTurnLimit: number;
EndSplineDecelerationDistance: number;
AccelerationSpeed: number;
DecelerationSpeed: number;
PauseDurationRange: Ixyz;
BodySwingReturnSpeed: number;
BodySwingDamping: number;
BodySwingIntensity: number;
}

View File

@ -1,9 +1,9 @@
export interface ILocationsBase {
locations: Locations;
paths: Path[];
locations: ILocations;
paths: IPath[];
}
export type Locations = {};
export interface Path {
export type ILocations = {};
export interface IPath {
Source: string;
Destination: string;
}

View File

@ -1,7 +1,7 @@
export interface IMatch {
metrics: Metrics;
metrics: IMetrics;
}
export interface Metrics {
export interface IMetrics {
Keys: number[];
NetProcessingBins: number[];
RenderBins: number[];

View File

@ -1,5 +1,5 @@
import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { Dialogue, IUserBuilds } from "@spt/models/eft/profile/ISptProfile";
import { IDialogue, IUserBuilds } from "@spt/models/eft/profile/ISptProfile";
export interface IProfileTemplates {
Standard: IProfileSides;
"Left Behind": IProfileSides;
@ -19,11 +19,11 @@ export interface IProfileSides {
export interface ITemplateSide {
character: IPmcData;
suits: string[];
dialogues: Record<string, Dialogue>;
dialogues: Record<string, IDialogue>;
userbuilds: IUserBuilds;
trader: ProfileTraderTemplate;
trader: IProfileTraderTemplate;
}
export interface ProfileTraderTemplate {
export interface IProfileTraderTemplate {
initialLoyaltyLevel: Record<string, number>;
initialStanding: Record<string, number>;
setQuestsAvailableForStart?: boolean;

View File

@ -1,4 +1,4 @@
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IItem } from "@spt/models/eft/common/tables/IItem";
import { QuestRewardType } from "@spt/models/enums/QuestRewardType";
import { QuestStatus } from "@spt/models/enums/QuestStatus";
import { QuestTypeEnum } from "@spt/models/enums/QuestTypeEnum";
@ -17,21 +17,19 @@ export interface IQuest {
image: string;
type: QuestTypeEnum;
isKey: boolean;
/** @deprecated - Likely not used, use 'status' instead */
questStatus: QuestStatus;
restartable: boolean;
instantComplete: boolean;
secretQuest: boolean;
startedMessageText: string;
successMessageText: string;
acceptPlayerMessage: string;
acceptPlayerMessage?: string;
declinePlayerMessage: string;
completePlayerMessage: string;
templateId: string;
completePlayerMessage?: string;
templateId?: string;
rewards: IQuestRewards;
/** Becomes 'AppearStatus' inside client */
status: string | number;
KeyQuest: boolean;
status?: string | number;
KeyQuest?: boolean;
changeQuestMessageText: string;
/** "Pmc" or "Scav" */
side: string;
@ -39,10 +37,10 @@ export interface IQuest {
sptStatus?: QuestStatus;
}
export interface IQuestConditionTypes {
Started: IQuestCondition[];
Started?: IQuestCondition[];
AvailableForFinish: IQuestCondition[];
AvailableForStart: IQuestCondition[];
Success: IQuestCondition[];
Success?: IQuestCondition[];
Fail: IQuestCondition[];
}
export interface IQuestCondition {
@ -50,21 +48,24 @@ export interface IQuestCondition {
index?: number;
compareMethod?: string;
dynamicLocale: boolean;
visibilityConditions?: VisibilityCondition[];
visibilityConditions?: IVisibilityCondition[];
globalQuestCounterId?: string;
parentId?: string;
target: string[] | string;
target?: string[] | string;
value?: string | number;
type?: boolean;
type?: boolean | string;
status?: QuestStatus[];
availableAfter?: number;
dispersion?: number;
onlyFoundInRaid?: boolean;
oneSessionOnly?: boolean;
isResetOnConditionFailed?: boolean;
isNecessary?: boolean;
doNotResetIfCounterCompleted?: boolean;
dogtagLevel?: number;
maxDurability?: number;
minDurability?: number;
dogtagLevel?: number | string;
traderId?: string;
maxDurability?: number | string;
minDurability?: number | string;
counter?: IQuestConditionCounter;
plantTime?: number;
zoneId?: string;
@ -79,7 +80,7 @@ export interface IQuestConditionCounter {
}
export interface IQuestConditionCounterCondition {
id: string;
dynamicLocale: boolean;
dynamicLocale?: boolean;
target?: string[] | string;
completeInSeconds?: number;
energy?: IValueCompare;
@ -87,7 +88,7 @@ export interface IQuestConditionCounterCondition {
hydration?: IValueCompare;
time?: IValueCompare;
compareMethod?: string;
value?: number;
value?: number | string;
weapon?: string[];
distance?: ICounterConditionDistance;
equipmentInclusive?: string[][];
@ -120,12 +121,12 @@ export interface IDaytimeCounter {
from: number;
to: number;
}
export interface VisibilityCondition {
export interface IVisibilityCondition {
id: string;
target: string;
value?: number;
dynamicLocale?: boolean;
oneSessionOnly: boolean;
oneSessionOnly?: boolean;
conditionType: string;
}
export interface IQuestRewards {
@ -143,10 +144,14 @@ export interface IQuestReward {
type: QuestRewardType;
index: number;
target?: string;
items?: Item[];
items?: IItem[];
loyaltyLevel?: number;
/** Hideout area id */
traderId?: string;
unknown?: boolean;
findInRaid?: boolean;
/** Game editions whitelisted to get reward */
availableInGameEditions?: string[];
/** Game editions blacklisted from getting reward */
notAvailableInGameEditions?: string[];
}

View File

@ -41,14 +41,14 @@ export interface IOptions {
Completion: ICompletionFilter;
}
export interface ICompletionFilter {
itemsBlacklist: ItemsBlacklist[];
itemsWhitelist: ItemsWhitelist[];
itemsBlacklist: IItemsBlacklist[];
itemsWhitelist: IItemsWhitelist[];
}
export interface ItemsBlacklist {
export interface IItemsBlacklist {
minPlayerLevel: number;
itemIds: string[];
}
export interface ItemsWhitelist {
export interface IItemsWhitelist {
minPlayerLevel: number;
itemIds: string[];
}

Some files were not shown because too many files have changed in this diff Show More