0
0
mirror of https://github.com/sp-tarkov/server.git synced 2025-02-13 09:50:43 -05:00

Fixed armors being listed with plates above the allowed level on flea

This commit is contained in:
Dev 2024-01-23 11:42:47 +00:00
parent 6378ac6f87
commit 27bc7cfa6e
5 changed files with 54 additions and 12 deletions

View File

@ -201,7 +201,8 @@
"custom": [], "custom": [],
"enableBsgList": true, "enableBsgList": true,
"enableQuestList": true, "enableQuestList": true,
"traderItems": false "traderItems": false,
"armorPlateMaxProtectionLevel": 4
}, },
"unreasonableModPrices": { "unreasonableModPrices": {
"5448fe124bdc2da5018b4567": { "5448fe124bdc2da5018b4567": {

View File

@ -98,12 +98,12 @@ export class RagfairAssortGenerator
continue; continue;
} }
results.push(this.createRagfairAssortItem(item._id, item._id)); // tplid and id must be the same so hideout recipe reworks work results.push(this.createRagfairAssortItem(item._id, item._id)); // tplid and id must be the same so hideout recipe rewards work
} }
for (const weapon of presets) for (const preset of presets)
{ {
results.push(this.createRagfairAssortItem(weapon._items[0]._tpl, weapon._id)); // Preset id must be passed through to ensure flea shows presets results.push(this.createRagfairAssortItem(preset._items[0]._tpl, preset._id)); // Preset id must be passed through to ensure flea shows preset
} }
return results; return results;

View File

@ -357,7 +357,7 @@ export class RagfairOfferGenerator
return; return;
} }
// Get item + sub-items if preset, otherwise just get item // Get item + sub-items (weapons + armors), otherwise just get item
const itemWithChildren: Item[] = isPreset const itemWithChildren: Item[] = isPreset
? this.ragfairServerHelper.getPresetItems(assortItem) ? this.ragfairServerHelper.getPresetItems(assortItem)
: [ : [
@ -366,6 +366,12 @@ export class RagfairOfferGenerator
), ),
]; ];
// Armor presets can hold plates above the allowed flea level, remove if necessary
if (isPreset && this.ragfairConfig.dynamic.blacklist.enableBsgList)
{
this.removeBannedPlatesFromPreset(itemWithChildren, this.ragfairConfig.dynamic.blacklist.armorPlateMaxProtectionLevel);
}
// Get number of offers to create // Get number of offers to create
// Limit to 1 offer when processing expired // Limit to 1 offer when processing expired
const offerCount = expiredOffers const offerCount = expiredOffers
@ -376,16 +382,14 @@ export class RagfairOfferGenerator
const assortSingleOfferProcesses = []; const assortSingleOfferProcesses = [];
for (let index = 0; index < offerCount; index++) for (let index = 0; index < offerCount; index++)
{ {
delete itemWithChildren[0].parentId;
delete itemWithChildren[0].slotId;
if (!isPreset) if (!isPreset)
{ {
// presets get unique id generated during getPresetItems() earlier // Presets get unique id generated during getPresetItems() earlier + would require regenerating all children to match
itemWithChildren[0]._id = this.hashUtil.generate(); itemWithChildren[0]._id = this.hashUtil.generate();
} }
delete itemWithChildren[0].parentId; delete itemWithChildren[0].parentId;
delete itemWithChildren[0].slotId;
assortSingleOfferProcesses.push(this.createSingleOfferForItem(itemWithChildren, isPreset, itemDetails)); assortSingleOfferProcesses.push(this.createSingleOfferForItem(itemWithChildren, isPreset, itemDetails));
} }
@ -393,6 +397,41 @@ export class RagfairOfferGenerator
await Promise.all(assortSingleOfferProcesses); await Promise.all(assortSingleOfferProcesses);
} }
/**
* iterate over an items chidren and look for plates above desired level and remove them
* @param presetWithChildren preset to check for plates
* @param plateProtectionLimit Max level of plates an armor can have without being removed
* @returns True if plate removed
*/
protected removeBannedPlatesFromPreset(presetWithChildren: Item[], plateProtectionLimit: number): boolean
{
if (!this.itemHelper.armorItemCanHoldMods(presetWithChildren[0]._tpl))
{
// Cant hold armor inserts, skip
return false;
}
const plateSlots = presetWithChildren.filter(item => this.itemHelper.getRemovablePlateSlotIds().includes(item.slotId?.toLowerCase()));
if (plateSlots.length === 0)
{
// Has no plate slots e.g. "left_side_plate", exit
return false;
}
let removedPlate = false;
for (const plateSlot of plateSlots)
{
const plateArmorLevel = Number.parseInt(<string>this.itemHelper.getItem(plateSlot._tpl)[1]._props.armorClass) ?? 0;
if (plateArmorLevel > plateProtectionLimit)
{
presetWithChildren.splice(presetWithChildren.indexOf(plateSlot), 1);
removedPlate = true;
}
}
return removedPlate
}
/** /**
* Create one flea offer for a specific item * Create one flea offer for a specific item
* @param itemWithChildren Item to create offer for * @param itemWithChildren Item to create offer for

View File

@ -1332,14 +1332,14 @@ export class ItemHelper
*/ */
public isRemovablePlateSlot(slotName: string): boolean public isRemovablePlateSlot(slotName: string): boolean
{ {
return this.getRevovablePlateSlotIds().includes(slotName.toLowerCase()); return this.getRemovablePlateSlotIds().includes(slotName.toLowerCase());
} }
/** /**
* Get a list of slot names that hold removable plates * Get a list of slot names that hold removable plates
* @returns Array of slot ids (e.g. front_plate) * @returns Array of slot ids (e.g. front_plate)
*/ */
public getRevovablePlateSlotIds(): string[] public getRemovablePlateSlotIds(): string[]
{ {
return ["front_plate", "back_plate", "side_plate", "left_side_plate", "right_side_plate"]; return ["front_plate", "back_plate", "side_plate", "left_side_plate", "right_side_plate"];
} }

View File

@ -159,6 +159,8 @@ export interface Blacklist
enableQuestList: boolean; enableQuestList: boolean;
/** Should trader items that are blacklisted by bsg be listed on flea */ /** Should trader items that are blacklisted by bsg be listed on flea */
traderItems: boolean; traderItems: boolean;
/** Maximum level an armor plate can be found in a flea-listed armor item */
armorPlateMaxProtectionLevel: number;
} }
export interface IUnreasonableModPrices export interface IUnreasonableModPrices