Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of MoreGuns v1.3.0
MoreGunsMono.dll
Decompiled 2 days agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using HarmonyLib; using MelonLoader; using MelonLoader.Preferences; using ModManagerPhoneApp; using MoreGunsMono; using MoreGunsMono.Dialogue; using MoreGunsMono.Gui; using MoreGunsMono.Guns; using MoreGunsMono.Patches; using MoreGunsMono.Sync; using ScheduleOne; using ScheduleOne.Audio; using ScheduleOne.AvatarFramework; using ScheduleOne.AvatarFramework.Equipping; using ScheduleOne.DevUtilities; using ScheduleOne.Dialogue; using ScheduleOne.Equipping; using ScheduleOne.FX; using ScheduleOne.ItemFramework; using ScheduleOne.Levelling; using ScheduleOne.NPCs; using ScheduleOne.Networking; using ScheduleOne.PlayerScripts; using ScheduleOne.Tools; using ScheduleOne.Trash; using ScheduleOne.UI; using Steamworks; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(MoreGunsMod), "MoreGuns", "1.2.0", "Voidane", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: AssemblyTitle("MoreGunsMono")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MoreGunsMono")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("0acfbd7a-0bd3-4fb9-b8ae-1bee6f4573e3")] [assembly: AssemblyFileVersion("1.2.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.2.0.0")] namespace MoreGunsMono { public static class Config { public static string folderPath = "UserData/MoreGuns.cfg"; public const string PREFIX = "MoreGuns"; public static MelonPreferences_Category Category { get; private set; } public static MelonPreferences_Entry<bool> EnableCrosshairForGuns { get; private set; } public static void Initialize() { Category = MelonPreferences.CreateCategory("MoreGuns-! User Settings"); EnableCrosshairForGuns = Category.CreateEntry<bool>("Allow Gun Crosshair", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); Category.SetFilePath(folderPath); Category.SaveToFile(true); } } public class GunConfiguration { public static string folderPath = "UserData/MoreGuns.cfg"; public string ID { get; private set; } public MelonPreferences_Category Category { get; private set; } public MelonPreferences_Entry<float> Damage { get; private set; } public MelonPreferences_Entry<float> ImpactForce { get; private set; } public MelonPreferences_Entry<float> AimFOVReduction { get; private set; } public MelonPreferences_Entry<float> AccuracyChangeDuration { get; private set; } public MelonPreferences_Entry<int> MagazineSize { get; private set; } public MelonPreferences_Entry<string> DisplayItemName { get; private set; } public MelonPreferences_Entry<string> DisplayDescription { get; private set; } public MelonPreferences_Entry<Color> LabelDisplayColor { get; private set; } public MelonPreferences_Entry<ELegalStatus> LegalStatus { get; private set; } public MelonPreferences_Entry<FullRank> RequiredRank { get; private set; } public MelonPreferences_Entry<string> MagDisplayItemName { get; private set; } public MelonPreferences_Entry<string> MagDisplayDescription { get; private set; } public MelonPreferences_Entry<Color> MagLabelDisplayColor { get; private set; } public MelonPreferences_Entry<ELegalStatus> MagLegalStatus { get; private set; } public MelonPreferences_Entry<FullRank> MagRequiredRank { get; private set; } public MelonPreferences_Entry<float> PurchasePrice { get; private set; } public MelonPreferences_Entry<float> MagPurchasePrice { get; private set; } public MelonPreferences_Entry<string> ItemName { get; private set; } public MelonPreferences_Entry<string> MagItemName { get; private set; } public MelonPreferences_Entry<bool> Available { get; private set; } public MelonPreferences_Entry<bool> MagAvailable { get; private set; } public MelonPreferences_Entry<string> AvailableReason { get; private set; } public MelonPreferences_Entry<string> MagAvailableReason { get; private set; } public event Action OnSettingChanged; public GunConfiguration(WeaponBase weapon) { string iD = weapon.ID; string text = "MoreGuns-" + iD + " Settings"; string text2 = iD + " Settings"; Category = MelonPreferences.CreateCategory(text, text2); InitializePreferences(iD, weapon); Category.SetFilePath(folderPath); Category.SaveToFile(true); MelonLogger.Msg("Loaded configuration for " + iD + " from: " + folderPath); } private void InitializePreferences(string ID, WeaponBase weapon) { //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) Equippable_RangedWeapon gunRangedWeapon = weapon.gunRangedWeapon; Damage = Category.CreateEntry<float>(ID + " Damage", gunRangedWeapon.Damage, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); ImpactForce = Category.CreateEntry<float>(ID + " Impact Force", gunRangedWeapon.ImpactForce, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); AimFOVReduction = Category.CreateEntry<float>(ID + " Aim FOV Reduction", gunRangedWeapon.AimFOVReduction, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); AccuracyChangeDuration = Category.CreateEntry<float>(ID + " Accuracy Change Duration", gunRangedWeapon.AccuracyChangeDuration, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); MagazineSize = Category.CreateEntry<int>(ID + " Magazine Size", gunRangedWeapon.MagazineSize, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); IntegerItemDefinition gunIntItemDef = weapon.gunIntItemDef; DisplayItemName = Category.CreateEntry<string>(ID + " Display Name", ((ItemDefinition)gunIntItemDef).Name, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); DisplayDescription = Category.CreateEntry<string>(ID + " Display Description", ((ItemDefinition)gunIntItemDef).Description, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); LabelDisplayColor = Category.CreateEntry<Color>(ID + " Label Color", ((ItemDefinition)gunIntItemDef).LabelDisplayColor, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); LegalStatus = Category.CreateEntry<ELegalStatus>(ID + " Legal Status", ((ItemDefinition)gunIntItemDef).legalStatus, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); RequiredRank = Category.CreateEntry<FullRank>(ID + " Required Rank", ((StorableItemDefinition)gunIntItemDef).RequiredRank, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); IntegerItemDefinition magIntItemDef = weapon.magIntItemDef; MagDisplayItemName = Category.CreateEntry<string>(ID + " Mag Display Name", ((ItemDefinition)magIntItemDef).Name, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); MagDisplayDescription = Category.CreateEntry<string>(ID + " Mag Display Description", ((ItemDefinition)magIntItemDef).Description, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); MagLabelDisplayColor = Category.CreateEntry<Color>(ID + " Mag Label Color", ((ItemDefinition)magIntItemDef).LabelDisplayColor, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); MagLegalStatus = Category.CreateEntry<ELegalStatus>(ID + " Mag Legal Status", (ELegalStatus)0, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); MagRequiredRank = Category.CreateEntry<FullRank>(ID + " Mag Required Rank", new FullRank((ERank)8, 3), (string)null, (string)null, false, false, (ValueValidator)null, (string)null); Shopping gunShop = weapon.gunShop; PurchasePrice = Category.CreateEntry<float>(ID + " Price", gunShop.purchasePrice, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); ItemName = Category.CreateEntry<string>(ID + " Name", gunShop.displayName, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); Available = Category.CreateEntry<bool>(ID + " Shop Availability", gunShop.available, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); AvailableReason = Category.CreateEntry<string>(ID + " Non-Available Reason", gunShop.nonAvailableReason, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); Shopping magShop = weapon.magShop; MagPurchasePrice = Category.CreateEntry<float>(ID + " Magazine Price", magShop.purchasePrice, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); MagItemName = Category.CreateEntry<string>(ID + " Magazine Name", magShop.displayName, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); MagAvailable = Category.CreateEntry<bool>(ID + " Magazine Shop Availability", magShop.available, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); MagAvailableReason = Category.CreateEntry<string>(ID + " Magazine Non-Available Reason", magShop.nonAvailableReason, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); } public void HandleSettingsUpdate() { MelonLogger.Msg("Updating More Guns Settings"); Category.LoadFromFile(true); this.OnSettingChanged?.Invoke(); } } [Serializable] public class GunConfigData { public string ID; public float Damage; public float ImpactForce; public float AimFOVReduction; public float AccuracyChangeDuration; public int MagazineSize; public string DisplayItemName; public string DisplayDescription; public Color LabelDisplayColor; public ELegalStatus LegalStatus; public FullRank RequiredRank; public string MagDisplayItemName; public string MagDisplayDescription; public Color MagLabelDisplayColor; public ELegalStatus MagLegalStatus; public FullRank MagRequiredRank; public float PurchasePrice; public float MagPurchasePrice; public string ItemName; public string MagItemName; public bool Available; public bool MagAvailable; public string AvailableReason; public string MagAvailableReason; public string ToJson() { return JsonUtility.ToJson((object)this); } public static GunConfigData FromJson(string json) { try { return JsonUtility.FromJson<GunConfigData>(json); } catch (Exception ex) { MelonLogger.Error("Failed to parse gun config data: " + ex.Message); return null; } } public static GunConfigData FromConfig(GunConfiguration config) { //IL_0090: 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_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) return new GunConfigData { ID = config.ID, Damage = config.Damage.Value, ImpactForce = config.ImpactForce.Value, AimFOVReduction = config.AimFOVReduction.Value, AccuracyChangeDuration = config.AccuracyChangeDuration.Value, MagazineSize = config.MagazineSize.Value, DisplayItemName = config.DisplayItemName.Value, DisplayDescription = config.DisplayDescription.Value, LabelDisplayColor = config.LabelDisplayColor.Value, LegalStatus = config.LegalStatus.Value, RequiredRank = config.RequiredRank.Value, MagDisplayItemName = config.MagDisplayItemName.Value, MagDisplayDescription = config.MagDisplayDescription.Value, MagLabelDisplayColor = config.MagLabelDisplayColor.Value, MagLegalStatus = config.MagLegalStatus.Value, MagRequiredRank = config.MagRequiredRank.Value, PurchasePrice = config.PurchasePrice.Value, MagPurchasePrice = config.MagPurchasePrice.Value, ItemName = config.ItemName.Value, MagItemName = config.MagItemName.Value, Available = config.Available.Value, MagAvailable = config.MagAvailable.Value, AvailableReason = config.AvailableReason.Value, MagAvailableReason = config.MagAvailableReason.Value }; } } public class MoreGunsMod : MelonMod { public static Transform map; public static Transform container; public static Transform midcanal; public static Transform stanNPC; public static AssetBundle assetBundle; public static bool isInitialized; public static Harmony harmony; public override void OnInitializeMelon() { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown MelonLogger.Msg("MoreGuns Is Initializing"); MelonLogger.Msg("Thank you for using More Guns! Discord: discord.gg/XB7ruKtJje"); Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MoreGunsMono.voidanesguns"); if (manifestResourceStream == null) { MelonLogger.Error("Could not find manifest resource stream. MoreGuns will not run."); isInitialized = false; return; } harmony = new Harmony("com.voidane.moreguns"); harmony.PatchAll(); MelonLogger.Msg("All harmony patches patched."); assetBundle = AssetBundle.LoadFromStream(manifestResourceStream); manifestResourceStream.Close(); if ((Object)(object)assetBundle != (Object)null) { isInitialized = true; MelonLogger.Msg("Assetbundle loaded in."); Config.Initialize(); new AK47(); new MiniGun(); TryLoadingDependencies(); } else { MelonLogger.Error("Assetbundle was not loaded in. MoreGuns will not run."); MelonLogger.Warning("All patches were unpatched."); StopProcess(); } } public override void OnApplicationQuit() { harmony.UnpatchSelf(); } private static void TryLoadingDependencies() { try { MelonLogger.Msg("Subscribing to all guns configuration events to phone manager"); foreach (WeaponBase allWeapon in WeaponBase.allWeapons) { allWeapon.config.OnSettingChanged += allWeapon.ApplySettingsFromConfig; ModSettingsEvents.OnPreferencesSaved += allWeapon.config.HandleSettingsUpdate; } } catch (Exception ex) { MelonLogger.Warning(ex.Message ?? ""); } } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { if (sceneName == "Main") { NetworkController.SyncConfiguration(); Reticle.Initialize(); Transform transform = GameObject.Find("UI/HUD").transform; ReloadMessage.Initialize(transform); WindupIndicator.Initialize(transform); } else { ItemRegistryPatch.isWeaponsRegistered = false; } } public static void StopProcess() { harmony.UnpatchSelf(); isInitialized = false; } } public static class Resource { private static Dictionary<string, Object> _customResources = new Dictionary<string, Object>(StringComparer.OrdinalIgnoreCase); public static void RegisterAsset(string path, Object asset) { _customResources[path] = asset; MelonLogger.Msg("Registered custom asset at path: " + path); } public static Object TryGetAsset(string path) { if (_customResources.TryGetValue(path, out var value)) { return value; } return null; } } public struct Shopping { public float purchasePrice; public string displayName; public bool available; public string nonAvailableReason; } public static class Tools { public static class Color { public static Color StringRGBAToColor(string rgba) { //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) string text = rgba.Replace("RGBA(", "").Replace(")", ""); string[] array = text.Split(new char[1] { ',' }); if (!float.TryParse(array[0].Trim(), out var result)) { throw new ArgumentException("Could not parse RGBA value"); } if (!float.TryParse(array[1].Trim(), out var result2)) { throw new ArgumentException("Could not parse RGBA value"); } if (!float.TryParse(array[2].Trim(), out var result3)) { throw new ArgumentException("Could not parse RGBA value"); } if (!float.TryParse(array[3].Trim(), out var result4)) { throw new ArgumentException("Could not parse RGBA value"); } return new Color(result, result2, result3, result4); } } public static class LegalStatus { public static ELegalStatus StringConvertToELegalStatus(string eLegalStatus) { //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_001e: Unknown result type (might be due to invalid IL or missing references) if (Enum.TryParse<ELegalStatus>(eLegalStatus, out ELegalStatus result)) { return result; } throw new ArgumentException("Error in converting ELegalStatus."); } } public static class Rank { public static FullRank StringConvertToFullRank(string pRank) { //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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_00f2: Unknown result type (might be due to invalid IL or missing references) string[] array = pRank.Split(new char[1] { ' ' }); if (array.Length != 2) { throw new ArgumentException("Error in amount of arguments for FullRank Convet."); } string value = array[0].Trim(); string text = array[1].Trim(); if (!Enum.TryParse<ERank>(value, out ERank result)) { throw new ArgumentException("Error in converting FullRank Rank."); } int num = 1; num = text switch { "I" => 1, "II" => 2, "III" => 3, "IV" => 4, "V" => 5, _ => throw new ArgumentException("Error in converting FullRank Tier. Was not a"), }; FullRank result2 = default(FullRank); result2.Rank = result; result2.Tier = num; return result2; } } } } namespace MoreGunsMono.Sync { public static class NetworkController { [CompilerGenerated] private sealed class <SyncHostToLobbyPayload>d__11 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; private List<WeaponBase>.Enumerator <>s__1; private WeaponBase <weapon>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <SyncHostToLobbyPayload>d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <>s__1 = default(List<WeaponBase>.Enumerator); <weapon>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0222: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_02ab: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -3; goto IL_0096; } <>1__state = -1; <>s__1 = WeaponBase.allWeapons.GetEnumerator(); <>1__state = -3; goto IL_040c; IL_0096: if (!<weapon>5__2.IsConfigurationFinished) { MelonLogger.Msg("config not ready"); <>2__current = (object)new WaitForSeconds(0.05f); <>1__state = 1; return true; } MelonLogger.Msg("Adding new gun"); payload.Append("@" + <weapon>5__2.ID + ":" + $"{<weapon>5__2.gunRangedWeapon.Damage}:" + $"{<weapon>5__2.gunRangedWeapon.ImpactForce}:" + $"{<weapon>5__2.gunRangedWeapon.AimFOVReduction}:" + $"{<weapon>5__2.gunRangedWeapon.AccuracyChangeDuration}:" + $"{<weapon>5__2.gunRangedWeapon.MagazineSize}" + ":" + ((ItemDefinition)<weapon>5__2.gunIntItemDef).Name + ":" + ((ItemDefinition)<weapon>5__2.gunIntItemDef).Description + ":" + $"{((ItemDefinition)<weapon>5__2.gunIntItemDef).LabelDisplayColor}:" + $"{((ItemDefinition)<weapon>5__2.gunIntItemDef).legalStatus}:" + $"{((StorableItemDefinition)<weapon>5__2.gunIntItemDef).RequiredRank}" + ":" + ((ItemDefinition)<weapon>5__2.magIntItemDef).Name + ":" + ((ItemDefinition)<weapon>5__2.magIntItemDef).Description + ":" + $"{((ItemDefinition)<weapon>5__2.magIntItemDef).LabelDisplayColor}:" + $"{((ItemDefinition)<weapon>5__2.magIntItemDef).legalStatus}:" + $"{((StorableItemDefinition)<weapon>5__2.magIntItemDef).RequiredRank}" + ":" + <weapon>5__2.rangedGun.Name + ":" + $"{<weapon>5__2.rangedGun.Price}:" + $"{<weapon>5__2.rangedGun.IsAvailable}:" + <weapon>5__2.rangedGun.NotAvailableReason + ":" + <weapon>5__2.ammoGun.Name + ":" + $"{<weapon>5__2.ammoGun.Price}:" + $"{<weapon>5__2.ammoGun.IsAvailable}:" + <weapon>5__2.ammoGun.NotAvailableReason); MelonLogger.Msg("init " + <weapon>5__2.ID); <weapon>5__2 = null; goto IL_040c; IL_040c: if (<>s__1.MoveNext()) { <weapon>5__2 = <>s__1.Current; <weapon>5__2.ApplySettingsFromConfig(); goto IL_0096; } <>m__Finally1(); <>s__1 = default(List<WeaponBase>.Enumerator); return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; ((IDisposable)<>s__1).Dispose(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <WaitOnLobbyPayload>d__10 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; private string <data>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitOnLobbyPayload>d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <data>5__1 = null; <>1__state = -2; } private bool MoveNext() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; <data>5__1 = null; break; } MelonLogger.Msg("Getting lobby info"); <data>5__1 = SteamMatchmaking.GetLobbyData(Singleton<Lobby>.Instance.LobbySteamID, "MoreGunsConfig"); MelonLogger.Msg("Lobby data fetched: " + <data>5__1); if (!string.IsNullOrEmpty(<data>5__1)) { MelonLogger.Msg("payload: " + payload.ToString()); HostToClientConfigurationSync(<data>5__1); return false; } MelonLogger.Msg("Waiting for payload."); <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private const string IDENTIFICATION_PREFIX = "moreguns_settings"; private static readonly string version = typeof(MoreGunsMod).Assembly.GetName().Version.ToString(); public static StringBuilder payload; public static bool forceHost = false; public static bool forceClient = false; public static bool IsSynced { get; private set; } = false; public static void SyncConfiguration() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) Lobby instance = Singleton<Lobby>.Instance; bool flag = instance != null && instance.IsHost; Lobby instance2 = Singleton<Lobby>.Instance; int num; if (instance2 != null && !instance2.IsHost) { Lobby instance3 = Singleton<Lobby>.Instance; num = ((instance3 != null && instance3.IsInLobby) ? 1 : 0); } else { num = 0; } bool flag2 = (byte)num != 0; MelonLogger.Msg($"Player joined with ID: {Singleton<Lobby>.Instance.LocalPlayerID}. Syncing configuration file."); payload = new StringBuilder(); payload.Append("moreguns_settings_" + version + "|"); if ((flag && !forceClient) || forceHost) { MelonLogger.Msg("Host loaded!"); MelonCoroutines.Start(SyncHostToLobbyPayload()); MelonLogger.Msg("Attempting to send payload"); Singleton<Lobby>.Instance.SetLobbyData("MoreGunsConfig", payload.ToString()); MelonLogger.Msg("Sent payload to netowkrk: " + payload.ToString()); return; } if ((flag2 && !forceHost) || forceClient) { MelonLogger.Msg("Client loaded!"); MelonCoroutines.Start(WaitOnLobbyPayload()); return; } MelonLogger.Msg("Singleplayer"); foreach (WeaponBase allWeapon in WeaponBase.allWeapons) { allWeapon.ApplySettingsFromConfig(); } MelonCoroutines.Start(SyncHostToLobbyPayload()); } [IteratorStateMachine(typeof(<WaitOnLobbyPayload>d__10))] public static IEnumerator WaitOnLobbyPayload() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitOnLobbyPayload>d__10(0); } [IteratorStateMachine(typeof(<SyncHostToLobbyPayload>d__11))] private static IEnumerator SyncHostToLobbyPayload() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <SyncHostToLobbyPayload>d__11(0); } private static void HostToClientConfigurationSync(string data) { //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02d2: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02e0: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: Unknown result type (might be due to invalid IL or missing references) //IL_0316: Unknown result type (might be due to invalid IL or missing references) //IL_0318: Unknown result type (might be due to invalid IL or missing references) //IL_0324: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_0332: Unknown result type (might be due to invalid IL or missing references) //IL_0334: Unknown result type (might be due to invalid IL or missing references) MelonLogger.Msg(data ?? ""); string[] array = (from item in data.Split(new char[1] { '|' }) where !string.IsNullOrEmpty(item) select item).ToArray(); if (!IsModValidForSync(array[0])) { MelonLogger.Warning("MoreGuns is outdated with the host or server."); MelonLogger.Warning("Your Version: moreguns_settings_" + version + ", Host Version: " + array[0]); } string[] array2 = (from item in array[1].Split(new char[1] { '@' }) where !string.IsNullOrEmpty(item) select item).ToArray(); string[] array3 = array2; foreach (string text in array3) { int num = 0; string[] array4 = text.Split(new char[1] { ':' }); if (!WeaponBase.weaponsByName.TryGetValue(array4[0], out var value) || !float.TryParse(array4[1], out var result) || !float.TryParse(array4[2], out var result2) || !float.TryParse(array4[3], out var result3) || !float.TryParse(array4[4], out var result4) || !int.TryParse(array4[5], out var result5)) { continue; } string name = array4[6]; string description = array4[7]; Color labelDisplayColor = Tools.Color.StringRGBAToColor(array4[8]); ELegalStatus legalStatus = Tools.LegalStatus.StringConvertToELegalStatus(array4[9]); FullRank requiredRank = Tools.Rank.StringConvertToFullRank(array4[10]); string name2 = array4[11]; string description2 = array4[12]; Color labelDisplayColor2 = Tools.Color.StringRGBAToColor(array4[13]); ELegalStatus legalStatus2 = Tools.LegalStatus.StringConvertToELegalStatus(array4[14]); FullRank requiredRank2 = Tools.Rank.StringConvertToFullRank(array4[15]); string name3 = array4[16]; if (float.TryParse(array4[17], out var result6) && bool.TryParse(array4[18], out var result7)) { string notAvailableReason = array4[19]; string name4 = array4[20]; if (float.TryParse(array4[21], out var result8) && bool.TryParse(array4[22], out var result9)) { string notAvailableReason2 = array4[23]; value.gunRangedWeapon.Damage = result; value.gunRangedWeapon.ImpactForce = result2; value.gunRangedWeapon.AimFOVReduction = result3; value.gunRangedWeapon.AccuracyChangeDuration = result4; value.gunRangedWeapon.MagazineSize = result5; ((ItemDefinition)value.gunIntItemDef).Name = name; ((ItemDefinition)value.gunIntItemDef).Description = description; ((ItemDefinition)value.gunIntItemDef).LabelDisplayColor = labelDisplayColor; ((ItemDefinition)value.gunIntItemDef).legalStatus = legalStatus; ((StorableItemDefinition)value.gunIntItemDef).RequiredRank = requiredRank; ((ItemDefinition)value.magIntItemDef).Name = name2; ((ItemDefinition)value.magIntItemDef).Description = description2; ((ItemDefinition)value.magIntItemDef).LabelDisplayColor = labelDisplayColor2; ((ItemDefinition)value.magIntItemDef).legalStatus = legalStatus2; ((StorableItemDefinition)value.magIntItemDef).RequiredRank = requiredRank2; value.rangedGun.Name = name3; value.rangedGun.Price = result6; value.rangedGun.IsAvailable = result7; value.rangedGun.NotAvailableReason = notAvailableReason; value.ammoGun.Name = name4; value.ammoGun.Price = result8; value.ammoGun.IsAvailable = result9; value.ammoGun.NotAvailableReason = notAvailableReason2; } } } } private static bool IsModValidForSync(string pIdentify) { string text = "moreguns_settings_" + version; return pIdentify == text; } } } namespace MoreGunsMono.Patches { [HarmonyPatch] public static class BulletTrailPatch { [HarmonyPatch(typeof(FXManager), "CreateBulletTrail")] [HarmonyPrefix] public static bool Prefix(FXManager __instance, Vector3 start, Vector3 dir, float speed, float range, LayerMask mask) { return false; } } [HarmonyPatch] public static class CameraJoltPatch { public static string ID = ""; [HarmonyPatch(typeof(PlayerCamera), "JoltCamera")] [HarmonyPrefix] public static bool Prefix(PlayerCamera __instance) { if (WeaponBase.weaponsByName.TryGetValue(ID, out var value)) { if (!value.settings.cameraJolt) { return false; } return true; } return true; } [HarmonyPatch(typeof(Equippable_RangedWeapon), "Fire")] [HarmonyPrefix] public static void Prefix(Equippable_RangedWeapon __instance) { ID = ((Object)((Component)__instance).gameObject).name.Replace("_Equippable(Clone)", "").ToLower(); } } [HarmonyPatch] public static class DialoguePatch { public static bool called; [HarmonyPatch(typeof(DialogueHandler), "ShowNode")] [HarmonyPrefix] public static void Prefix(DialogueHandler __instance, DialogueNodeData node) { //IL_0039: 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_0049: 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_0064: Expected O, but got Unknown if (!called && node.Guid == "925ea1d9-9b7e-47a0-b016-6a3b787290c3") { List<DialogueChoiceData> list = node.choices.ToList(); DialogueChoiceData item = list[3]; list[3] = new DialogueChoiceData { Guid = "voiddial-stan-guns-opti-reloadmultgn", ChoiceText = "Reload Guns", ChoiceLabel = "Reload Guns" }; list.Add(item); node.choices = list.ToArray(); called = true; } } [HarmonyPatch(typeof(DialogueController_ArmsDealer), "ChoiceCallback")] [HarmonyPrefix] public static void Prefix(DialogueController_ArmsDealer __instance, string choiceLabel) { if (choiceLabel == "Reload Guns") { StanDialogue.StartSpecialGunReloads(); } } } [HarmonyPatch] public static class Equippale_RangedWeaponPatch { private static float timeSinceLastAutoFire; private static float timeSinceWindingUp; [HarmonyPatch(typeof(Equippable_RangedWeapon), "UpdateInput")] [HarmonyPostfix] public static void Postfix(Equippable_RangedWeapon __instance) { GunSettings gunSettings = default(GunSettings); if (Time.timeScale == 0f || Singleton<PauseMenu>.Instance.IsPaused || !((Component)__instance).gameObject.TryGetComponent<GunSettings>(ref gunSettings)) { return; } bool button = GameInput.GetButton((ButtonCode)0); bool button2 = GameInput.GetButton((ButtonCode)1); if (gunSettings.requiredWindup) { PlayAnimation component = ((Component)((Component)__instance).transform.GetChild(0)).GetComponent<PlayAnimation>(); AudioSourceController component2 = ((Component)((Component)component).transform.Find("Windup Sound")).GetComponent<AudioSourceController>(); AudioSourceController component3 = ((Component)((Component)component).transform.Find("Shutdown Sound")).GetComponent<AudioSourceController>(); timeSinceWindingUp += Time.deltaTime; WindupIndicator.SetValueByTime(timeSinceWindingUp, gunSettings.windupTime); if (button2) { if (timeSinceWindingUp <= gunSettings.windupTime || !button) { component.Play("MiniGun Windup"); if (!component2.isPlaying) { component2.Play(); } } } else { WindupIndicator.SetValue(0); timeSinceWindingUp = 0f; component2.Stop(); } } if ((!gunSettings.isAutomatic || !gunSettings.requiredWindup || !(timeSinceWindingUp > gunSettings.windupTime)) && (!gunSettings.isAutomatic || gunSettings.requiredWindup)) { return; } timeSinceLastAutoFire += Time.deltaTime; if (button) { if (!(timeSinceLastAutoFire >= __instance.FireCooldown)) { return; } timeSinceLastAutoFire = 0f; if ((bool)AccessTools.Method(typeof(Equippable_RangedWeapon), "CanFire", (Type[])null, (Type[])null).Invoke(__instance, new object[1] { false }) && __instance.Ammo > 0) { if (!__instance.MustBeCocked || __instance.IsCocked) { AccessTools.Method(typeof(Equippable_RangedWeapon), "Fire", (Type[])null, (Type[])null).Invoke(__instance, null); } else { AccessTools.Method(typeof(Equippable_RangedWeapon), "Cock", (Type[])null, (Type[])null).Invoke(__instance, null); } } } else { timeSinceLastAutoFire = __instance.FireCooldown; } } [HarmonyPatch(typeof(Equippable_RangedWeapon), "Fire")] [HarmonyPrefix] public static bool Prefix(Equippable_RangedWeapon __instance) { GunSettings gunSettings = default(GunSettings); if (((Component)__instance).gameObject.TryGetComponent<GunSettings>(ref gunSettings) && gunSettings.requiredWindup && timeSinceWindingUp < gunSettings.windupTime) { return false; } return true; } } [HarmonyPatch(typeof(Registry), "_GetItem")] public static class ItemRegistryPatch { public static bool isWeaponsRegistered; public static void Prefix(Registry __instance, string ID) { if (!isWeaponsRegistered) { foreach (WeaponBase allWeapon in WeaponBase.allWeapons) { __instance.AddToRegistry((ItemDefinition)(object)allWeapon.magIntItemDef); MelonLogger.Msg("Registered " + allWeapon.ID + " magazine item def"); __instance.AddToRegistry((ItemDefinition)(object)allWeapon.gunIntItemDef); MelonLogger.Msg("Registered " + allWeapon.ID + " item def"); } } isWeaponsRegistered = true; } } [HarmonyPatch] public static class RangedWeaponEquipPatch { [HarmonyPatch(typeof(Equippable_RangedWeapon), "Equip")] [HarmonyPostfix] public static void PostfixEquip(Equippable_RangedWeapon __instance) { Reticle.reticle.SetActive(Config.EnableCrosshairForGuns.Value); GunSettings component = ((Component)__instance).GetComponent<GunSettings>(); if ((Object)(object)component != (Object)null) { if (component.requiredWindup) { WindupIndicator.Show(shown: true); } PlayerSingleton<PlayerMovement>.Instance.MoveSpeedMultiplier = component.speedMultiplier; } } [HarmonyPatch(typeof(Equippable_RangedWeapon), "Unequip")] [HarmonyPostfix] public static void PostfixUnequip(Equippable_RangedWeapon __instance) { Reticle.reticle.SetActive(false); WindupIndicator.Show(shown: false); PlayerSingleton<PlayerMovement>.Instance.MoveSpeedMultiplier = 1f; } } [HarmonyPatch] public static class ReloadingPatch { [HarmonyPatch(typeof(Equippable_RangedWeapon), "Reload")] [HarmonyPrefix] public static bool Prefix(Equippable_RangedWeapon __instance) { GunSettings component = ((Component)__instance).gameObject.GetComponent<GunSettings>(); if ((Object)(object)component != (Object)null && !component.canManuallyReload) { ReloadMessage.Show(show: true); return false; } return true; } } [HarmonyPatch] public static class SetAnimationPatch { } [HarmonyPatch] public static class SetEquippablePatch { [HarmonyPatch(typeof(Avatar), "SetEquippable")] [HarmonyPrefix] public static bool Prefix(ref AvatarEquippable __result, string assetPath, Avatar __instance) { Object obj = Resources.Load(assetPath); GameObject val = (GameObject)(object)((obj is GameObject) ? obj : null); if ((Object)(object)val != (Object)null) { return true; } if (string.IsNullOrEmpty(assetPath)) { return true; } if ((Object)(object)__instance.CurrentEquippable != (Object)null) { __instance.CurrentEquippable.Unequip(); } Object obj2 = Resource.TryGetAsset(assetPath); GameObject val2 = (GameObject)(object)((obj2 is GameObject) ? obj2 : null); if ((Object)(object)val2 == (Object)null) { MelonLogger.Error("asset couldntbe found"); } GameObject val3 = Object.Instantiate<GameObject>(val2, (Transform)null); AvatarEquippable component = val3.GetComponent<AvatarEquippable>(); if ((Object)(object)component == (Object)null) { MelonLogger.Msg("avatar equip was null"); } AccessTools.Property(typeof(Avatar), "CurrentEquippable").SetValue(__instance, component); component.Equip(__instance); __result = component; return false; } } [HarmonyPatch] public static class StanNPCPatch { [CompilerGenerated] private sealed class <InitializeStore>d__2 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public Stan __instance; private DialogueController_ArmsDealer <dialogueController_ArmsDealer>5__1; private FieldInfo <allWeaponsFields>5__2; private List<WeaponOption> <allWeapons>5__3; private List<WeaponBase>.Enumerator <>s__4; private WeaponBase <weapon>5__5; private List<WeaponBase>.Enumerator <>s__6; private WeaponBase <weapon>5__7; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <InitializeStore>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <dialogueController_ArmsDealer>5__1 = null; <allWeaponsFields>5__2 = null; <allWeapons>5__3 = null; <>s__4 = default(List<WeaponBase>.Enumerator); <weapon>5__5 = null; <>s__6 = default(List<WeaponBase>.Enumerator); <weapon>5__7 = null; <>1__state = -2; } private bool MoveNext() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; goto IL_005a; case 1: <>1__state = -1; goto IL_005a; case 2: { <>1__state = -1; break; } IL_005a: if (!ItemRegistryPatch.isWeaponsRegistered) { MelonLogger.Msg("Attempting to setup stan store, waiting on registries!"); <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; } if ((Object)(object)MoreGunsMod.stanNPC != (Object)null) { <>2__current = false; <>1__state = 2; return true; } break; } MoreGunsMod.stanNPC = GameObject.Find("Stan/Dialogue").transform; if ((Object)(object)MoreGunsMod.stanNPC == (Object)null) { MelonLogger.Msg("stan dialogue was not loaded in"); } <dialogueController_ArmsDealer>5__1 = ((Component)MoreGunsMod.stanNPC).GetComponent<DialogueController_ArmsDealer>(); if ((Object)(object)<dialogueController_ArmsDealer>5__1 == (Object)null) { MelonLogger.Error("Dialogue comp not found"); } <allWeaponsFields>5__2 = typeof(DialogueController_ArmsDealer).GetField("allWeapons", BindingFlags.Instance | BindingFlags.NonPublic); if (<allWeaponsFields>5__2 != null) { <allWeapons>5__3 = <allWeaponsFields>5__2.GetValue(<dialogueController_ArmsDealer>5__1) as List<WeaponOption>; if (<allWeapons>5__3 != null) { <>s__4 = WeaponBase.allWeapons.GetEnumerator(); try { while (<>s__4.MoveNext()) { <weapon>5__5 = <>s__4.Current; if (!<allWeapons>5__3.Contains(<weapon>5__5.rangedGun)) { <allWeapons>5__3.Add(<weapon>5__5.rangedGun); } if (!<allWeapons>5__3.Contains(<weapon>5__5.ammoGun)) { <allWeapons>5__3.Add(<weapon>5__5.ammoGun); } MelonLogger.Msg("[MoreGuns] Loaded " + <weapon>5__5.ID + " to the store!"); <weapon>5__5 = null; } } finally { ((IDisposable)<>s__4).Dispose(); } <>s__4 = default(List<WeaponBase>.Enumerator); MelonLogger.Msg("[MoreGuns] Finished adding new guns to store!"); } else { MelonLogger.Error("[MoreGuns] All weapons was null"); } <allWeapons>5__3 = null; } else { MelonLogger.Error("[MoreGuns] Weapon field was null"); } <>s__6 = WeaponBase.allWeapons.GetEnumerator(); try { while (<>s__6.MoveNext()) { <weapon>5__7 = <>s__6.Current; if (!<dialogueController_ArmsDealer>5__1.RangedWeapons.Contains(<weapon>5__7.rangedGun)) { <dialogueController_ArmsDealer>5__1.RangedWeapons.Add(<weapon>5__7.rangedGun); } if (!<dialogueController_ArmsDealer>5__1.Ammo.Contains(<weapon>5__7.ammoGun)) { <dialogueController_ArmsDealer>5__1.Ammo.Add(<weapon>5__7.ammoGun); } <weapon>5__7 = null; } } finally { ((IDisposable)<>s__6).Dispose(); } <>s__6 = default(List<WeaponBase>.Enumerator); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public static object coroutine; [HarmonyPatch(typeof(Stan), "Loaded")] public static void Postfix(Stan __instance) { MelonLogger.Msg("Stan Loaded in"); MelonCoroutines.Start(InitializeStore(__instance)); } [IteratorStateMachine(typeof(<InitializeStore>d__2))] public static IEnumerator InitializeStore(Stan __instance) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <InitializeStore>d__2(0) { __instance = __instance }; } } [HarmonyPatch] public static class TrashRegistryPatch { [HarmonyPatch(typeof(TrashManager), "Start")] [HarmonyPrefix] public static void Prefix(TrashManager __instance) { List<TrashItem> list = __instance.TrashPrefabs.ToList(); foreach (WeaponBase allWeapon in WeaponBase.allWeapons) { if (!list.Contains(allWeapon.gunMagTrashItem)) { MelonLogger.Msg("Added " + allWeapon.ID + " gun trash to TrashManager"); list.Add(allWeapon.gunMagTrashItem); } } __instance.TrashPrefabs = list.ToArray(); } } } namespace MoreGunsMono.Guns { public class AK47 : WeaponBase { private static AK47 instance; public static AK47 Instance => instance; public AK47() { if (instance == null) { string iD = "ak47"; Shopping shopping = new Shopping { purchasePrice = 15000f, displayName = "AK47", available = true, nonAvailableReason = "" }; Shopping shopping2 = new Shopping { purchasePrice = 1000f, displayName = "AK47 Magazine", available = true, nonAvailableReason = "" }; GunSettings gunSettings = new GunSettings { isAutomatic = true, cameraJolt = true, speedMultiplier = 1f, requiredWindup = false, windupTime = 0f, canManuallyReload = true }; Init(iD, shopping, shopping2, gunSettings); instance = this; } } } public class GunSettings : MonoBehaviour { public bool isAutomatic; public float speedMultiplier = 1f; public bool cameraJolt = true; public bool requiredWindup; public float windupTime = 0f; public bool canManuallyReload = true; } public class MiniGun : WeaponBase { private static MiniGun instance; public static MiniGun Instance => instance; public MiniGun() { if (instance == null) { string iD = "minigun"; Shopping shopping = new Shopping { purchasePrice = 75000f, displayName = "MiniGun", available = true, nonAvailableReason = "" }; Shopping shopping2 = new Shopping { purchasePrice = 10000f, displayName = "MiniGun Magazine", available = true, nonAvailableReason = "" }; GunSettings gunSettings = new GunSettings { isAutomatic = true, speedMultiplier = 0.75f, cameraJolt = false, requiredWindup = true, windupTime = 2f, canManuallyReload = false }; Init(iD, shopping, shopping2, gunSettings); instance = this; } } } public class WeaponBase { [CompilerGenerated] private sealed class <LoadGun>d__27 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public WeaponBase <>4__this; private AssetBundleRequest <rqGunEquippable>5__1; private GameObject <_GunEquippable>5__2; private AssetBundleRequest <rqGunMagIntItemDef>5__3; private IntegerItemDefinition <_GunMagIntItemDef>5__4; private AssetBundleRequest <rqGunIntItemDef>5__5; private IntegerItemDefinition <_GunIntItemDef>5__6; private AssetBundleRequest <rqGunMagTrash>5__7; private GameObject <_GunMagTrash>5__8; private AssetBundleRequest <rqGunPrefab>5__9; private GameObject <_GunHandgun>5__10; private AssetBundleRequest <rqGunMagAvatarEquippable>5__11; private GameObject <_GunMagAvatarEquippable>5__12; private GunSettings <_settings>5__13; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadGun>d__27(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <rqGunEquippable>5__1 = null; <_GunEquippable>5__2 = null; <rqGunMagIntItemDef>5__3 = null; <_GunMagIntItemDef>5__4 = null; <rqGunIntItemDef>5__5 = null; <_GunIntItemDef>5__6 = null; <rqGunMagTrash>5__7 = null; <_GunMagTrash>5__8 = null; <rqGunPrefab>5__9 = null; <_GunHandgun>5__10 = null; <rqGunMagAvatarEquippable>5__11 = null; <_GunMagAvatarEquippable>5__12 = null; <_settings>5__13 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <rqGunEquippable>5__1 = MoreGunsMod.assetBundle.LoadAssetAsync<GameObject>(<>4__this.ID + "_Equippable"); <>2__current = <rqGunEquippable>5__1; <>1__state = 1; return true; case 1: { <>1__state = -1; ref GameObject reference4 = ref <_GunEquippable>5__2; Object asset4 = <rqGunEquippable>5__1.asset; reference4 = (GameObject)(object)((asset4 is GameObject) ? asset4 : null); if (!CheckAssetLoaded((Object)(object)<_GunEquippable>5__2, <>4__this.ID + "_Equippable", <>4__this.ID ?? "")) { return false; } <rqGunMagIntItemDef>5__3 = MoreGunsMod.assetBundle.LoadAssetAsync<IntegerItemDefinition>(<>4__this.ID + "_Magazine"); <>2__current = <rqGunMagIntItemDef>5__3; <>1__state = 2; return true; } case 2: { <>1__state = -1; ref IntegerItemDefinition reference2 = ref <_GunMagIntItemDef>5__4; Object asset2 = <rqGunMagIntItemDef>5__3.asset; reference2 = (IntegerItemDefinition)(object)((asset2 is IntegerItemDefinition) ? asset2 : null); if (!CheckAssetLoaded((Object)(object)<_GunMagIntItemDef>5__4, <>4__this.ID + "_Magazine", <>4__this.ID ?? "")) { return false; } <rqGunIntItemDef>5__5 = MoreGunsMod.assetBundle.LoadAssetAsync<IntegerItemDefinition>(<>4__this.ID ?? ""); <>2__current = <rqGunIntItemDef>5__5; <>1__state = 3; return true; } case 3: { <>1__state = -1; ref IntegerItemDefinition reference3 = ref <_GunIntItemDef>5__6; Object asset3 = <rqGunIntItemDef>5__5.asset; reference3 = (IntegerItemDefinition)(object)((asset3 is IntegerItemDefinition) ? asset3 : null); if (!CheckAssetLoaded((Object)(object)<_GunIntItemDef>5__6, <>4__this.ID ?? "", <>4__this.ID ?? "")) { return false; } <rqGunMagTrash>5__7 = MoreGunsMod.assetBundle.LoadAssetAsync<GameObject>("assets/resources/weapons/" + <>4__this.ID + "/magazine/" + <>4__this.ID + "_Magazine_Trash.prefab"); <>2__current = <rqGunMagTrash>5__7; <>1__state = 4; return true; } case 4: { <>1__state = -1; ref GameObject reference5 = ref <_GunMagTrash>5__8; Object asset5 = <rqGunMagTrash>5__7.asset; reference5 = (GameObject)(object)((asset5 is GameObject) ? asset5 : null); if (!CheckAssetLoaded((Object)(object)<_GunMagTrash>5__8, "assets/resources/weapons/" + <>4__this.ID + "/magazine/" + <>4__this.ID + "_Magazine_Trash.prefab", <>4__this.ID ?? "")) { return false; } <rqGunPrefab>5__9 = MoreGunsMod.assetBundle.LoadAssetAsync<GameObject>("assets/resources/avatar/equippables/" + <>4__this.ID + ".prefab"); <>2__current = <rqGunPrefab>5__9; <>1__state = 5; return true; } case 5: { <>1__state = -1; ref GameObject reference6 = ref <_GunHandgun>5__10; Object asset6 = <rqGunPrefab>5__9.asset; reference6 = (GameObject)(object)((asset6 is GameObject) ? asset6 : null); if (!CheckAssetLoaded((Object)(object)<_GunHandgun>5__10, "assets/resources/avatar/equippables/" + <>4__this.ID + ".prefab", <>4__this.ID ?? "")) { return false; } <rqGunMagAvatarEquippable>5__11 = MoreGunsMod.assetBundle.LoadAssetAsync<GameObject>("assets/resources/weapons/" + <>4__this.ID + "/magazine/" + <>4__this.ID + "_magazine_avatarequippable.prefab"); <>2__current = <rqGunMagAvatarEquippable>5__11; <>1__state = 6; return true; } case 6: { <>1__state = -1; ref GameObject reference = ref <_GunMagAvatarEquippable>5__12; Object asset = <rqGunMagAvatarEquippable>5__11.asset; reference = (GameObject)(object)((asset is GameObject) ? asset : null); if (!CheckAssetLoaded((Object)(object)<_GunMagAvatarEquippable>5__12, "assets/resources/weapons/" + <>4__this.ID + "/magazine/" + <>4__this.ID + "_magazine_avatarequippable.prefab", <>4__this.ID ?? "")) { return false; } <_settings>5__13 = <_GunEquippable>5__2.AddComponent<GunSettings>(); <>4__this.ApplyGunSettings(<_settings>5__13); <>4__this.gunEquippable = <_GunEquippable>5__2; <>4__this.magIntItemDef = <_GunMagIntItemDef>5__4; <>4__this.gunIntItemDef = <_GunIntItemDef>5__6; <>4__this.gunMagTrash = <_GunMagTrash>5__8; <>4__this.gunHandgun = <_GunHandgun>5__10; <>4__this.magAvatarEquippable = <_GunMagAvatarEquippable>5__12; <>4__this.gunRangedWeapon = <>4__this.gunEquippable.GetComponent<Equippable_RangedWeapon>(); <>4__this.gunMagTrashItem = <>4__this.gunMagTrash.GetComponent<TrashItem>(); <>4__this.CreateConfig(); <>4__this.SetCustomItemUI(); <>4__this.LoadAnimations(); <>4__this.ApplySettingsFromConfig(); Resource.RegisterAsset("Avatar/Equippables/" + <>4__this.ID.ToUpper(), (Object)(object)<>4__this.gunHandgun); Resource.RegisterAsset("Weapons/" + <>4__this.ID + "/Magazine/" + <>4__this.ID.ToUpper() + "_Magazine_AvatarEquippable", (Object)(object)<>4__this.magAvatarEquippable); allWeapons.Add(<>4__this); weaponsByName.Add(<>4__this.ID ?? "", <>4__this); MelonLogger.Msg("Finished Initializing " + <>4__this.ID); return false; } } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public string ID; public GameObject gunEquippable; public Equippable_RangedWeapon gunRangedWeapon; public GameObject gunHandgun; public GameObject magAvatarEquippable; public IntegerItemDefinition gunIntItemDef; public IntegerItemDefinition magIntItemDef; public WeaponOption rangedGun; public WeaponOption ammoGun; public GameObject gunMagTrash; public TrashItem gunMagTrashItem; public Dictionary<string, AnimationClip> animations = new Dictionary<string, AnimationClip>(); public GunConfiguration config; public Shopping gunShop; public Shopping magShop; public GunSettings settings; public static List<WeaponBase> allWeapons = new List<WeaponBase>(); public static Dictionary<string, WeaponBase> weaponsByName = new Dictionary<string, WeaponBase>(); public bool IsConfigurationFinished { get; private set; } public void Init(string ID, Shopping gunShop, Shopping magShop, GunSettings settings) { this.ID = ID; this.gunShop = gunShop; this.magShop = magShop; this.settings = settings; MelonLogger.Msg("Initializing " + ID); MelonCoroutines.Start(LoadGun()); } private void SetCustomItemUI() { Object obj = Resources.Load("Weapons/M1911/M1911"); ItemDefinition val = (ItemDefinition)(object)((obj is ItemDefinition) ? obj : null); if ((Object)(object)val == (Object)null) { MelonLogger.Error("m1911 couldnt be loaded? Unable to register UI to custom guns!"); return; } ((ItemDefinition)gunIntItemDef).CustomItemUI = val.CustomItemUI; ((ItemDefinition)magIntItemDef).CustomItemUI = val.CustomItemUI; } private void CreateDialogueControllerOptions() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown rangedGun = new WeaponOption { Name = config.ItemName.Value, Price = config.PurchasePrice.Value, IsAvailable = config.Available.Value, NotAvailableReason = config.AvailableReason.Value, Item = (StorableItemDefinition)(object)gunIntItemDef }; ammoGun = new WeaponOption { Name = config.MagItemName.Value, Price = config.MagPurchasePrice.Value, IsAvailable = config.MagAvailable.Value, NotAvailableReason = config.MagAvailableReason.Value, Item = (StorableItemDefinition)(object)magIntItemDef }; IsConfigurationFinished = true; } public void CreateConfig() { config = new GunConfiguration(this); MelonLogger.Msg("Created new config"); } public static bool CheckAssetLoaded(Object asset, string assetName, string weaponName) { if (asset == (Object)null) { MelonLogger.Error("Could not load asset: " + assetName); MoreGunsMod.StopProcess(); return false; } MelonLogger.Msg("Loaded asset for " + weaponName + " : " + assetName); return true; } [IteratorStateMachine(typeof(<LoadGun>d__27))] private IEnumerator LoadGun() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadGun>d__27(0) { <>4__this = this }; } public void ApplySettingsFromConfig() { //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: 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_0156: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) gunRangedWeapon.Damage = config.Damage.Value; gunRangedWeapon.ImpactForce = config.ImpactForce.Value; gunRangedWeapon.AimFOVReduction = config.AimFOVReduction.Value; gunRangedWeapon.AccuracyChangeDuration = config.AccuracyChangeDuration.Value; gunRangedWeapon.MagazineSize = config.MagazineSize.Value; ((ItemDefinition)gunIntItemDef).Name = config.DisplayItemName.Value; ((ItemDefinition)gunIntItemDef).Description = config.DisplayDescription.Value; ((ItemDefinition)gunIntItemDef).LabelDisplayColor = config.LabelDisplayColor.Value; ((ItemDefinition)gunIntItemDef).legalStatus = config.LegalStatus.Value; ((StorableItemDefinition)gunIntItemDef).RequiredRank = config.RequiredRank.Value; ((ItemDefinition)magIntItemDef).Name = config.MagDisplayItemName.Value; ((ItemDefinition)magIntItemDef).Description = config.MagDisplayDescription.Value; ((ItemDefinition)magIntItemDef).LabelDisplayColor = config.MagLabelDisplayColor.Value; ((ItemDefinition)magIntItemDef).legalStatus = config.MagLegalStatus.Value; ((StorableItemDefinition)magIntItemDef).RequiredRank = config.MagRequiredRank.Value; CreateDialogueControllerOptions(); } private void LoadAnimations() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Equippable_RangedWeapon val = (Equippable_RangedWeapon)((ItemDefinition)gunIntItemDef).Equippable; RuntimeAnimatorController animatorController = ((Equippable_AvatarViewmodel)val).AnimatorController; AnimationClip[] animationClips = animatorController.animationClips; foreach (AnimationClip val2 in animationClips) { if (((Object)val2).name.Contains("Idle")) { animations.Add("BothHands_Grip_Lowered", val2); } if (((Object)val2).name.Contains("Aiming")) { animations.Add("BothHands_Grip_Raised", val2); } if (((Object)val2).name.Contains("Fire") && !animations.ContainsKey("BothHands_Grip_Recoil")) { animations.Add("BothHands_Grip_Recoil", val2); } } } private void ApplyGunSettings(GunSettings _settings) { _settings.isAutomatic = settings.isAutomatic; _settings.speedMultiplier = settings.speedMultiplier; _settings.cameraJolt = settings.cameraJolt; _settings.requiredWindup = settings.requiredWindup; _settings.windupTime = settings.windupTime; _settings.canManuallyReload = settings.canManuallyReload; } } } namespace MoreGunsMono.Gui { public static class ReloadMessage { [CompilerGenerated] private sealed class <Fade>d__5 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public GameObject o; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <Fade>d__5(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(4f); <>1__state = 1; return true; case 1: <>1__state = -1; o.SetActive(false); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <LoadAsset>d__3 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public Transform parent; private AssetBundleRequest <rqMessage>5__1; private GameObject <_Message>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAsset>d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <rqMessage>5__1 = null; <_Message>5__2 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <rqMessage>5__1 = MoreGunsMod.assetBundle.LoadAssetAsync<GameObject>("assets/ui/Reload Message.prefab"); <>2__current = <rqMessage>5__1; <>1__state = 1; return true; case 1: { <>1__state = -1; ref GameObject reference = ref <_Message>5__2; Object asset = <rqMessage>5__1.asset; reference = (GameObject)(object)((asset is GameObject) ? asset : null); message = Object.Instantiate<GameObject>(<_Message>5__2, parent); message.SetActive(false); messageText = message.GetComponent<Text>(); return false; } } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public static GameObject message; public static Text messageText; public static void Initialize(Transform parent) { MelonCoroutines.Start(LoadAsset(parent)); } [IteratorStateMachine(typeof(<LoadAsset>d__3))] public static IEnumerator LoadAsset(Transform parent) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAsset>d__3(0) { parent = parent }; } public static void Show(bool show) { message.SetActive(show); MelonCoroutines.Start(Fade(message)); } [IteratorStateMachine(typeof(<Fade>d__5))] public static IEnumerator Fade(GameObject o) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <Fade>d__5(0) { o = o }; } public static void SetText(string message) { messageText.text = message; } } public static class Reticle { [CompilerGenerated] private sealed class <FindAndInstantiateCrosshair>d__2 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <FindAndInstantiateCrosshair>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: { <>1__state = -1; bool flag = true; if ((Object)(object)Singleton<HUD>.Instance.crosshair == (Object)null) { MelonLogger.Msg("Searching for crosshair in scene..."); <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; } reticle = Object.Instantiate<GameObject>(((Component)Singleton<HUD>.Instance.crosshair).gameObject, ((Component)Singleton<HUD>.Instance.crosshair).transform.parent); reticle.SetActive(false); break; } case 1: <>1__state = -1; break; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public static GameObject reticle; public static void Initialize() { MelonCoroutines.Start(FindAndInstantiateCrosshair()); } [IteratorStateMachine(typeof(<FindAndInstantiateCrosshair>d__2))] public static IEnumerator FindAndInstantiateCrosshair() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <FindAndInstantiateCrosshair>d__2(0); } } public static class WindupIndicator { [CompilerGenerated] private sealed class <LoadAsset>d__5 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public Transform parent; private AssetBundleRequest <rqWindupIndicator>5__1; private GameObject <_windupIndicator>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAsset>d__5(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <rqWindupIndicator>5__1 = null; <_windupIndicator>5__2 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <rqWindupIndicator>5__1 = MoreGunsMod.assetBundle.LoadAssetAsync<GameObject>("assets/ui/Windup Indicator.prefab"); <>2__current = <rqWindupIndicator>5__1; <>1__state = 1; return true; case 1: { <>1__state = -1; ref GameObject reference = ref <_windupIndicator>5__2; Object asset = <rqWindupIndicator>5__1.asset; reference = (GameObject)(object)((asset is GameObject) ? asset : null); windupIndicator = Object.Instantiate<GameObject>(<_windupIndicator>5__2, parent); windupIndicator.SetActive(false); windupIndicatorSlider = windupIndicator.GetComponent<Slider>(); backgroundImage = ((Component)windupIndicator.transform.GetChild(0)).GetComponent<Image>(); fillImage = ((Component)windupIndicator.transform.GetChild(1).GetChild(0)).GetComponent<Image>(); return false; } } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public static GameObject windupIndicator; public static Slider windupIndicatorSlider; public static Image backgroundImage; public static Image fillImage; public static void Initialize(Transform parent) { MelonCoroutines.Start(LoadAsset(parent)); } [IteratorStateMachine(typeof(<LoadAsset>d__5))] public static IEnumerator LoadAsset(Transform parent) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAsset>d__5(0) { parent = parent }; } public static void Show(bool shown) { windupIndicator.SetActive(shown); } public static void SetValueByTime(float from, float to) { if (from >= to) { SetValue(100); return; } int value = (int)(from * 100f / to); SetValue(value); } public static void SetValue(int value) { windupIndicatorSlider.value = value; if (value == 100) { Show(shown: false); } else { Show(shown: true); } } } } namespace MoreGunsMono.Dialogue { public static class StanDialogue { public const string allWeaponCategoryOptions = "925ea1d9-9b7e-47a0-b016-6a3b787290c3"; public static List<ItemInstance> allGuns = new List<ItemInstance>(); public static Dictionary<string, ItemInstance> allMags = new Dictionary<string, ItemInstance>(); public static void StartSpecialGunReloads() { //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Expected O, but got Unknown //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Expected O, but got Unknown //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Expected O, but got Unknown //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) try { allGuns.Clear(); allMags.Clear(); foreach (HotbarSlot hotbarSlot in PlayerSingleton<PlayerInventory>.Instance.hotbarSlots) { object obj; if (hotbarSlot == null) { obj = null; } else { ItemInstance itemInstance = ((ItemSlot)hotbarSlot).ItemInstance; obj = ((itemInstance != null) ? itemInstance.Definition : null); } if (!((Object)obj == (Object)null)) { string iD = ((ItemSlot)hotbarSlot).ItemInstance.Definition.ID; if (WeaponBase.weaponsByName.ContainsKey(iD)) { allGuns.Add(((ItemSlot)hotbarSlot).ItemInstance); } if (iD.EndsWith("mag")) { allMags.Add(iD, ((ItemSlot)hotbarSlot).ItemInstance); } } } foreach (ItemInstance allGun in allGuns) { if (allMags.TryGetValue(allGun.Definition.ID + "mag", out var value)) { Equippable_RangedWeapon val = (Equippable_RangedWeapon)allGun.Definition.Equippable; IntegerItemInstance val2 = (IntegerItemInstance)allGun; IntegerItemInstance val3 = (IntegerItemInstance)value; int magazineSize = val.MagazineSize; int num = magazineSize - val2.Value; int num2 = val3.Value - num; if (num2 <= 0) { int value2 = val2.Value + val3.Value; val2.SetValue(value2); val3.SetValue(0); value.ChangeQuantity(-1); Vector3 val4 = ((Component)PlayerSingleton<PlayerCamera>.Instance).transform.position - ((Component)PlayerSingleton<PlayerCamera>.Instance).transform.up * 0.4f; NetworkSingleton<TrashManager>.Instance.CreateTrashItem(val.ReloadTrash.ID, val4, Random.rotation, default(Vector3), "", false); } else { val2.SetValue(magazineSize); val3.SetValue(num2); } } } } catch (Exception ex) { MelonLogger.Error("Exception in StartSpecialGunReloads: " + ex.Message); MelonLogger.Error("Stack trace: " + ex.StackTrace); } } } }