Add 'fixes' section to core.json, expose some flags for enabling spt fixes
Added flag to enable deletion of modded items from profile - default is off Fixed issue where loop would stop checking for modded items after finding the first item
This commit is contained in:
parent
9288a59a77
commit
195d0e3b1d
@ -3,5 +3,9 @@
|
|||||||
"projectName": "SPT-AKI",
|
"projectName": "SPT-AKI",
|
||||||
"compatibleTarkovVersion": "0.13.1.24742",
|
"compatibleTarkovVersion": "0.13.1.24742",
|
||||||
"serverName": "SPT Server",
|
"serverName": "SPT Server",
|
||||||
"profileSaveIntervalSeconds": 15
|
"profileSaveIntervalSeconds": 15,
|
||||||
|
"fixes": {
|
||||||
|
"fixShotgunDispersion": true,
|
||||||
|
"removeModItemsFromProfile": false
|
||||||
|
}
|
||||||
}
|
}
|
@ -648,4 +648,6 @@
|
|||||||
"ignoreMaps": ["base", "develop", "hideout", "privatearea", "suburbs", "terminal", "town"]
|
"ignoreMaps": ["base", "develop", "hideout", "privatearea", "suburbs", "terminal", "town"]
|
||||||
},
|
},
|
||||||
"fitLootIntoContainerAttempts": 2
|
"fitLootIntoContainerAttempts": 2
|
||||||
|
"addOpenZonesToAllMaps": true,
|
||||||
|
"addCustomBotWavesToMaps": true,
|
||||||
}
|
}
|
||||||
|
@ -73,10 +73,20 @@ export class GameController
|
|||||||
// Store start time in app context
|
// Store start time in app context
|
||||||
this.applicationContext.addValue(ContextVariableType.CLIENT_START_TIMESTAMP, startTimeStampMS);
|
this.applicationContext.addValue(ContextVariableType.CLIENT_START_TIMESTAMP, startTimeStampMS);
|
||||||
|
|
||||||
|
if (this.coreConfig.fixes.fixShotgunDispersion)
|
||||||
|
{
|
||||||
this.fixShotgunDispersions();
|
this.fixShotgunDispersions();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.locationConfig.addOpenZonesToAllMaps)
|
||||||
|
{
|
||||||
this.openZoneService.applyZoneChangesToAllMaps();
|
this.openZoneService.applyZoneChangesToAllMaps();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.locationConfig.addCustomBotWavesToMaps)
|
||||||
|
{
|
||||||
this.customLocationWaveService.applyWaveChangesToAllMaps();
|
this.customLocationWaveService.applyWaveChangesToAllMaps();
|
||||||
|
}
|
||||||
|
|
||||||
// repeatableQuests are stored by in profile.Quests due to the responses of the client (e.g. Quests in offraidData)
|
// repeatableQuests are stored by in profile.Quests due to the responses of the client (e.g. Quests in offraidData)
|
||||||
// Since we don't want to clutter the Quests list, we need to remove all completed (failed / successful) repeatable quests.
|
// Since we don't want to clutter the Quests list, we need to remove all completed (failed / successful) repeatable quests.
|
||||||
@ -126,7 +136,7 @@ export class GameController
|
|||||||
|
|
||||||
if (pmcProfile.Inventory)
|
if (pmcProfile.Inventory)
|
||||||
{
|
{
|
||||||
this.profileFixerService.checkForOrphanedModdedItems(pmcProfile);
|
this.profileFixerService.checkForOrphanedModdedItems(sessionID, pmcProfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logProfileDetails(fullProfile);
|
this.logProfileDetails(fullProfile);
|
||||||
|
@ -8,5 +8,14 @@ export interface ICoreConfig extends IBaseConfig
|
|||||||
compatibleTarkovVersion: string
|
compatibleTarkovVersion: string
|
||||||
serverName: string
|
serverName: string
|
||||||
profileSaveIntervalSeconds: number
|
profileSaveIntervalSeconds: number
|
||||||
|
fixes: IGameFixes
|
||||||
commit: string
|
commit: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IGameFixes
|
||||||
|
{
|
||||||
|
/** Shotguns use a different value than normal guns causing huge pellet dispersion */
|
||||||
|
fixShotgunDispersion: boolean
|
||||||
|
/** Remove items added by mods when the mod no longer exists - can fix dead profiles stuck at game load*/
|
||||||
|
removeModItemsFromProfile: boolean
|
||||||
|
}
|
@ -16,6 +16,10 @@ export interface ILocationConfig extends IBaseConfig
|
|||||||
forcedLootSingleSpawnById: Record<string, string[]>
|
forcedLootSingleSpawnById: Record<string, string[]>
|
||||||
/** How many attempts should be taken to fit an item into a container before giving up */
|
/** How many attempts should be taken to fit an item into a container before giving up */
|
||||||
fitLootIntoContainerAttempts: number;
|
fitLootIntoContainerAttempts: number;
|
||||||
|
/** Add all possible zones to each maps `OpenZones` property */
|
||||||
|
addOpenZonesToAllMaps: boolean
|
||||||
|
/** Allow addition of custom bot waves designed by SPT to be added to maps - defined in configs/location.json.customWaves*/
|
||||||
|
addCustomBotWavesToMaps: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IFixEmptyBotWavesSettings
|
export interface IFixEmptyBotWavesSettings
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { inject, injectable } from "tsyringe";
|
import { inject, injectable } from "tsyringe";
|
||||||
|
|
||||||
import { HideoutHelper } from "../helpers/HideoutHelper";
|
import { HideoutHelper } from "../helpers/HideoutHelper";
|
||||||
|
import { InventoryHelper } from "../helpers/InventoryHelper";
|
||||||
import { IPmcData } from "../models/eft/common/IPmcData";
|
import { IPmcData } from "../models/eft/common/IPmcData";
|
||||||
import { Bonus, HideoutSlot } from "../models/eft/common/tables/IBotBase";
|
import { Bonus, HideoutSlot } from "../models/eft/common/tables/IBotBase";
|
||||||
import {
|
import {
|
||||||
@ -8,10 +9,13 @@ import {
|
|||||||
} from "../models/eft/common/tables/IRepeatableQuests";
|
} from "../models/eft/common/tables/IRepeatableQuests";
|
||||||
import { StageBonus } from "../models/eft/hideout/IHideoutArea";
|
import { StageBonus } from "../models/eft/hideout/IHideoutArea";
|
||||||
import { IAkiProfile } from "../models/eft/profile/IAkiProfile";
|
import { IAkiProfile } from "../models/eft/profile/IAkiProfile";
|
||||||
|
import { ConfigTypes } from "../models/enums/ConfigTypes";
|
||||||
import { HideoutAreas } from "../models/enums/HideoutAreas";
|
import { HideoutAreas } from "../models/enums/HideoutAreas";
|
||||||
import { QuestStatus } from "../models/enums/QuestStatus";
|
import { QuestStatus } from "../models/enums/QuestStatus";
|
||||||
import { Traders } from "../models/enums/Traders";
|
import { Traders } from "../models/enums/Traders";
|
||||||
|
import { ICoreConfig } from "../models/spt/config/ICoreConfig";
|
||||||
import { ILogger } from "../models/spt/utils/ILogger";
|
import { ILogger } from "../models/spt/utils/ILogger";
|
||||||
|
import { ConfigServer } from "../servers/ConfigServer";
|
||||||
import { DatabaseServer } from "../servers/DatabaseServer";
|
import { DatabaseServer } from "../servers/DatabaseServer";
|
||||||
import { TimeUtil } from "../utils/TimeUtil";
|
import { TimeUtil } from "../utils/TimeUtil";
|
||||||
import { Watermark } from "../utils/Watermark";
|
import { Watermark } from "../utils/Watermark";
|
||||||
@ -20,15 +24,21 @@ import { LocalisationService } from "./LocalisationService";
|
|||||||
@injectable()
|
@injectable()
|
||||||
export class ProfileFixerService
|
export class ProfileFixerService
|
||||||
{
|
{
|
||||||
|
protected coreConfig: ICoreConfig;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@inject("WinstonLogger") protected logger: ILogger,
|
@inject("WinstonLogger") protected logger: ILogger,
|
||||||
@inject("Watermark") protected watermark: Watermark,
|
@inject("Watermark") protected watermark: Watermark,
|
||||||
@inject("HideoutHelper") protected hideoutHelper: HideoutHelper,
|
@inject("HideoutHelper") protected hideoutHelper: HideoutHelper,
|
||||||
|
@inject("InventoryHelper") protected inventoryHelper: InventoryHelper,
|
||||||
@inject("LocalisationService") protected localisationService: LocalisationService,
|
@inject("LocalisationService") protected localisationService: LocalisationService,
|
||||||
@inject("TimeUtil") protected timeUtil: TimeUtil,
|
@inject("TimeUtil") protected timeUtil: TimeUtil,
|
||||||
@inject("DatabaseServer") protected databaseServer: DatabaseServer
|
@inject("DatabaseServer") protected databaseServer: DatabaseServer,
|
||||||
|
@inject("ConfigServer") protected configServer: ConfigServer
|
||||||
)
|
)
|
||||||
{ }
|
{
|
||||||
|
this.coreConfig = this.configServer.getConfig(ConfigTypes.CORE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find issues in the pmc profile data that may cause issues and fix them
|
* Find issues in the pmc profile data that may cause issues and fix them
|
||||||
@ -580,9 +590,10 @@ export class ProfileFixerService
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks profile inventiory for items that do not exist inside the items db
|
* Checks profile inventiory for items that do not exist inside the items db
|
||||||
|
* @param sessionId Session id
|
||||||
* @param pmcProfile Profile to check inventory of
|
* @param pmcProfile Profile to check inventory of
|
||||||
*/
|
*/
|
||||||
public checkForOrphanedModdedItems(pmcProfile: IPmcData): void
|
public checkForOrphanedModdedItems(sessionId: string, pmcProfile: IPmcData): void
|
||||||
{
|
{
|
||||||
const itemsDb = this.databaseServer.getTables().templates.items;
|
const itemsDb = this.databaseServer.getTables().templates.items;
|
||||||
|
|
||||||
@ -594,13 +605,22 @@ export class ProfileFixerService
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check each item in inventory to ensure item exists in itemdb
|
||||||
for (const item of inventoryItemsToCheck)
|
for (const item of inventoryItemsToCheck)
|
||||||
{
|
{
|
||||||
if (!itemsDb[item._tpl])
|
if (!itemsDb[item._tpl])
|
||||||
{
|
{
|
||||||
this.logger.error(this.localisationService.getText("fixer-mod_item_found", item._tpl));
|
this.logger.error(this.localisationService.getText("fixer-mod_item_found", item._tpl));
|
||||||
|
|
||||||
return;
|
if (this.coreConfig.fixes.removeModItemsFromProfile)
|
||||||
|
{
|
||||||
|
this.logger.success(`Deleting item from inventory and insurance with id: ${item._id} tpl: ${item._tpl}`);
|
||||||
|
|
||||||
|
// Also deletes from insured array
|
||||||
|
this.inventoryHelper.removeItem(pmcProfile, item._id, sessionId);
|
||||||
|
|
||||||
|
// TODO: delete item from mail
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user