Rename cloned variables to help with readability

This commit is contained in:
Dev 2024-02-05 14:43:46 +00:00
parent 183e71370a
commit bf5f3316b1
15 changed files with 130 additions and 116 deletions

View File

@ -212,12 +212,12 @@ export class BotController
let cacheKey = ""; let cacheKey = "";
for (let i = 0; i < botGenerationDetails.botCountToGenerate; i++) for (let i = 0; i < botGenerationDetails.botCountToGenerate; i++)
{ {
const details = this.jsonUtil.clone(botGenerationDetails); const detailsClone = this.jsonUtil.clone(botGenerationDetails);
cacheKey = `${details.role}${details.botDifficulty}`; cacheKey = `${detailsClone.role}${detailsClone.botDifficulty}`;
// Generate and add bot to cache // Generate and add bot to cache
const botToCache = this.botGenerator.prepareAndGenerateBot(sessionId, details); const botToCache = this.botGenerator.prepareAndGenerateBot(sessionId, detailsClone);
this.botGenerationCacheService.storeBots(cacheKey, [botToCache]); this.botGenerationCacheService.storeBots(cacheKey, [botToCache]);
} }

View File

@ -40,19 +40,19 @@ export class BuildController
} }
// Ensure the secure container in the default presets match what the player has equipped // Ensure the secure container in the default presets match what the player has equipped
const defaultEquipmentPresets = this.jsonUtil.clone( const defaultEquipmentPresetsClone = this.jsonUtil.clone(
this.databaseServer.getTables().templates.defaultEquipmentPresets, this.databaseServer.getTables().templates.defaultEquipmentPresets,
); );
const playerSecureContainer = profile.characters.pmc.Inventory.items?.find((x) => const playerSecureContainer = profile.characters.pmc.Inventory.items?.find((x) =>
x.slotId === secureContainerSlotId x.slotId === secureContainerSlotId
); );
const firstDefaultItemsSecureContainer = defaultEquipmentPresets[0]?.Items?.find((x) => const firstDefaultItemsSecureContainer = defaultEquipmentPresetsClone[0]?.Items?.find((x) =>
x.slotId === secureContainerSlotId x.slotId === secureContainerSlotId
); );
if (playerSecureContainer && playerSecureContainer?._tpl !== firstDefaultItemsSecureContainer?._tpl) if (playerSecureContainer && playerSecureContainer?._tpl !== firstDefaultItemsSecureContainer?._tpl)
{ {
// Default equipment presets' secure container tpl doesn't match players secure container tpl // Default equipment presets' secure container tpl doesn't match players secure container tpl
for (const defaultPreset of defaultEquipmentPresets) for (const defaultPreset of defaultEquipmentPresetsClone)
{ {
// Find presets secure container // Find presets secure container
const secureContainer = defaultPreset.Items.find((item) => item.slotId === secureContainerSlotId); const secureContainer = defaultPreset.Items.find((item) => item.slotId === secureContainerSlotId);
@ -64,10 +64,10 @@ export class BuildController
} }
// Clone player build data from profile and append the above defaults onto end // Clone player build data from profile and append the above defaults onto end
const result = this.jsonUtil.clone(profile.userbuilds); const userBuildsClone = this.jsonUtil.clone(profile.userbuilds);
result.equipmentBuilds.push(...defaultEquipmentPresets); userBuildsClone.equipmentBuilds.push(...defaultEquipmentPresetsClone);
return result; return userBuildsClone;
} }
/** Handle client/builds/weapon/save */ /** Handle client/builds/weapon/save */

View File

@ -725,17 +725,17 @@ export class GameController
for (let index = indexOfWaveToSplit + 1; index < indexOfWaveToSplit + waveSize; index++) for (let index = indexOfWaveToSplit + 1; index < indexOfWaveToSplit + waveSize; index++)
{ {
// Clone wave ready to insert into array // Clone wave ready to insert into array
const waveToAdd = this.jsonUtil.clone(wave); const waveToAddClone = this.jsonUtil.clone(wave);
// Some waves have value of 0 for some reason, preserve // Some waves have value of 0 for some reason, preserve
if (waveToAdd.number !== 0) if (waveToAddClone.number !== 0)
{ {
// Update wave number to new location in array // Update wave number to new location in array
waveToAdd.number = index; waveToAddClone.number = index;
} }
// Place wave into array in just-edited position + 1 // Place wave into array in just-edited position + 1
location.base.waves.splice(index, 0, waveToAdd); location.base.waves.splice(index, 0, waveToAddClone);
wavesAddedCount++; wavesAddedCount++;
} }

