diff --git a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/templates/repeatableQuests.json b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/templates/repeatableQuests.json
index 003b10ab..9f649a39 100644
--- a/Libraries/SPTarkov.Server.Assets/SPT_Data/database/templates/repeatableQuests.json
+++ b/Libraries/SPTarkov.Server.Assets/SPT_Data/database/templates/repeatableQuests.json
@@ -90,9 +90,9 @@
],
"changeStandingCost": 0,
"questStatus": {
- "id": "mongoId",
+ "id": "000000000000000000000000",
"uid": "playerId",
- "qid": "questId",
+ "qid": "000000000000000000000000",
"startTime": 0,
"status": 1,
"statusTimers": {}
@@ -143,9 +143,9 @@
],
"changeStandingCost": 0,
"questStatus": {
- "id": "mongoId",
+ "id": "000000000000000000000000",
"uid": "playerId",
- "qid": "questId",
+ "qid": "000000000000000000000000",
"startTime": 0,
"status": 1,
"statusTimers": {}
@@ -227,9 +227,9 @@
],
"changeStandingCost": 0,
"questStatus": {
- "id": "mongoId",
+ "id": "000000000000000000000000",
"uid": "playerId",
- "qid": "questId",
+ "qid": "000000000000000000000000",
"startTime": 0,
"status": 1,
"statusTimers": {}
@@ -331,9 +331,9 @@
],
"changeStandingCost": 0,
"questStatus": {
- "id": "mongoId",
+ "id": "000000000000000000000000",
"uid": "playerId",
- "qid": "questId",
+ "qid": "000000000000000000000000",
"startTime": 0,
"status": 1,
"statusTimers": {}
diff --git a/Libraries/SPTarkov.Server.Core/Callbacks/MatchCallbacks.cs b/Libraries/SPTarkov.Server.Core/Callbacks/MatchCallbacks.cs
index 59223d5f..b91ca136 100644
--- a/Libraries/SPTarkov.Server.Core/Callbacks/MatchCallbacks.cs
+++ b/Libraries/SPTarkov.Server.Core/Callbacks/MatchCallbacks.cs
@@ -157,7 +157,7 @@ public class MatchCallbacks(
/// Handle client/putMetrics
///
///
- public ValueTask PutMetrics(string url, PutMetricsRequestData info, MongoId sessionID)
+ public ValueTask PutMetrics(string url, PutMetricsRequestData info, MongoId sessionId)
{
return new ValueTask(httpResponseUtil.NullResponse());
}
@@ -166,7 +166,11 @@ public class MatchCallbacks(
/// Handle client/analytics/event-disconnect
///
///
- public ValueTask EventDisconnect(string url, PutMetricsRequestData info, string MongoId)
+ public ValueTask EventDisconnect(
+ string url,
+ PutMetricsRequestData request,
+ MongoId sessionId
+ )
{
return new ValueTask(httpResponseUtil.NullResponse());
}
diff --git a/Libraries/SPTarkov.Server.Core/Controllers/CustomizationController.cs b/Libraries/SPTarkov.Server.Core/Controllers/CustomizationController.cs
index c2e16b6c..54be2524 100644
--- a/Libraries/SPTarkov.Server.Core/Controllers/CustomizationController.cs
+++ b/Libraries/SPTarkov.Server.Core/Controllers/CustomizationController.cs
@@ -143,7 +143,7 @@ public class CustomizationController(
/// Session/Player id
///
/// Suit
- protected Suit? GetTraderClothingOffer(MongoId sessionId, string? offerId)
+ protected Suit? GetTraderClothingOffer(MongoId sessionId, MongoId offerId)
{
var foundSuit = GetAllTraderSuits(sessionId).FirstOrDefault(s => s.Id == offerId);
if (foundSuit is null)
diff --git a/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs b/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs
index bf6a8bf9..ef4e0bbc 100644
--- a/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs
+++ b/Libraries/SPTarkov.Server.Core/Controllers/InsuranceController.cs
@@ -185,9 +185,9 @@ public class InsuranceController(
/// The ID that should be assigned to all "hideout"/root items
/// The insurance object containing the items to evaluate for deletion
/// A Set containing the IDs of items that should be deleted
- protected HashSet FindItemsToDelete(string rootItemParentId, Insurance insured)
+ protected HashSet FindItemsToDelete(string rootItemParentId, Insurance insured)
{
- var toDelete = new HashSet();
+ var toDelete = new HashSet();
// Populate a Map object of items for quick lookup by their ID and use it to populate a Map of main-parent items
// and each of their attachments. For example, a gun mapped to each of its attachments.
@@ -388,7 +388,7 @@ public class InsuranceController(
/// Dictionary containing parent item IDs to arrays of their attachment items
protected void ProcessRegularItems(
Insurance insured,
- HashSet toDelete,
+ HashSet toDelete,
Dictionary> parentAttachmentsMap
)
{
@@ -440,8 +440,8 @@ public class InsuranceController(
protected void ProcessAttachments(
Dictionary> mainParentToAttachmentsMap,
Dictionary itemsMap,
- string? insuredTraderId,
- HashSet toDelete
+ MongoId? insuredTraderId,
+ HashSet toDelete
)
{
foreach (var parentObj in mainParentToAttachmentsMap)
@@ -462,7 +462,7 @@ public class InsuranceController(
}
// Process the attachments for this individual parent item.
- ProcessAttachmentByParent(parentObj.Value, insuredTraderId, toDelete);
+ ProcessAttachmentByParent(parentObj.Value, insuredTraderId.Value, toDelete);
}
}
@@ -477,8 +477,8 @@ public class InsuranceController(
/// array that accumulates the IDs of the items to be deleted
protected void ProcessAttachmentByParent(
List- attachments,
- string? traderId,
- HashSet toDelete
+ MongoId traderId,
+ HashSet toDelete
)
{
// Create dict of item ids + their flea/handbook price (highest is chosen)
@@ -576,7 +576,7 @@ public class InsuranceController(
/// Attachment count to remove
protected double GetAttachmentCountToRemove(
Dictionary weightedAttachmentByPrice,
- string? traderId
+ MongoId traderId
)
{
const int removeCount = 0;
@@ -599,7 +599,7 @@ public class InsuranceController(
///
/// The insured items to process
/// The items that should be deleted
- protected void RemoveItemsFromInsurance(Insurance insured, HashSet toDelete)
+ protected void RemoveItemsFromInsurance(Insurance insured, HashSet toDelete)
{
insured.Items = insured.Items.Where(item => !toDelete.Contains(item.Id)).ToList();
}
diff --git a/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs b/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs
index 9c5dff19..5f55086c 100644
--- a/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs
+++ b/Libraries/SPTarkov.Server.Core/Controllers/InventoryController.cs
@@ -613,7 +613,7 @@ public class InventoryController(
// get tpl from trader assort
{
return databaseService
- .GetTrader(request.FromOwner.Id)
+ .GetTrader(request.FromOwner.Id.Value)
.Assort.Items.FirstOrDefault(item => item.Id == request.ItemId)
?.Template;
}
@@ -630,7 +630,7 @@ public class InventoryController(
// Try alternate way of getting offer if first approach fails
var offer =
ragfairOfferService.GetOfferByOfferId(request.ItemId)
- ?? ragfairOfferService.GetOfferByOfferId(request.FromOwner.Id);
+ ?? ragfairOfferService.GetOfferByOfferId(request.FromOwner.Id.Value);
// Try find examine item inside offer items array
var matchingItem = offer.Items.FirstOrDefault(offerItem =>
@@ -1080,7 +1080,7 @@ public class InventoryController(
// Changes made to result apply to character inventory
var inventoryItems = inventoryHelper.GetOwnerInventoryItems(
request,
- request.NewItem,
+ request.NewItem.Value,
sessionID
);
@@ -1117,7 +1117,7 @@ public class InventoryController(
.Items.NewItems.Add(
new Item
{
- Id = request.NewItem,
+ Id = request.NewItem.Value,
Template = itemToSplit.Template,
Upd = updatedUpd,
}
@@ -1127,7 +1127,7 @@ public class InventoryController(
inventoryItems.To.Add(
new Item
{
- Id = request.NewItem,
+ Id = request.NewItem.Value,
Template = itemToSplit.Template,
ParentId = request.Container.Id,
SlotId = request.Container.ContainerName,
diff --git a/Libraries/SPTarkov.Server.Core/Generators/BotEquipmentModGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/BotEquipmentModGenerator.cs
index f43eda14..aaaa2a87 100644
--- a/Libraries/SPTarkov.Server.Core/Generators/BotEquipmentModGenerator.cs
+++ b/Libraries/SPTarkov.Server.Core/Generators/BotEquipmentModGenerator.cs
@@ -197,7 +197,8 @@ public class BotEquipmentModGenerator(
);
switch (plateSlotFilteringOutcome.Result)
{
- case Result.UNKNOWN_FAILURE or Result.NO_DEFAULT_FILTER:
+ case Result.UNKNOWN_FAILURE
+ or Result.NO_DEFAULT_FILTER:
if (logger.IsLogEnabled(LogLevel.Debug))
{
logger.Debug(
@@ -225,7 +226,7 @@ public class BotEquipmentModGenerator(
{
modTpl = exhaustableModPool.GetRandomValue();
if (
- modTpl is not null
+ !modTpl.Value.IsEmpty()
&& !botGeneratorHelper
.IsItemIncompatibleWithCurrentItems(equipment, modTpl.Value, modSlotName)
.Incompatible.GetValueOrDefault(false)
@@ -1120,7 +1121,7 @@ public class BotEquipmentModGenerator(
// It's ammo, use predefined ammo parameter
if (GetAmmoContainers().Contains(request.ModSlot) && request.ModSlot != "mod_magazine")
{
- return itemHelper.GetItem(request.AmmoTpl);
+ return itemHelper.GetItem(request.AmmoTpl.Value);
}
// Ensure there's a pool of mods to pick from
@@ -1258,7 +1259,7 @@ public class BotEquipmentModGenerator(
return null;
}
- return itemHelper.GetItem(chosenModResult.ChosenTemplate);
+ return itemHelper.GetItem(chosenModResult.ChosenTemplate.Value);
}
///
diff --git a/Libraries/SPTarkov.Server.Core/Generators/BotWeaponGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/BotWeaponGenerator.cs
index f04173be..f0cf5dbe 100644
--- a/Libraries/SPTarkov.Server.Core/Generators/BotWeaponGenerator.cs
+++ b/Libraries/SPTarkov.Server.Core/Generators/BotWeaponGenerator.cs
@@ -243,7 +243,7 @@ public class BotWeaponGenerator(
// Fill UBGL if found
var ubglMod = weaponWithModsArray.FirstOrDefault(x => x.SlotId == "mod_launcher");
- string? ubglAmmoTpl = null;
+ MongoId? ubglAmmoTpl = null;
if (ubglMod is not null)
{
var ubglTemplate = itemHelper.GetItem(ubglMod.Template).Value;
@@ -252,7 +252,7 @@ public class BotWeaponGenerator(
// the default ammo passed from GetWeightCompatibleAmmo can be null
if (ubglAmmoTpl is not null)
{
- FillUbgl(weaponWithModsArray, ubglMod, ubglAmmoTpl);
+ FillUbgl(weaponWithModsArray, ubglMod, ubglAmmoTpl.Value);
}
}
@@ -497,7 +497,10 @@ public class BotWeaponGenerator(
}
// Has an UBGL
- if (generatedWeaponResult.ChosenUbglAmmoTemplate is not null)
+ if (
+ generatedWeaponResult.ChosenUbglAmmoTemplate is not null
+ && !generatedWeaponResult.ChosenUbglAmmoTemplate.Value.IsEmpty()
+ )
{
AddUbglGrenadesToBotInventory(weaponAndMods, generatedWeaponResult, inventory);
}
@@ -548,7 +551,7 @@ public class BotWeaponGenerator(
// get ammo template from db
var ubglAmmoDbTemplate = itemHelper
- .GetItem(generatedWeaponResult.ChosenUbglAmmoTemplate)
+ .GetItem(generatedWeaponResult.ChosenUbglAmmoTemplate.Value)
.Value;
// Add greandes to bot inventory
@@ -564,7 +567,12 @@ public class BotWeaponGenerator(
.Process(ubglAmmoGenModel);
// Store extra grenades in secure container
- AddAmmoToSecureContainer(5, generatedWeaponResult.ChosenUbglAmmoTemplate, 20, inventory);
+ AddAmmoToSecureContainer(
+ 5,
+ generatedWeaponResult.ChosenUbglAmmoTemplate.Value,
+ 20,
+ inventory
+ );
}
///
@@ -659,7 +667,7 @@ public class BotWeaponGenerator(
/// Weapon details from database we want to pick ammo for
/// Ammo template that works with the desired gun
protected MongoId GetWeightedCompatibleAmmo(
- Dictionary> cartridgePool,
+ Dictionary> cartridgePool,
TemplateItem weaponTemplate
)
{
@@ -700,7 +708,7 @@ public class BotWeaponGenerator(
}
// Inner join the weapons allowed + passed in cartridge pool to get compatible cartridges
- Dictionary compatibleCartridges = new();
+ Dictionary compatibleCartridges = new();
foreach (var cartridge in cartridgePoolForWeapon)
{
if (compatibleCartridgesInTemplate.Contains(cartridge.Key))
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs
index e11f07d7..95441ff9 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs
@@ -1491,7 +1491,7 @@ public class ItemHelper(
return;
}
- FillMagazineWithCartridge(magazine, magTemplate, cartridgeTpl, minSizePercent);
+ FillMagazineWithCartridge(magazine, magTemplate, cartridgeTpl.Value, minSizePercent);
}
///
@@ -1621,7 +1621,7 @@ public class ItemHelper(
/// If a cartridge cannot be found in the above staticAmmoDist param, use this instead
/// OPTIONAL whitelist for cartridges
/// Tpl of cartridge
- protected string? DrawAmmoTpl(
+ protected MongoId? DrawAmmoTpl(
string caliber,
Dictionary> staticAmmoDist,
MongoId? fallbackCartridgeTpl = null,
@@ -1647,19 +1647,19 @@ public class ItemHelper(
return null;
}
- var ammoArray = new ProbabilityObjectArray(cloner);
+ var ammoArray = new ProbabilityObjectArray(cloner);
foreach (var icd in ammos)
{
// Whitelist exists and tpl not inside it, skip
// Fixes 9x18mm kedr issues
- if (cartridgeWhitelist is not null && !cartridgeWhitelist.Contains(icd.Tpl))
+ if (cartridgeWhitelist is not null && !cartridgeWhitelist.Contains(icd.Tpl.Value))
{
continue;
}
ammoArray.Add(
- new ProbabilityObject(
- icd.Tpl,
+ new ProbabilityObject(
+ icd.Tpl.Value,
(double)icd.RelativeProbability,
null
)
diff --git a/Libraries/SPTarkov.Server.Core/Models/Common/MongoId.cs b/Libraries/SPTarkov.Server.Core/Models/Common/MongoId.cs
index 654510ac..1ce73646 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Common/MongoId.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Common/MongoId.cs
@@ -120,6 +120,16 @@ public readonly struct MongoId : IEquatable
return left.Equals(right);
}
+ public static bool operator !=(MongoId left, MongoId? right)
+ {
+ return left.Equals(right);
+ }
+
+ public static bool operator ==(MongoId left, MongoId? right)
+ {
+ return left.Equals(right);
+ }
+
public static bool operator !=(MongoId left, MongoId right)
{
return !left.Equals(right);
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Globals.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Globals.cs
index f2750a7e..ab2617a5 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Globals.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Globals.cs
@@ -1594,7 +1594,7 @@ public record WildBody
public string? Body { get; set; }
[JsonPropertyName("hands")]
- public string? Hands { get; set; }
+ public MongoId? Hands { get; set; }
[JsonPropertyName("isNotRandom")]
public bool? IsNotRandom { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Location.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Location.cs
index 6db6acc5..cbb4221f 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Location.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Location.cs
@@ -118,7 +118,7 @@ public record ItemDistribution
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("tpl")]
- public string? Tpl { get; set; }
+ public MongoId Tpl { get; set; }
[JsonPropertyName("relativeProbability")]
public float? RelativeProbability { get; set; }
@@ -169,7 +169,7 @@ public record StaticAmmoDetails
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("tpl")]
- public string? Tpl { get; set; }
+ public MongoId? Tpl { get; set; }
[JsonPropertyName("relativeProbability")]
public float? RelativeProbability { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/LocationBase.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/LocationBase.cs
index 83601624..33ab7400 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/LocationBase.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/LocationBase.cs
@@ -455,12 +455,6 @@ public record Limit : MinMax
{
[JsonPropertyName("items")]
public List? Items { get; set; }
-
- [JsonPropertyName("min")]
- public int? Min { get; set; }
-
- [JsonPropertyName("max")]
- public int? Max { get; set; }
}
public record AirdropParameter
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Request/BaseInteractionRequestData.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Request/BaseInteractionRequestData.cs
index 16ae4fd0..7868c76c 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Request/BaseInteractionRequestData.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Request/BaseInteractionRequestData.cs
@@ -1,4 +1,5 @@
using System.Text.Json.Serialization;
+using SPTarkov.Server.Core.Models.Common;
namespace SPTarkov.Server.Core.Models.Eft.Common.Request;
@@ -23,7 +24,7 @@ public record OwnerInfo
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("id")]
- public string? Id { get; set; }
+ public MongoId? Id { get; set; }
[JsonPropertyName("type")]
public string? Type { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs
index c499a284..faec5e59 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotBase.cs
@@ -936,7 +936,7 @@ public record BotHideoutArea
public List? Slots { get; set; }
[JsonPropertyName("lastRecipe")]
- public string? LastRecipe { get; set; }
+ public MongoId? LastRecipe { get; set; }
}
public record HideoutSlot
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs
index cbd06fe1..de09de3a 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs
@@ -448,7 +448,7 @@ public record BotTypeInventory
[JsonPropertyName("equipment")]
public Dictionary>? Equipment { get; set; }
- public GlobalAmmo? Ammo { get; set; }
+ public Dictionary>? Ammo { get; set; }
[JsonPropertyName("items")]
public ItemPools? Items { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Quest.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Quest.cs
index bfadda66..3a99a25a 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Quest.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/Quest.cs
@@ -105,9 +105,6 @@ public record Quest
[JsonPropertyName("side")]
public required string Side { get; set; }
- [JsonPropertyName("acceptanceAndFinishingSource")]
- public string? AcceptanceAndFinishingSource { get; set; }
-
[JsonPropertyName("progressSource")]
public string? ProgressSource { get; set; }
@@ -125,15 +122,6 @@ public record Quest
///
[JsonPropertyName("sptStatus")]
public QuestStatusEnum? SptStatus { get; set; }
-
- [JsonPropertyName("questStatus")]
- public QuestStatus? QuestStatus { get; set; }
-
- [JsonPropertyName("changeCost")]
- public List
[JsonPropertyName("ammoTpl")]
- public string? AmmoTpl { get; set; }
+ public MongoId? AmmoTpl { get; set; }
///
/// Parent item the mod will go into
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/BotConfig.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/BotConfig.cs
index e97cf024..e64bb452 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/BotConfig.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/BotConfig.cs
@@ -440,10 +440,10 @@ public record AdjustmentDetails
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("add")]
- public Dictionary>? Add { get; set; }
+ public Dictionary>? Add { get; set; }
[JsonPropertyName("edit")]
- public Dictionary>? Edit { get; set; }
+ public Dictionary>? Edit { get; set; }
}
public class ArmorPlateWeights
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/GiftsConfig.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/GiftsConfig.cs
index de7b8b85..3ba9eb55 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Config/GiftsConfig.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Config/GiftsConfig.cs
@@ -1,4 +1,5 @@
using System.Text.Json.Serialization;
+using SPTarkov.Server.Core.Models.Common;
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
using SPTarkov.Server.Core.Models.Eft.Profile;
using SPTarkov.Server.Core.Models.Enums;
@@ -39,7 +40,7 @@ public record Gift
/// Optional - supply a trader type to send from, not necessary when sending from SYSTEM or USER
///
[JsonPropertyName("trader")]
- public string? Trader { get; set; }
+ public MongoId? Trader { get; set; }
[JsonPropertyName("messageText")]
public string? MessageText { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Server/LocaleBase.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Server/LocaleBase.cs
index c407f26c..5a419c1e 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Server/LocaleBase.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Server/LocaleBase.cs
@@ -8,9 +8,11 @@ public record LocaleBase
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
- [JsonPropertyName("global")]
+ ///
/// DO NOT USE THIS PROPERTY DIRECTLY, USE LOCALESERVICE INSTEAD
/// THIS IS LAZY LOADED AND YOUR CHANGES WILL NOT BE SAVED
+ ///
+ [JsonPropertyName("global")]
public required Dictionary>> Global { get; set; }
[JsonPropertyName("menu")]
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Services/LootItem.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Services/LootItem.cs
index ed26b72d..649e6b61 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Services/LootItem.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Services/LootItem.cs
@@ -1,4 +1,5 @@
using System.Text.Json.Serialization;
+using SPTarkov.Server.Core.Models.Common;
namespace SPTarkov.Server.Core.Models.Spt.Services;
@@ -8,10 +9,10 @@ public record LootItem
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("id")]
- public string? Id { get; set; }
+ public MongoId? Id { get; set; }
[JsonPropertyName("tpl")]
- public string? Tpl { get; set; }
+ public MongoId? Tpl { get; set; }
[JsonPropertyName("isPreset")]
public bool? IsPreset { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Models/Trader/Traders.cs b/Libraries/SPTarkov.Server.Core/Models/Trader/Traders.cs
index 3d2a98b2..3cdfeb62 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Trader/Traders.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Trader/Traders.cs
@@ -6,7 +6,7 @@ using SPTarkov.Server.Core.Models.Enums;
namespace SPTarkov.Server.Core.Models;
[Injectable]
-public record Prapor() : ITrader
+public record Prapor : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -16,7 +16,7 @@ public record Prapor() : ITrader
}
[Injectable]
-public record Therapist() : ITrader
+public record Therapist : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -26,7 +26,7 @@ public record Therapist() : ITrader
}
[Injectable]
-public record Fence() : ITrader
+public record Fence : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -36,7 +36,7 @@ public record Fence() : ITrader
}
[Injectable]
-public record Skier() : ITrader
+public record Skier : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -46,7 +46,7 @@ public record Skier() : ITrader
}
[Injectable]
-public record Peacekeeper() : ITrader
+public record Peacekeeper : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -56,7 +56,7 @@ public record Peacekeeper() : ITrader
}
[Injectable]
-public record Mechanic() : ITrader
+public record Mechanic : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -66,7 +66,7 @@ public record Mechanic() : ITrader
}
[Injectable]
-public record Ragman() : ITrader
+public record Ragman : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -76,7 +76,7 @@ public record Ragman() : ITrader
}
[Injectable]
-public record Jaeger() : ITrader
+public record Jaeger : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -86,7 +86,7 @@ public record Jaeger() : ITrader
}
[Injectable]
-public record LighthouseKeeper() : ITrader
+public record LighthouseKeeper : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -96,7 +96,7 @@ public record LighthouseKeeper() : ITrader
}
[Injectable]
-public record Btr() : ITrader
+public record Btr : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
@@ -106,7 +106,7 @@ public record Btr() : ITrader
}
[Injectable]
-public record Ref() : ITrader
+public record Ref : ITrader
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
diff --git a/Libraries/SPTarkov.Server.Core/Services/BotEquipmentFilterService.cs b/Libraries/SPTarkov.Server.Core/Services/BotEquipmentFilterService.cs
index 4ad246c4..a86a78d5 100644
--- a/Libraries/SPTarkov.Server.Core/Services/BotEquipmentFilterService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/BotEquipmentFilterService.cs
@@ -451,7 +451,7 @@ public class BotEquipmentFilterService(
///
protected void AdjustWeighting(
AdjustmentDetails? weightingAdjustments,
- Dictionary> botItemPool,
+ Dictionary> botItemPool,
bool showEditWarnings = true
)
{
diff --git a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs
index ec51209b..41630b3f 100644
--- a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs
@@ -1244,7 +1244,7 @@ public class LocationLifecycleService(
protected void MergePmcAndScavEncyclopedias(PmcData primary, PmcData secondary)
{
var mergedDicts = primary
- .Encyclopedia?.Union(secondary.Encyclopedia)
+ .Encyclopedia?.UnionBy(secondary.Encyclopedia, kvp => kvp.Key)
.GroupBy(kvp => kvp.Key)
.ToDictionary(g => g.Key, g => g.Any(kvp => kvp.Value));
diff --git a/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs b/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs
index 79b6fe6b..37c24e35 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/Collections/ProbabilityObjectArray.cs
@@ -18,7 +18,6 @@ namespace SPTarkov.Server.Core.Utils.Collections;
/// // count the elements which should be distributed according to the relative probabilities
/// res.filter(x => x==="b").reduce((sum, x) => sum + 1 , 0)
///
-///
///
///
public class ProbabilityObjectArray : List>
diff --git a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
index c17369ae..ddbbda71 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/FileUtil.cs
@@ -3,7 +3,7 @@ using SPTarkov.DI.Annotations;
namespace SPTarkov.Server.Core.Utils;
[Injectable]
-public class FileUtil()
+public class FileUtil
{
protected const string _modBasePath = "user/mods/";
diff --git a/Libraries/SPTarkov.Server.Core/Utils/Logger/SptLoggerConfiguration.cs b/Libraries/SPTarkov.Server.Core/Utils/Logger/SptLoggerConfiguration.cs
index 9f2e3649..ac5affcd 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/Logger/SptLoggerConfiguration.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/Logger/SptLoggerConfiguration.cs
@@ -83,7 +83,7 @@ public class FileSptLoggerReference : BaseSptLoggerReference
[JsonPropertyName("filePattern")]
public string FilePattern { get; set; }
- private int _maxFileSizeMb;
+ private readonly int _maxFileSizeMb;
[JsonPropertyName("maxFileSizeMB")]
public int MaxFileSizeMb
@@ -99,7 +99,7 @@ public class FileSptLoggerReference : BaseSptLoggerReference
}
}
- private int _maxRollingFiles;
+ private readonly int _maxRollingFiles;
[JsonPropertyName("maxRollingFiles")]
public int MaxRollingFiles
diff --git a/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs b/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs
index 52b844f2..61e0efdc 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs
@@ -32,12 +32,12 @@ public class RagfairOfferHolder(
///
/// Offer Ids keyed by tpl
///
- private readonly ConcurrentDictionary> _offersByTemplate = new();
+ private readonly ConcurrentDictionary> _offersByTemplate = new();
///
/// Offer ids keyed by trader Id
///
- private readonly ConcurrentDictionary> _offersByTrader = new();
+ private readonly ConcurrentDictionary> _offersByTrader = new();
private readonly Lock _expiredOfferIdsLock = new();
private readonly Lock _ragfairOperationLock = new();
@@ -87,7 +87,7 @@ public class RagfairOfferHolder(
///
/// Id of trader to get offers for
/// RagfairOffer list
- public List GetOffersByTrader(string traderId)
+ public List GetOffersByTrader(MongoId traderId)
{
if (!_offersByTrader.TryGetValue(traderId, out var offerIds))
{
diff --git a/Tools/ItemTplGenerator/ItemTplGenerator.cs b/Tools/ItemTplGenerator/ItemTplGenerator.cs
index e7677ace..e0624ef8 100644
--- a/Tools/ItemTplGenerator/ItemTplGenerator.cs
+++ b/Tools/ItemTplGenerator/ItemTplGenerator.cs
@@ -170,7 +170,7 @@ public class ItemTplGenerator(
}
else
{
- var val = itemsObject.TryGetValue(itemKey, out var value) ? value : itemKey;
+ var val = itemsObject.GetValueOrDefault(itemKey, itemKey);
_logger.Error(
$"New itemOverride entry required: itemsObject already contains {itemKey} {val} => {item.Id}"
);