Decompiled source of WeaponEnhancer v2.0.0

Weapon Enhancer.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
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 MenuLib;
using MenuLib.MonoBehaviors;
using REPOLib.Modules;
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("Handgun Mod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Handgun Mod")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("5dca9d7d-cc77-4ee6-9aec-237cd43472c9")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace WeaponEnhancer;

[BepInPlugin("com.Dileppy.WeaponEnhancer", "Weapon Enhancer", "2.0.0")]
public class WeaponEnhancerMod : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static Action <>9__34_0;

		public static Action <>9__34_1;

		public static ScrollViewBuilderDelegate <>9__35_0;

		public static Action<bool> <>9__35_1;

		public static Action<float> <>9__35_2;

		public static Action<bool> <>9__35_3;

		public static Action<float> <>9__35_4;

		public static Action<float> <>9__35_5;

		public static ScrollViewBuilderDelegate <>9__35_6;

		public static Action<bool> <>9__35_7;

		public static Action<int> <>9__35_8;

		public static ScrollViewBuilderDelegate <>9__35_9;

		public static Action<bool> <>9__35_10;

		public static Action<bool> <>9__35_11;

		public static Action<bool> <>9__35_12;

		public static Action<bool> <>9__35_13;

		public static Action<float> <>9__35_14;

		public static Action<float> <>9__35_15;

		public static ScrollViewBuilderDelegate <>9__36_0;

		public static ScrollViewBuilderDelegate <>9__36_1;

		public static Action <>9__36_8;

		public static ScrollViewBuilderDelegate <>9__36_2;

		public static Action <>9__36_9;

		public static ScrollViewBuilderDelegate <>9__36_3;

		public static Action <>9__36_10;

		public static ScrollViewBuilderDelegate <>9__36_4;

		public static Action <>9__36_11;

		public static ScrollViewBuilderDelegate <>9__36_5;

		public static Action <>9__36_12;

		public static ScrollViewBuilderDelegate <>9__36_6;

		public static ScrollViewBuilderDelegate <>9__36_7;

		public static Comparison<Item> <>9__37_0;

		public static ScrollViewBuilderDelegate <>9__39_0;

		public static ScrollViewBuilderDelegate <>9__39_1;

		public static Action <>9__39_8;

		public static ScrollViewBuilderDelegate <>9__39_2;

		public static Action <>9__39_9;

		public static ScrollViewBuilderDelegate <>9__39_3;

		public static Action <>9__39_10;

		public static ScrollViewBuilderDelegate <>9__39_4;

		public static Action <>9__39_11;

		public static ScrollViewBuilderDelegate <>9__39_5;

		public static Action <>9__39_12;

		public static ScrollViewBuilderDelegate <>9__39_6;

		public static ScrollViewBuilderDelegate <>9__39_7;

		internal void <AddMenuElements>b__34_0()
		{
			if ((Object)(object)_configPage == (Object)null)
			{
				_configPage = MenuAPI.CreateREPOPopupPage("Weapon Enhancer Settings", (PresetSide)0, true, true, 1.5f);
				BuildConfigPage(_configPage);
			}
			_configPage.OpenPage(false);
		}

		internal void <AddMenuElements>b__34_1()
		{
			if (SpawnerEnabled.Value)
			{
				if ((Object)(object)_spawnerPage == (Object)null)
				{
					_spawnerPage = MenuAPI.CreateREPOPopupPage("Weapon Logic (Guns Only)", (PresetSide)1, true, true, 1.5f);
					BuildSpawnerPage(_spawnerPage);
					_spawnerPageBuilt = true;
				}
				if (_spawnerPageBuilt)
				{
					RebuildSpawnerList();
				}
				_spawnerPage.OpenPage(false);
			}
		}

		internal RectTransform <BuildConfigPage>b__35_0(Transform parent)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			REPOLabel val = MenuAPI.CreateREPOLabel("Weapon Enhancer Settings", parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildConfigPage>b__35_1(bool v)
		{
			ApplyTuningToAllGuns();
			ApplyLaserTuningToAllLasers();
		}

		internal void <BuildConfigPage>b__35_2(float v)
		{
			ApplyTuningToAllGuns();
		}

		internal void <BuildConfigPage>b__35_3(bool v)
		{
			ApplyTuningToAllGuns();
		}

		internal void <BuildConfigPage>b__35_4(float v)
		{
			ApplyTuningToAllGuns();
		}

		internal void <BuildConfigPage>b__35_5(float v)
		{
			ApplyTuningToAllGuns();
		}

		internal RectTransform <BuildConfigPage>b__35_6(Transform parent)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			REPOLabel val = MenuAPI.CreateREPOLabel("Bullet Multiplier", parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildConfigPage>b__35_7(bool v)
		{
			ApplyTuningToAllGuns();
		}

		internal void <BuildConfigPage>b__35_8(int v)
		{
			ApplyTuningToAllGuns();
		}

		internal RectTransform <BuildConfigPage>b__35_9(Transform parent)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			REPOLabel val = MenuAPI.CreateREPOLabel("Laser Settings (ItemGunLaser)", parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildConfigPage>b__35_10(bool v)
		{
			ApplyLaserTuningToAllLasers();
		}

		internal void <BuildConfigPage>b__35_11(bool v)
		{
			ApplyLaserTuningToAllLasers();
		}

		internal void <BuildConfigPage>b__35_12(bool v)
		{
			ApplyLaserTuningToAllLasers();
		}

		internal void <BuildConfigPage>b__35_13(bool v)
		{
			ApplyLaserTuningToAllLasers();
		}

		internal void <BuildConfigPage>b__35_14(float v)
		{
			ApplyLaserTuningToAllLasers();
		}

		internal void <BuildConfigPage>b__35_15(float v)
		{
			ApplyLaserTuningToAllLasers();
		}

		internal RectTransform <BuildSpawnerPage>b__36_0(Transform parent)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			REPOLabel val = MenuAPI.CreateREPOLabel("Weapon Logic (Guns Only)", parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal RectTransform <BuildSpawnerPage>b__36_1(Transform parent)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			REPOLabel val = MenuAPI.CreateREPOLabel("Search filter is currently fixed to 'guns only'.", parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal RectTransform <BuildSpawnerPage>b__36_2(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Clear Search", (Action)delegate
			{
				_spawnSearch = "";
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPage>b__36_8()
		{
			_spawnSearch = "";
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPage>b__36_3(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Search: Laser", (Action)delegate
			{
				_spawnSearch = "laser";
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPage>b__36_9()
		{
			_spawnSearch = "laser";
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPage>b__36_4(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Search: Gun", (Action)delegate
			{
				_spawnSearch = "gun";
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPage>b__36_10()
		{
			_spawnSearch = "gun";
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPage>b__36_5(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Search: Cannon", (Action)delegate
			{
				_spawnSearch = "cannon";
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPage>b__36_11()
		{
			_spawnSearch = "cannon";
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPage>b__36_6(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Refresh List", (Action)delegate
			{
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPage>b__36_12()
		{
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPage>b__36_7(Transform parent)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			REPOLabel val = MenuAPI.CreateREPOLabel("Available Gun Items:", parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal int <CacheGunItems>b__37_0(Item a, Item b)
		{
			return string.Compare(a.itemName, b.itemName, StringComparison.OrdinalIgnoreCase);
		}

		internal RectTransform <BuildSpawnerPageCoreList>b__39_0(Transform parent)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			REPOLabel val = MenuAPI.CreateREPOLabel("Weapon Logic (Guns Only)", parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal RectTransform <BuildSpawnerPageCoreList>b__39_1(Transform parent)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			REPOLabel val = MenuAPI.CreateREPOLabel(string.IsNullOrEmpty(_spawnSearch) ? "Search: (none)" : ("Search: " + _spawnSearch), parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal RectTransform <BuildSpawnerPageCoreList>b__39_2(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Clear Search", (Action)delegate
			{
				_spawnSearch = "";
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPageCoreList>b__39_8()
		{
			_spawnSearch = "";
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPageCoreList>b__39_3(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Search: Laser", (Action)delegate
			{
				_spawnSearch = "laser";
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPageCoreList>b__39_9()
		{
			_spawnSearch = "laser";
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPageCoreList>b__39_4(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Search: Gun", (Action)delegate
			{
				_spawnSearch = "gun";
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPageCoreList>b__39_10()
		{
			_spawnSearch = "gun";
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPageCoreList>b__39_5(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Search: Cannon", (Action)delegate
			{
				_spawnSearch = "cannon";
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPageCoreList>b__39_11()
		{
			_spawnSearch = "cannon";
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPageCoreList>b__39_6(Transform parent)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton("Refresh List", (Action)delegate
			{
				RebuildSpawnerList();
			}, parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}

		internal void <BuildSpawnerPageCoreList>b__39_12()
		{
			RebuildSpawnerList();
		}

		internal RectTransform <BuildSpawnerPageCoreList>b__39_7(Transform parent)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			REPOLabel val = MenuAPI.CreateREPOLabel("Available Gun Items:", parent, Vector2.zero);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}
	}

	public const string ModGuid = "com.Dileppy.WeaponEnhancer";

	public const string ModName = "Weapon Enhancer";

	public const string ModVersion = "2.0.0";

	private Harmony _harmony;

	private static REPOPopupPage _configPage;

	internal static ConfigEntry<bool> ModEnabled;

	internal static ConfigEntry<float> FireRateSeconds;

	internal static ConfigEntry<bool> InfiniteAmmoEnabled;

	internal static ConfigEntry<bool> PerfectAccuracyEnabled;

	internal static ConfigEntry<float> SpreadFactor;

	internal static ConfigEntry<float> RecoilMultiplier;

	internal static ConfigEntry<float> DamageMultiplier;

	internal static ConfigEntry<bool> ExplosiveBullets;

	internal static ConfigEntry<float> ExplosionRadius;

	internal static ConfigEntry<float> ExplosionForce;

	internal static ConfigEntry<bool> BulletMultiplierEnabled;

	internal static ConfigEntry<int> BulletsPerShot;

	internal static ConfigEntry<bool> SpawnerEnabled;

	internal static ConfigEntry<bool> LaserEnabled;

	internal static ConfigEntry<bool> LaserNoCooldown;

	internal static ConfigEntry<bool> LaserContinuousFire;

	internal static ConfigEntry<float> LaserReloadSpeedMultiplier;

	internal static ConfigEntry<bool> LaserStateLockEnabled;

	internal static ConfigEntry<float> LaserShootDurationSeconds;

	internal static Dictionary<ItemGun, float> originalSpread = new Dictionary<ItemGun, float>();

	internal static Dictionary<ItemGun, float> originalRecoil = new Dictionary<ItemGun, float>();

	internal static Dictionary<ItemGun, float> originalShake = new Dictionary<ItemGun, float>();

	internal static Dictionary<ItemGun, int> originalNumberOfBullets = new Dictionary<ItemGun, int>();

	private static bool _spawnerPageBuilt = false;

	private static REPOPopupPage _spawnerPage;

	private static string _spawnSearch = "";

	private static List<Item> _cachedGunItems = new List<Item>();

	private void Awake()
	{
		//IL_028d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0297: Expected O, but got Unknown
		//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b4: Expected O, but got Unknown
		ModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ModEnabled", true, "Master enable switch.");
		FireRateSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Fire", "FireRateSeconds", 0.05f, "Seconds between shots.");
		InfiniteAmmoEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Fire", "InfiniteAmmoEnabled", true, "Keep all batteries full.");
		PerfectAccuracyEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Accuracy", "PerfectAccuracy", false, "Spread = 0.");
		SpreadFactor = ((BaseUnityPlugin)this).Config.Bind<float>("Accuracy", "SpreadFactor", 1f, "0–1 spread scaling.");
		RecoilMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Accuracy", "RecoilMultiplier", 1f, "0–5 recoil scaling.");
		DamageMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Damage", "DamageMultiplier", 1f, "1–100 damage multiplier.");
		ExplosiveBullets = ((BaseUnityPlugin)this).Config.Bind<bool>("Damage", "ExplosiveBulletsEnabled", false, "Enable explosive hits.");
		ExplosionRadius = ((BaseUnityPlugin)this).Config.Bind<float>("Damage", "ExplosionRadius", 5f, "Explosion radius.");
		ExplosionForce = ((BaseUnityPlugin)this).Config.Bind<float>("Damage", "ExplosionForce", 750f, "Explosion force.");
		BulletMultiplierEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Bullet Multiplier", "Enabled", false, "Override bullets fired per trigger pull (global).");
		BulletsPerShot = ((BaseUnityPlugin)this).Config.Bind<int>("Bullet Multiplier", "BulletsPerShot", 1, "How many bullets are fired per shot (1–25).");
		SpawnerEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Weapon Logic", "Connected", true, "Enable the Weapon Logic UI section.");
		LaserEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Laser", "LaserTweaks", true, "Enable laser-specific tweaks (ItemGunLaser).");
		LaserNoCooldown = ((BaseUnityPlugin)this).Config.Bind<bool>("Laser", "LaserCooldownBetweenShots", false, "Minimize downtime states for the laser (very fast).");
		LaserContinuousFire = ((BaseUnityPlugin)this).Config.Bind<bool>("Laser", "InflictDamage", true, "Allow the laser to sustain firing (see duration + state lock).");
		LaserReloadSpeedMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Laser", "LaserReloadBetweenShotSpeed", 1f, "Reload/Buildup speed multiplier for laser downtime states.");
		LaserStateLockEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Laser", "ContinuousFire", true, "Prevents the laser from being forced into overheat/reload states while firing (host-only safe).");
		LaserShootDurationSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Laser", "ShotDuration", 999f, "How long the laser can stay in Shooting state before timing out. Use a large value for effectively continuous fire.");
		ClampConfigValues();
		_harmony = new Harmony("com.Dileppy.WeaponEnhancer");
		_harmony.PatchAll();
		MenuAPI.AddElementToMainMenu(new BuilderDelegate(AddMenuElements));
		((BaseUnityPlugin)this).Logger.LogInfo((object)"[WeaponEnhancer] Loaded.");
	}

	private static void ClampConfigValues()
	{
		FireRateSeconds.Value = Mathf.Clamp(FireRateSeconds.Value, 0.01f, 0.25f);
		SpreadFactor.Value = Mathf.Clamp01(SpreadFactor.Value);
		RecoilMultiplier.Value = Mathf.Clamp(RecoilMultiplier.Value, 0f, 5f);
		DamageMultiplier.Value = Mathf.Clamp(DamageMultiplier.Value, 1f, 100f);
		ExplosionRadius.Value = Mathf.Clamp(ExplosionRadius.Value, 0.1f, 20f);
		ExplosionForce.Value = Mathf.Clamp(ExplosionForce.Value, 0f, 2000f);
		BulletsPerShot.Value = Mathf.Clamp(BulletsPerShot.Value, 1, 25);
		LaserReloadSpeedMultiplier.Value = Mathf.Clamp(LaserReloadSpeedMultiplier.Value, 0.1f, 10f);
		LaserShootDurationSeconds.Value = Mathf.Clamp(LaserShootDurationSeconds.Value, 0.25f, 999f);
	}

	private void AddMenuElements(Transform parent)
	{
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		MenuAPI.CreateREPOButton("Weapon Enhancer Settings", (Action)delegate
		{
			if ((Object)(object)_configPage == (Object)null)
			{
				_configPage = MenuAPI.CreateREPOPopupPage("Weapon Enhancer Settings", (PresetSide)0, true, true, 1.5f);
				BuildConfigPage(_configPage);
			}
			_configPage.OpenPage(false);
		}, parent, Vector2.zero);
		MenuAPI.CreateREPOButton("Weapon Logic", (Action)delegate
		{
			if (SpawnerEnabled.Value)
			{
				if ((Object)(object)_spawnerPage == (Object)null)
				{
					_spawnerPage = MenuAPI.CreateREPOPopupPage("Weapon Logic (Guns Only)", (PresetSide)1, true, true, 1.5f);
					BuildSpawnerPage(_spawnerPage);
					_spawnerPageBuilt = true;
				}
				if (_spawnerPageBuilt)
				{
					RebuildSpawnerList();
				}
				_spawnerPage.OpenPage(false);
			}
		}, parent, Vector2.zero);
	}

	private static void BuildConfigPage(REPOPopupPage page)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d7: Expected O, but got Unknown
		//IL_025f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0264: Unknown result type (might be due to invalid IL or missing references)
		//IL_026a: Expected O, but got Unknown
		object obj = <>c.<>9__35_0;
		if (obj == null)
		{
			ScrollViewBuilderDelegate val = delegate(Transform parent)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val6 = MenuAPI.CreateREPOLabel("Weapon Enhancer Settings", parent, Vector2.zero);
				return ((REPOElement)val6).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__35_0 = val;
			obj = (object)val;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, 0f);
		AddToggle(page, "Mod Enabled", ModEnabled, delegate
		{
			ApplyTuningToAllGuns();
			ApplyLaserTuningToAllLasers();
		});
		AddSlider(page, "Fire Rate", 0.01f, 0.25f, FireRateSeconds, delegate
		{
			ApplyTuningToAllGuns();
		});
		AddToggle(page, "Infinite Ammo", InfiniteAmmoEnabled, null);
		AddToggle(page, "Perfect Accuracy", PerfectAccuracyEnabled, delegate
		{
			ApplyTuningToAllGuns();
		});
		AddSlider(page, "Spread Factor", 0f, 1f, SpreadFactor, delegate
		{
			ApplyTuningToAllGuns();
		});
		AddSlider(page, "Recoil Multiplier", 0f, 5f, RecoilMultiplier, delegate
		{
			ApplyTuningToAllGuns();
		});
		AddSlider(page, "Damage Multiplier", 1f, 100f, DamageMultiplier, null);
		AddToggle(page, "Explosive Bullets", ExplosiveBullets, null);
		AddSlider(page, "Explosion Radius", 0.1f, 20f, ExplosionRadius, null);
		AddSlider(page, "Explosion Force", 0f, 2000f, ExplosionForce, null);
		object obj2 = <>c.<>9__35_6;
		if (obj2 == null)
		{
			ScrollViewBuilderDelegate val2 = delegate(Transform parent)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val5 = MenuAPI.CreateREPOLabel("Bullet Multiplier", parent, Vector2.zero);
				return ((REPOElement)val5).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__35_6 = val2;
			obj2 = (object)val2;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 0f);
		AddToggle(page, "Enable Bullet Multiplier", BulletMultiplierEnabled, delegate
		{
			ApplyTuningToAllGuns();
		});
		AddSliderInt(page, "Bullets Per Shot", 1, 25, BulletsPerShot, delegate
		{
			ApplyTuningToAllGuns();
		});
		object obj3 = <>c.<>9__35_9;
		if (obj3 == null)
		{
			ScrollViewBuilderDelegate val3 = delegate(Transform parent)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val4 = MenuAPI.CreateREPOLabel("Laser Settings (ItemGunLaser)", parent, Vector2.zero);
				return ((REPOElement)val4).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__35_9 = val3;
			obj3 = (object)val3;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj3, 0f, 0f);
		AddToggle(page, "Laser Tweaks", LaserEnabled, delegate
		{
			ApplyLaserTuningToAllLasers();
		});
		AddToggle(page, "Laser Cooldown Between Shots", LaserNoCooldown, delegate
		{
			ApplyLaserTuningToAllLasers();
		});
		AddToggle(page, "Inflict Damage", LaserContinuousFire, delegate
		{
			ApplyLaserTuningToAllLasers();
		});
		AddToggle(page, "Continuous Fire", LaserStateLockEnabled, delegate
		{
			ApplyLaserTuningToAllLasers();
		});
		AddSlider(page, "Shot Duration", 0.25f, 999f, LaserShootDurationSeconds, delegate
		{
			ApplyLaserTuningToAllLasers();
		});
		AddSlider(page, "Laser Reload Between Shot Speed", 0.1f, 10f, LaserReloadSpeedMultiplier, delegate
		{
			ApplyLaserTuningToAllLasers();
		});
	}

	private static void BuildSpawnerPage(REPOPopupPage page)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Expected O, but got Unknown
		//IL_0076: 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_0081: Expected O, but got Unknown
		//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_00b1: Expected O, but got Unknown
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Expected O, but got Unknown
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Expected O, but got Unknown
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		//IL_013b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Expected O, but got Unknown
		//IL_0166: Unknown result type (might be due to invalid IL or missing references)
		//IL_016b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0171: Expected O, but got Unknown
		object obj = <>c.<>9__36_0;
		if (obj == null)
		{
			ScrollViewBuilderDelegate val = delegate(Transform parent)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val16 = MenuAPI.CreateREPOLabel("Weapon Logic (Guns Only)", parent, Vector2.zero);
				return ((REPOElement)val16).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__36_0 = val;
			obj = (object)val;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, 0f);
		object obj2 = <>c.<>9__36_1;
		if (obj2 == null)
		{
			ScrollViewBuilderDelegate val2 = delegate(Transform parent)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val15 = MenuAPI.CreateREPOLabel("Search filter is currently fixed to 'guns only'.", parent, Vector2.zero);
				return ((REPOElement)val15).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__36_1 = val2;
			obj2 = (object)val2;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 0f);
		object obj3 = <>c.<>9__36_2;
		if (obj3 == null)
		{
			ScrollViewBuilderDelegate val3 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val14 = MenuAPI.CreateREPOButton("Clear Search", (Action)delegate
				{
					_spawnSearch = "";
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val14).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__36_2 = val3;
			obj3 = (object)val3;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj3, 0f, 0f);
		object obj4 = <>c.<>9__36_3;
		if (obj4 == null)
		{
			ScrollViewBuilderDelegate val4 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val13 = MenuAPI.CreateREPOButton("Search: Laser", (Action)delegate
				{
					_spawnSearch = "laser";
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val13).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__36_3 = val4;
			obj4 = (object)val4;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj4, 0f, 0f);
		object obj5 = <>c.<>9__36_4;
		if (obj5 == null)
		{
			ScrollViewBuilderDelegate val5 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val12 = MenuAPI.CreateREPOButton("Search: Gun", (Action)delegate
				{
					_spawnSearch = "gun";
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val12).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__36_4 = val5;
			obj5 = (object)val5;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj5, 0f, 0f);
		object obj6 = <>c.<>9__36_5;
		if (obj6 == null)
		{
			ScrollViewBuilderDelegate val6 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val11 = MenuAPI.CreateREPOButton("Search: Cannon", (Action)delegate
				{
					_spawnSearch = "cannon";
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val11).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__36_5 = val6;
			obj6 = (object)val6;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj6, 0f, 0f);
		object obj7 = <>c.<>9__36_6;
		if (obj7 == null)
		{
			ScrollViewBuilderDelegate val7 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val10 = MenuAPI.CreateREPOButton("Refresh List", (Action)delegate
				{
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val10).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__36_6 = val7;
			obj7 = (object)val7;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj7, 0f, 0f);
		object obj8 = <>c.<>9__36_7;
		if (obj8 == null)
		{
			ScrollViewBuilderDelegate val8 = delegate(Transform parent)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val9 = MenuAPI.CreateREPOLabel("Available Gun Items:", parent, Vector2.zero);
				return ((REPOElement)val9).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__36_7 = val8;
			obj8 = (object)val8;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj8, 0f, 0f);
		CacheGunItems();
		RebuildSpawnerList();
	}

	private static void CacheGunItems()
	{
		_cachedGunItems.Clear();
		IReadOnlyList<Item> allItems = Items.AllItems;
		for (int i = 0; i < allItems.Count; i++)
		{
			Item val = allItems[i];
			if (!((Object)(object)val == (Object)null) && !string.IsNullOrEmpty(val.itemName))
			{
				string text = val.itemName.ToLowerInvariant();
				if (text.Contains("gun") || text.Contains("laser") || text.Contains("c.a.r.t") || text.Contains("cart") || text.Contains("cannon") || text.Contains("grenade") || text.Contains("mine") || text.Contains("stun") || text.Contains("baton") || text.Contains("tracker") || text.Contains("shockwave") || text.Contains("sentry"))
				{
					_cachedGunItems.Add(val);
				}
			}
		}
		_cachedGunItems.Sort((Item a, Item b) => string.Compare(a.itemName, b.itemName, StringComparison.OrdinalIgnoreCase));
	}

	private static void RebuildSpawnerList()
	{
		if (!((Object)(object)_spawnerPage == (Object)null))
		{
			CacheGunItems();
			bool flag = true;
			try
			{
				_spawnerPage.ClosePage(false);
			}
			catch
			{
				flag = false;
			}
			_spawnerPage = MenuAPI.CreateREPOPopupPage("Weapon Logic (Guns Only)", (PresetSide)1, true, true, 1.5f);
			BuildSpawnerPageCoreList(_spawnerPage);
			if (flag)
			{
				_spawnerPage.OpenPage(false);
			}
		}
	}

	private static void BuildSpawnerPageCoreList(REPOPopupPage page)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Expected O, but got Unknown
		//IL_0076: 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_0081: Expected O, but got Unknown
		//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_00b1: Expected O, but got Unknown
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Expected O, but got Unknown
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Expected O, but got Unknown
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		//IL_013b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Expected O, but got Unknown
		//IL_0166: Unknown result type (might be due to invalid IL or missing references)
		//IL_016b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0171: Expected O, but got Unknown
		//IL_021d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0231: Expected O, but got Unknown
		object obj = <>c.<>9__39_0;
		if (obj == null)
		{
			ScrollViewBuilderDelegate val = delegate(Transform parent)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val17 = MenuAPI.CreateREPOLabel("Weapon Logic (Guns Only)", parent, Vector2.zero);
				return ((REPOElement)val17).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__39_0 = val;
			obj = (object)val;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, 0f);
		object obj2 = <>c.<>9__39_1;
		if (obj2 == null)
		{
			ScrollViewBuilderDelegate val2 = delegate(Transform parent)
			{
				//IL_0024: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val16 = MenuAPI.CreateREPOLabel(string.IsNullOrEmpty(_spawnSearch) ? "Search: (none)" : ("Search: " + _spawnSearch), parent, Vector2.zero);
				return ((REPOElement)val16).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__39_1 = val2;
			obj2 = (object)val2;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 0f);
		object obj3 = <>c.<>9__39_2;
		if (obj3 == null)
		{
			ScrollViewBuilderDelegate val3 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val15 = MenuAPI.CreateREPOButton("Clear Search", (Action)delegate
				{
					_spawnSearch = "";
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val15).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__39_2 = val3;
			obj3 = (object)val3;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj3, 0f, 0f);
		object obj4 = <>c.<>9__39_3;
		if (obj4 == null)
		{
			ScrollViewBuilderDelegate val4 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val14 = MenuAPI.CreateREPOButton("Search: Laser", (Action)delegate
				{
					_spawnSearch = "laser";
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val14).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__39_3 = val4;
			obj4 = (object)val4;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj4, 0f, 0f);
		object obj5 = <>c.<>9__39_4;
		if (obj5 == null)
		{
			ScrollViewBuilderDelegate val5 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val13 = MenuAPI.CreateREPOButton("Search: Gun", (Action)delegate
				{
					_spawnSearch = "gun";
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val13).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__39_4 = val5;
			obj5 = (object)val5;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj5, 0f, 0f);
		object obj6 = <>c.<>9__39_5;
		if (obj6 == null)
		{
			ScrollViewBuilderDelegate val6 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val12 = MenuAPI.CreateREPOButton("Search: Cannon", (Action)delegate
				{
					_spawnSearch = "cannon";
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val12).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__39_5 = val6;
			obj6 = (object)val6;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj6, 0f, 0f);
		object obj7 = <>c.<>9__39_6;
		if (obj7 == null)
		{
			ScrollViewBuilderDelegate val7 = delegate(Transform parent)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val11 = MenuAPI.CreateREPOButton("Refresh List", (Action)delegate
				{
					RebuildSpawnerList();
				}, parent, Vector2.zero);
				return ((REPOElement)val11).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__39_6 = val7;
			obj7 = (object)val7;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj7, 0f, 0f);
		object obj8 = <>c.<>9__39_7;
		if (obj8 == null)
		{
			ScrollViewBuilderDelegate val8 = delegate(Transform parent)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				REPOLabel val10 = MenuAPI.CreateREPOLabel("Available Gun Items:", parent, Vector2.zero);
				return ((REPOElement)val10).repoScrollViewElement.rectTransform;
			};
			<>c.<>9__39_7 = val8;
			obj8 = (object)val8;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj8, 0f, 0f);
		string value = (string.IsNullOrEmpty(_spawnSearch) ? "" : _spawnSearch.ToLowerInvariant());
		for (int i = 0; i < _cachedGunItems.Count; i++)
		{
			Item item = _cachedGunItems[i];
			if ((Object)(object)item == (Object)null)
			{
				continue;
			}
			string name = item.itemName ?? "";
			string text = name.ToLowerInvariant();
			if (!string.IsNullOrEmpty(value) && !text.Contains(value))
			{
				continue;
			}
			page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform parent)
			{
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val9 = MenuAPI.CreateREPOButton("Spawn: " + name, (Action)delegate
				{
					TrySpawnItemInFront(item);
				}, parent, Vector2.zero);
				return ((REPOElement)val9).repoScrollViewElement.rectTransform;
			}, 0f, 0f);
		}
		_spawnerPageBuilt = true;
	}

	private static void TrySpawnItemInFront(Item item)
	{
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_008b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)item == (Object)null || !SemiFunc.IsMasterClientOrSingleplayer())
		{
			return;
		}
		Transform val = null;
		try
		{
			if ((Object)(object)PlayerAvatar.instance != (Object)null)
			{
				val = ((Component)PlayerAvatar.instance).transform;
			}
		}
		catch
		{
		}
		Vector3 val2 = (((Object)(object)val != (Object)null) ? (val.position + val.forward * 2f + Vector3.up * 0.3f) : (Vector3.zero + Vector3.up * 1.5f));
		Quaternion identity = Quaternion.identity;
		Items.SpawnItem(item, val2, identity);
	}

	private static void AddToggle(REPOPopupPage page, string label, ConfigEntry<bool> entry, Action<bool> onChanged)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Expected O, but got Unknown
		page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform parent)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			REPOToggle val = MenuAPI.CreateREPOToggle(label, (Action<bool>)delegate(bool v)
			{
				entry.Value = v;
				onChanged?.Invoke(v);
			}, parent, Vector2.zero, "Off", "On", entry.Value);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}, 0f, 0f);
	}

	private static void AddSlider(REPOPopupPage page, string label, float min, float max, ConfigEntry<float> entry, Action<float> onChanged)
	{
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Expected O, but got Unknown
		page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform parent)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			REPOSlider val = MenuAPI.CreateREPOSlider(label, "", (Action<float>)delegate(float v)
			{
				entry.Value = Mathf.Clamp(v, min, max);
				onChanged?.Invoke(entry.Value);
			}, parent, Vector2.zero, min, max, 2, entry.Value, "", "", (BarBehavior)0);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}, 0f, 0f);
	}

	private static void AddSliderInt(REPOPopupPage page, string label, int min, int max, ConfigEntry<int> entry, Action<int> onChanged)
	{
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Expected O, but got Unknown
		page.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform parent)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			REPOSlider val = MenuAPI.CreateREPOSlider(label, "", (Action<float>)delegate(float v)
			{
				int num = Mathf.Clamp(Mathf.RoundToInt(v), min, max);
				entry.Value = num;
				onChanged?.Invoke(num);
			}, parent, Vector2.zero, (float)min, (float)max, 0, (float)entry.Value, "", "", (BarBehavior)0);
			return ((REPOElement)val).repoScrollViewElement.rectTransform;
		}, 0f, 0f);
	}

	internal static void ApplyTuningToAllGuns()
	{
		ItemGun[] array = Object.FindObjectsOfType<ItemGun>();
		for (int i = 0; i < array.Length; i++)
		{
			ApplyTuningToGun(array[i]);
		}
	}

	internal static void ApplyTuningToGun(ItemGun gun)
	{
		if ((Object)(object)gun == (Object)null)
		{
			return;
		}
		if (!ModEnabled.Value)
		{
			RestoreOriginalGunValues(gun);
			return;
		}
		if (!originalSpread.ContainsKey(gun))
		{
			originalSpread[gun] = gun.gunRandomSpread;
		}
		if (!originalRecoil.ContainsKey(gun))
		{
			originalRecoil[gun] = gun.gunRecoilForce;
		}
		if (!originalShake.ContainsKey(gun))
		{
			originalShake[gun] = gun.cameraShakeMultiplier;
		}
		if (!originalNumberOfBullets.ContainsKey(gun))
		{
			originalNumberOfBullets[gun] = gun.numberOfBullets;
		}
		if (PerfectAccuracyEnabled.Value)
		{
			gun.gunRandomSpread = 0f;
		}
		else
		{
			gun.gunRandomSpread = originalSpread[gun] * SpreadFactor.Value;
		}
		gun.gunRecoilForce = originalRecoil[gun] * RecoilMultiplier.Value;
		gun.cameraShakeMultiplier = originalShake[gun] * RecoilMultiplier.Value;
		gun.shootCooldown = FireRateSeconds.Value;
		if (BulletMultiplierEnabled.Value)
		{
			gun.numberOfBullets = BulletsPerShot.Value;
		}
		else
		{
			gun.numberOfBullets = originalNumberOfBullets[gun];
		}
	}

	internal static void RestoreOriginalGunValues(ItemGun gun)
	{
		if (!((Object)(object)gun == (Object)null))
		{
			if (originalSpread.ContainsKey(gun))
			{
				gun.gunRandomSpread = originalSpread[gun];
			}
			if (originalRecoil.ContainsKey(gun))
			{
				gun.gunRecoilForce = originalRecoil[gun];
			}
			if (originalShake.ContainsKey(gun))
			{
				gun.cameraShakeMultiplier = originalShake[gun];
			}
			if (originalNumberOfBullets.ContainsKey(gun))
			{
				gun.numberOfBullets = originalNumberOfBullets[gun];
			}
		}
	}

	internal static void ApplyLaserTuningToAllLasers()
	{
		try
		{
			ItemGunLaser[] array = Object.FindObjectsOfType<ItemGunLaser>();
			for (int i = 0; i < array.Length; i++)
			{
				ItemGun component = ((Component)array[i]).GetComponent<ItemGun>();
				if ((Object)(object)component != (Object)null)
				{
					ApplyLaserTuningToGun(component);
				}
			}
		}
		catch
		{
		}
	}

	internal static void ApplyLaserTuningToGun(ItemGun gun)
	{
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)gun == (Object)null) && ModEnabled.Value && LaserEnabled.Value && !((Object)(object)((Component)gun).GetComponent<ItemGunLaser>() == (Object)null))
		{
			State stateCurrentSafe = LaserTuningHelpers.GetStateCurrentSafe(gun);
			LaserTuningHelpers.ApplyLaserStateTiming(gun, stateCurrentSafe);
		}
	}
}
[HarmonyPatch(typeof(ItemGun), "Start")]
internal static class Patch_GunStart
{
	private static void Postfix(ItemGun __instance)
	{
		WeaponEnhancerMod.ApplyTuningToGun(__instance);
		WeaponEnhancerMod.ApplyLaserTuningToGun(__instance);
	}
}
[HarmonyPatch(typeof(ItemGun), "StateSet")]
internal static class Patch_ItemGun_StateSet_LaserOverride
{
	private static bool Prefix(ItemGun __instance, ref State __0)
	{
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Invalid comparison between Unknown and I4
		if ((Object)(object)__instance == (Object)null)
		{
			return true;
		}
		if (!WeaponEnhancerMod.ModEnabled.Value)
		{
			return true;
		}
		if (!WeaponEnhancerMod.LaserEnabled.Value)
		{
			return true;
		}
		if ((Object)(object)((Component)__instance).GetComponent<ItemGunLaser>() == (Object)null)
		{
			return true;
		}
		if (WeaponEnhancerMod.LaserStateLockEnabled.Value)
		{
			State stateCurrentSafe = LaserTuningHelpers.GetStateCurrentSafe(__instance);
			if ((int)stateCurrentSafe == 3 && ((int)__0 == 4 || (int)__0 == 2))
			{
				__0 = (State)3;
			}
		}
		return true;
	}

	private static void Postfix(ItemGun __instance, State __0)
	{
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)__instance == (Object)null) && WeaponEnhancerMod.ModEnabled.Value && WeaponEnhancerMod.LaserEnabled.Value && !((Object)(object)((Component)__instance).GetComponent<ItemGunLaser>() == (Object)null))
		{
			LaserTuningHelpers.ApplyLaserStateTiming(__instance, __0);
		}
	}
}
[HarmonyPatch(typeof(ItemGun), "StateSetRPC")]
internal static class Patch_ItemGun_StateSetRPC_LaserOverride
{
	private static bool Prefix(ItemGun __instance, ref int __0)
	{
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Invalid comparison between Unknown and I4
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Invalid comparison between Unknown and I4
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Invalid comparison between Unknown and I4
		if ((Object)(object)__instance == (Object)null)
		{
			return true;
		}
		if (!WeaponEnhancerMod.ModEnabled.Value)
		{
			return true;
		}
		if (!WeaponEnhancerMod.LaserEnabled.Value)
		{
			return true;
		}
		if ((Object)(object)((Component)__instance).GetComponent<ItemGunLaser>() == (Object)null)
		{
			return true;
		}
		if (!WeaponEnhancerMod.LaserStateLockEnabled.Value)
		{
			return true;
		}
		State val = (State)__0;
		State stateCurrentSafe = LaserTuningHelpers.GetStateCurrentSafe(__instance);
		if ((int)stateCurrentSafe == 3 && ((int)val == 4 || (int)val == 2))
		{
			__0 = 3;
		}
		return true;
	}

	private static void Postfix(ItemGun __instance, int __0)
	{
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)__instance == (Object)null) && WeaponEnhancerMod.ModEnabled.Value && WeaponEnhancerMod.LaserEnabled.Value && !((Object)(object)((Component)__instance).GetComponent<ItemGunLaser>() == (Object)null))
		{
			State state = (State)__0;
			LaserTuningHelpers.ApplyLaserStateTiming(__instance, state);
		}
	}
}
[HarmonyPatch(typeof(ItemGun), "Update")]
internal static class Patch_ItemGun_Update_LaserTimingEnforcer
{
	private static void Postfix(ItemGun __instance)
	{
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)__instance == (Object)null) && WeaponEnhancerMod.ModEnabled.Value && WeaponEnhancerMod.LaserEnabled.Value && !((Object)(object)((Component)__instance).GetComponent<ItemGunLaser>() == (Object)null))
		{
			State stateCurrentSafe = LaserTuningHelpers.GetStateCurrentSafe(__instance);
			LaserTuningHelpers.ApplyLaserStateTiming(__instance, stateCurrentSafe);
		}
	}
}
[HarmonyPatch(typeof(ItemBattery), "Update")]
internal static class Patch_BatteryInfinite
{
	private static void Postfix(ItemBattery __instance)
	{
		if (WeaponEnhancerMod.ModEnabled.Value && WeaponEnhancerMod.InfiniteAmmoEnabled.Value && SemiFunc.IsMasterClientOrSingleplayer())
		{
			__instance.autoDrain = false;
			__instance.batteryDrainRate = 0f;
			__instance.batteryLife = 100f;
		}
	}
}
[HarmonyPatch(typeof(HurtCollider), "EnemyHurt")]
internal static class Patch_EnemyDamage
{
	private static void Prefix(HurtCollider __instance, Enemy _enemy, ref int __state)
	{
		__state = __instance.enemyDamage;
		if (WeaponEnhancerMod.ModEnabled.Value && (!((Object)(object)((Component)__instance).GetComponentInParent<ItemGunBullet>() == (Object)null) || !((Object)(object)((Component)__instance).GetComponentInParent<ItemGun>() == (Object)null)))
		{
			__instance.enemyDamage = Mathf.RoundToInt((float)__state * WeaponEnhancerMod.DamageMultiplier.Value);
		}
	}

	private static void Postfix(HurtCollider __instance, Enemy _enemy, int __state)
	{
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		__instance.enemyDamage = __state;
		if (!WeaponEnhancerMod.ModEnabled.Value || !WeaponEnhancerMod.ExplosiveBullets.Value || ((Object)(object)((Component)__instance).GetComponentInParent<ItemGunBullet>() == (Object)null && (Object)(object)((Component)__instance).GetComponentInParent<ItemGun>() == (Object)null) || (Object)(object)_enemy == (Object)null)
		{
			return;
		}
		Vector3 position = ((Component)_enemy).transform.position;
		Collider[] array = Physics.OverlapSphere(position, WeaponEnhancerMod.ExplosionRadius.Value);
		for (int i = 0; i < array.Length; i++)
		{
			Rigidbody attachedRigidbody = array[i].attachedRigidbody;
			if ((Object)(object)attachedRigidbody != (Object)null)
			{
				attachedRigidbody.AddExplosionForce(WeaponEnhancerMod.ExplosionForce.Value, position, WeaponEnhancerMod.ExplosionRadius.Value, 0f, (ForceMode)1);
			}
		}
	}
}
[HarmonyPatch(typeof(HurtCollider), "PlayerHurt")]
internal static class Patch_PlayerDamage
{
	private static void Prefix(HurtCollider __instance, PlayerAvatar _player, ref int __state)
	{
		__state = __instance.playerDamage;
		if (WeaponEnhancerMod.ModEnabled.Value && (!((Object)(object)((Component)__instance).GetComponentInParent<ItemGunBullet>() == (Object)null) || !((Object)(object)((Component)__instance).GetComponentInParent<ItemGun>() == (Object)null)))
		{
			__instance.playerDamage = Mathf.RoundToInt((float)__state * WeaponEnhancerMod.DamageMultiplier.Value);
		}
	}

	private static void Postfix(HurtCollider __instance, PlayerAvatar _player, int __state)
	{
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		__instance.playerDamage = __state;
		if (!WeaponEnhancerMod.ModEnabled.Value || !WeaponEnhancerMod.ExplosiveBullets.Value || ((Object)(object)((Component)__instance).GetComponentInParent<ItemGunBullet>() == (Object)null && (Object)(object)((Component)__instance).GetComponentInParent<ItemGun>() == (Object)null) || (Object)(object)_player == (Object)null)
		{
			return;
		}
		Vector3 position = ((Component)_player).transform.position;
		Collider[] array = Physics.OverlapSphere(position, WeaponEnhancerMod.ExplosionRadius.Value);
		for (int i = 0; i < array.Length; i++)
		{
			Rigidbody attachedRigidbody = array[i].attachedRigidbody;
			if ((Object)(object)attachedRigidbody != (Object)null)
			{
				attachedRigidbody.AddExplosionForce(WeaponEnhancerMod.ExplosionForce.Value, position, WeaponEnhancerMod.ExplosionRadius.Value, 0f, (ForceMode)1);
			}
		}
	}
}
internal static class LaserTuningHelpers
{
	private static readonly FieldInfo Field_StateCurrent = AccessTools.Field(typeof(ItemGun), "stateCurrent");

	private static readonly FieldInfo Field_StateTimeMax = AccessTools.Field(typeof(ItemGun), "stateTimeMax");

	private static readonly Dictionary<int, float> OriginalStateTimeMax = new Dictionary<int, float>();

	private static int MakeKey(ItemGun gun, State state)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected I4, but got Unknown
		return (((Object)gun).GetInstanceID() * 397) ^ state;
	}

	internal static State GetStateCurrentSafe(ItemGun gun)
	{
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			if ((Object)(object)gun == (Object)null)
			{
				return (State)0;
			}
			if (Field_StateCurrent == null)
			{
				return (State)0;
			}
			object value = Field_StateCurrent.GetValue(gun);
			if (value is State)
			{
				return (State)value;
			}
		}
		catch
		{
		}
		return (State)0;
	}

	internal static void ApplyLaserStateTiming(ItemGun gun, State state)
	{
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Invalid comparison between Unknown and I4
		//IL_0138: Unknown result type (might be due to invalid IL or missing references)
		//IL_013a: Invalid comparison between Unknown and I4
		//IL_013c: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Invalid comparison between Unknown and I4
		if ((Object)(object)gun == (Object)null || !WeaponEnhancerMod.ModEnabled.Value || !WeaponEnhancerMod.LaserEnabled.Value || (Object)(object)((Component)gun).GetComponent<ItemGunLaser>() == (Object)null || Field_StateTimeMax == null)
		{
			return;
		}
		float num;
		try
		{
			object value = Field_StateTimeMax.GetValue(gun);
			num = ((value is float) ? ((float)value) : 0f);
		}
		catch
		{
			return;
		}
		int key = MakeKey(gun, state);
		if (!OriginalStateTimeMax.ContainsKey(key) && num > 0f)
		{
			OriginalStateTimeMax[key] = num;
		}
		float num2 = num;
		if ((int)state == 3)
		{
			float value2;
			if (WeaponEnhancerMod.LaserContinuousFire.Value)
			{
				num2 = Mathf.Clamp(WeaponEnhancerMod.LaserShootDurationSeconds.Value, 0.25f, 999f);
			}
			else if (OriginalStateTimeMax.TryGetValue(key, out value2) && value2 > 0f)
			{
				num2 = value2;
			}
		}
		else if ((int)state == 4 || (int)state == 2)
		{
			float value3;
			if (WeaponEnhancerMod.LaserNoCooldown.Value)
			{
				num2 = 0.01f;
			}
			else if (OriginalStateTimeMax.TryGetValue(key, out value3) && value3 > 0f)
			{
				float num3 = Mathf.Clamp(WeaponEnhancerMod.LaserReloadSpeedMultiplier.Value, 0.1f, 10f);
				num2 = Mathf.Max(0.05f, value3 / num3);
			}
		}
		try
		{
			Field_StateTimeMax.SetValue(gun, num2);
		}
		catch
		{
		}
	}
}