View File

@ -582,14 +582,16 @@ export class HideoutController
const recipe = this.databaseServer.getTables().hideout.production.find((p) => p._id === body.recipeId); const recipe = this.databaseServer.getTables().hideout.production.find((p) => p._id === body.recipeId);
// Find the actual amount of items we need to remove because body can send weird data // Find the actual amount of items we need to remove because body can send weird data
const requirements = this.jsonUtil.clone(recipe.requirements.filter((i) => i.type === "Item")); const recipeRequirementsClone = this.jsonUtil.clone(recipe.requirements.filter((i) => i.type === "Item"));
const output = this.eventOutputHolder.getOutput(sessionID); const output = this.eventOutputHolder.getOutput(sessionID);
for (const itemToDelete of body.items) for (const itemToDelete of body.items)
{ {
const itemToCheck = pmcData.Inventory.items.find((i) => i._id === itemToDelete.id); const itemToCheck = pmcData.Inventory.items.find((i) => i._id === itemToDelete.id);
const requirement = requirements.find((requirement) => requirement.templateId === itemToCheck._tpl); const requirement = recipeRequirementsClone.find((requirement) =>
requirement.templateId === itemToCheck._tpl
);
if (requirement.count <= 0) if (requirement.count <= 0)
{ {
continue; continue;

View File

@ -79,14 +79,14 @@ export class LocationController
{ {
const db = this.databaseServer.getTables(); const db = this.databaseServer.getTables();
const location: ILocation = db.locations[name]; const location: ILocation = db.locations[name];
const output: ILocationBase = this.jsonUtil.clone(location.base); const locationBaseClone: ILocationBase = this.jsonUtil.clone(location.base);
output.UnixDateTime = this.timeUtil.getTimestamp(); locationBaseClone.UnixDateTime = this.timeUtil.getTimestamp();
// Don't generate loot for hideout // Don't generate loot for hideout
if (name === "hideout") if (name === "hideout")
{ {
return output; return locationBaseClone;
} }
// Check for a loot multipler adjustment in app context and apply if one is found // Check for a loot multipler adjustment in app context and apply if one is found
@ -97,25 +97,25 @@ export class LocationController
if (raidAdjustments) if (raidAdjustments)
{ {
locationConfigCopy = this.jsonUtil.clone(this.locationConfig); // Clone values so they can be used to reset originals later locationConfigCopy = this.jsonUtil.clone(this.locationConfig); // Clone values so they can be used to reset originals later
this.raidTimeAdjustmentService.makeAdjustmentsToMap(raidAdjustments, output); this.raidTimeAdjustmentService.makeAdjustmentsToMap(raidAdjustments, locationBaseClone);
} }
const staticAmmoDist = this.jsonUtil.clone(db.loot.staticAmmo); const staticAmmoDist = this.jsonUtil.clone(db.loot.staticAmmo);
// Create containers and add loot to them // Create containers and add loot to them
const staticLoot = this.locationGenerator.generateStaticContainers(output, staticAmmoDist); const staticLoot = this.locationGenerator.generateStaticContainers(locationBaseClone, staticAmmoDist);
output.Loot.push(...staticLoot); locationBaseClone.Loot.push(...staticLoot);
// Add dynamic loot to output loot // Add dynamic loot to output loot
const dynamicLootDist: ILooseLoot = this.jsonUtil.clone(location.looseLoot); const dynamicLootDistClone: ILooseLoot = this.jsonUtil.clone(location.looseLoot);
const dynamicSpawnPoints: SpawnpointTemplate[] = this.locationGenerator.generateDynamicLoot( const dynamicSpawnPoints: SpawnpointTemplate[] = this.locationGenerator.generateDynamicLoot(
dynamicLootDist, dynamicLootDistClone,
staticAmmoDist, staticAmmoDist,
name, name,
); );
for (const spawnPoint of dynamicSpawnPoints) for (const spawnPoint of dynamicSpawnPoints)
{ {
output.Loot.push(spawnPoint); locationBaseClone.Loot.push(spawnPoint);
} }
// Done generating, log results // Done generating, log results
@ -134,7 +134,7 @@ export class LocationController
this.applicationContext.clearValues(ContextVariableType.RAID_ADJUSTMENTS); this.applicationContext.clearValues(ContextVariableType.RAID_ADJUSTMENTS);
} }
return output; return locationBaseClone;
} }
/** /**

View File

@ -492,7 +492,7 @@ export class QuestController
const preCompleteProfileQuests = this.jsonUtil.clone(pmcData.Quests); const preCompleteProfileQuests = this.jsonUtil.clone(pmcData.Quests);
const completedQuestId = body.qid; const completedQuestId = body.qid;
const beforeQuests = this.jsonUtil.clone(this.getClientQuests(sessionID)); // Must be gathered prior to applyQuestReward() & failQuests() const clientQuestsClone = this.jsonUtil.clone(this.getClientQuests(sessionID)); // Must be gathered prior to applyQuestReward() & failQuests()
const newQuestState = QuestStatus.Success; const newQuestState = QuestStatus.Success;
this.questHelper.updateQuestState(pmcData, newQuestState, completedQuestId); this.questHelper.updateQuestState(pmcData, newQuestState, completedQuestId);
@ -508,7 +508,7 @@ export class QuestController
this.sendSuccessDialogMessageOnQuestComplete(sessionID, pmcData, completedQuestId, questRewards); this.sendSuccessDialogMessageOnQuestComplete(sessionID, pmcData, completedQuestId, questRewards);
// Add diff of quests before completion vs after for client response // Add diff of quests before completion vs after for client response
const questDelta = this.questHelper.getDeltaQuests(beforeQuests, this.getClientQuests(sessionID)); const questDelta = this.questHelper.getDeltaQuests(clientQuestsClone, this.getClientQuests(sessionID));
// Check newly available + failed quests for timegates and add them to profile // Check newly available + failed quests for timegates and add them to profile
this.addTimeLockedQuestsToProfile(pmcData, [...questDelta], body.qid); this.addTimeLockedQuestsToProfile(pmcData, [...questDelta], body.qid);

View File

@ -57,8 +57,8 @@ export class TraderController
// Create dict of trader assorts on server start // Create dict of trader assorts on server start
if (!this.traderAssortService.getPristineTraderAssort(traderId)) if (!this.traderAssortService.getPristineTraderAssort(traderId))
{ {
const assorts = this.jsonUtil.clone(trader.assort); const assortsClone = this.jsonUtil.clone(trader.assort);
this.traderAssortService.setPristineTraderAssort(traderId, assorts); this.traderAssortService.setPristineTraderAssort(traderId, assortsClone);
} }
this.traderPurchasePersisterService.removeStalePurchasesFromProfiles(traderId); this.traderPurchasePersisterService.removeStalePurchasesFromProfiles(traderId);

View File

@ -109,11 +109,11 @@ export class BotGenerator
bot.Info.Settings.BotDifficulty = botGenerationDetails.botDifficulty; bot.Info.Settings.BotDifficulty = botGenerationDetails.botDifficulty;
// Get raw json data for bot (Cloned) // Get raw json data for bot (Cloned)
const botJsonTemplate = this.jsonUtil.clone( const botJsonTemplateClone = this.jsonUtil.clone(
this.botHelper.getBotTemplate((botGenerationDetails.isPmc) ? bot.Info.Side : botGenerationDetails.role), this.botHelper.getBotTemplate((botGenerationDetails.isPmc) ? bot.Info.Side : botGenerationDetails.role),
); );
bot = this.generateBot(sessionId, bot, botJsonTemplate, botGenerationDetails); bot = this.generateBot(sessionId, bot, botJsonTemplateClone, botGenerationDetails);
return bot; return bot;
} }

View File

@ -87,27 +87,27 @@ export class LocationGenerator
const db = this.databaseServer.getTables(); const db = this.databaseServer.getTables();
const staticWeaponsOnMap = this.jsonUtil.clone(db.loot.staticContainers[locationBase.Name]?.staticWeapons); const staticWeaponsOnMapClone = this.jsonUtil.clone(db.loot.staticContainers[locationBase.Name]?.staticWeapons);
if (!staticWeaponsOnMap) if (!staticWeaponsOnMapClone)
{ {
this.logger.error(`Unable to find static weapon data for map: ${locationBase.Name}`); this.logger.error(`Unable to find static weapon data for map: ${locationBase.Name}`);
} }
// Add mounted weapons to output loot // Add mounted weapons to output loot
result.push(...staticWeaponsOnMap ?? []); result.push(...staticWeaponsOnMapClone ?? []);
const allStaticContainersOnMap = this.jsonUtil.clone( const allStaticContainersOnMapClone = this.jsonUtil.clone(
db.loot.staticContainers[locationBase.Name]?.staticContainers, db.loot.staticContainers[locationBase.Name]?.staticContainers,
); );
if (!allStaticContainersOnMap) if (!allStaticContainersOnMapClone)
{ {
this.logger.error(`Unable to find static container data for map: ${locationBase.Name}`); this.logger.error(`Unable to find static container data for map: ${locationBase.Name}`);
} }
const staticRandomisableContainersOnMap = this.getRandomisableContainersOnMap(allStaticContainersOnMap); const staticRandomisableContainersOnMap = this.getRandomisableContainersOnMap(allStaticContainersOnMapClone);
// Containers that MUST be added to map (quest containers etc) // Containers that MUST be added to map (quest containers etc)
const staticForcedOnMap = this.jsonUtil.clone(db.loot.staticContainers[locationBase.Name]?.staticForced); const staticForcedOnMapClone = this.jsonUtil.clone(db.loot.staticContainers[locationBase.Name]?.staticForced);
if (!staticForcedOnMap) if (!staticForcedOnMapClone)
{ {
this.logger.error(`Unable to find forced static data for map: ${locationBase.Name}`); this.logger.error(`Unable to find forced static data for map: ${locationBase.Name}`);
} }
@ -117,7 +117,7 @@ export class LocationGenerator
// Find all 100% spawn containers // Find all 100% spawn containers
const staticLootDist = db.loot.staticLoot; const staticLootDist = db.loot.staticLoot;
const guaranteedContainers = this.getGuaranteedContainers(allStaticContainersOnMap); const guaranteedContainers = this.getGuaranteedContainers(allStaticContainersOnMapClone);
staticContainerCount += guaranteedContainers.length; staticContainerCount += guaranteedContainers.length;
// Add loot to guaranteed containers and add to result // Add loot to guaranteed containers and add to result
@ -125,7 +125,7 @@ export class LocationGenerator
{ {
const containerWithLoot = this.addLootToContainer( const containerWithLoot = this.addLootToContainer(
container, container,
staticForcedOnMap, staticForcedOnMapClone,
staticLootDist, staticLootDist,
staticAmmoDist, staticAmmoDist,
locationId, locationId,
@ -150,7 +150,7 @@ export class LocationGenerator
{ {
const containerWithLoot = this.addLootToContainer( const containerWithLoot = this.addLootToContainer(
container, container,
staticForcedOnMap, staticForcedOnMapClone,
staticLootDist, staticLootDist,
staticAmmoDist, staticAmmoDist,
locationId, locationId,
@ -239,7 +239,7 @@ export class LocationGenerator
// Add loot to container and push into result object // Add loot to container and push into result object
const containerWithLoot = this.addLootToContainer( const containerWithLoot = this.addLootToContainer(
containerObject, containerObject,
staticForcedOnMap, staticForcedOnMapClone,
staticLootDist, staticLootDist,
staticAmmoDist, staticAmmoDist,
locationId, locationId,
@ -400,13 +400,13 @@ export class LocationGenerator
locationName: string, locationName: string,
): IStaticContainerData ): IStaticContainerData
{ {
const container = this.jsonUtil.clone(staticContainer); const containerClone = this.jsonUtil.clone(staticContainer);
const containerTpl = container.template.Items[0]._tpl; const containerTpl = containerClone.template.Items[0]._tpl;
// Create new unique parent id to prevent any collisions // Create new unique parent id to prevent any collisions
const parentId = this.objectId.generate(); const parentId = this.objectId.generate();
container.template.Root = parentId; containerClone.template.Root = parentId;
container.template.Items[0]._id = parentId; containerClone.template.Items[0]._id = parentId;
let containerMap = this.getContainerMapping(containerTpl); let containerMap = this.getContainerMapping(containerTpl);
@ -417,7 +417,9 @@ export class LocationGenerator
const containerLootPool = this.getPossibleLootItemsForContainer(containerTpl, staticLootDist); const containerLootPool = this.getPossibleLootItemsForContainer(containerTpl, staticLootDist);
// Some containers need to have items forced into it (quest keys etc) // Some containers need to have items forced into it (quest keys etc)
const tplsForced = staticForced.filter((x) => x.containerId === container.template.Id).map((x) => x.itemTpl); const tplsForced = staticForced.filter((x) => x.containerId === containerClone.template.Id).map((x) =>
x.itemTpl
);
// Draw random loot // Draw random loot
// Money spawn more than once in container // Money spawn more than once in container
@ -473,11 +475,11 @@ export class LocationGenerator
// Add loot to container before returning // Add loot to container before returning
for (const item of items) for (const item of items)
{ {
container.template.Items.push(item); containerClone.template.Items.push(item);
} }
} }
return container; return containerClone;
} }
/** /**

View File

@ -64,11 +64,13 @@ export class PlayerScavGenerator
{ {
// get karma level from profile // get karma level from profile
const profile = this.saveServer.getProfile(sessionID); const profile = this.saveServer.getProfile(sessionID);
const pmcData = this.jsonUtil.clone(profile.characters.pmc); const pmcDataClone = this.jsonUtil.clone(profile.characters.pmc);
const existingScavData = this.jsonUtil.clone(profile.characters.scav); const existingScavDataClone = this.jsonUtil.clone(profile.characters.scav);
// scav profile can be empty on first profile creation // scav profile can be empty on first profile creation
const scavKarmaLevel = (Object.keys(existingScavData).length === 0) ? 0 : this.getScavKarmaLevel(pmcData); const scavKarmaLevel = (Object.keys(existingScavDataClone).length === 0)
? 0
: this.getScavKarmaLevel(pmcDataClone);
// use karma level to get correct karmaSettings // use karma level to get correct karmaSettings
const playerScavKarmaSettings = this.playerScavConfig.karmaLevel[scavKarmaLevel]; const playerScavKarmaSettings = this.playerScavConfig.karmaLevel[scavKarmaLevel];
@ -95,28 +97,28 @@ export class PlayerScavGenerator
// Add scav metadata // Add scav metadata
scavData.savage = null; scavData.savage = null;
scavData.aid = pmcData.aid; scavData.aid = pmcDataClone.aid;
scavData.TradersInfo = pmcData.TradersInfo; scavData.TradersInfo = pmcDataClone.TradersInfo;
scavData.Info.Settings = {} as Settings; scavData.Info.Settings = {} as Settings;
scavData.Info.Bans = []; scavData.Info.Bans = [];
scavData.Info.RegistrationDate = pmcData.Info.RegistrationDate; scavData.Info.RegistrationDate = pmcDataClone.Info.RegistrationDate;
scavData.Info.GameVersion = pmcData.Info.GameVersion; scavData.Info.GameVersion = pmcDataClone.Info.GameVersion;
scavData.Info.MemberCategory = MemberCategory.UNIQUE_ID; scavData.Info.MemberCategory = MemberCategory.UNIQUE_ID;
scavData.Info.lockedMoveCommands = true; scavData.Info.lockedMoveCommands = true;
scavData.RagfairInfo = pmcData.RagfairInfo; scavData.RagfairInfo = pmcDataClone.RagfairInfo;
scavData.UnlockedInfo = pmcData.UnlockedInfo; scavData.UnlockedInfo = pmcDataClone.UnlockedInfo;
// Persist previous scav data into new scav // Persist previous scav data into new scav
scavData._id = existingScavData._id ?? pmcData.savage; scavData._id = existingScavDataClone._id ?? pmcDataClone.savage;
scavData.sessionId = existingScavData.sessionId ?? pmcData.sessionId; scavData.sessionId = existingScavDataClone.sessionId ?? pmcDataClone.sessionId;
scavData.Skills = this.getScavSkills(existingScavData); scavData.Skills = this.getScavSkills(existingScavDataClone);
scavData.Stats = this.getScavStats(existingScavData); scavData.Stats = this.getScavStats(existingScavDataClone);
scavData.Info.Level = this.getScavLevel(existingScavData); scavData.Info.Level = this.getScavLevel(existingScavDataClone);
scavData.Info.Experience = this.getScavExperience(existingScavData); scavData.Info.Experience = this.getScavExperience(existingScavDataClone);
scavData.Quests = existingScavData.Quests ?? []; scavData.Quests = existingScavDataClone.Quests ?? [];
scavData.TaskConditionCounters = existingScavData.TaskConditionCounters ?? {}; scavData.TaskConditionCounters = existingScavDataClone.TaskConditionCounters ?? {};
scavData.Notes = existingScavData.Notes ?? { Notes: [] }; scavData.Notes = existingScavDataClone.Notes ?? { Notes: [] };
scavData.WishList = existingScavData.WishList ?? []; scavData.WishList = existingScavDataClone.WishList ?? [];
// Add an extra labs card to pscav backpack based on config chance // Add an extra labs card to pscav backpack based on config chance
if (this.randomUtil.getChance100(playerScavKarmaSettings.labsAccessCardChancePercent)) if (this.randomUtil.getChance100(playerScavKarmaSettings.labsAccessCardChancePercent))
@ -145,7 +147,7 @@ export class PlayerScavGenerator
scavData = this.profileHelper.removeSecureContainer(scavData); scavData = this.profileHelper.removeSecureContainer(scavData);
// Set cooldown timer // Set cooldown timer
scavData = this.setScavCooldownTimer(scavData, pmcData); scavData = this.setScavCooldownTimer(scavData, pmcDataClone);
// Add scav to the profile // Add scav to the profile
this.saveServer.getProfile(sessionID).characters.scav = scavData; this.saveServer.getProfile(sessionID).characters.scav = scavData;

View File

@ -996,11 +996,11 @@ export class RepeatableQuestGenerator
{ {
// Add a random default preset weapon as reward // Add a random default preset weapon as reward
const defaultPresets = Object.values(this.presetHelper.getDefaultPresets()); const defaultPresets = Object.values(this.presetHelper.getDefaultPresets());
const defaultPreset = this.jsonUtil.clone(this.randomUtil.getArrayValue(defaultPresets)); const defaultPresetClone = this.jsonUtil.clone(this.randomUtil.getArrayValue(defaultPresets));
// use _encyclopedia as its always the base items _tpl, items[0] isnt guaranteed to be base item // use _encyclopedia as its always the base items _tpl, items[0] isnt guaranteed to be base item
rewards.Success.push( rewards.Success.push(
this.generateRewardItem(defaultPreset._encyclopedia, 1, rewardIndex, defaultPreset._items), this.generateRewardItem(defaultPresetClone._encyclopedia, 1, rewardIndex, defaultPresetClone._items),
); );
rewardIndex++; rewardIndex++;
} }
@ -1286,11 +1286,11 @@ export class RepeatableQuestGenerator
// @Incomplete: define Type for "type". // @Incomplete: define Type for "type".
protected generateRepeatableTemplate(type: string, traderId: string, side: string): IRepeatableQuest protected generateRepeatableTemplate(type: string, traderId: string, side: string): IRepeatableQuest
{ {
const quest = this.jsonUtil.clone<IRepeatableQuest>( const questClone = this.jsonUtil.clone<IRepeatableQuest>(
this.databaseServer.getTables().templates.repeatableQuests.templates[type], this.databaseServer.getTables().templates.repeatableQuests.templates[type],
); );
quest._id = this.objectId.generate(); questClone._id = this.objectId.generate();
quest.traderId = traderId; questClone.traderId = traderId;
/* in locale, these id correspond to the text of quests /* in locale, these id correspond to the text of quests
template ids -pmc : Elimination = 616052ea3054fc0e2c24ce6e / Completion = 61604635c725987e815b1a46 / Exploration = 616041eb031af660100c9967 template ids -pmc : Elimination = 616052ea3054fc0e2c24ce6e / Completion = 61604635c725987e815b1a46 / Exploration = 616041eb031af660100c9967
@ -1298,40 +1298,49 @@ export class RepeatableQuestGenerator
*/ */
// Get template id from config based on side and type of quest // Get template id from config based on side and type of quest
quest.templateId = this.questConfig.questTemplateIds[side.toLowerCase()][type.toLowerCase()]; questClone.templateId = this.questConfig.questTemplateIds[side.toLowerCase()][type.toLowerCase()];
quest.name = quest.name.replace("{traderId}", traderId).replace("{templateId}", quest.templateId); questClone.name = questClone.name.replace("{traderId}", traderId).replace(
quest.note = quest.note.replace("{traderId}", traderId).replace("{templateId}", quest.templateId);
quest.description = quest.description.replace("{traderId}", traderId).replace("{templateId}", quest.templateId);
quest.successMessageText = quest.successMessageText.replace("{traderId}", traderId).replace(
"{templateId}", "{templateId}",
quest.templateId, questClone.templateId,
); );
quest.failMessageText = quest.failMessageText.replace("{traderId}", traderId).replace( questClone.note = questClone.note.replace("{traderId}", traderId).replace(
"{templateId}", "{templateId}",
quest.templateId, questClone.templateId,
); );
quest.startedMessageText = quest.startedMessageText.replace("{traderId}", traderId).replace( questClone.description = questClone.description.replace("{traderId}", traderId).replace(
"{templateId}", "{templateId}",
quest.templateId, questClone.templateId,
); );
quest.changeQuestMessageText = quest.changeQuestMessageText.replace("{traderId}", traderId).replace( questClone.successMessageText = questClone.successMessageText.replace("{traderId}", traderId).replace(
"{templateId}", "{templateId}",
quest.templateId, questClone.templateId,
); );
quest.acceptPlayerMessage = quest.acceptPlayerMessage.replace("{traderId}", traderId).replace( questClone.failMessageText = questClone.failMessageText.replace("{traderId}", traderId).replace(
"{templateId}", "{templateId}",
quest.templateId, questClone.templateId,
); );
quest.declinePlayerMessage = quest.declinePlayerMessage.replace("{traderId}", traderId).replace( questClone.startedMessageText = questClone.startedMessageText.replace("{traderId}", traderId).replace(
"{templateId}", "{templateId}",
quest.templateId, questClone.templateId,
); );
quest.completePlayerMessage = quest.completePlayerMessage.replace("{traderId}", traderId).replace( questClone.changeQuestMessageText = questClone.changeQuestMessageText.replace("{traderId}", traderId).replace(
"{templateId}", "{templateId}",
quest.templateId, questClone.templateId,
);
questClone.acceptPlayerMessage = questClone.acceptPlayerMessage.replace("{traderId}", traderId).replace(
"{templateId}",
questClone.templateId,
);
questClone.declinePlayerMessage = questClone.declinePlayerMessage.replace("{traderId}", traderId).replace(
"{templateId}",
questClone.templateId,
);
questClone.completePlayerMessage = questClone.completePlayerMessage.replace("{traderId}", traderId).replace(
"{templateId}",
questClone.templateId,
); );
return quest; return questClone;
} }
} }

