0
0
mirror of https://github.com/sp-tarkov/modules.git synced 2025-02-13 09:50:43 -05:00
modules/project/Aki.SinglePlayer/Patches/Healing/HealthControllerPatch.cs
2023-03-03 18:52:31 +00:00

56 lines
2.2 KiB
C#

using Aki.Reflection.Patching;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace Aki.SinglePlayer.Patches.Healing
{
/// <summary>
/// HealthController used by post-raid heal screen and health listenen class are different, this patch
/// ensures effects (fracture/bleeding) on body parts stay in sync
/// </summary>
public class HealthControllerPatch : ModulePatch
{
protected override MethodBase GetTargetMethod()
{
return typeof(HealthControllerClass).GetMethod("ApplyTreatment", BindingFlags.Public | BindingFlags.Instance);
}
[PatchPrefix]
private static void PatchPrefix(object healthObserver)
{
var property = healthObserver.GetType().GetProperty("Effects");
if (property != null)
{
var effects = property.GetValue(healthObserver);
if (effects != null && effects.GetType().GetGenericTypeDefinition() == typeof(List<>))
{
var parsedEffects = ((IList)effects).Cast<object>().ToList();
parsedEffects.ForEach(effect =>
{
var parsedEffect = effect as IEffect;
try
{
// I tried using reflections to raise the event, I also tried replacing the effect
// health controller using reflections but they are different types than the one the actual
// player class uses so it cant be replaced.
// Unfortunately, the easiest way to deal with this is just manually triggering the HealthListener method
Utils.Healing.HealthListener.Instance.OnEffectRemovedEvent(parsedEffect);
}
catch (Exception ex)
{
Logger.LogError($"Exception!\n{ex.Message}\n{ex.StackTrace}");
}
});
}
}
else
{
Logger.LogDebug("No effects found to heal on the observer!");
}
}
}
}