diff --git a/Libraries/SPTarkov.Server.Core/Extensions/ProfileExtensions.cs b/Libraries/SPTarkov.Server.Core/Extensions/ProfileExtensions.cs
index aa13561c..5b5525ad 100644
--- a/Libraries/SPTarkov.Server.Core/Extensions/ProfileExtensions.cs
+++ b/Libraries/SPTarkov.Server.Core/Extensions/ProfileExtensions.cs
@@ -171,5 +171,34 @@ namespace SPTarkov.Server.Core.Extensions
b.BanType == BanType.RagFair && currentTimestamp < b.DateTime
) ?? false;
}
+
+ ///
+ /// Calculates the current level of a player based on their accumulated experience points.
+ /// This method iterates through an experience table to determine the highest level achieved
+ /// by comparing the player's experience against cumulative thresholds.
+ ///
+ /// Player profile
+ /// Experience table from globals.json
+ ///
+ /// The calculated level of the player as an integer, or null if the level cannot be determined.
+ /// This value is also assigned to within the provided profile.
+ ///
+ public static int? CalculateLevel(this PmcData pmcData, ExpTable[] expTable)
+ {
+ var accExp = 0;
+ for (var i = 0; i < expTable.Length; i++)
+ {
+ accExp += expTable[i].Experience ?? 0;
+
+ if (pmcData.Info.Experience < accExp)
+ {
+ break;
+ }
+
+ pmcData.Info.Level = i + 1;
+ }
+
+ return pmcData.Info.Level;
+ }
}
}
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs
index 37535025..fbeacd7c 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/RewardHelper.cs
@@ -1,4 +1,5 @@
using SPTarkov.DI.Annotations;
+using SPTarkov.Server.Core.Extensions;
using SPTarkov.Server.Core.Models.Eft.Common;
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
using SPTarkov.Server.Core.Models.Eft.Hideout;
@@ -81,7 +82,9 @@ public class RewardHelper(
int.Parse(reward.Value.ToString())
); // this must occur first as the output object needs to take the modified profile exp value
// Recalculate level in event player leveled up
- pmcProfile.Info.Level = _playerService.CalculateLevel(pmcProfile);
+ pmcProfile.Info.Level = pmcProfile.CalculateLevel(
+ _databaseService.GetGlobals().Configuration.Exp.Level.ExperienceTable
+ );
break;
case RewardType.TraderStanding:
_traderHelper.AddStandingToTrader(sessionId, reward.Target, reward.Value.Value);
diff --git a/Libraries/SPTarkov.Server.Core/Helpers/TraderHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/TraderHelper.cs
index 12a94c81..9d4a5899 100644
--- a/Libraries/SPTarkov.Server.Core/Helpers/TraderHelper.cs
+++ b/Libraries/SPTarkov.Server.Core/Helpers/TraderHelper.cs
@@ -336,7 +336,9 @@ public class TraderHelper(
var loyaltyLevels = _databaseService.GetTrader(traderID).Base.LoyaltyLevels;
// Level up player
- pmcData.Info.Level = _playerService.CalculateLevel(pmcData);
+ pmcData.Info.Level = pmcData.CalculateLevel(
+ _databaseService.GetGlobals().Configuration.Exp.Level.ExperienceTable
+ );
// Level up traders
var targetLevel = 0;
diff --git a/Libraries/SPTarkov.Server.Core/Services/PlayerService.cs b/Libraries/SPTarkov.Server.Core/Services/PlayerService.cs
deleted file mode 100644
index dd187fbc..00000000
--- a/Libraries/SPTarkov.Server.Core/Services/PlayerService.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using SPTarkov.DI.Annotations;
-using SPTarkov.Server.Core.Models.Eft.Common;
-
-namespace SPTarkov.Server.Core.Services;
-
-[Injectable(InjectionType.Singleton)]
-public class PlayerService(DatabaseService _databaseService)
-{
- ///
- /// Calculates the current level of a player based on their accumulated experience points.
- /// This method iterates through an experience table to determine the highest level achieved
- /// by comparing the player's experience against cumulative thresholds.
- ///
- /// Player profile
- ///
- /// The calculated level of the player as an integer, or null if the level cannot be determined.
- /// This value is also assigned to within the provided profile.
- ///
- public int? CalculateLevel(PmcData pmcData)
- {
- var accExp = 0;
-
- var expTable = _databaseService.GetGlobals().Configuration.Exp.Level.ExperienceTable;
- for (var i = 0; i < expTable.Length; i++)
- {
- accExp += expTable[i].Experience ?? 0;
-
- if (pmcData.Info.Experience < accExp)
- {
- break;
- }
-
- pmcData.Info.Level = i + 1;
- }
-
- return pmcData.Info.Level;
- }
-}
diff --git a/Libraries/SPTarkov.Server.Core/Services/TraderPurchasePersisterService.cs b/Libraries/SPTarkov.Server.Core/Services/TraderPurchasePersisterService.cs
index 780c5c89..2073180e 100644
--- a/Libraries/SPTarkov.Server.Core/Services/TraderPurchasePersisterService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/TraderPurchasePersisterService.cs
@@ -33,17 +33,7 @@ public class TraderPurchasePersisterService(
{
var profile = _profileHelper.GetFullProfile(sessionId);
- if (profile.TraderPurchases is null)
- {
- return null;
- }
-
- if (profile.TraderPurchases.ContainsKey(traderId))
- {
- return profile.TraderPurchases[traderId];
- }
-
- return null;
+ return profile?.TraderPurchases?.GetValueOrDefault(traderId);
}
///
@@ -97,7 +87,7 @@ public class TraderPurchasePersisterService(
continue;
}
- // Skip if no trader-speicifc purchases
+ // Skip if no trader-specific purchases
if (!profile.Value.TraderPurchases.TryGetValue(traderId, out _))
{
continue;