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

80 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using SPT.Reflection.Patching;
using SPT.Reflection.Utils;
using HarmonyLib;
namespace SPT.Core.Patches
{
public class TransportPrefixPatch : ModulePatch
{
public TransportPrefixPatch()
{
try
{
var type = PatchConstants.EftTypes.SingleOrDefault(t => t.GetField("TransportPrefixes") != null);
if (type == null)
{
throw new Exception($"{nameof(TransportPrefixPatch)} failed: Could not find type to patch.");
}
var value = Traverse.Create(type).Field("TransportPrefixes").GetValue<Dictionary<ETransportProtocolType, string>>();
value[ETransportProtocolType.HTTPS] = "http://";
value[ETransportProtocolType.WSS] = "ws://";
}
catch (Exception ex)
{
Logger.LogError($"{nameof(TransportPrefixPatch)}: {ex}");
throw;
}
}
protected override MethodBase GetTargetMethod()
{
return PatchConstants.EftTypes.SingleCustom(t => t.GetMethods().Any(m => m.Name == "CreateFromLegacyParams"))
.GetMethod("CreateFromLegacyParams", BindingFlags.Static | BindingFlags.Public);
}
[PatchPrefix]
private static bool PatchPrefix(ref LegacyParamsStruct legacyParams)
{
legacyParams.Url = legacyParams.Url
.Replace("https://", "")
.Replace("http://", "");
return true; // do original method after
}
[PatchTranspiler]
private static IEnumerable<CodeInstruction> PatchTranspile(ILGenerator generator, IEnumerable<CodeInstruction> instructions)
{
var codes = new List<CodeInstruction>(instructions);
var searchCode = new CodeInstruction(OpCodes.Ldstr, "https://");
var searchIndex = -1;
for (var i = 0; i < codes.Count; i++)
{
if (codes[i].opcode == searchCode.opcode && codes[i].operand == searchCode.operand)
{
searchIndex = i;
break;
}
}
if (searchIndex == -1)
{
Logger.LogError($"{nameof(TransportPrefixPatch)} failed: Could not find reference code.");
return instructions;
}
codes[searchIndex] = new CodeInstruction(OpCodes.Ldstr, "http://");
return codes.AsEnumerable();
}
}
}