Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of R2API Addressables v1.1.3
plugins/R2API.Addressables/R2API.Addressables.dll
Decompiled a week agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Threading.Tasks; using BepInEx; using BepInEx.Logging; using HG.Coroutines; using HG.Reflection; using Microsoft.CodeAnalysis; using R2API.AutoVersionGen; using RoR2; using RoR2.ExpansionManagement; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.ResourceLocations; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("R2API.Addressables")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.3.0")] [assembly: AssemblyInformationalVersion("1.1.3+e89de2d3d141dc6d17d0f2e916a8eaceee984e93")] [assembly: AssemblyProduct("R2API.Addressables")] [assembly: AssemblyTitle("R2API.Addressables")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.3.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } } namespace R2API { [AutoVersion] [BepInPlugin("com.bepis.r2api.addressables", "R2API.Addressables", "1.1.3")] public sealed class AddressablesPlugin : BaseUnityPlugin { public const string PluginGUID = "com.bepis.r2api.addressables"; public const string PluginName = "R2API.Addressables"; public const string PluginVersion = "1.1.3"; internal static ManualLogSource Logger { get; set; } public static AddressablesPlugin Instance { get; private set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Instance = this; } } } namespace R2API.AutoVersionGen { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] internal class AutoVersionAttribute : Attribute { } } namespace R2API.AddressReferencedAssets { public class AddressableComponentRequirementAttribute : Attribute { public Type requiredComponentType { get; } public bool searchInChildren { get; set; } public AddressableComponentRequirementAttribute(Type requiredComponentType) { this.requiredComponentType = requiredComponentType; } } [Serializable] public class AddressReferencedAsset<T> : AddressReferencedAsset where T : Object { [CompilerGenerated] private sealed class <IsAdressValidAsync>d__38 : IEnumerator<bool?>, IEnumerator, IDisposable { private int <>1__state; private bool? <>2__current; public AddressReferencedAsset<T> <>4__this; private AsyncOperationHandle<IList<IResourceLocation>> <locationTask>5__2; bool? IEnumerator<bool?>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <IsAdressValidAsync>d__38(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) <locationTask>5__2 = default(AsyncOperationHandle<IList<IResourceLocation>>); <>1__state = -2; } private bool MoveNext() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; AddressReferencedAsset<T> addressReferencedAsset = <>4__this; IList<IResourceLocation> result; switch (num) { default: return false; case 0: <>1__state = -1; <locationTask>5__2 = Addressables.LoadResourceLocationsAsync((object)addressReferencedAsset._address, (Type)null); goto IL_0059; case 1: <>1__state = -1; goto IL_0059; case 2: { <>1__state = -1; return false; } IL_0059: if (!<locationTask>5__2.IsDone) { <>2__current = null; <>1__state = 1; return true; } result = <locationTask>5__2.Result; <>2__current = result.Any(); <>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 <LoadAssetAsyncCoroutine>d__28 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedAsset<T> <>4__this; private IEnumerator <coroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAssetAsyncCoroutine>d__28(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <coroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { int num = <>1__state; AddressReferencedAsset<T> addressReferencedAsset = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (!addressReferencedAsset.IsValidForLoadingWithAddress()) { goto IL_005f; } <coroutine>5__2 = addressReferencedAsset.LoadAsyncCoroutine(); } if (<coroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } <coroutine>5__2 = null; goto IL_005f; IL_005f: 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(); } } [CompilerGenerated] private sealed class <LoadAssetNowCoroutine>d__30 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedAsset<T> <>4__this; public Action<T> onLoaded; private IEnumerator <loadCoroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAssetNowCoroutine>d__30(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <loadCoroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { int num = <>1__state; AddressReferencedAsset<T> addressReferencedAsset = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (addressReferencedAsset.AssetExists) { goto IL_005f; } <loadCoroutine>5__2 = addressReferencedAsset.LoadAsyncCoroutine(); } if (<loadCoroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } <loadCoroutine>5__2 = null; goto IL_005f; IL_005f: onLoaded?.Invoke(addressReferencedAsset.Asset); 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(); } } [CompilerGenerated] private sealed class <LoadAsyncCoroutine>d__32 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedAsset<T> <>4__this; private IEnumerator <loadCoroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAsyncCoroutine>d__32(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <loadCoroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { int num = <>1__state; AddressReferencedAsset<T> addressReferencedAsset = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <loadCoroutine>5__2 = addressReferencedAsset.LoadFromAddressAsyncCoroutine(); break; case 1: <>1__state = -1; break; } if (<loadCoroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } 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(); } } [CompilerGenerated] private sealed class <LoadFromAddressAsyncCoroutine>d__34 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedAsset<T> <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadFromAddressAsyncCoroutine>d__34(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; AddressReferencedAsset<T> addressReferencedAsset = <>4__this; switch (num) { default: return false; case 0: { <>1__state = -1; if (AddressReferencedAsset.addressesThatFailedToBeValidated.Contains(addressReferencedAsset._address)) { return false; } bool? flag = null; IEnumerator<bool?> enumerator = addressReferencedAsset.IsAdressValidAsync(); while (flag.HasValue && enumerator.MoveNext()) { flag = enumerator.Current; } bool valueOrDefault = flag.GetValueOrDefault(); if (!flag.HasValue) { valueOrDefault = false; flag = valueOrDefault; } if (flag == false) { AddressablesPlugin.Logger.LogWarning((object)$"{addressReferencedAsset} failed to load from it's address because the address is either invalid, or malformed."); AddressReferencedAsset.addressesThatFailedToBeValidated.Add(addressReferencedAsset._address); addressReferencedAsset._AddressFailedToLoad = true; return false; } addressReferencedAsset.AsyncOperationHandle = Addressables.LoadAssetAsync<T>((object)addressReferencedAsset._address); break; } case 1: <>1__state = -1; break; } if (!addressReferencedAsset.AsyncOperationHandle.IsDone) { <>2__current = null; <>1__state = 1; return true; } addressReferencedAsset._asset = addressReferencedAsset.AsyncOperationHandle.Result; 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 AsyncOperationHandle<T> _asyncOperationHandle; [SerializeField] private T _asset; [SerializeField] private string _address; [SerializeField] [HideInInspector] private bool _useDirectReference; private bool _AddressFailedToLoad; public T Asset { get { if (Object.op_Implicit((Object)(object)_asset)) { return _asset; } if (!AddressReferencedAsset.Initialized && CanLoadFromCatalog) { string name = GetType().Name; MethodBase method = new StackTrace().GetFrame(1).GetMethod(); AddressablesPlugin.Logger.LogWarning((object)($"Assembly {Assembly.GetCallingAssembly()} is trying to access an {name} before AddressReferencedAssets have initialized! This can cause issues as {name} can load the asset from Catalogs within the game." + "\n Consider using AddressReferencedAssets.OnAddressReferencedAssetsLoaded for running code that depends on AddressableAssets! (Method: " + method.DeclaringType.FullName + "." + method.Name + "()")); Load(); } else if (IsValidForLoadingWithAddress()) { if (!_AddressFailedToLoad) { if (_asyncOperationHandle.IsValid()) { _asset = _asyncOperationHandle.WaitForCompletion(); return _asset; } Load(); return _asset; } AddressablesPlugin.Logger.LogWarning((object)$"Not trying to load {this} because it's address has already failed to load beforehand. Null will be returned."); } return _asset; } set { _asset = value; _address = (Object.op_Implicit((Object)(object)_asset) ? string.Empty : _address); _useDirectReference = Object.op_Implicit((Object)(object)_asset); } } public override Object BoxedAsset => (Object)(object)_asset; public new AsyncOperationHandle<T> AsyncOperationHandle { get { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return _asyncOperationHandle; } protected set { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) _asyncOperationHandle = value; base.AsyncOperationHandle = AsyncOperationHandle<T>.op_Implicit(value); } } public bool AssetExists => Object.op_Implicit((Object)(object)_asset); public string Address { get { return _address; } set { //IL_002f: Unknown result type (might be due to invalid IL or missing references) _address = value; _asset = default(T); _useDirectReference = false; _AddressFailedToLoad = false; if (_asyncOperationHandle.IsValid()) { Addressables.Release<T>(_asyncOperationHandle); } if (RoR2Application.loadFinished) { Load(); } } } public bool IsInvalid { get { if (!Object.op_Implicit((Object)(object)_asset)) { if (!string.IsNullOrEmpty(_address)) { return string.IsNullOrWhiteSpace(_address); } return true; } return false; } } public bool UseDirectReference => _useDirectReference; public virtual bool CanLoadFromCatalog { get; protected set; } private bool IsValidForLoadingWithAddress() { if (!Object.op_Implicit((Object)(object)_asset)) { return !string.IsNullOrEmpty(_address); } return false; } [Obsolete("Call \"LoadAssetAsyncCoroutine()\" instead.")] protected sealed override async Task LoadAssetAsync() { if (IsValidForLoadingWithAddress()) { await LoadAsync(); } } [IteratorStateMachine(typeof(AddressReferencedAsset<>.<LoadAssetAsyncCoroutine>d__28))] protected sealed override IEnumerator LoadAssetAsyncCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAssetAsyncCoroutine>d__28(0) { <>4__this = this }; } public T LoadAssetNow() { if (!AssetExists) { Load(); } return Asset; } [IteratorStateMachine(typeof(AddressReferencedAsset<>.<LoadAssetNowCoroutine>d__30))] public virtual IEnumerator LoadAssetNowCoroutine(Action<T> onLoaded) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAssetNowCoroutine>d__30(0) { <>4__this = this, onLoaded = onLoaded }; } protected virtual void Load() { LoadFromAddress(); } [IteratorStateMachine(typeof(AddressReferencedAsset<>.<LoadAsyncCoroutine>d__32))] protected virtual IEnumerator LoadAsyncCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAsyncCoroutine>d__32(0) { <>4__this = this }; } [Obsolete("Use \"LoadAsyncCoroutine()\" Instead")] protected virtual async Task LoadAsync() { await LoadFromAddressAsync(); } [IteratorStateMachine(typeof(AddressReferencedAsset<>.<LoadFromAddressAsyncCoroutine>d__34))] protected IEnumerator LoadFromAddressAsyncCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadFromAddressAsyncCoroutine>d__34(0) { <>4__this = this }; } [Obsolete("Use \"LoadFromAdressAsyncCoroutine\" Instead")] protected async Task LoadFromAddressAsync() { bool? flag = null; IEnumerator<bool?> enumerator = IsAdressValidAsync(); if (flag.HasValue && enumerator.MoveNext()) { flag = enumerator.Current; } if (flag == false) { AddressablesPlugin.Logger.LogWarning((object)$"{this} failed to load from it's address because the address is either invalid, or malformed."); AddressReferencedAsset.addressesThatFailedToBeValidated.Add(_address); _AddressFailedToLoad = true; } else { AsyncOperationHandle = Addressables.LoadAssetAsync<T>((object)_address); _asset = await AsyncOperationHandle.Task; } } protected void LoadFromAddress() { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) if (!IsAddressValid()) { AddressablesPlugin.Logger.LogWarning((object)$"{this} failed to load from it's address because the address is either invalid, or malformed."); _AddressFailedToLoad = true; AddressReferencedAsset.addressesThatFailedToBeValidated.Add(_address); } else { AsyncOperationHandle = Addressables.LoadAssetAsync<T>((object)_address); _asset = AsyncOperationHandle.WaitForCompletion(); } } private bool IsAddressValid() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) return Addressables.LoadResourceLocationsAsync((object)_address, (Type)null).WaitForCompletion().Any(); } [IteratorStateMachine(typeof(AddressReferencedAsset<>.<IsAdressValidAsync>d__38))] private IEnumerator<bool?> IsAdressValidAsync() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <IsAdressValidAsync>d__38(0) { <>4__this = this }; } public override string ToString() { return string.Format("{0}(Asset={1}.Address={2}", GetType().Name, Object.op_Implicit((Object)(object)_asset) ? ((object)_asset) : "null", Address); } public override void Dispose() { //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_0011: Unknown result type (might be due to invalid IL or missing references) if (AsyncOperationHandle.IsValid()) { Addressables.Release<T>(AsyncOperationHandle); } } public static implicit operator bool(AddressReferencedAsset<T> addressReferencedAsset) { return Object.op_Implicit((Object)(object)((addressReferencedAsset != null) ? addressReferencedAsset.Asset : default(T))); } public static implicit operator T(AddressReferencedAsset<T> addressReferencedAsset) { if (addressReferencedAsset == null) { return default(T); } return addressReferencedAsset.Asset; } public static implicit operator AddressReferencedAsset<T>(string address) { return new AddressReferencedAsset<T>(address); } public static implicit operator AddressReferencedAsset<T>(T asset) { return new AddressReferencedAsset<T>(asset); } public AddressReferencedAsset(T asset) { SetHooks(); _asset = asset; _useDirectReference = true; AddressReferencedAsset.instances.Add(this); } public AddressReferencedAsset(string address) { SetHooks(); _address = address; _useDirectReference = false; AddressReferencedAsset.instances.Add(this); } public AddressReferencedAsset() { SetHooks(); AddressReferencedAsset.instances.Add(this); } ~AddressReferencedAsset() { AddressReferencedAsset.instances.Remove(this); if (AddressReferencedAsset.instances.Count == 0) { UnsetHooks(); } } } public abstract class AddressReferencedAsset : IDisposable { [CompilerGenerated] private sealed class <LoadReferencesAsync>d__18 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; private ParallelCoroutine <parallelCoroutine>5__2; private Task <supertask>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadReferencesAsync>d__18(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <parallelCoroutine>5__2 = null; <supertask>5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown List<Task> list; switch (<>1__state) { default: return false; case 0: <>1__state = -1; <parallelCoroutine>5__2 = new ParallelCoroutine(); foreach (AddressReferencedAsset instance in instances) { if (!Object.op_Implicit(instance.BoxedAsset)) { <parallelCoroutine>5__2.Add(instance.LoadAssetAsyncCoroutine()); } } goto IL_0090; case 1: <>1__state = -1; goto IL_0090; case 2: { <>1__state = -1; break; } IL_0090: if (<parallelCoroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } list = new List<Task>(); foreach (AddressReferencedAsset instance2 in instances) { if (!Object.op_Implicit(instance2.BoxedAsset)) { list.Add(instance2.LoadAssetAsync()); } } <supertask>5__3 = Task.WhenAll(list); break; } if (!<supertask>5__3.IsCompleted) { <>2__current = null; <>1__state = 2; return true; } _initialized = true; AddressReferencedAsset.OnAddressReferencedAssetsLoaded?.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(); } } protected static readonly HashSet<string> addressesThatFailedToBeValidated = new HashSet<string>(); protected static readonly HashSet<AddressReferencedAsset> instances = new HashSet<AddressReferencedAsset>(); private static bool _initialized; public abstract Object BoxedAsset { get; } public static bool Initialized => _initialized; public AsyncOperationHandle AsyncOperationHandle { get; protected set; } [Obsolete("This event no longer runs after anything in particular, it gets invoked on RoR2Application.onLoad for backwards compatibility.")] public static event Action OnAddressReferencedAssetsLoaded; protected void SetHooks() { if (RoR2Application.loadFinished) { CallInitialized(); return; } RoR2Application.onLoad = (Action)Delegate.Remove(RoR2Application.onLoad, new Action(CallInitialized)); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(CallInitialized)); } protected void UnsetHooks() { if (!RoR2Application.loadFinished) { RoR2Application.onLoad = (Action)Delegate.Remove(RoR2Application.onLoad, new Action(CallInitialized)); } } private void CallInitialized() { if (!_initialized) { AddressablesPlugin.Logger.LogMessage((object)"AddressReferencedAssets initialized"); _initialized = true; AddressReferencedAsset.OnAddressReferencedAssetsLoaded?.Invoke(); } } private void StartCoroutineOnLoad() { ((MonoBehaviour)AddressablesPlugin.Instance).StartCoroutine(LoadReferencesAsync()); } [IteratorStateMachine(typeof(<LoadReferencesAsync>d__18))] private static IEnumerator LoadReferencesAsync() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadReferencesAsync>d__18(0); } [Obsolete("If you need to implement this, implement a method that just returns Task.CompeltedTask, loading is now done via LoadAssetAsyncCoroutine instead.")] protected abstract Task LoadAssetAsync(); protected abstract IEnumerator LoadAssetAsyncCoroutine(); public virtual void Dispose() { //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_0011: Unknown result type (might be due to invalid IL or missing references) AsyncOperationHandle asyncOperationHandle = AsyncOperationHandle; if (((AsyncOperationHandle)(ref asyncOperationHandle)).IsValid()) { Addressables.Release(AsyncOperationHandle); } } } [Serializable] public class AddressReferencedBuffDef : AddressReferencedAsset<BuffDef> { [CompilerGenerated] private sealed class <LoadAsyncCoroutine>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedBuffDef <>4__this; private IEnumerator <subroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAsyncCoroutine>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <subroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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_0034: Invalid comparison between Unknown and I4 //IL_0037: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; AddressReferencedBuffDef addressReferencedBuffDef = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if (addressReferencedBuffDef.CanLoadFromCatalog) { BuffIndex val = BuffCatalog.FindBuffIndex(addressReferencedBuffDef.Address); if ((int)val != -1) { addressReferencedBuffDef.Asset = BuffCatalog.GetBuffDef(val); return false; } } <subroutine>5__2 = addressReferencedBuffDef.LoadFromAddressAsyncCoroutine(); break; case 1: <>1__state = -1; break; } if (<subroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } 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(); } } [SerializeField] [HideInInspector] private bool _canLoadFromCatalog = true; public override bool CanLoadFromCatalog { get { return _canLoadFromCatalog; } protected set { _canLoadFromCatalog = value; } } [IteratorStateMachine(typeof(<LoadAsyncCoroutine>d__4))] protected override IEnumerator LoadAsyncCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAsyncCoroutine>d__4(0) { <>4__this = this }; } [Obsolete("Call LoadAsyncCoroutine instead")] protected override async Task LoadAsync() { if (CanLoadFromCatalog) { BuffIndex val = BuffCatalog.FindBuffIndex(base.Address); if ((int)val != -1) { base.Asset = BuffCatalog.GetBuffDef(val); return; } } await LoadFromAddressAsync(); } protected override void Load() { //IL_000e: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Invalid comparison between Unknown and I4 //IL_0019: Unknown result type (might be due to invalid IL or missing references) if (CanLoadFromCatalog) { BuffIndex val = BuffCatalog.FindBuffIndex(base.Address); if ((int)val != -1) { base.Asset = BuffCatalog.GetBuffDef(val); return; } } LoadFromAddress(); } public static implicit operator bool(AddressReferencedBuffDef addressReferencedAsset) { return Object.op_Implicit((Object)(object)addressReferencedAsset?.Asset); } public static implicit operator BuffDef(AddressReferencedBuffDef addressReferencedAsset) { return addressReferencedAsset?.Asset; } public static implicit operator AddressReferencedBuffDef(string address) { return new AddressReferencedBuffDef(address); } public static implicit operator AddressReferencedBuffDef(BuffDef asset) { return new AddressReferencedBuffDef(asset); } public AddressReferencedBuffDef() { } public AddressReferencedBuffDef(BuffDef def) : base(def) { } public AddressReferencedBuffDef(string addressOrName) : base(addressOrName) { } } [Serializable] public class AddressReferencedEliteDef : AddressReferencedAsset<EliteDef> { [CompilerGenerated] private sealed class <LoadAsyncCoroutine>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedEliteDef <>4__this; private IEnumerator <subroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAsyncCoroutine>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <subroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { int num = <>1__state; AddressReferencedEliteDef CS$<>8__locals0 = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if (CS$<>8__locals0.CanLoadFromCatalog) { EliteDef val = ((IEnumerable<EliteDef>)EliteCatalog.eliteDefs).FirstOrDefault((Func<EliteDef, bool>)((EliteDef x) => ((Object)x).name.Equals(CS$<>8__locals0.Address, StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val != (Object)null) { CS$<>8__locals0.Asset = val; return false; } } <subroutine>5__2 = CS$<>8__locals0.LoadFromAddressAsyncCoroutine(); break; case 1: <>1__state = -1; break; } if (<subroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } 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(); } } [SerializeField] [HideInInspector] private bool _canLoadFromCatalog = true; public override bool CanLoadFromCatalog { get { return _canLoadFromCatalog; } protected set { _canLoadFromCatalog = value; } } [IteratorStateMachine(typeof(<LoadAsyncCoroutine>d__4))] protected override IEnumerator LoadAsyncCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAsyncCoroutine>d__4(0) { <>4__this = this }; } [Obsolete("Call LoadAsyncCoroutine instead")] protected override async Task LoadAsync() { if (CanLoadFromCatalog) { EliteDef val = ((IEnumerable<EliteDef>)EliteCatalog.eliteDefs).FirstOrDefault((Func<EliteDef, bool>)((EliteDef x) => ((Object)x).name.Equals(base.Address, StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val != (Object)null) { base.Asset = val; return; } } await LoadFromAddressAsync(); } protected override void Load() { if (CanLoadFromCatalog) { EliteDef val = ((IEnumerable<EliteDef>)EliteCatalog.eliteDefs).FirstOrDefault((Func<EliteDef, bool>)((EliteDef x) => ((Object)x).name.Equals(base.Address, StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val != (Object)null) { base.Asset = val; return; } } LoadFromAddress(); } public static implicit operator bool(AddressReferencedEliteDef addressReferencedAsset) { return Object.op_Implicit((Object)(object)addressReferencedAsset?.Asset); } public static implicit operator EliteDef(AddressReferencedEliteDef addressReferencedAsset) { return addressReferencedAsset?.Asset; } public static implicit operator AddressReferencedEliteDef(string address) { return new AddressReferencedEliteDef(address); } public static implicit operator AddressReferencedEliteDef(EliteDef asset) { return new AddressReferencedEliteDef(asset); } public AddressReferencedEliteDef() { } public AddressReferencedEliteDef(EliteDef def) : base(def) { } public AddressReferencedEliteDef(string addressOrName) : base(addressOrName) { } } [Serializable] public class AddressReferencedEquipmentDef : AddressReferencedAsset<EquipmentDef> { [CompilerGenerated] private sealed class <LoadAsyncCoroutine>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedEquipmentDef <>4__this; private IEnumerator <subroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAsyncCoroutine>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <subroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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_0034: Invalid comparison between Unknown and I4 //IL_0037: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; AddressReferencedEquipmentDef addressReferencedEquipmentDef = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if (addressReferencedEquipmentDef.CanLoadFromCatalog) { EquipmentIndex val = EquipmentCatalog.FindEquipmentIndex(addressReferencedEquipmentDef.Address); if ((int)val != -1) { addressReferencedEquipmentDef.Asset = EquipmentCatalog.GetEquipmentDef(val); return false; } } <subroutine>5__2 = addressReferencedEquipmentDef.LoadFromAddressAsyncCoroutine(); break; case 1: <>1__state = -1; break; } if (<subroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } 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(); } } [SerializeField] [HideInInspector] private bool _canLoadFromCatalog = true; public override bool CanLoadFromCatalog { get { return _canLoadFromCatalog; } protected set { _canLoadFromCatalog = value; } } [IteratorStateMachine(typeof(<LoadAsyncCoroutine>d__4))] protected override IEnumerator LoadAsyncCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAsyncCoroutine>d__4(0) { <>4__this = this }; } [Obsolete("Call LoadAsyncCoroutine instead.")] protected override async Task LoadAsync() { if (CanLoadFromCatalog) { EquipmentIndex val = EquipmentCatalog.FindEquipmentIndex(base.Address); if ((int)val != -1) { base.Asset = EquipmentCatalog.GetEquipmentDef(val); return; } } await LoadFromAddressAsync(); } protected override void Load() { //IL_000e: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Invalid comparison between Unknown and I4 //IL_0019: Unknown result type (might be due to invalid IL or missing references) if (CanLoadFromCatalog) { EquipmentIndex val = EquipmentCatalog.FindEquipmentIndex(base.Address); if ((int)val != -1) { base.Asset = EquipmentCatalog.GetEquipmentDef(val); return; } } LoadFromAddress(); } public static implicit operator bool(AddressReferencedEquipmentDef addressReferencedAsset) { return Object.op_Implicit((Object)(object)addressReferencedAsset?.Asset); } public static implicit operator EquipmentDef(AddressReferencedEquipmentDef addressReferencedAsset) { return addressReferencedAsset?.Asset; } public static implicit operator AddressReferencedEquipmentDef(string address) { return new AddressReferencedEquipmentDef(address); } public static implicit operator AddressReferencedEquipmentDef(EquipmentDef asset) { return new AddressReferencedEquipmentDef(asset); } public AddressReferencedEquipmentDef() { } public AddressReferencedEquipmentDef(EquipmentDef def) : base(def) { } public AddressReferencedEquipmentDef(string addressOrName) : base(addressOrName) { } } [Serializable] public class AddressReferencedExpansionDef : AddressReferencedAsset<ExpansionDef> { [CompilerGenerated] private sealed class <LoadAsyncCoroutine>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedExpansionDef <>4__this; private IEnumerator <subroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAsyncCoroutine>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <subroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; AddressReferencedExpansionDef CS$<>8__locals0 = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if (CS$<>8__locals0.CanLoadFromCatalog) { ExpansionDef val = ((IEnumerable<ExpansionDef>)(object)ExpansionCatalog.expansionDefs).FirstOrDefault((Func<ExpansionDef, bool>)((ExpansionDef ed) => ((Object)ed).name.Equals(CS$<>8__locals0.Address, StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val != (Object)null) { CS$<>8__locals0.Asset = val; return false; } } <subroutine>5__2 = CS$<>8__locals0.LoadFromAddressAsyncCoroutine(); break; case 1: <>1__state = -1; break; } if (<subroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } 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(); } } [SerializeField] [HideInInspector] private bool _canLoadFromCatalog = true; public override bool CanLoadFromCatalog { get { return _canLoadFromCatalog; } protected set { _canLoadFromCatalog = value; } } [IteratorStateMachine(typeof(<LoadAsyncCoroutine>d__4))] protected override IEnumerator LoadAsyncCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAsyncCoroutine>d__4(0) { <>4__this = this }; } [Obsolete("Call LoadAsyncCoroutine instead")] protected override async Task LoadAsync() { if (CanLoadFromCatalog) { ExpansionDef val = ((IEnumerable<ExpansionDef>)(object)ExpansionCatalog.expansionDefs).FirstOrDefault((Func<ExpansionDef, bool>)((ExpansionDef ed) => ((Object)ed).name.Equals(base.Address, StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val != (Object)null) { base.Asset = val; return; } } await LoadFromAddressAsync(); } protected override void Load() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (CanLoadFromCatalog) { ExpansionDef val = ((IEnumerable<ExpansionDef>)(object)ExpansionCatalog.expansionDefs).FirstOrDefault((Func<ExpansionDef, bool>)((ExpansionDef ed) => ((Object)ed).name.Equals(base.Address, StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val != (Object)null) { base.Asset = val; return; } } LoadFromAddress(); } public static implicit operator bool(AddressReferencedExpansionDef addressReferencedAsset) { return Object.op_Implicit((Object)(object)addressReferencedAsset?.Asset); } public static implicit operator ExpansionDef(AddressReferencedExpansionDef addressReferencedAsset) { return addressReferencedAsset?.Asset; } public static implicit operator AddressReferencedExpansionDef(string address) { return new AddressReferencedExpansionDef(address); } public static implicit operator AddressReferencedExpansionDef(ExpansionDef asset) { return new AddressReferencedExpansionDef(asset); } public AddressReferencedExpansionDef() { } public AddressReferencedExpansionDef(ExpansionDef def) : base(def) { } public AddressReferencedExpansionDef(string addressOrName) : base(addressOrName) { } } [Serializable] public class AddressReferencedItemDef : AddressReferencedAsset<ItemDef> { [CompilerGenerated] private sealed class <LoadAsyncCoroutine>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedItemDef <>4__this; private IEnumerator <subroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAsyncCoroutine>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <subroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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_0034: Invalid comparison between Unknown and I4 //IL_0037: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; AddressReferencedItemDef addressReferencedItemDef = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if (addressReferencedItemDef.CanLoadFromCatalog) { ItemIndex val = ItemCatalog.FindItemIndex(addressReferencedItemDef.Address); if ((int)val != -1) { addressReferencedItemDef.Asset = ItemCatalog.GetItemDef(val); return false; } } <subroutine>5__2 = addressReferencedItemDef.LoadFromAddressAsyncCoroutine(); break; case 1: <>1__state = -1; break; } if (<subroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } 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(); } } [SerializeField] [HideInInspector] private bool _canLoadFromCatalog = true; public override bool CanLoadFromCatalog { get { return _canLoadFromCatalog; } protected set { _canLoadFromCatalog = value; } } [IteratorStateMachine(typeof(<LoadAsyncCoroutine>d__4))] protected override IEnumerator LoadAsyncCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAsyncCoroutine>d__4(0) { <>4__this = this }; } [Obsolete("Call LoadAsyncCoroutine instead")] protected override async Task LoadAsync() { if (CanLoadFromCatalog) { ItemIndex val = ItemCatalog.FindItemIndex(base.Address); if ((int)val != -1) { base.Asset = ItemCatalog.GetItemDef(val); return; } } await LoadFromAddressAsync(); } protected override void Load() { //IL_000e: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Invalid comparison between Unknown and I4 //IL_0019: Unknown result type (might be due to invalid IL or missing references) if (CanLoadFromCatalog) { ItemIndex val = ItemCatalog.FindItemIndex(base.Address); if ((int)val != -1) { base.Asset = ItemCatalog.GetItemDef(val); return; } } LoadFromAddress(); } public static implicit operator bool(AddressReferencedItemDef addressReferencedAsset) { return Object.op_Implicit((Object)(object)addressReferencedAsset?.Asset); } public static implicit operator ItemDef(AddressReferencedItemDef addressReferencedAsset) { return addressReferencedAsset?.Asset; } public static implicit operator AddressReferencedItemDef(string address) { return new AddressReferencedItemDef(address); } public static implicit operator AddressReferencedItemDef(ItemDef asset) { return new AddressReferencedItemDef(asset); } public AddressReferencedItemDef() { } public AddressReferencedItemDef(ItemDef def) : base(def) { } public AddressReferencedItemDef(string addressOrName) : base(addressOrName) { } } [Serializable] public class AddressReferencedPrefab : AddressReferencedAsset<GameObject> { public static implicit operator bool(AddressReferencedPrefab addressReferencedAsset) { return Object.op_Implicit((Object)(object)addressReferencedAsset?.Asset); } public static implicit operator GameObject(AddressReferencedPrefab addressReferencedAsset) { return addressReferencedAsset?.Asset; } public static implicit operator AddressReferencedPrefab(string address) { return new AddressReferencedPrefab(address); } public static implicit operator AddressReferencedPrefab(GameObject asset) { return new AddressReferencedPrefab(asset); } public AddressReferencedPrefab() { } public AddressReferencedPrefab(GameObject gameObject) : base(gameObject) { } public AddressReferencedPrefab(string address) : base(address) { } } [Serializable] public class AddressReferencedSpawnCard : AddressReferencedAsset<SpawnCard> { public static implicit operator bool(AddressReferencedSpawnCard addressReferencedAsset) { return Object.op_Implicit((Object)(object)addressReferencedAsset?.Asset); } public static implicit operator SpawnCard(AddressReferencedSpawnCard addressReferencedAsset) { return addressReferencedAsset?.Asset; } public static implicit operator AddressReferencedSpawnCard(string address) { return new AddressReferencedSpawnCard(address); } public static implicit operator AddressReferencedSpawnCard(SpawnCard asset) { return new AddressReferencedSpawnCard(asset); } public AddressReferencedSpawnCard() { } public AddressReferencedSpawnCard(SpawnCard spawnCard) : base(spawnCard) { } public AddressReferencedSpawnCard(string address) : base(address) { } } [Serializable] public class AddressReferencedUnlockableDef : AddressReferencedAsset<UnlockableDef> { [CompilerGenerated] private sealed class <LoadAsyncCoroutine>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public AddressReferencedUnlockableDef <>4__this; private IEnumerator <subroutine>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadAsyncCoroutine>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <subroutine>5__2 = null; <>1__state = -2; } private bool MoveNext() { int num = <>1__state; AddressReferencedUnlockableDef addressReferencedUnlockableDef = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if (addressReferencedUnlockableDef.CanLoadFromCatalog) { UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(addressReferencedUnlockableDef.Address); if (Object.op_Implicit((Object)(object)unlockableDef)) { addressReferencedUnlockableDef.Asset = unlockableDef; return false; } } <subroutine>5__2 = addressReferencedUnlockableDef.LoadFromAddressAsyncCoroutine(); break; case 1: <>1__state = -1; break; } if (<subroutine>5__2.MoveNext()) { <>2__current = null; <>1__state = 1; return true; } 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(); } } [SerializeField] [HideInInspector] private bool _canLoadFromCatalog = true; public override bool CanLoadFromCatalog { get { return _canLoadFromCatalog; } protected set { _canLoadFromCatalog = value; } } [IteratorStateMachine(typeof(<LoadAsyncCoroutine>d__4))] protected override IEnumerator LoadAsyncCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadAsyncCoroutine>d__4(0) { <>4__this = this }; } [Obsolete("Call LoadAsyncCoroutine instead")] protected override async Task LoadAsync() { if (CanLoadFromCatalog) { UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(base.Address); if (Object.op_Implicit((Object)(object)unlockableDef)) { base.Asset = unlockableDef; return; } } await LoadFromAddressAsync(); } protected override void Load() { if (CanLoadFromCatalog) { UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(base.Address); if (Object.op_Implicit((Object)(object)unlockableDef)) { base.Asset = unlockableDef; return; } } LoadFromAddress(); } public static implicit operator bool(AddressReferencedUnlockableDef addressReferencedAsset) { return Object.op_Implicit((Object)(object)addressReferencedAsset?.Asset); } public static implicit operator UnlockableDef(AddressReferencedUnlockableDef addressReferencedAsset) { return addressReferencedAsset?.Asset; } public static implicit operator AddressReferencedUnlockableDef(string address) { return new AddressReferencedUnlockableDef(address); } public static implicit operator AddressReferencedUnlockableDef(UnlockableDef asset) { return new AddressReferencedUnlockableDef(asset); } public AddressReferencedUnlockableDef() { } public AddressReferencedUnlockableDef(UnlockableDef def) : base(def) { } public AddressReferencedUnlockableDef(string addressOrName) : base(addressOrName) { } } public class NoCatalogLoadAttribute : Attribute { } }