mirror of
https://github.com/sp-tarkov/modules.git
synced 2025-02-13 09:50:43 -05:00
58 lines
2.0 KiB
C#
58 lines
2.0 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Reflection.Emit;
|
|
using Aki.Reflection.CodeWrapper;
|
|
using Aki.Reflection.Patching;
|
|
using HarmonyLib;
|
|
using UnityEngine;
|
|
|
|
namespace Aki.SinglePlayer.Patches.RaidFix
|
|
{
|
|
/// <summary>
|
|
/// Fixes an issue with smoke grenades not playing the fuse popping sound when thrown
|
|
/// </summary>
|
|
public class SmokeGrenadeFuseSoundFixPatch : ModulePatch
|
|
{
|
|
protected override MethodBase GetTargetMethod()
|
|
{
|
|
return typeof(GrenadeEmission).GetMethod(nameof(GrenadeEmission.StartEmission));
|
|
}
|
|
|
|
[PatchTranspiler]
|
|
private static IEnumerable<CodeInstruction> PatchTranspile(IEnumerable<CodeInstruction> instructions)
|
|
{
|
|
var codes = new List<CodeInstruction>(instructions);
|
|
var searchCode = new CodeInstruction(OpCodes.Callvirt, AccessTools.Method(typeof(AudioClip), "get_length"));
|
|
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(SmokeGrenadeFuseSoundFixPatch)} failed: Could not find reference code.");
|
|
return instructions;
|
|
}
|
|
|
|
var newCodes = CodeGenerator.GenerateInstructions(new List<Code>
|
|
{
|
|
new Code(OpCodes.Ldarg_0),
|
|
new Code(OpCodes.Ldfld, typeof(GrenadeEmission), "betterSource_0"),
|
|
new Code(OpCodes.Ldfld, typeof(BetterSource), "source1"),
|
|
new Code(OpCodes.Callvirt, typeof(AudioSource), "Play")
|
|
});
|
|
|
|
searchIndex -= 4;
|
|
|
|
codes.InsertRange(searchIndex, newCodes);
|
|
return codes.AsEnumerable();
|
|
}
|
|
}
|
|
} |