View File

@ -556,12 +556,12 @@ export class ItemHelper
while (remainingCount) while (remainingCount)
{ {
const amount = Math.min(remainingCount, maxStackSize); const amount = Math.min(remainingCount, maxStackSize);
const newStack = this.jsonUtil.clone(itemToSplit); const newStackClone = this.jsonUtil.clone(itemToSplit);
newStack._id = this.hashUtil.generate(); newStackClone._id = this.hashUtil.generate();
newStack.upd.StackObjectsCount = amount; newStackClone.upd.StackObjectsCount = amount;
remainingCount -= amount; remainingCount -= amount;
rootAndChildren.push(newStack); rootAndChildren.push(newStackClone);
} }
return rootAndChildren; return rootAndChildren;
@ -589,12 +589,12 @@ export class ItemHelper
while (remainingCount) while (remainingCount)
{ {
const amount = Math.min(remainingCount, itemMaxStackSize); const amount = Math.min(remainingCount, itemMaxStackSize);
const newItem = this.jsonUtil.clone(itemToSplit); const newItemClone = this.jsonUtil.clone(itemToSplit);
newItem._id = this.hashUtil.generate(); newItemClone._id = this.hashUtil.generate();
newItem.upd.StackObjectsCount = amount; newItemClone.upd.StackObjectsCount = amount;
remainingCount -= amount; remainingCount -= amount;
result.push([newItem]); result.push([newItemClone]);
} }
return result; return result;

