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 AdvanceGunMod v1.0.0
AdvanceGunMod.dll
Decompiled a day agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using AdvanceGunMod.Patches; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("AdvanceGunMod")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("AdvanceGunMod")] [assembly: AssemblyTitle("AdvanceGunMod")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace AdvanceGunMod { public class ModConfig { public ConfigEntry<bool> Enabled; public ConfigEntry<bool> InfiniteAmmoEnabled; public ConfigEntry<bool> FireRateEnabled; public ConfigEntry<float> FireRateMultiplier; public ConfigEntry<bool> RangeEnabled; public ConfigEntry<float> RangeMultiplier; public ConfigEntry<bool> RecoilEnabled; public ConfigEntry<bool> CameraShakeEnabled; public ConfigEntry<bool> MuzzleFlashEnabled; public ConfigEntry<bool> BulletTrailEnabled; public ConfigEntry<bool> BulletHitEffectEnabled; public ConfigEntry<bool> AutoFireEnabled; public ModConfig(ConfigFile cfg) { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Expected O, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown Enabled = cfg.Bind<bool>("General", "Enabled", true, "เป\u0e34ด/ป\u0e34ด mod ท\u0e31\u0e49งหมด (true = เป\u0e34ด, false = ป\u0e34ด)"); InfiniteAmmoEnabled = cfg.Bind<bool>("InfiniteAmmo", "InfiniteAmmoEnabled", true, "เป\u0e34ด/ป\u0e34ด กระส\u0e38นไม\u0e48จำก\u0e31ด\nใช\u0e49ได\u0e49: host ต\u0e34ด mod — เพ\u0e37\u0e48อนได\u0e49ร\u0e31บผลด\u0e49วยโดยไม\u0e48ต\u0e49องต\u0e34ด mod"); FireRateEnabled = cfg.Bind<bool>("FireRate", "FireRateEnabled", true, "เป\u0e34ด/ป\u0e34ด ปร\u0e31บ fire rate\nใช\u0e49ได\u0e49: host ต\u0e34ด mod — เพ\u0e37\u0e48อนได\u0e49ร\u0e31บผลด\u0e49วยโดยไม\u0e48ต\u0e49องต\u0e34ด mod"); FireRateMultiplier = cfg.Bind<float>("FireRate", "FireRateMultiplier", 1f, new ConfigDescription("หาร shootCooldown ด\u0e49วยค\u0e48าน\u0e35\u0e49 — ย\u0e34\u0e48งมาก = ย\u0e34งเร\u0e47วข\u0e36\u0e49น (default: 1.0 = ค\u0e48าปกต\u0e34, 2.0 = เร\u0e47วข\u0e36\u0e49น 2x, 30.0 = เร\u0e47วข\u0e36\u0e49น 30x)\nใช\u0e49ได\u0e49: host ต\u0e34ด mod — เพ\u0e37\u0e48อนได\u0e49ร\u0e31บผลด\u0e49วยโดยไม\u0e48ต\u0e49องต\u0e34ด mod", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 30f), Array.Empty<object>())); RangeEnabled = cfg.Bind<bool>("Range", "RangeEnabled", true, "เป\u0e34ด/ป\u0e34ด ปร\u0e31บ range\nใช\u0e49ได\u0e49: host ต\u0e34ด mod — เพ\u0e37\u0e48อนได\u0e49ร\u0e31บผลด\u0e49วยโดยไม\u0e48ต\u0e49องต\u0e34ด mod"); RangeMultiplier = cfg.Bind<float>("Range", "RangeMultiplier", 1f, new ConfigDescription("ค\u0e39ณ gunRange ด\u0e49วยค\u0e48าน\u0e35\u0e49 — มากกว\u0e48า 1 = ระยะไกลข\u0e36\u0e49น (default: 1.0 = ค\u0e48าปกต\u0e34)\nใช\u0e49ได\u0e49: host ต\u0e34ด mod — เพ\u0e37\u0e48อนได\u0e49ร\u0e31บผลด\u0e49วยโดยไม\u0e48ต\u0e49องต\u0e34ด mod", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 30f), Array.Empty<object>())); RecoilEnabled = cfg.Bind<bool>("Effects", "RecoilEnabled", true, "เป\u0e34ด/ป\u0e34ด แรงด\u0e35ดกล\u0e31บของป\u0e37น (true = ม\u0e35 recoil, false = ไม\u0e48ม\u0e35)\nใช\u0e49ได\u0e49: host ต\u0e34ด mod — เพ\u0e37\u0e48อนได\u0e49ร\u0e31บผลด\u0e49วยโดยไม\u0e48ต\u0e49องต\u0e34ด mod"); CameraShakeEnabled = cfg.Bind<bool>("Effects", "CameraShakeEnabled", true, "เป\u0e34ด/ป\u0e34ด camera shake ท\u0e31\u0e49งหมด (จากป\u0e37น, ของแตก, ระเบ\u0e34ด ฯลฯ)\nใช\u0e49ได\u0e49: เฉพาะคนท\u0e35\u0e48ต\u0e34ด mod เท\u0e48าน\u0e31\u0e49น — ต\u0e49องต\u0e34ด mod เองถ\u0e36งจะป\u0e34ด shake ของต\u0e31วเองได\u0e49"); MuzzleFlashEnabled = cfg.Bind<bool>("Effects", "MuzzleFlashEnabled", true, "เป\u0e34ด/ป\u0e34ด muzzle flash (smoke/sparks/light ท\u0e35\u0e48ปากกระบอกป\u0e37น)\nใช\u0e49ได\u0e49: เฉพาะคนท\u0e35\u0e48ต\u0e34ด mod เท\u0e48าน\u0e31\u0e49น"); BulletTrailEnabled = cfg.Bind<bool>("Effects", "BulletTrailEnabled", true, "เป\u0e34ด/ป\u0e34ด เส\u0e49น trail ของกระส\u0e38น\nใช\u0e49ได\u0e49: เฉพาะคนท\u0e35\u0e48ต\u0e34ด mod เท\u0e48าน\u0e31\u0e49น"); BulletHitEffectEnabled = cfg.Bind<bool>("Effects", "BulletHitEffectEnabled", true, "เป\u0e34ด/ป\u0e34ด particle effect ตอนกระส\u0e38นโดนเป\u0e49า\nใช\u0e49ได\u0e49: เฉพาะคนท\u0e35\u0e48ต\u0e34ด mod เท\u0e48าน\u0e31\u0e49น"); AutoFireEnabled = cfg.Bind<bool>("AutoFire", "AutoFireEnabled", false, "เป\u0e34ด/ป\u0e34ด กดค\u0e49าง E แล\u0e49วย\u0e34งต\u0e48อเน\u0e37\u0e48อง (true = กดค\u0e49างย\u0e34งร\u0e31ว, false = ต\u0e49องกดท\u0e35ละคร\u0e31\u0e49ง)\nใช\u0e49ได\u0e49: เฉพาะคนท\u0e35\u0e48ต\u0e34ด mod เท\u0e48าน\u0e31\u0e49น"); } } [BepInPlugin("com.yourname.advancegunmod", "AdvanceGunMod", "1.0.0")] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Log; internal static ModConfig Cfg; private readonly Harmony _harmony = new Harmony("com.yourname.advancegunmod"); private void Awake() { Log = ((BaseUnityPlugin)this).Logger; Cfg = new ModConfig(((BaseUnityPlugin)this).Config); Cfg.FireRateEnabled.SettingChanged += delegate { ReapplyAll(); }; Cfg.FireRateMultiplier.SettingChanged += delegate { ReapplyAll(); }; Cfg.RangeEnabled.SettingChanged += delegate { ReapplyAll(); }; Cfg.RangeMultiplier.SettingChanged += delegate { ReapplyAll(); }; _harmony.PatchAll(); Log.LogInfo((object)"AdvanceGunMod loaded!"); Log.LogInfo((object)$"Enabled={Cfg.Enabled.Value}"); } private static void ReapplyAll() { ItemGun[] array = Object.FindObjectsOfType<ItemGun>(); ItemGun[] array2 = array; foreach (ItemGun gun in array2) { ItemGunStartPatch.Apply(gun); } Log.LogInfo((object)$"[AdvanceGunMod] ReapplyAll: {array.Length} guns updated."); } } } namespace AdvanceGunMod.Patches { internal static class BatteryHelper { private static readonly FieldInfo _lifeInt = AccessTools.Field(typeof(ItemBattery), "batteryLifeInt"); private static readonly FieldInfo _life = AccessTools.Field(typeof(ItemBattery), "batteryLife"); public static int GetLifeInt(ItemBattery b) { return (int)_lifeInt.GetValue(b); } public static void SetLifeInt(ItemBattery b, int v) { _lifeInt.SetValue(b, v); } public static float GetLife(ItemBattery b) { return (float)_life.GetValue(b); } public static void SetLife(ItemBattery b, float v) { _life.SetValue(b, v); } public static void Refill(ItemBattery b) { int num = (int)AccessTools.Field(typeof(ItemBattery), "batteryBars").GetValue(b); if (num <= 0) { num = 6; } SetLifeInt(b, num); SetLife(b, 100f); } } [HarmonyPatch(typeof(ItemGun), "Shoot")] public static class ItemGunShootPatch { public static bool Prefix(ItemGun __instance) { if (!Plugin.Cfg.Enabled.Value) { return true; } if (!Plugin.Cfg.InfiniteAmmoEnabled.Value) { return true; } object? value = AccessTools.Field(typeof(ItemGun), "itemBattery").GetValue(__instance); ItemBattery val = (ItemBattery)((value is ItemBattery) ? value : null); if ((Object)(object)val != (Object)null) { BatteryHelper.Refill(val); } return true; } public static void Postfix(ItemGun __instance, bool __result) { if (Plugin.Cfg.Enabled.Value && Plugin.Cfg.InfiniteAmmoEnabled.Value && __result) { object? value = AccessTools.Field(typeof(ItemGun), "itemBattery").GetValue(__instance); ItemBattery val = (ItemBattery)((value is ItemBattery) ? value : null); if ((Object)(object)val != (Object)null) { BatteryHelper.Refill(val); } } } } [HarmonyPatch(typeof(ItemGun), "StateOutOfAmmo")] public static class ItemGunOutOfAmmoPatch { public static bool Prefix(ItemGun __instance, bool _fixedUpdate) { if (!Plugin.Cfg.Enabled.Value) { return true; } if (!Plugin.Cfg.InfiniteAmmoEnabled.Value) { return true; } if (_fixedUpdate) { return true; } object? value = AccessTools.Field(typeof(ItemGun), "itemBattery").GetValue(__instance); ItemBattery val = (ItemBattery)((value is ItemBattery) ? value : null); if ((Object)(object)val != (Object)null) { BatteryHelper.Refill(val); } return true; } } [HarmonyPatch(typeof(ItemGun), "ShootRPC")] public static class ItemGunShootRPCPatch { private static float _origRecoil; public static void Prefix(ItemGun __instance) { if (Plugin.Cfg.Enabled.Value) { _origRecoil = __instance.gunRecoilForce; if (!Plugin.Cfg.RecoilEnabled.Value) { __instance.gunRecoilForce = 0f; } } } public static void Postfix(ItemGun __instance) { if (Plugin.Cfg.Enabled.Value) { __instance.gunRecoilForce = _origRecoil; } } } [HarmonyPatch(typeof(GameplayManager), "Update")] public static class GameplayManagerUpdatePatch { private static readonly FieldInfo _cameraShake = AccessTools.Field(typeof(GameplayManager), "cameraShake"); public static void Postfix() { if (Plugin.Cfg.Enabled.Value && !Plugin.Cfg.CameraShakeEnabled.Value) { _cameraShake.SetValue(GameplayManager.instance, 0f); } } } [HarmonyPatch(typeof(ItemGunMuzzleFlash), "ActivateAllEffects")] public static class MuzzleFlashPatch { public static bool Prefix() { if (!Plugin.Cfg.Enabled.Value) { return true; } return Plugin.Cfg.MuzzleFlashEnabled.Value; } } [HarmonyPatch(typeof(ItemGunBullet), "ActivateAll")] public static class ItemGunBulletActivatePatch { public static void Postfix(ItemGunBullet __instance) { if (!Plugin.Cfg.Enabled.Value) { return; } if (!Plugin.Cfg.BulletTrailEnabled.Value) { LineRenderer componentInChildren = ((Component)__instance).GetComponentInChildren<LineRenderer>(); if ((Object)(object)componentInChildren != (Object)null) { ((Renderer)componentInChildren).enabled = false; ((Component)componentInChildren).gameObject.SetActive(false); } } if (!Plugin.Cfg.BulletHitEffectEnabled.Value) { Transform val = ((Component)__instance).transform.Find("Hit Effect"); if ((Object)(object)val != (Object)null) { ((Component)val).gameObject.SetActive(false); } } } } [HarmonyPatch(typeof(ItemGun), "StateIdle")] public static class ItemGunAutoFirePatch { private static readonly FieldInfo _itemToggle = AccessTools.Field(typeof(ItemGun), "itemToggle"); private static readonly FieldInfo _prevToggleState = AccessTools.Field(typeof(ItemGun), "prevToggleState"); private static readonly FieldInfo _physGrabObject = AccessTools.Field(typeof(ItemGun), "physGrabObject"); private static readonly FieldInfo _heldByLocalPlayer = AccessTools.Field(typeof(PhysGrabObject), "heldByLocalPlayer"); private static readonly FieldInfo _inputDisableTimer = AccessTools.Field(typeof(PlayerController), "InputDisableTimer"); public static void Postfix(ItemGun __instance, bool _fixedUpdate) { if (_fixedUpdate || !Plugin.Cfg.Enabled.Value || !Plugin.Cfg.AutoFireEnabled.Value || !SemiFunc.IsMasterClientOrSingleplayer()) { return; } object? value = _physGrabObject.GetValue(__instance); PhysGrabObject val = (PhysGrabObject)((value is PhysGrabObject) ? value : null); if ((Object)(object)val == (Object)null || !(bool)_heldByLocalPlayer.GetValue(val)) { return; } float num = (float)_inputDisableTimer.GetValue(PlayerController.instance); if (!(num > 0f) && SemiFunc.InputHold((InputKey)2)) { object? value2 = _itemToggle.GetValue(__instance); ItemToggle val2 = (ItemToggle)((value2 is ItemToggle) ? value2 : null); if (!((Object)(object)val2 == (Object)null)) { _prevToggleState.SetValue(__instance, !val2.toggleState); } } } } [HarmonyPatch(typeof(ItemGun), "Start")] public static class ItemGunStartPatch { public class OriginalValues { public float ShootCooldown; public float GunRange; } private static readonly ConditionalWeakTable<ItemGun, OriginalValues> _originals = new ConditionalWeakTable<ItemGun, OriginalValues>(); public static void Postfix(ItemGun __instance) { if (Plugin.Cfg.Enabled.Value) { OriginalValues orCreateValue = _originals.GetOrCreateValue(__instance); orCreateValue.ShootCooldown = __instance.shootCooldown; orCreateValue.GunRange = __instance.gunRange; Apply(__instance); } } public static void Apply(ItemGun gun) { if (_originals.TryGetValue(gun, out var value)) { gun.shootCooldown = (Plugin.Cfg.FireRateEnabled.Value ? (value.ShootCooldown / Plugin.Cfg.FireRateMultiplier.Value) : value.ShootCooldown); gun.gunRange = (Plugin.Cfg.RangeEnabled.Value ? (value.GunRange * Plugin.Cfg.RangeMultiplier.Value) : value.GunRange); } } } }