using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; 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("InfiniteMeleeDurability")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("InfiniteMeleeDurability")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("4f88c25b-eb0e-45d6-a4b0-2dd6ca434af3")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace InfiniteMeleeDurability; [BepInPlugin("repo.matrock.infinitemeleedurability", "Infinite Melee Durability", "3.4.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class InfiniteMeleeDurabilityMod : BaseUnityPlugin { private static FieldInfo itemBatteryField; private static FieldInfo batteryLifeField; private static FieldInfo autoDrainField; public static ConfigEntry ModEnabled { get; private set; } public static ConfigEntry ProtectFryingPan { get; private set; } public static ConfigEntry ProtectBaseballBat { get; private set; } public static ConfigEntry ProtectSword { get; private set; } public static ConfigEntry ProtectSledgeHammer { get; private set; } public static ConfigEntry ProtectInflatableHammer { get; private set; } public static ConfigEntry ProtectProdzap { get; private set; } public static ConfigEntry ProtectAllOther { get; private set; } private void Awake() { //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Expected O, but got Unknown ((BaseUnityPlugin)this).Logger.LogInfo((object)"========================================"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Infinite Melee Durability LOADED! v3.4"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"========================================"); ModEnabled = ((BaseUnityPlugin)this).Config.Bind("General", "Mod Enabled", true, "Включить/выключить мод"); ProtectFryingPan = ((BaseUnityPlugin)this).Config.Bind("Weapons", "Protect Frying Pan", true, "Сковородка"); ProtectBaseballBat = ((BaseUnityPlugin)this).Config.Bind("Weapons", "Protect Baseball Bat", true, "Бейсбольная бита"); ProtectSword = ((BaseUnityPlugin)this).Config.Bind("Weapons", "Protect Sword", true, "Меч"); ProtectSledgeHammer = ((BaseUnityPlugin)this).Config.Bind("Weapons", "Protect Sledge Hammer", true, "Кувалда"); ProtectInflatableHammer = ((BaseUnityPlugin)this).Config.Bind("Weapons", "Protect Inflatable Hammer", true, "Надувной молоток"); ProtectProdzap = ((BaseUnityPlugin)this).Config.Bind("Weapons", "Protect Prodzap", true, "Электрошокер"); ProtectAllOther = ((BaseUnityPlugin)this).Config.Bind("Weapons", "Protect All Other", true, "Все остальные"); FindFields(); Harmony val = new Harmony("repo.matrock.infinitemeleedurability"); val.PatchAll(); } private void FindFields() { BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; itemBatteryField = typeof(ItemMelee).GetField("itemBattery", bindingAttr); if (itemBatteryField != null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"Found ItemMelee.itemBattery field"); } else { ((BaseUnityPlugin)this).Logger.LogError((object)"Could not find ItemMelee.itemBattery field!"); } batteryLifeField = typeof(ItemBattery).GetField("batteryLife", bindingAttr); if (batteryLifeField != null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"Found ItemBattery.batteryLife field"); } else { ((BaseUnityPlugin)this).Logger.LogError((object)"Could not find ItemBattery.batteryLife field!"); } autoDrainField = typeof(ItemBattery).GetField("autoDrain", bindingAttr); if (autoDrainField != null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"Found ItemBattery.autoDrain field"); } } public static bool ShouldProtectItem(ItemMelee item) { if ((Object)(object)item == (Object)null) { return false; } if (!ModEnabled.Value) { return false; } string text = ((Object)item).name.ToLower(); if (text.Contains("fryingpan") || text.Contains("frying pan") || text.Contains("pan")) { return ProtectFryingPan.Value; } if (text.Contains("baseballbat") || text.Contains("baseball bat") || text.Contains("bat")) { return ProtectBaseballBat.Value; } if (text.Contains("sword")) { return ProtectSword.Value; } if (text.Contains("sledgehammer") || text.Contains("sledge hammer") || text.Contains("sledge")) { return ProtectSledgeHammer.Value; } if (text.Contains("inflatablehammer") || text.Contains("inflatable hammer") || text.Contains("hammer")) { return ProtectInflatableHammer.Value; } if (text.Contains("prodzap") || text.Contains("zap") || text.Contains("stun") || text.Contains("shock")) { return ProtectProdzap.Value; } return ProtectAllOther.Value; } public static void RestoreBatteryCharge(ItemMelee item) { if ((Object)(object)item == (Object)null || !ShouldProtectItem(item) || itemBatteryField == null || batteryLifeField == null) { return; } try { object? value = itemBatteryField.GetValue(item); ItemBattery val = (ItemBattery)((value is ItemBattery) ? value : null); if ((Object)(object)val != (Object)null) { batteryLifeField.SetValue(val, 1f); if (autoDrainField != null) { autoDrainField.SetValue(val, false); } } } catch (Exception ex) { Debug.LogError((object)("[InfiniteDurability] Error: " + ex.Message)); } } } [HarmonyPatch(typeof(ItemMelee), "SwingHitRPC")] public class Patch_SwingHitRPC { private static void Prefix(ItemMelee __instance) { InfiniteMeleeDurabilityMod.RestoreBatteryCharge(__instance); } } [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "BreakRPC")] public class Patch_BreakRPC { private static bool Prefix(PhysGrabObjectImpactDetector __instance) { ItemMelee component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null && InfiniteMeleeDurabilityMod.ShouldProtectItem(component)) { InfiniteMeleeDurabilityMod.RestoreBatteryCharge(component); return false; } return true; } } [HarmonyPatch(typeof(ItemMelee), "Update")] public class Patch_Update { private static void Postfix(ItemMelee __instance) { if ((Object)(object)__instance != (Object)null && InfiniteMeleeDurabilityMod.ShouldProtectItem(__instance)) { InfiniteMeleeDurabilityMod.RestoreBatteryCharge(__instance); } } }