diff --git a/project/assets/database/locales/server/en.json b/project/assets/database/locales/server/en.json index 83b6971f..d1ac906f 100644 --- a/project/assets/database/locales/server/en.json +++ b/project/assets/database/locales/server/en.json @@ -49,17 +49,23 @@ "bot-unable_to_generate_item_pool_no_items": "Unable to generate an item pool of type: %s as no items were provided, this will pool will be skipped", "bot-unable_to_get_bot_difficulty_fallback_to_assault": "Unable to find bot: {{botType}} difficulty {{difficulty}}, using assault difficulty as fallback", "bot-unable_to_get_bot_fallback_to_assault": "Unable to find bot: %s JSON, using assault bot as fallback", + "bot-unable_to_load_raid_settings_from_appcontext": "Unable to load raid settings from ApplicationContext", "bot-weapon_contains_invalid_item": "Required slot: '{{modSlot}}' on weapon: {{weaponTpl}} has an invalid item: {{modName}}", "bot-weapon_generated_incorrect_using_default": "Weapon %s was generated incorrectly, falling back to weapon preset see error above", "bot-weapon_missing_magazine_or_chamber": "Weapon with tpl: {{weaponId}} has no magazine or chamber - {{botRole}}", "bot-weapon_missing_mod_slot": "Slot: {{modSlot}}' does not exist for weapon: {{weaponId}} {{weaponName}} on {{botRole}}", "bot-weapons_required_slot_missing_item": "Required slot '{{modSlot}}' on {{modName}} {{slotId}} was empty on {{botRole}}", "build-unable_to_delete_preset": "Unable to delete preset, cannot find %s in weapon, equipment or magazine presets", + "chat-unable_to_register_command_already_registered": "Unble to register already registed command: %s", "client_request": "[Client Request] %s", "client_request_ip": "[Client Request] {{ip}} {{url}}", "customisation-item_already_purchased": "Clothing item {{itemId}} {{itemName}} already purchased", + "customisation-suit_lacks_upd_or_stack_property": "Suit with tpl: %s lacks a upd object or stackobjectcount property", "customisation-unable_to_find_clothing_item_in_inventory": "Clothing item not found in inventory with id: %s", "customisation-unable_to_find_suit_by_id": "Unable to find trader suit offer with id: %s", + "customisation-unable_to_find_suit_with_id": "Unable to find suit with offer id: %s", + "customisation-unable_to_get_trader_suits": "Unable to get suits from trader: %s", + "dialog-chatbot_id_already_exists": "Chat bot: %s being registered already exists, unable to register bot", "dialog-missing_item_template": "Unable to find item tpl {{tpl}} in db, cannot send message of type {{type}}, skipping", "dialogue-unable_to_find_dialogs_in_profile": "No dialog object in profile: {{sessionId}}", "dialogue-unable_to_find_in_profile": "No dialog in profile: {{sessionId}} found with id: {{dialogueId}}", @@ -101,10 +107,16 @@ "inraid-unable_to_deliver_item_no_trader_found": "Unable to deliver items as trader %s has no dialogue data", "inraid-unable_to_find_key_in_taskconditioncounters": "Unable to find key: %s in TaskConditionCounters pre-raid data", "inraid-unable_to_migrate_pmc_quest_not_found_in_profile": "Unable to migrate post-raid quest: %s data to profile, cannot find quest in profile", + "insurance-item_not_found_in_post_raid_data": "Unable to find insured inventory item with id: %s in post-raid data", "insurance-missing_insurance_price_multiplier": "No insurance multiplier found for trader: %s, check it exists in InsuranceConfig.js, falling back to default value of: 0.3", + "insurance-post_raid_item_not_found": "Insured item: %s not found in post-raid inventory", + "insurance-pre_raid_item_not_found": "Pre raid inventory item: %s was not found", + "insurance-trader_lacks_dialogue_property": "Trader: %s does not have a dialogue property, unable to send insurance items", + "insurance-trader_missing_from_enum": "Trader: %s is missing from Traders enum", "insurance-unable_to_find_attachment_in_db": "Could not find insured attachment in the database - ID: {{insuredItemId}}, Template: {{insuredItemTpl}}", "insurance-unable_to_find_main_parent_for_attachment": "Could not find main-parent for insured attachment - ID: {{insuredItemId}}, Template: {{insuredItemTpl}}, Parent ID: {{parentId}}", "insurance-unable_to_find_parent_of_item": "Could not find parent for insured item - ID: {{insuredItemId}}, Template: {{insuredItemTpl}}, Parent ID: {{parentId}}", + "insurance-unable_to_find_trader_by_id": "Trader: %s could not found", "inventory-edit_trader_item": "Unable to edit a traders item", "inventory-examine_item_does_not_exist": "examineItem() - No id with %s found", "inventory-fill_container_failed": "fillContainerMapWithItem() returned with an error %s", @@ -168,6 +180,7 @@ "loot-default_preset_not_found_using_random": "Default preset for weapon: %s not found, choosing random of same weapon type instead", "loot-item_missing_parentid": "Item: %s lacks a parentId value, unable to use item as loot", "loot-non_item_picked_as_sealed_weapon_crate_reward": "Invalid weapon: %s, was picked as reward for sealed weapon crate, unable to create loot", + "mail-unable_to_find_message_sender_by_id": "Unable to find mail message sender with id: %s", "mail-unable_to_give_gift_not_handled": "Unable to give player gift using reward code: %s it is not handled by server", "mailsend-missing_npc_dialog": "Unable to send message from: %s to player. A Dialog object for them does not exist", "mailsend-missing_parent": "Unable to find an item with slotId of: hideout for message to: {{traderId}} sender: {{sender}}", @@ -197,6 +210,7 @@ "modloader-missing_sptversion_field": "Mod %s is missing the sptVersion field, most likely due to being out of date and incompatible with the current version of SPT", "modloader-mod_has_no_main_property": "ModLoader: Mod (%s) is incompatible. It lacks a 'main' property", "modloader-mod_incompatible": "ModLoader: Mod (%s) is incompatible. It must implement at least one of the following: IPostSptLoadMod, IPostDBLoadMod, IPreSptLoadMod", + "modloader-mod_isnt_present": "Mod: %s isn't present", "modloader-mod_order_error": "ModLoader: Errors were found in order.json, GOING TO USE DEFAULT LOAD ORDER", "modloader-mod_order_missing": "ModLoader: order.json is missing, creating...", "modloader-mod_order_missing_from_json": "ModLoader: Mod %s is missing from order.json, adding", @@ -562,6 +576,7 @@ "quest-unable_to_find_trader_in_profile": "Unable to find trader: %s in profile", "quest-unable_to_remove_scav_quest_from_profile": "Unable to remove scav quest: {{questIdToRemove}} from profile: {{profileId}}", "ragfair-invalid_player_offer_request": "Unable to place offer, request is invalid", + "ragfair-item_not_in_db_unable_to_generate_dynamic_stack_count": "Item with tpl: %s not found in db. Unable to generate a dynamic stack count", "ragfair-missing_barter_scheme": "generateFleaOffersForTrader() Failed to find barterScheme for item id: {{itemId}} tpl: {{tpl}} on {{name}}", "ragfair-no_trader_assorts_cant_generate_flea_offers": "Unable to generate flea offers for trader %s, no assort found", "ragfair-offer_no_longer_exists": "Offer no longer exists", @@ -593,7 +608,13 @@ "release-server-mods-debug-message": "Server mods loaded", "release-server-mods-loaded": "One or more server mods exist on a mod enabled build, reports will be invalid until removed. See the top of the server for loaded server mods to remove to report issues again.", "release-summary": "", + "repair-item_has_no_repair_points": "Repairable item: %s has no repair points", + "repair-item_not_found_unable_to_repair": "Item: %s not found in inventory. Unable to repair it", + "repair-repair_kit_not_found_in_inventory": "Unable to find repair kit: %s in inventory", "repair-unable_to_find_item_in_db": "Unable to repair item: %s, cannot find in items db, cannot add repair skill points", + "repair-unable_to_find_item_in_inventory_cant_repair": "unable to find item: %s in inventory, cannot repair item", + "repair-unable_to_find_item_repair_cost": "Unable to find repair cost for item: %s", + "repair-unable_to_find_trader_details_by_id": "Unable to find trader: %s repair details", "repeatable-accepted_repeatable_quest_not_found_in_active_quests": "Accepted a repeatable quest: %s which could not be found in the activeQuests array. Please report this bug", "repeatable-completion_quest_whitelist_too_small_or_blacklist_too_restrictive": "Generate Completion Quest: No items remain. Either Whitelist is too small or Blacklist too restrictive", "repeatable-difficulty_was_nan": "Repeatable Reward Generation: Difficulty was NaN. Setting to 1.", diff --git a/project/src/controllers/BotController.ts b/project/src/controllers/BotController.ts index a4b1e6f6..1b69899e 100644 --- a/project/src/controllers/BotController.ts +++ b/project/src/controllers/BotController.ts @@ -214,7 +214,7 @@ export class BotController if (raidSettings === undefined) { - throw new Error("Raid settings could not be loaded from ApplicationContext"); + throw new Error(this.localisationService.getText("bot-unable_to_load_raid_settings_from_appcontext")); } const pmcLevelRangeForMap = this.pmcConfig.locationSpecificPmcLevelOverride[raidSettings.location.toLowerCase()]; @@ -376,7 +376,7 @@ export class BotController if (raidSettings === undefined) { - throw new Error("Raid settings could not be loaded from ApplicationContext"); + throw new Error(this.localisationService.getText("bot-unable_to_load_raid_settings_from_appcontext")); } const pmcLevelRangeForMap = this.pmcConfig.locationSpecificPmcLevelOverride[raidSettings.location.toLowerCase()]; diff --git a/project/src/controllers/CustomizationController.ts b/project/src/controllers/CustomizationController.ts index 0ad614ec..3b29085d 100644 --- a/project/src/controllers/CustomizationController.ts +++ b/project/src/controllers/CustomizationController.ts @@ -47,7 +47,8 @@ export class CustomizationController // Return all suits that have a side array containing the players side (usec/bear) const matchedSuits = matchingSuits?.filter((x) => templates[x.suiteId]._props.Side.includes(pmcData.Info.Side)); if (matchingSuits === undefined) - throw new Error(`Unable to get trader suits for trader ${traderID}`); + throw new Error(this.localisationService.getText("customisation-unable_to_get_trader_suits", traderID)); + return matchedSuits!; } @@ -138,8 +139,9 @@ export class CustomizationController const foundSuit = this.getAllTraderSuits(sessionId).find((x) => x._id === offerId); if (foundSuit === undefined) { - throw new Error(`Unable to find suit with offer id ${offerId}`); + throw new Error(this.localisationService.getText("customisation-unable_to_find_suit_with_id", offerId)); } + return foundSuit; } @@ -209,7 +211,7 @@ export class CustomizationController if (!relatedItem.upd || !relatedItem.upd.StackObjectsCount) { - throw new Error(`Suit with tpl id ${relatedItem._tpl} does not have upd or stack object count properties`); + throw new Error(this.localisationService.getText("customisation-suit_lacks_upd_or_stack_property", relatedItem._tpl)); } if (relatedItem.upd.StackObjectsCount > clothingItem.count) diff --git a/project/src/controllers/DialogueController.ts b/project/src/controllers/DialogueController.ts index 855358ff..7eeac9e5 100644 --- a/project/src/controllers/DialogueController.ts +++ b/project/src/controllers/DialogueController.ts @@ -51,7 +51,7 @@ export class DialogueController { if (this.dialogueChatBots.some((cb) => cb.getChatBot()._id === chatBot.getChatBot()._id)) { - throw new Error(`The chat bot ${chatBot.getChatBot()._id} being registered already exists!`); + throw new Error(this.localisationService.getText("dialog-chatbot_id_already_exists", chatBot.getChatBot()._id)); } this.dialogueChatBots.push(chatBot); } diff --git a/project/src/helpers/Dialogue/Commando/SptCommandoCommands.ts b/project/src/helpers/Dialogue/Commando/SptCommandoCommands.ts index 14b608ce..8a6e4d2f 100644 --- a/project/src/helpers/Dialogue/Commando/SptCommandoCommands.ts +++ b/project/src/helpers/Dialogue/Commando/SptCommandoCommands.ts @@ -6,12 +6,14 @@ import { IUserDialogInfo } from "@spt/models/eft/profile/ISptProfile"; import { ConfigTypes } from "@spt/models/enums/ConfigTypes"; import { ICoreConfig } from "@spt/models/spt/config/ICoreConfig"; import { ConfigServer } from "@spt/servers/ConfigServer"; +import { LocalisationService } from "@spt/services/LocalisationService"; @injectable() export class SptCommandoCommands implements IChatCommand { constructor( @inject("ConfigServer") protected configServer: ConfigServer, + @inject("LocalisationService") protected localisationService: LocalisationService, @injectAll("SptCommand") protected sptCommands: ISptCommand[], ) { @@ -33,7 +35,7 @@ export class SptCommandoCommands implements IChatCommand { if (this.sptCommands.some((c) => c.getCommand() === command.getCommand())) { - throw new Error(`The command "${command.getCommand()}" attempting to be registered already exists.`); + throw new Error(this.localisationService.getText("chat-unable_to_register_command_already_registered", command.getCommand())); } this.sptCommands.push(command); } diff --git a/project/src/helpers/RagfairServerHelper.ts b/project/src/helpers/RagfairServerHelper.ts index b7a4984c..af9486a1 100644 --- a/project/src/helpers/RagfairServerHelper.ts +++ b/project/src/helpers/RagfairServerHelper.ts @@ -15,6 +15,7 @@ import { ConfigServer } from "@spt/servers/ConfigServer"; import { DatabaseServer } from "@spt/servers/DatabaseServer"; import { SaveServer } from "@spt/servers/SaveServer"; import { ItemFilterService } from "@spt/services/ItemFilterService"; +import { LocalisationService } from "@spt/services/LocalisationService"; import { MailSendService } from "@spt/services/MailSendService"; import { ICloner } from "@spt/utils/cloners/ICloner"; import { RandomUtil } from "@spt/utils/RandomUtil"; @@ -40,6 +41,7 @@ export class RagfairServerHelper @inject("ItemHelper") protected itemHelper: ItemHelper, @inject("TraderHelper") protected traderHelper: TraderHelper, @inject("MailSendService") protected mailSendService: MailSendService, + @inject("LocalisationService") protected localisationService: LocalisationService, @inject("ItemFilterService") protected itemFilterService: ItemFilterService, @inject("ConfigServer") protected configServer: ConfigServer, @inject("RecursiveCloner") protected cloner: ICloner, @@ -186,7 +188,7 @@ export class RagfairServerHelper const itemDetails = this.itemHelper.getItem(tplId); if (!itemDetails[0]) { - throw new Error(`Item with tpl ${tplId} not found. Unable to generate a dynamic stack count.`); + throw new Error(this.localisationService.getText("ragfair-item_not_in_db_unable_to_generate_dynamic_stack_count", tplId)); } // Item Types to return one of @@ -241,7 +243,7 @@ export class RagfairServerHelper */ public getPresetItems(item: Item): Item[] { - const preset = this.cloner.clone(this.databaseServer.getTables().globals.ItemPresets[item._id]._items); + const preset = this.cloner.clone(this.databaseServer.getTables().globals!.ItemPresets[item._id]._items); return this.itemHelper.reparentItemAndChildren(item, preset); } @@ -253,12 +255,12 @@ export class RagfairServerHelper public getPresetItemsByTpl(item: Item): Item[] { const presets = []; - for (const itemId in this.databaseServer.getTables().globals.ItemPresets) + for (const itemId in this.databaseServer.getTables().globals!.ItemPresets) { - if (this.databaseServer.getTables().globals.ItemPresets[itemId]._items[0]._tpl === item._tpl) + if (this.databaseServer.getTables().globals!.ItemPresets[itemId]._items[0]._tpl === item._tpl) { const presetItems = this.cloner.clone( - this.databaseServer.getTables().globals.ItemPresets[itemId]._items, + this.databaseServer.getTables().globals!.ItemPresets[itemId]._items, ); presets.push(this.itemHelper.reparentItemAndChildren(item, presetItems)); } diff --git a/project/src/loaders/ModLoadOrder.ts b/project/src/loaders/ModLoadOrder.ts index 0bfcf0c0..65c9db0f 100644 --- a/project/src/loaders/ModLoadOrder.ts +++ b/project/src/loaders/ModLoadOrder.ts @@ -48,7 +48,7 @@ export class ModLoadOrder { if (!this.mods.has(mod)) { - throw new Error(`Mod: ${mod} isn't present.`); + throw new Error(this.localisationService.getText("modloader-mod_isnt_present", mod)); } const config = this.mods.get(mod); @@ -70,7 +70,7 @@ export class ModLoadOrder { if (!this.mods.has(mod)) { - throw new Error(`Mod: ${mod} isn't present.`); + throw new Error(this.localisationService.getText("modloader-mod_isnt_present", mod)); } const config = this.mods.get(mod); diff --git a/project/src/services/InsuranceService.ts b/project/src/services/InsuranceService.ts index c7da353f..89e937cb 100644 --- a/project/src/services/InsuranceService.ts +++ b/project/src/services/InsuranceService.ts @@ -105,14 +105,16 @@ export class InsuranceService const markOfTheUnheardOnPlayer = pmcData.Inventory.items .filter((item) => item.slotId?.startsWith("SpecialSlot")) .find((item) => item._tpl === "65ddcc9cfa85b9f17d0dfb07"); + // Get insurance items for each trader for (const traderId in this.getInsurance(sessionID)) { const traderBase = this.traderHelper.getTrader(traderId, sessionID); if (!traderBase) { - throw new Error(`The trader id ${traderId} was not found!`); + throw new Error(this.localisationService.getText("insurance-unable_to_find_trader_by_id", traderId)); } + let insuranceReturnTimestamp = this.getInsuranceReturnTimestamp(pmcData, traderBase); if (markOfTheUnheardOnPlayer) { @@ -120,10 +122,9 @@ export class InsuranceService .globals!.config.Insurance.CoefOfHavingMarkOfUnknown; } const dialogueTemplates = this.databaseServer.getTables().traders![traderId].dialogue; - if (!dialogueTemplates) { - throw new Error(`The trader id ${traderId} does not have dialogues for insurance`); + throw new Error(this.localisationService.getText("insurance-trader_lacks_dialogue_property", traderId)); } const systemData = { @@ -131,10 +132,11 @@ export class InsuranceService time: this.timeUtil.getTimeMailFormat(), location: mapId, }; + const traderEnum = this.traderHelper.getTraderById(traderId); if (!traderEnum) { - throw new Error(`The trader id ${traderId} is missing from Traders enum`); + throw new Error(this.localisationService.getText("insurance-trader_missing_from_enum", traderId)); } // Send "i will go look for your stuff" message from trader to player this.mailSendService.sendLocalisedNpcMessageToPlayer( @@ -290,8 +292,9 @@ export class InsuranceService ?.find((insuranceItem) => insuranceItem.id === insuredItem.itemId); if (!inventoryInsuredItem) { - throw new Error(`Inventory insured item id ${insuredItem.itemId} was not found`); + throw new Error(this.localisationService.getText("insurance-item_not_found_in_post_raid_data", insuredItem.itemId)); } + equipmentPkg.push({ pmcData: pmcData, itemToReturnToPlayer: this.getInsuredItemDetails( @@ -323,14 +326,14 @@ export class InsuranceService const preRaidInventoryItem = preRaidGear.find((item) => item._id === softInsertChildModId); if (!preRaidInventoryItem) { - throw new Error(`Preraid inventory item ${softInsertChildModId} was not found`); + throw new Error(this.localisationService.getText("insurance-pre_raid_item_not_found", softInsertChildModId)); } const inventoryInsuredItem = offraidData.insurance?.find( (insuranceItem) => insuranceItem.id === softInsertChildModId, ); if (!inventoryInsuredItem) { - throw new Error(`Inventory insured item ${softInsertChildModId} was not found`); + throw new Error(this.localisationService.getText("insurance-post_raid_item_not_found", softInsertChildModId)); } equipmentPkg.push({ pmcData: pmcData, diff --git a/project/src/services/MailSendService.ts b/project/src/services/MailSendService.ts index 207862be..b083f0c4 100644 --- a/project/src/services/MailSendService.ts +++ b/project/src/services/MailSendService.ts @@ -544,7 +544,7 @@ export class MailSendService const senderId = this.getMessageSenderIdByType(messageDetails); if (!senderId) { - throw new Error(`Unable to find sender id for details ${messageDetails.sender}`); + throw new Error(this.localisationService.getText("mail-unable_to_find_message_sender_by_id", messageDetails.sender)); } // Does dialog exist let senderDialog = dialogsInProfile[senderId]; diff --git a/project/src/services/RepairService.ts b/project/src/services/RepairService.ts index 955ad86f..c203bb7e 100644 --- a/project/src/services/RepairService.ts +++ b/project/src/services/RepairService.ts @@ -60,17 +60,17 @@ export class RepairService traderId: string, ): RepairDetails { - const itemToRepair = pmcData.Inventory.items.find((x) => x._id === repairItemDetails._id); + const itemToRepair = pmcData.Inventory.items.find((item) => item._id === repairItemDetails._id); if (!itemToRepair) { - throw new Error(`Item ${repairItemDetails._id} not found in profile inventory, unable to repair`); + throw new Error(this.localisationService.getText("repair-unable_to_find_item_in_inventory_cant_repair", repairItemDetails._id)); } const priceCoef = this.traderHelper.getLoyaltyLevel(traderId, pmcData).repair_price_coef; const traderRepairDetails = this.traderHelper.getTrader(traderId, sessionID)?.repair; if (!traderRepairDetails) { - throw new Error(`Trader details for ${traderId} was not found`); + throw new Error(this.localisationService.getText("repair-unable_to_find_trader_details_by_id", traderId)); } const repairQualityMultiplier = Number(traderRepairDetails.quality); const repairRate = priceCoef <= 0 ? 1 : priceCoef / 100 + 1; @@ -92,7 +92,7 @@ export class RepairService const itemRepairCost = this.databaseServer.getTables().templates!.items[itemToRepair._tpl]._props.RepairCost; if (!itemRepairCost) { - throw new Error(`Item with tpl ${itemToRepair._tpl} has no repair cost`); + throw new Error(this.localisationService.getText("repair-unable_to_find_item_repair_cost", itemToRepair._tpl)); } const repairCost = Math.round( itemRepairCost * repairItemDetails.count * repairRate * this.repairConfig.priceMultiplier, @@ -196,7 +196,7 @@ export class RepairService const vestSkillToLevel = isHeavyArmor ? SkillTypes.HEAVY_VESTS : SkillTypes.LIGHT_VESTS; if (!repairDetails.repairPoints) { - throw new Error(`Repair for ${repairDetails.repairedItem._tpl} has no repair points`); + throw new Error(this.localisationService.getText("repair-item_has_no_repair_points", repairDetails.repairedItem._tpl)); } const pointsToAddToVestSkill = repairDetails.repairPoints * this.repairConfig.armorKitSkillPointGainPerRepairPointMultiplier; @@ -229,8 +229,9 @@ export class RepairService // Limit gain to a max value defined in config.maxIntellectGainPerRepair if (!repairDetails.repairPoints) { - throw new Error(`Repair for ${repairDetails.repairedItem._tpl} has no repair points`); + throw new Error(this.localisationService.getText("repair-item_has_no_repair_points", repairDetails.repairedItem._tpl)); } + return Math.min( repairDetails.repairPoints * intRepairMultiplier, this.repairConfig.maxIntellectGainPerRepair.kit, @@ -297,7 +298,7 @@ export class RepairService const itemToRepair = pmcData.Inventory.items.find((x: { _id: string }) => x._id === itemToRepairId); if (itemToRepair === undefined) { - throw new Error(`Item ${itemToRepairId} not found, unable to repair`); + throw new Error(this.localisationService.getText("repair-item_not_found_unable_to_repair", itemToRepairId)); } const itemsDb = this.databaseServer.getTables().templates!.items; @@ -322,10 +323,10 @@ export class RepairService // Find and use repair kit defined in body for (const repairKit of repairKits) { - const repairKitInInventory = pmcData.Inventory.items.find((x) => x._id === repairKit._id); + const repairKitInInventory = pmcData.Inventory.items.find((item) => item._id === repairKit._id); if (!repairKitInInventory) { - throw new Error(`Repair kit with id ${repairKit._id} was not found in the inventory`); + throw new Error(this.localisationService.getText("repair-repair_kit_not_found_in_inventory", repairKit._id)); } const repairKitDetails = itemsDb[repairKitInInventory._tpl]; const repairKitReductionAmount = repairKit.count; @@ -564,7 +565,7 @@ export class RepairService if (!repairDetails.repairPoints) { - throw new Error(`Repair for ${repairDetails.repairedItem._tpl} has no repair points`); + throw new Error(this.localisationService.getText("repair-item_has_no_repair_points", repairDetails.repairedItem._tpl)); } const durabilityToRestorePercent = repairDetails.repairPoints / template._props.MaxDurability!; const durabilityMultiplier = this.getDurabilityMultiplier(