0
0
mirror of https://github.com/sp-tarkov/server.git synced 2025-02-13 09:50:43 -05:00

Merge branch '310-dev' of https://dev.sp-tarkov.com/SPT/Server into 310-dev

This commit is contained in:
CWX 2024-07-05 19:21:25 +01:00
commit 264a8a06bd
10 changed files with 1574 additions and 1110 deletions

View File

@ -106,7 +106,7 @@
} }
}, },
"BTRServerSettings": { "BTRServerSettings": {
"ChanceSpawn": 70, "ChanceSpawn": 100,
"SpawnPeriod": { "SpawnPeriod": {
"x": 300, "x": 300,
"y": 600, "y": 600,
@ -131,7 +131,7 @@
"ServerMapBTRSettings": { "ServerMapBTRSettings": {
"Develop": { "Develop": {
"MapID": "develop", "MapID": "develop",
"ChanceSpawn": 70, "ChanceSpawn": 100,
"SpawnPeriod": { "SpawnPeriod": {
"x": 300, "x": 300,
"y": 600, "y": 600,
@ -156,10 +156,10 @@
}, },
"TarkovStreets": { "TarkovStreets": {
"MapID": "TarkovStreets", "MapID": "TarkovStreets",
"ChanceSpawn": 70, "ChanceSpawn": 100,
"SpawnPeriod": { "SpawnPeriod": {
"x": 300, "x": 0,
"y": 600, "y": 10,
"z": 0 "z": 0
}, },
"MoveSpeed": 8, "MoveSpeed": 8,
@ -181,10 +181,10 @@
}, },
"Woods": { "Woods": {
"MapID": "Woods", "MapID": "Woods",
"ChanceSpawn": 70, "ChanceSpawn": 100,
"SpawnPeriod": { "SpawnPeriod": {
"x": 180, "x": 0,
"y": 360, "y": 10,
"z": 0 "z": 0
}, },
"MoveSpeed": 8, "MoveSpeed": 8,

View File

@ -2,7 +2,6 @@ import { inject, injectable } from "tsyringe";
import { InraidController } from "@spt/controllers/InraidController"; import { InraidController } from "@spt/controllers/InraidController";
import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData"; import { IEmptyRequestData } from "@spt/models/eft/common/IEmptyRequestData";
import { INullResponseData } from "@spt/models/eft/httpResponse/INullResponseData"; 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 { IRegisterPlayerRequestData } from "@spt/models/eft/inRaid/IRegisterPlayerRequestData";
import { ISaveProgressRequestData } from "@spt/models/eft/inRaid/ISaveProgressRequestData"; import { ISaveProgressRequestData } from "@spt/models/eft/inRaid/ISaveProgressRequestData";
import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil"; import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
@ -93,15 +92,6 @@ export class InraidCallbacks
return this.httpResponse.noBody(this.inraidController.getTraderServices(sessionId, traderId)); return this.httpResponse.noBody(this.inraidController.getTraderServices(sessionId, traderId));
} }
/**
* Handle singleplayer/traderServices/itemDelivery
*/
public itemDelivery(url: string, request: IItemDeliveryRequestData, sessionId: string): INullResponseData
{
this.inraidController.itemDelivery(sessionId, request.traderId, request.items);
return this.httpResponse.nullResponse();
}
public getTraitorScavHostileChance(url: string, info: IEmptyRequestData, sessionId: string): string public getTraitorScavHostileChance(url: string, info: IEmptyRequestData, sessionId: string): string
{ {
return this.httpResponse.noBody(this.inraidController.getTraitorScavHostileChance(url, sessionId)); return this.httpResponse.noBody(this.inraidController.getTraitorScavHostileChance(url, sessionId));
@ -111,4 +101,9 @@ export class InraidCallbacks
{ {
return this.httpResponse.noBody(this.inraidController.getSandboxMaxPatrolValue(url, sessionId)); return this.httpResponse.noBody(this.inraidController.getSandboxMaxPatrolValue(url, sessionId));
} }
public getBossConvertSettings(url: string, info: IEmptyRequestData, sessionId: string): string
{
return this.httpResponse.noBody(this.inraidController.getBossConvertSettings(url, sessionId));
}
} }

View File

@ -234,7 +234,11 @@ export class MatchCallbacks
} }
/** Handle client/match/offline/end */ /** Handle client/match/offline/end */
public endOfflineRaid(url: string, info: IEndOfflineRaidRequestData, sessionID: string): INullResponseData public endOfflineRaid(
url: string,
info: IEndOfflineRaidRequestData,
sessionID: string,
): INullResponseData
{ {
this.matchController.endOfflineRaid(info, sessionID); this.matchController.endOfflineRaid(info, sessionID);
return this.httpResponse.nullResponse(); return this.httpResponse.nullResponse();

View File

@ -11,17 +11,16 @@ import { TraderHelper } from "@spt/helpers/TraderHelper";
import { ILocationBase } from "@spt/models/eft/common/ILocationBase"; import { ILocationBase } from "@spt/models/eft/common/ILocationBase";
import { IPmcData } from "@spt/models/eft/common/IPmcData"; import { IPmcData } from "@spt/models/eft/common/IPmcData";
import { BodyPartHealth } from "@spt/models/eft/common/tables/IBotBase"; import { BodyPartHealth } from "@spt/models/eft/common/tables/IBotBase";
import { Item } from "@spt/models/eft/common/tables/IItem";
import { IRegisterPlayerRequestData } from "@spt/models/eft/inRaid/IRegisterPlayerRequestData"; import { IRegisterPlayerRequestData } from "@spt/models/eft/inRaid/IRegisterPlayerRequestData";
import { ISaveProgressRequestData } from "@spt/models/eft/inRaid/ISaveProgressRequestData"; import { ISaveProgressRequestData } from "@spt/models/eft/inRaid/ISaveProgressRequestData";
import { ConfigTypes } from "@spt/models/enums/ConfigTypes"; import { ConfigTypes } from "@spt/models/enums/ConfigTypes";
import { ItemTpl } from "@spt/models/enums/ItemTpl"; import { ItemTpl } from "@spt/models/enums/ItemTpl";
import { MessageType } from "@spt/models/enums/MessageType";
import { PlayerRaidEndState } from "@spt/models/enums/PlayerRaidEndState"; import { PlayerRaidEndState } from "@spt/models/enums/PlayerRaidEndState";
import { QuestStatus } from "@spt/models/enums/QuestStatus"; import { QuestStatus } from "@spt/models/enums/QuestStatus";
import { SkillTypes } from "@spt/models/enums/SkillTypes"; import { SkillTypes } from "@spt/models/enums/SkillTypes";
import { Traders } from "@spt/models/enums/Traders"; import { Traders } from "@spt/models/enums/Traders";
import { IAirdropConfig } from "@spt/models/spt/config/IAirdropConfig"; import { IAirdropConfig } from "@spt/models/spt/config/IAirdropConfig";
import { IBotConfig } from "@spt/models/spt/config/IBotConfig";
import { IBTRConfig } from "@spt/models/spt/config/IBTRConfig"; import { IBTRConfig } from "@spt/models/spt/config/IBTRConfig";
import { IHideoutConfig } from "@spt/models/spt/config/IHideoutConfig"; import { IHideoutConfig } from "@spt/models/spt/config/IHideoutConfig";
import { IInRaidConfig } from "@spt/models/spt/config/IInRaidConfig"; import { IInRaidConfig } from "@spt/models/spt/config/IInRaidConfig";
@ -55,6 +54,7 @@ export class InraidController
protected locationConfig: ILocationConfig; protected locationConfig: ILocationConfig;
protected ragfairConfig: IRagfairConfig; protected ragfairConfig: IRagfairConfig;
protected hideoutConfig: IHideoutConfig; protected hideoutConfig: IHideoutConfig;
protected botConfig: IBotConfig;
constructor( constructor(
@inject("PrimaryLogger") protected logger: ILogger, @inject("PrimaryLogger") protected logger: ILogger,
@ -86,6 +86,7 @@ export class InraidController
this.locationConfig = this.configServer.getConfig(ConfigTypes.LOCATION); this.locationConfig = this.configServer.getConfig(ConfigTypes.LOCATION);
this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR); this.ragfairConfig = this.configServer.getConfig(ConfigTypes.RAGFAIR);
this.hideoutConfig = this.configServer.getConfig(ConfigTypes.HIDEOUT); this.hideoutConfig = this.configServer.getConfig(ConfigTypes.HIDEOUT);
this.botConfig = this.configServer.getConfig(ConfigTypes.BOT);
} }
/** /**
@ -659,40 +660,6 @@ export class InraidController
return this.traderServicesService.getTraderServices(sessionId, traderId); return this.traderServicesService.getTraderServices(sessionId, traderId);
} }
/**
* Handle singleplayer/traderServices/itemDelivery
*/
public itemDelivery(sessionId: string, traderId: string, items: Item[]): void
{
const serverProfile = this.saveServer.getProfile(sessionId);
const pmcData = serverProfile.characters.pmc;
const dialogueTemplates = this.databaseService.getTrader(traderId).dialogue;
if (!dialogueTemplates)
{
this.logger.error(this.localisationService.getText("inraid-unable_to_deliver_item_no_trader_found", traderId));
return;
}
const messageId = this.randomUtil.getArrayValue(dialogueTemplates.itemsDelivered);
const messageStoreTime = this.timeUtil.getHoursAsSeconds(this.traderConfig.fence.btrDeliveryExpireHours);
// Remove any items that were returned by the item delivery, but also insured, from the player's insurance list
// This is to stop items being duplicated by being returned from both the item delivery, and insurance
const deliveredItemIds = items.map((x) => x._id);
pmcData.InsuredItems = pmcData.InsuredItems.filter((x) => !deliveredItemIds.includes(x.itemId));
// Send the items to the player
this.mailSendService.sendLocalisedNpcMessageToPlayer(
sessionId,
this.traderHelper.getTraderById(traderId),
MessageType.BTR_ITEMS_DELIVERY,
messageId,
items,
messageStoreTime,
);
}
public getTraitorScavHostileChance(url: string, sessionID: string): number public getTraitorScavHostileChance(url: string, sessionID: string): number
{ {
return this.inRaidConfig.playerScavHostileChancePercent; return this.inRaidConfig.playerScavHostileChancePercent;
@ -702,4 +669,9 @@ export class InraidController
{ {
return this.locationConfig.sandboxMaxPatrolvalue; return this.locationConfig.sandboxMaxPatrolvalue;
} }
public getBossConvertSettings(url: string, sessionId: string): string[]
{
return Object.keys(this.botConfig.assaultToBossConversion.bossesToConvertToWeights);
}
} }

View File

@ -35,6 +35,7 @@ import { SaveServer } from "@spt/servers/SaveServer";
import { BotGenerationCacheService } from "@spt/services/BotGenerationCacheService"; import { BotGenerationCacheService } from "@spt/services/BotGenerationCacheService";
import { BotLootCacheService } from "@spt/services/BotLootCacheService"; import { BotLootCacheService } from "@spt/services/BotLootCacheService";
import { DatabaseService } from "@spt/services/DatabaseService"; import { DatabaseService } from "@spt/services/DatabaseService";
import { LocalisationService } from "@spt/services/LocalisationService";
import { MailSendService } from "@spt/services/MailSendService"; import { MailSendService } from "@spt/services/MailSendService";
import { MatchBotDetailsCacheService } from "@spt/services/MatchBotDetailsCacheService"; import { MatchBotDetailsCacheService } from "@spt/services/MatchBotDetailsCacheService";
import { MatchLocationService } from "@spt/services/MatchLocationService"; import { MatchLocationService } from "@spt/services/MatchLocationService";
@ -71,6 +72,7 @@ export class MatchController
@inject("PmcChatResponseService") protected pmcChatResponseService: PmcChatResponseService, @inject("PmcChatResponseService") protected pmcChatResponseService: PmcChatResponseService,
@inject("TraderHelper") protected traderHelper: TraderHelper, @inject("TraderHelper") protected traderHelper: TraderHelper,
@inject("BotLootCacheService") protected botLootCacheService: BotLootCacheService, @inject("BotLootCacheService") protected botLootCacheService: BotLootCacheService,
@inject("LocalisationService") protected localisationService: LocalisationService,
@inject("ConfigServer") protected configServer: ConfigServer, @inject("ConfigServer") protected configServer: ConfigServer,
@inject("ProfileSnapshotService") protected profileSnapshotService: ProfileSnapshotService, @inject("ProfileSnapshotService") protected profileSnapshotService: ProfileSnapshotService,
@inject("BotGenerationCacheService") protected botGenerationCacheService: BotGenerationCacheService, @inject("BotGenerationCacheService") protected botGenerationCacheService: BotGenerationCacheService,
@ -472,6 +474,50 @@ export class MatchController
// Player killed PMCs, send some responses to them // Player killed PMCs, send some responses to them
this.pmcChatResponseService.sendVictimResponse(sessionId, victims, pmcProfile); this.pmcChatResponseService.sendVictimResponse(sessionId, victims, pmcProfile);
} }
// Handle items transferred via BTR to player
const btrKey = "BTRTransferStash";
const btrContainerAndItems = request.transferItems[btrKey] ?? [];
if (btrContainerAndItems.length > 0)
{
const itemsToSend = btrContainerAndItems.filter((item) => item._id !== btrKey);
this.btrItemDelivery(sessionId, Traders.BTR, itemsToSend);
}
}
/**
* Handle singleplayer/traderServices/itemDelivery
*/
protected btrItemDelivery(sessionId: string, traderId: string, items: Item[]): void
{
const serverProfile = this.saveServer.getProfile(sessionId);
const pmcData = serverProfile.characters.pmc;
const dialogueTemplates = this.databaseService.getTrader(traderId).dialogue;
if (!dialogueTemplates)
{
this.logger.error(this.localisationService.getText("inraid-unable_to_deliver_item_no_trader_found", traderId));
return;
}
const messageId = this.randomUtil.getArrayValue(dialogueTemplates.itemsDelivered);
const messageStoreTime = this.timeUtil.getHoursAsSeconds(this.traderConfig.fence.btrDeliveryExpireHours);
// Remove any items that were returned by the item delivery, but also insured, from the player's insurance list
// This is to stop items being duplicated by being returned from both item delivery and insurance
const deliveredItemIds = items.map((item) => item._id);
pmcData.InsuredItems = pmcData.InsuredItems
.filter((insuredItem) => !deliveredItemIds.includes(insuredItem.itemId));
// Send the items to the player
this.mailSendService.sendLocalisedNpcMessageToPlayer(
sessionId,
this.traderHelper.getTraderById(traderId),
MessageType.BTR_ITEMS_DELIVERY,
messageId,
items,
messageStoreTime,
);
} }
/** /**

View File

@ -4,9 +4,12 @@ import { Item } from "../common/tables/IItem";
export interface IEndLocalRaidRequestData export interface IEndLocalRaidRequestData
{ {
/** ID of server player just left */
serverId: string serverId: string
results: IEndRaidResult results: IEndRaidResult
/** Insured items left in raid by player */
lostInsuredItems: Item[] lostInsuredItems: Item[]
/** Items sent via traders to player, keyed to service e.g. BTRTransferStash */
transferItems: Record<string, Item[]> transferItems: Record<string, Item[]>
} }

View File

@ -44,13 +44,6 @@ export class InraidStaticRouter extends StaticRouter
return this.inraidCallbacks.getBTRConfig(); return this.inraidCallbacks.getBTRConfig();
}, },
), ),
new RouteAction(
"/singleplayer/traderServices/itemDelivery",
async (url: string, info: any, sessionID: string, output: string): Promise<INullResponseData> =>
{
return this.inraidCallbacks.itemDelivery(url, info, sessionID);
},
),
new RouteAction( new RouteAction(
"/singleplayer/scav/traitorscavhostile", "/singleplayer/scav/traitorscavhostile",
async (url: string, info: any, sessionID: string, output: string): Promise<string> => async (url: string, info: any, sessionID: string, output: string): Promise<string> =>
@ -65,6 +58,13 @@ export class InraidStaticRouter extends StaticRouter
return this.inraidCallbacks.getSandboxMaxPatrolValue(url, info, sessionID); return this.inraidCallbacks.getSandboxMaxPatrolValue(url, info, sessionID);
}, },
), ),
new RouteAction(
"/singleplayer/BossConvert",
async (url: string, info: any, sessionID: string, output: string): Promise<string> =>
{
return this.inraidCallbacks.getBossConvertSettings(url, info, sessionID);
},
),
]); ]);
} }
} }

View File

@ -111,13 +111,13 @@ export class DatabaseService
/** /**
* Get specific location by its Id * Get specific location by its Id
* @param locationId Desired trader id * @param locationId Desired location id
* @returns assets/database/locations/ * @returns assets/database/locations/
*/ */
public getLocation(locationId: string): ILocation public getLocation(locationId: string): ILocation
{ {
const locations = this.getLocations(); const locations = this.getLocations();
const desiredLocation = locations[locationId]; const desiredLocation = locations[locationId.toLowerCase()];
if (!desiredLocation) if (!desiredLocation)
{ {
throw new Error(this.localisationService.getText("database-no_location_found_with_id", locationId)); throw new Error(this.localisationService.getText("database-no_location_found_with_id", locationId));