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 10 months 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); } } } }