View File

@ -324,16 +324,16 @@ export class QuestHelper
for (const target of targets) for (const target of targets)
{ {
// This has all the original id relations since we reset the id to the original after the splitStack // This has all the original id relations since we reset the id to the original after the splitStack
const items = [this.jsonUtil.clone(target)]; const itemsClone = [this.jsonUtil.clone(target)];
// Here we generate a new id for the root item // Here we generate a new id for the root item
target._id = this.hashUtil.generate(); target._id = this.hashUtil.generate();
for (const mod of mods) for (const mod of mods)
{ {
items.push(this.jsonUtil.clone(mod)); itemsClone.push(this.jsonUtil.clone(mod));
} }
rewardItems = rewardItems.concat(this.itemHelper.reparentItemAndChildren(target, items)); rewardItems = rewardItems.concat(this.itemHelper.reparentItemAndChildren(target, itemsClone));
} }
return rewardItems; return rewardItems;

View File

@ -6,7 +6,6 @@ import { TraderAssortHelper } from "@spt-aki/helpers/TraderAssortHelper";
import { TraderHelper } from "@spt-aki/helpers/TraderHelper"; import { TraderHelper } from "@spt-aki/helpers/TraderHelper";
import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { IPmcData } from "@spt-aki/models/eft/common/IPmcData";
import { Item } from "@spt-aki/models/eft/common/tables/IItem"; import { Item } from "@spt-aki/models/eft/common/tables/IItem";
import { IAddItemDirectRequest } from "@spt-aki/models/eft/inventory/IAddItemDirectRequest";
import { IAddItemsDirectRequest } from "@spt-aki/models/eft/inventory/IAddItemsDirectRequest"; import { IAddItemsDirectRequest } from "@spt-aki/models/eft/inventory/IAddItemsDirectRequest";
import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse";
import { IProcessBuyTradeRequestData } from "@spt-aki/models/eft/trade/IProcessBuyTradeRequestData"; import { IProcessBuyTradeRequestData } from "@spt-aki/models/eft/trade/IProcessBuyTradeRequestData";

