Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of Better Weapons v1.0.3
BetterWeapons.dll
Decompiled 3 weeks agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BetterWeapons; using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes; using Il2CppScheduleOne; using Il2CppScheduleOne.DevUtilities; using Il2CppScheduleOne.Dialogue; using Il2CppScheduleOne.Equipping; using Il2CppScheduleOne.ItemFramework; using Il2CppScheduleOne.UI; using Il2CppSystem.Collections.Generic; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using ModManagerPhoneApp; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(EntryPoint), "BetterWeapons", "1.0.1", "_peron", null)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("BetterWeapons")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BetterWeapons")] [assembly: AssemblyTitle("BetterWeapons")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace BetterWeapons { public class EntryPoint : MelonMod { [HarmonyPatch(typeof(Registry))] private class LoadItems { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void PostRegistry() { GameObject val = ((IEnumerable<GameObject>)Resources.FindObjectsOfTypeAll<GameObject>()).FirstOrDefault((Func<GameObject, bool>)((GameObject obj) => ((Object)obj).name == "M1911_Equippable" && (Object)(object)obj.transform.parent == (Object)null)); if ((Object)(object)val != (Object)null) { Equippable_RangedWeapon component = val.GetComponent<Equippable_RangedWeapon>(); if ((Object)(object)component != (Object)null) { component.MagazineSize = (int)((MelonPreferences_Entry)_1911AmmoCapacity).BoxedValue; StorableItemDefinition magazine = component.Magazine; if ((Object)(object)magazine != (Object)null) { IntegerItemDefinition val2 = ((Il2CppObjectBase)magazine).TryCast<IntegerItemDefinition>(); if ((Object)(object)val2 != (Object)null) { val2.DefaultValue = (int)((MelonPreferences_Entry)_1911MagazineCapacity).BoxedValue; } } } } GameObject val3 = ((IEnumerable<GameObject>)Resources.FindObjectsOfTypeAll<GameObject>()).FirstOrDefault((Func<GameObject, bool>)((GameObject obj) => ((Object)obj).name == "Revolver_Equippable" && (Object)(object)obj.transform.parent == (Object)null)); if (!((Object)(object)val3 != (Object)null)) { return; } Equippable_RangedWeapon component2 = val3.GetComponent<Equippable_RangedWeapon>(); if (!((Object)(object)component2 != (Object)null)) { return; } component2.MagazineSize = (int)((MelonPreferences_Entry)RevolverAmmoCapacity).BoxedValue; StorableItemDefinition magazine2 = component2.Magazine; if ((Object)(object)magazine2 != (Object)null) { IntegerItemDefinition val4 = ((Il2CppObjectBase)magazine2).TryCast<IntegerItemDefinition>(); if ((Object)(object)val4 != (Object)null) { val4.DefaultValue = (int)((MelonPreferences_Entry)RevolverMagazineCapacity).BoxedValue; } } } } [HarmonyPatch(typeof(DialogueController_ArmsDealer))] private class ArmDealer { [HarmonyPatch("Awake")] [HarmonyPostfix] public static void DealerPrefix(DialogueController_ArmsDealer __instance) { Dictionary<string, int> dictionary = new Dictionary<string, int> { { "M1911", (int)((MelonPreferences_Entry)_1911Price).BoxedValue }, { "Revolver", (int)((MelonPreferences_Entry)RevolverPrice).BoxedValue }, { "Revolver Ammo", (int)((MelonPreferences_Entry)RevolverMagazinePrice).BoxedValue }, { "M1911 Magazine", (int)((MelonPreferences_Entry)_1911MagazinePrice).BoxedValue } }; Enumerator<WeaponOption> enumerator = __instance.allWeapons.GetEnumerator(); while (enumerator.MoveNext()) { WeaponOption current = enumerator.Current; if (dictionary.ContainsKey(current.Name)) { current.Price = dictionary[current.Name]; } } } } [HarmonyPatch(typeof(Equippable_RangedWeapon))] public class EquippableRangedWeapons { [HarmonyPatch("Fire")] [HarmonyPrefix] public static bool FirePrefix(Equippable_RangedWeapon __instance) { __instance.Damage = (int)((MelonPreferences_Entry)Damage).BoxedValue; if (__instance.MustBeCocked) { __instance.MustBeCocked = !(bool)((MelonPreferences_Entry)NoCockPit).BoxedValue; } if ((bool)((MelonPreferences_Entry)SuperAccuracy).BoxedValue) { __instance.MaxSpread = 0.2f; __instance.MinSpread = 0.1f; } return true; } [HarmonyPatch("Equip")] [HarmonyPostfix] public static void EquipPostFix(Equippable_RangedWeapon __instance) { Singleton<HUD>.Instance.SetCrosshairVisible(true); } [HarmonyPatch("Update")] [HarmonyPostfix] public static void Update(Equippable_RangedWeapon __instance) { Singleton<HUD>.Instance.SetCrosshairVisible(true); if ((bool)((MelonPreferences_Entry)InfiniteAmmo).BoxedValue && __instance.weaponItem.Value <= 2) { IntegerItemInstance weaponItem = __instance.weaponItem; int value = weaponItem.Value; weaponItem.Value = value + 1; } } } public static MelonPreferences_Category Maincategory; public static MelonPreferences_Category _1911category; public static MelonPreferences_Category Revolvercategory; public static MelonPreferences_Entry<int> Damage; public static MelonPreferences_Entry<bool> SuperAccuracy; public static MelonPreferences_Entry<bool> NoCockPit; public static MelonPreferences_Entry<bool> InfiniteAmmo; public static MelonPreferences_Entry<int> _1911Price; public static MelonPreferences_Entry<int> RevolverPrice; public static MelonPreferences_Entry<int> _1911AmmoCapacity; public static MelonPreferences_Entry<int> RevolverAmmoCapacity; public static MelonPreferences_Entry<int> _1911MagazineCapacity; public static MelonPreferences_Entry<int> RevolverMagazineCapacity; public static MelonPreferences_Entry<int> _1911MagazinePrice; public static MelonPreferences_Entry<int> RevolverMagazinePrice; public override void OnInitializeMelon() { _1911category = MelonPreferences.CreateCategory("BetterWeapons_1911", "Better Weapons - 1911"); _1911Price = _1911category.CreateEntry<int>("BetterWeapons_1911_price", 2500, "Price for 1911 pistol", (string)null, false, false, (ValueValidator)null, (string)null); _1911AmmoCapacity = _1911category.CreateEntry<int>("BetterWeapons_1911_ammo_capacity", 7, "Ammo capacity for 1911", (string)null, false, false, (ValueValidator)null, (string)null); _1911MagazineCapacity = _1911category.CreateEntry<int>("BetterWeapons_1911_magazine_capacity", 7, "Magazine capacity for 1911", (string)null, false, false, (ValueValidator)null, (string)null); _1911MagazinePrice = _1911category.CreateEntry<int>("BetterWeapons_1911_magazine_price", 20, "Price for 1911 magazines", (string)null, false, false, (ValueValidator)null, (string)null); Revolvercategory = MelonPreferences.CreateCategory("BetterWeapons_Revolver", "Better Weapons - Revolver"); RevolverPrice = Revolvercategory.CreateEntry<int>("BetterWeapons_revolver_price", 1000, "Price for Revolver", (string)null, false, false, (ValueValidator)null, (string)null); RevolverAmmoCapacity = Revolvercategory.CreateEntry<int>("BetterWeapons_revolver_ammo_capacity", 6, "Ammo capacity for Revolver", (string)null, false, false, (ValueValidator)null, (string)null); RevolverMagazineCapacity = Revolvercategory.CreateEntry<int>("BetterWeapons_revolver_magazine_capacity", 6, "Magazine capacity for Revolver", (string)null, false, false, (ValueValidator)null, (string)null); RevolverMagazinePrice = Revolvercategory.CreateEntry<int>("BetterWeapons_revolver_magazine_price", 10, "Price for Revolver magazines", (string)null, false, false, (ValueValidator)null, (string)null); Maincategory = MelonPreferences.CreateCategory("BetterWeapons", "Better Weapons"); Damage = Maincategory.CreateEntry<int>("BetterWeapons_1_damage", 60, "Weapon damage (For all weapons)", (string)null, false, false, (ValueValidator)null, (string)null); SuperAccuracy = Maincategory.CreateEntry<bool>("BetterWeapons_super_accuracy", false, "Improved weapon accuracy", (string)null, false, false, (ValueValidator)null, (string)null); NoCockPit = Maincategory.CreateEntry<bool>("BetterWeapons_no_cockpit", false, "Disable cockpit", (string)null, false, false, (ValueValidator)null, (string)null); InfiniteAmmo = Maincategory.CreateEntry<bool>("BetterWeapons_infinite_ammo", false, "Unlimited ammunition", (string)null, false, false, (ValueValidator)null, (string)null); SaveAllCategories(); try { ModSettingsEvents.OnPreferencesSaved += LoadAllCategories; ((MelonBase)this).LoggerInstance.Msg("Successfully subscribed to Mod Manager save event."); } catch (Exception ex) { ((MelonBase)this).LoggerInstance.Warning("Could not subscribe to Mod Manager event (Mod Manager may not be installed/compatible): " + ex.Message); } } public static void SaveAllCategories() { foreach (MelonPreferences_Category category in MelonPreferences.Categories) { category.SetFilePath("UserData/BetterWeapons.cfg"); category.SaveToFile(true); } } public static void LoadAllCategories() { foreach (MelonPreferences_Category category in MelonPreferences.Categories) { category.LoadFromFile(true); } } } }