Move a lot of functions to helpers
This commit is contained in:
parent
31d4f1bace
commit
7a5a98db87
@ -16,6 +16,10 @@
|
||||
// along with spt-the-blacklist. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import { Category } from "@spt-aki/models/eft/common/tables/IHandbookBase";
|
||||
import { ITemplateItem } from "@spt-aki/models/eft/common/tables/ITemplateItem";
|
||||
|
||||
import config from "../config.json";
|
||||
import advancedConfig from "../advancedConfig.json";
|
||||
|
||||
// There are so many child categories of attachments, this will return all categories using recursion so I don't have to type each ID.
|
||||
export function getAttachmentCategoryIds(handbookCategories: Category[]): string[] {
|
||||
@ -36,3 +40,50 @@ function getChildCategoriesRecursively(handbookCategories: Category[], parentId:
|
||||
|
||||
return childCategories.concat(grandChildrenCategories);
|
||||
}
|
||||
|
||||
export function isBulletOrShotgunShell(item: ITemplateItem): boolean {
|
||||
const props = item._props;
|
||||
|
||||
return props.ammoType === "bullet" || props.ammoType === "buckshot";
|
||||
}
|
||||
|
||||
// Some blacklisted guns are very cheap because they don't have a flea price, just a handbook price. The ones listed below will get a much higher default price.
|
||||
export function isGun(item: ITemplateItem): boolean {
|
||||
const marksmanRiflesItemCategoryId = "5447b6194bdc2d67278b4567";
|
||||
const assaultRiflesItemCategoryId = "5447b5f14bdc2d61278b4567";
|
||||
const sniperRiflesItemCategoryId = "5447b6254bdc2dc3278b4568";
|
||||
const smgsItemCategoryId = "5447b5e04bdc2d62278b4567";
|
||||
const carbinesItemCategoryId = "5447b5fc4bdc2d87278b4567";
|
||||
const gunCategories = [marksmanRiflesItemCategoryId, assaultRiflesItemCategoryId, sniperRiflesItemCategoryId, smgsItemCategoryId, carbinesItemCategoryId];
|
||||
|
||||
return gunCategories.includes(item._parent);
|
||||
}
|
||||
|
||||
export function getUpdatedAmmoPrice(item: ITemplateItem): number {
|
||||
const baselinePen = this.baselineBullet._props.PenetrationPower;
|
||||
const baselineDamage = this.baselineBullet._props.Damage;
|
||||
|
||||
const basePenetrationMultiplier = item._props.PenetrationPower / baselinePen;
|
||||
const baseDamageMultiplier = item._props.Damage / baselineDamage;
|
||||
|
||||
let penetrationMultiplier: number;
|
||||
if (basePenetrationMultiplier > 1) {
|
||||
// A good gradient to make higher power rounds more expensive
|
||||
penetrationMultiplier = 7 * basePenetrationMultiplier - 6;
|
||||
} else {
|
||||
// Due to maths above, its really easy to go < 1. The baseline ammo is mid tier with a reasonable 1000 rouble each. Ammo weaker than this tend to be pretty crap so we'll make it much cheaper
|
||||
const newMultiplier = basePenetrationMultiplier * 0.7;
|
||||
penetrationMultiplier = newMultiplier < 0.1 ? 0.1 : newMultiplier;
|
||||
}
|
||||
|
||||
// Reduces the effect of the damage multiplier so high DMG rounds aren't super expensive.
|
||||
// Eg. let baseDamageMultiplier = 2 & bulletDamageMultiplierRedutionFactor = 0.7. Instead of a 2x price when a bullet is 2x damage, we instead get:
|
||||
// 2 + (1 - 2) * 0.7 = 2 - 0.7 = 1.3x the price.
|
||||
const damageMultiplier = baseDamageMultiplier + (1 - baseDamageMultiplier) * advancedConfig.bulletDamageMultiplierRedutionFactor;
|
||||
|
||||
return advancedConfig.baselineBulletPrice * penetrationMultiplier * damageMultiplier * config.blacklistedAmmoAdditionalPriceMultiplier;
|
||||
}
|
||||
|
||||
export function getFallbackGunPrice(): number {
|
||||
return advancedConfig.gunPriceFallback || 100000;
|
||||
}
|
60
src/mod.ts
60
src/mod.ts
@ -28,7 +28,7 @@ import { Category, HandbookItem } from "@spt-aki/models/eft/common/tables/IHandb
|
||||
|
||||
import config from "../config.json";
|
||||
import advancedConfig from "../advancedConfig.json";
|
||||
import { getAttachmentCategoryIds } from "./helpers";
|
||||
import { getAttachmentCategoryIds, getFallbackGunPrice, getUpdatedAmmoPrice, isBulletOrShotgunShell, isGun } from "./helpers";
|
||||
|
||||
class TheBlacklistMod implements IPostDBLoadModAsync {
|
||||
private logger: ILogger;
|
||||
@ -84,8 +84,8 @@ class TheBlacklistMod implements IPostDBLoadModAsync {
|
||||
|
||||
const itemProps = item._props;
|
||||
|
||||
if (config.useBalancedPricingForAllAmmo && this.isBulletOrShotgunShell(item)) {
|
||||
const newPrice = this.getUpdatedAmmoPrice(item);
|
||||
if (config.useBalancedPricingForAllAmmo && isBulletOrShotgunShell(item)) {
|
||||
const newPrice = getUpdatedAmmoPrice(item);
|
||||
prices[item._id] = newPrice;
|
||||
|
||||
if (!itemProps.CanSellOnRagfair) {
|
||||
@ -183,10 +183,10 @@ class TheBlacklistMod implements IPostDBLoadModAsync {
|
||||
const currentFleaPrice = prices[item._id];
|
||||
let newPrice: number;
|
||||
|
||||
if (this.isBulletOrShotgunShell(item)) {
|
||||
newPrice = this.getUpdatedAmmoPrice(item);
|
||||
} else if (this.isGun(item) && currentFleaPrice == null) {
|
||||
newPrice = this.getFallbackGunPrice();
|
||||
if (isBulletOrShotgunShell(item)) {
|
||||
newPrice = getUpdatedAmmoPrice(item);
|
||||
} else if (isGun(item) && currentFleaPrice == null) {
|
||||
newPrice = getFallbackGunPrice();
|
||||
}
|
||||
|
||||
// Avoids NaN. Also we shouldn't have any prices of 0.
|
||||
@ -194,52 +194,6 @@ class TheBlacklistMod implements IPostDBLoadModAsync {
|
||||
return price && price * config.blacklistedItemPriceMultiplier;
|
||||
}
|
||||
|
||||
private isBulletOrShotgunShell(item: ITemplateItem): boolean {
|
||||
const props = item._props;
|
||||
return props.ammoType === "bullet" || props.ammoType === "buckshot";
|
||||
}
|
||||
|
||||
// Some blacklisted guns are very cheap because they don't have a flea price, just a handbook price. The ones listed below will get a much higher default price.
|
||||
private isGun(item: ITemplateItem): boolean {
|
||||
const marksmanRiflesItemCategoryId = "5447b6194bdc2d67278b4567";
|
||||
const assaultRiflesItemCategoryId = "5447b5f14bdc2d61278b4567";
|
||||
const sniperRiflesItemCategoryId = "5447b6254bdc2dc3278b4568";
|
||||
const smgsItemCategoryId = "5447b5e04bdc2d62278b4567";
|
||||
const carbinesItemCategoryId = "5447b5fc4bdc2d87278b4567";
|
||||
const gunCategories = [marksmanRiflesItemCategoryId, assaultRiflesItemCategoryId, sniperRiflesItemCategoryId, smgsItemCategoryId, carbinesItemCategoryId];
|
||||
|
||||
return gunCategories.includes(item._parent);
|
||||
}
|
||||
|
||||
private getUpdatedAmmoPrice(item: ITemplateItem) {
|
||||
const baselinePen = this.baselineBullet._props.PenetrationPower;
|
||||
const baselineDamage = this.baselineBullet._props.Damage;
|
||||
|
||||
const basePenetrationMultiplier = item._props.PenetrationPower / baselinePen;
|
||||
const baseDamageMultiplier = item._props.Damage / baselineDamage;
|
||||
|
||||
let penetrationMultiplier: number;
|
||||
if (basePenetrationMultiplier > 1) {
|
||||
// A good gradient to make higher power rounds more expensive
|
||||
penetrationMultiplier = 7 * basePenetrationMultiplier - 6;
|
||||
} else {
|
||||
// Due to maths above, its really easy to go < 1. The baseline ammo is mid tier with a reasonable 1000 rouble each. Ammo weaker than this tend to be pretty crap so we'll make it much cheaper
|
||||
const newMultiplier = basePenetrationMultiplier * 0.7;
|
||||
penetrationMultiplier = newMultiplier < 0.1 ? 0.1 : newMultiplier;
|
||||
}
|
||||
|
||||
// Reduces the effect of the damage multiplier so high DMG rounds aren't super expensive.
|
||||
// Eg. let baseDamageMultiplier = 2 & bulletDamageMultiplierRedutionFactor = 0.7. Instead of a 2x price when a bullet is 2x damage, we instead get:
|
||||
// 2 + (1 - 2) * 0.7 = 2 - 0.7 = 1.3x the price.
|
||||
const damageMultiplier = baseDamageMultiplier + (1 - baseDamageMultiplier) * advancedConfig.bulletDamageMultiplierRedutionFactor;
|
||||
|
||||
return advancedConfig.baselineBulletPrice * penetrationMultiplier * damageMultiplier * config.blacklistedAmmoAdditionalPriceMultiplier;
|
||||
}
|
||||
|
||||
private getFallbackGunPrice() {
|
||||
return advancedConfig.gunPriceFallback || 100000;
|
||||
}
|
||||
|
||||
private debug(message: string) {
|
||||
if (advancedConfig.enableDebug) {
|
||||
this.logger.debug(`${this.modName}: ${message}`);
|
||||
|
Loading…
x
Reference in New Issue
Block a user