Reworked singleplayer/settings/getRaidTime endpoint

Handles adjustments to train extract appearance times
Handles time needed to be alive in a raid to get a Success raid status
Added extra reduction percent weight: 30%
This commit is contained in:
Dev 2023-11-27 15:02:35 +00:00
parent 14e917823c
commit 7a798d2b60
4 changed files with 117 additions and 7 deletions

View File

@ -799,6 +799,7 @@
"reducedChancePercent": 40,
"reductionPercentWeights": {
"20": 12,
"30": 7,
"40": 5,
"60": 2,
"80": 1
@ -808,6 +809,7 @@
"reducedChancePercent": 60,
"reductionPercentWeights": {
"20": 12,
"30": 7,
"40": 5,
"60": 2,
"80": 1
@ -817,6 +819,7 @@
"reducedChancePercent": 40,
"reductionPercentWeights": {
"20": 12,
"30": 7,
"40": 5,
"60": 2,
"80": 1
@ -826,6 +829,7 @@
"reducedChancePercent": 50,
"reductionPercentWeights": {
"20": 12,
"30": 7,
"40": 5,
"60": 2,
"80": 1
@ -835,6 +839,7 @@
"reducedChancePercent": 40,
"reductionPercentWeights": {
"20": 12,
"30": 7,
"40": 5,
"60": 2,
"80": 1
@ -844,6 +849,7 @@
"reducedChancePercent": 30,
"reductionPercentWeights": {
"20": 12,
"30": 7,
"40": 5,
"60": 2,
"80": 1
@ -853,6 +859,7 @@
"reducedChancePercent": 40,
"reductionPercentWeights": {
"20": 12,
"30": 7,
"40": 5,
"60": 2,
"80": 1
@ -862,6 +869,7 @@
"reducedChancePercent": 40,
"reductionPercentWeights": {
"20": 25,
"30": 15,
"40": 10,
"60": 1,
"80": 1
@ -871,6 +879,7 @@
"reducedChancePercent": 40,
"reductionPercentWeights": {
"20": 25,
"30": 15,
"40": 10,
"60": 1,
"80": 1
@ -880,6 +889,7 @@
"reducedChancePercent": 40,
"reductionPercentWeights": {
"20": 25,
"30": 12,
"40": 10,
"60": 1,
"80": 1
@ -889,6 +899,7 @@
"reducedChancePercent": 25,
"reductionPercentWeights": {
"20": 12,
"30": 7,
"40": 5,
"60": 2,
"80": 1

View File

@ -8,6 +8,7 @@ import { ProfileHelper } from "@spt-aki/helpers/ProfileHelper";
import { WeightedRandomHelper } from "@spt-aki/helpers/WeightedRandomHelper";
import { PreAkiModLoader } from "@spt-aki/loaders/PreAkiModLoader";
import { IEmptyRequestData } from "@spt-aki/models/eft/common/IEmptyRequestData";
import { Exit, ILocationBase } from "@spt-aki/models/eft/common/ILocationBase";
import { ILooseLoot } from "@spt-aki/models/eft/common/ILooseLoot";
import { IPmcData } from "@spt-aki/models/eft/common/IPmcData";
import { BodyPartHealth } from "@spt-aki/models/eft/common/tables/IBotBase";
@ -16,7 +17,7 @@ import { ICurrentGroupResponse } from "@spt-aki/models/eft/game/ICurrentGroupRes
import { IGameConfigResponse } from "@spt-aki/models/eft/game/IGameConfigResponse";
import { IGameKeepAliveResponse } from "@spt-aki/models/eft/game/IGameKeepAliveResponse";
import { IGetRaidTimeRequest } from "@spt-aki/models/eft/game/IGetRaidTimeRequest";
import { IGetRaidTimeResponse } from "@spt-aki/models/eft/game/IGetRaidTimeResponse";
import { ExtractChange, IGetRaidTimeResponse } from "@spt-aki/models/eft/game/IGetRaidTimeResponse";
import { IServerDetails } from "@spt-aki/models/eft/game/IServerDetails";
import { IGetRaidConfigurationRequestData } from "@spt-aki/models/eft/match/IGetRaidConfigurationRequestData";
import { IAkiProfile } from "@spt-aki/models/eft/profile/IAkiProfile";
@ -485,9 +486,15 @@ export class GameController
*/
public getRaidTime(sessionId: string, request: IGetRaidTimeRequest): IGetRaidTimeResponse
{
const baseEscapeTimeMinutes = this.databaseServer.getTables().locations[request.Location.toLowerCase()].base.EscapeTimeLimit;
const mapBase: ILocationBase = this.databaseServer.getTables().locations[request.Location.toLowerCase()].base;
const baseEscapeTimeMinutes = mapBase.EscapeTimeLimit;
// Prep result object to return
const result: IGetRaidTimeResponse = {
RaidTimeMinutes: baseEscapeTimeMinutes
RaidTimeMinutes: baseEscapeTimeMinutes,
ExitChanges: [],
NewSurviveTimeSeconds: null,
OriginalSurvivalTimeSeconds: baseEscapeTimeMinutes
}
// Pmc raid, send default
@ -496,7 +503,7 @@ export class GameController
return result;
}
// We're scav
// We're scav adjust values
let mapSettings = this.locationConfig.scavRaidTimeSettings[request.Location.toLowerCase()];
if (!mapSettings)
{
@ -517,16 +524,88 @@ export class GameController
);
// How many minutes raid will be
const newRaidTime = Math.floor(this.randomUtil.reduceValueByPercent(baseEscapeTimeMinutes, Number.parseInt(chosenRaidReductionPercent)));
const newRaidTimeMinutes = Math.floor(this.randomUtil.reduceValueByPercent(baseEscapeTimeMinutes, Number.parseInt(chosenRaidReductionPercent)));
// Update result object with new time
result.RaidTimeMinutes = newRaidTime;
result.RaidTimeMinutes = newRaidTimeMinutes;
this.logger.debug(`Reduced: ${request.Location} raid time by: ${chosenRaidReductionPercent}% to ${newRaidTime} minutes`)
this.logger.debug(`Reduced: ${request.Location} raid time by: ${chosenRaidReductionPercent}% to ${newRaidTimeMinutes} minutes`)
// get our new total raid time as seconds
const newRaidTimeSeconds = newRaidTimeMinutes * 60;
const originalSurvivalTimeSeconds = this.databaseServer.getTables().globals.config.exp.match_end.survived_seconds_requirement;
result.OriginalSurvivalTimeSeconds = originalSurvivalTimeSeconds;
// Calculate how long player needs to be in raid to get a `survived` extract status
result.NewSurviveTimeSeconds = Math.max(originalSurvivalTimeSeconds - newRaidTimeSeconds, 0);
const exitAdjustments = this.getExitAdjustments(mapBase, newRaidTimeMinutes);
if (exitAdjustments)
{
result.ExitChanges.push(...exitAdjustments);
}
return result;
}
/**
* Adjust exit times to handle scavs entering raids part-way through
* @param mapBase Map base file player is on
* @param newRaidTimeMinutes How long raid is in minutes
* @returns List of exit changes to send to client
*/
protected getExitAdjustments(mapBase: ILocationBase, newRaidTimeMinutes: number): ExtractChange[]
{
const result = [];
// Adjust train exits only
for (const exit of mapBase.exits)
{
if (exit.PassageRequirement !== "Train")
{
continue;
}
// Prepare train adjustment object
const exitChange: ExtractChange = {
Name: exit.Name,
MinTime: null,
MaxTime: null,
Chance: null
}
// If raid is after last moment train can leave, assume train has already left, disable extract
const latestPossibleDepartureMinutes = (exit.MaxTime + exit.Count) / 60;
if (newRaidTimeMinutes < latestPossibleDepartureMinutes)
{
exitChange.Chance = 0;
this.logger.debug(`Train Exit: ${exit.Name} disabled as new raid time ${newRaidTimeMinutes} minutes is below ${latestPossibleDepartureMinutes} minutes`);
result.push(exitChange);
continue;
}
// What minute we simulate the player joining a raid at
const simulatedRaidEntryTimeMinutes = mapBase.EscapeTimeLimit - newRaidTimeMinutes;
// How many seconds to reduce extract arrival times by, negative values seem to make extract turn red in game
const reductionSeconds = simulatedRaidEntryTimeMinutes * 60;
exitChange.MinTime = exit.MinTime - reductionSeconds;
exitChange.MaxTime = exit.MaxTime - reductionSeconds;
this.logger.debug(`Train appears between: ${exitChange.MinTime} and ${exitChange.MaxTime} seconds raid time`);
result.push(exitChange);
}
return result.length > 0
? result
: null ;
}
/**
* BSG have two values for shotgun dispersion, we make sure both have the same value
*/

View File

@ -0,0 +1,5 @@
export interface IGetRaidTimeRequest
{
Side: string,
Location: string
}

View File

@ -0,0 +1,15 @@
export interface IGetRaidTimeResponse
{
RaidTimeMinutes: number
NewSurviveTimeSeconds: number
OriginalSurvivalTimeSeconds: number
ExitChanges: ExtractChange[]
}
export interface ExtractChange
{
Name: string
MinTime?: number
MaxTime?: number
Chance?: number
}