Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Weighted compatible ammo fix #1122

Merged
merged 2 commits into from
Feb 23, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 44 additions & 4 deletions project/src/generators/BotWeaponGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,7 @@ export class BotWeaponGenerator {
): string {
const desiredCaliber = this.getWeaponCaliber(weaponTemplate);

const cartridgePoolForWeapon = cartridgePool[desiredCaliber];
let cartridgePoolForWeapon = cartridgePool[desiredCaliber];
if (!cartridgePoolForWeapon || cartridgePoolForWeapon?.length === 0) {
this.logger.debug(
this.localisationService.getText("bot-no_caliber_data_for_weapon_falling_back_to_default", {
Expand Down Expand Up @@ -578,9 +578,28 @@ export class BotWeaponGenerator {
}
}

if (!compatibleCartridges) {
// No compatible cartridges, use default
return weaponTemplate._props.defAmmo;
// If no compatible cartridges found still, get caliber data from magazine in weapon template
if (Object.keys(compatibleCartridges).length === 0) {
// Get cartridges from the weapons first magazine in filters
const compatibleCartridgesInMagazine = this.getCompatibleCartridgesFromMagazineTemplate(weaponTemplate);
if (compatibleCartridgesInMagazine.length === 0) {
// No compatible cartridges found in magazine, use default
return weaponTemplate._props.defAmmo;
}
// Get the caliber data from the first compatible round in the magazine
const magazineCaliberData = this.itemHelper.getItem(compatibleCartridgesInMagazine[0])[1]._props.Caliber;
cartridgePoolForWeapon = cartridgePool[magazineCaliberData];

for (const cartridge of Object.keys(cartridgePoolForWeapon)) {
if (compatibleCartridgesInMagazine.includes(cartridge)) {
compatibleCartridges[cartridge] = cartridgePoolForWeapon[cartridge];
}
}

// Nothing found after also checking magazines, return default ammo
if (Object.keys(compatibleCartridges).length === 0) {
return weaponTemplate._props.defAmmo;
}
}

return this.weightedRandomHelper.getWeightedValue<string>(compatibleCartridges);
Expand Down Expand Up @@ -611,6 +630,27 @@ export class BotWeaponGenerator {
return cartridges;
}

/**
* Get the cartridge ids from a weapon's magazine template that work with the weapon
* @param weaponTemplate Weapon db template to get magazine cartridges for
* @returns Array of cartridge tpls
*/
protected getCompatibleCartridgesFromMagazineTemplate(weaponTemplate: ITemplateItem): string[] {
// Get the first magazine's template from the weapon
const magazineSlot = weaponTemplate._props.Slots.find((slot) => slot._name === "mod_magazine");
const magazineTemplate = this.itemHelper.getItem(magazineSlot._props.filters[0].Filter[0]);

// Get the first slots array of cartridges
let cartridges = magazineTemplate[1]._props.Slots[0]?._props.filters[0].Filter;
if (!cartridges) {
// Normal magazines
// None found, try the cartridges array
cartridges = magazineTemplate[1]._props.Cartridges[0]?._props.filters[0].Filter;
}

return cartridges;
}

/**
* Get a weapons compatible cartridge caliber
* @param weaponTemplate Weapon to look up caliber of
Expand Down
Loading