Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of VehicleDeliverySlots v1.1.1
VehicleDeliverySlots.dll
Decompiled a day ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using HarmonyLib; using MelonLoader; using MelonLoader.Preferences; using MelonLoader.Utils; using Microsoft.CodeAnalysis; using VehicleDeliverySlots; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(/*Could not decode attribute arguments.*/)] [assembly: AssemblyFileVersion("1.1.1.0")] [assembly: AssemblyInformationalVersion("1.1.1")] [assembly: MelonInfo(typeof(VehicleDeliverySlotsMod), "VehicleDeliverySlots", "1.1.1", "Daudr + Codex", "")] [assembly: MelonColor(1, 65, 170, 255)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: MelonOptionalDependencies(new string[] { "ModsApp" })] [assembly: AssemblyVersion("1.1.1.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : System.Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(/*Could not decode attribute arguments.*/)] internal sealed class NullableAttribute : System.Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(/*Could not decode attribute arguments.*/)] internal sealed class NullableContextAttribute : System.Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(/*Could not decode attribute arguments.*/)] internal sealed class RefSafetyRulesAttribute : System.Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace VehicleDeliverySlots { internal static class DeliveryManagerPatcher { private static Instance? _logger; internal static void Install(Harmony harmony, Instance logger) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown _logger = logger; System.Type type = FindType("Il2CppScheduleOne.Delivery.DeliveryManager"); if (type == (System.Type)null) { logger.Warning("Could not find Il2CppScheduleOne.Delivery.DeliveryManager. Delivery timer override was not patched."); return; } int num = 0; HarmonyMethod val = new HarmonyMethod(typeof(DeliveryManagerPatcher), "BeforeManagedDelivery", (System.Type[])null); HarmonyMethod val2 = new HarmonyMethod(typeof(DeliveryManagerPatcher), "BeforeReceiveDelivery", (System.Type[])null); MethodInfo[] array = Enumerable.ToArray<MethodInfo>(Enumerable.Where<MethodInfo>((System.Collections.Generic.IEnumerable<MethodInfo>)type.GetMethods((BindingFlags)54), (Func<MethodInfo, bool>)((MethodInfo method) => ((MemberInfo)method).Name == "SendDelivery" && !((MethodBase)method).IsAbstract && !((MethodBase)method).ContainsGenericParameters))); foreach (MethodInfo val3 in array) { harmony.Patch((MethodBase)(object)val3, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); num++; } array = Enumerable.ToArray<MethodInfo>(Enumerable.Where<MethodInfo>((System.Collections.Generic.IEnumerable<MethodInfo>)type.GetMethods((BindingFlags)54), (Func<MethodInfo, bool>)((MethodInfo method) => ((MemberInfo)method).Name == "ReceiveDelivery" && !((MethodBase)method).IsAbstract && !((MethodBase)method).ContainsGenericParameters))); foreach (MethodInfo val4 in array) { harmony.Patch((MethodBase)(object)val4, val2, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); num++; } logger.Msg($"Patched {num} DeliveryManager method(s) for vehicle prep and optional delivery timer override."); } public static void BeforeManagedDelivery(object __instance, [HarmonyArgument("delivery")] object delivery) { if (Settings.Enabled.Value && delivery != null && _logger != null) { PrepareDeliveryVehicle(__instance, delivery); } } public static void BeforeReceiveDelivery(object __instance, [HarmonyArgument("delivery")] object delivery) { if (!Settings.Enabled.Value || delivery == null || _logger == null) { return; } PrepareDeliveryVehicle(__instance, delivery); if (Settings.DeliveryTimerOverrideEnabled.Value) { int deliveryTimerOverrideSecondsValue = Settings.DeliveryTimerOverrideSecondsValue; if (SetIntProperty(delivery, "TimeUntilArrival", deliveryTimerOverrideSecondsValue) && Settings.DiscoveryLogging.Value) { string stringProperty = GetStringProperty(delivery, "DeliveryID"); DiscoveryLog.Write($"Applied delivery timer override: {deliveryTimerOverrideSecondsValue}s for delivery ID: {stringProperty}"); } } } private static void PrepareDeliveryVehicle(object deliveryManager, object delivery) { if (_logger == null) { return; } int num = VehicleStorageExpander.Apply(delivery, _logger); string stringProperty = GetStringProperty(delivery, "StoreName"); if (!string.IsNullOrWhiteSpace(stringProperty) && stringProperty != "<unknown>") { object propertyValue = GetPropertyValue(Invoke(deliveryManager, "GetShopInterface", stringProperty), "DeliveryVehicle"); if (propertyValue != null) { num += VehicleStorageExpander.Apply(propertyValue, _logger); } } if (Settings.DiscoveryLogging.Value) { string stringProperty2 = GetStringProperty(delivery, "DeliveryID"); DiscoveryLog.Write($"Prepared delivery vehicle for delivery ID={stringProperty2}, store={stringProperty}, changed={num}."); } } private static bool SetIntProperty(object instance, string propertyName, int value) { try { PropertyInfo property = instance.GetType().GetProperty(propertyName, (BindingFlags)52); if (property == (PropertyInfo)null || !property.CanWrite || property.PropertyType != typeof(int)) { return false; } property.SetValue(instance, (object)value); return true; } catch { return false; } } private static string GetStringProperty(object instance, string propertyName) { try { PropertyInfo property = instance.GetType().GetProperty(propertyName, (BindingFlags)52); return (((property != null) ? property.GetValue(instance) : null) as string) ?? "<unknown>"; } catch { return "<unknown>"; } } private static object? GetPropertyValue(object? instance, string propertyName) { if (instance == null) { return null; } try { PropertyInfo property = instance.GetType().GetProperty(propertyName, (BindingFlags)52); return (property != null) ? property.GetValue(instance) : null; } catch { return null; } } private static object? Invoke(object instance, string methodName, params object[] args) { MethodInfo[] methods = instance.GetType().GetMethods((BindingFlags)52); foreach (MethodInfo val in methods) { if (!(((MemberInfo)val).Name != methodName) && ((MethodBase)val).GetParameters().Length == args.Length) { try { return ((MethodBase)val).Invoke(instance, args); } catch { } } } return null; } private static System.Type? FindType(string fullName) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly val in assemblies) { try { System.Type type = val.GetType(fullName, false); if (type != (System.Type)null) { return type; } } catch { } } return null; } } internal static class DeliveryQuantityPatcher { [CompilerGenerated] private sealed class <EnumerateLocalUiCandidates>d__20 : System.Collections.Generic.IEnumerable<object>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<object>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private object <>2__current; private int <>l__initialThreadId; private object candidate; public object <>3__candidate; object System.Collections.Generic.IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnumerateLocalUiCandidates>d__20(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { } private bool MoveNext() { object component; object component2; switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = candidate; <>1__state = 1; return true; case 1: { <>1__state = -1; object memberValue = GetMemberValue(candidate, "transform"); if (memberValue != null) { <>2__current = memberValue; <>1__state = 2; return true; } goto IL_007a; } case 2: <>1__state = -1; goto IL_007a; case 3: <>1__state = -1; goto IL_00a5; case 4: { <>1__state = -1; break; } IL_007a: component = GetComponent(candidate, "UnityEngine.RectTransform"); if (component != null) { <>2__current = component; <>1__state = 3; return true; } goto IL_00a5; IL_00a5: component2 = GetComponent(candidate, "UnityEngine.UI.LayoutElement"); if (component2 != null) { <>2__current = component2; <>1__state = 4; return true; } break; } return false; } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<object> System.Collections.Generic.IEnumerable<object>.GetEnumerator() { <EnumerateLocalUiCandidates>d__20 <EnumerateLocalUiCandidates>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <EnumerateLocalUiCandidates>d__ = this; } else { <EnumerateLocalUiCandidates>d__ = new <EnumerateLocalUiCandidates>d__20(0); } <EnumerateLocalUiCandidates>d__.candidate = <>3__candidate; return <EnumerateLocalUiCandidates>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<object>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <EnumerateObjects>d__25 : System.Collections.Generic.IEnumerable<object>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<object>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private object <>2__current; private int <>l__initialThreadId; private object value; public object <>3__value; private System.Collections.IEnumerator <>7__wrap1; object System.Collections.Generic.IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnumerateObjects>d__25(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } } private bool MoveNext() { try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; if (value == null || value is string) { return false; } if (value is System.Collections.IEnumerable enumerable) { <>7__wrap1 = enumerable.GetEnumerator(); <>1__state = -3; goto IL_0091; } <>2__current = value; <>1__state = 2; return true; case 1: <>1__state = -3; goto IL_0091; case 2: { <>1__state = -1; return false; } IL_0091: while (<>7__wrap1.MoveNext()) { object current = <>7__wrap1.Current; if (current != null) { <>2__current = current; <>1__state = 1; return true; } } <>m__Finally1(); <>7__wrap1 = null; return false; } } catch { //try-fault ((System.IDisposable)this).Dispose(); throw; } } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap1 is System.IDisposable disposable) { disposable.Dispose(); } } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<object> System.Collections.Generic.IEnumerable<object>.GetEnumerator() { <EnumerateObjects>d__25 <EnumerateObjects>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <EnumerateObjects>d__ = this; } else { <EnumerateObjects>d__ = new <EnumerateObjects>d__25(0); } <EnumerateObjects>d__.value = <>3__value; return <EnumerateObjects>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<object>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetAllFields>d__45 : System.Collections.Generic.IEnumerable<FieldInfo>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<FieldInfo>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private FieldInfo <>2__current; private int <>l__initialThreadId; private System.Type type; public System.Type <>3__type; private System.Type <current>5__2; private FieldInfo[] <>7__wrap2; private int <>7__wrap3; FieldInfo System.Collections.Generic.IEnumerator<FieldInfo>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllFields>d__45(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; <>7__wrap3++; goto IL_0074; } <>1__state = -1; <current>5__2 = type; goto IL_009c; IL_0074: if (<>7__wrap3 < <>7__wrap2.Length) { FieldInfo val = <>7__wrap2[<>7__wrap3]; <>2__current = val; <>1__state = 1; return true; } <>7__wrap2 = null; <current>5__2 = <current>5__2.BaseType; goto IL_009c; IL_009c: if (<current>5__2 != (System.Type)null) { <>7__wrap2 = <current>5__2.GetFields((BindingFlags)54); <>7__wrap3 = 0; goto IL_0074; } <current>5__2 = null; return false; } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<FieldInfo> System.Collections.Generic.IEnumerable<FieldInfo>.GetEnumerator() { <GetAllFields>d__45 <GetAllFields>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetAllFields>d__ = this; } else { <GetAllFields>d__ = new <GetAllFields>d__45(0); } <GetAllFields>d__.type = <>3__type; return <GetAllFields>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<FieldInfo>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetAllMethods>d__46 : System.Collections.Generic.IEnumerable<MethodInfo>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<MethodInfo>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private MethodInfo <>2__current; private int <>l__initialThreadId; private System.Type type; public System.Type <>3__type; private System.Type <current>5__2; private MethodInfo[] <>7__wrap2; private int <>7__wrap3; MethodInfo System.Collections.Generic.IEnumerator<MethodInfo>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllMethods>d__46(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; <>7__wrap3++; goto IL_0074; } <>1__state = -1; <current>5__2 = type; goto IL_009c; IL_0074: if (<>7__wrap3 < <>7__wrap2.Length) { MethodInfo val = <>7__wrap2[<>7__wrap3]; <>2__current = val; <>1__state = 1; return true; } <>7__wrap2 = null; <current>5__2 = <current>5__2.BaseType; goto IL_009c; IL_009c: if (<current>5__2 != (System.Type)null) { <>7__wrap2 = <current>5__2.GetMethods((BindingFlags)54); <>7__wrap3 = 0; goto IL_0074; } <current>5__2 = null; return false; } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<MethodInfo> System.Collections.Generic.IEnumerable<MethodInfo>.GetEnumerator() { <GetAllMethods>d__46 <GetAllMethods>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetAllMethods>d__ = this; } else { <GetAllMethods>d__ = new <GetAllMethods>d__46(0); } <GetAllMethods>d__.type = <>3__type; return <GetAllMethods>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<MethodInfo>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetAllProperties>d__44 : System.Collections.Generic.IEnumerable<PropertyInfo>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<PropertyInfo>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private PropertyInfo <>2__current; private int <>l__initialThreadId; private System.Type type; public System.Type <>3__type; private System.Type <current>5__2; private PropertyInfo[] <>7__wrap2; private int <>7__wrap3; PropertyInfo System.Collections.Generic.IEnumerator<PropertyInfo>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllProperties>d__44(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; <>7__wrap3++; goto IL_0074; } <>1__state = -1; <current>5__2 = type; goto IL_009c; IL_0074: if (<>7__wrap3 < <>7__wrap2.Length) { PropertyInfo val = <>7__wrap2[<>7__wrap3]; <>2__current = val; <>1__state = 1; return true; } <>7__wrap2 = null; <current>5__2 = <current>5__2.BaseType; goto IL_009c; IL_009c: if (<current>5__2 != (System.Type)null) { <>7__wrap2 = <current>5__2.GetProperties((BindingFlags)54); <>7__wrap3 = 0; goto IL_0074; } <current>5__2 = null; return false; } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<PropertyInfo> System.Collections.Generic.IEnumerable<PropertyInfo>.GetEnumerator() { <GetAllProperties>d__44 <GetAllProperties>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetAllProperties>d__ = this; } else { <GetAllProperties>d__ = new <GetAllProperties>d__44(0); } <GetAllProperties>d__.type = <>3__type; return <GetAllProperties>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<PropertyInfo>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetComponentsInChildren>d__24 : System.Collections.Generic.IEnumerable<object>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<object>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private object <>2__current; private int <>l__initialThreadId; private string componentTypeName; public string <>3__componentTypeName; private object candidate; public object <>3__candidate; private System.Type <componentType>5__2; private object[] <>7__wrap2; private int <>7__wrap3; private object <root>5__5; private System.Collections.Generic.IEnumerator<MethodInfo> <>7__wrap5; private System.Collections.Generic.IEnumerator<object> <>7__wrap6; object System.Collections.Generic.IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetComponentsInChildren>d__24(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { int num = <>1__state; if ((uint)(num - -4) > 1u && num != 1) { return; } try { if (num != -4 && num != 1) { return; } try { } finally { <>m__Finally2(); } } finally { <>m__Finally1(); } } private bool MoveNext() { try { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -4; goto IL_02cd; } <>1__state = -1; <componentType>5__2 = FindType(componentTypeName); if (<componentType>5__2 == (System.Type)null) { return false; } object[] array = Enumerable.ToArray<object>(Enumerable.Distinct<object>(Enumerable.Cast<object>((System.Collections.IEnumerable)Enumerable.Where<object>((System.Collections.Generic.IEnumerable<object>)new object[3] { candidate, GetMemberValue(candidate, "gameObject"), GetMemberValue(candidate, "transform") }, (Func<object, bool>)((object root) => root != null))), (IEqualityComparer<object>)(object)ReferenceEqualityComparer.Instance)); <>7__wrap2 = array; <>7__wrap3 = 0; goto IL_0319; IL_0134: object value = null; MethodInfo current; ParameterInfo[] parameters = ((MethodBase)current).GetParameters(); try { if (((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 0) { value = ((MethodBase)current.MakeGenericMethod(new System.Type[1] { <componentType>5__2 })).Invoke(<root>5__5, (object[])null); } else if (((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 1 && parameters[0].ParameterType == typeof(bool)) { value = ((MethodBase)current.MakeGenericMethod(new System.Type[1] { <componentType>5__2 })).Invoke(<root>5__5, new object[1] { true }); } else if (!((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 1 && parameters[0].ParameterType == typeof(System.Type)) { value = ((MethodBase)current).Invoke(<root>5__5, new object[1] { <componentType>5__2 }); } else if (!((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 2 && parameters[0].ParameterType == typeof(System.Type) && parameters[1].ParameterType == typeof(bool)) { value = ((MethodBase)current).Invoke(<root>5__5, new object[2] { <componentType>5__2, true }); } } catch { } <>7__wrap6 = EnumerateObjects(value).GetEnumerator(); <>1__state = -4; goto IL_02cd; IL_0319: if (<>7__wrap3 < <>7__wrap2.Length) { <root>5__5 = <>7__wrap2[<>7__wrap3]; <>7__wrap5 = GetAllMethods(<root>5__5.GetType()).GetEnumerator(); <>1__state = -3; goto IL_02e7; } <>7__wrap2 = null; return false; IL_02cd: if (((System.Collections.IEnumerator)<>7__wrap6).MoveNext()) { object current2 = <>7__wrap6.Current; <>2__current = current2; <>1__state = 1; return true; } <>m__Finally2(); <>7__wrap6 = null; goto IL_02e7; IL_02e7: while (((System.Collections.IEnumerator)<>7__wrap5).MoveNext()) { current = <>7__wrap5.Current; if (((MemberInfo)current).Name != "GetComponentsInChildren") { continue; } goto IL_0134; } <>m__Finally1(); <>7__wrap5 = null; <root>5__5 = null; <>7__wrap3++; goto IL_0319; } catch { //try-fault ((System.IDisposable)this).Dispose(); throw; } } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap5 != null) { ((System.IDisposable)<>7__wrap5).Dispose(); } } private void <>m__Finally2() { <>1__state = -3; if (<>7__wrap6 != null) { ((System.IDisposable)<>7__wrap6).Dispose(); } } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<object> System.Collections.Generic.IEnumerable<object>.GetEnumerator() { <GetComponentsInChildren>d__24 <GetComponentsInChildren>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetComponentsInChildren>d__ = this; } else { <GetComponentsInChildren>d__ = new <GetComponentsInChildren>d__24(0); } <GetComponentsInChildren>d__.candidate = <>3__candidate; <GetComponentsInChildren>d__.componentTypeName = <>3__componentTypeName; return <GetComponentsInChildren>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<object>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetQuantityTextCandidates>d__18 : System.Collections.Generic.IEnumerable<object>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<object>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private object <>2__current; private int <>l__initialThreadId; private object input; public object <>3__input; private HashSet<object> <seen>5__2; private object[] <>7__wrap2; private int <>7__wrap3; private object <owner>5__5; private string[] <>7__wrap5; private int <>7__wrap6; private System.Collections.Generic.IEnumerator<object> <>7__wrap7; object System.Collections.Generic.IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetQuantityTextCandidates>d__18(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 3) { try { } finally { <>m__Finally1(); } } } private bool MoveNext() { try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <seen>5__2 = new HashSet<object>((IEqualityComparer<object>)(object)ReferenceEqualityComparer.Instance); <>7__wrap2 = Enumerable.ToArray<object>(GetQuantityVisualCandidates(input)); <>7__wrap3 = 0; goto IL_0280; case 1: <>1__state = -1; goto IL_00b1; case 2: <>1__state = -1; goto IL_0169; case 3: { <>1__state = -3; goto IL_0229; } IL_0280: if (<>7__wrap3 < <>7__wrap2.Length) { <owner>5__5 = <>7__wrap2[<>7__wrap3]; if (HasTextSizingMember(<owner>5__5) && <seen>5__2.Add(<owner>5__5)) { <>2__current = <owner>5__5; <>1__state = 1; return true; } goto IL_00b1; } <>7__wrap2 = null; return false; IL_0229: while (((System.Collections.IEnumerator)<>7__wrap7).MoveNext()) { object current = <>7__wrap7.Current; if (<seen>5__2.Add(current)) { <>2__current = current; <>1__state = 3; return true; } } <>m__Finally1(); <>7__wrap7 = null; <>7__wrap6++; goto IL_0251; IL_0251: if (<>7__wrap6 < <>7__wrap5.Length) { string componentTypeName = <>7__wrap5[<>7__wrap6]; <>7__wrap7 = GetComponentsInChildren(<owner>5__5, componentTypeName).GetEnumerator(); <>1__state = -3; goto IL_0229; } <>7__wrap5 = null; <owner>5__5 = null; <>7__wrap3++; goto IL_0280; IL_0169: <>7__wrap6++; goto IL_0177; IL_00b1: <>7__wrap5 = new string[10] { "textViewport", "TextViewport", "m_TextViewport", "_textViewport", "textComponent", "TextComponent", "m_TextComponent", "_textComponent", "placeholder", "m_Placeholder" }; <>7__wrap6 = 0; goto IL_0177; IL_0177: if (<>7__wrap6 < <>7__wrap5.Length) { string text = <>7__wrap5[<>7__wrap6]; object memberValue = GetMemberValue(<owner>5__5, text); if (memberValue != null && <seen>5__2.Add(memberValue)) { <>2__current = memberValue; <>1__state = 2; return true; } goto IL_0169; } <>7__wrap5 = null; <>7__wrap5 = new string[3] { "TMPro.TMP_Text", "TMPro.TextMeshProUGUI", "UnityEngine.UI.Text" }; <>7__wrap6 = 0; goto IL_0251; } } catch { //try-fault ((System.IDisposable)this).Dispose(); throw; } } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap7 != null) { ((System.IDisposable)<>7__wrap7).Dispose(); } } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<object> System.Collections.Generic.IEnumerable<object>.GetEnumerator() { <GetQuantityTextCandidates>d__18 <GetQuantityTextCandidates>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetQuantityTextCandidates>d__ = this; } else { <GetQuantityTextCandidates>d__ = new <GetQuantityTextCandidates>d__18(0); } <GetQuantityTextCandidates>d__.input = <>3__input; return <GetQuantityTextCandidates>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<object>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetQuantityVisualCandidates>d__17 : System.Collections.Generic.IEnumerable<object>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<object>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private object <>2__current; private int <>l__initialThreadId; private object input; public object <>3__input; private System.Collections.Generic.IEnumerator<object> <>7__wrap1; object System.Collections.Generic.IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetQuantityVisualCandidates>d__17(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { switch (<>1__state) { case -3: case 1: try { break; } finally { <>m__Finally1(); } case -4: case 2: try { break; } finally { <>m__Finally2(); } case -2: case -1: case 0: break; } } private bool MoveNext() { try { object memberValue; switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>7__wrap1 = EnumerateLocalUiCandidates(input).GetEnumerator(); <>1__state = -3; goto IL_0070; case 1: <>1__state = -3; goto IL_0070; case 2: { <>1__state = -4; goto IL_00fa; } IL_0070: if (((System.Collections.IEnumerator)<>7__wrap1).MoveNext()) { object current = <>7__wrap1.Current; <>2__current = current; <>1__state = 1; return true; } <>m__Finally1(); <>7__wrap1 = null; memberValue = GetMemberValue(input, "InputField", "inputField", "_InputField_k__BackingField"); if (memberValue == null) { break; } <>7__wrap1 = EnumerateLocalUiCandidates(memberValue).GetEnumerator(); <>1__state = -4; goto IL_00fa; IL_00fa: if (((System.Collections.IEnumerator)<>7__wrap1).MoveNext()) { object current2 = <>7__wrap1.Current; <>2__current = current2; <>1__state = 2; return true; } <>m__Finally2(); <>7__wrap1 = null; break; } return false; } catch { //try-fault ((System.IDisposable)this).Dispose(); throw; } } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap1 != null) { ((System.IDisposable)<>7__wrap1).Dispose(); } } private void <>m__Finally2() { <>1__state = -1; if (<>7__wrap1 != null) { ((System.IDisposable)<>7__wrap1).Dispose(); } } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<object> System.Collections.Generic.IEnumerable<object>.GetEnumerator() { <GetQuantityVisualCandidates>d__17 <GetQuantityVisualCandidates>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetQuantityVisualCandidates>d__ = this; } else { <GetQuantityVisualCandidates>d__ = new <GetQuantityVisualCandidates>d__17(0); } <GetQuantityVisualCandidates>d__.input = <>3__input; return <GetQuantityVisualCandidates>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<object>)this).GetEnumerator(); } } private static Instance? _logger; private static bool _loggedInputPatch; internal static void Install(Harmony harmony, Instance logger) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected O, but got Unknown //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Expected O, but got Unknown //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Expected O, but got Unknown _logger = logger; int num = 0; System.Type type = FindType("Il2CppScheduleOne.UI.Phone.Delivery.DeliveryShop"); if (type != (System.Type)null) { HarmonyMethod postfix = new HarmonyMethod(typeof(DeliveryQuantityPatcher), "AfterDeliveryShopRefresh", (System.Type[])null); num += TryPatch(harmony, type, "Initialize", null, postfix); num += TryPatch(harmony, type, "Open", null, postfix); num += TryPatch(harmony, type, "RefreshShop", null, postfix); } else { logger.Warning("Could not find Il2CppScheduleOne.UI.Phone.Delivery.DeliveryShop. Delivery quantity shop limit was not patched."); } System.Type type2 = FindType("Il2CppScheduleOne.UI.Phone.Delivery.ListingEntry"); if (type2 != (System.Type)null) { HarmonyMethod postfix2 = new HarmonyMethod(typeof(DeliveryQuantityPatcher), "AfterListingEntryInitialize", (System.Type[])null); HarmonyMethod prefix = new HarmonyMethod(typeof(DeliveryQuantityPatcher), "BeforeSetQuantity", (System.Type[])null); HarmonyMethod prefix2 = new HarmonyMethod(typeof(DeliveryQuantityPatcher), "BeforeChangeQuantity", (System.Type[])null); HarmonyMethod prefix3 = new HarmonyMethod(typeof(DeliveryQuantityPatcher), "BeforeQuantityInputSubmitted", (System.Type[])null); HarmonyMethod prefix4 = new HarmonyMethod(typeof(DeliveryQuantityPatcher), "BeforeValidateInput", (System.Type[])null); num += TryPatch(harmony, type2, "Initialize", null, postfix2); num += TryPatch(harmony, type2, "SetQuantity", prefix, null); num += TryPatch(harmony, type2, "ChangeQuantity", prefix2, null); num += TryPatch(harmony, type2, "OnQuantityInputSubmitted", prefix3, null); num += TryPatch(harmony, type2, "_Initialize_b__16_0", prefix3, null); num += TryPatch(harmony, type2, "ValidateInput", prefix4, null); } else { logger.Warning("Could not find Il2CppScheduleOne.UI.Phone.Delivery.ListingEntry. Four-digit delivery quantity input was not patched."); } logger.Msg($"Patched {num} delivery quantity UI method(s)."); } public static void AfterDeliveryShopRefresh(object __instance) { if (Settings.Enabled.Value && __instance != null) { ApplyShopQuantityPreset(GetMemberValue(__instance, "MatchingShop", "_MatchingShop_k__BackingField")); } } public static void AfterListingEntryInitialize(object __instance) { if (Settings.Enabled.Value && __instance != null) { PrepareListingEntry(__instance); } } public static bool BeforeSetQuantity(object __instance, [HarmonyArgument(0)] int quantity, [HarmonyArgument(1)] bool notify) { if (!Settings.Enabled.Value || __instance == null) { return true; } PrepareListingEntry(__instance); SetQuantityDirect(__instance, ClampForListing(__instance, quantity), notify); return false; } public static bool BeforeChangeQuantity(object __instance, [HarmonyArgument(0)] int change) { if (!Settings.Enabled.Value || __instance == null) { return true; } PrepareListingEntry(__instance); int num = GetIntMember(__instance, "SelectedQuantity", "_SelectedQuantity_k__BackingField"); if (num < 0) { num = 0; } SetQuantityDirect(__instance, ClampForListing(__instance, num + change), notify: true); return false; } public static bool BeforeQuantityInputSubmitted(object __instance, [HarmonyArgument(0)] string value) { if (!Settings.Enabled.Value || __instance == null) { return true; } if (!TryParseQuantity(value, out var quantity)) { SetQuantityDirect(__instance, 0, notify: true); return false; } PrepareListingEntry(__instance); SetQuantityDirect(__instance, ClampForListing(__instance, quantity), notify: true); return false; } public static bool BeforeValidateInput(object __instance) { if (!Settings.Enabled.Value || __instance == null) { return true; } PrepareListingEntry(__instance); string quantityInputText = GetQuantityInputText(__instance); if (string.IsNullOrWhiteSpace(quantityInputText)) { return false; } string text = new string(Enumerable.ToArray<char>(Enumerable.Where<char>((System.Collections.Generic.IEnumerable<char>)quantityInputText, (Func<char, bool>)char.IsDigit))); if (!string.Equals(quantityInputText, text, (StringComparison)4)) { SetQuantityInputText(__instance, text); } if (TryParseQuantity(text, out var quantity) && quantity > Settings.MaxOrderQuantityPerItemValue) { SetQuantityInputText(__instance, Settings.MaxOrderQuantityPerItemValue.ToString()); } return false; } private static int TryPatch(Harmony harmony, System.Type type, string methodName, HarmonyMethod? prefix, HarmonyMethod? postfix) { try { MethodInfo[] array = Enumerable.ToArray<MethodInfo>(Enumerable.Where<MethodInfo>((System.Collections.Generic.IEnumerable<MethodInfo>)type.GetMethods((BindingFlags)54), (Func<MethodInfo, bool>)((MethodInfo method) => ((MemberInfo)method).Name == methodName && !((MethodBase)method).IsAbstract && !((MethodBase)method).ContainsGenericParameters))); int num = 0; MethodInfo[] array2 = array; foreach (MethodInfo val in array2) { harmony.Patch((MethodBase)(object)val, prefix, postfix, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); num++; if (Settings.DiscoveryLogging.Value) { DiscoveryLog.Write($"Patched {type.FullName}.{((MemberInfo)val).Name} for four-digit delivery quantities"); } } return num; } catch (System.Exception ex) { Instance? logger = _logger; if (logger != null) { logger.Warning($"Could not patch {type.FullName}.{methodName}: {ex.Message}"); } return 0; } } private static void PrepareListingEntry(object entry) { ApplyShopQuantityPreset(GetMemberValue(GetMemberValue(entry, "MatchingListing", "_MatchingListing_k__BackingField"), "Shop", "_Shop_k__BackingField")); object memberValue = GetMemberValue(entry, "QuantityInput"); if (memberValue != null) { int orderQuantityDigitCount = Settings.OrderQuantityDigitCount; SetInputCharacterLimit(memberValue, orderQuantityDigitCount); SetQuantityInputWidth(entry, memberValue); } } private static void ApplyShopQuantityPreset(object? shopInterface) { if (shopInterface == null) { return; } int maxOrderQuantityPerItemValue = Settings.MaxOrderQuantityPerItemValue; int intMember = GetIntMember(shopInterface, "MAX_ITEM_QUANTITY"); if (intMember != maxOrderQuantityPerItemValue) { SetMemberValue(shopInterface, "MAX_ITEM_QUANTITY", maxOrderQuantityPerItemValue); if (Settings.DiscoveryLogging.Value) { DiscoveryLog.Write($"Applied delivery shop quantity preset: MAX_ITEM_QUANTITY {intMember} -> {maxOrderQuantityPerItemValue}"); } } } private static int ClampForListing(object entry, int quantity) { int num = Settings.MaxOrderQuantityPerItemValue; object memberValue = GetMemberValue(entry, "MatchingListing", "_MatchingListing_k__BackingField"); if (memberValue != null && GetBoolMember(memberValue, "LimitedStock")) { int intMember = GetIntMember(memberValue, "CurrentStock", "_CurrentStock_k__BackingField"); if (intMember >= 0) { num = Math.Min(num, intMember); } } return Math.Clamp(quantity, 0, num); } private static void SetQuantityDirect(object entry, int quantity, bool notify) { SetMemberValue(entry, "SelectedQuantity", quantity); SetMemberValue(entry, "_SelectedQuantity_k__BackingField", quantity); SetQuantityInputText(entry, quantity.ToString()); if (notify) { InvokeQuantityChanged(entry, quantity); } if (Settings.DiscoveryLogging.Value) { string stringMember = GetStringMember(GetMemberValue(GetMemberValue(entry, "MatchingListing", "_MatchingListing_k__BackingField"), "Item"), "Name", "ID"); DiscoveryLog.Write($"Set delivery listing quantity: {stringMember} qty={quantity}"); } } private static void InvokeQuantityChanged(object entry, int quantity) { object memberValue = GetMemberValue(entry, "onQuantityChanged"); if (memberValue != null && !TryInvokeByName(memberValue, "Invoke", entry) && !TryInvokeByName(memberValue, "Invoke", quantity)) { TryInvokeByName(memberValue, "Invoke"); } } private static void SetInputCharacterLimit(object input, int characterLimit) { if (SetMemberValue(input, "characterLimit", characterLimit)) { LogInputPatchOnce(characterLimit); return; } object memberValue = GetMemberValue(input, "InputField", "inputField", "_InputField_k__BackingField"); if (memberValue != null && SetMemberValue(memberValue, "characterLimit", characterLimit)) { LogInputPatchOnce(characterLimit); } } private static void SetQuantityInputWidth(object entry, object input) { if (!Settings.FourDigitOrderQuantities.Value) { return; } System.Collections.Generic.IEnumerator<object> enumerator = GetQuantityTextCandidates(input).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { object current = enumerator.Current; SetFontSize(current, 20f); EnableTextAutoSizing(current, 16f, 20f); DisableTextWrapping(current); } } finally { ((System.IDisposable)enumerator)?.Dispose(); } } [IteratorStateMachine(typeof(<GetQuantityVisualCandidates>d__17))] private static System.Collections.Generic.IEnumerable<object> GetQuantityVisualCandidates(object input) { System.Collections.Generic.IEnumerator<object> enumerator = EnumerateLocalUiCandidates(input).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { yield return enumerator.Current; } } finally { ((System.IDisposable)enumerator)?.Dispose(); } object memberValue = GetMemberValue(input, "InputField", "inputField", "_InputField_k__BackingField"); if (memberValue == null) { yield break; } enumerator = EnumerateLocalUiCandidates(memberValue).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { yield return enumerator.Current; } } finally { ((System.IDisposable)enumerator)?.Dispose(); } } [IteratorStateMachine(typeof(<GetQuantityTextCandidates>d__18))] private static System.Collections.Generic.IEnumerable<object> GetQuantityTextCandidates(object input) { HashSet<object> seen = new HashSet<object>((IEqualityComparer<object>)(object)ReferenceEqualityComparer.Instance); object[] array = Enumerable.ToArray<object>(GetQuantityVisualCandidates(input)); foreach (object owner in array) { if (HasTextSizingMember(owner) && seen.Add(owner)) { yield return owner; } string[] array2 = new string[10] { "textViewport", "TextViewport", "m_TextViewport", "_textViewport", "textComponent", "TextComponent", "m_TextComponent", "_textComponent", "placeholder", "m_Placeholder" }; foreach (string text in array2) { object memberValue = GetMemberValue(owner, text); if (memberValue != null && seen.Add(memberValue)) { yield return memberValue; } } array2 = new string[3] { "TMPro.TMP_Text", "TMPro.TextMeshProUGUI", "UnityEngine.UI.Text" }; foreach (string componentTypeName in array2) { System.Collections.Generic.IEnumerator<object> enumerator = GetComponentsInChildren(owner, componentTypeName).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { object current = enumerator.Current; if (seen.Add(current)) { yield return current; } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } } } } private static void EnableTextAutoSizing(object candidate, float minSize, float maxSize) { SetMemberValue(candidate, "enableAutoSizing", true); SetNumericMemberValue(candidate, "fontSizeMin", minSize); SetNumericMemberValue(candidate, "fontSizeMax", maxSize); SetMemberValue(candidate, "resizeTextForBestFit", true); SetNumericMemberValue(candidate, "resizeTextMinSize", minSize); SetNumericMemberValue(candidate, "resizeTextMaxSize", maxSize); } [IteratorStateMachine(typeof(<EnumerateLocalUiCandidates>d__20))] private static System.Collections.Generic.IEnumerable<object> EnumerateLocalUiCandidates(object candidate) { yield return candidate; object memberValue = GetMemberValue(candidate, "transform"); if (memberValue != null) { yield return memberValue; } object component = GetComponent(candidate, "UnityEngine.RectTransform"); if (component != null) { yield return component; } object component2 = GetComponent(candidate, "UnityEngine.UI.LayoutElement"); if (component2 != null) { yield return component2; } } private static void SetFontSize(object candidate, float fontSize) { if (HasMember(candidate, "fontSize")) { float floatMember = GetFloatMember(candidate, "fontSize"); if (!(floatMember > 0f) || !(floatMember <= fontSize)) { SetNumericMemberValue(candidate, "fontSize", fontSize); } } } private static void DisableTextWrapping(object candidate) { SetMemberValue(candidate, "enableWordWrapping", false); } private static bool HasTextSizingMember(object candidate) { if (!HasMember(candidate, "fontSize") && !HasMember(candidate, "fontSizeMin")) { return HasMember(candidate, "resizeTextForBestFit"); } return true; } [IteratorStateMachine(typeof(<GetComponentsInChildren>d__24))] private static System.Collections.Generic.IEnumerable<object> GetComponentsInChildren(object candidate, string componentTypeName) { System.Type componentType = FindType(componentTypeName); if (componentType == (System.Type)null) { yield break; } object[] array = Enumerable.ToArray<object>(Enumerable.Distinct<object>(Enumerable.Cast<object>((System.Collections.IEnumerable)Enumerable.Where<object>((System.Collections.Generic.IEnumerable<object>)new object[3] { candidate, GetMemberValue(candidate, "gameObject"), GetMemberValue(candidate, "transform") }, (Func<object, bool>)((object obj2) => obj2 != null))), (IEqualityComparer<object>)(object)ReferenceEqualityComparer.Instance)); object[] array2 = array; foreach (object root in array2) { System.Collections.Generic.IEnumerator<MethodInfo> enumerator = GetAllMethods(root.GetType()).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { MethodInfo current = enumerator.Current; if (((MemberInfo)current).Name != "GetComponentsInChildren") { continue; } object value = null; ParameterInfo[] parameters = ((MethodBase)current).GetParameters(); try { if (((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 0) { value = ((MethodBase)current.MakeGenericMethod(new System.Type[1] { componentType })).Invoke(root, (object[])null); } else if (((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 1 && parameters[0].ParameterType == typeof(bool)) { value = ((MethodBase)current.MakeGenericMethod(new System.Type[1] { componentType })).Invoke(root, new object[1] { true }); } else if (!((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 1 && parameters[0].ParameterType == typeof(System.Type)) { value = ((MethodBase)current).Invoke(root, new object[1] { componentType }); } else if (!((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 2 && parameters[0].ParameterType == typeof(System.Type) && parameters[1].ParameterType == typeof(bool)) { value = ((MethodBase)current).Invoke(root, new object[2] { componentType, true }); } } catch { } System.Collections.Generic.IEnumerator<object> enumerator2 = EnumerateObjects(value).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator2).MoveNext()) { yield return enumerator2.Current; } } finally { ((System.IDisposable)enumerator2)?.Dispose(); } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } } } [IteratorStateMachine(typeof(<EnumerateObjects>d__25))] private static System.Collections.Generic.IEnumerable<object> EnumerateObjects(object? value) { if (value == null || value is string) { yield break; } if (value is System.Collections.IEnumerable enumerable) { foreach (object item in enumerable) { if (item != null) { yield return item; } } } else { yield return value; } } private static object? GetComponent(object candidate, string componentTypeName) { System.Type type = FindType(componentTypeName); if (type == (System.Type)null) { return null; } object obj = GetMemberValue(candidate, "gameObject") ?? candidate; System.Collections.Generic.IEnumerator<MethodInfo> enumerator = GetAllMethods(obj.GetType()).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { MethodInfo current = enumerator.Current; if (((MemberInfo)current).Name != "GetComponent") { continue; } ParameterInfo[] parameters = ((MethodBase)current).GetParameters(); try { if (((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 0) { return ((MethodBase)current.MakeGenericMethod(new System.Type[1] { type })).Invoke(obj, (object[])null); } if (!((MethodBase)current).IsGenericMethodDefinition && parameters.Length == 1 && parameters[0].ParameterType == typeof(System.Type)) { return ((MethodBase)current).Invoke(obj, new object[1] { type }); } } catch { } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } return null; } private static float GetFloatMember(object? instance, params string[] memberNames) { object memberValue = GetMemberValue(instance, memberNames); if (!(memberValue is float result)) { if (!(memberValue is double num)) { if (memberValue is int num2) { return num2; } return 0f; } return (float)num; } return result; } private static bool HasMember(object instance, string memberName) { if (!Enumerable.Any<PropertyInfo>(GetAllProperties(instance.GetType()), (Func<PropertyInfo, bool>)((PropertyInfo property) => string.Equals(((MemberInfo)property).Name, memberName, (StringComparison)4)))) { return Enumerable.Any<FieldInfo>(GetAllFields(instance.GetType()), (Func<FieldInfo, bool>)((FieldInfo field) => string.Equals(((MemberInfo)field).Name, memberName, (StringComparison)4))); } return true; } private static string? GetQuantityInputText(object entry) { object memberValue = GetMemberValue(entry, "QuantityInput"); if (memberValue != null) { return GetInputText(memberValue); } return null; } private static string? GetInputText(object input) { if (GetMemberValue(input, "text", "Text") is string result) { return result; } object memberValue = GetMemberValue(input, "InputField", "inputField", "_InputField_k__BackingField"); if (memberValue == null) { return null; } return GetMemberValue(memberValue, "text", "Text") as string; } private static void SetQuantityInputText(object entry, string text) { object memberValue = GetMemberValue(entry, "QuantityInput"); if (memberValue != null) { SetInputText(memberValue, text); } } private static void SetInputText(object input, string text) { if (!TryInvokeByName(input, "SetTextWithoutNotify", text) && !SetMemberValue(input, "text", text) && !SetMemberValue(input, "Text", text)) { object memberValue = GetMemberValue(input, "InputField", "inputField", "_InputField_k__BackingField"); if (memberValue != null) { TryInvokeByName(memberValue, "SetTextWithoutNotify", text); SetMemberValue(memberValue, "text", text); SetMemberValue(memberValue, "Text", text); } } } private static bool TryParseQuantity(string? value, out int quantity) { quantity = 0; if (string.IsNullOrWhiteSpace(value)) { return false; } return int.TryParse(value.Trim(), ref quantity); } private static void LogInputPatchOnce(int characterLimit) { if (!_loggedInputPatch) { _loggedInputPatch = true; Instance? logger = _logger; if (logger != null) { logger.Msg($"Raised delivery quantity input limit to {characterLimit} digits."); } } } private static object? GetMemberValue(object? instance, params string[] memberNames) { if (instance == null) { return null; } System.Type type = instance.GetType(); foreach (string text in memberNames) { System.Collections.Generic.IEnumerator<PropertyInfo> enumerator = GetAllProperties(type).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { PropertyInfo current = enumerator.Current; if (string.Equals(((MemberInfo)current).Name, text, (StringComparison)4) && current.GetIndexParameters().Length == 0) { try { return current.GetValue(instance); } catch { } } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } System.Collections.Generic.IEnumerator<FieldInfo> enumerator2 = GetAllFields(type).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator2).MoveNext()) { FieldInfo current2 = enumerator2.Current; if (string.Equals(((MemberInfo)current2).Name, text, (StringComparison)4)) { try { return current2.GetValue(instance); } catch { } } } } finally { ((System.IDisposable)enumerator2)?.Dispose(); } object obj3 = Invoke(instance, "get_" + text); if (obj3 != null) { return obj3; } } return null; } private static int GetIntMember(object? instance, params string[] memberNames) { object memberValue = GetMemberValue(instance, memberNames); if (!(memberValue is int result)) { if (!(memberValue is uint num)) { if (!(memberValue is short result2)) { if (!(memberValue is ushort result3)) { if (memberValue is byte result4) { return result4; } return -1; } return result3; } return result2; } return (num <= 2147483647) ? ((int)num) : (-1); } return result; } private static bool GetBoolMember(object? instance, params string[] memberNames) { object memberValue = GetMemberValue(instance, memberNames); bool flag = default(bool); int num; if (memberValue is bool) { flag = (bool)memberValue; num = 1; } else { num = 0; } return (byte)((uint)num & (flag ? 1u : 0u)) != 0; } private static string GetStringMember(object? instance, params string[] memberNames) { if (!(GetMemberValue(instance, memberNames) is string text) || string.IsNullOrWhiteSpace(text)) { return "<unknown>"; } return text; } private static bool SetMemberValue(object instance, string memberName, object value) { System.Collections.Generic.IEnumerator<PropertyInfo> enumerator = GetAllProperties(instance.GetType()).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { PropertyInfo current = enumerator.Current; if (string.Equals(((MemberInfo)current).Name, memberName, (StringComparison)4) && current.CanWrite) { try { current.SetValue(instance, value); return true; } catch { } } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } try { FieldInfo field = instance.GetType().GetField(memberName, (BindingFlags)52); if (field != (FieldInfo)null) { field.SetValue(instance, value); return true; } } catch { } return TryInvokeByName(instance, "set_" + memberName, value); } private static bool SetNumericMemberValue(object instance, string memberName, float value) { System.Collections.Generic.IEnumerator<PropertyInfo> enumerator = GetAllProperties(instance.GetType()).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { PropertyInfo current = enumerator.Current; if (string.Equals(((MemberInfo)current).Name, memberName, (StringComparison)4) && current.CanWrite && TryConvertNumber(value, current.PropertyType, out object converted)) { try { current.SetValue(instance, converted); return true; } catch { } } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } System.Collections.Generic.IEnumerator<FieldInfo> enumerator2 = GetAllFields(instance.GetType()).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator2).MoveNext()) { FieldInfo current2 = enumerator2.Current; if (string.Equals(((MemberInfo)current2).Name, memberName, (StringComparison)4) && TryConvertNumber(value, current2.FieldType, out object converted2)) { try { current2.SetValue(instance, converted2); return true; } catch { } } } } finally { ((System.IDisposable)enumerator2)?.Dispose(); } if (!TryInvokeByName(instance, "set_" + memberName, value)) { return TryInvokeByName(instance, "set_" + memberName, (int)MathF.Round(value)); } return true; } private static bool TryConvertNumber(float value, System.Type targetType, out object converted) { targetType = Nullable.GetUnderlyingType(targetType) ?? targetType; if (targetType == typeof(float)) { converted = value; return true; } if (targetType == typeof(double)) { converted = (double)value; return true; } if (targetType == typeof(decimal)) { converted = (decimal)value; return true; } if (targetType == typeof(int)) { converted = (int)MathF.Round(value); return true; } if (targetType == typeof(uint)) { converted = (uint)Math.Max(0, (int)MathF.Round(value)); return true; } if (targetType == typeof(short)) { converted = (short)MathF.Round(value); return true; } if (targetType == typeof(ushort)) { converted = (ushort)Math.Max(0, (int)MathF.Round(value)); return true; } if (targetType == typeof(byte)) { converted = (byte)Math.Clamp((int)MathF.Round(value), 0, 255); return true; } converted = value; return false; } private static object? Invoke(object instance, string methodName, params object[] args) { System.Collections.Generic.IEnumerator<MethodInfo> enumerator = GetAllMethods(instance.GetType()).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { MethodInfo current = enumerator.Current; if (string.Equals(((MemberInfo)current).Name, methodName, (StringComparison)4) && ((MethodBase)current).GetParameters().Length == args.Length) { try { return ((MethodBase)current).Invoke(instance, args); } catch { } } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } return null; } private static bool TryInvokeByName(object instance, string methodName, params object[] args) { System.Collections.Generic.IEnumerator<MethodInfo> enumerator = GetAllMethods(instance.GetType()).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { MethodInfo current = enumerator.Current; if (string.Equals(((MemberInfo)current).Name, methodName, (StringComparison)4) && ((MethodBase)current).GetParameters().Length == args.Length) { try { ((MethodBase)current).Invoke(instance, args); return true; } catch { } } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } return false; } [IteratorStateMachine(typeof(<GetAllProperties>d__44))] private static System.Collections.Generic.IEnumerable<PropertyInfo> GetAllProperties(System.Type type) { System.Type current = type; while (current != (System.Type)null) { PropertyInfo[] properties = current.GetProperties((BindingFlags)54); for (int i = 0; i < properties.Length; i++) { yield return properties[i]; } current = current.BaseType; } } [IteratorStateMachine(typeof(<GetAllFields>d__45))] private static System.Collections.Generic.IEnumerable<FieldInfo> GetAllFields(System.Type type) { System.Type current = type; while (current != (System.Type)null) { FieldInfo[] fields = current.GetFields((BindingFlags)54); for (int i = 0; i < fields.Length; i++) { yield return fields[i]; } current = current.BaseType; } } [IteratorStateMachine(typeof(<GetAllMethods>d__46))] private static System.Collections.Generic.IEnumerable<MethodInfo> GetAllMethods(System.Type type) { System.Type current = type; while (current != (System.Type)null) { MethodInfo[] methods = current.GetMethods((BindingFlags)54); for (int i = 0; i < methods.Length; i++) { yield return methods[i]; } current = current.BaseType; } } private static System.Type? FindType(string fullName) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly val in assemblies) { try { System.Type type = val.GetType(fullName, false); if (type != (System.Type)null) { return type; } } catch { } } return null; } } internal static class DeliveryShopPatcher { private readonly record struct StackInfo(int StackLimit, string Source) { public static StackInfo Unknown => new StackInfo(-1, "unknown"); [CompilerGenerated] public override string ToString() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown StringBuilder val = new StringBuilder(); val.Append("StackInfo"); val.Append(" { "); if (PrintMembers(val)) { val.Append(' '); } val.Append('}'); return ((object)val).ToString(); } [CompilerGenerated] private bool PrintMembers(StringBuilder builder) { builder.Append("StackLimit = "); builder.Append(((object)StackLimit/*cast due to .constrained prefix*/).ToString()); builder.Append(", Source = "); builder.Append((object)Source); return true; } } [CompilerGenerated] private sealed class <GetAllFields>d__13 : System.Collections.Generic.IEnumerable<FieldInfo>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<FieldInfo>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private FieldInfo <>2__current; private int <>l__initialThreadId; private System.Type type; public System.Type <>3__type; private System.Type <current>5__2; private FieldInfo[] <>7__wrap2; private int <>7__wrap3; FieldInfo System.Collections.Generic.IEnumerator<FieldInfo>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllFields>d__13(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; <>7__wrap3++; goto IL_0074; } <>1__state = -1; <current>5__2 = type; goto IL_009c; IL_0074: if (<>7__wrap3 < <>7__wrap2.Length) { FieldInfo val = <>7__wrap2[<>7__wrap3]; <>2__current = val; <>1__state = 1; return true; } <>7__wrap2 = null; <current>5__2 = <current>5__2.BaseType; goto IL_009c; IL_009c: if (<current>5__2 != (System.Type)null) { <>7__wrap2 = <current>5__2.GetFields((BindingFlags)54); <>7__wrap3 = 0; goto IL_0074; } <current>5__2 = null; return false; } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<FieldInfo> System.Collections.Generic.IEnumerable<FieldInfo>.GetEnumerator() { <GetAllFields>d__13 <GetAllFields>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetAllFields>d__ = this; } else { <GetAllFields>d__ = new <GetAllFields>d__13(0); } <GetAllFields>d__.type = <>3__type; return <GetAllFields>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<FieldInfo>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetAllMethods>d__14 : System.Collections.Generic.IEnumerable<MethodInfo>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<MethodInfo>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private MethodInfo <>2__current; private int <>l__initialThreadId; private System.Type type; public System.Type <>3__type; private System.Type <current>5__2; private MethodInfo[] <>7__wrap2; private int <>7__wrap3; MethodInfo System.Collections.Generic.IEnumerator<MethodInfo>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllMethods>d__14(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; <>7__wrap3++; goto IL_0074; } <>1__state = -1; <current>5__2 = type; goto IL_009c; IL_0074: if (<>7__wrap3 < <>7__wrap2.Length) { MethodInfo val = <>7__wrap2[<>7__wrap3]; <>2__current = val; <>1__state = 1; return true; } <>7__wrap2 = null; <current>5__2 = <current>5__2.BaseType; goto IL_009c; IL_009c: if (<current>5__2 != (System.Type)null) { <>7__wrap2 = <current>5__2.GetMethods((BindingFlags)54); <>7__wrap3 = 0; goto IL_0074; } <current>5__2 = null; return false; } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<MethodInfo> System.Collections.Generic.IEnumerable<MethodInfo>.GetEnumerator() { <GetAllMethods>d__14 <GetAllMethods>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetAllMethods>d__ = this; } else { <GetAllMethods>d__ = new <GetAllMethods>d__14(0); } <GetAllMethods>d__.type = <>3__type; return <GetAllMethods>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<MethodInfo>)this).GetEnumerator(); } } [CompilerGenerated] private sealed class <GetAllProperties>d__12 : System.Collections.Generic.IEnumerable<PropertyInfo>, System.Collections.IEnumerable, System.Collections.Generic.IEnumerator<PropertyInfo>, System.IDisposable, System.Collections.IEnumerator { private int <>1__state; private PropertyInfo <>2__current; private int <>l__initialThreadId; private System.Type type; public System.Type <>3__type; private System.Type <current>5__2; private PropertyInfo[] <>7__wrap2; private int <>7__wrap3; PropertyInfo System.Collections.Generic.IEnumerator<PropertyInfo>.Current { [DebuggerHidden] get { return <>2__current; } } object System.Collections.IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllProperties>d__12(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void System.IDisposable.Dispose() { } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; <>7__wrap3++; goto IL_0074; } <>1__state = -1; <current>5__2 = type; goto IL_009c; IL_0074: if (<>7__wrap3 < <>7__wrap2.Length) { PropertyInfo val = <>7__wrap2[<>7__wrap3]; <>2__current = val; <>1__state = 1; return true; } <>7__wrap2 = null; <current>5__2 = <current>5__2.BaseType; goto IL_009c; IL_009c: if (<current>5__2 != (System.Type)null) { <>7__wrap2 = <current>5__2.GetProperties((BindingFlags)54); <>7__wrap3 = 0; goto IL_0074; } <current>5__2 = null; return false; } bool System.Collections.IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void System.Collections.IEnumerator.Reset() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) throw new NotSupportedException(); } [DebuggerHidden] System.Collections.Generic.IEnumerator<PropertyInfo> System.Collections.Generic.IEnumerable<PropertyInfo>.GetEnumerator() { <GetAllProperties>d__12 <GetAllProperties>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <GetAllProperties>d__ = this; } else { <GetAllProperties>d__ = new <GetAllProperties>d__12(0); } <GetAllProperties>d__.type = <>3__type; return <GetAllProperties>d__; } [DebuggerHidden] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return (System.Collections.IEnumerator)((System.Collections.Generic.IEnumerable<PropertyInfo>)this).GetEnumerator(); } } private static Instance? _logger; private static bool _warnedAboutEstimationFailure; internal static void Install(Harmony harmony, Instance logger) { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown _logger = logger; System.Type type = FindType("Il2CppScheduleOne.UI.Phone.Delivery.DeliveryShop"); if (type == (System.Type)null) { logger.Warning("Could not find Il2CppScheduleOne.UI.Phone.Delivery.DeliveryShop. Order-size validation was not patched."); return; } MethodInfo method = type.GetMethod("WillCartFitInVehicle", (BindingFlags)54); if (method == (MethodInfo)null) { logger.Warning("Could not find DeliveryShop.WillCartFitInVehicle(). Order-size validation was not patched."); return; } harmony.Patch((MethodBase)(object)method, (HarmonyMethod)null, new HarmonyMethod(typeof(DeliveryShopPatcher), "WillCartFitInVehiclePostfix", (System.Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); logger.Msg("Patched DeliveryShop.WillCartFitInVehicle for modded delivery trunk capacity."); } public static void WillCartFitInVehiclePostfix(object __instance, ref bool __result) { if ((!Settings.Enabled.Value || __instance == null) | __result) { return; } int num = EstimateCartSlots(__instance); if (num <= 0) { if (!_warnedAboutEstimationFailure) { _warnedAboutEstimationFailure = true; Instance? logger = _logger; if (logger != null) { logger.Warning("Could not estimate delivery cart slot usage. Keeping original order-size validation result."); } } return; } int targetSlotsValue = Settings.TargetSlotsValue; if (num > targetSlotsValue) { if (Settings.DiscoveryLogging.Value) { DiscoveryLog.Write($"Delivery cart still too large: {num} stack slots needed, target is {targetSlotsValue}."); } return; } __result = true; if (Settings.DiscoveryLogging.Value) { DiscoveryLog.Write($"Allowed delivery order using modded capacity: {num}/{targetSlotsValue} stack slots."); } } private static int EstimateCartSlots(object deliveryShop) { object memberValue = GetMemberValue(deliveryShop, "listingEntries"); if (memberValue == null) { if (Settings.DiscoveryLogging.Value) { DiscoveryLog.Write("Could not read DeliveryShop.listingEntries."); } return -1; } int listCount = GetListCount(memberValue); if (listCount < 0) { if (Settings.DiscoveryLogging.Value) { DiscoveryLog.Write("Could not read listingEntries.Count from " + memberValue.GetType().FullName + "."); } return -1; } int num = 0; for (int i = 0; i < listCount; i++) { object listItem = GetListItem(memberValue, i); if (listItem == null) { continue; } int intMember = GetIntMember(listItem, "SelectedQuantity", "_SelectedQuantity_k__BackingField"); if (intMember <= 0) { continue; } object memberValue2 = GetMemberValue(listItem, "MatchingListing", "_MatchingListing_k__BackingField"); object obj = ((memberValue2 == null) ? null : GetMemberValue(memberValue2, "Item")); StackInfo stackCapacity = GetStackCapacity(obj); int stackLimit = stackCapacity.StackLimit; if (stackLimit <= 0) { if (Settings.DiscoveryLogging.Value) { string text = memberValue2?.GetType().FullName ?? "<null>"; string text2 = obj?.GetType().FullName ?? "<null>"; DiscoveryLog.Write($"Could not resolve stack limit for cart entry index={i}, quantity={intMember}, listingType={text}, itemType={text2}."); } return -1; } num += (int)Math.Ceiling((double)intMember / (double)stackLimit); if (Settings.DiscoveryLogging.Value) { string stringMember = GetStringMember(obj, "Name", "ID"); DiscoveryLog.Write($"Cart item: {stringMember} qty={intMember}, stack={stackLimit}, slots={(int)Math.Ceiling((double)intMember / (double)stackLimit)}, stackSource={stackCapacity.Source}"); } } return num; } private static StackInfo GetStackCapacity(object? itemDefinition) { if (itemDefinition == null) { return StackInfo.Unknown; } try { List<StackInfo> val = new List<StackInfo>(); int intMember = GetIntMember(itemDefinition, "StackLimit"); if (intMember > 0) { val.Add(new StackInfo(intMember, "definition.StackLimit")); } int intMember2 = GetIntMember(itemDefinition, "DefaultStackLimit"); if (intMember2 > 0) { val.Add(new StackInfo(intMember2, "definition.DefaultStackLimit")); } object obj = Invoke(itemDefinition, "GetDefaultInstance", 1); if (obj != null) { int intMember3 = GetIntMember(obj, "StackLimit"); if (intMember3 > 0) { val.Add(new StackInfo(intMember3, "instance.StackLimit")); } System.Type type = FindType("Il2CppScheduleOne.ItemFramework.ItemSlot"); object obj2 = ((type == (System.Type)null) ? null : Activator.CreateInstance(type)); if (obj2 != null && Invoke(obj2, "GetCapacityForItem", obj, true) is int num && num > 0) { val.Add(new StackInfo(num, "emptySlot.GetCapacityForItem")); } } return (val.Count == 0) ? StackInfo.Unknown : Enumerable.First<StackInfo>((System.Collections.Generic.IEnumerable<StackInfo>)Enumerable.OrderBy<StackInfo, int>((System.Collections.Generic.IEnumerable<StackInfo>)val, (Func<StackInfo, int>)((StackInfo candidate) => candidate.StackLimit))); } catch { return StackInfo.Unknown; } } private static int GetListCount(object list) { if (list is System.Collections.ICollection collection) { return collection.Count; } return GetIntMember(list, "Count"); } private static object? GetListItem(object list, int index) { if (list is System.Collections.IList list2 && index >= 0 && index < ((System.Collections.ICollection)list2).Count) { return list2[index]; } System.Collections.Generic.IEnumerator<PropertyInfo> enumerator = GetAllProperties(list.GetType()).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { PropertyInfo current = enumerator.Current; ParameterInfo[] indexParameters = current.GetIndexParameters(); if (indexParameters.Length == 1 && !(indexParameters[0].ParameterType != typeof(int))) { try { return current.GetValue(list, new object[1] { index }); } catch { } } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } object obj2 = Invoke(list, "get_Item", index); if (obj2 != null) { return obj2; } if (list is System.Collections.IEnumerable enumerable) { int num = 0; foreach (object item in enumerable) { if (num == index) { return item; } num++; } } return null; } private static object? GetMemberValue(object? instance, params string[] memberNames) { if (instance == null) { return null; } System.Type type = instance.GetType(); foreach (string text in memberNames) { System.Collections.Generic.IEnumerator<PropertyInfo> enumerator = GetAllProperties(type).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { PropertyInfo current = enumerator.Current; if (string.Equals(((MemberInfo)current).Name, text, (StringComparison)4) && current.GetIndexParameters().Length == 0) { try { return current.GetValue(instance); } catch { } } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } System.Collections.Generic.IEnumerator<FieldInfo> enumerator2 = GetAllFields(type).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator2).MoveNext()) { FieldInfo current2 = enumerator2.Current; if (string.Equals(((MemberInfo)current2).Name, text, (StringComparison)4)) { try { return current2.GetValue(instance); } catch { } } } } finally { ((System.IDisposable)enumerator2)?.Dispose(); } object obj3 = Invoke(instance, "get_" + text); if (obj3 != null) { return obj3; } } return null; } private static int GetIntMember(object? instance, params string[] memberNames) { object memberValue = GetMemberValue(instance, memberNames); if (!(memberValue is int result)) { if (!(memberValue is uint num)) { if (!(memberValue is short result2)) { if (!(memberValue is ushort result3)) { if (memberValue is byte result4) { return result4; } return -1; } return result3; } return result2; } return (num <= 2147483647) ? ((int)num) : (-1); } return result; } private static string GetStringMember(object? instance, params string[] memberNames) { if (GetMemberValue(instance, memberNames) is string text && !string.IsNullOrWhiteSpace(text)) { return text; } return "<unknown>"; } private static object? Invoke(object instance, string methodName, params object[] args) { System.Collections.Generic.IEnumerator<MethodInfo> enumerator = GetAllMethods(instance.GetType()).GetEnumerator(); try { while (((System.Collections.IEnumerator)enumerator).MoveNext()) { MethodInfo current = enumerator.Current; if (string.Equals(((MemberInfo)current).Name, methodName, (StringComparison)4) && ((MethodBase)current).GetParameters().Length == args.Length) { try { return ((MethodBase)current).Invoke(instance, args); } catch { } } } } finally { ((System.IDisposable)enumerator)?.Dispose(); } return null; } [IteratorStateMachine(typeof(<GetAllProperties>d__12))] private static System.Collections.Generic.IEnumerable<PropertyInfo> GetAllProperties(System.Type type) { System.Type current = type; while (current != (System.Type)null) { PropertyInfo[] properties = current.GetProperties((BindingFlags)54); for (int i = 0; i < properties.Length; i++) { yield return properties[i]; } current = current.BaseType; } } [IteratorStateMachine(typeof(<GetAllFields>d__13))] private static System.Collections.Generic.IEnumerable<FieldInfo> GetAllFields(System.Type type) { System.Type current = type; while (current != (System.Type)null) { FieldInfo[] fields = current.GetFields((BindingFlags)54); for (int i = 0; i < fields.Length; i++) { yield return fields[i]; } current = current.BaseType; } } [IteratorStateMachine(typeof(<GetAllMethods>d__14))] private static System.Collections.Generic.IEnumerable<MethodInfo> GetAllMethods(System.Type type) { System.Type current = type; while (current != (System.Type)null) { MethodInfo[] methods = current.GetMethods((BindingFlags)54); for (int i = 0; i < methods.Length; i++) { yield return methods[i]; } current = current.BaseType; } } private static System.Type? FindType(string fullName) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly val in assemblies) { try { System.Type type = val.GetType(fullName, false); if (type != (System.Type)null) { return type; } } catch { } } return null; } } internal static class DeliveryVehiclePatcher { private static Instance? _logger; internal static void Install(Harmony harmony, Instance logger) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown _logger = logger; System.Type type = FindType("Il2CppScheduleOne.Delivery.DeliveryVehicle"); if (type == (System.Type)null) { logger.Warning("Could not find Il2CppScheduleOne.Delivery.DeliveryVehicle. No trunk patch was installed."); return; } HarmonyMethod prefix = new HarmonyMethod(typeof(DeliveryVehiclePatcher), "BeforeDeliveryVehicleReady", (System.Type[])null); HarmonyMethod postfix = new HarmonyMethod(typeof(DeliveryVehiclePatcher), "AfterDeliveryVehicleReady", (System.Type[])null); HarmonyMethod prefix2 = new HarmonyMethod(typeof(DeliveryVehiclePatcher), "BeforeItemsAddedToDeliveryVehicle", (System.Type[])null); int num = 0; num += TryPatch(harmony, type, "Activate", prefix, postfix); System.Type type2 = FindType("Il2CppScheduleOne.Delivery.DeliveryInstance"); if (type2 == (System.Type)null) { logger.Warning("Could not find Il2CppScheduleOne.Delivery.DeliveryInstance. Delivery item insertion was not patched."); } else { num += TryPatch(harmony, type2, "AddItemsToDeliveryVehicle", prefix2, null); } logger.Msg($"Patched {num} delivery vehicle/item insertion method(s)."); } private static int TryPatch(Harmony harmony, System.Type type, string methodName, HarmonyMethod? prefix, HarmonyMethod? postfix) { try { MethodInfo[] array = Enumerable.ToArray<MethodInfo>(Enumerable.Where<MethodInfo>((System.Collections.Generic.IEnumerable<MethodInfo>)type.GetMethods((BindingFlags)54), (Func<MethodInfo, bool>)((MethodInfo method) => ((MemberInfo)method).Name == methodName && !((MethodBase)method).IsAbstract && !((MethodBase)method).ContainsGenericParameters))); int num = 0; MethodInfo[] array2 = array; foreach (MethodInfo val in array2) { harmony.Patch((MethodBase)(object)val, prefix, postfix, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); num++; if (Settings.DiscoveryLogging.Value) { DiscoveryLog.Write("Patched " + type.FullName + "." + ((MemberInfo)val).Name); } } return num; } catch (System.Exception ex) { Instance? logger = _logger; if (logger != null) { logger.Warning($"Could not patch {type.FullName}.{methodName}: {ex.Message}"); } return 0; } } public static void BeforeDeliveryVehicleReady(object __instance) { Expand(__instance); } public static void AfterDeliveryVehicleReady(object __instance) { Expand(__instance); } public static void BeforeItemsAddedToDeliveryVehicle(object __instance) { Expand(__instance); } private static void Expand(object __instance) { if (Settings.Enabled.Value && __instance != null && _logger != null) { VehicleStorageExpander.Apply(__instance, _logger); } } private static System.Type? FindType(string fullName) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly val in assemblies) { try { System.Type type = val.GetType(fullName, false); if (type != (System.Type)null) { return type; } } catch { } } return null; } } internal static class DiscoveryLog { private static readonly object Sync = new object(); internal static void Write(string line) { try { string text = Path.Combine(string.IsNullOrWhiteSpace(MelonEnvironment.UserDataDirectory) ? Path.Combine(Environment.CurrentDirectory, "UserData") : MelonEnvironment.UserDataDirectory, "VehicleDeliverySlots"); Directory.CreateDirectory(text); string text2 = Path.Combine(text, "discovery.log"); lock (Sync) { File.AppendAllText(text2, $"[{System.DateTime.Now:HH:mm:ss}] {line}{Environment.NewLine}", Encoding.UTF8); } } catch { } } } public static class BuildInfo { public const string Name = "VehicleDeliverySlots"; public const string Author = "Daudr + Codex"; public const string Version = "1.1.1"; public const string DownloadLink = ""; } public sealed class VehicleDeliverySlotsMod : MelonMod { public override void OnInitializeMelon() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_004a: Expected O, but got Unknown Settings.Register(); Harmony val = new Harmony("daudr.schedulei.vehicle-delivery-slots"); DeliveryVehiclePatcher.Install(val, ((MelonBase)this).LoggerInstance); DeliveryManagerPatcher.Install(val, ((MelonBase)this).LoggerInstance); DeliveryShopPatcher.Install(val, ((MelonBase)this).LoggerInstance); StorageMenuPatcher.Install(val, ((MelonBase)this).LoggerInstance); DeliveryQuantityPatcher.Install(val, ((MelonBase)this).LoggerInstance); ((MelonBase)this).LoggerInstance.Msg($"Initialized. TargetSlots={Settings.TargetSlotsValue}."); } } internal sealed class ReferenceEqualityComparer : IEqualityComparer<object> { internal static readonly ReferenceEqualityComparer Instance = new ReferenceEqualityComparer(); private ReferenceEqualityComparer() { } public bool Equals(object? x, object? y) { return x == y; } public int GetHashCode(object obj) { return RuntimeHelpers.GetHashCode(obj); } } internal static class Settings { internal const int VanillaTrunkSlots = 16; internal const int DefaultTargetSlots = 24; internal const int MaxTargetSlots = 64; [field: CompilerGenerated] internal static MelonPreferences_Entry<bool> Enabled { [CompilerGenerated] get; [CompilerGenerated] private set; } [field: CompilerGenerated] internal static MelonPreferences_Entry<int> TargetSlots { [CompilerGenerated] get; [CompilerGenerated] private set; } [field: CompilerGenerated] internal static MelonPreferences_Entry<bool> DiscoveryLogging { [CompilerGenerated] get; [CompilerGenerated] private set; } [field: CompilerGenerated] internal static MelonPreferences_Entry<bool> DeliveryTimerOverrideEnabled { [CompilerGenerated] get; [CompilerGenerated] private set; } [field: CompilerGenerated] internal static MelonPreferences_Entry<int> DeliveryTimerOverrideSeconds { [CompilerGenerated] get; [CompilerGenerated] private set; } [field: CompilerGenerated] internal static MelonPreferences_Entry<bool> FourDigitOrderQuantities { [CompilerGenerated] get; [CompilerGenerated] private set; } internal static int TargetSlotsValue => Math.Clamp((TargetSlots.Value <= 16) ? 24 : TargetSlots.Value, 17, 64); internal static int DeliveryTimerOverrideSecondsValue => Math.Clamp(DeliveryTimerOverrideSeconds.Value, 1, 600); internal static int MaxOrderQuantityPerItemValue { get { if (!FourDigitOrderQuantities.Value) { return 999; } return 9999; } } internal static int OrderQuantityDigitCount { get { if (!FourDigitOrderQuantities.Value) { return 3; } return 4; } } internal static void Register() { MelonPreferences_Category obj = MelonPreferences.CreateCategory("VehicleDeliverySlots", "Vehicle Delivery Slots"); MelonPreferences_Category val = MelonPreferences.CreateCategory("VehicleDeliverySlots.Timer", "Delivery Timer Override"); MelonPreferences_Category val2 = MelonPreferences.CreateCategory("VehicleDeliverySlots.OrderQuantities", "Delivery Order Quantities"); Enabled = obj.CreateEntry<bool>("Enabled", true, "Enabled", "Master toggle. When disabled, no delivery slot or capacity values are changed.", false, false, (ValueValidator)null, (string)null); TargetSlots = obj.CreateEntry<int>("TargetSlots", 24, "Target slots", "Target number of vehicle trunk slots. Vanilla is 16; values from old builds at or below 16 are treated as 24.", false, false, (ValueValidator)null, (string)null); if (TargetSlots.Value <= 16) { TargetSlots.Value = 24; } DiscoveryLogging = obj.CreateEntry<bool>("DiscoveryLogging", false, "Discovery logging", "Writes a small troubleshooting log to UserData/VehicleDeliverySlots.", false, false, (ValueValidator)null, (string)null); DeliveryTimerOverrideEnabled = val.CreateEntry<bool>("DeliveryTimerOverrideEnabled", true, "Delivery timer override", "Optional built-in delivery arrival timer override. Disable other delivery timer mods when this is enabled.", false, false, (ValueValidator)null, (string)null); DeliveryTimerOverrideSeconds = val.CreateEntry<int>("DeliveryTimerOverrideSeconds", 1, "Delivery timer seconds", "Delivery arrival time used when DeliveryTimerOverrideEnabled is on.", false, false, (ValueValidator)null, (string)null); FourDigitOrderQuantities = val2.CreateEntry<bool>("FourDigitOrderQuantities", true, "Four-digit order quantities", "When enabled, delivery item quantities use a 4-digit cap of 9999. Disable for the vanilla 3-digit cap of 999.", false, false, (ValueValidator)null, (string)null); } } internal static class StorageMenuPatcher { private static Instance? _logger; private static bool _loggedCapacityExpansion; private static bool _loggedLayoutFallback; internal static void Install(Harmon