Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of Rains Car Mod v0.0.5
RainsCarMod.dll
Decompiled 10 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using FishNet; using FishNet.Connection; using FishNet.Managing.Client; using FishNet.Object; using HarmonyLib; using MelonLoader; using Microsoft.CodeAnalysis; using RainsCarMod; using RainsCarMod.Logging; using S1API.PhoneApp; using S1API.UI; using ScheduleOne.UI.Phone; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; 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(CarSpawnerAppLoader), "RainsCarMod", "0.0.1", "RainingDeath", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("RainsCarMod")] [assembly: AssemblyConfiguration("DebugMelon")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("RainsCarMod")] [assembly: AssemblyTitle("RainsCarMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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 RainsCarMod { public class CarSpawnerAppLoader : MelonMod { [HarmonyPatch(typeof(HomeScreen), "Start")] public class HomeScreenStartPatch { private static void Postfix(HomeScreen __instance) { CarSpawnerApp obj = new CarSpawnerApp(); MethodInfo method = typeof(PhoneApp).GetMethod("SpawnIcon", BindingFlags.Instance | BindingFlags.NonPublic); MethodInfo method2 = typeof(PhoneApp).GetMethod("SpawnUI", BindingFlags.Instance | BindingFlags.NonPublic); method?.Invoke(obj, new object[1] { __instance }); method2?.Invoke(obj, new object[1] { __instance }); MelonLogger.Msg("[CarSpawnerApp] \ud83d\ude97 Phone app UI and icon injected."); } } public static readonly Dictionary<string, GameObject> LoadedPrefabs = new Dictionary<string, GameObject>(); public override void OnApplicationStart() { ((MelonBase)this).HarmonyInstance.PatchAll(); LoadEmbeddedBundle(); new CarSpawnerApp(); } private void LoadEmbeddedBundle() { Assembly executingAssembly = Assembly.GetExecutingAssembly(); using Stream stream = executingAssembly.GetManifestResourceStream("RainsCarMod.Resources.carmod"); if (stream == null) { MelonLogger.Error("[CarSpawnerAppLoader] ❌ Embedded AssetBundle not found."); return; } using MemoryStream memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); AssetBundle val = AssetBundle.LoadFromMemory(memoryStream.ToArray()); if ((Object)(object)val == (Object)null) { MelonLogger.Error("[CarSpawnerAppLoader] ❌ Failed to load embedded AssetBundle."); return; } Object[] array = val.LoadAllAssets(); foreach (Object val2 in array) { GameObject val3 = (GameObject)(object)((val2 is GameObject) ? val2 : null); if (val3 != null && !LoadedPrefabs.ContainsKey(((Object)val3).name)) { LoadedPrefabs.Add(((Object)val3).name, val3); MelonLogger.Msg("[CarSpawnerAppLoader] ✅ Loaded prefab: " + ((Object)val3).name); } } } } public class CarSpawnerApp : PhoneApp { protected override string AppName => "CarSpawnerApp"; protected override string AppTitle => "Car Spawner"; protected override string IconLabel => "CarSpawner"; protected override string IconFileName => "Rain'sCarModIcon.png"; private void SpawnVehicle(string prefabKey, string label) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) if (!InstanceFinder.IsServer) { MelonLogger.Warning("[CarSpawnerApp] ❌ Only the server can spawn networked objects."); return; } ClientManager clientManager = InstanceFinder.ClientManager; object obj; if (clientManager == null) { obj = null; } else { NetworkConnection connection = clientManager.Connection; obj = ((connection != null) ? connection.FirstObject : null); } NetworkObject val = (NetworkObject)obj; if ((Object)(object)val == (Object)null) { MelonLogger.Warning("[CarSpawnerApp] ❌ Local FishNet player not found."); return; } Transform transform = ((Component)val).transform; Vector3 val2 = transform.position + transform.forward * 5f; Quaternion rotation = transform.rotation; if (!CarSpawnerAppLoader.LoadedPrefabs.TryGetValue(prefabKey, out var value)) { MelonLogger.Error("[CarSpawnerApp] ❌ '" + prefabKey + "' prefab not found in loaded bundles."); return; } NetworkObject component = value.GetComponent<NetworkObject>(); if ((Object)(object)component == (Object)null) { MelonLogger.Warning("[CarSpawnerApp] ❌ " + label + " prefab is missing NetworkObject."); return; } GameObject val3 = Object.Instantiate<GameObject>(value, val2, rotation); InstanceFinder.ServerManager.Spawn(val3, (NetworkConnection)null, default(Scene)); MelonLogger.Msg("[CarSpawnerApp] ✅ " + label + " spawned and replicated over network."); } protected override void OnCreatedUI(GameObject container) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Expected O, but got Unknown //IL_00ea: 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_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Expected O, but got Unknown //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Expected O, but got Unknown //IL_019e: 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_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Expected O, but got Unknown //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Expected O, but got Unknown GameObject val = UIFactory.Panel("CarSpawnerPanel", container.transform, new Color(0.5f, 0f, 0.5f), (Vector2?)null, (Vector2?)null, false); RectTransform component = val.GetComponent<RectTransform>(); component.sizeDelta = new Vector2(1250f, 700f); VerticalLayoutGroup val2 = val.AddComponent<VerticalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)val2).spacing = 10f; ((LayoutGroup)val2).childAlignment = (TextAnchor)1; Button item = UIFactory.RoundedButtonWithLabel("spawnButton", "Spawn GODZILLA", val.transform, new Color(0f, 1f, 0.2f), 100f, 60f, 18, Color.white).Item2; ((UnityEvent)item.onClick).AddListener((UnityAction)delegate { SpawnVehicle("GODZILLA", "GODZILLA"); }); Button item2 = UIFactory.RoundedButtonWithLabel("hellButton", "Spawn HellStorm", val.transform, new Color(0.3f, 0.5f, 1f), 100f, 60f, 18, Color.white).Item2; ((UnityEvent)item2.onClick).AddListener((UnityAction)delegate { SpawnVehicle("HellStorm", "HellStorm"); }); Button item3 = UIFactory.RoundedButtonWithLabel("driftButton", "Spawn Driftcar", val.transform, new Color(0.4f, 0f, 1f), 100f, 60f, 18, Color.white).Item2; ((UnityEvent)item3.onClick).AddListener((UnityAction)delegate { SpawnVehicle("driftcar", "Driftcar"); }); Button item4 = UIFactory.RoundedButtonWithLabel("superButton", "Spawn Supercar", val.transform, new Color(1f, 0f, 0.7f), 100f, 60f, 18, Color.white).Item2; ((UnityEvent)item4.onClick).AddListener((UnityAction)delegate { SpawnVehicle("supercar", "Supercar"); }); Button item5 = UIFactory.RoundedButtonWithLabel("soupButton", "Spawn Soup Car", val.transform, new Color(1f, 0f, 0.4f), 100f, 60f, 18, Color.white).Item2; ((UnityEvent)item5.onClick).AddListener((UnityAction)delegate { SpawnVehicle("canofsoupcar", "Can of Soup Car"); }); } } public class Core : MelonMod { public override void OnInitializeMelon() { Log.LogInfo("Initializing RainsCarMod..."); } } } namespace RainsCarMod.Logging { public static class Log { public static void LogInfo(string message) { Melon<Core>.Logger.Msg(message); } public static void LogWarning(string message) { Melon<Core>.Logger.Warning(message); } public static void LogError(string message) { Melon<Core>.Logger.Error(message); } public static void LogFatal(string message) { Melon<Core>.Logger.BigError(message); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }