0
0
mirror of https://github.com/sp-tarkov/modules.git synced 2025-02-13 07:50:46 -05:00
modules/project/SPT.Custom/Patches/SetLocationIdOnRaidStartPatch.cs
2024-05-21 19:10:17 +01:00

69 lines
2.4 KiB
C#

using SPT.Reflection.Patching;
using SPT.Reflection.Utils;
using EFT;
using System.Linq;
using System.Reflection;
using Comfort.Common;
using System;
using static LocationSettingsClass;
namespace SPT.Custom.Patches
{
/// <summary>
/// Local games do not set the locationId property like a network game does, `LocationId` is used by various bsg systems
/// e.g. btr/lightkeeper services
/// </summary>
public class SetLocationIdOnRaidStartPatch : ModulePatch
{
private static PropertyInfo _locationProperty;
protected override MethodBase GetTargetMethod()
{
Type localGameBaseType = PatchConstants.LocalGameType.BaseType;
// At this point, gameWorld.MainPlayer isn't set, so we need to use the LocalGame's `Location_0` property
_locationProperty = localGameBaseType.GetProperties(PatchConstants.PublicDeclaredFlags)
.SingleCustom(x => x.PropertyType == typeof(Location));
// Find the TimeAndWeatherSettings handling method
var desiredMethod = localGameBaseType.GetMethods(PatchConstants.PublicDeclaredFlags).SingleOrDefault(IsTargetMethod);
Logger.LogDebug($"{GetType().Name} Type: {localGameBaseType?.Name}");
Logger.LogDebug($"{GetType().Name} Method: {desiredMethod?.Name}");
return desiredMethod;
}
private static bool IsTargetMethod(MethodInfo mi)
{
// Find method_3(TimeAndWeatherSettings timeAndWeather)
var parameters = mi.GetParameters();
return (parameters.Length == 1 && parameters[0].ParameterType == typeof(TimeAndWeatherSettings));
}
[PatchPostfix]
private static void PatchPostfix(AbstractGame __instance)
{
var gameWorld = Singleton<GameWorld>.Instance;
// EFT.HideoutGame is an internal class, so we can't do static type checking :(
if (__instance.GetType().Name.Contains("HideoutGame"))
{
return;
}
Location location = _locationProperty.GetValue(__instance) as Location;
if (location == null)
{
Logger.LogError($"[SetLocationId] Failed to get location data");
return;
}
gameWorld.LocationId = location.Id;
Logger.LogDebug($"[SetLocationId] Set locationId to: {location.Id}");
}
}
}