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:
parent
14e917823c
commit
7a798d2b60
@ -799,6 +799,7 @@
|
|||||||
"reducedChancePercent": 40,
|
"reducedChancePercent": 40,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 12,
|
"20": 12,
|
||||||
|
"30": 7,
|
||||||
"40": 5,
|
"40": 5,
|
||||||
"60": 2,
|
"60": 2,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -808,6 +809,7 @@
|
|||||||
"reducedChancePercent": 60,
|
"reducedChancePercent": 60,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 12,
|
"20": 12,
|
||||||
|
"30": 7,
|
||||||
"40": 5,
|
"40": 5,
|
||||||
"60": 2,
|
"60": 2,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -817,6 +819,7 @@
|
|||||||
"reducedChancePercent": 40,
|
"reducedChancePercent": 40,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 12,
|
"20": 12,
|
||||||
|
"30": 7,
|
||||||
"40": 5,
|
"40": 5,
|
||||||
"60": 2,
|
"60": 2,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -826,6 +829,7 @@
|
|||||||
"reducedChancePercent": 50,
|
"reducedChancePercent": 50,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 12,
|
"20": 12,
|
||||||
|
"30": 7,
|
||||||
"40": 5,
|
"40": 5,
|
||||||
"60": 2,
|
"60": 2,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -835,6 +839,7 @@
|
|||||||
"reducedChancePercent": 40,
|
"reducedChancePercent": 40,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 12,
|
"20": 12,
|
||||||
|
"30": 7,
|
||||||
"40": 5,
|
"40": 5,
|
||||||
"60": 2,
|
"60": 2,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -844,6 +849,7 @@
|
|||||||
"reducedChancePercent": 30,
|
"reducedChancePercent": 30,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 12,
|
"20": 12,
|
||||||
|
"30": 7,
|
||||||
"40": 5,
|
"40": 5,
|
||||||
"60": 2,
|
"60": 2,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -853,6 +859,7 @@
|
|||||||
"reducedChancePercent": 40,
|
"reducedChancePercent": 40,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 12,
|
"20": 12,
|
||||||
|
"30": 7,
|
||||||
"40": 5,
|
"40": 5,
|
||||||
"60": 2,
|
"60": 2,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -862,6 +869,7 @@
|
|||||||
"reducedChancePercent": 40,
|
"reducedChancePercent": 40,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 25,
|
"20": 25,
|
||||||
|
"30": 15,
|
||||||
"40": 10,
|
"40": 10,
|
||||||
"60": 1,
|
"60": 1,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -871,6 +879,7 @@
|
|||||||
"reducedChancePercent": 40,
|
"reducedChancePercent": 40,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 25,
|
"20": 25,
|
||||||
|
"30": 15,
|
||||||
"40": 10,
|
"40": 10,
|
||||||
"60": 1,
|
"60": 1,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -880,6 +889,7 @@
|
|||||||
"reducedChancePercent": 40,
|
"reducedChancePercent": 40,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 25,
|
"20": 25,
|
||||||
|
"30": 12,
|
||||||
"40": 10,
|
"40": 10,
|
||||||
"60": 1,
|
"60": 1,
|
||||||
"80": 1
|
"80": 1
|
||||||
@ -889,6 +899,7 @@
|
|||||||
"reducedChancePercent": 25,
|
"reducedChancePercent": 25,
|
||||||
"reductionPercentWeights": {
|
"reductionPercentWeights": {
|
||||||
"20": 12,
|
"20": 12,
|
||||||
|
"30": 7,
|
||||||
"40": 5,
|
"40": 5,
|
||||||
"60": 2,
|
"60": 2,
|
||||||
"80": 1
|
"80": 1
|
||||||
|
@ -8,6 +8,7 @@ import { ProfileHelper } from "@spt-aki/helpers/ProfileHelper";
|
|||||||
import { WeightedRandomHelper } from "@spt-aki/helpers/WeightedRandomHelper";
|
import { WeightedRandomHelper } from "@spt-aki/helpers/WeightedRandomHelper";
|
||||||
import { PreAkiModLoader } from "@spt-aki/loaders/PreAkiModLoader";
|
import { PreAkiModLoader } from "@spt-aki/loaders/PreAkiModLoader";
|
||||||
import { IEmptyRequestData } from "@spt-aki/models/eft/common/IEmptyRequestData";
|
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 { ILooseLoot } from "@spt-aki/models/eft/common/ILooseLoot";
|
||||||
import { IPmcData } from "@spt-aki/models/eft/common/IPmcData";
|
import { IPmcData } from "@spt-aki/models/eft/common/IPmcData";
|
||||||
import { BodyPartHealth } from "@spt-aki/models/eft/common/tables/IBotBase";
|
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 { IGameConfigResponse } from "@spt-aki/models/eft/game/IGameConfigResponse";
|
||||||
import { IGameKeepAliveResponse } from "@spt-aki/models/eft/game/IGameKeepAliveResponse";
|
import { IGameKeepAliveResponse } from "@spt-aki/models/eft/game/IGameKeepAliveResponse";
|
||||||
import { IGetRaidTimeRequest } from "@spt-aki/models/eft/game/IGetRaidTimeRequest";
|
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 { IServerDetails } from "@spt-aki/models/eft/game/IServerDetails";
|
||||||
import { IGetRaidConfigurationRequestData } from "@spt-aki/models/eft/match/IGetRaidConfigurationRequestData";
|
import { IGetRaidConfigurationRequestData } from "@spt-aki/models/eft/match/IGetRaidConfigurationRequestData";
|
||||||
import { IAkiProfile } from "@spt-aki/models/eft/profile/IAkiProfile";
|
import { IAkiProfile } from "@spt-aki/models/eft/profile/IAkiProfile";
|
||||||
@ -485,9 +486,15 @@ export class GameController
|
|||||||
*/
|
*/
|
||||||
public getRaidTime(sessionId: string, request: IGetRaidTimeRequest): IGetRaidTimeResponse
|
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 = {
|
const result: IGetRaidTimeResponse = {
|
||||||
RaidTimeMinutes: baseEscapeTimeMinutes
|
RaidTimeMinutes: baseEscapeTimeMinutes,
|
||||||
|
ExitChanges: [],
|
||||||
|
NewSurviveTimeSeconds: null,
|
||||||
|
OriginalSurvivalTimeSeconds: baseEscapeTimeMinutes
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pmc raid, send default
|
// Pmc raid, send default
|
||||||
@ -496,7 +503,7 @@ export class GameController
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We're scav
|
// We're scav adjust values
|
||||||
let mapSettings = this.locationConfig.scavRaidTimeSettings[request.Location.toLowerCase()];
|
let mapSettings = this.locationConfig.scavRaidTimeSettings[request.Location.toLowerCase()];
|
||||||
if (!mapSettings)
|
if (!mapSettings)
|
||||||
{
|
{
|
||||||
@ -517,16 +524,88 @@ export class GameController
|
|||||||
);
|
);
|
||||||
|
|
||||||
// How many minutes raid will be
|
// 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
|
// 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;
|
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
|
* BSG have two values for shotgun dispersion, we make sure both have the same value
|
||||||
*/
|
*/
|
||||||
|
5
project/src/models/eft/game/IGetRaidTimeRequest.ts
Normal file
5
project/src/models/eft/game/IGetRaidTimeRequest.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export interface IGetRaidTimeRequest
|
||||||
|
{
|
||||||
|
Side: string,
|
||||||
|
Location: string
|
||||||
|
}
|
15
project/src/models/eft/game/IGetRaidTimeResponse.ts
Normal file
15
project/src/models/eft/game/IGetRaidTimeResponse.ts
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user