Decompiled source of Menugun v1.2.0

Menugun.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using OpenShot;
using OpenShot.Events;
using OpenShot.UI;
using Shooterlatro.Core;
using Shooterlatro.Game;
using Shooterlatro.Input;
using Shooterlatro.Weapons;
using UnityEngine;
using UnityEngine.InputSystem;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("Menugun")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Dedicated menu pistol for Lucky Shot: high fire rate, outline look, one shot per click. Configure via OpenShot MODS hub.")]
[assembly: AssemblyFileVersion("1.2.0.0")]
[assembly: AssemblyInformationalVersion("1.2.0+4135dd1490a61fe647f2a0e54287f36471f5cf7f")]
[assembly: AssemblyProduct("Menugun")]
[assembly: AssemblyTitle("Menugun")]
[assembly: AssemblyVersion("1.2.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 Menugun
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.liamgaming.menugun", "Menugun", "1.2.0")]
	public class MenugunPlugin : BaseUnityPlugin
	{
		private struct RendererMaterialBackup
		{
			public Renderer Renderer;

			public Material[] Materials;
		}

		[HarmonyPatch(typeof(WeaponManager), "EquipWeapon")]
		private static class WeaponManager_EquipWeapon_Patch
		{
			private static void Postfix()
			{
				MenugunPlugin instance = Instance;
				if (!((Object)(object)instance == (Object)null) && IsMenuGunActive())
				{
					instance.ReapplyMenuGunState(forceOutline: true);
				}
			}
		}

		[HarmonyPatch(typeof(Weapon), "IsFiringInputHeld")]
		private static class Weapon_IsFiringInputHeld_Patch
		{
			private static void Postfix(ref bool __result)
			{
				if (IsMenuGunActive() && ForceSemiAuto.Value)
				{
					bool flag = Mouse.current != null && Mouse.current.leftButton.wasPressedThisFrame;
					ControllerInputService instance = ControllerInputService.Instance;
					bool flag2 = (Object)(object)instance != (Object)null && instance.WasFirePressedThisFrame();
					__result = flag || flag2;
				}
			}
		}

		[HarmonyPatch(typeof(Weapon), "PlayRecoil")]
		private static class Weapon_PlayRecoil_Patch
		{
			private static bool Prefix()
			{
				if (IsMenuGunActive())
				{
					return !DisableRecoil.Value;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(RecoilController), "ResolveBallistics")]
		private static class RecoilController_ResolveBallistics_Patch
		{
			private static bool Prefix(Vector3 baseDirection, ref RecoilBallisticsResult __result)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0023: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_0035: Unknown result type (might be due to invalid IL or missing references)
				//IL_003d: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_009b: Unknown result type (might be due to invalid IL or missing references)
				//IL_009c: Unknown result type (might be due to invalid IL or missing references)
				if (!IsMenuGunActive() || !DisableRecoil.Value)
				{
					return true;
				}
				Vector3 finalDirection = ((((Vector3)(ref baseDirection)).sqrMagnitude > 1E-06f) ? ((Vector3)(ref baseDirection)).normalized : Vector3.forward);
				__result = new RecoilBallisticsResult
				{
					FinalDirection = finalDirection,
					ChainIndex = 0,
					DidReset = false,
					RecoilHorizontalDeg = 0f,
					RecoilVerticalDeg = 0f,
					RecoilDeltaHorizontalDeg = 0f,
					RecoilDeltaVerticalDeg = 0f,
					ChainResetMs = 0f,
					SpreadDeg = 0f
				};
				return false;
			}
		}

		[HarmonyPatch(typeof(RecoilController), "OnShotFired")]
		private static class RecoilController_OnShotFired_Patch
		{
			private static bool Prefix()
			{
				if (IsMenuGunActive())
				{
					return !DisableRecoil.Value;
				}
				return true;
			}
		}

		public const string PluginGuid = "com.liamgaming.menugun";

		public const string PluginName = "Menugun";

		public const string PluginVersion = "1.2.0";

		private const string HologramShaderName = "Shooterlatro/HologramURP";

		private Harmony _harmony;

		private bool _menuModeActive;

		private bool _hadInfiniteAmmo;

		private bool _savedUseAutomaticFire;

		private WeaponData _savedAutomaticWeaponData;

		private readonly List<RendererMaterialBackup> _rendererBackups = new List<RendererMaterialBackup>();

		private readonly List<Material> _outlineMaterials = new List<Material>();

		private GameObject _lastOutlinedModel;

		private Shader _hologramShader;

		private static readonly string[] OutlinePresets = new string[7] { "Ice", "Cyan", "Magenta", "Gold", "Red", "White", "Lime" };

		public static MenugunPlugin Instance { get; private set; }

		public static ManualLogSource Log { get; private set; }

		public static ConfigEntry<bool> Enabled { get; private set; }

		public static ConfigEntry<float> MenuFireRate { get; private set; }

		public static ConfigEntry<bool> EnableOutline { get; private set; }

		public static ConfigEntry<bool> HideKeychain { get; private set; }

		public static ConfigEntry<bool> DisableRecoil { get; private set; }

		public static ConfigEntry<bool> ForceSemiAuto { get; private set; }

		public static ConfigEntry<bool> BasePistolOnly { get; private set; }

		public static ConfigEntry<float> RimIntensity { get; private set; }

		public static ConfigEntry<float> RimPower { get; private set; }

		public static ConfigEntry<float> BaseFill { get; private set; }

		public static ConfigEntry<float> OutlineBrightness { get; private set; }

		public static ConfigEntry<Color> OutlineColor { get; private set; }

		public static ConfigEntry<string> OutlinePreset { get; private set; }

		private void Awake()
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Expected O, but got Unknown
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Expected O, but got Unknown
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Expected O, but got Unknown
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Expected O, but got Unknown
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_0443: Unknown result type (might be due to invalid IL or missing references)
			//IL_044d: Expected O, but got Unknown
			//IL_048a: Unknown result type (might be due to invalid IL or missing references)
			Instance = this;
			Log = ((BaseUnityPlugin)this).Logger;
			Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Use the first pistol as a dedicated menu gun in menus.");
			MenuFireRate = ((BaseUnityPlugin)this).Config.Bind<float>("MenuGun", "FireRate", 30f, new ConfigDescription("Shots per second while the menu gun is active (still max 1 shot per click).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 60f), Array.Empty<object>()));
			EnableOutline = ((BaseUnityPlugin)this).Config.Bind<bool>("MenuGun", "EnableOutline", true, "Apply hologram outline look on the menu pistol.");
			HideKeychain = ((BaseUnityPlugin)this).Config.Bind<bool>("MenuGun", "HideKeychain", true, "Hide keychain/charm visuals while menu gun is active.");
			DisableRecoil = ((BaseUnityPlugin)this).Config.Bind<bool>("MenuGun", "DisableRecoil", true, "Suppress recoil / ballistics kick in menus.");
			ForceSemiAuto = ((BaseUnityPlugin)this).Config.Bind<bool>("MenuGun", "ForceSemiAuto", true, "Force one shot per click (disable automatic fire).");
			BasePistolOnly = ((BaseUnityPlugin)this).Config.Bind<bool>("MenuGun", "BasePistolOnly", true, "Prefer the base pistol (no skin variations) as menu gun.");
			RimIntensity = ((BaseUnityPlugin)this).Config.Bind<float>("MenuGun", "RimIntensity", 3f, new ConfigDescription("Outline edge strength (higher = stronger rim).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.5f, 5f), Array.Empty<object>()));
			RimPower = ((BaseUnityPlugin)this).Config.Bind<float>("MenuGun", "RimPower", 5.5f, new ConfigDescription("Outline thinness (higher = tighter edge, less fill).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 8f), Array.Empty<object>()));
			BaseFill = ((BaseUnityPlugin)this).Config.Bind<float>("MenuGun", "BaseFill", 0.03f, new ConfigDescription("Interior fill brightness. Keep near 0 for outline-only.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 0.35f), Array.Empty<object>()));
			OutlineBrightness = ((BaseUnityPlugin)this).Config.Bind<float>("MenuGun", "OutlineBrightness", 3.2f, new ConfigDescription("Hologram brightness multiplier for the outline material.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.5f, 8f), Array.Empty<object>()));
			OutlineColor = ((BaseUnityPlugin)this).Config.Bind<Color>("MenuGun", "OutlineColor", new Color(0.85f, 0.9f, 1f, 1f), "Rim / outline tint color.");
			OutlinePreset = ((BaseUnityPlugin)this).Config.Bind<string>("MenuGun", "OutlinePreset", "Ice", "Named outline color preset (Ice, Cyan, Magenta, Gold, Red, White, Lime).");
			ModMenu.Tab("Menugun").Toggle(Enabled).Info("— Behaviour —")
				.Float("Fire Rate", MenuFireRate, 1f, "F0")
				.Bool("Force Semi-Auto", ForceSemiAuto)
				.Bool("Disable Recoil", DisableRecoil)
				.Bool("Hide Keychain", HideKeychain)
				.Bool("Base Pistol Only", BasePistolOnly)
				.Info("— Outline —")
				.Bool("Enable Outline", EnableOutline)
				.Cycle("Color Preset", (Func<string>)(() => OutlinePreset.Value), (Action)CycleOutlinePreset)
				.Float("Rim Intensity", RimIntensity, 0.1f, "F1")
				.Float("Rim Power", RimPower, 0.1f, "F1")
				.Float("Base Fill", BaseFill, 0.01f, "F2")
				.Float("Brightness", OutlineBrightness, 0.1f, "F1")
				.Button("Reapply Look", (Action)delegate
				{
					if (IsMenuGunActive())
					{
						Instance?.ApplyOutlineIfNeeded(force: true);
					}
				});
			OutlinePreset.SettingChanged += delegate
			{
				ApplyOutlinePreset(OutlinePreset.Value);
			};
			ApplyOutlinePreset(OutlinePreset.Value);
			EnableOutline.SettingChanged += delegate
			{
				if (IsMenuGunActive())
				{
					if (EnableOutline.Value)
					{
						Instance?.ApplyOutlineIfNeeded(force: true);
					}
					else
					{
						Instance?.RestoreOriginalMaterials();
					}
				}
			};
			OpenShotApi.OnSettingsChanged += HandleSettingsChanged;
			_harmony = new Harmony("com.liamgaming.menugun");
			_harmony.PatchAll(typeof(MenugunPlugin).Assembly);
			GameEvents.OnGamePhaseChanged += HandleGamePhaseChanged;
			if ((Object)(object)GameManager.Instance != (Object)null && IsMenuPhase(GameManager.Instance.Phase))
			{
				EnterMenuGunMode();
			}
			Log.LogInfo((object)"Menugun v1.2.0 loaded (OpenShot 2.0.0).");
		}

		private static void CycleOutlinePreset()
		{
			int num = Array.IndexOf(OutlinePresets, OutlinePreset.Value);
			if (num < 0)
			{
				num = 0;
			}
			OutlinePreset.Value = OutlinePresets[(num + 1) % OutlinePresets.Length];
		}

		private static void ApplyOutlinePreset(string name)
		{
			//IL_0073: 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_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			ConfigEntry<Color> outlineColor = OutlineColor;
			outlineColor.Value = (Color)(name switch
			{
				"Cyan" => new Color(0.2f, 0.95f, 1f, 1f), 
				"Magenta" => new Color(1f, 0.25f, 0.9f, 1f), 
				"Gold" => new Color(1f, 0.82f, 0.25f, 1f), 
				"Red" => new Color(1f, 0.28f, 0.28f, 1f), 
				"White" => new Color(1f, 1f, 1f, 1f), 
				"Lime" => new Color(0.45f, 1f, 0.35f, 1f), 
				_ => new Color(0.85f, 0.9f, 1f, 1f), 
			});
			if (IsMenuGunActive() && EnableOutline.Value)
			{
				Instance?.ApplyOutlineIfNeeded(force: true);
			}
		}

		private void OnDestroy()
		{
			OpenShotApi.OnSettingsChanged -= HandleSettingsChanged;
			GameEvents.OnGamePhaseChanged -= HandleGamePhaseChanged;
			ExitMenuGunMode();
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			if ((Object)(object)Instance == (Object)(object)this)
			{
				Instance = null;
			}
		}

		private void Update()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			if (!Enabled.Value)
			{
				if (_menuModeActive)
				{
					ExitMenuGunMode();
				}
				return;
			}
			GameManager instance = GameManager.Instance;
			if (!((Object)(object)instance == (Object)null))
			{
				bool flag = IsMenuPhase(instance.Phase);
				if (flag && !_menuModeActive)
				{
					EnterMenuGunMode();
				}
				else if (!flag && _menuModeActive)
				{
					ExitMenuGunMode();
				}
			}
		}

		private static void HandleSettingsChanged(SettingsChangedContext ctx)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			if (string.Equals(ctx.ModTab, "Menugun", StringComparison.OrdinalIgnoreCase) && IsMenuGunActive())
			{
				Instance?.ReapplyMenuGunState();
			}
		}

		private void ReapplyMenuGunState(bool forceOutline = false)
		{
			EnsureMenuPistolEquipped();
			ApplyMenuStats();
			if (EnableOutline.Value)
			{
				ApplyOutlineIfNeeded(forceOutline);
			}
			else
			{
				RestoreOriginalMaterials();
			}
			SetKeychainHidden(HideKeychain.Value);
		}

		private void HandleGamePhaseChanged(GamePhaseChangedContext ctx)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			if (Enabled.Value && ctx != null)
			{
				if (IsMenuPhase(ctx.Current))
				{
					EnterMenuGunMode();
				}
				else if (_menuModeActive)
				{
					ExitMenuGunMode();
				}
			}
		}

		internal static bool IsMenuPhase(GamePhase phase)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Invalid comparison between Unknown and I4
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Invalid comparison between Unknown and I4
			if ((int)phase != 7)
			{
				return (int)phase == 9;
			}
			return true;
		}

		internal static bool IsMenuGunActive()
		{
			if ((Object)(object)Instance != (Object)null && Instance._menuModeActive)
			{
				return Enabled.Value;
			}
			return false;
		}

		private void EnterMenuGunMode()
		{
			if (_menuModeActive)
			{
				EnsureMenuPistolEquipped();
				ApplyMenuStats();
				if (EnableOutline.Value)
				{
					ApplyOutlineIfNeeded(force: true);
				}
				else
				{
					RestoreOriginalMaterials();
				}
				SetKeychainHidden(HideKeychain.Value);
				return;
			}
			Weapon instance = Weapon.Instance;
			if ((Object)(object)instance != (Object)null)
			{
				_hadInfiniteAmmo = instance.HasInfiniteAmmo;
			}
			_menuModeActive = true;
			EnsureMenuPistolEquipped();
			ApplyMenuStats();
			if (EnableOutline.Value)
			{
				ApplyOutlineIfNeeded(force: true);
			}
			SetKeychainHidden(HideKeychain.Value);
			Log.LogInfo((object)"Menu gun active.");
		}

		private void ExitMenuGunMode()
		{
			if (_menuModeActive)
			{
				RestoreOriginalMaterials();
				RestoreMenuStats();
				SetKeychainHidden(hidden: false);
				_menuModeActive = false;
				Log.LogInfo((object)"Menu gun deactivated.");
			}
		}

		private static void SetKeychainHidden(bool hidden)
		{
			WeaponManager instance = WeaponManager.Instance;
			if ((Object)(object)instance != (Object)null)
			{
				instance.SetKeychainCharmVisualsHidden(hidden);
			}
		}

		private void EnsureMenuPistolEquipped()
		{
			WeaponManager instance = WeaponManager.Instance;
			if (!((Object)(object)instance == (Object)null) && instance.AvailableWeapons != null && instance.AvailableWeapons.Count != 0)
			{
				WeaponData val = ResolveMenuPistol(instance);
				if (!((Object)(object)val == (Object)null) && (Object)(object)instance.CurrentWeaponData != (Object)(object)val)
				{
					instance.SwitchToWeapon(val);
				}
			}
		}

		private static WeaponData ResolveMenuPistol(WeaponManager manager)
		{
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			IReadOnlyList<WeaponData> availableWeapons = manager.AvailableWeapons;
			if (BasePistolOnly.Value)
			{
				for (int i = 0; i < availableWeapons.Count; i++)
				{
					WeaponData val = availableWeapons[i];
					if ((Object)(object)val != (Object)null && (int)val.weaponName == 0 && (Object)(object)val.variationOf == (Object)null)
					{
						return val;
					}
				}
			}
			for (int j = 0; j < availableWeapons.Count; j++)
			{
				WeaponData val2 = availableWeapons[j];
				if ((Object)(object)val2 != (Object)null && (int)val2.weaponName == 0)
				{
					return val2;
				}
			}
			return availableWeapons[0];
		}

		private void ApplyMenuStats()
		{
			Weapon instance = Weapon.Instance;
			if ((Object)(object)instance == (Object)null)
			{
				return;
			}
			float num = Mathf.Clamp(MenuFireRate.Value, 0.1f, 60f);
			Traverse.Create((object)instance).Field("_fireRate").SetValue((object)num);
			Traverse.Create((object)instance).Field("_cooldownSeconds").SetValue((object)0f);
			instance.SetInfiniteAmmo(true);
			WeaponData weaponData = instance.WeaponData;
			if ((Object)(object)weaponData != (Object)null && ForceSemiAuto.Value)
			{
				if ((Object)(object)_savedAutomaticWeaponData != (Object)(object)weaponData)
				{
					_savedUseAutomaticFire = weaponData.useAutomaticFire;
					_savedAutomaticWeaponData = weaponData;
				}
				weaponData.useAutomaticFire = false;
			}
		}

		private void RestoreMenuStats()
		{
			Weapon instance = Weapon.Instance;
			if ((Object)(object)instance != (Object)null)
			{
				if ((Object)(object)instance.WeaponData != (Object)null)
				{
					Traverse.Create((object)instance).Field("_fireRate").SetValue((object)Mathf.Clamp(instance.WeaponData.fireRate, 0.1f, 60f));
				}
				instance.SetInfiniteAmmo(_hadInfiniteAmmo);
			}
			if ((Object)(object)_savedAutomaticWeaponData != (Object)null)
			{
				_savedAutomaticWeaponData.useAutomaticFire = _savedUseAutomaticFire;
				_savedAutomaticWeaponData = null;
			}
		}

		private void ApplyOutlineIfNeeded(bool force)
		{
			WeaponManager instance = WeaponManager.Instance;
			if (!((Object)(object)instance == (Object)null))
			{
				GameObject value = Traverse.Create((object)instance).Field("_currentWeaponModel").GetValue<GameObject>();
				if (!((Object)(object)value == (Object)null) && (force || !((Object)(object)value == (Object)(object)_lastOutlinedModel) || _rendererBackups.Count <= 0))
				{
					RestoreOriginalMaterials();
					ApplyOutlineLook(value);
					_lastOutlinedModel = value;
				}
			}
		}

		private Shader ResolveHologramShader()
		{
			if ((Object)(object)_hologramShader != (Object)null)
			{
				return _hologramShader;
			}
			_hologramShader = Shader.Find("Shooterlatro/HologramURP");
			if ((Object)(object)_hologramShader == (Object)null)
			{
				Log.LogWarning((object)"Could not find shader 'Shooterlatro/HologramURP'. Outline look unavailable.");
			}
			return _hologramShader;
		}

		private void ApplyOutlineLook(GameObject model)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Expected O, but got Unknown
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			Shader val = ResolveHologramShader();
			if ((Object)(object)val == (Object)null || !EnableOutline.Value)
			{
				return;
			}
			Color value = OutlineColor.Value;
			float value2 = RimIntensity.Value;
			float value3 = RimPower.Value;
			float value4 = BaseFill.Value;
			float value5 = OutlineBrightness.Value;
			Renderer[] componentsInChildren = model.GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val2 in componentsInChildren)
			{
				if ((Object)(object)val2 == (Object)null)
				{
					continue;
				}
				Material[] materials = val2.materials;
				if (materials != null && materials.Length != 0)
				{
					_rendererBackups.Add(new RendererMaterialBackup
					{
						Renderer = val2,
						Materials = materials
					});
					Material[] array = (Material[])(object)new Material[materials.Length];
					for (int j = 0; j < materials.Length; j++)
					{
						Material val3 = new Material(val)
						{
							name = (((Object)(object)materials[j] != (Object)null) ? ((Object)materials[j]).name : "Weapon") + " (Menugun Outline)"
						};
						ConfigureOutlineMaterial(val3, value, value2, value3, value4, value5);
						array[j] = val3;
						_outlineMaterials.Add(val3);
					}
					val2.materials = array;
				}
			}
		}

		private static void ConfigureOutlineMaterial(Material mat, Color tint, float rim, float power, float fill, float brightness)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: 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)
			if (mat.HasProperty("_Tint"))
			{
				mat.SetColor("_Tint", tint);
			}
			if (mat.HasProperty("_Color"))
			{
				mat.SetColor("_Color", tint);
			}
			if (mat.HasProperty("_BaseColor"))
			{
				mat.SetColor("_BaseColor", tint);
			}
			if (mat.HasProperty("_Brightness"))
			{
				mat.SetFloat("_Brightness", brightness);
			}
			if (mat.HasProperty("_BaseIntensity"))
			{
				mat.SetFloat("_BaseIntensity", fill);
			}
			if (mat.HasProperty("_RimPower"))
			{
				mat.SetFloat("_RimPower", power);
			}
			if (mat.HasProperty("_RimIntensity"))
			{
				mat.SetFloat("_RimIntensity", rim);
			}
			if (mat.HasProperty("_GridIntensity"))
			{
				mat.SetFloat("_GridIntensity", 0f);
			}
			if (mat.HasProperty("_ScanIntensity"))
			{
				mat.SetFloat("_ScanIntensity", 0f);
			}
			if (mat.HasProperty("_NoiseIntensity"))
			{
				mat.SetFloat("_NoiseIntensity", 0f);
			}
			if (mat.HasProperty("_SoftFade"))
			{
				mat.SetFloat("_SoftFade", 0f);
			}
			if (mat.HasProperty("_UseMainTex"))
			{
				mat.SetFloat("_UseMainTex", 0f);
			}
			if (mat.HasProperty("_HueOnly"))
			{
				mat.SetFloat("_HueOnly", 1f);
			}
			if (mat.HasProperty("_Render_Over_Everything"))
			{
				mat.SetFloat("_Render_Over_Everything", 1f);
			}
			if (mat.HasProperty("_ZTest"))
			{
				mat.SetFloat("_ZTest", 4f);
			}
			if (mat.HasProperty("_ZWrite"))
			{
				mat.SetFloat("_ZWrite", 0f);
			}
			mat.EnableKeyword("_HUE_ONLY");
			mat.DisableKeyword("_USE_MAINTEX");
			mat.renderQueue = 4000;
		}

		private void RestoreOriginalMaterials()
		{
			for (int i = 0; i < _rendererBackups.Count; i++)
			{
				RendererMaterialBackup rendererMaterialBackup = _rendererBackups[i];
				if ((Object)(object)rendererMaterialBackup.Renderer != (Object)null && rendererMaterialBackup.Materials != null)
				{
					rendererMaterialBackup.Renderer.materials = rendererMaterialBackup.Materials;
				}
			}
			_rendererBackups.Clear();
			for (int j = 0; j < _outlineMaterials.Count; j++)
			{
				if ((Object)(object)_outlineMaterials[j] != (Object)null)
				{
					Object.Destroy((Object)(object)_outlineMaterials[j]);
				}
			}
			_outlineMaterials.Clear();
			_lastOutlinedModel = null;
		}
	}
}