Resolve fence selling helmets that lack inserts

This commit is contained in:
Dev 2024-01-15 12:41:54 +00:00
parent 3ac64a3245
commit cff4a45291
2 changed files with 38 additions and 20 deletions

View File

@ -143,6 +143,13 @@ export class ItemHelper
return true; return true;
} }
// Also classified as BUILT_IN_INSERTS
const helmetInsertSlotIds = ["helmet_top", "helmet_back", "helmet_ears"]
if (itemDbDetails[1]._props.Slots.find(slot => helmetInsertSlotIds.includes(slot._name.toLowerCase())))
{
return true;
}
return false; return false;
} }

View File

@ -403,7 +403,6 @@ export class FenceService
protected createAssorts(assortCount: number, assorts: ITraderAssort, loyaltyLevel: number): void protected createAssorts(assortCount: number, assorts: ITraderAssort, loyaltyLevel: number): void
{ {
const fenceAssort = this.databaseServer.getTables().traders[Traders.FENCE].assort; const fenceAssort = this.databaseServer.getTables().traders[Traders.FENCE].assort;
const defaultPresets = this.presetHelper.getDefaultPresets();
const fenceAssortIds = Object.keys(fenceAssort.loyal_level_items); const fenceAssortIds = Object.keys(fenceAssort.loyal_level_items);
const itemTypeCounts = this.initItemLimitCounter(this.traderConfig.fence.itemTypeLimits); const itemTypeCounts = this.initItemLimitCounter(this.traderConfig.fence.itemTypeLimits);
@ -412,6 +411,7 @@ export class FenceService
// Add presets // Add presets
const maxPresetCount = Math.round(assortCount * (this.traderConfig.fence.maxPresetsPercent / 100)); const maxPresetCount = Math.round(assortCount * (this.traderConfig.fence.maxPresetsPercent / 100));
const randomisedPresetCount = this.randomUtil.getInt(0, maxPresetCount); const randomisedPresetCount = this.randomUtil.getInt(0, maxPresetCount);
const defaultPresets = this.presetHelper.getDefaultPresets();
this.addPresets(randomisedPresetCount, defaultPresets, assorts, loyaltyLevel); this.addPresets(randomisedPresetCount, defaultPresets, assorts, loyaltyLevel);
} }
@ -615,7 +615,7 @@ export class FenceService
* Add weapon/armor presets to fence * Add weapon/armor presets to fence
* @param assortCount how many assorts to add to assorts * @param assortCount how many assorts to add to assorts
* @param defaultPresets a dictionary of default weapon presets * @param defaultPresets a dictionary of default weapon presets
* @param assorts object to add presets to * @param assorts Trader assort object to add preset to
* @param loyaltyLevel loyalty level to requre item at * @param loyaltyLevel loyalty level to requre item at
*/ */
protected addPresets( protected addPresets(
@ -645,19 +645,19 @@ export class FenceService
} }
// Construct preset + mods // Construct preset + mods
const weaponAndMods: Item[] = this.itemHelper.replaceIDs( const presetAndMods: Item[] = this.itemHelper.replaceIDs(
null, null,
this.jsonUtil.clone(defaultPresets[preset._id]._items), this.jsonUtil.clone(preset._items),
); );
this.removeRandomModsOfItem(weaponAndMods); this.removeRandomModsOfItem(presetAndMods);
for (let i = 0; i < weaponAndMods.length; i++) for (let i = 0; i < presetAndMods.length; i++)
{ {
const mod = weaponAndMods[i]; const mod = presetAndMods[i];
// build root Item info // Build root Item info
if (!("parentId" in mod)) if (!("parentId" in mod))
{ {
mod._id = weaponAndMods[0]._id; mod._id = presetAndMods[0]._id;
mod.parentId = "hideout"; mod.parentId = "hideout";
mod.slotId = "hideout"; mod.slotId = "hideout";
mod.upd = { mod.upd = {
@ -666,27 +666,30 @@ export class FenceService
BuyRestrictionCurrent: 0, BuyRestrictionCurrent: 0,
sptPresetId: preset._id, // Store preset id here so we can check it later to prevent preset dupes sptPresetId: preset._id, // Store preset id here so we can check it later to prevent preset dupes
}; };
// Updated root item, exit loop
break;
} }
} }
const weaponItemDb = this.itemHelper.getItem(weaponAndMods[0]._tpl)[1]; const presetDbItem = this.itemHelper.getItem(presetAndMods[0]._tpl)[1];
this.randomiseItemUpdProperties(weaponItemDb, weaponAndMods[0]); this.randomiseItemUpdProperties(presetDbItem, presetAndMods[0]);
// Add weapon preset to assorts // Add constructed preset to assorts
assorts.items.push(...weaponAndMods); assorts.items.push(...presetAndMods);
// Calculate preset price // Calculate preset price
let rub = 0; let rub = 0;
for (const it of weaponAndMods) for (const it of presetAndMods)
{ {
rub += this.handbookHelper.getTemplatePrice(it._tpl); rub += this.handbookHelper.getTemplatePrice(it._tpl);
} }
// Multiply weapon+mods rouble price by multipler in config // Multiply weapon+mods rouble price by multipler in config
assorts.barter_scheme[weaponAndMods[0]._id] = [[]]; assorts.barter_scheme[presetAndMods[0]._id] = [[]];
assorts.barter_scheme[weaponAndMods[0]._id][0][0] = { _tpl: Money.ROUBLES, count: Math.round(rub) }; assorts.barter_scheme[presetAndMods[0]._id][0][0] = { _tpl: Money.ROUBLES, count: Math.round(rub) };
assorts.loyal_level_items[weaponAndMods[0]._id] = loyaltyLevel; assorts.loyal_level_items[presetAndMods[0]._id] = loyaltyLevel;
presetCount++; presetCount++;
} }
@ -778,7 +781,8 @@ export class FenceService
|| itemDetails._parent === BaseClasses.VEST || itemDetails._parent === BaseClasses.VEST
|| itemDetails._parent === BaseClasses.ARMORED_EQUIPMENT || itemDetails._parent === BaseClasses.ARMORED_EQUIPMENT
|| itemDetails._parent === BaseClasses.FACECOVER || itemDetails._parent === BaseClasses.FACECOVER
|| itemDetails._parent === BaseClasses.ARMOR_PLATE) && itemDetails._props.MaxDurability > 0 || itemDetails._parent === BaseClasses.ARMOR_PLATE
) && itemDetails._props.MaxDurability > 0
) )
{ {
const values = this.getRandomisedArmorDurabilityValues(itemDetails, this.traderConfig.fence.armorMaxDurabilityPercentMinMax); const values = this.getRandomisedArmorDurabilityValues(itemDetails, this.traderConfig.fence.armorMaxDurabilityPercentMinMax);
@ -832,6 +836,12 @@ export class FenceService
} }
} }
/**
* Generate a randomised current and max durabiltiy value for an armor item
* @param itemDetails Item to create values for
* @param maxDurabilityMinMaxPercent Max durabiltiy percent min/max values
* @returns Durability + MaxDurability values
*/
protected getRandomisedArmorDurabilityValues(itemDetails: ITemplateItem, maxDurabilityMinMaxPercent: MinMax): Repairable protected getRandomisedArmorDurabilityValues(itemDetails: ITemplateItem, maxDurabilityMinMaxPercent: MinMax): Repairable
{ {
const duraMin = maxDurabilityMinMaxPercent.min / 100 * itemDetails._props.MaxDurability; const duraMin = maxDurabilityMinMaxPercent.min / 100 * itemDetails._props.MaxDurability;
@ -873,6 +883,7 @@ export class FenceService
/** /**
* Get fence refresh time in seconds * Get fence refresh time in seconds
* @returns Refresh time in seconds
*/ */
protected getFenceRefreshTime(): number protected getFenceRefreshTime(): number
{ {