View File

@ -69,7 +69,7 @@ export class TraderAssortHelper
return this.getRagfairDataAsTraderAssort(); return this.getRagfairDataAsTraderAssort();
} }
const trader = this.jsonUtil.clone(this.databaseServer.getTables().traders[traderId]); const traderClone = this.jsonUtil.clone(this.databaseServer.getTables().traders[traderId]);
const pmcProfile = this.profileHelper.getPmcProfile(sessionId); const pmcProfile = this.profileHelper.getPmcProfile(sessionId);
if (traderId === Traders.FENCE) if (traderId === Traders.FENCE)
@ -80,13 +80,13 @@ export class TraderAssortHelper
// Strip assorts player should not see yet // Strip assorts player should not see yet
if (!flea) if (!flea)
{ {
trader.assort = this.assortHelper.stripLockedLoyaltyAssort(pmcProfile, traderId, trader.assort); traderClone.assort = this.assortHelper.stripLockedLoyaltyAssort(pmcProfile, traderId, traderClone.assort);
} }
this.resetBuyRestrictionCurrentValue(trader.assort.items); this.resetBuyRestrictionCurrentValue(traderClone.assort.items);
// Append nextResupply value to assorts so client knows when refresh is occuring // Append nextResupply value to assorts so client knows when refresh is occuring
trader.assort.nextResupply = trader.base.nextResupply; traderClone.assort.nextResupply = traderClone.base.nextResupply;
// Adjust displayed assort counts based on values stored in profile // Adjust displayed assort counts based on values stored in profile
const assortPurchasesfromTrader = this.traderPurchasePersisterService.getProfileTraderPurchases( const assortPurchasesfromTrader = this.traderPurchasePersisterService.getProfileTraderPurchases(
@ -96,11 +96,11 @@ export class TraderAssortHelper
for (const assortId in assortPurchasesfromTrader) for (const assortId in assortPurchasesfromTrader)
{ {
// Find assort we want to update current buy count of // Find assort we want to update current buy count of
const assortToAdjust = trader.assort.items.find((x) => x._id === assortId); const assortToAdjust = traderClone.assort.items.find((x) => x._id === assortId);
if (!assortToAdjust) if (!assortToAdjust)
{ {
this.logger.debug( this.logger.debug(
`Cannot find trader: ${trader.base.nickname} assort: ${assortId} to adjust BuyRestrictionCurrent value, skipping`, `Cannot find trader: ${traderClone.base.nickname} assort: ${assortId} to adjust BuyRestrictionCurrent value, skipping`,
); );
continue; continue;
@ -124,10 +124,10 @@ export class TraderAssortHelper
this.hydrateMergedQuestAssorts(); this.hydrateMergedQuestAssorts();
this.createdMergedQuestAssorts = true; this.createdMergedQuestAssorts = true;
} }
trader.assort = this.assortHelper.stripLockedQuestAssort( traderClone.assort = this.assortHelper.stripLockedQuestAssort(
pmcProfile, pmcProfile,
traderId, traderId,
trader.assort, traderClone.assort,
this.mergedQuestAssorts, this.mergedQuestAssorts,
flea, flea,
); );
@ -135,10 +135,10 @@ export class TraderAssortHelper
// Multiply price if multiplier is other than 1 // Multiply price if multiplier is other than 1
if (this.traderConfig.traderPriceMultipler !== 1) if (this.traderConfig.traderPriceMultipler !== 1)
{ {
this.multiplyItemPricesByConfigMultiplier(trader.assort); this.multiplyItemPricesByConfigMultiplier(traderClone.assort);
} }
return trader.assort; return traderClone.assort;
} }
/** /**