diff --git a/Libraries/Core/Controllers/BotController.cs b/Libraries/Core/Controllers/BotController.cs index 6af9717a..2e6bc274 100644 --- a/Libraries/Core/Controllers/BotController.cs +++ b/Libraries/Core/Controllers/BotController.cs @@ -15,6 +15,7 @@ using Core.Services; using Core.Utils; using Core.Utils.Cloners; using SptCommon.Extensions; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Controllers; @@ -102,7 +103,8 @@ public class BotController( { // No bot of this type found, copy details from assault result[botTypeLower] = result["assault"]; - _logger.Debug($"Unable to find bot: {botTypeLower} in db, copying 'assault'"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Unable to find bot: {botTypeLower} in db, copying 'assault'"); continue; } @@ -201,15 +203,17 @@ public class BotController( if (botCacheCount >= botGenerationDetails.BotCountToGenerate) { - _logger.Debug($"Cache already has sufficient {cacheKey} bots: {botCacheCount}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Cache already has sufficient {cacheKey} bots: {botCacheCount}"); return; } // We're below desired count, add bots to cache var botsToGenerate = botGenerationDetails.BotCountToGenerate - botCacheCount; var progressWriter = new ProgressWriter(botGenerationDetails.BotCountToGenerate.GetValueOrDefault(30)); - - _logger.Debug($"Generating {botsToGenerate} bots for cacheKey: {cacheKey}"); + + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Generating {botsToGenerate} bots for cacheKey: {cacheKey}"); for (var i = 0; i < botsToGenerate; i++) { @@ -225,10 +229,11 @@ public class BotController( // } } - _logger.Debug( - $"Generated {botGenerationDetails.BotCountToGenerate} {botGenerationDetails.Role}" + - $"({botGenerationDetails.EventRole ?? botGenerationDetails.Role ?? ""}) {botGenerationDetails.BotDifficulty}bots" - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"Generated {botGenerationDetails.BotCountToGenerate} {botGenerationDetails.Role}" + + $"({botGenerationDetails.EventRole ?? botGenerationDetails.Role ?? ""}) {botGenerationDetails.BotDifficulty}bots" + ); } private List ReturnSingleBotFromCache(string sessionId, GenerateBotsRequestData request) @@ -313,11 +318,12 @@ public class BotController( { // No bot in cache, generate new and store in cache GenerateSingleBotAndStoreInCache(botGenerationDetails, sessionId, cacheKey); - - _logger.Debug( - $"Generated {botGenerationDetails.BotCountToGenerate} " + - $"{botGenerationDetails.Role} ({botGenerationDetails.EventRole ?? ""}) {botGenerationDetails.BotDifficulty} bots" - ); + + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"Generated {botGenerationDetails.BotCountToGenerate} " + + $"{botGenerationDetails.Role} ({botGenerationDetails.EventRole ?? ""}) {botGenerationDetails.BotDifficulty} bots" + ); } var desiredBot = _botGenerationCacheService.GetBot(cacheKey); diff --git a/Libraries/Core/Controllers/GameController.cs b/Libraries/Core/Controllers/GameController.cs index 975498a2..c714abe1 100644 --- a/Libraries/Core/Controllers/GameController.cs +++ b/Libraries/Core/Controllers/GameController.cs @@ -13,6 +13,7 @@ using Core.Utils; using Core.Utils.Cloners; using Core.Utils.Json; using Server; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Controllers; @@ -95,7 +96,8 @@ public class GameController( if (fullProfile.DialogueRecords is not null) _profileFixerService.CheckForAndFixDialogueAttachments(fullProfile); - _logger.Debug($"Started game with session {sessionId} {fullProfile.ProfileInfo?.Username}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Started game with session {sessionId} {fullProfile.ProfileInfo?.Username}"); var pmcProfile = fullProfile.CharacterData.PmcData; @@ -521,10 +523,13 @@ public class GameController( /// private void LogProfileDetails(SptProfile fullProfile) { - _logger.Debug($"Profile made with: {fullProfile.SptData?.Version}"); - _logger.Debug($"Server version: {(ProgramStatics.SPT_VERSION()) ?? _coreConfig.SptVersion} {ProgramStatics.COMMIT()}"); - _logger.Debug($"Debug enabled: {ProgramStatics.DEBUG()}"); - _logger.Debug($"Mods enabled: {ProgramStatics.MODS()}"); + if (_logger.IsLogEnabled(LogLevel.Debug)) + { + _logger.Debug($"Profile made with: {fullProfile.SptData?.Version}"); + _logger.Debug($"Server version: {(ProgramStatics.SPT_VERSION()) ?? _coreConfig.SptVersion} {ProgramStatics.COMMIT()}"); + _logger.Debug($"Debug enabled: {ProgramStatics.DEBUG()}"); + _logger.Debug($"Mods enabled: {ProgramStatics.MODS()}"); + } } public void Load() diff --git a/Libraries/Core/Controllers/InsuranceController.cs b/Libraries/Core/Controllers/InsuranceController.cs index 1e269cd3..1cd0058f 100644 --- a/Libraries/Core/Controllers/InsuranceController.cs +++ b/Libraries/Core/Controllers/InsuranceController.cs @@ -16,6 +16,7 @@ using Core.Utils.Cloners; using Core.Utils.Collections; using SptCommon.Annotations; using Insurance = Core.Models.Eft.Profile.Insurance; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Controllers; @@ -85,7 +86,10 @@ public class InsuranceController( var profileInsuranceDetails = _saveServer.GetProfile(sessionId).InsuranceList; if (profileInsuranceDetails.Count > 0) - _logger.Debug($"Found {profileInsuranceDetails.Count} insurance packages in profile {sessionId}"); + { + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Found {profileInsuranceDetails.Count} insurance packages in profile {sessionId}"); + } return profileInsuranceDetails.Where(insured => insuranceTime >= insured.ScheduledTime).ToList(); } @@ -99,9 +103,10 @@ public class InsuranceController( */ protected void ProcessInsuredItems(List insuranceDetails, string sessionId) { - _logger.Debug( - $"Processing {insuranceDetails.Count} insurance packages, which includes a total of: {CountAllInsuranceItems(insuranceDetails)} items, in profile: {sessionId}" - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"Processing {insuranceDetails.Count} insurance packages, which includes a total of: {CountAllInsuranceItems(insuranceDetails)} items, in profile: {sessionId}" + ); // Iterate over each of the insurance packages. foreach (var insured in insuranceDetails) @@ -162,7 +167,8 @@ public class InsuranceController( ) .ToList(); - _logger.Debug($"Removed processed insurance package. Remaining packages: {profile.InsuranceList.Count}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Removed processed insurance package. Remaining packages: {profile.InsuranceList.Count}"); } /** @@ -205,7 +211,8 @@ public class InsuranceController( // Log the number of items marked for deletion, if any if (!toDelete.Any()) { - _logger.Debug($"Marked {toDelete.Count} items for deletion from insurance."); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Marked {toDelete.Count} items for deletion from insurance."); } return toDelete; @@ -429,7 +436,8 @@ public class InsuranceController( // Log the parent item's name. itemsMap.TryGetValue(parentObj.Key, out var parentItem); var parentName = _itemHelper.GetItemName(parentItem.Template); - _logger.Debug($"Processing attachments of parent {parentName}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Processing attachments of parent {parentName}"); // Process the attachments for this individual parent item. ProcessAttachmentByParent(parentObj.Value, insuredTraderId, toDelete); @@ -473,7 +481,8 @@ public class InsuranceController( LogAttachmentsBeingRemoved(attachmentIdsToRemove, attachments, weightedAttachmentByPrice); - _logger.Debug($"Number of attachments to be deleted: {attachmentIdsToRemove.Count}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Number of attachments to be deleted: {attachmentIdsToRemove.Count}"); } private void LogAttachmentsBeingRemoved(List attachmentIdsToRemove, List attachments, Dictionary attachmentPrices) @@ -613,7 +622,8 @@ public class InsuranceController( // Log the roll with as much detail as possible. var itemName = insuredItem is not null ? $"{_itemHelper.GetItemName(insuredItem.Template)}" : ""; var status = roll ? "Delete" : "Keep"; - _logger.Debug($"Rolling {itemName} with {trader} - Return {traderReturnChance}% - Roll: {returnChance} - Status: {status}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Rolling {itemName} with {trader} - Return {traderReturnChance}% - Roll: {returnChance} - Status: {status}"); return roll; } @@ -696,7 +706,8 @@ public class InsuranceController( foreach (var softInsertSlot in softInsertSlots) { - _logger.Debug($"SoftInsertSlots: {softInsertSlot.SlotId}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"SoftInsertSlots: {softInsertSlot.SlotId}"); pmcData.InsuredItems.Add(new InsuredItem { TId = body.TransactionId, ItemId = softInsertSlot.Id }); } } @@ -727,7 +738,8 @@ public class InsuranceController( // Ensure hash has item in it if (!inventoryItemsHash.ContainsKey(itemId)) { - _logger.Debug($"Item with id: {itemId} missing from player inventory, skipping"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Item with id: {itemId} missing from player inventory, skipping"); continue; } diff --git a/Libraries/Core/Controllers/LocationController.cs b/Libraries/Core/Controllers/LocationController.cs index 4b8a0342..0b5b6d33 100644 --- a/Libraries/Core/Controllers/LocationController.cs +++ b/Libraries/Core/Controllers/LocationController.cs @@ -5,6 +5,7 @@ using Core.Models.Eft.Location; using Core.Models.Utils; using Core.Services; using Core.Utils.Cloners; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Controllers; @@ -37,7 +38,8 @@ public class LocationController( var mapBase = kvp.Value.Base; if (mapBase == null) { - _logger.Debug($"Map: {kvp} has no base json file, skipping generation"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Map: {kvp} has no base json file, skipping generation"); continue; } diff --git a/Libraries/Core/Controllers/QuestController.cs b/Libraries/Core/Controllers/QuestController.cs index 592ddad9..f5a6d68e 100644 --- a/Libraries/Core/Controllers/QuestController.cs +++ b/Libraries/Core/Controllers/QuestController.cs @@ -14,6 +14,7 @@ using Core.Services; using Core.Utils; using Core.Utils.Cloners; using SptCommon.Extensions; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Controllers; @@ -188,7 +189,8 @@ public class QuestController( var matchingQuest = repeatableQuest.ActiveQuests.FirstOrDefault(x => x.Id == acceptedQuest.QuestId); if (matchingQuest is not null) { - _logger.Debug($"Accepted repeatable quest {acceptedQuest.QuestId} from {repeatableQuest.Name}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Accepted repeatable quest {acceptedQuest.QuestId} from {repeatableQuest.Name}"); matchingQuest.SptRepatableGroupName = repeatableQuest.Name; return matchingQuest; diff --git a/Libraries/Core/Generators/BotEquipmentModGenerator.cs b/Libraries/Core/Generators/BotEquipmentModGenerator.cs index 68c203f1..db544989 100644 --- a/Libraries/Core/Generators/BotEquipmentModGenerator.cs +++ b/Libraries/Core/Generators/BotEquipmentModGenerator.cs @@ -940,8 +940,7 @@ public class BotEquipmentModGenerator( return ModSpawn.SPAWN; } - - var spawnMod = _probabilityHelper.RollChance(modSpawnChances.GetValueOrDefault(modSlotName)); + var spawnMod = _probabilityHelper.RollChance(modSpawnChances.GetValueOrDefault(modSlotName.ToLower())); if (!spawnMod && (slotRequired.GetValueOrDefault(false) || (botEquipConfig.WeaponSlotIdsToMakeRequired?.Contains(modSlotName) ?? false))) { // Edge case: Mod is required but spawn chance roll failed, choose default mod spawn for slot diff --git a/Libraries/Core/Generators/BotGenerator.cs b/Libraries/Core/Generators/BotGenerator.cs index 86f33b76..10dff8a8 100644 --- a/Libraries/Core/Generators/BotGenerator.cs +++ b/Libraries/Core/Generators/BotGenerator.cs @@ -12,6 +12,7 @@ using Core.Services; using Core.Utils; using Core.Utils.Cloners; using BodyPart = Core.Models.Eft.Common.Tables.BodyPart; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Generators; @@ -322,7 +323,8 @@ public class BotGenerator( if (!experiences.TryGetValue(botDifficulty.ToLower(), out var result)) { - _logger.Debug($"Unable to find experience: {botDifficulty} for {role} bot, falling back to `normal`"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Unable to find experience: {botDifficulty} for {role} bot, falling back to `normal`"); return _randomUtil.GetDouble(experiences["normal"].Min.Value, experiences["normal"].Max.Value); } @@ -479,7 +481,8 @@ public class BotGenerator( public void LogPmcGeneratedCount(List output) { var pmcCount = output.Aggregate(0, (acc, cur) => { return cur.Info.Side is "Bear" or "Usec" ? acc + 1 : acc; }); - _logger.Debug($"Generated {output.Count} total bots. Replaced {pmcCount} with PMCs"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Generated {output.Count} total bots. Replaced {pmcCount} with PMCs"); } /// diff --git a/Libraries/Core/Generators/BotInventoryGenerator.cs b/Libraries/Core/Generators/BotInventoryGenerator.cs index 50e4c608..4947fbb6 100644 --- a/Libraries/Core/Generators/BotInventoryGenerator.cs +++ b/Libraries/Core/Generators/BotInventoryGenerator.cs @@ -10,6 +10,7 @@ using Core.Models.Utils; using Core.Servers; using Core.Services; using Core.Utils; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Generators; @@ -342,7 +343,8 @@ public class BotInventoryGenerator( if (!tacVestsWithArmor.Any()) { - _logger.Debug($"Unable to filter to only armored rigs as bot: {botRole} has none in pool"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Unable to filter to only armored rigs as bot: {botRole} has none in pool"); return; } @@ -365,7 +367,8 @@ public class BotInventoryGenerator( if (!allowEmptyResult && !tacVestsWithoutArmor.Any()) { - _logger.Debug($"Unable to filter to only unarmored rigs as bot: {botRole} has none in pool"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Unable to filter to only unarmored rigs as bot: {botRole} has none in pool"); return; } @@ -420,7 +423,8 @@ public class BotInventoryGenerator( if (!dbResult.Key) { _logger.Error(_localisationService.GetText("bot-missing_item_template", chosenItemTpl)); - _logger.Debug($"EquipmentSlot-> {settings.RootEquipmentSlot}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"EquipmentSlot-> {settings.RootEquipmentSlot}"); // Remove picked item settings.RootEquipmentPool.Remove(chosenItemTpl); diff --git a/Libraries/Core/Generators/BotLootGenerator.cs b/Libraries/Core/Generators/BotLootGenerator.cs index 2007ce9b..f88f4b0d 100644 --- a/Libraries/Core/Generators/BotLootGenerator.cs +++ b/Libraries/Core/Generators/BotLootGenerator.cs @@ -9,6 +9,7 @@ using Core.Models.Utils; using Core.Services; using Core.Servers; using Core.Utils.Cloners; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Generators; @@ -530,18 +531,20 @@ public class BotLootGenerator( if (itemAddedResult == ItemAddedResult.NO_CONTAINERS) { // Bot has no container to put item in, exit - _logger.Debug($"Unable to add: {totalItemCount} items to bot as it lacks a container to include them"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Unable to add: {totalItemCount} items to bot as it lacks a container to include them"); break; } fitItemIntoContainerAttempts++; if (fitItemIntoContainerAttempts >= 4) { - _logger.Debug( - $"Failed placing item: {itemToAddTemplate.Name}: {i} of: {totalItemCount} items into: {botRole} " + - $"containers: {string.Join(",", equipmentSlots)}. Tried: {fitItemIntoContainerAttempts} " + - $"times, reason: {itemAddedResult}, skipping" - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"Failed placing item: {itemToAddTemplate.Name}: {i} of: {totalItemCount} items into: {botRole} " + + $"containers: {string.Join(",", equipmentSlots)}. Tried: {fitItemIntoContainerAttempts} " + + $"times, reason: {itemAddedResult}, skipping" + ); break; } @@ -697,7 +700,8 @@ public class BotLootGenerator( if (result != ItemAddedResult.SUCCESS) { - _logger.Debug($"Failed to add additional weapon {generatedWeapon.Weapon[0].Id} to bot backpack, reason: {result.ToString()}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Failed to add additional weapon {generatedWeapon.Weapon[0].Id} to bot backpack, reason: {result.ToString()}"); } } } @@ -763,17 +767,18 @@ public class BotLootGenerator( // Prevent edge-case of small loot pools + code trying to add limited item over and over infinitely if (itemSpawnLimits.CurrentLimits[idToCheckFor] > itemSpawnLimits.CurrentLimits[idToCheckFor] * 10) { - _logger.Debug( - _localisationService.GetText( - "bot-item_spawn_limit_reached_skipping_item", - new - { - botRole = botRole, - itemName = itemTemplate.Name, - attempts = itemSpawnLimits.CurrentLimits[idToCheckFor] - } - ) - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + _localisationService.GetText( + "bot-item_spawn_limit_reached_skipping_item", + new + { + botRole = botRole, + itemName = itemTemplate.Name, + attempts = itemSpawnLimits.CurrentLimits[idToCheckFor] + } + ) + ); return false; } diff --git a/Libraries/Core/Generators/BotWeaponGenerator.cs b/Libraries/Core/Generators/BotWeaponGenerator.cs index 7746a9dd..c02cf589 100644 --- a/Libraries/Core/Generators/BotWeaponGenerator.cs +++ b/Libraries/Core/Generators/BotWeaponGenerator.cs @@ -11,6 +11,7 @@ using Core.Servers; using Core.Services; using Core.Utils; using Core.Utils.Cloners; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Generators; @@ -529,9 +530,10 @@ public class BotWeaponGenerator( } var defaultMagTplId = _botWeaponGeneratorHelper.GetWeaponsDefaultMagazineTpl(weaponTemplate); - _logger.Debug( - $"[{botRole}] Unable to find magazine for weapon: {weaponTemplate.Id} {weaponTemplate.Name}, using mag template default: {defaultMagTplId}." - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"[{botRole}] Unable to find magazine for weapon: {weaponTemplate.Id} {weaponTemplate.Name}, using mag template default: {defaultMagTplId}." + ); return defaultMagTplId; } @@ -550,17 +552,18 @@ public class BotWeaponGenerator( var desiredCaliber = GetWeaponCaliber(weaponTemplate); if (!cartridgePool.TryGetValue(desiredCaliber, out var cartridgePoolForWeapon) || cartridgePoolForWeapon?.Keys.Count == 0) { - _logger.Debug( - _localisationService.GetText( - "bot-no_caliber_data_for_weapon_falling_back_to_default", - new - { - weaponId = weaponTemplate.Id, - weaponName = weaponTemplate.Name, - defaultAmmo = weaponTemplate.Properties.DefAmmo, - } - ) - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + _localisationService.GetText( + "bot-no_caliber_data_for_weapon_falling_back_to_default", + new + { + weaponId = weaponTemplate.Id, + weaponName = weaponTemplate.Name, + defaultAmmo = weaponTemplate.Properties.DefAmmo, + } + ) + ); // Immediately returns, default ammo is guaranteed to be compatible return weaponTemplate.Properties.DefAmmo; diff --git a/Libraries/Core/Generators/LocationLootGenerator.cs b/Libraries/Core/Generators/LocationLootGenerator.cs index 44a9e9ce..ea902992 100644 --- a/Libraries/Core/Generators/LocationLootGenerator.cs +++ b/Libraries/Core/Generators/LocationLootGenerator.cs @@ -11,6 +11,7 @@ using Core.Utils; using Core.Utils.Cloners; using Core.Utils.Collections; using SptCommon.Annotations; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Generators; @@ -113,7 +114,8 @@ public class LocationLootGenerator( staticLootItemCount += containerWithLoot.Template.Items.Count; } - _logger.Debug($"Added {guaranteedContainers.Count} guaranteed containers"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Added {guaranteedContainers.Count} guaranteed containers"); // Randomisation is turned off globally or just turned off for this map if ( @@ -123,9 +125,10 @@ public class LocationLootGenerator( ) ) { - _logger.Debug( - $"Container randomisation disabled, Adding {staticRandomisableContainersOnMap.Count} containers to {locationBase.Name}" - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"Container randomisation disabled, Adding {staticRandomisableContainersOnMap.Count} containers to {locationBase.Name}" + ); foreach (var container in staticRandomisableContainersOnMap) { var containerWithLoot = AddLootToContainer( @@ -166,7 +169,8 @@ public class LocationLootGenerator( if (data.ContainerIdsWithProbability.Count == 0) { - _logger.Debug($"`Group: {key} has no containers with< 100 % spawn chance to choose from, skipping"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"`Group: {key} has no containers with< 100 % spawn chance to choose from, skipping"); continue; } @@ -203,9 +207,10 @@ public class LocationLootGenerator( ); if (containerObject is null) { - _logger.Debug( - $"Container: {chosenContainerId} not found in staticRandomisableContainersOnMap, this is bad" - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"Container: {chosenContainerId} not found in staticRandomisableContainersOnMap, this is bad" + ); continue; } @@ -283,9 +288,10 @@ public class LocationLootGenerator( var containerIds = containerData.ContainerIdsWithProbability.Keys.ToList(); if (containerData.ChosenCount > containerIds.Count) { - _logger.Debug( - $"Group: {groupId} wants {containerData.ChosenCount} containers but pool only has {containerIds.Count}, add what's available" - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"Group: {groupId} wants {containerData.ChosenCount} containers but pool only has {containerIds.Count}, add what's available" + ); return containerIds; } @@ -357,9 +363,10 @@ public class LocationLootGenerator( if (container.Probability >= 1) { - _logger.Debug( - $"Container {container.Template.Id} with group ${groupData.GroupId} had 100 % chance to spawn was picked as random container, skipping" - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"Container {container.Template.Id} with group ${groupData.GroupId} had 100 % chance to spawn was picked as random container, skipping" + ); continue; } @@ -677,7 +684,8 @@ public class LocationLootGenerator( // Point is blacklsited, skip if (blacklistedSpawnpoints?.Contains(spawnpoint.Template.Id) ?? false) { - _logger.Debug($"Ignoring loose loot location: {spawnpoint.Template.Id}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Ignoring loose loot location: {spawnpoint.Template.Id}"); continue; } @@ -720,17 +728,18 @@ public class LocationLootGenerator( var tooManySpawnPointsRequested = desiredSpawnpointCount - chosenSpawnpoints.Count > 0; if (tooManySpawnPointsRequested) { - _logger.Debug( - _localisationService.GetText( - "location-spawn_point_count_requested_vs_found", - new - { - requested = desiredSpawnpointCount + guaranteedLoosePoints.Count, - found = chosenSpawnpoints.Count, - mapName = locationName, - } - ) - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + _localisationService.GetText( + "location-spawn_point_count_requested_vs_found", + new + { + requested = desiredSpawnpointCount + guaranteedLoosePoints.Count, + found = chosenSpawnpoints.Count, + mapName = locationName, + } + ) + ); } // Iterate over spawnpoints @@ -839,7 +848,8 @@ public class LocationLootGenerator( ); if (items is null || !items.Any()) { - _logger.Debug($"Unable to adjust loot item {itemTpl} as it does not exist inside {locationName} forced loot."); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"Unable to adjust loot item {itemTpl} as it does not exist inside {locationName} forced loot."); continue; } @@ -917,9 +927,10 @@ public class LocationLootGenerator( } else { - _logger.Debug( - $"Attempted to add a forced loot location with Id: {locationTemplateToAdd.Id} to map {locationName} that already has that id in use, skipping" - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"Attempted to add a forced loot location with Id: {locationTemplateToAdd.Id} to map {locationName} that already has that id in use, skipping" + ); } } } @@ -1076,7 +1087,8 @@ public class LocationLootGenerator( else { // RSP30 (62178be9d0050232da3485d9/624c0b3340357b5f566e8766/6217726288ed9f0845317459) doesn't have any default presets and kills this code below as it has no chidren to reparent - _logger.Debug($"createStaticLootItem() No preset found for weapon: {chosenTpl}"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"createStaticLootItem() No preset found for weapon: {chosenTpl}"); } rootItem = items[0]; diff --git a/Libraries/Core/Generators/LootGenerator.cs b/Libraries/Core/Generators/LootGenerator.cs index 3c6c9563..2dd31eaf 100644 --- a/Libraries/Core/Generators/LootGenerator.cs +++ b/Libraries/Core/Generators/LootGenerator.cs @@ -11,6 +11,7 @@ using Core.Models.Utils; using Core.Services; using Core.Utils; using Core.Utils.Cloners; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Generators; @@ -360,7 +361,8 @@ public class LootGenerator( // No `_encyclopedia` property, not possible to reliably get root item tpl if (chosenPreset.Encyclopedia is null) { - _logger.Debug("$Preset with id: {chosenPreset?.Id} lacks encyclopedia property, skipping"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug("$Preset with id: {chosenPreset?.Id} lacks encyclopedia property, skipping"); return false; } @@ -368,7 +370,8 @@ public class LootGenerator( // Get preset root item db details via its `_encyclopedia` property var itemDbDetails = _itemHelper.GetItem(chosenPreset.Encyclopedia); if (!itemDbDetails.Key) { - _logger.Debug($"$Unable to find preset with tpl: {chosenPreset.Encyclopedia}, skipping"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"$Unable to find preset with tpl: {chosenPreset.Encyclopedia}, skipping"); return false; } @@ -493,7 +496,8 @@ public class LootGenerator( var ammoBoxesMatchingCaliber = ammoBoxesDetails.Where((x) => x.Properties.AmmoCaliber == weaponCaliber); if (!ammoBoxesMatchingCaliber.Any()) { - _logger.Debug($"No ammo box with caliber {weaponCaliber} found, skipping"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"No ammo box with caliber {weaponCaliber} found, skipping"); continue; } @@ -519,7 +523,8 @@ public class LootGenerator( ); if (rewardItemPool.Count() == 0) { - _logger.Debug($"No items with base type of {rewardKey} found, skipping"); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug($"No items with base type of {rewardKey} found, skipping"); continue; } @@ -561,9 +566,10 @@ public class LootGenerator( (item) => item?.Parent == rewardKey && !_itemFilterService.IsItemBlacklisted(item.Id) ); if (relatedItems is null || relatedItems.Count() == 0) { - _logger.Debug( - $"No items found to fulfil reward type: {rewardKey} for weapon: {chosenWeaponPreset.Name}, skipping type" - ); + if(_logger.IsLogEnabled(LogLevel.Debug)) + _logger.Debug( + $"No items found to fulfil reward type: {rewardKey} for weapon: {chosenWeaponPreset.Name}, skipping type" + ); continue; } diff --git a/Libraries/Core/Models/Spt/Logging/LogLevel.cs b/Libraries/Core/Models/Spt/Logging/LogLevel.cs index ee66cd1d..08def7b5 100644 --- a/Libraries/Core/Models/Spt/Logging/LogLevel.cs +++ b/Libraries/Core/Models/Spt/Logging/LogLevel.cs @@ -2,12 +2,14 @@ public enum LogLevel { + Fatal, Error, Warn, Success, Info, Custom, - Debug + Debug, + Trace } // TODO: needs to be moved to enums namespace diff --git a/Libraries/Core/Models/Utils/ISptLogger.cs b/Libraries/Core/Models/Utils/ISptLogger.cs index ba7add11..49c2cc5e 100644 --- a/Libraries/Core/Models/Utils/ISptLogger.cs +++ b/Libraries/Core/Models/Utils/ISptLogger.cs @@ -1,4 +1,5 @@ using Core.Models.Logging; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Core.Models.Utils; @@ -14,4 +15,5 @@ public interface ISptLogger void Debug(string data, Exception? ex = null); void Critical(string data, Exception? ex = null); void WriteToLogFile(string body); + bool IsLogEnabled(LogLevel level); } diff --git a/Libraries/Core/Services/BotLootCacheService.cs b/Libraries/Core/Services/BotLootCacheService.cs index 6cf4b0dd..472cf33c 100644 --- a/Libraries/Core/Services/BotLootCacheService.cs +++ b/Libraries/Core/Services/BotLootCacheService.cs @@ -22,13 +22,17 @@ public class BotLootCacheService( ) { protected Dictionary _lootCache = new(); + protected object _lock = new(); /// /// Remove cached bot loot data /// public void ClearCache() { - _lootCache.Clear(); + lock (_lock) + { + _lootCache.Clear(); + } } /// @@ -46,14 +50,21 @@ public class BotLootCacheService( BotType botJsonTemplate, MinMax? itemPriceMinMax = null) { - if (!BotRoleExistsInCache(botRole)) + lock (_lock) { - InitCacheForBotRole(botRole); - AddLootToCache(botRole, isPmc, botJsonTemplate); + if (!BotRoleExistsInCache(botRole)) + { + InitCacheForBotRole(botRole); + AddLootToCache(botRole, isPmc, botJsonTemplate); + } } Dictionary result = null; - var botRoleCache = _lootCache[botRole]; + BotLootCache botRoleCache; + lock (_lock) + { + botRoleCache = _lootCache[botRole]; + } switch (lootType) { case LootCacheType.Special: @@ -436,21 +447,25 @@ public class BotLootCacheService( filteredVestItems[itemKvP.Key] = itemKvP.Value; } - var cacheForRole = _lootCache[botRole]; + BotLootCache cacheForRole; + lock (_lock) + { + cacheForRole = _lootCache[botRole]; - cacheForRole.HealingItems = healingItems; - cacheForRole.DrugItems = drugItems; - cacheForRole.FoodItems = foodItems; - cacheForRole.DrinkItems = drinkItems; - cacheForRole.CurrencyItems = currencyItems; - cacheForRole.StimItems = stimItems; - cacheForRole.GrenadeItems = grenadeItems; + cacheForRole.HealingItems = healingItems; + cacheForRole.DrugItems = drugItems; + cacheForRole.FoodItems = foodItems; + cacheForRole.DrinkItems = drinkItems; + cacheForRole.CurrencyItems = currencyItems; + cacheForRole.StimItems = stimItems; + cacheForRole.GrenadeItems = grenadeItems; - cacheForRole.SpecialItems = specialLootItems; - cacheForRole.BackpackLoot = filteredBackpackItems; - cacheForRole.PocketLoot = filteredPocketItems; - cacheForRole.VestLoot = filteredVestItems; - cacheForRole.SecureLoot = secureLootTPool; + cacheForRole.SpecialItems = specialLootItems; + cacheForRole.BackpackLoot = filteredBackpackItems; + cacheForRole.PocketLoot = filteredPocketItems; + cacheForRole.VestLoot = filteredVestItems; + cacheForRole.SecureLoot = secureLootTPool; + } } /// @@ -546,7 +561,8 @@ public class BotLootCacheService( /// true if they exist protected bool BotRoleExistsInCache(string botRole) { - return _lootCache.ContainsKey(botRole); + lock (_lock) + return _lootCache.ContainsKey(botRole); } /// @@ -555,23 +571,26 @@ public class BotLootCacheService( /// Bot role to hydrate protected void InitCacheForBotRole(string botRole) { - _lootCache[botRole] = new() + lock (_lock) { - BackpackLoot = new(), - PocketLoot = new(), - VestLoot = new(), - SecureLoot = new(), - CombinedPoolLoot = new(), + _lootCache.Add(botRole, new() + { + BackpackLoot = new(), + PocketLoot = new(), + VestLoot = new(), + SecureLoot = new(), + CombinedPoolLoot = new(), - SpecialItems = new(), - GrenadeItems = new(), - DrugItems = new(), - FoodItems = new(), - DrinkItems = new(), - CurrencyItems = new(), - HealingItems = new(), - StimItems = new(), - }; + SpecialItems = new(), + GrenadeItems = new(), + DrugItems = new(), + FoodItems = new(), + DrinkItems = new(), + CurrencyItems = new(), + HealingItems = new(), + StimItems = new(), + }); + } } /// diff --git a/Libraries/SptAssets/Assets/configs/core.json b/Libraries/SptAssets/Assets/configs/core.json index adb4d443..3abce4d3 100644 --- a/Libraries/SptAssets/Assets/configs/core.json +++ b/Libraries/SptAssets/Assets/configs/core.json @@ -1,7 +1,7 @@ { "sptVersion": "4.0.0", "projectName": "SPT", - "compatibleTarkovVersion": "0.16.0.34568", + "compatibleTarkovVersion": "0.16.0.34644", "serverName": "SPT Server", "profileSaveIntervalSeconds": 15, "sptFriendNickname": "SPT", diff --git a/Server/Logger/WebApplicationLogger.cs b/Server/Logger/WebApplicationLogger.cs index eb938ae3..ea7ec3d4 100644 --- a/Server/Logger/WebApplicationLogger.cs +++ b/Server/Logger/WebApplicationLogger.cs @@ -2,6 +2,7 @@ using SptCommon.Annotations; using Core.Models.Eft.ItemEvent; using Core.Models.Logging; using Core.Models.Utils; +using LogLevel = Core.Models.Spt.Logging.LogLevel; namespace Server.Logger; @@ -88,4 +89,25 @@ public class SptWebApplicationLogger : ISptLogger //TODO - implement + turn object into json _logger.LogError("NOT IMPLEMENTED - WriteToLogFile"); } + + public bool IsLogEnabled(LogLevel level) + { + return _logger.IsEnabled(ConvertLogLevel(level)); + } + + protected Microsoft.Extensions.Logging.LogLevel ConvertLogLevel(LogLevel level) + { + return level switch + { + LogLevel.Trace => Microsoft.Extensions.Logging.LogLevel.Trace, + LogLevel.Debug => Microsoft.Extensions.Logging.LogLevel.Debug, + LogLevel.Success + or LogLevel.Info + or LogLevel.Custom => Microsoft.Extensions.Logging.LogLevel.Information, + LogLevel.Warn => Microsoft.Extensions.Logging.LogLevel.Warning, + LogLevel.Error => Microsoft.Extensions.Logging.LogLevel.Error, + LogLevel.Fatal => Microsoft.Extensions.Logging.LogLevel.Critical, + _ => throw new ArgumentOutOfRangeException(nameof(level), level, null) + }; + } } diff --git a/Tools/ItemTplGenerator/SptBasicLogger.cs b/Tools/ItemTplGenerator/SptBasicLogger.cs index 2e8a45a0..90301601 100644 --- a/Tools/ItemTplGenerator/SptBasicLogger.cs +++ b/Tools/ItemTplGenerator/SptBasicLogger.cs @@ -1,4 +1,5 @@ using Core.Models.Logging; +using Core.Models.Spt.Logging; using Core.Models.Utils; using SptCommon.Annotations; @@ -53,4 +54,9 @@ public class SptBasicLogger : ISptLogger { Console.WriteLine($"{categoryName}: {body}"); } + + public bool IsLogEnabled(LogLevel level) + { + return true; + } } diff --git a/UnitTests/Mock/MockLogger.cs b/UnitTests/Mock/MockLogger.cs index a43b2458..57449f47 100644 --- a/UnitTests/Mock/MockLogger.cs +++ b/UnitTests/Mock/MockLogger.cs @@ -1,4 +1,5 @@ using Core.Models.Logging; +using Core.Models.Spt.Logging; using Core.Models.Utils; namespace UnitTests.Mock; @@ -55,6 +56,11 @@ public class MockLogger : ISptLogger throw new NotImplementedException(); } + public bool IsLogEnabled(LogLevel level) + { + return true; + } + public void WriteToLogFile(object body) { Console.WriteLine(body);