Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of GrenadeTurret v1.0.0
GrenadeTurret.dll
Decompiled 2 years agousing System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using GrenadeTurret.Patches; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("GrenadeTurret")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("GrenadeTurret")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("63f51f95-93ff-4c35-8370-a0a372261158")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace GrenadeTurret { [BepInPlugin("f0ur3y3s.GrenadeTurret", "GrenadeTurret", "1.0.0")] public class GrenadeTurretBase : BaseUnityPlugin { private const string modGUID = "f0ur3y3s.GrenadeTurret"; private const string modName = "GrenadeTurret"; private const string modVersion = "1.0.0"; private readonly Harmony harmony = new Harmony("f0ur3y3s.GrenadeTurret"); private static GrenadeTurretBase Instance; private static ManualLogSource logger; internal static ManualLogSource GetLogger() { return logger; } private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } logger = Logger.CreateLogSource("GrenadeTurret"); logger.LogInfo((object)"GrenadeTurret Loaded!"); logger.LogInfo((object)"Patching GrenadeTurretBase"); harmony.PatchAll(typeof(GrenadeTurretBase)); logger.LogInfo((object)"Patching GrenadeTurretPatch"); harmony.PatchAll(typeof(GrenadeTurretPatch)); } } } namespace GrenadeTurret.Patches { internal class GrenadeTurretPatch { private static readonly OpCode[] DamageOpcodes = new OpCode[11] { OpCodes.Ldfld, OpCodes.Ldc_I4_S, OpCodes.Ldc_I4_1, OpCodes.Ldc_I4_1, OpCodes.Ldc_I4_7, OpCodes.Ldc_I4_0, OpCodes.Ldc_I4_0, OpCodes.Ldloca_S, OpCodes.Initobj, OpCodes.Ldloc_3, OpCodes.Callvirt }; internal static GameObject mapPropsContainer; internal static SpawnableMapObject turretSMO; [HarmonyPatch(typeof(Turret), "Update")] [HarmonyPostfix] private static void UpdatePatch(Turret __instance) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Invalid comparison between Unknown and I4 //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) FieldInfo field = typeof(Turret).GetField("turretInterval", BindingFlags.Instance | BindingFlags.NonPublic); float num = (float)field.GetValue(__instance); if ((int)__instance.turretMode == 2 && 0f == num) { GrenadeTurretBase.GetLogger().LogInfo((object)"Turret is firing!!!"); Vector3 position = __instance.aimPoint.position; Vector3 forward = __instance.aimPoint.forward; float num2 = 50f; Ray val = default(Ray); ((Ray)(ref val))..ctor(position, forward); RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, ref val2, num2, StartOfRound.Instance.collidersAndRoomMaskAndDefault)) { ManualLogSource logger = GrenadeTurretBase.GetLogger(); Vector3 point = ((RaycastHit)(ref val2)).point; logger.LogInfo((object)("Turret bullet hit at " + ((object)(Vector3)(ref point)).ToString())); GrenadeTurretBase.GetLogger().LogInfo((object)("Turret bullet hit on " + ((Object)((Component)((RaycastHit)(ref val2)).collider).gameObject).name)); GrenadeTurretBase.GetLogger().LogInfo((object)("Turret bullet hit on " + ((Component)((RaycastHit)(ref val2)).collider).gameObject.tag)); GrenadeTurretBase.GetLogger().LogInfo((object)("Turret bullet hit on " + ((Component)((RaycastHit)(ref val2)).collider).gameObject.layer)); Vector3 point2 = ((RaycastHit)(ref val2)).point; Landmine.SpawnExplosion(point2 + Vector3.up, true, 5.7f, 6.4f); GrenadeTurretBase.GetLogger().LogInfo((object)"Spawning explosion"); } } } private static bool IsOpcodesMatch(List<CodeInstruction> instructions, OpCode[] expectedOpcodes, int startIndex) { for (int i = 0; i < 11; i++) { if (instructions[startIndex + i].opcode != expectedOpcodes[i]) { return false; } } GrenadeTurretBase.GetLogger().LogInfo((object)"Found a nopper"); return true; } private static bool IsCallGNMGetInstance(List<CodeInstruction> instructions, int index) { if (instructions[index].opcode == OpCodes.Call && instructions[index].operand is MethodInfo methodInfo && methodInfo.DeclaringType == typeof(GameNetworkManager) && methodInfo.Name == "get_Instance") { return true; } return false; } [HarmonyPatch(typeof(Turret), "Update")] private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = instructions.ToList(); for (int i = 0; i < list.Count; i++) { if (IsCallGNMGetInstance(list, i) && IsOpcodesMatch(list, DamageOpcodes, i + 1)) { for (int j = 0; j < 12; j++) { list[i + j].opcode = OpCodes.Nop; GrenadeTurretBase.GetLogger().LogInfo((object)"Nopped"); } } } return list.AsEnumerable(); } [HarmonyPatch(typeof(RoundManager), "SpawnMapObjects")] [HarmonyPostfix] private static void RoundManagerPatch(ref RoundManager __instance) { mapPropsContainer = GameObject.FindGameObjectWithTag("MapPropsContainer"); SpawnableMapObject[] spawnableMapObjects = __instance.currentLevel.spawnableMapObjects; foreach (SpawnableMapObject val in spawnableMapObjects) { if (!((Object)(object)val.prefabToSpawn.GetComponentInChildren<Turret>() == (Object)null)) { turretSMO = val; if (turretSMO == null) { GrenadeTurretBase.GetLogger().LogInfo((object)"Turret map object is null"); } GrenadeTurretBase.GetLogger().LogInfo((object)"Turret map object found"); } } } } }