257 lines
8.6 KiB
TypeScript
257 lines
8.6 KiB
TypeScript
import { inject, injectable } from "tsyringe";
|
|
|
|
import { BotHelper } from "@spt-aki/helpers/BotHelper";
|
|
import { ITemplateItem } from "@spt-aki/models/eft/common/tables/ITemplateItem";
|
|
import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes";
|
|
import { IBotConfig } from "@spt-aki/models/spt/config/IBotConfig";
|
|
import { ConfigServer } from "@spt-aki/servers/ConfigServer";
|
|
import { RandomUtil } from "@spt-aki/utils/RandomUtil";
|
|
|
|
@injectable()
|
|
export class DurabilityLimitsHelper
|
|
{
|
|
protected botConfig: IBotConfig;
|
|
|
|
constructor(
|
|
@inject("RandomUtil") protected randomUtil: RandomUtil,
|
|
@inject("BotHelper") protected botHelper: BotHelper,
|
|
@inject("ConfigServer") protected configServer: ConfigServer,
|
|
)
|
|
{
|
|
this.botConfig = this.configServer.getConfig(ConfigTypes.BOT);
|
|
}
|
|
|
|
/**
|
|
* Get max durability for a weapon based on bot role
|
|
* @param itemTemplate UNUSED - Item to get durability for
|
|
* @param botRole Role of bot to get max durability for
|
|
* @returns Max durability of weapon
|
|
*/
|
|
public getRandomizedMaxWeaponDurability(itemTemplate: ITemplateItem, botRole: string): number
|
|
{
|
|
if (botRole && this.botHelper.isBotPmc(botRole))
|
|
{
|
|
return this.generateMaxWeaponDurability("pmc");
|
|
}
|
|
|
|
if (botRole && this.botHelper.isBotBoss(botRole))
|
|
{
|
|
return this.generateMaxWeaponDurability("boss");
|
|
}
|
|
|
|
if (botRole && this.botHelper.isBotFollower(botRole))
|
|
{
|
|
return this.generateMaxWeaponDurability("follower");
|
|
}
|
|
|
|
return this.generateMaxWeaponDurability(botRole);
|
|
}
|
|
|
|
/**
|
|
* Get max durability value for armor based on bot role
|
|
* @param itemTemplate Item to get max durability for
|
|
* @param botRole Role of bot to get max durability for
|
|
* @returns max durability
|
|
*/
|
|
public getRandomizedMaxArmorDurability(itemTemplate: ITemplateItem, botRole: string): number
|
|
{
|
|
const itemMaxDurability = itemTemplate._props.MaxDurability;
|
|
|
|
if (botRole && this.botHelper.isBotPmc(botRole))
|
|
{
|
|
return this.generateMaxPmcArmorDurability(itemMaxDurability);
|
|
}
|
|
|
|
if (botRole && this.botHelper.isBotBoss(botRole))
|
|
{
|
|
return itemMaxDurability;
|
|
}
|
|
|
|
if (botRole && this.botHelper.isBotFollower(botRole))
|
|
{
|
|
return itemMaxDurability;
|
|
}
|
|
|
|
return itemMaxDurability;
|
|
}
|
|
|
|
/**
|
|
* Get randomised current weapon durability by bot role
|
|
* @param itemTemplate Unused - Item to get current durability of
|
|
* @param botRole Role of bot to get current durability for
|
|
* @param maxDurability Max durability of weapon
|
|
* @returns Current weapon durability
|
|
*/
|
|
public getRandomizedWeaponDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number
|
|
{
|
|
if (botRole && (this.botHelper.isBotPmc(botRole)))
|
|
{
|
|
return this.generateWeaponDurability("pmc", maxDurability);
|
|
}
|
|
|
|
if (botRole && this.botHelper.isBotBoss(botRole))
|
|
{
|
|
return this.generateWeaponDurability("boss", maxDurability);
|
|
}
|
|
|
|
if (botRole && this.botHelper.isBotFollower(botRole))
|
|
{
|
|
return this.generateWeaponDurability("follower", maxDurability);
|
|
}
|
|
|
|
return this.generateWeaponDurability(botRole, maxDurability);
|
|
}
|
|
|
|
/**
|
|
* Get randomised current armor durability by bot role
|
|
* @param itemTemplate Unused - Item to get current durability of
|
|
* @param botRole Role of bot to get current durability for
|
|
* @param maxDurability Max durability of armor
|
|
* @returns Current armor durability
|
|
*/
|
|
public getRandomizedArmorDurability(itemTemplate: ITemplateItem, botRole: string, maxDurability: number): number
|
|
{
|
|
if (botRole && (this.botHelper.isBotPmc(botRole)))
|
|
{
|
|
return this.generateArmorDurability("pmc", maxDurability);
|
|
}
|
|
|
|
if (botRole && this.botHelper.isBotBoss(botRole))
|
|
{
|
|
return this.generateArmorDurability("boss", maxDurability);
|
|
}
|
|
|
|
if (botRole && this.botHelper.isBotFollower(botRole))
|
|
{
|
|
return this.generateArmorDurability("follower", maxDurability);
|
|
}
|
|
|
|
return this.generateArmorDurability(botRole, maxDurability);
|
|
}
|
|
|
|
protected generateMaxWeaponDurability(botRole: string): number
|
|
{
|
|
const lowestMax = this.getLowestMaxWeaponFromConfig(botRole);
|
|
const highestMax = this.getHighestMaxWeaponDurabilityFromConfig(botRole);
|
|
|
|
return this.randomUtil.getInt(lowestMax, highestMax);
|
|
}
|
|
|
|
protected generateMaxPmcArmorDurability(itemMaxDurability: number): number
|
|
{
|
|
const lowestMaxPercent = this.botConfig.durability.pmc.armor.lowestMaxPercent;
|
|
const highestMaxPercent = this.botConfig.durability.pmc.armor.highestMaxPercent;
|
|
const multiplier = this.randomUtil.getInt(lowestMaxPercent, highestMaxPercent);
|
|
|
|
return itemMaxDurability * (multiplier / 100);
|
|
}
|
|
|
|
protected getLowestMaxWeaponFromConfig(botRole: string): number
|
|
{
|
|
if (this.botConfig.durability[botRole])
|
|
{
|
|
return this.botConfig.durability[botRole].weapon.lowestMax;
|
|
}
|
|
|
|
return this.botConfig.durability.default.weapon.lowestMax;
|
|
}
|
|
|
|
protected getHighestMaxWeaponDurabilityFromConfig(botRole: string): number
|
|
{
|
|
if (this.botConfig.durability[botRole])
|
|
{
|
|
return this.botConfig.durability[botRole].weapon.highestMax;
|
|
}
|
|
|
|
return this.botConfig.durability.default.weapon.highestMax;
|
|
}
|
|
|
|
protected generateWeaponDurability(botRole: string, maxDurability: number): number
|
|
{
|
|
const minDelta = this.getMinWeaponDeltaFromConfig(botRole);
|
|
const maxDelta = this.getMaxWeaponDeltaFromConfig(botRole);
|
|
const delta = this.randomUtil.getInt(minDelta, maxDelta);
|
|
const result = Number((maxDurability - delta).toFixed(2));
|
|
const durabilityValueMinLimit = Math.round(
|
|
(this.getMinWeaponLimitPercentFromConfig(botRole) / 100) * maxDurability,
|
|
);
|
|
|
|
// Dont let weapon dura go below the percent defined in config
|
|
return (result >= durabilityValueMinLimit) ? result : durabilityValueMinLimit;
|
|
}
|
|
|
|
protected generateArmorDurability(botRole: string, maxDurability: number): number
|
|
{
|
|
const minDelta = this.getMinArmorDeltaFromConfig(botRole);
|
|
const maxDelta = this.getMaxArmorDeltaFromConfig(botRole);
|
|
const delta = this.randomUtil.getInt(minDelta, maxDelta);
|
|
const result = Number((maxDurability - delta).toFixed(2));
|
|
const durabilityValueMinLimit = Math.round(
|
|
(this.getMinArmorLimitPercentFromConfig(botRole) / 100) * maxDurability,
|
|
);
|
|
|
|
// Dont let armor dura go below the percent defined in config
|
|
return (result >= durabilityValueMinLimit) ? result : durabilityValueMinLimit;
|
|
}
|
|
|
|
protected getMinWeaponDeltaFromConfig(botRole: string): number
|
|
{
|
|
if (this.botConfig.durability[botRole])
|
|
{
|
|
return this.botConfig.durability[botRole].weapon.minDelta;
|
|
}
|
|
|
|
return this.botConfig.durability.default.weapon.minDelta;
|
|
}
|
|
|
|
protected getMaxWeaponDeltaFromConfig(botRole: string): number
|
|
{
|
|
if (this.botConfig.durability[botRole])
|
|
{
|
|
return this.botConfig.durability[botRole].weapon.maxDelta;
|
|
}
|
|
|
|
return this.botConfig.durability.default.weapon.maxDelta;
|
|
}
|
|
|
|
protected getMinArmorDeltaFromConfig(botRole: string): number
|
|
{
|
|
if (this.botConfig.durability[botRole])
|
|
{
|
|
return this.botConfig.durability[botRole].armor.minDelta;
|
|
}
|
|
|
|
return this.botConfig.durability.default.armor.minDelta;
|
|
}
|
|
|
|
protected getMaxArmorDeltaFromConfig(botRole: string): number
|
|
{
|
|
if (this.botConfig.durability[botRole])
|
|
{
|
|
return this.botConfig.durability[botRole].armor.maxDelta;
|
|
}
|
|
|
|
return this.botConfig.durability.default.armor.maxDelta;
|
|
}
|
|
|
|
protected getMinArmorLimitPercentFromConfig(botRole: string): number
|
|
{
|
|
if (this.botConfig.durability[botRole])
|
|
{
|
|
return this.botConfig.durability[botRole].armor.minLimitPercent;
|
|
}
|
|
|
|
return this.botConfig.durability.default.armor.minLimitPercent;
|
|
}
|
|
|
|
protected getMinWeaponLimitPercentFromConfig(botRole: string): number
|
|
{
|
|
if (this.botConfig.durability[botRole])
|
|
{
|
|
return this.botConfig.durability[botRole].weapon.minLimitPercent;
|
|
}
|
|
|
|
return this.botConfig.durability.default.weapon.minLimitPercent;
|
|
}
|
|
}
|