diff --git a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs
index eece18bd..809259f6 100644
--- a/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/LocationLifecycleService.cs
@@ -660,34 +660,41 @@ public class LocationLifecycleService
EndLocalRaidRequestData request)
{
var postRaidProfile = request.Results.Profile;
+
if (isTransfer || request.Results.Result == ExitStatus.RUNNER)
{
+ // Transfer over hp and effects - not necessary for runthroughs, but it causes no issues
+ scavProfile.Health = postRaidProfile.Health;
+
+ // Apply minor healing to limb hp and effects
+ ResetLimbHpMidTransit(scavProfile.Health);
+
// We want scav inventory to persist into next raid when pscav is moving between maps
- // May have been run through, set gear to non-FiR
+ // Also adjust FiR status when exit was runthrough
_inRaidHelper.SetInventory(sessionId, scavProfile, postRaidProfile, isSurvived, isTransfer);
}
- scavProfile.Info.Level = request.Results.Profile.Info.Level;
- scavProfile.Skills = request.Results.Profile.Skills;
- scavProfile.Stats = request.Results.Profile.Stats;
- scavProfile.Encyclopedia = request.Results.Profile.Encyclopedia;
- scavProfile.TaskConditionCounters = request.Results.Profile.TaskConditionCounters;
- scavProfile.SurvivorClass = request.Results.Profile.SurvivorClass;
+ scavProfile.Info.Level = postRaidProfile.Info.Level;
+ scavProfile.Skills = postRaidProfile.Skills;
+ scavProfile.Stats = postRaidProfile.Stats;
+ scavProfile.Encyclopedia = postRaidProfile.Encyclopedia;
+ scavProfile.TaskConditionCounters = postRaidProfile.TaskConditionCounters;
+ scavProfile.SurvivorClass = postRaidProfile.SurvivorClass;
// Scavs don't have achievements, but copy anyway
- scavProfile.Achievements = request.Results.Profile.Achievements;
+ scavProfile.Achievements = postRaidProfile.Achievements;
- scavProfile.Info.Experience = request.Results.Profile.Info.Experience;
+ scavProfile.Info.Experience = postRaidProfile.Info.Experience;
// Must occur after experience is set and stats copied over
scavProfile.Stats.Eft.TotalSessionExperience = 0;
- ApplyTraderStandingAdjustments(scavProfile.TradersInfo, request.Results.Profile.TradersInfo);
+ ApplyTraderStandingAdjustments(scavProfile.TradersInfo, postRaidProfile.TradersInfo);
// Clamp fence standing within -7 to 15 range
var fenceMax = _traderConfig.Fence.PlayerRepMax; // 15
var fenceMin = _traderConfig.Fence.PlayerRepMin; //-7
- if (!request.Results.Profile.TradersInfo.TryGetValue(Traders.FENCE, out var postRaidFenceData))
+ if (!postRaidProfile.TradersInfo.TryGetValue(Traders.FENCE, out var postRaidFenceData))
{
_logger.Error($"post raid fence data not found for: {sessionId}");
}
@@ -768,6 +775,28 @@ public class LocationLifecycleService
}
}
+ ///
+ /// Slightly fix broken limbs and remove effects
+ ///
+ /// Profile health data to adjust
+ protected void ResetLimbHpMidTransit(BotBaseHealth? profileHealth)
+ {
+ foreach (var (limbId, hpValues) in profileHealth.BodyParts)
+ {
+ if (hpValues.Health.Minimum <= 0)
+ {
+ // Limb has been destroyed, reset to 30% TODO: Expose 30% in config
+ hpValues.Health.Current = _randomUtil.GetPercentOfValue(30, hpValues.Health.Maximum.Value);
+ }
+
+ // Limb has effects, remove them all
+ if (hpValues.Effects.Count > 0)
+ {
+ hpValues.Effects.Clear();
+ }
+ }
+ }
+
///
/// Does the provided profile contain any condition counters
///