Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of FurnitureDelivery v1.6.2
FurnitureDelivery-IL2CPP.dll
Decompiled a day agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using FurnitureDelivery; using FurnitureDelivery.Helpers; using FurnitureDelivery.Interop; using FurnitureDelivery.Shops; using HarmonyLib; using Il2Cpp; using Il2CppFishNet.Connection; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppScheduleOne; using Il2CppScheduleOne.Delivery; using Il2CppScheduleOne.DevUtilities; using Il2CppScheduleOne.ItemFramework; using Il2CppScheduleOne.PlayerScripts; using Il2CppScheduleOne.UI.Phone.Delivery; using Il2CppScheduleOne.UI.Shop; using Il2CppScheduleOne.Vehicles; using Il2CppScheduleOne.Vehicles.Modification; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using Il2CppTMPro; using MelonLoader; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.Events; 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(global::FurnitureDelivery.FurnitureDelivery), "FurnitureDelivery", "1.6.2", "k073l", null)] [assembly: MelonColor(1, 255, 215, 0)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: MelonOptionalDependencies(new string[] { "MoreGuns", "Toileportation", "UpgradedTrashCans", "DeliveryApp++" })] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("FurnitureDelivery-IL2CPP")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3b5d1c951e351d8e3fb8dbafbd0621d9306828ef")] [assembly: AssemblyProduct("FurnitureDelivery-IL2CPP")] [assembly: AssemblyTitle("FurnitureDelivery-IL2CPP")] [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 FurnitureDelivery { public static class BuildInfo { public const string Name = "FurnitureDelivery"; public const string Description = "Adds a custom delivery shops for furniture items"; public const string Author = "k073l"; public const string Version = "1.6.2"; } public class FurnitureDelivery : MelonMod { [CompilerGenerated] private sealed class <OnDeliveryManagerReady>d__6 : IEnumerator<object>, IEnumerator, IDisposable { 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 <OnDeliveryManagerReady>d__6(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { if (<>1__state != 0) { return false; } <>1__state = -1; MelonLogger.Debug("Delivery manager ready"); NetworkSingleton<DeliveryManager>.Instance.onDeliveryCreated.AddListener(UnityAction<DeliveryInstance>.op_Implicit((Action<DeliveryInstance>)ToileportationInterop.OnDeliveryCreated)); 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(); } } private static Instance MelonLogger { get; set; } public override void OnInitializeMelon() { MelonLogger = ((MelonBase)this).LoggerInstance; MelonLogger.Msg("FurnitureDelivery initialized"); if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("MoreGuns"))) { MelonLogger.Msg("MoreGuns detected. Adding ak47 to Armory"); } if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("Toileportation"))) { MelonLogger.Msg("Toileportation detected. Adding Golden Toilet to Herbert's shop"); } if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("UpgradedTrashCans"))) { MelonLogger.Msg("UpgradedTrashCans detected. Adding trash bins to Dan's shop"); } } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("Toileportation"))) { if (sceneName == "Main") { MelonCoroutines.Start(Utils.WaitForNetworkSingleton<DeliveryManager>(OnDeliveryManagerReady())); MelonLogger.Debug("Repatching CanOrder"); DeliveryShopCanOrderPatch.ApplyManualPatch(); } if (sceneName == "Menu") { if ((Object)(object)NetworkSingleton<DeliveryManager>.Instance != (Object)null) { NetworkSingleton<DeliveryManager>.Instance.onDeliveryCreated.RemoveListener(UnityAction<DeliveryInstance>.op_Implicit((Action<DeliveryInstance>)ToileportationInterop.OnDeliveryCreated)); } ToileportationInterop.GoldenToiletListing = null; } } if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("DeliveryApp++"))) { MelonLogger.Msg("DeliveryAppPlusPlus detected. Applying patches"); DeliveryAppPlusPlusInterop.ApplyPatches(); } } [IteratorStateMachine(typeof(<OnDeliveryManagerReady>d__6))] private static IEnumerator OnDeliveryManagerReady() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <OnDeliveryManagerReady>d__6(0); } } [HarmonyPatch(typeof(DeliveryShop), "SetIsAvailable")] public class DeliveryShopSetIsAvailablePatch { public static Instance Logger = new Instance("FurnitureDelivery-SetIsAvailable"); public static void Postfix(DeliveryShop __instance) { DeliveryApp instance = PlayerSingleton<DeliveryApp>.Instance; Transform contentT; List<DeliveryShop> initializedShops = DeliveryShopBuilder.GetInitializedShops(instance, out contentT); DeliveryShop val = initializedShops?.FirstOrDefault((Func<DeliveryShop, bool>)((DeliveryShop item) => ((Object)((Component)item).gameObject).name.StartsWith("Oscar"))); if ((Object)(object)val == (Object)null || ((Object)((Component)__instance).gameObject).name != ((Object)((Component)val).gameObject).name) { return; } Logger.Msg("First Oscar's shop: " + ((Object)((Component)val).gameObject).name + " set to active, setting other one to active"); DeliveryShop val2 = ((IEnumerable<DeliveryShop>)initializedShops).FirstOrDefault((Func<DeliveryShop, bool>)((DeliveryShop item) => ((Object)((Component)item).gameObject).name.StartsWith("DeliveryShop_Oscar"))); if ((Object)(object)val2 == (Object)null) { Logger.Warning("Oscar's equipment shop not found"); return; } ((Component)val2).gameObject.SetActive(true); DeliveryShop val3 = ((IEnumerable<DeliveryShop>)initializedShops).FirstOrDefault((Func<DeliveryShop, bool>)((DeliveryShop item) => ((Object)((Component)item).gameObject).name.StartsWith("DeliveryShop_Armory"))); if ((Object)(object)val3 == (Object)null) { Logger.Warning("Stan's shop not found"); } else { ((Component)val3).gameObject.SetActive(true); } } } internal class InitializedShopsCache { public static Dictionary<string, DeliveryShop> shops = new Dictionary<string, DeliveryShop>(); public static DeliveryShop GetShop(string name) { if (!shops.ContainsKey(name)) { DeliveryApp instance = PlayerSingleton<DeliveryApp>.Instance; Transform contentT; List<DeliveryShop> initializedShops = DeliveryShopBuilder.GetInitializedShops(instance, out contentT); foreach (DeliveryShop item in initializedShops) { shops.TryAdd(((Object)((Component)item).gameObject).name, item); } } DeliveryShop value; return shops.TryGetValue(name, out value) ? value : null; } public static List<DeliveryShop> GetShops(string name) { if (!shops.Any()) { GetShop(name); } return (from kvp in shops where kvp.Key.Contains(name) select kvp.Value).ToList(); } } [HarmonyPatch(typeof(DeliveryShop), "CanOrder")] public class DeliveryShopCanOrderPatch { public static bool HandleAddedShops(DeliveryShop shop, out string reason, ref bool result) { string name = ((Object)((Component)shop).gameObject).name; if (name.Contains("Herbert")) { result = ToileportationInterop.CanOrder(InitializedShopsCache.GetShops("Herbert"), out reason); if (!result) { result = false; return false; } } if (name.Contains("Dan")) { List<DeliveryShop> shops = InitializedShopsCache.GetShops("Dan"); foreach (DeliveryShop item in shops) { if (NetworkSingleton<DeliveryManager>.Instance.GetActiveShopDelivery(item) != null) { result = false; reason = "Dan is currently delivering an order"; return false; } } } if (name.Contains("Oscar")) { List<DeliveryShop> shops2 = InitializedShopsCache.GetShops("Oscar"); foreach (DeliveryShop item2 in shops2) { if (NetworkSingleton<DeliveryManager>.Instance.GetActiveShopDelivery(item2) != null) { result = false; reason = "Oscar is currently delivering an order"; return false; } } } reason = string.Empty; return true; } public static bool Prefix(DeliveryShop __instance, out string reason, ref bool __result) { return HandleAddedShops(__instance, out reason, ref __result); } public static void ApplyManualPatch() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown Harmony harmonyInstance = ((MelonBase)Melon<FurnitureDelivery>.Instance).HarmonyInstance; if (!harmonyInstance.GetPatchedMethods().Contains(AccessTools.Method(typeof(DeliveryShop), "CanOrder", (Type[])null, (Type[])null))) { harmonyInstance.Patch((MethodBase)AccessTools.Method(typeof(DeliveryShop), "CanOrder", (Type[])null, (Type[])null), new HarmonyMethod(typeof(DeliveryShopCanOrderPatch), "Prefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } [HarmonyPatch(typeof(DeliveryApp), "Awake")] public class DeliveryAppAwakePatch { public static Instance Logger = new Instance("FurnitureDelivery-AppAwake"); public static void Postfix(DeliveryApp __instance) { Logger.Debug("DeliveryApp Awake called"); DeliveryApp instance = PlayerSingleton<DeliveryApp>.Instance; DanShop.CreateDanShop(instance); HerbertShop.CreateHerbertShop(instance); OscarShop.CreateOscarShop(instance); StanShop.CreateStanShop(instance); } } [HarmonyPatch(typeof(VehicleCamera))] public static class VehicleCameraPatch { [HarmonyPrefix] [HarmonyPatch("LateUpdate")] public static bool SafeLateUpdatePrefix(VehicleCamera __instance) { return (Object)(object)__instance.vehicle != (Object)null && (Object)(object)__instance.cameraOrigin != (Object)null && (Object)(object)PlayerSingleton<PlayerCamera>.Instance != (Object)null; } [HarmonyPrefix] [HarmonyPatch("Update")] public static bool SafeUpdatePrefix(VehicleCamera __instance) { return (Object)(object)__instance.vehicle != (Object)null && (Object)(object)__instance.cameraOrigin != (Object)null && (Object)(object)PlayerSingleton<PlayerCamera>.Instance != (Object)null; } } } namespace FurnitureDelivery.Shops { public static class DanShop { public static readonly List<string> ItemIDs = new List<string> { "coffeetable", "metalsquaretable", "woodsquaretable", "toilet", "trashcan", "trash_bin", "trash_compactor", "bed", "locker", "TV", "floorlamp", "growtent", "plasticpot", "halogengrowlight", "ledgrowlight", "suspensionrack", "soilpourer", "potsprinkler", "largestoragerack", "mediumstoragerack", "smallstoragerack" }; public static Instance Logger = new Instance("FurnitureDelivery-DanShop"); public static void CreateDanShop(DeliveryApp app) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) Logger.Debug("Creating Dan's Furniture shop"); LandVehicle vehicle = NetworkSingleton<VehicleManager>.Instance.AllVehicles.AsEnumerable<LandVehicle>().FirstOrDefault(); DeliveryShopBuilder deliveryShopBuilder = new DeliveryShopBuilder(app).WithShopName("Dan's Furniture").WithShopDescription("General furniture").WithShopColor(new Color(0.06f, 0.56f, 0.87f)) .WithShopImage(Utils.FindSprite("Dan_Mugshot")) .WithDeliveryFee(300f) .SetAvailableByDefault(available: true) .WithDeliveryVehicle(DeliveryShopBuilder.GetOrCreateDeliveryVehicle(vehicle)) .SetPosition(2); List<StorableItemDefinition> itemDefinitions = Utils.GetAllStorableItemDefinitions(); List<StorableItemDefinition> list = (from id in ItemIDs select ((IEnumerable<StorableItemDefinition>)itemDefinitions).FirstOrDefault((Func<StorableItemDefinition, bool>)((StorableItemDefinition item) => ((ItemDefinition)item).ID == id)) into item where (Object)(object)item != (Object)null select item).ToList(); foreach (StorableItemDefinition item in list) { Logger.Debug("Adding item " + ((Object)item).name + " to Dan's shop"); deliveryShopBuilder.AddListing(item); } DeliveryShop shop = deliveryShopBuilder.Build(); DeliveryShopBuilder.Apply(app, shop); Logger.Msg("Dan's Furniture created"); } } public class HerbertShop { public static readonly List<string> ItemIDs = new List<string> { "woodensign", "metalsign", "wallmountedshelf", "antiquewalllamp", "modernwalllamp", "wallclock", "grandfatherclock", "safe", "jukebox", "goldenskateboard", "filingcabinet", "smalltrashcan", "dumpster" }; public static Instance Logger = new Instance("FurnitureDelivery-HerbertShop"); public static void CreateHerbertShop(DeliveryApp app) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) Logger.Debug("Creating Herbert's shop"); LandVehicle vehicle = new LandVehicleBuilder().WithVehicleName("LandVehicle_Herbert").WithVehicleCode("veeper").WithPlayerOwned(isPlayerOwned: false) .WithColor((EVehicleColor)11) .Build(); DeliveryShopBuilder deliveryShopBuilder = new DeliveryShopBuilder(app).WithShopName("Herbert's Curiosities").WithShopDescription("Boutique's picks and exotic items").WithShopColor(new Color(0.2f, 0f, 1f)) .WithShopImage(Utils.FindSprite("Herbert_Mugshot")) .WithDeliveryFee(500f) .SetAvailableByDefault(available: true) .WithDeliveryVehicle(DeliveryShopBuilder.GetOrCreateDeliveryVehicle(vehicle)) .SetPosition(5); List<StorableItemDefinition> itemDefinitions = Utils.GetAllStorableItemDefinitions(); List<StorableItemDefinition> list = (from id in ItemIDs select ((IEnumerable<StorableItemDefinition>)itemDefinitions).FirstOrDefault((Func<StorableItemDefinition, bool>)((StorableItemDefinition item) => ((ItemDefinition)item).ID == id)) into item where (Object)(object)item != (Object)null select item).ToList(); foreach (StorableItemDefinition item in list) { Logger.Debug("Adding item " + ((Object)item).name + " to Herbert's shop"); deliveryShopBuilder.AddListing(item); } if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name == "Toileportation")) { ShopListing goldenToiletListing = ToileportationInterop.GoldenToiletListing; if (goldenToiletListing == null) { Logger.Warning("Golden toilet listing not found, waiting for it to be created"); MelonCoroutines.Start(Utils.WaitForNotNull(goldenToiletListing)); } goldenToiletListing.CanBeDelivered = true; Logger.Msg("Adding golden toilet to Herbert's shop"); deliveryShopBuilder.AddListing(goldenToiletListing); Logger.Debug($"{goldenToiletListing.Shop}, {goldenToiletListing.CurrentStock}, {goldenToiletListing.Item.BasePurchasePrice}, {((ItemDefinition)goldenToiletListing.Item).ID}"); } DeliveryShop shop = deliveryShopBuilder.Build(); DeliveryShopBuilder.Apply(app, shop); Logger.Msg("Herbert's Curiosities created"); } } public static class OscarShop { public static readonly List<string> ItemIDs = new List<string> { "moisturepreservingpot", "airpot", "fullspectrumgrowlight", "suspensionrack", "packagingstation", "packagingstationmk2", "mixingstation", "mixingstationmk2", "dryingrack", "chemistrystation", "laboven", "cauldron", "brickpress", "locker" }; public static Instance Logger = new Instance("FurnitureDelivery-OscarShop"); public static void CreateOscarShop(DeliveryApp app) { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) Logger.Debug("Creating Oscar's Equipment shop"); LandVehicle val = NetworkSingleton<VehicleManager>.Instance.AllVehicles.AsEnumerable<LandVehicle>().FirstOrDefault((Func<LandVehicle, bool>)((LandVehicle item) => (Object)(object)item != (Object)null && ((Object)item).name.Contains("Oscar"))); if ((Object)(object)val == (Object)null) { Logger.Warning("Oscar delivery vehicle not found, using default vehicle"); val = NetworkSingleton<VehicleManager>.Instance.AllVehicles.AsEnumerable<LandVehicle>().FirstOrDefault(); } DeliveryShopBuilder deliveryShopBuilder = new DeliveryShopBuilder(app).WithShopName("Oscar's Equipment").WithShopDescription("'Specialized' equipment").WithDeliveryFee(350f) .WithShopColor(new Color(0.87f, 0.44f, 0.05f)) .WithShopImage(Utils.FindSprite("Oscar_Mugshot")) .SetAvailableByDefault(available: true) .WithDeliveryVehicle(DeliveryShopBuilder.GetOrCreateDeliveryVehicle(val)) .SetPosition(7); List<StorableItemDefinition> itemDefinitions = Utils.GetAllStorableItemDefinitions(); List<StorableItemDefinition> list = (from id in ItemIDs select ((IEnumerable<StorableItemDefinition>)itemDefinitions).FirstOrDefault((Func<StorableItemDefinition, bool>)((StorableItemDefinition item) => ((ItemDefinition)item).ID == id)) into item where (Object)(object)item != (Object)null select item).ToList(); foreach (StorableItemDefinition item in list) { Logger.Debug("Adding " + ((ItemDefinition)item).ID + " to Oscar's shop"); deliveryShopBuilder.AddListing(item); } DeliveryShop val2 = deliveryShopBuilder.Build(); DeliveryShopBuilder.Apply(app, val2); Logger.Msg("Oscar's Equipment created"); ((Component)val2).gameObject.active = false; } } public class StanShop { public static readonly Dictionary<string, float> ItemPrices = new Dictionary<string, float> { { "baseballbat", 50f }, { "fryingpan", 100f }, { "machete", 250f }, { "revolver", 1000f }, { "revolvercylinder", 10f }, { "m1911", 2500f }, { "m1911mag", 20f }, { "ak47", 15000f }, { "ak47mag", 1000f } }; public static Instance Logger = new Instance("FurnitureDelivery-StanShop"); public static void CreateStanShop(DeliveryApp app) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) Logger.Debug("Creating Stan's shop"); LandVehicle vehicle = new LandVehicleBuilder().WithVehicleName("LandVehicle_Stan").WithVehicleCode("veeper").WithPlayerOwned(isPlayerOwned: false) .WithColor((EVehicleColor)0) .Build(); DeliveryShopBuilder deliveryShopBuilder = new DeliveryShopBuilder(app).WithShopName("Armory").WithShopDescription("Weapons and ammo").WithShopColor(new Color(0.8f, 0f, 0f)) .WithShopImage(Utils.FindSprite("Fixer_Mugshot")) .WithDeliveryFee(800f) .SetAvailableByDefault(available: true) .WithDeliveryVehicle(DeliveryShopBuilder.GetOrCreateDeliveryVehicle(vehicle)) .SetPosition(8); List<StorableItemDefinition> itemDefinitions = Utils.GetAllStorableItemDefinitions(); List<(StorableItemDefinition, float)> list = (from pair in ItemPrices.Select(delegate(KeyValuePair<string, float> kvp) { StorableItemDefinition val2 = ((IEnumerable<StorableItemDefinition>)itemDefinitions).FirstOrDefault((Func<StorableItemDefinition, bool>)((StorableItemDefinition i) => ((ItemDefinition)i).ID == kvp.Key)); return ((Object)(object)val2 != (Object)null) ? (val2, kvp.Value) : (null, 0f); }) where (Object)(object)pair.item != (Object)null select pair).ToList(); foreach (var item in list) { Logger.Debug("Adding item " + ((ItemDefinition)item.Item1).ID + " to Stan's shop"); float value = item.Item2; if ((((ItemDefinition)item.Item1).ID == "ak47" || ((ItemDefinition)item.Item1).ID == "ak47mag") && MoreGunsInterop.TryGetPrices("ak47", out var gunPrice, out var magPrice)) { value = ((((ItemDefinition)item.Item1).ID == "ak47") ? gunPrice : magPrice); Logger.Msg($"Using MoreGuns price for '{((ItemDefinition)item.Item1).ID}': {value}"); } deliveryShopBuilder.AddListing(item.Item1, value); } DeliveryShop val = deliveryShopBuilder.Build(); DeliveryShopBuilder.Apply(app, val); Logger.Msg("Stan's shop created"); ((Component)val).gameObject.active = false; } } } namespace FurnitureDelivery.Interop { [HarmonyPatch(typeof(Cart))] internal static class CartPatches { [HarmonyPatch("UpdateTotal")] [HarmonyPrefix] private static bool UpdateTotal(Cart __instance) { return (Object)(object)__instance.TotalText != (Object)null; } [HarmonyPatch("UpdateProblem")] [HarmonyPrefix] private static bool UpdateProblem(Cart __instance) { return (Object)(object)__instance.ProblemText != (Object)null; } [HarmonyPatch("UpdateViewCartText")] [HarmonyPrefix] private static bool UpdateViewCartText(Cart __instance) { return (Object)(object)__instance.ViewCartText != (Object)null; } } public class DeliveryAppPlusPlusInterop { private static Instance _logger = new Instance("FurnitureDelivery-DeliveryAppPlusPlusInterop"); public static void ApplyPatches() { //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Expected O, but got Unknown Harmony harmonyInstance = ((MelonBase)Melon<FurnitureDelivery>.Instance).HarmonyInstance; Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name == "DeliveryAppPlusPlus"); if (assembly == null) { _logger.Error("Target assembly not found!"); return; } Type type = assembly.GetType("FavouriteDeliveriesPatch.DeliveryInfo"); if (type == null) { _logger.Error("DeliveryInfo type not found!"); return; } Type type2 = assembly.GetType("FavouriteDeliveriesPatch.DeliveryUtils"); if (type2 == null) { _logger.Error("Target class not found!"); return; } MethodInfo methodInfo = AccessTools.Method(type2, "OnReorder", new Type[1] { type }, (Type[])null); if (methodInfo == null) { _logger.Error("OnReorder method not found!"); } else { harmonyInstance.Patch((MethodBase)methodInfo, new HarmonyMethod(typeof(DeliveryAppPlusPlusInterop).GetMethod("OnReorder_Prefix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } private static bool OnReorder_Prefix(Il2CppObjectBase __0) { try { Type type = ((object)__0).GetType(); FieldInfo field = type.GetField("instance", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null) { MelonLogger.Warning("[Added by FurnitureDelivery] Could not find 'instance' field on DeliveryInfo."); return false; } object value = field.GetValue(__0); if (value == null) { MelonLogger.Warning("[Added by FurnitureDelivery] 'instance' field was null."); return false; } if (!(value.GetType().GetProperty("StoreName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(value) is string text)) { MelonLogger.Warning("[Added by FurnitureDelivery] 'StoreName' property was null."); return false; } DeliveryShop shop = PlayerSingleton<DeliveryApp>.Instance.GetShop(text); bool result = true; DeliveryShopCanOrderPatch.HandleAddedShops(shop, out var reason, ref result); if (!string.IsNullOrEmpty(reason)) { MelonLogger.Msg("[Added by FurnitureDelivery] Tried to order, but got " + reason); return false; } return true; } catch (Exception value2) { MelonLogger.Error($"[Added by FurnitureDelivery] Failed to reflect DeliveryInfo: {value2}"); } return false; } } public static class MoreGunsInterop { public static Instance Logger = new Instance("FurnitureDelivery-MoreGunsInterop"); public static bool TryGetPrices(string weaponID, out float gunPrice, out float magPrice) { gunPrice = 0f; magPrice = 0f; string text = "MoreGuns-" + weaponID + " Settings"; MelonPreferences_Category category = MelonPreferences.GetCategory(text); if (category == null) { Logger.Warning("Could not find category: " + text); return false; } MelonPreferences_Entry<float> entry = category.GetEntry<float>(weaponID + " Price"); MelonPreferences_Entry<float> entry2 = category.GetEntry<float>(weaponID + " Magazine Price"); if (entry == null || entry2 == null) { Logger.Warning("Missing price entries for '" + weaponID + "'"); return false; } gunPrice = entry.Value; magPrice = entry2.Value; return true; } } public static class ToileportationInterop { [HarmonyPatch(typeof(ShopListing), "Initialize")] public static class ToileportationShopListingPatch { public static void Postfix(ShopListing __instance) { if (!MelonTypeBase<MelonMod>.RegisteredMelons.All((MelonMod m) => ((MelonBase)m).Info.Name != "Toileportation") && __instance != null && !string.IsNullOrEmpty(__instance.name) && __instance.name.Contains("Golden Toilet")) { GoldenToiletListing = __instance; Logger.Msg("Captured Golden Toilet listing"); } } } public static Instance Logger = new Instance("FurnitureDelivery-ToileportationInterop"); public static ShopListing GoldenToiletListing; public static bool CanOrder(List<DeliveryShop> shops, out string reason) { reason = string.Empty; if (MelonTypeBase<MelonMod>.RegisteredMelons.All((MelonMod m) => ((MelonBase)m).Info.Name != "Toileportation")) { return true; } int currentStock = GoldenToiletListing.CurrentStock; foreach (DeliveryShop shop in shops) { List<ListingEntry> listingEntries = shop.listingEntries; Enumerator<ListingEntry> enumerator2 = listingEntries.GetEnumerator(); while (enumerator2.MoveNext()) { ListingEntry current2 = enumerator2.Current; if ((Object)(object)current2 == (Object)null || !((ItemDefinition)current2.MatchingListing.Item).Name.Contains("Golden Toilet") || current2.SelectedQuantity <= currentStock) { continue; } reason = "Not enough Golden Toilets in stock"; return false; } } return true; } public static void OnDeliveryCreated(DeliveryInstance delivery) { if (delivery == null) { return; } Il2CppReferenceArray<StringIntPair> items = delivery.Items; Logger.Debug($"Delivery created with {((Il2CppArrayBase<StringIntPair>)(object)items).Length} items"); foreach (StringIntPair item in (Il2CppArrayBase<StringIntPair>)(object)items) { Logger.Debug($"Checking item {item.String} in quantity {item.Int}"); if (item.String == "goldentoilet") { Logger.Debug("Found Golden Toilet in delivery"); if (GoldenToiletListing.CurrentStock < item.Int) { Logger.Error("Delivering more Golden Toilets than in stock"); } ShopListing goldenToiletListing = GoldenToiletListing; goldenToiletListing.CurrentStock -= item.Int; Logger.Debug($"New stock: {GoldenToiletListing.CurrentStock}"); } } } } } namespace FurnitureDelivery.Helpers { public class DeliveryShopBuilder { private string _shopName = "CustomShop"; private string _shopDescription = "Custom shop description"; private Sprite _shopImage = Utils.FindSprite("Salvador_Mugshot"); private Color _shopColor = Color.red; private float _deliveryFee = 100f; private bool _availableByDefault = true; private int _insertPosition = -1; private DeliveryVehicle _deliveryVehicle = null; private readonly List<ShopListing> _listings = new List<ShopListing>(); private readonly DeliveryShop _deliveryShopTemplate; public static readonly Dictionary<LandVehicle, DeliveryVehicle> DeliveryVehicleRegistry = new Dictionary<LandVehicle, DeliveryVehicle>(); public static Instance Logger = new Instance("FurnitureDelivery-DeliveryShopBuilder"); public DeliveryShopBuilder(DeliveryApp appInstance) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) _deliveryShopTemplate = ((IEnumerable<DeliveryShop>)((Component)appInstance).GetComponentsInChildren<DeliveryShop>(true)).FirstOrDefault(); if ((Object)(object)_deliveryShopTemplate == (Object)null) { Logger.Error("No DeliveryShop template found in app."); } } public DeliveryShopBuilder WithShopName(string name) { _shopName = name; return this; } public DeliveryShopBuilder WithDeliveryFee(float fee) { _deliveryFee = fee; return this; } public DeliveryShopBuilder SetAvailableByDefault(bool available) { _availableByDefault = available; return this; } public DeliveryShopBuilder WithDeliveryVehicle(DeliveryVehicle vehicle) { _deliveryVehicle = vehicle; return this; } public DeliveryShopBuilder WithShopDescription(string description) { _shopDescription = description; return this; } public DeliveryShopBuilder WithShopImage(Sprite image) { _shopImage = image; return this; } public DeliveryShopBuilder WithShopColor(Color color) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _shopColor = color; return this; } public static void RegisterAvailableVehicles() { VehicleManager instance = NetworkSingleton<VehicleManager>.Instance; if ((Object)(object)instance == (Object)null || instance.AllVehicles == null) { Logger.Error("VehicleManager or AllVehicles is null."); return; } foreach (LandVehicle item in instance.AllVehicles.AsEnumerable<LandVehicle>()) { if (!((Object)(object)item == (Object)null) && !DeliveryVehicleRegistry.ContainsKey(item)) { DeliveryVehicleRegistry[item] = null; } } Logger.Debug($"Registered {DeliveryVehicleRegistry.Count} vehicles for lazy wrapping."); } public static DeliveryVehicle GetOrCreateDeliveryVehicle(LandVehicle vehicle) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)vehicle == (Object)null) { return null; } if (DeliveryVehicleRegistry.TryGetValue(vehicle, out var value) && (Object)(object)value != (Object)null) { return value; } GameObject val = new GameObject("DeliveryVehicle_" + ((Object)vehicle).name); DeliveryVehicle val2 = val.AddComponent<DeliveryVehicle>(); val2.Vehicle = vehicle; Guid gUID = vehicle.GUID; val2.GUID = ((object)(Guid)(ref gUID)).ToString(); DeliveryVehicleRegistry[vehicle] = val2; return val2; } private DeliveryVehicle CreateDeliveryVehicle() { if ((Object)(object)_deliveryVehicle != (Object)null) { return _deliveryVehicle; } if (DeliveryVehicleRegistry.Count == 0) { RegisterAvailableVehicles(); } LandVehicle val = DeliveryVehicleRegistry.Keys.FirstOrDefault(); if ((Object)(object)val == (Object)null) { Logger.Error("No available vehicles registered."); return null; } return GetOrCreateDeliveryVehicle(val); } public DeliveryShopBuilder AddListing(StorableItemDefinition item, float? overridePrice = null, int quantity = 999) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown ShopListing item2 = new ShopListing { name = ((Object)item).name, Item = item, CanBeDelivered = true, OverridePrice = true, OverriddenPrice = (overridePrice ?? item.BasePurchasePrice) }; _listings.Add(item2); return this; } public DeliveryShopBuilder AddListing(ShopListing listing) { _listings.Add(listing); return this; } public DeliveryShopBuilder SetPosition(int position) { _insertPosition = position; return this; } private CartEntry CreateCartEntryPrefab() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown GameObject val = new GameObject("CartEntry"); CartEntry val2 = val.AddComponent<CartEntry>(); GameObject val3 = new GameObject("NameLabel"); val2.NameLabel = val3.AddComponent<TextMeshProUGUI>(); val3.transform.SetParent(val.transform, false); GameObject val4 = new GameObject("PriceLabel"); val2.PriceLabel = val4.AddComponent<TextMeshProUGUI>(); val4.transform.SetParent(val.transform, false); GameObject val5 = new GameObject("IncrementButton"); val2.IncrementButton = val5.AddComponent<Button>(); val5.transform.SetParent(val.transform, false); GameObject val6 = new GameObject("DecrementButton"); val2.DecrementButton = val6.AddComponent<Button>(); val6.transform.SetParent(val.transform, false); GameObject val7 = new GameObject("RemoveButton"); val2.RemoveButton = val7.AddComponent<Button>(); val7.transform.SetParent(val.transform, false); return val2; } public DeliveryShop Build() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown //IL_02d4: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_deliveryShopTemplate == (Object)null) { Logger.Error("Cannot build delivery shop without template."); return null; } GameObject val = new GameObject("ShopInterface_" + _shopName); ShopInterface val2 = val.AddComponent<ShopInterface>(); val2.ShopName = _shopName; val2.Listings = _listings.ToIl2CppList(); foreach (ShopListing listing in _listings) { listing.Shop = val2; } val2.DeliveryVehicle = CreateDeliveryVehicle(); val2.ShopCode = _shopName; Cart val3 = ((Component)val2).gameObject.AddComponent<Cart>(); ((Object)val3).name = "Cart_" + _shopName; val3.Shop = val2; val3.TotalText = ((Component)val3).gameObject.AddComponent<TextMeshProUGUI>(); val3.WarningText = ((Component)val3).gameObject.AddComponent<TextMeshProUGUI>(); val3.ProblemText = ((Component)val3).gameObject.AddComponent<TextMeshProUGUI>(); val3.ViewCartText = ((Component)val3).gameObject.AddComponent<TextMeshProUGUI>(); val3.BuyButton = ((Component)val3).gameObject.AddComponent<Button>(); val3.LoadVehicleToggle = ((Component)val3).gameObject.AddComponent<Toggle>(); val3.CartArea = ((Component)val3).gameObject.AddComponent<Image>(); val3.EntryPrefab = CreateCartEntryPrefab(); GameObject val4 = new GameObject("CartEntryContainer"); val4.transform.SetParent(((Component)val3).transform); val3.CartEntryContainer = val4.AddComponent<RectTransform>(); Logger.Debug($"Cart for shop {_shopName} is {((Object)val3).name} and is {((Component)val3).gameObject.activeSelf}"); val2.Cart = val3; ShopInterface.AllShops.Add(val2); DeliveryShop val5 = Object.Instantiate<DeliveryShop>(_deliveryShopTemplate, ((Component)_deliveryShopTemplate).transform.parent); val5.MatchingShopInterfaceName = _shopName; val5.MatchingShop = val2; val5.DeliveryFee = _deliveryFee; val5.AvailableByDefault = _availableByDefault; ((Object)((Component)val5).gameObject).name = "DeliveryShop_" + _shopName; Transform val6 = ((Component)val5).transform.Find("Header"); if ((Object)(object)val6 != (Object)null) { Image component = ((Component)val6).GetComponent<Image>(); if ((Object)(object)component != (Object)null) { ((Graphic)component).color = _shopColor; } Transform val7 = val6.Find("Icon"); if ((Object)(object)val7 != (Object)null) { Transform val8 = val7.Find("Image"); if ((Object)(object)val8 != (Object)null) { Image component2 = ((Component)val8).GetComponent<Image>(); if ((Object)(object)component2 != (Object)null && (Object)(object)_shopImage != (Object)null) { component2.sprite = _shopImage; } } } Transform val9 = val6.Find("Title"); if ((Object)(object)val9 != (Object)null) { Text component3 = ((Component)val9).GetComponent<Text>(); if ((Object)(object)component3 != (Object)null) { component3.text = _shopName; } } Transform val10 = val6.Find("Description"); if ((Object)(object)val10 != (Object)null) { Text component4 = ((Component)val10).GetComponent<Text>(); if ((Object)(object)component4 != (Object)null) { component4.text = _shopDescription; } } } ShopPositionRegistry.ShopPositions[((Object)((Component)val5).gameObject).name] = _insertPosition; ((Component)val5).gameObject.SetActive(true); return val5; } public static List<DeliveryShop> GetInitializedShops(DeliveryApp app, out Transform contentT) { contentT = ((Component)app).transform.Find("Container/Scroll View/Viewport/Content"); if ((Object)(object)contentT == (Object)null) { Logger.Error("Could not find 'Container/Scroll View/Viewport/Content' under DeliveryApp"); return null; } List<DeliveryShop> list = new List<DeliveryShop>(); for (int i = 0; i < contentT.childCount; i++) { DeliveryShop component = ((Component)contentT.GetChild(i)).GetComponent<DeliveryShop>(); if ((Object)(object)component != (Object)null) { list.Add(component); } } return list; } public static void Apply(DeliveryApp app, DeliveryShop shop) { int num = -1; if (ShopPositionRegistry.ShopPositions.TryGetValue(((Object)((Component)shop).gameObject).name, out var value)) { num = value; Logger.Debug($"Found position {num} for shop {((Object)((Component)shop).gameObject).name}"); } if (num < 0) { num = app.deliveryShops.Count + num + 1; if (num < 0) { num = 0; } } if (num > app.deliveryShops.Count) { num = app.deliveryShops.Count; } if (num < app.deliveryShops.Count) { Logger.Debug($"Inserting shop at position {num}"); app.deliveryShops.Insert(num, shop); } else { Logger.Debug($"Adding shop to end at position {num}"); app.deliveryShops.Add(shop); } Logger.Msg("Added new delivery shop to app: " + ((Object)shop).name + ", " + ((Object)((Component)shop).gameObject).name); FixShopHierarchy(app); } private static void FixShopHierarchy(DeliveryApp app) { Transform contentT; List<DeliveryShop> initializedShops = GetInitializedShops(app, out contentT); Logger.Debug($"Found {initializedShops.Count} shop components in UI hierarchy"); for (int i = 0; i < app.deliveryShops.Count; i++) { DeliveryShop val = app.deliveryShops.AsEnumerable<DeliveryShop>().ElementAt(i); if (!(((Object)((Component)val).gameObject).name == "Space") && !((Object)((Component)val).gameObject).name.Contains("Spacer")) { ((Component)val).transform.SetParent(contentT, false); ((Component)val).transform.SetSiblingIndex(i); Logger.Debug($"Set {((Object)((Component)val).gameObject).name} to sibling index {i}"); } } } } public static class ShopPositionRegistry { public static Dictionary<string, int> ShopPositions = new Dictionary<string, int>(); } public class LandVehicleBuilder { private string _vehicleName = "CustomVehicle"; private string _vehicleCode = "shitbox"; private float _vehiclePrice = 1000f; private float _topSpeed = 60f; private bool _isPlayerOwned = true; private EVehicleColor _color = (EVehicleColor)16; public static List<LandVehicle> VehiclePrefabs = NetworkSingleton<VehicleManager>.Instance.VehiclePrefabs.ConvertToList<LandVehicle>(); public LandVehicleBuilder WithVehicleName(string vehicleName) { _vehicleName = vehicleName; return this; } public LandVehicleBuilder WithVehicleCode(string vehicleCode) { _vehicleCode = vehicleCode; return this; } public LandVehicleBuilder WithVehiclePrice(float vehiclePrice) { _vehiclePrice = vehiclePrice; return this; } public LandVehicleBuilder WithTopSpeed(float topSpeed) { _topSpeed = topSpeed; return this; } public LandVehicleBuilder WithPlayerOwned(bool isPlayerOwned) { _isPlayerOwned = isPlayerOwned; return this; } public LandVehicleBuilder WithColor(EVehicleColor color) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _color = color; return this; } public LandVehicle Build() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_0093: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(130f, 50f, -250f); Quaternion identity = Quaternion.identity; LandVehicle val2 = NetworkSingleton<VehicleManager>.Instance.SpawnAndReturnVehicle(_vehicleCode, val, identity, false); val2.SetGUID(GUIDManager.GenerateUniqueGUID()); ((Object)val2).name = _vehicleName; ((Object)((Component)val2).gameObject).name = _vehicleName; val2.vehicleName = _vehicleName; val2.vehiclePrice = _vehiclePrice; val2.TopSpeed = _topSpeed; val2.ApplyColor(_color); val2.SetOwnedColor((NetworkConnection)null, _color); val2.SetIsPlayerOwned((NetworkConnection)null, _isPlayerOwned); if (_isPlayerOwned) { NetworkSingleton<VehicleManager>.Instance.PlayerOwnedVehicles.Add(val2); } NetworkSingleton<VehicleManager>.Instance.AllVehicles.Add(val2); return val2; } } public static class MelonLoggerExtensions { public static void Debug(this Instance logger, string message, bool stacktrace = true) { } private static string GetLoggerName(Instance logger) { return typeof(Instance).GetField("Name", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(logger) as string; } private static void InvokeNativeMsg(Color namesectionColor, Color textColor, string nameSection, string message) { typeof(MelonLogger).GetMethod("NativeMsg", BindingFlags.Static | BindingFlags.NonPublic)?.Invoke(null, new object[5] { namesectionColor, textColor, nameSection, message ?? "null", false }); } private static string GetCallerInfo() { StackTrace stackTrace = new StackTrace(); for (int i = 2; i < stackTrace.FrameCount; i++) { StackFrame frame = stackTrace.GetFrame(i); MethodBase method = frame.GetMethod(); if (!(method?.DeclaringType == null)) { return method.DeclaringType.FullName + "." + method.Name; } } return "unknown"; } } public static class Il2CppListExtensions { public static IEnumerable<T> AsEnumerable<T>(this List<T> list) { return list ?? new List<T>(); } public static List<T> ToIl2CppList<T>(this IEnumerable<T> source) { List<T> val = new List<T>(); foreach (T item in source) { val.Add(item); } return val; } public static List<T> ConvertToList<T>(this List<T> il2CppList) { List<T> list = new List<T>(); T[] collection = Il2CppArrayBase<T>.op_Implicit(il2CppList.ToArray()); list.AddRange(collection); return list; } public static IEnumerable<T> AsEnumerable<T>(this List<T> list) { IEnumerable<T> result; if (list != null) { result = ((IEnumerable<T>)list._items).Take(list._size); } else { IEnumerable<T> enumerable = Array.Empty<T>(); result = enumerable; } return result; } } public static class Utils { [CompilerGenerated] private sealed class <WaitForNetworkSingleton>d__6<T> : IEnumerator<object>, IEnumerator, IDisposable where T : NetworkSingleton<T> { private int <>1__state; private object <>2__current; public IEnumerator coroutine; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNetworkSingleton>d__6(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; goto IL_0044; case 1: <>1__state = -1; goto IL_0044; case 2: { <>1__state = -1; return false; } IL_0044: if (!NetworkSingleton<T>.InstanceExists) { <>2__current = null; <>1__state = 1; return true; } <>2__current = coroutine; <>1__state = 2; 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(); } } [CompilerGenerated] private sealed class <WaitForNotNull>d__5 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public object obj; public float timeout; public Action onTimeout; public Action onFinish; private float <startTime>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNotNull>d__5(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <startTime>5__1 = Time.time; break; case 1: <>1__state = -1; break; } if (obj == null) { if (!float.IsNaN(timeout) && Time.time - <startTime>5__1 > timeout) { onTimeout?.Invoke(); return false; } <>2__current = null; <>1__state = 1; return true; } onFinish?.Invoke(); 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 Instance Logger = new Instance("FurnitureDelivery-Utils"); public static Sprite FindSprite(string spriteName) { try { foreach (Sprite item in Resources.FindObjectsOfTypeAll<Sprite>()) { if (((Object)item).name == spriteName) { Logger.Debug("Found sprite '" + spriteName + "' directly in loaded objects"); return item; } } return null; } catch (Exception ex) { Logger.Error("Error finding sprite '" + spriteName + "': " + ex.Message); return null; } } public static List<T> GetAllComponentsInChildrenRecursive<T>(GameObject obj) where T : Component { List<T> list = new List<T>(); if ((Object)(object)obj == (Object)null) { return list; } T[] array = Il2CppArrayBase<T>.op_Implicit(obj.GetComponents<T>()); if (array.Length != 0) { list.AddRange(array); } for (int i = 0; i < obj.transform.childCount; i++) { Transform child = obj.transform.GetChild(i); list.AddRange(GetAllComponentsInChildrenRecursive<T>(((Component)child).gameObject)); } return list; } public static bool Is<T>(object obj, out T result) where T : Object { Object val = (Object)((obj is Object) ? obj : null); if (val != null) { Type val2 = Il2CppType.Of<T>(); Type il2CppType = val.GetIl2CppType(); if (val2.IsAssignableFrom(il2CppType)) { result = ((Il2CppObjectBase)val).TryCast<T>(); return result != null; } } result = default(T); return false; } public static List<StorableItemDefinition> GetAllStorableItemDefinitions() { List<ItemRegister> list = Singleton<Registry>.Instance.ItemRegistry.ConvertToList<ItemRegister>(); List<StorableItemDefinition> list2 = new List<StorableItemDefinition>(); foreach (ItemRegister item in list) { if (Utils.Is<StorableItemDefinition>((object)item.Definition, out StorableItemDefinition result)) { list2.Add(result); } else { Logger.Warning("Definition " + ((object)item.Definition)?.GetType().FullName + " is not a StorableItemDefinition"); } } return list2.ToList(); } [IteratorStateMachine(typeof(<WaitForNotNull>d__5))] public static IEnumerator WaitForNotNull([MaybeNull] object obj, float timeout = float.NaN, Action onTimeout = null, Action onFinish = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNotNull>d__5(0) { obj = obj, timeout = timeout, onTimeout = onTimeout, onFinish = onFinish }; } [IteratorStateMachine(typeof(<WaitForNetworkSingleton>d__6<>))] public static IEnumerator WaitForNetworkSingleton<T>(IEnumerator coroutine) where T : NetworkSingleton<T> { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNetworkSingleton>d__6<T>(0) { coroutine = coroutine }; } } }
FurnitureDelivery-Mono.dll
Decompiled a day agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using FishNet.Connection; using FurnitureDelivery; using FurnitureDelivery.Helpers; using FurnitureDelivery.Interop; using FurnitureDelivery.Shops; using HarmonyLib; using MelonLoader; using Microsoft.CodeAnalysis; using ScheduleOne; using ScheduleOne.Delivery; using ScheduleOne.DevUtilities; using ScheduleOne.ItemFramework; using ScheduleOne.PlayerScripts; using ScheduleOne.UI.Phone.Delivery; using ScheduleOne.UI.Shop; using ScheduleOne.Vehicles; using ScheduleOne.Vehicles.Modification; using TMPro; using UnityEngine; using UnityEngine.Events; 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(global::FurnitureDelivery.FurnitureDelivery), "FurnitureDelivery", "1.6.2", "k073l", null)] [assembly: MelonColor(1, 255, 215, 0)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: MelonOptionalDependencies(new string[] { "MoreGuns", "Toileportation", "UpgradedTrashCans", "DeliveryApp++" })] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("FurnitureDelivery-Mono")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3b5d1c951e351d8e3fb8dbafbd0621d9306828ef")] [assembly: AssemblyProduct("FurnitureDelivery-Mono")] [assembly: AssemblyTitle("FurnitureDelivery-Mono")] [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 FurnitureDelivery { public static class BuildInfo { public const string Name = "FurnitureDelivery"; public const string Description = "Adds a custom delivery shops for furniture items"; public const string Author = "k073l"; public const string Version = "1.6.2"; } public class FurnitureDelivery : MelonMod { [CompilerGenerated] private sealed class <OnDeliveryManagerReady>d__6 : IEnumerator<object>, IEnumerator, IDisposable { 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 <OnDeliveryManagerReady>d__6(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { if (<>1__state != 0) { return false; } <>1__state = -1; MelonLogger.Debug("Delivery manager ready"); NetworkSingleton<DeliveryManager>.Instance.onDeliveryCreated.AddListener((UnityAction<DeliveryInstance>)ToileportationInterop.OnDeliveryCreated); 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(); } } private static Instance MelonLogger { get; set; } public override void OnInitializeMelon() { MelonLogger = ((MelonBase)this).LoggerInstance; MelonLogger.Msg("FurnitureDelivery initialized"); if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("MoreGuns"))) { MelonLogger.Msg("MoreGuns detected. Adding ak47 to Armory"); } if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("Toileportation"))) { MelonLogger.Msg("Toileportation detected. Adding Golden Toilet to Herbert's shop"); } if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("UpgradedTrashCans"))) { MelonLogger.Msg("UpgradedTrashCans detected. Adding trash bins to Dan's shop"); } } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("Toileportation"))) { if (sceneName == "Main") { MelonCoroutines.Start(Utils.WaitForNetworkSingleton<DeliveryManager>(OnDeliveryManagerReady())); MelonLogger.Debug("Repatching CanOrder"); DeliveryShopCanOrderPatch.ApplyManualPatch(); } if (sceneName == "Menu") { if ((Object)(object)NetworkSingleton<DeliveryManager>.Instance != (Object)null) { NetworkSingleton<DeliveryManager>.Instance.onDeliveryCreated.RemoveListener((UnityAction<DeliveryInstance>)ToileportationInterop.OnDeliveryCreated); } ToileportationInterop.GoldenToiletListing = null; } } if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name.Contains("DeliveryApp++"))) { MelonLogger.Msg("DeliveryAppPlusPlus detected. Applying patches"); DeliveryAppPlusPlusInterop.ApplyPatches(); } } [IteratorStateMachine(typeof(<OnDeliveryManagerReady>d__6))] private static IEnumerator OnDeliveryManagerReady() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <OnDeliveryManagerReady>d__6(0); } } [HarmonyPatch(typeof(DeliveryShop), "SetIsAvailable")] public class DeliveryShopSetIsAvailablePatch { public static Instance Logger = new Instance("FurnitureDelivery-SetIsAvailable"); public static void Postfix(DeliveryShop __instance) { DeliveryApp instance = PlayerSingleton<DeliveryApp>.Instance; Transform contentT; List<DeliveryShop> initializedShops = DeliveryShopBuilder.GetInitializedShops(instance, out contentT); DeliveryShop val = initializedShops?.FirstOrDefault((Func<DeliveryShop, bool>)((DeliveryShop item) => ((Object)((Component)item).gameObject).name.StartsWith("Oscar"))); if ((Object)(object)val == (Object)null || ((Object)((Component)__instance).gameObject).name != ((Object)((Component)val).gameObject).name) { return; } Logger.Msg("First Oscar's shop: " + ((Object)((Component)val).gameObject).name + " set to active, setting other one to active"); DeliveryShop val2 = ((IEnumerable<DeliveryShop>)initializedShops).FirstOrDefault((Func<DeliveryShop, bool>)((DeliveryShop item) => ((Object)((Component)item).gameObject).name.StartsWith("DeliveryShop_Oscar"))); if ((Object)(object)val2 == (Object)null) { Logger.Warning("Oscar's equipment shop not found"); return; } ((Component)val2).gameObject.SetActive(true); DeliveryShop val3 = ((IEnumerable<DeliveryShop>)initializedShops).FirstOrDefault((Func<DeliveryShop, bool>)((DeliveryShop item) => ((Object)((Component)item).gameObject).name.StartsWith("DeliveryShop_Armory"))); if ((Object)(object)val3 == (Object)null) { Logger.Warning("Stan's shop not found"); } else { ((Component)val3).gameObject.SetActive(true); } } } internal class InitializedShopsCache { public static Dictionary<string, DeliveryShop> shops = new Dictionary<string, DeliveryShop>(); public static DeliveryShop GetShop(string name) { if (!shops.ContainsKey(name)) { DeliveryApp instance = PlayerSingleton<DeliveryApp>.Instance; Transform contentT; List<DeliveryShop> initializedShops = DeliveryShopBuilder.GetInitializedShops(instance, out contentT); foreach (DeliveryShop item in initializedShops) { shops.TryAdd(((Object)((Component)item).gameObject).name, item); } } DeliveryShop value; return shops.TryGetValue(name, out value) ? value : null; } public static List<DeliveryShop> GetShops(string name) { if (!shops.Any()) { GetShop(name); } return (from kvp in shops where kvp.Key.Contains(name) select kvp.Value).ToList(); } } [HarmonyPatch(typeof(DeliveryShop), "CanOrder")] public class DeliveryShopCanOrderPatch { public static bool HandleAddedShops(DeliveryShop shop, out string reason, ref bool result) { string name = ((Object)((Component)shop).gameObject).name; if (name.Contains("Herbert")) { result = ToileportationInterop.CanOrder(InitializedShopsCache.GetShops("Herbert"), out reason); if (!result) { result = false; return false; } } if (name.Contains("Dan")) { List<DeliveryShop> shops = InitializedShopsCache.GetShops("Dan"); foreach (DeliveryShop item in shops) { if (NetworkSingleton<DeliveryManager>.Instance.GetActiveShopDelivery(item) != null) { result = false; reason = "Dan is currently delivering an order"; return false; } } } if (name.Contains("Oscar")) { List<DeliveryShop> shops2 = InitializedShopsCache.GetShops("Oscar"); foreach (DeliveryShop item2 in shops2) { if (NetworkSingleton<DeliveryManager>.Instance.GetActiveShopDelivery(item2) != null) { result = false; reason = "Oscar is currently delivering an order"; return false; } } } reason = string.Empty; return true; } public static bool Prefix(DeliveryShop __instance, out string reason, ref bool __result) { return HandleAddedShops(__instance, out reason, ref __result); } public static void ApplyManualPatch() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown Harmony harmonyInstance = ((MelonBase)Melon<FurnitureDelivery>.Instance).HarmonyInstance; if (!harmonyInstance.GetPatchedMethods().Contains(AccessTools.Method(typeof(DeliveryShop), "CanOrder", (Type[])null, (Type[])null))) { harmonyInstance.Patch((MethodBase)AccessTools.Method(typeof(DeliveryShop), "CanOrder", (Type[])null, (Type[])null), new HarmonyMethod(typeof(DeliveryShopCanOrderPatch), "Prefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } [HarmonyPatch(typeof(DeliveryApp), "Awake")] public class DeliveryAppAwakePatch { public static Instance Logger = new Instance("FurnitureDelivery-AppAwake"); public static void Postfix(DeliveryApp __instance) { Logger.Debug("DeliveryApp Awake called"); DeliveryApp instance = PlayerSingleton<DeliveryApp>.Instance; DanShop.CreateDanShop(instance); HerbertShop.CreateHerbertShop(instance); OscarShop.CreateOscarShop(instance); StanShop.CreateStanShop(instance); } } [HarmonyPatch(typeof(VehicleCamera))] public static class VehicleCameraPatch { [HarmonyPrefix] [HarmonyPatch("LateUpdate")] public static bool SafeLateUpdatePrefix(VehicleCamera __instance) { return (Object)(object)__instance.vehicle != (Object)null && (Object)(object)__instance.cameraOrigin != (Object)null && (Object)(object)PlayerSingleton<PlayerCamera>.Instance != (Object)null; } [HarmonyPrefix] [HarmonyPatch("Update")] public static bool SafeUpdatePrefix(VehicleCamera __instance) { return (Object)(object)__instance.vehicle != (Object)null && (Object)(object)__instance.cameraOrigin != (Object)null && (Object)(object)PlayerSingleton<PlayerCamera>.Instance != (Object)null; } } } namespace FurnitureDelivery.Shops { public static class DanShop { public static readonly List<string> ItemIDs = new List<string> { "coffeetable", "metalsquaretable", "woodsquaretable", "toilet", "trashcan", "trash_bin", "trash_compactor", "bed", "locker", "TV", "floorlamp", "growtent", "plasticpot", "halogengrowlight", "ledgrowlight", "suspensionrack", "soilpourer", "potsprinkler", "largestoragerack", "mediumstoragerack", "smallstoragerack" }; public static Instance Logger = new Instance("FurnitureDelivery-DanShop"); public static void CreateDanShop(DeliveryApp app) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) Logger.Debug("Creating Dan's Furniture shop"); LandVehicle vehicle = NetworkSingleton<VehicleManager>.Instance.AllVehicles.AsEnumerable().FirstOrDefault(); DeliveryShopBuilder deliveryShopBuilder = new DeliveryShopBuilder(app).WithShopName("Dan's Furniture").WithShopDescription("General furniture").WithShopColor(new Color(0.06f, 0.56f, 0.87f)) .WithShopImage(Utils.FindSprite("Dan_Mugshot")) .WithDeliveryFee(300f) .SetAvailableByDefault(available: true) .WithDeliveryVehicle(DeliveryShopBuilder.GetOrCreateDeliveryVehicle(vehicle)) .SetPosition(2); List<StorableItemDefinition> itemDefinitions = Utils.GetAllStorableItemDefinitions(); List<StorableItemDefinition> list = (from id in ItemIDs select ((IEnumerable<StorableItemDefinition>)itemDefinitions).FirstOrDefault((Func<StorableItemDefinition, bool>)((StorableItemDefinition item) => ((ItemDefinition)item).ID == id)) into item where (Object)(object)item != (Object)null select item).ToList(); foreach (StorableItemDefinition item in list) { Logger.Debug("Adding item " + ((Object)item).name + " to Dan's shop"); deliveryShopBuilder.AddListing(item); } DeliveryShop shop = deliveryShopBuilder.Build(); DeliveryShopBuilder.Apply(app, shop); Logger.Msg("Dan's Furniture created"); } } public class HerbertShop { public static readonly List<string> ItemIDs = new List<string> { "woodensign", "metalsign", "wallmountedshelf", "antiquewalllamp", "modernwalllamp", "wallclock", "grandfatherclock", "safe", "jukebox", "goldenskateboard", "filingcabinet", "smalltrashcan", "dumpster" }; public static Instance Logger = new Instance("FurnitureDelivery-HerbertShop"); public static void CreateHerbertShop(DeliveryApp app) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) Logger.Debug("Creating Herbert's shop"); LandVehicle vehicle = new LandVehicleBuilder().WithVehicleName("LandVehicle_Herbert").WithVehicleCode("veeper").WithPlayerOwned(isPlayerOwned: false) .WithColor((EVehicleColor)11) .Build(); DeliveryShopBuilder deliveryShopBuilder = new DeliveryShopBuilder(app).WithShopName("Herbert's Curiosities").WithShopDescription("Boutique's picks and exotic items").WithShopColor(new Color(0.2f, 0f, 1f)) .WithShopImage(Utils.FindSprite("Herbert_Mugshot")) .WithDeliveryFee(500f) .SetAvailableByDefault(available: true) .WithDeliveryVehicle(DeliveryShopBuilder.GetOrCreateDeliveryVehicle(vehicle)) .SetPosition(5); List<StorableItemDefinition> itemDefinitions = Utils.GetAllStorableItemDefinitions(); List<StorableItemDefinition> list = (from id in ItemIDs select ((IEnumerable<StorableItemDefinition>)itemDefinitions).FirstOrDefault((Func<StorableItemDefinition, bool>)((StorableItemDefinition item) => ((ItemDefinition)item).ID == id)) into item where (Object)(object)item != (Object)null select item).ToList(); foreach (StorableItemDefinition item in list) { Logger.Debug("Adding item " + ((Object)item).name + " to Herbert's shop"); deliveryShopBuilder.AddListing(item); } if (MelonTypeBase<MelonMod>.RegisteredMelons.Any((MelonMod m) => ((MelonBase)m).Info.Name == "Toileportation")) { ShopListing goldenToiletListing = ToileportationInterop.GoldenToiletListing; if (goldenToiletListing == null) { Logger.Warning("Golden toilet listing not found, waiting for it to be created"); MelonCoroutines.Start(Utils.WaitForNotNull(goldenToiletListing)); } goldenToiletListing.CanBeDelivered = true; Logger.Msg("Adding golden toilet to Herbert's shop"); deliveryShopBuilder.AddListing(goldenToiletListing); Logger.Debug($"{goldenToiletListing.Shop}, {goldenToiletListing.CurrentStock}, {goldenToiletListing.Item.BasePurchasePrice}, {((ItemDefinition)goldenToiletListing.Item).ID}"); } DeliveryShop shop = deliveryShopBuilder.Build(); DeliveryShopBuilder.Apply(app, shop); Logger.Msg("Herbert's Curiosities created"); } } public static class OscarShop { public static readonly List<string> ItemIDs = new List<string> { "moisturepreservingpot", "airpot", "fullspectrumgrowlight", "suspensionrack", "packagingstation", "packagingstationmk2", "mixingstation", "mixingstationmk2", "dryingrack", "chemistrystation", "laboven", "cauldron", "brickpress", "locker" }; public static Instance Logger = new Instance("FurnitureDelivery-OscarShop"); public static void CreateOscarShop(DeliveryApp app) { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) Logger.Debug("Creating Oscar's Equipment shop"); LandVehicle val = NetworkSingleton<VehicleManager>.Instance.AllVehicles.AsEnumerable().FirstOrDefault((Func<LandVehicle, bool>)((LandVehicle item) => (Object)(object)item != (Object)null && ((Object)item).name.Contains("Oscar"))); if ((Object)(object)val == (Object)null) { Logger.Warning("Oscar delivery vehicle not found, using default vehicle"); val = NetworkSingleton<VehicleManager>.Instance.AllVehicles.AsEnumerable().FirstOrDefault(); } DeliveryShopBuilder deliveryShopBuilder = new DeliveryShopBuilder(app).WithShopName("Oscar's Equipment").WithShopDescription("'Specialized' equipment").WithDeliveryFee(350f) .WithShopColor(new Color(0.87f, 0.44f, 0.05f)) .WithShopImage(Utils.FindSprite("Oscar_Mugshot")) .SetAvailableByDefault(available: true) .WithDeliveryVehicle(DeliveryShopBuilder.GetOrCreateDeliveryVehicle(val)) .SetPosition(7); List<StorableItemDefinition> itemDefinitions = Utils.GetAllStorableItemDefinitions(); List<StorableItemDefinition> list = (from id in ItemIDs select ((IEnumerable<StorableItemDefinition>)itemDefinitions).FirstOrDefault((Func<StorableItemDefinition, bool>)((StorableItemDefinition item) => ((ItemDefinition)item).ID == id)) into item where (Object)(object)item != (Object)null select item).ToList(); foreach (StorableItemDefinition item in list) { Logger.Debug("Adding " + ((ItemDefinition)item).ID + " to Oscar's shop"); deliveryShopBuilder.AddListing(item); } DeliveryShop val2 = deliveryShopBuilder.Build(); DeliveryShopBuilder.Apply(app, val2); Logger.Msg("Oscar's Equipment created"); ((Component)val2).gameObject.active = false; } } public class StanShop { public static readonly Dictionary<string, float> ItemPrices = new Dictionary<string, float> { { "baseballbat", 50f }, { "fryingpan", 100f }, { "machete", 250f }, { "revolver", 1000f }, { "revolvercylinder", 10f }, { "m1911", 2500f }, { "m1911mag", 20f }, { "ak47", 15000f }, { "ak47mag", 1000f } }; public static Instance Logger = new Instance("FurnitureDelivery-StanShop"); public static void CreateStanShop(DeliveryApp app) { //IL_006c: Unknown result type (might be due to invalid IL or missing references) Logger.Debug("Creating Stan's shop"); LandVehicle vehicle = new LandVehicleBuilder().WithVehicleName("LandVehicle_Stan").WithVehicleCode("veeper").WithPlayerOwned(isPlayerOwned: false) .WithColor((EVehicleColor)0) .Build(); DeliveryShopBuilder deliveryShopBuilder = new DeliveryShopBuilder(app).WithShopName("Armory").WithShopDescription("Weapons and ammo").WithShopColor(new Color(0.8f, 0f, 0f)) .WithShopImage(Utils.FindSprite("Fixer_Mugshot")) .WithDeliveryFee(800f) .SetAvailableByDefault(available: true) .WithDeliveryVehicle(DeliveryShopBuilder.GetOrCreateDeliveryVehicle(vehicle)) .SetPosition(8); List<StorableItemDefinition> itemDefinitions = Utils.GetAllStorableItemDefinitions(); List<(StorableItemDefinition, float)> list = (from pair in ItemPrices.Select(delegate(KeyValuePair<string, float> kvp) { StorableItemDefinition val2 = ((IEnumerable<StorableItemDefinition>)itemDefinitions).FirstOrDefault((Func<StorableItemDefinition, bool>)((StorableItemDefinition i) => ((ItemDefinition)i).ID == kvp.Key)); return ((Object)(object)val2 != (Object)null) ? (val2, kvp.Value) : (null, 0f); }) where (Object)(object)pair.item != (Object)null select pair).ToList(); foreach (var item in list) { Logger.Debug("Adding item " + ((ItemDefinition)item.Item1).ID + " to Stan's shop"); float num = item.Item2; if ((((ItemDefinition)item.Item1).ID == "ak47" || ((ItemDefinition)item.Item1).ID == "ak47mag") && MoreGunsInterop.TryGetPrices("ak47", out var gunPrice, out var magPrice)) { num = ((((ItemDefinition)item.Item1).ID == "ak47") ? gunPrice : magPrice); Logger.Msg($"Using MoreGuns price for '{((ItemDefinition)item.Item1).ID}': {num}"); } deliveryShopBuilder.AddListing(item.Item1, num); } DeliveryShop val = deliveryShopBuilder.Build(); DeliveryShopBuilder.Apply(app, val); Logger.Msg("Stan's shop created"); ((Component)val).gameObject.active = false; } } } namespace FurnitureDelivery.Interop { [HarmonyPatch(typeof(Cart))] internal static class CartPatches { [HarmonyPatch("UpdateTotal")] [HarmonyPrefix] private static bool UpdateTotal(Cart __instance) { return (Object)(object)__instance.TotalText != (Object)null; } [HarmonyPatch("UpdateProblem")] [HarmonyPrefix] private static bool UpdateProblem(Cart __instance) { return (Object)(object)__instance.ProblemText != (Object)null; } [HarmonyPatch("UpdateViewCartText")] [HarmonyPrefix] private static bool UpdateViewCartText(Cart __instance) { return (Object)(object)__instance.ViewCartText != (Object)null; } } public class DeliveryAppPlusPlusInterop { private static Instance _logger = new Instance("FurnitureDelivery-DeliveryAppPlusPlusInterop"); public static void ApplyPatches() { //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Expected O, but got Unknown Harmony harmonyInstance = ((MelonBase)Melon<FurnitureDelivery>.Instance).HarmonyInstance; Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name == "DeliveryAppPlusPlus"); if (assembly == null) { _logger.Error("Target assembly not found!"); return; } Type type = assembly.GetType("FavouriteDeliveriesPatch.DeliveryInfo"); if (type == null) { _logger.Error("DeliveryInfo type not found!"); return; } Type type2 = assembly.GetType("FavouriteDeliveriesPatch.DeliveryUtils"); if (type2 == null) { _logger.Error("Target class not found!"); return; } MethodInfo methodInfo = AccessTools.Method(type2, "OnReorder", new Type[1] { type }, (Type[])null); if (methodInfo == null) { _logger.Error("OnReorder method not found!"); } else { harmonyInstance.Patch((MethodBase)methodInfo, new HarmonyMethod(typeof(DeliveryAppPlusPlusInterop).GetMethod("OnReorder_Prefix", BindingFlags.Static | BindingFlags.NonPublic)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } private static bool OnReorder_Prefix(object __0) { try { Type type = __0.GetType(); FieldInfo field = type.GetField("instance", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null) { MelonLogger.Warning("[Added by FurnitureDelivery] Could not find 'instance' field on DeliveryInfo."); return false; } object value = field.GetValue(__0); if (value == null) { MelonLogger.Warning("[Added by FurnitureDelivery] 'instance' field was null."); return false; } if (!(value.GetType().GetProperty("StoreName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(value) is string text)) { MelonLogger.Warning("[Added by FurnitureDelivery] 'StoreName' property was null."); return false; } DeliveryShop shop = PlayerSingleton<DeliveryApp>.Instance.GetShop(text); bool result = true; DeliveryShopCanOrderPatch.HandleAddedShops(shop, out var reason, ref result); if (!string.IsNullOrEmpty(reason)) { MelonLogger.Msg("[Added by FurnitureDelivery] Tried to order, but got " + reason); return false; } return true; } catch (Exception arg) { MelonLogger.Error($"[Added by FurnitureDelivery] Failed to reflect DeliveryInfo: {arg}"); } return false; } } public static class MoreGunsInterop { public static Instance Logger = new Instance("FurnitureDelivery-MoreGunsInterop"); public static bool TryGetPrices(string weaponID, out float gunPrice, out float magPrice) { gunPrice = 0f; magPrice = 0f; string text = "MoreGuns-" + weaponID + " Settings"; MelonPreferences_Category category = MelonPreferences.GetCategory(text); if (category == null) { Logger.Warning("Could not find category: " + text); return false; } MelonPreferences_Entry<float> entry = category.GetEntry<float>(weaponID + " Price"); MelonPreferences_Entry<float> entry2 = category.GetEntry<float>(weaponID + " Magazine Price"); if (entry == null || entry2 == null) { Logger.Warning("Missing price entries for '" + weaponID + "'"); return false; } gunPrice = entry.Value; magPrice = entry2.Value; return true; } } public static class ToileportationInterop { [HarmonyPatch(typeof(ShopListing), "Initialize")] public static class ToileportationShopListingPatch { public static void Postfix(ShopListing __instance) { if (!MelonTypeBase<MelonMod>.RegisteredMelons.All((MelonMod m) => ((MelonBase)m).Info.Name != "Toileportation") && __instance != null && !string.IsNullOrEmpty(__instance.name) && __instance.name.Contains("Golden Toilet")) { GoldenToiletListing = __instance; Logger.Msg("Captured Golden Toilet listing"); } } } public static Instance Logger = new Instance("FurnitureDelivery-ToileportationInterop"); public static ShopListing GoldenToiletListing; public static bool CanOrder(List<DeliveryShop> shops, out string reason) { reason = string.Empty; if (MelonTypeBase<MelonMod>.RegisteredMelons.All((MelonMod m) => ((MelonBase)m).Info.Name != "Toileportation")) { return true; } int currentStock = GoldenToiletListing.CurrentStock; foreach (DeliveryShop shop in shops) { List<ListingEntry> listingEntries = shop.listingEntries; foreach (ListingEntry item in listingEntries) { if ((Object)(object)item == (Object)null || !((ItemDefinition)item.MatchingListing.Item).Name.Contains("Golden Toilet") || item.SelectedQuantity <= currentStock) { continue; } reason = "Not enough Golden Toilets in stock"; return false; } } return true; } public static void OnDeliveryCreated(DeliveryInstance delivery) { if (delivery == null) { return; } StringIntPair[] items = delivery.Items; Logger.Debug($"Delivery created with {items.Length} items"); StringIntPair[] array = items; foreach (StringIntPair val in array) { Logger.Debug($"Checking item {val.String} in quantity {val.Int}"); if (val.String == "goldentoilet") { Logger.Debug("Found Golden Toilet in delivery"); if (GoldenToiletListing.CurrentStock < val.Int) { Logger.Error("Delivering more Golden Toilets than in stock"); } ShopListing goldenToiletListing = GoldenToiletListing; goldenToiletListing.CurrentStock -= val.Int; Logger.Debug($"New stock: {GoldenToiletListing.CurrentStock}"); } } } } } namespace FurnitureDelivery.Helpers { public class DeliveryShopBuilder { private string _shopName = "CustomShop"; private string _shopDescription = "Custom shop description"; private Sprite _shopImage = Utils.FindSprite("Salvador_Mugshot"); private Color _shopColor = Color.red; private float _deliveryFee = 100f; private bool _availableByDefault = true; private int _insertPosition = -1; private DeliveryVehicle _deliveryVehicle = null; private readonly List<ShopListing> _listings = new List<ShopListing>(); private readonly DeliveryShop _deliveryShopTemplate; public static readonly Dictionary<LandVehicle, DeliveryVehicle> DeliveryVehicleRegistry = new Dictionary<LandVehicle, DeliveryVehicle>(); public static Instance Logger = new Instance("FurnitureDelivery-DeliveryShopBuilder"); public DeliveryShopBuilder(DeliveryApp appInstance) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) _deliveryShopTemplate = ((Component)appInstance).GetComponentsInChildren<DeliveryShop>(true).FirstOrDefault(); if ((Object)(object)_deliveryShopTemplate == (Object)null) { Logger.Error("No DeliveryShop template found in app."); } } public DeliveryShopBuilder WithShopName(string name) { _shopName = name; return this; } public DeliveryShopBuilder WithDeliveryFee(float fee) { _deliveryFee = fee; return this; } public DeliveryShopBuilder SetAvailableByDefault(bool available) { _availableByDefault = available; return this; } public DeliveryShopBuilder WithDeliveryVehicle(DeliveryVehicle vehicle) { _deliveryVehicle = vehicle; return this; } public DeliveryShopBuilder WithShopDescription(string description) { _shopDescription = description; return this; } public DeliveryShopBuilder WithShopImage(Sprite image) { _shopImage = image; return this; } public DeliveryShopBuilder WithShopColor(Color color) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _shopColor = color; return this; } public static void RegisterAvailableVehicles() { VehicleManager instance = NetworkSingleton<VehicleManager>.Instance; if ((Object)(object)instance == (Object)null || instance.AllVehicles == null) { Logger.Error("VehicleManager or AllVehicles is null."); return; } foreach (LandVehicle item in instance.AllVehicles.AsEnumerable()) { if (!((Object)(object)item == (Object)null) && !DeliveryVehicleRegistry.ContainsKey(item)) { DeliveryVehicleRegistry[item] = null; } } Logger.Debug($"Registered {DeliveryVehicleRegistry.Count} vehicles for lazy wrapping."); } public static DeliveryVehicle GetOrCreateDeliveryVehicle(LandVehicle vehicle) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown if ((Object)(object)vehicle == (Object)null) { return null; } if (DeliveryVehicleRegistry.TryGetValue(vehicle, out var value) && (Object)(object)value != (Object)null) { return value; } GameObject val = new GameObject("DeliveryVehicle_" + ((Object)vehicle).name); DeliveryVehicle val2 = val.AddComponent<DeliveryVehicle>(); val2.Vehicle = vehicle; val2.GUID = vehicle.GUID.ToString(); DeliveryVehicleRegistry[vehicle] = val2; return val2; } private DeliveryVehicle CreateDeliveryVehicle() { if ((Object)(object)_deliveryVehicle != (Object)null) { return _deliveryVehicle; } if (DeliveryVehicleRegistry.Count == 0) { RegisterAvailableVehicles(); } LandVehicle val = DeliveryVehicleRegistry.Keys.FirstOrDefault(); if ((Object)(object)val == (Object)null) { Logger.Error("No available vehicles registered."); return null; } return GetOrCreateDeliveryVehicle(val); } public DeliveryShopBuilder AddListing(StorableItemDefinition item, float? overridePrice = null, int quantity = 999) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown ShopListing item2 = new ShopListing { name = ((Object)item).name, Item = item, CanBeDelivered = true, OverridePrice = true, OverriddenPrice = (overridePrice ?? item.BasePurchasePrice) }; _listings.Add(item2); return this; } public DeliveryShopBuilder AddListing(ShopListing listing) { _listings.Add(listing); return this; } public DeliveryShopBuilder SetPosition(int position) { _insertPosition = position; return this; } private CartEntry CreateCartEntryPrefab() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Expected O, but got Unknown GameObject val = new GameObject("CartEntry"); CartEntry val2 = val.AddComponent<CartEntry>(); GameObject val3 = new GameObject("NameLabel"); val2.NameLabel = val3.AddComponent<TextMeshProUGUI>(); val3.transform.SetParent(val.transform, false); GameObject val4 = new GameObject("PriceLabel"); val2.PriceLabel = val4.AddComponent<TextMeshProUGUI>(); val4.transform.SetParent(val.transform, false); GameObject val5 = new GameObject("IncrementButton"); val2.IncrementButton = val5.AddComponent<Button>(); val5.transform.SetParent(val.transform, false); GameObject val6 = new GameObject("DecrementButton"); val2.DecrementButton = val6.AddComponent<Button>(); val6.transform.SetParent(val.transform, false); GameObject val7 = new GameObject("RemoveButton"); val2.RemoveButton = val7.AddComponent<Button>(); val7.transform.SetParent(val.transform, false); return val2; } public DeliveryShop Build() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Expected O, but got Unknown //IL_027c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_deliveryShopTemplate == (Object)null) { Logger.Error("Cannot build delivery shop without template."); return null; } GameObject val = new GameObject("ShopInterface_" + _shopName); ShopInterface val2 = val.AddComponent<ShopInterface>(); val2.ShopName = _shopName; val2.Listings = _listings; foreach (ShopListing listing in _listings) { listing.Shop = val2; } val2.DeliveryVehicle = CreateDeliveryVehicle(); val2.ShopCode = _shopName; Cart val3 = ((Component)val2).gameObject.AddComponent<Cart>(); ((Object)val3).name = "Cart_" + _shopName; val3.Shop = val2; val3.TotalText = ((Component)val3).gameObject.AddComponent<TextMeshProUGUI>(); val3.WarningText = ((Component)val3).gameObject.AddComponent<TextMeshProUGUI>(); val3.ProblemText = ((Component)val3).gameObject.AddComponent<TextMeshProUGUI>(); val3.ViewCartText = ((Component)val3).gameObject.AddComponent<TextMeshProUGUI>(); val3.BuyButton = ((Component)val3).gameObject.AddComponent<Button>(); val3.LoadVehicleToggle = ((Component)val3).gameObject.AddComponent<Toggle>(); val3.CartArea = ((Component)val3).gameObject.AddComponent<Image>(); val3.EntryPrefab = CreateCartEntryPrefab(); GameObject val4 = new GameObject("CartEntryContainer"); val4.transform.SetParent(((Component)val3).transform); val3.CartEntryContainer = val4.AddComponent<RectTransform>(); Logger.Debug($"Cart for shop {_shopName} is {((Object)val3).name} and is {((Component)val3).gameObject.activeSelf}"); val2.Cart = val3; ShopInterface.AllShops.Add(val2); DeliveryShop val5 = Object.Instantiate<DeliveryShop>(_deliveryShopTemplate, ((Component)_deliveryShopTemplate).transform.parent); val5.MatchingShopInterfaceName = _shopName; val5.MatchingShop = val2; val5.DeliveryFee = _deliveryFee; val5.AvailableByDefault = _availableByDefault; ((Object)((Component)val5).gameObject).name = "DeliveryShop_" + _shopName; Transform val6 = ((Component)val5).transform.Find("Header"); if ((Object)(object)val6 != (Object)null) { Image component = ((Component)val6).GetComponent<Image>(); if ((Object)(object)component != (Object)null) { ((Graphic)component).color = _shopColor; } Transform val7 = val6.Find("Icon"); if ((Object)(object)val7 != (Object)null) { Transform val8 = val7.Find("Image"); if ((Object)(object)val8 != (Object)null) { Image component2 = ((Component)val8).GetComponent<Image>(); if ((Object)(object)component2 != (Object)null && (Object)(object)_shopImage != (Object)null) { component2.sprite = _shopImage; } } } Transform val9 = val6.Find("Title"); if ((Object)(object)val9 != (Object)null) { Text component3 = ((Component)val9).GetComponent<Text>(); if ((Object)(object)component3 != (Object)null) { component3.text = _shopName; } } Transform val10 = val6.Find("Description"); if ((Object)(object)val10 != (Object)null) { Text component4 = ((Component)val10).GetComponent<Text>(); if ((Object)(object)component4 != (Object)null) { component4.text = _shopDescription; } } } ShopPositionRegistry.ShopPositions[((Object)((Component)val5).gameObject).name] = _insertPosition; ((Component)val5).gameObject.SetActive(true); return val5; } public static List<DeliveryShop> GetInitializedShops(DeliveryApp app, out Transform contentT) { contentT = ((Component)app).transform.Find("Container/Scroll View/Viewport/Content"); if ((Object)(object)contentT == (Object)null) { Logger.Error("Could not find 'Container/Scroll View/Viewport/Content' under DeliveryApp"); return null; } List<DeliveryShop> list = new List<DeliveryShop>(); for (int i = 0; i < contentT.childCount; i++) { DeliveryShop component = ((Component)contentT.GetChild(i)).GetComponent<DeliveryShop>(); if ((Object)(object)component != (Object)null) { list.Add(component); } } return list; } public static void Apply(DeliveryApp app, DeliveryShop shop) { int num = -1; if (ShopPositionRegistry.ShopPositions.TryGetValue(((Object)((Component)shop).gameObject).name, out var value)) { num = value; Logger.Debug($"Found position {num} for shop {((Object)((Component)shop).gameObject).name}"); } if (num < 0) { num = app.deliveryShops.Count + num + 1; if (num < 0) { num = 0; } } if (num > app.deliveryShops.Count) { num = app.deliveryShops.Count; } if (num < app.deliveryShops.Count) { Logger.Debug($"Inserting shop at position {num}"); app.deliveryShops.Insert(num, shop); } else { Logger.Debug($"Adding shop to end at position {num}"); app.deliveryShops.Add(shop); } Logger.Msg("Added new delivery shop to app: " + ((Object)shop).name + ", " + ((Object)((Component)shop).gameObject).name); FixShopHierarchy(app); } private static void FixShopHierarchy(DeliveryApp app) { Transform contentT; List<DeliveryShop> initializedShops = GetInitializedShops(app, out contentT); Logger.Debug($"Found {initializedShops.Count} shop components in UI hierarchy"); for (int i = 0; i < app.deliveryShops.Count; i++) { DeliveryShop val = app.deliveryShops.AsEnumerable().ElementAt(i); if (!(((Object)((Component)val).gameObject).name == "Space") && !((Object)((Component)val).gameObject).name.Contains("Spacer")) { ((Component)val).transform.SetParent(contentT, false); ((Component)val).transform.SetSiblingIndex(i); Logger.Debug($"Set {((Object)((Component)val).gameObject).name} to sibling index {i}"); } } } } public static class ShopPositionRegistry { public static Dictionary<string, int> ShopPositions = new Dictionary<string, int>(); } public class LandVehicleBuilder { private string _vehicleName = "CustomVehicle"; private string _vehicleCode = "shitbox"; private float _vehiclePrice = 1000f; private float _topSpeed = 60f; private bool _isPlayerOwned = true; private EVehicleColor _color = (EVehicleColor)16; public static List<LandVehicle> VehiclePrefabs = NetworkSingleton<VehicleManager>.Instance.VehiclePrefabs; public LandVehicleBuilder WithVehicleName(string vehicleName) { _vehicleName = vehicleName; return this; } public LandVehicleBuilder WithVehicleCode(string vehicleCode) { _vehicleCode = vehicleCode; return this; } public LandVehicleBuilder WithVehiclePrice(float vehiclePrice) { _vehiclePrice = vehiclePrice; return this; } public LandVehicleBuilder WithTopSpeed(float topSpeed) { _topSpeed = topSpeed; return this; } public LandVehicleBuilder WithPlayerOwned(bool isPlayerOwned) { _isPlayerOwned = isPlayerOwned; return this; } public LandVehicleBuilder WithColor(EVehicleColor color) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) _color = color; return this; } public LandVehicle Build() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(130f, 50f, -250f); Quaternion identity = Quaternion.identity; LandVehicle val2 = NetworkSingleton<VehicleManager>.Instance.SpawnAndReturnVehicle(_vehicleCode, val, identity, false); val2.SetGUID(GUIDManager.GenerateUniqueGUID()); ((Object)val2).name = _vehicleName; ((Object)((Component)val2).gameObject).name = _vehicleName; val2.vehicleName = _vehicleName; val2.vehiclePrice = _vehiclePrice; val2.TopSpeed = _topSpeed; val2.ApplyColor(_color); val2.SetOwnedColor((NetworkConnection)null, _color); val2.SetIsPlayerOwned((NetworkConnection)null, _isPlayerOwned); if (_isPlayerOwned) { NetworkSingleton<VehicleManager>.Instance.PlayerOwnedVehicles.Add(val2); } NetworkSingleton<VehicleManager>.Instance.AllVehicles.Add(val2); return val2; } } public static class MelonLoggerExtensions { public static void Debug(this Instance logger, string message, bool stacktrace = true) { } private static string GetLoggerName(Instance logger) { return typeof(Instance).GetField("Name", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(logger) as string; } private static void InvokeNativeMsg(Color namesectionColor, Color textColor, string nameSection, string message) { typeof(MelonLogger).GetMethod("NativeMsg", BindingFlags.Static | BindingFlags.NonPublic)?.Invoke(null, new object[5] { namesectionColor, textColor, nameSection, message ?? "null", false }); } private static string GetCallerInfo() { StackTrace stackTrace = new StackTrace(); for (int i = 2; i < stackTrace.FrameCount; i++) { StackFrame frame = stackTrace.GetFrame(i); MethodBase method = frame.GetMethod(); if (!(method?.DeclaringType == null)) { return method.DeclaringType.FullName + "." + method.Name; } } return "unknown"; } } public static class Il2CppListExtensions { public static IEnumerable<T> AsEnumerable<T>(this List<T> list) { return list ?? new List<T>(); } } public static class Utils { [CompilerGenerated] private sealed class <WaitForNetworkSingleton>d__6<T> : IEnumerator<object>, IEnumerator, IDisposable where T : NetworkSingleton<T> { private int <>1__state; private object <>2__current; public IEnumerator coroutine; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNetworkSingleton>d__6(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; goto IL_0044; case 1: <>1__state = -1; goto IL_0044; case 2: { <>1__state = -1; return false; } IL_0044: if (!NetworkSingleton<T>.InstanceExists) { <>2__current = null; <>1__state = 1; return true; } <>2__current = coroutine; <>1__state = 2; 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(); } } [CompilerGenerated] private sealed class <WaitForNotNull>d__5 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public object obj; public float timeout; public Action onTimeout; public Action onFinish; private float <startTime>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNotNull>d__5(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <startTime>5__1 = Time.time; break; case 1: <>1__state = -1; break; } if (obj == null) { if (!float.IsNaN(timeout) && Time.time - <startTime>5__1 > timeout) { onTimeout?.Invoke(); return false; } <>2__current = null; <>1__state = 1; return true; } onFinish?.Invoke(); 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 Instance Logger = new Instance("FurnitureDelivery-Utils"); public static Sprite FindSprite(string spriteName) { try { Sprite[] array = Resources.FindObjectsOfTypeAll<Sprite>(); foreach (Sprite val in array) { if (((Object)val).name == spriteName) { Logger.Debug("Found sprite '" + spriteName + "' directly in loaded objects"); return val; } } return null; } catch (Exception ex) { Logger.Error("Error finding sprite '" + spriteName + "': " + ex.Message); return null; } } public static List<T> GetAllComponentsInChildrenRecursive<T>(GameObject obj) where T : Component { List<T> list = new List<T>(); if ((Object)(object)obj == (Object)null) { return list; } T[] components = obj.GetComponents<T>(); if (components.Length != 0) { list.AddRange(components); } for (int i = 0; i < obj.transform.childCount; i++) { Transform child = obj.transform.GetChild(i); list.AddRange(GetAllComponentsInChildrenRecursive<T>(((Component)child).gameObject)); } return list; } public static bool Is<T>(object obj, out T result) where T : class { if (obj is T val) { result = val; return true; } result = null; return false; } public static List<StorableItemDefinition> GetAllStorableItemDefinitions() { List<ItemRegister> list = Singleton<Registry>.Instance.ItemRegistry.ToList(); List<StorableItemDefinition> list2 = new List<StorableItemDefinition>(); foreach (ItemRegister item in list) { if (Is<StorableItemDefinition>(item.Definition, out var result)) { list2.Add(result); } else { Logger.Warning("Definition " + ((object)item.Definition)?.GetType().FullName + " is not a StorableItemDefinition"); } } return list2.ToList(); } [IteratorStateMachine(typeof(<WaitForNotNull>d__5))] public static IEnumerator WaitForNotNull([MaybeNull] object obj, float timeout = float.NaN, Action onTimeout = null, Action onFinish = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNotNull>d__5(0) { obj = obj, timeout = timeout, onTimeout = onTimeout, onFinish = onFinish }; } [IteratorStateMachine(typeof(<WaitForNetworkSingleton>d__6<>))] public static IEnumerator WaitForNetworkSingleton<T>(IEnumerator coroutine) where T : NetworkSingleton<T> { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNetworkSingleton>d__6<T>(0) { coroutine = coroutine }; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }