Decompiled source of IVYL v2.0.0
Ivyl.dll
Decompiled 10 months 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.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using EntityStates; using HG; using HG.Coroutines; using HG.GeneralSerializer; using HG.Reflection; using IL.RoR2; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using R2API; using R2API.ScriptableObjects; using RoR2; using RoR2.Achievements; using RoR2.ContentManagement; using RoR2.EntitlementManagement; using RoR2.ExpansionManagement; using RoR2.Items; using RoR2.Projectile; using RoR2.Skills; using RoR2BepInExPack.VanillaFixes; using ThreeEyedGames; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; using UnityEngine.Rendering; 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.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("Ivyl")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Ivyl")] [assembly: AssemblyTitle("Ivyl")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] 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; } } internal static class IsExternalInit { } } namespace IvyLibrary { public struct ArtifactCode { public (ArtifactCompound, ArtifactCompound, ArtifactCompound) topRow; public (ArtifactCompound, ArtifactCompound, ArtifactCompound) middleRow; public (ArtifactCompound, ArtifactCompound, ArtifactCompound) bottomRow; public ArtifactCode(ArtifactCompound topLeft, ArtifactCompound topCenter, ArtifactCompound topRight, ArtifactCompound middleLeft, ArtifactCompound middleCenter, ArtifactCompound middleRight, ArtifactCompound bottomLeft, ArtifactCompound bottomCenter, ArtifactCompound bottomRight) { topRow = (topLeft, topCenter, topRight); middleRow = (middleLeft, middleCenter, middleRight); bottomRow = (bottomLeft, bottomCenter, bottomRight); } public ArtifactCode((ArtifactCompound, ArtifactCompound, ArtifactCompound) topRow, (ArtifactCompound, ArtifactCompound, ArtifactCompound) middleRow, (ArtifactCompound, ArtifactCompound, ArtifactCompound) bottomRow) { this.topRow = topRow; this.middleRow = middleRow; this.bottomRow = bottomRow; } public Sha256Hash CreateCodeHash() { //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) using SHA256 sHA = SHA256.Create(); byte[] buffer = new byte[9] { (byte)topRow.Item3, (byte)middleRow.Item3, (byte)bottomRow.Item3, (byte)topRow.Item2, (byte)bottomRow.Item2, (byte)middleRow.Item2, (byte)topRow.Item1, (byte)middleRow.Item1, (byte)bottomRow.Item1 }; return Sha256Hash.FromBytes(sHA.ComputeHash(buffer), 0); } } public enum ArtifactCompound { Circle = 1, Triangle = 3, Diamond = 5, Square = 7, Empty = 11 } public class AssetBundleRequest<T> : IEnumerator where T : Object { private AssetBundleRequest _internalRequest; private T _asset; private T[] _allAssets; public T asset => _asset ?? (_asset = (T)(object)_internalRequest.asset); public T[] allAssets => _allAssets ?? (_allAssets = Array.ConvertAll(_internalRequest.allAssets, (Object x) => (T)(object)x)); public bool isDone => ((AsyncOperation)_internalRequest).isDone; public float progress => ((AsyncOperation)_internalRequest).progress; public int priority { get { return ((AsyncOperation)_internalRequest).priority; } set { ((AsyncOperation)_internalRequest).priority = value; } } public bool allowSceneActivation { get { return ((AsyncOperation)_internalRequest).allowSceneActivation; } set { ((AsyncOperation)_internalRequest).allowSceneActivation = value; } } object IEnumerator.Current => asset; public event Action<AssetBundleRequest<T>> completed { add { ((AsyncOperation)_internalRequest).completed += delegate { value(this); }; } remove { ((AsyncOperation)_internalRequest).completed -= delegate { value(this); }; } } public event Action<AssetBundleRequest> completedTypeless { add { ((AsyncOperation)_internalRequest).completed += delegate { value(_internalRequest); }; } remove { ((AsyncOperation)_internalRequest).completed -= delegate { value(_internalRequest); }; } } public AssetBundleRequest(AssetBundleRequest request) { _internalRequest = request; } public static implicit operator AssetBundleRequest(AssetBundleRequest<T> obj) { return obj._internalRequest; } public override bool Equals(object obj) { AssetBundleRequest val = (AssetBundleRequest)((obj is AssetBundleRequest) ? obj : null); if (val == null || _internalRequest != val) { if (obj is AssetBundleRequest<T> assetBundleRequest) { return _internalRequest == assetBundleRequest._internalRequest; } return false; } return true; } public override int GetHashCode() { return ((object)_internalRequest).GetHashCode(); } bool IEnumerator.MoveNext() { return !((AsyncOperation)_internalRequest).isDone; } void IEnumerator.Reset() { } } public abstract class BaseContentPlugin : BaseUnityPlugin, IContentPackProvider { public delegate IEnumerator LoadStaticContentAsyncDelegate(LoadStaticContentAsyncArgs args); public delegate IEnumerator GenerateContentPackAsyncDelegate(GetContentPackAsyncArgs args); public delegate IEnumerator FinalizeAsyncDelegate(FinalizeAsyncArgs args); public ContentPack Content { get; } string IContentPackProvider.identifier => ((BaseUnityPlugin)this).Info.Metadata.GUID; public event LoadStaticContentAsyncDelegate loadStaticContentAsync; public event GenerateContentPackAsyncDelegate generateContentPackAsync; public event FinalizeAsyncDelegate finalizeAsync; public BaseContentPlugin() { //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) //IL_001d: Expected O, but got Unknown //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown Content = new ContentPack { identifier = ((IContentPackProvider)this).identifier }; ContentManager.collectContentPackProviders += (CollectContentPackProvidersDelegate)delegate(AddContentPackProviderDelegate add) { add.Invoke((IContentPackProvider)(object)this); }; } [MethodImpl(MethodImplOptions.AggressiveInlining)] protected virtual IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { if (this.loadStaticContentAsync == null) { yield break; } ParallelProgressCoroutine parallelProgressCoroutine = new ParallelProgressCoroutine(args.progressReceiver); Delegate[] invocationList = this.loadStaticContentAsync.GetInvocationList(); for (int i = 0; i < invocationList.Length; i++) { LoadStaticContentAsyncDelegate loadStaticContentAsyncDelegate = (LoadStaticContentAsyncDelegate)invocationList[i]; if (loadStaticContentAsyncDelegate != null) { ReadableProgress<float> val = new ReadableProgress<float>(); parallelProgressCoroutine.Add(loadStaticContentAsyncDelegate(new LoadStaticContentAsyncArgs((IProgress<float>)val, args.peerLoadInfos)), val); } } while (parallelProgressCoroutine.MoveNext()) { yield return parallelProgressCoroutine.Current; } this.loadStaticContentAsync = null; } [MethodImpl(MethodImplOptions.AggressiveInlining)] protected virtual IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { if (this.generateContentPackAsync != null) { ParallelProgressCoroutine parallelProgressCoroutine = new ParallelProgressCoroutine(args.progressReceiver); Delegate[] invocationList = this.generateContentPackAsync.GetInvocationList(); for (int i = 0; i < invocationList.Length; i++) { GenerateContentPackAsyncDelegate generateContentPackAsyncDelegate = (GenerateContentPackAsyncDelegate)invocationList[i]; if (generateContentPackAsyncDelegate != null) { ReadableProgress<float> val = new ReadableProgress<float>(); parallelProgressCoroutine.Add(generateContentPackAsyncDelegate(new GetContentPackAsyncArgs((IProgress<float>)val, args.output, args.peerLoadInfos, args.retriesRemaining)), val); } } while (parallelProgressCoroutine.MoveNext()) { yield return parallelProgressCoroutine.Current; } } ContentPack.Copy(Content, args.output); } [MethodImpl(MethodImplOptions.AggressiveInlining)] protected virtual IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { this.generateContentPackAsync = null; if (this.finalizeAsync != null) { ParallelProgressCoroutine parallelProgressCoroutine = new ParallelProgressCoroutine(args.progressReceiver); Delegate[] invocationList = this.finalizeAsync.GetInvocationList(); for (int i = 0; i < invocationList.Length; i++) { FinalizeAsyncDelegate finalizeAsyncDelegate = (FinalizeAsyncDelegate)invocationList[i]; if (finalizeAsyncDelegate != null) { ReadableProgress<float> val = new ReadableProgress<float>(); parallelProgressCoroutine.Add(finalizeAsyncDelegate(new FinalizeAsyncArgs((IProgress<float>)val, args.peerLoadInfos, args.finalContentPack)), val); } } while (parallelProgressCoroutine.MoveNext()) { yield return parallelProgressCoroutine.Current; } this.finalizeAsync = null; } Content.PopulateNetworkedObjectAssetIds(); } IEnumerator IContentPackProvider.LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { return LoadStaticContentAsync(args); } IEnumerator IContentPackProvider.GenerateContentPackAsync(GetContentPackAsyncArgs args) { return GenerateContentPackAsync(args); } IEnumerator IContentPackProvider.FinalizeAsync(FinalizeAsyncArgs args) { return FinalizeAsync(args); } } [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public abstract class BaseModuleAttribute : SearchableAttribute { internal static BaseModuleAttribute earlyAssignmentMetadata; public static GameObject InitializeModules<TModuleAttribute>(params object[] args) where TModuleAttribute : BaseModuleAttribute { return InitializeModules(typeof(TModuleAttribute), args); } public static void InitializeModules<TModuleAttribute>(GameObject managerObject, params object[] args) where TModuleAttribute : BaseModuleAttribute { InitializeModules(typeof(TModuleAttribute), managerObject, args); } public static GameObject InitializeModules(Type attributeType, params object[] args) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown GameObject val = new GameObject(attributeType.Name + "_Manager"); Object.DontDestroyOnLoad((Object)(object)val); Transform transform = val.transform; GameObject managerObject = Chainloader.ManagerObject; transform.SetParent((managerObject != null) ? managerObject.transform : null); InitializeModules(attributeType, val, args); return val; } public static void InitializeModules(Type attributeType, GameObject managerObject, params object[] args) { if ((Object)(object)managerObject == (Object)null) { throw new ArgumentNullException("managerObject"); } if (!attributeType.IsSubclassOf(typeof(BaseModuleAttribute))) { throw new ArgumentException("attributeType"); } if (!SearchableAttribute.instancesListsByType.TryGetValue(attributeType, out var value) || value.Count <= 0) { Debug.LogWarning((object)("BaseModuleAttribute: Attempted to InitializeModules of type " + attributeType.Name + " but no instances were found.")); return; } HashSet<object> hashSet = new HashSet<object>(); foreach (BaseModuleAttribute item in value) { if (!(((SearchableAttribute)item).target is Type type) || !type.IsSubclassOf(typeof(Behaviour))) { Debug.LogWarning((object)string.Format("{0}: Module of type {1} has an invalid target ({2}). Target must be a class inheriting from {3}.", "BaseModuleAttribute", attributeType.Name, ((SearchableAttribute)item).target ?? "null", "Behaviour")); } else if (hashSet.Add(((SearchableAttribute)item).target) && item.Initialize(args, value)) { earlyAssignmentMetadata = item; managerObject.RequireComponent(type); earlyAssignmentMetadata = null; } } } protected abstract bool Initialize(object[] args, List<SearchableAttribute> peers); } public abstract class BaseAssetAssociatedBehavior<TAssociationAttribute, TNetworkContext> : MonoBehaviour where TAssociationAttribute : SearchableAttribute where TNetworkContext : struct { protected static TNetworkContext server; protected static TNetworkContext client; protected static TNetworkContext shared; protected static void CommenceAttributeSearch<TAsset>(Type behaviourType, Action<TAssociationAttribute, MethodInfo, TAsset> onAssetFound) { List<TAssociationAttribute> list = new List<TAssociationAttribute>(); SearchableAttribute.GetInstances<TAssociationAttribute>(list); foreach (TAssociationAttribute item in list) { if (!(((SearchableAttribute)item).target is MethodInfo methodInfo)) { Debug.LogError((object)("TAssociationAttribute cannot be applied to object of type '" + ((SearchableAttribute)item).target?.GetType().Name + "'")); continue; } string text = "TAssociationAttribute cannot be applied to method " + methodInfo.DeclaringType.FullName + "." + methodInfo.Name + ": "; if (!methodInfo.IsStatic) { Debug.LogError((object)(text + "Method is not static.")); } else if (!behaviourType.IsAssignableFrom(methodInfo.DeclaringType)) { Debug.LogError((object)(text + methodInfo.DeclaringType.FullName + " does not derive from " + behaviourType.FullName + ".")); } else if (methodInfo.DeclaringType.IsAbstract) { Debug.LogError((object)(text + methodInfo.DeclaringType.FullName + " is an abstract type")); } else if (!typeof(TAsset).IsAssignableFrom(methodInfo.ReturnType)) { Debug.LogError((object)(text + methodInfo.DeclaringType.FullName + "." + methodInfo.Name + " returns type '" + (methodInfo.ReturnType?.FullName ?? "void") + "' instead of " + typeof(TAsset).FullName + ".")); } else if (methodInfo.GetGenericArguments().Length != 0) { Debug.LogError((object)(text + methodInfo.DeclaringType.FullName + "." + methodInfo.Name + " must take no arguments.")); } else { TAsset val = (TAsset)methodInfo.Invoke(null, Array.Empty<object>()); if (val == null) { Debug.LogError((object)(methodInfo.DeclaringType.FullName + "." + methodInfo.Name + " returned null.")); } else { onAssetFound(item, methodInfo, val); } } } } protected static ref TNetworkContext GetCurrentNetworkContext() { if (NetworkServer.active) { if (NetworkClient.active) { return ref shared; } return ref server; } if (NetworkClient.active) { return ref client; } throw new InvalidOperationException("Neither server nor client is running."); } } public abstract class BaseBuffBodyBehavior : BaseAssetAssociatedBehavior<BaseBuffBodyBehavior.BuffDefAssociationAttribute, BaseBuffBodyBehavior.NetworkContext> { public struct BuffTypePair { public BuffIndex buffIndex; public Type behaviorType; public int index; } public struct NetworkContext { public Lookup<BuffIndex, BuffTypePair> buffTypePairsLookup; public FixedSizeArrayPool<BaseBuffBodyBehavior> behaviorArraysPool; public void SetBuffTypePairs(List<BuffTypePair> buffTypePairs) { buffTypePairsLookup = (Lookup<BuffIndex, BuffTypePair>)buffTypePairs.ToLookup((BuffTypePair x) => x.buffIndex); behaviorArraysPool = new FixedSizeArrayPool<BaseBuffBodyBehavior>(buffTypePairs.Count); } } [MeansImplicitUse] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class BuffDefAssociationAttribute : SearchableAttribute { public bool useOnServer = true; public bool useOnClient = true; } private static CharacterBody earlyAssignmentBody; private static Dictionary<UnityObjectWrapperKey<CharacterBody>, BaseBuffBodyBehavior[]> bodyToBuffBehaviors; public int stack; public CharacterBody body { get; private set; } protected void Awake() { body = earlyAssignmentBody; earlyAssignmentBody = null; } [SystemInitializer(new Type[] { typeof(BuffCatalog) })] private static void Init() { //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown List<BuffTypePair> server = new List<BuffTypePair>(); List<BuffTypePair> client = new List<BuffTypePair>(); List<BuffTypePair> shared = new List<BuffTypePair>(); BaseAssetAssociatedBehavior<BuffDefAssociationAttribute, NetworkContext>.CommenceAttributeSearch<BuffDef>(typeof(BaseBuffBodyBehavior), RegisterBehaviour); if (shared.Count > 0) { BaseAssetAssociatedBehavior<BuffDefAssociationAttribute, NetworkContext>.server.SetBuffTypePairs(server); BaseAssetAssociatedBehavior<BuffDefAssociationAttribute, NetworkContext>.client.SetBuffTypePairs(client); BaseAssetAssociatedBehavior<BuffDefAssociationAttribute, NetworkContext>.shared.SetBuffTypePairs(shared); bodyToBuffBehaviors = new Dictionary<UnityObjectWrapperKey<CharacterBody>, BaseBuffBodyBehavior[]>(); CharacterBody.onBodyAwakeGlobal += OnBodyAwakeGlobal; CharacterBody.onBodyDestroyGlobal += OnBodyDestroyGlobal; CharacterBody.SetBuffCount += new hook_SetBuffCount(CharacterBody_SetBuffCount); } void RegisterBehaviour(BuffDefAssociationAttribute attribute, MethodInfo methodInfo, BuffDef asset) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) if ((int)asset.buffIndex < 0) { Debug.LogError((object)$"{methodInfo.DeclaringType.FullName}.{methodInfo.Name} returned a BuffDef that's not registered in the BuffCatalog. result={asset}"); } else { BuffTypePair buffTypePair = default(BuffTypePair); buffTypePair.buffIndex = asset.buffIndex; buffTypePair.behaviorType = methodInfo.DeclaringType; BuffTypePair buffTypePair2 = buffTypePair; if (attribute.useOnServer) { List<BuffTypePair> list = server; buffTypePair = buffTypePair2; buffTypePair.index = server.Count; list.Add(buffTypePair); } if (attribute.useOnClient) { List<BuffTypePair> list2 = client; buffTypePair = buffTypePair2; buffTypePair.index = client.Count; list2.Add(buffTypePair); } if (attribute.useOnServer || attribute.useOnClient) { List<BuffTypePair> list3 = shared; buffTypePair = buffTypePair2; buffTypePair.index = shared.Count; list3.Add(buffTypePair); } } } } private static void OnBodyAwakeGlobal(CharacterBody body) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) BaseBuffBodyBehavior[] value = BaseAssetAssociatedBehavior<BuffDefAssociationAttribute, NetworkContext>.GetCurrentNetworkContext().behaviorArraysPool.Request(); bodyToBuffBehaviors.Add(UnityObjectWrapperKey<CharacterBody>.op_Implicit(body), value); } private static void OnBodyDestroyGlobal(CharacterBody body) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) BaseBuffBodyBehavior[] array = bodyToBuffBehaviors[UnityObjectWrapperKey<CharacterBody>.op_Implicit(body)]; for (int i = 0; i < array.Length; i++) { Object.Destroy((Object)(object)array[i]); } bodyToBuffBehaviors.Remove(UnityObjectWrapperKey<CharacterBody>.op_Implicit(body)); if (NetworkServer.active || NetworkClient.active) { BaseAssetAssociatedBehavior<BuffDefAssociationAttribute, NetworkContext>.GetCurrentNetworkContext().behaviorArraysPool.Return(array); } } private static void CharacterBody_SetBuffCount(orig_SetBuffCount orig, CharacterBody self, BuffIndex buffType, int newCount) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) Lookup<BuffIndex, BuffTypePair> buffTypePairsLookup = BaseAssetAssociatedBehavior<BuffDefAssociationAttribute, NetworkContext>.GetCurrentNetworkContext().buffTypePairsLookup; if (!buffTypePairsLookup.Contains(buffType)) { orig.Invoke(self, buffType, newCount); return; } int buffCount = self.GetBuffCount(buffType); orig.Invoke(self, buffType, newCount); if (buffCount == (buffCount = self.GetBuffCount(buffType))) { return; } BaseBuffBodyBehavior[] array = bodyToBuffBehaviors[UnityObjectWrapperKey<CharacterBody>.op_Implicit(self)]; foreach (BuffTypePair item in buffTypePairsLookup[buffType]) { SetBuffStack(self, ref array[item.index], item.behaviorType, buffCount); } } private static void SetBuffStack(CharacterBody body, ref BaseBuffBodyBehavior behavior, Type behaviorType, int stack) { if ((Object)(object)behavior == (Object)null != stack <= 0) { if (stack <= 0) { behavior.stack = 0; Object.Destroy((Object)(object)behavior); behavior = null; } else { earlyAssignmentBody = body; behavior = (BaseBuffBodyBehavior)(object)((Component)body).gameObject.AddComponent(behaviorType); earlyAssignmentBody = null; } } if ((Object)(object)behavior != (Object)null) { behavior.stack = stack; } } } public abstract class BaseEquipmentBodyBehavior : BaseAssetAssociatedBehavior<BaseEquipmentBodyBehavior.EquipmentDefDefAssociationAttribute, BaseEquipmentBodyBehavior.NetworkContext> { public struct EquipmentTypePair { public EquipmentIndex equipmentIndex; public Type behaviorType; } public struct EquipmentBehaviorsState { public BaseEquipmentBodyBehavior[] activeBehaviorsArray; public EquipmentIndex currentEquipmentIndex; } public struct NetworkContext { public Dictionary<EquipmentIndex, EquipmentTypePair[]> equipmentTypePairsDict; public void SetEquipmentTypePairs(List<EquipmentTypePair> equipmentTypePairs) { equipmentTypePairsDict = (from x in equipmentTypePairs group x by x.equipmentIndex).ToDictionary((IGrouping<EquipmentIndex, EquipmentTypePair> x) => x.Key, (IGrouping<EquipmentIndex, EquipmentTypePair> x) => x.ToArray()); } } [MeansImplicitUse] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class EquipmentDefDefAssociationAttribute : SearchableAttribute { public bool useOnServer = true; public bool useOnClient = true; } private static CharacterBody earlyAssignmentBody; private static Dictionary<UnityObjectWrapperKey<CharacterBody>, EquipmentBehaviorsState> bodyToEquipmentBehaviors; public EquipmentState state; public CharacterBody body { get; private set; } protected void Awake() { body = earlyAssignmentBody; earlyAssignmentBody = null; } [SystemInitializer(new Type[] { typeof(EquipmentCatalog) })] private static void Init() { List<EquipmentTypePair> server = new List<EquipmentTypePair>(); List<EquipmentTypePair> client = new List<EquipmentTypePair>(); List<EquipmentTypePair> shared = new List<EquipmentTypePair>(); BaseAssetAssociatedBehavior<EquipmentDefDefAssociationAttribute, NetworkContext>.CommenceAttributeSearch<EquipmentDef>(typeof(BaseEquipmentBodyBehavior), RegisterBehaviour); if (shared.Count > 0) { BaseAssetAssociatedBehavior<EquipmentDefDefAssociationAttribute, NetworkContext>.server.SetEquipmentTypePairs(server); BaseAssetAssociatedBehavior<EquipmentDefDefAssociationAttribute, NetworkContext>.client.SetEquipmentTypePairs(client); BaseAssetAssociatedBehavior<EquipmentDefDefAssociationAttribute, NetworkContext>.shared.SetEquipmentTypePairs(shared); bodyToEquipmentBehaviors = new Dictionary<UnityObjectWrapperKey<CharacterBody>, EquipmentBehaviorsState>(); CharacterBody.onBodyDestroyGlobal += CharacterBody_onBodyDestroyGlobal; CharacterBody.onBodyInventoryChangedGlobal += CharacterBody_onBodyInventoryChangedGlobal; } void RegisterBehaviour(EquipmentDefDefAssociationAttribute attribute, MethodInfo methodInfo, EquipmentDef asset) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) if ((int)asset.equipmentIndex < 0) { Debug.LogError((object)$"{methodInfo.DeclaringType.FullName}.{methodInfo.Name} returned an EquipmentDef that's not registered in the EquipmentCatalog. result={asset}"); } else { EquipmentTypePair equipmentTypePair = default(EquipmentTypePair); equipmentTypePair.equipmentIndex = asset.equipmentIndex; equipmentTypePair.behaviorType = methodInfo.DeclaringType; EquipmentTypePair item = equipmentTypePair; if (attribute.useOnServer) { server.Add(item); } if (attribute.useOnClient) { client.Add(item); } if (attribute.useOnServer || attribute.useOnClient) { shared.Add(item); } } } } private static void CharacterBody_onBodyDestroyGlobal(CharacterBody body) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) if (bodyToEquipmentBehaviors.TryGetValue(UnityObjectWrapperKey<CharacterBody>.op_Implicit(body), out var value)) { for (int i = 0; i < value.activeBehaviorsArray.Length; i++) { Object.Destroy((Object)(object)value.activeBehaviorsArray[i]); } bodyToEquipmentBehaviors.Remove(UnityObjectWrapperKey<CharacterBody>.op_Implicit(body)); } } private static void CharacterBody_onBodyInventoryChangedGlobal(CharacterBody body) { UpdateBodyEquipmentBehavior(body); } private static void UpdateBodyEquipmentBehavior(CharacterBody body) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: 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) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) Inventory inventory = body.inventory; if (bodyToEquipmentBehaviors.TryGetValue(UnityObjectWrapperKey<CharacterBody>.op_Implicit(body), out var value)) { if (value.currentEquipmentIndex != inventory.currentEquipmentIndex) { if (value.activeBehaviorsArray != null) { for (int i = 0; i < value.activeBehaviorsArray.Length; i++) { value.activeBehaviorsArray[i].state = EquipmentState.empty; Object.Destroy((Object)(object)value.activeBehaviorsArray[i]); } } if (BaseAssetAssociatedBehavior<EquipmentDefDefAssociationAttribute, NetworkContext>.GetCurrentNetworkContext().equipmentTypePairsDict.TryGetValue(inventory.currentEquipmentIndex, out var value2)) { SetActiveBehaviors(body, ref value.activeBehaviorsArray, value2); } else { value.activeBehaviorsArray = null; } } } else { if (!Object.op_Implicit((Object)(object)inventory) || !BaseAssetAssociatedBehavior<EquipmentDefDefAssociationAttribute, NetworkContext>.GetCurrentNetworkContext().equipmentTypePairsDict.TryGetValue(inventory.currentEquipmentIndex, out var value3)) { return; } SetActiveBehaviors(body, ref value.activeBehaviorsArray, value3); } value.currentEquipmentIndex = inventory.currentEquipmentIndex; bodyToEquipmentBehaviors[UnityObjectWrapperKey<CharacterBody>.op_Implicit(body)] = value; if (value.activeBehaviorsArray != null) { for (int j = 0; j < value.activeBehaviorsArray.Length; j++) { value.activeBehaviorsArray[j].state = inventory.currentEquipmentState; } } } private static void SetActiveBehaviors(CharacterBody body, ref BaseEquipmentBodyBehavior[] activeBehaviorsArray, EquipmentTypePair[] equipmentTypePairs) { if (activeBehaviorsArray == null || activeBehaviorsArray.Length != equipmentTypePairs.Length) { activeBehaviorsArray = new BaseEquipmentBodyBehavior[equipmentTypePairs.Length]; } for (int i = 0; i < equipmentTypePairs.Length; i++) { earlyAssignmentBody = body; activeBehaviorsArray[i] = (BaseEquipmentBodyBehavior)(object)((Component)body).gameObject.AddComponent(equipmentTypePairs[i].behaviorType); earlyAssignmentBody = null; } } } public abstract class BaseItemMasterBehavior : BaseAssetAssociatedBehavior<BaseItemMasterBehavior.ItemDefAssociationAttribute, BaseItemMasterBehavior.NetworkContext> { public struct NetworkContext { public ItemTypePair[] itemTypePairs; public FixedSizeArrayPool<BaseItemMasterBehavior> behaviorArraysPool; public void SetItemTypePairs(List<ItemTypePair> itemTypePairs) { this.itemTypePairs = itemTypePairs.ToArray(); behaviorArraysPool = new FixedSizeArrayPool<BaseItemMasterBehavior>(this.itemTypePairs.Length); } } [MeansImplicitUse] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class ItemDefAssociationAttribute : SearchableAttribute { public bool useOnServer = true; public bool useOnClient = true; } private static CharacterMaster earlyAssignmentMaster; private static Dictionary<UnityObjectWrapperKey<CharacterMaster>, BaseItemMasterBehavior[]> masterToItemBehaviors; public int stack; public CharacterMaster master { get; private set; } protected void Awake() { master = earlyAssignmentMaster; earlyAssignmentMaster = null; } [SystemInitializer(new Type[] { typeof(ItemCatalog) })] private static void Init() { //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown List<ItemTypePair> server = new List<ItemTypePair>(); List<ItemTypePair> client = new List<ItemTypePair>(); List<ItemTypePair> shared = new List<ItemTypePair>(); BaseAssetAssociatedBehavior<ItemDefAssociationAttribute, NetworkContext>.CommenceAttributeSearch<ItemDef>(typeof(BaseItemMasterBehavior), RegisterBehaviour); if (shared.Count > 0) { BaseAssetAssociatedBehavior<ItemDefAssociationAttribute, NetworkContext>.server.SetItemTypePairs(server); BaseAssetAssociatedBehavior<ItemDefAssociationAttribute, NetworkContext>.client.SetItemTypePairs(client); BaseAssetAssociatedBehavior<ItemDefAssociationAttribute, NetworkContext>.shared.SetItemTypePairs(shared); masterToItemBehaviors = new Dictionary<UnityObjectWrapperKey<CharacterMaster>, BaseItemMasterBehavior[]>(); CharacterMaster.OnDestroy += new hook_OnDestroy(CharacterMaster_OnDestroy); CharacterMaster.OnInventoryChanged += new hook_OnInventoryChanged(CharacterMaster_OnInventoryChanged); } void RegisterBehaviour(ItemDefAssociationAttribute attribute, MethodInfo methodInfo, ItemDef asset) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_002d: 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) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) if ((int)asset.itemIndex < 0) { Debug.LogError((object)$"{methodInfo.DeclaringType.FullName}.{methodInfo.Name} returned an ItemDef that's not registered in the ItemCatalog. result={asset}"); } else { ItemTypePair val = default(ItemTypePair); val.itemIndex = asset.itemIndex; val.behaviorType = methodInfo.DeclaringType; ItemTypePair item = val; if (attribute.useOnServer) { server.Add(item); } if (attribute.useOnClient) { client.Add(item); } if (attribute.useOnServer || attribute.useOnClient) { shared.Add(item); } } } } private static void CharacterMaster_OnDestroy(orig_OnDestroy orig, CharacterMaster self) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (masterToItemBehaviors.TryGetValue(UnityObjectWrapperKey<CharacterMaster>.op_Implicit(self), out var value)) { for (int i = 0; i < value.Length; i++) { Object.Destroy((Object)(object)value[i]); } masterToItemBehaviors.Remove(UnityObjectWrapperKey<CharacterMaster>.op_Implicit(self)); if (NetworkServer.active || NetworkClient.active) { BaseAssetAssociatedBehavior<ItemDefAssociationAttribute, NetworkContext>.GetCurrentNetworkContext().behaviorArraysPool.Return(value); } } } private static void CharacterMaster_OnInventoryChanged(orig_OnInventoryChanged orig, CharacterMaster self) { orig.Invoke(self); UpdateMasterItemBehaviorStacks(self); } private static void UpdateMasterItemBehaviorStacks(CharacterMaster master) { //IL_0013: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) ref NetworkContext currentNetworkContext = ref BaseAssetAssociatedBehavior<ItemDefAssociationAttribute, NetworkContext>.GetCurrentNetworkContext(); Inventory inventory = master.inventory; if (!masterToItemBehaviors.TryGetValue(UnityObjectWrapperKey<CharacterMaster>.op_Implicit(master), out var value) && Object.op_Implicit((Object)(object)inventory) && inventory.itemAcquisitionOrder.Count > 0) { value = currentNetworkContext.behaviorArraysPool.Request(); masterToItemBehaviors.Add(UnityObjectWrapperKey<CharacterMaster>.op_Implicit(master), value); } if (value == null) { return; } ItemTypePair[] itemTypePairs = currentNetworkContext.itemTypePairs; if (Object.op_Implicit((Object)(object)inventory)) { for (int i = 0; i < itemTypePairs.Length; i++) { ItemTypePair val = itemTypePairs[i]; SetItemStack(master, ref value[i], val.behaviorType, inventory.GetItemCount(val.itemIndex)); } return; } for (int j = 0; j < itemTypePairs.Length; j++) { ref BaseItemMasterBehavior reference = ref value[j]; if ((Object)(object)reference != (Object)null) { Object.Destroy((Object)(object)reference); reference = null; } } } private static void SetItemStack(CharacterMaster master, ref BaseItemMasterBehavior behavior, Type behaviorType, int stack) { if ((Object)(object)behavior == (Object)null != stack <= 0) { if (stack <= 0) { behavior.stack = 0; Object.Destroy((Object)(object)behavior); behavior = null; } else { earlyAssignmentMaster = master; behavior = (BaseItemMasterBehavior)(object)((Component)master).gameObject.AddComponent(behaviorType); earlyAssignmentMaster = null; } } if ((Object)(object)behavior != (Object)null) { behavior.stack = stack; } } } public record AchievementWrapper : AchievementWrapper<AchievementWrapper, AchievementDef, UnlockableDef> { public AchievementWrapper(AchievementDef AchievementDef, UnlockableDef UnlockableDef) : base(AchievementDef, UnlockableDef) { } public new void Deconstruct(out AchievementDef AchievementDef, out UnlockableDef UnlockableDef) { AchievementDef = base.AchievementDef; UnlockableDef = base.UnlockableDef; } } public record AchievementWrapper<TAchievementDef, TUnlockableDef> : AchievementWrapper<AchievementWrapper<TAchievementDef, TUnlockableDef>, TAchievementDef, TUnlockableDef> where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { public AchievementWrapper(TAchievementDef AchievementDef, TUnlockableDef UnlockableDef) : base(AchievementDef, UnlockableDef) { } public new void Deconstruct(out TAchievementDef AchievementDef, out TUnlockableDef UnlockableDef) { AchievementDef = base.AchievementDef; UnlockableDef = base.UnlockableDef; } } public abstract record AchievementWrapper<TAchievementWrapper, TAchievementDef, TUnlockableDef>(TAchievementDef AchievementDef, TUnlockableDef UnlockableDef) where TAchievementWrapper : AchievementWrapper<TAchievementWrapper, TAchievementDef, TUnlockableDef> where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { public string NameToken => ((AchievementDef)AchievementDef).nameToken; public string DescriptionToken => ((AchievementDef)AchievementDef).descriptionToken; [MethodImpl(MethodImplOptions.AggressiveInlining)] public TAchievementWrapper SetIconSprite(Sprite iconSprite) { ((AchievementDef)AchievementDef).SetAchievedIcon(iconSprite); ((UnlockableDef)UnlockableDef).achievementIcon = iconSprite; return this as TAchievementWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TAchievementWrapper SetPrerequisiteAchievement(AchievementDef prerequisiteAchievement) { ((AchievementDef)AchievementDef).prerequisiteAchievementIdentifier = prerequisiteAchievement?.identifier; return this as TAchievementWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TAchievementWrapper SetPrerequisiteAchievement(string prerequisiteAchievementIdentifier) { ((AchievementDef)AchievementDef).prerequisiteAchievementIdentifier = prerequisiteAchievementIdentifier; return this as TAchievementWrapper; } public TAchievementWrapper SetTrackerTypes(Type localTrackerType, Type serverTrackerType = null) { if (localTrackerType == null) { throw new ArgumentNullException("localTrackerType"); } if (!localTrackerType.IsSubclassOf(typeof(BaseAchievement))) { throw new ArgumentException("localTrackerType"); } if (serverTrackerType != null && !serverTrackerType.IsSubclassOf(typeof(BaseServerAchievement))) { throw new ArgumentException("serverTrackerType"); } ((AchievementDef)AchievementDef).type = localTrackerType; ((AchievementDef)AchievementDef).serverTrackerType = serverTrackerType; return this as TAchievementWrapper; } } public static class ArtifactExtensions { private static Dictionary<ArtifactDef, (Action onEnabledAction, Action onDisabledAction)> artifactEnabledActions; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TArtifactDef SetIconSprites<TArtifactDef>(this TArtifactDef artifactDef, Sprite enabledIconSprite, Sprite disabledIconSprite) where TArtifactDef : ArtifactDef { ((ArtifactDef)artifactDef).smallIconSelectedSprite = enabledIconSprite; ((ArtifactDef)artifactDef).smallIconDeselectedSprite = disabledIconSprite; return artifactDef; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TArtifactDef SetPickupModelPrefab<TArtifactDef>(this TArtifactDef artifactDef, GameObject pickupModelPrefab) where TArtifactDef : ArtifactDef { ((ArtifactDef)artifactDef).pickupModelPrefab = pickupModelPrefab; return artifactDef; } public static TArtifactDef SetArtifactCode<TArtifactDef>(this TArtifactDef artifactDef, ArtifactCode? artifactCode) where TArtifactDef : ArtifactDef { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) for (int num = ArtifactCodeAPI.artifactCodes.Count - 1; num >= 0; num--) { (ArtifactDef, Sha256HashAsset) tuple = ArtifactCodeAPI.artifactCodes[num]; if ((Object)(object)tuple.Item1 == (Object)(object)artifactDef) { Object.Destroy((Object)(object)tuple.Item2); ArtifactCodeAPI.artifactCodes.RemoveAt(num); } } if (artifactCode.HasValue) { Sha256HashAsset val = ScriptableObject.CreateInstance<Sha256HashAsset>(); val.value = artifactCode.Value.CreateCodeHash(); ArtifactCodeAPI.AddCode((ArtifactDef)(object)artifactDef, val); } return artifactDef; } public static TArtifactDef SetEnabledActions<TArtifactDef>(this TArtifactDef artifactDef, Action onEnabledAction, Action onDisabledAction) where TArtifactDef : ArtifactDef { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown if (artifactEnabledActions == null) { artifactEnabledActions = new Dictionary<ArtifactDef, (Action, Action)>(); RunArtifactManager.onArtifactEnabledGlobal += new ArtifactStateChangeDelegate(OnArtifactEnabledGlobal); RunArtifactManager.onArtifactDisabledGlobal += new ArtifactStateChangeDelegate(OnArtifactDisabledGlobal); } artifactEnabledActions[(ArtifactDef)(object)artifactDef] = (onEnabledAction, onDisabledAction); return artifactDef; static void OnArtifactDisabledGlobal(RunArtifactManager runArtifactManager, ArtifactDef artifactDef) { if (artifactEnabledActions.TryGetValue(artifactDef, out (Action, Action) value)) { value.Item2?.Invoke(); } } static void OnArtifactEnabledGlobal(RunArtifactManager runArtifactManager, ArtifactDef artifactDef) { if (artifactEnabledActions.TryGetValue(artifactDef, out (Action, Action) value2)) { value2.Item1?.Invoke(); } } } } public static class BuffExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TBuffDef SetIconSprite<TBuffDef>(this TBuffDef buffDef, Sprite iconSprite, Color spriteColor) where TBuffDef : BuffDef { //IL_0012: 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) ((BuffDef)buffDef).iconSprite = iconSprite; ((BuffDef)buffDef).buffColor = spriteColor; return buffDef; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TBuffDef SetIconSprite<TBuffDef>(this TBuffDef buffDef, Sprite iconSprite) where TBuffDef : BuffDef { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) ((BuffDef)buffDef).iconSprite = iconSprite; ((BuffDef)buffDef).buffColor = Color.white; return buffDef; } public static TBuffDef SetFlags<TBuffDef>(this TBuffDef buffDef, BuffFlags flags) where TBuffDef : BuffDef { ((BuffDef)buffDef).canStack = (flags & BuffFlags.Stackable) > BuffFlags.None; ((BuffDef)buffDef).isDebuff = (flags & BuffFlags.Debuff) > BuffFlags.None; ((BuffDef)buffDef).isCooldown = (flags & BuffFlags.Cooldown) > BuffFlags.None; ((BuffDef)buffDef).isHidden = (flags & BuffFlags.Hidden) > BuffFlags.None; return buffDef; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TBuffDef SetStartSfx<TBuffDef>(this TBuffDef buffDef, NetworkSoundEventDef startSfx) where TBuffDef : BuffDef { ((BuffDef)buffDef).startSfx = startSfx; return buffDef; } } public static class ContentPackExtensions { public static void PopulateNetworkedObjectAssetIds(this ContentPack contentPack) { StringBuilder stringBuilder2 = new StringBuilder(32); using (MD5 hasher2 = MD5.Create()) { PopulateAssetIds(contentPack.bodyPrefabs, contentPack.identifier, "bodyPrefabs", stringBuilder2, hasher2); PopulateAssetIds(contentPack.masterPrefabs, contentPack.identifier, "masterPrefabs", stringBuilder2, hasher2); PopulateAssetIds(contentPack.projectilePrefabs, contentPack.identifier, "projectilePrefabs", stringBuilder2, hasher2); PopulateAssetIds(contentPack.networkedObjectPrefabs, contentPack.identifier, "networkedObjectPrefabs", stringBuilder2, hasher2); PopulateAssetIds(contentPack.gameModePrefabs, contentPack.identifier, "gameModePrefabs", stringBuilder2, hasher2); } static void PopulateAssetIds(NamedAssetCollection<GameObject> assets, string contentIdentifier, string collectionIdentifier, StringBuilder stringBuilder, HashAlgorithm hasher) { //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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) NetworkIdentity val2 = default(NetworkIdentity); for (int i = 0; i < assets.Length; i++) { AssetInfo<GameObject> val = assets.assetInfos[i]; if (val.asset.TryGetComponent<NetworkIdentity>(ref val2)) { NetworkHash128 assetId = val2.assetId; if (!((NetworkHash128)(ref assetId)).IsValid()) { stringBuilder.Clear(); byte[] array = hasher.ComputeHash(Encoding.UTF8.GetBytes(val.assetName + contentIdentifier + collectionIdentifier)); foreach (byte b in array) { stringBuilder.Append(b.ToString("x2")); } val2.SetDynamicAssetId(NetworkHash128.Parse(stringBuilder.ToString())); } } } } } public static void AddEntityStatesFromAssembly(this ContentPack contentPack, Assembly assembly) { Type[] types = assembly.GetTypes(); for (int i = 0; i < types.Length; i++) { if (types[i].IsSubclassOf(typeof(EntityState))) { contentPack.entityStateTypes.Add(types[i]); } } } public static void AddSerializedContent(this ContentPack contentPack, R2APISerializableContentPack serializableContent) { typeof(R2APISerializableContentPack).GetMethod("EnsureNoFieldsAreNull", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(serializableContent, null); contentPack.bodyPrefabs.Add(serializableContent.bodyPrefabs); contentPack.masterPrefabs.Add(serializableContent.masterPrefabs); contentPack.projectilePrefabs.Add(serializableContent.projectilePrefabs); contentPack.gameModePrefabs.Add(serializableContent.gameModePrefabs); contentPack.effectDefs.Add(((IEnumerable<GameObject>)serializableContent.effectPrefabs).Select((Func<GameObject, EffectDef>)((GameObject x) => new EffectDef(x))).ToArray()); contentPack.networkedObjectPrefabs.Add(serializableContent.networkedObjectPrefabs); contentPack.skillDefs.Add(serializableContent.skillDefs); contentPack.skillFamilies.Add(serializableContent.skillFamilies); contentPack.sceneDefs.Add(serializableContent.sceneDefs); contentPack.itemDefs.Add(serializableContent.itemDefs); contentPack.itemTierDefs.Add(serializableContent.itemTierDefs); contentPack.itemRelationshipTypes.Add(serializableContent.itemRelationshipTypes); contentPack.equipmentDefs.Add(serializableContent.equipmentDefs); contentPack.buffDefs.Add(serializableContent.buffDefs); contentPack.eliteDefs.Add(serializableContent.eliteDefs); contentPack.unlockableDefs.Add(serializableContent.unlockableDefs); contentPack.survivorDefs.Add(serializableContent.survivorDefs); contentPack.artifactDefs.Add(serializableContent.artifactDefs); contentPack.surfaceDefs.Add(serializableContent.surfaceDefs); contentPack.networkSoundEventDefs.Add(serializableContent.networkSoundEventDefs); contentPack.musicTrackDefs.Add(serializableContent.musicTrackDefs); contentPack.gameEndingDefs.Add(serializableContent.gameEndingDefs); contentPack.entityStateConfigurations.Add(serializableContent.entityStateConfigurations); contentPack.expansionDefs.Add(serializableContent.expansionDefs); contentPack.entitlementDefs.Add(serializableContent.entitlementDefs); contentPack.miscPickupDefs.Add(serializableContent.miscPickupDefs); HashSet<Type> hashSet = new HashSet<Type>(); for (int i = 0; i < serializableContent.entityStateTypes.Length; i++) { Type stateType = ((SerializableEntityStateType)(ref serializableContent.entityStateTypes[i])).stateType; if (stateType != null) { hashSet.Add(stateType); continue; } Debug.LogWarning((object)("SerializableContentPack \"" + ((Object)serializableContent).name + "\" could not resolve type with name \"" + ((SerializableEntityStateType)(ref serializableContent.entityStateTypes[i])).typeName + "\". The type will not be available in the content pack.")); } contentPack.entityStateTypes.Add(hashSet.ToArray()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void AddEffectPrefab(this ContentPack contentPack, GameObject effectPrefab) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown contentPack.effectDefs.Add<EffectDef>(new EffectDef(effectPrefab)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static string GetPrefix(ContentPack contentPack) { return contentPack.identifier.Substring(contentPack.identifier.LastIndexOf('.') + 1); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static string FormatToken(string baseToken, string tokenPrefix) { return tokenPrefix + "_" + baseToken; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static string FormatAssetIdentifier(string baseIdentifier, string prefix) { return prefix + "." + baseIdentifier; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static string GetUnlockableIdentifier(string baseIdentifier, UnlockableType unlockableType) { if (!string.IsNullOrWhiteSpace((string)unlockableType)) { baseIdentifier = (string)unlockableType + "." + baseIdentifier; } return baseIdentifier; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void AssignRequiredExpansion(ref ExpansionDef requiredExpansion, ContentPack contentPack) { if (contentPack.expansionDefs.Length > 0) { requiredExpansion = contentPack.expansionDefs[0]; } } public static ExpansionDef DefineExpansion(this ContentPack contentPack) { return contentPack.DefineExpansion<ExpansionDef>(); } public static TExpansionDef DefineExpansion<TExpansionDef>(this ContentPack contentPack) where TExpansionDef : ExpansionDef { //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) TExpansionDef expansion = ScriptableObject.CreateInstance<TExpansionDef>(); ((Object)(object)expansion).name = contentPack.identifier; string text = contentPack.identifier.ToUpperInvariant().Replace('.', '_'); ((ExpansionDef)expansion).nameToken = text + "_NAME"; ((ExpansionDef)expansion).descriptionToken = text + "_DESCRIPTION"; AsyncOperationHandle<Sprite> val = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/MiscIcons/texUnlockIcon.png"); val.Completed += delegate(AsyncOperationHandle<Sprite> texUnlockIcon) { ExpansionDef val2 = (ExpansionDef)(object)expansion; if (val2.disabledIconSprite == null) { val2.disabledIconSprite = texUnlockIcon.Result; } }; contentPack.expansionDefs.Add<ExpansionDef>((ExpansionDef)(object)expansion); return expansion; } public static ItemDef DefineItem(this ContentPack contentPack, string identifier) { return contentPack.DefineItem<ItemDef>(identifier); } public static TItemDef DefineItem<TItemDef>(this ContentPack contentPack, string identifier) where TItemDef : ItemDef { TItemDef val = ScriptableObject.CreateInstance<TItemDef>(); string prefix = GetPrefix(contentPack); ((Object)(object)val).name = FormatAssetIdentifier(identifier, prefix); string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((ItemDef)val).nameToken = FormatToken("ITEM_" + text + "_NAME", tokenPrefix); ((ItemDef)val).pickupToken = FormatToken("ITEM_" + text + "_PICKUP", tokenPrefix); ((ItemDef)val).descriptionToken = FormatToken("ITEM_" + text + "_DESC", tokenPrefix); ((ItemDef)val).loreToken = FormatToken("ITEM_" + text + "_LORE", tokenPrefix); AssignRequiredExpansion(ref ((ItemDef)val).requiredExpansion, contentPack); contentPack.itemDefs.Add<ItemDef>((ItemDef)(object)val); return val; } public static EquipmentDef DefineEquipment(this ContentPack contentPack, string identifier) { return contentPack.DefineEquipment<EquipmentDef>(identifier); } public static TEquipmentDef DefineEquipment<TEquipmentDef>(this ContentPack contentPack, string identifier) where TEquipmentDef : EquipmentDef { TEquipmentDef val = ScriptableObject.CreateInstance<TEquipmentDef>(); string prefix = GetPrefix(contentPack); ((Object)(object)val).name = FormatAssetIdentifier(identifier, prefix); string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((EquipmentDef)val).nameToken = FormatToken("EQUIPMENT_" + text + "_NAME", tokenPrefix); ((EquipmentDef)val).pickupToken = FormatToken("EQUIPMENT_" + text + "_PICKUP", tokenPrefix); ((EquipmentDef)val).descriptionToken = FormatToken("EQUIPMENT_" + text + "_DESC", tokenPrefix); ((EquipmentDef)val).loreToken = FormatToken("EQUIPMENT_" + text + "_LORE", tokenPrefix); ((EquipmentDef)val).canDrop = true; ((EquipmentDef)val).enigmaCompatible = true; AssignRequiredExpansion(ref ((EquipmentDef)val).requiredExpansion, contentPack); contentPack.equipmentDefs.Add<EquipmentDef>((EquipmentDef)(object)val); return val; } public static BuffDef DefineBuff(this ContentPack contentPack, string identifier) { return contentPack.DefineBuff<BuffDef>(identifier); } public static TBuffDef DefineBuff<TBuffDef>(this ContentPack contentPack, string identifier) where TBuffDef : BuffDef { TBuffDef val = ScriptableObject.CreateInstance<TBuffDef>(); ((Object)(object)val).name = FormatAssetIdentifier(identifier, GetPrefix(contentPack)); contentPack.buffDefs.Add<BuffDef>((BuffDef)(object)val); return val; } public static ArtifactDef DefineArtifact(this ContentPack contentPack, string identifier) { return contentPack.DefineArtifact<ArtifactDef>(identifier); } public static TArtifactDef DefineArtifact<TArtifactDef>(this ContentPack contentPack, string identifier) where TArtifactDef : ArtifactDef { TArtifactDef val = ScriptableObject.CreateInstance<TArtifactDef>(); string prefix = GetPrefix(contentPack); ((ArtifactDef)val).cachedName = FormatAssetIdentifier(identifier, prefix); string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((ArtifactDef)val).nameToken = FormatToken("ARTIFACT_" + text + "_NAME", tokenPrefix); ((ArtifactDef)val).descriptionToken = FormatToken("ARTIFACT_" + text + "_DESCRIPTION", tokenPrefix); AssignRequiredExpansion(ref ((ArtifactDef)val).requiredExpansion, contentPack); contentPack.artifactDefs.Add<ArtifactDef>((ArtifactDef)(object)val); return val; } public static SkillDef DefineSkill(this ContentPack contentPack, string identifier) { return contentPack.DefineSkill<SkillDef>(identifier); } public static TSceneDef DefineSkill<TSceneDef>(this ContentPack contentPack, string identifier) where TSceneDef : SkillDef { TSceneDef val = ScriptableObject.CreateInstance<TSceneDef>(); string prefix = GetPrefix(contentPack); ((SkillDef)val).skillName = FormatAssetIdentifier(identifier, prefix); ((Object)(object)val).name = ((SkillDef)val).skillName; string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((SkillDef)val).skillNameToken = FormatToken("SKILL_" + text + "_NAME", tokenPrefix); ((SkillDef)val).skillDescriptionToken = FormatToken("SKILL_" + text + "_DESC", tokenPrefix); contentPack.skillDefs.Add<SkillDef>((SkillDef)(object)val); return val; } public static GameEndingDef DefineGameEnding(this ContentPack contentPack, string identifier) { return contentPack.DefineGameEnding<GameEndingDef>(identifier); } public static TGameEndingDef DefineGameEnding<TGameEndingDef>(this ContentPack contentPack, string identifier) where TGameEndingDef : GameEndingDef { TGameEndingDef val = ScriptableObject.CreateInstance<TGameEndingDef>(); string prefix = GetPrefix(contentPack); ((GameEndingDef)val).cachedName = FormatAssetIdentifier(identifier, prefix); string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((GameEndingDef)val).endingTextToken = FormatToken("GAME_RESULT_" + text, tokenPrefix); contentPack.gameEndingDefs.Add<GameEndingDef>((GameEndingDef)(object)val); return val; } public static SurfaceDef DefineSurfaceDef(this ContentPack contentPack, string identifier) { return contentPack.DefineSurfaceDef<SurfaceDef>(identifier); } public static TSurfaceDef DefineSurfaceDef<TSurfaceDef>(this ContentPack contentPack, string identifier) where TSurfaceDef : SurfaceDef { TSurfaceDef val = ScriptableObject.CreateInstance<TSurfaceDef>(); ((Object)(object)val).name = FormatAssetIdentifier(identifier, GetPrefix(contentPack)); contentPack.surfaceDefs.Add<SurfaceDef>((SurfaceDef)(object)val); return val; } public static SurvivorDef DefineSurvivorFromBodyPrefab(this ContentPack contentPack, string identifier, GameObject bodyPrefab) { return contentPack.DefineSurvivorFromBodyPrefab<SurvivorDef>(identifier, bodyPrefab); } public static TSurvivorDef DefineSurvivorFromBodyPrefab<TSurvivorDef>(this ContentPack contentPack, string identifier, GameObject bodyPrefab) where TSurvivorDef : SurvivorDef { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) TSurvivorDef val = DefineSurvivorImpl<TSurvivorDef>(identifier, contentPack); ((SurvivorDef)val).bodyPrefab = bodyPrefab; CharacterBody val2 = default(CharacterBody); if (((SurvivorDef)val).bodyPrefab.TryGetComponent<CharacterBody>(ref val2)) { ((SurvivorDef)val).displayNameToken = val2.baseNameToken; ((SurvivorDef)val).primaryColor = val2.bodyColor; } ExpansionDef requiredExpansion = null; AssignRequiredExpansion(ref requiredExpansion, contentPack); if ((Object)(object)requiredExpansion != (Object)null) { (((SurvivorDef)val).bodyPrefab.GetComponent<ExpansionRequirementComponent>() ?? ((SurvivorDef)val).bodyPrefab.AddComponent<ExpansionRequirementComponent>()).requiredExpansion = requiredExpansion; } return val; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static TSurvivorDef DefineSurvivorImpl<TSurvivorDef>(string identifier, ContentPack contentPack) where TSurvivorDef : SurvivorDef { TSurvivorDef val = ScriptableObject.CreateInstance<TSurvivorDef>(); string prefix = GetPrefix(contentPack); ((SurvivorDef)val).cachedName = FormatAssetIdentifier(identifier, prefix); string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((SurvivorDef)val).displayNameToken = FormatToken(text + "_BODY_NAME", tokenPrefix); ((SurvivorDef)val).descriptionToken = FormatToken(text + "_DESCRIPTION", tokenPrefix); ((SurvivorDef)val).outroFlavorToken = FormatToken(text + "_OUTRO_FLAVOR", tokenPrefix); ((SurvivorDef)val).outroFlavorToken = FormatToken(text + "_MAIN_ENDING_ESCAPE_FAILURE_FLAVOR", tokenPrefix); contentPack.survivorDefs.Add<SurvivorDef>((SurvivorDef)(object)val); return val; } public static SkinDef DefineSkinForBodyPrefab(this ContentPack contentPack, string identifier, GameObject bodyPrefab) { return contentPack.DefineSkinForBodyPrefab<SkinDef>(identifier, bodyPrefab); } public static TSkinDef DefineSkinForBodyPrefab<TSkinDef>(this ContentPack contentPack, string identifier, GameObject bodyPrefab) where TSkinDef : SkinDef { ModelLocator val = default(ModelLocator); if (!bodyPrefab.TryGetComponent<ModelLocator>(ref val) || !Object.op_Implicit((Object)(object)val.modelTransform)) { throw new ArgumentException("bodyPrefab"); } TSkinDef val2 = contentPack.DefineSkin<TSkinDef>(identifier); ((SkinDef)val2).rootObject = ((Component)val.modelTransform).gameObject; ModelSkinController val3 = default(ModelSkinController); if (((Component)val.modelTransform).TryGetComponent<ModelSkinController>(ref val3) && val3.skins != null) { ref SkinDef[] skins = ref val3.skins; SkinDef val4 = (SkinDef)(object)val2; ArrayUtils.ArrayAppend<SkinDef>(ref skins, ref val4); } else { if (val3 == null) { val3 = ((Component)val.modelTransform).gameObject.AddComponent<ModelSkinController>(); } ModelSkinController obj = val3; SkinDef[] skins2 = (SkinDef[])(object)new TSkinDef[1] { val2 }; obj.skins = skins2; ((SkinDef)val2).nameToken = "DEFAULT_SKIN"; } return val2; } public static SkinDef DefineSkin(this ContentPack contentPack, string identifier) { return contentPack.DefineSkin<SkinDef>(identifier); } public static TSkinDef DefineSkin<TSkinDef>(this ContentPack contentPack, string identifier) where TSkinDef : SkinDef { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown SkinDef.Awake += new hook_Awake(_); TSkinDef val = ScriptableObject.CreateInstance<TSkinDef>(); SkinDef.Awake -= new hook_Awake(_); string prefix = GetPrefix(contentPack); ((Object)(object)val).name = FormatAssetIdentifier(identifier, prefix); string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((SkinDef)val).nameToken = FormatToken("SKIN_" + text + "_NAME", tokenPrefix); return val; static void _(orig_Awake orig, SkinDef self) { } } public static ItemTierDef DefineItemTier(this ContentPack contentPack, string identifier) { return contentPack.DefineItemTier<ItemTierDef>(identifier); } public static TItemTierDef DefineItemTier<TItemTierDef>(this ContentPack contentPack, string identifier) where TItemTierDef : ItemTierDef { TItemTierDef val = ScriptableObject.CreateInstance<TItemTierDef>(); ((Object)(object)val).name = FormatAssetIdentifier(identifier, GetPrefix(contentPack)); ((ItemTierDef)val).tier = (ItemTier)10; ((ItemTierDef)val).isDroppable = true; ((ItemTierDef)val).canScrap = true; ((ItemTierDef)val).canRestack = true; contentPack.itemTierDefs.Add<ItemTierDef>((ItemTierDef)(object)val); return val; } public static NetworkSoundEventDef DefineNetworkSoundEvent(this ContentPack contentPack, string identifier) { return contentPack.DefineNetworkSoundEvent<NetworkSoundEventDef>(identifier); } public static TNetworkSoundEventDef DefineNetworkSoundEvent<TNetworkSoundEventDef>(this ContentPack contentPack, string identifier) where TNetworkSoundEventDef : NetworkSoundEventDef { TNetworkSoundEventDef val = ScriptableObject.CreateInstance<TNetworkSoundEventDef>(); ((Object)(object)val).name = FormatAssetIdentifier(identifier, GetPrefix(contentPack)); contentPack.networkSoundEventDefs.Add<NetworkSoundEventDef>((NetworkSoundEventDef)(object)val); return val; } public static TMiscPickupDef DefineMiscPickup<TMiscPickupDef>(this ContentPack contentPack, string identifier) where TMiscPickupDef : MiscPickupDef, new() { TMiscPickupDef val = ScriptableObject.CreateInstance<TMiscPickupDef>(); string prefix = GetPrefix(contentPack); ((Object)(object)val).name = FormatAssetIdentifier(identifier, prefix); string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((MiscPickupDef)val).nameToken = FormatToken("PICKUP_" + text, tokenPrefix); ((MiscPickupDef)val).interactContextToken = FormatToken(text + "_PICKUP_CONTEXT", tokenPrefix); contentPack.miscPickupDefs.Add<MiscPickupDef>((MiscPickupDef)(object)val); return val; } public static SceneDef DefineScene(this ContentPack contentPack, string sceneIdentifier) { return contentPack.DefineScene<SceneDef>(sceneIdentifier); } public static TSceneDef DefineScene<TSceneDef>(this ContentPack contentPack, string sceneIdentifier) where TSceneDef : SceneDef { //IL_00ab: Unknown result type (might be due to invalid IL or missing references) TSceneDef val = ScriptableObject.CreateInstance<TSceneDef>(); ((SceneDef)val).cachedName = sceneIdentifier; string text = sceneIdentifier.ToUpperInvariant(); string tokenPrefix = GetPrefix(contentPack).ToUpperInvariant(); ((SceneDef)val).nameToken = FormatToken("MAP_" + text + "_NAME", tokenPrefix); ((SceneDef)val).subtitleToken = FormatToken("MAP_" + text + "_SUBTITLE", tokenPrefix); ((SceneDef)val).loreToken = FormatToken("MAP_" + text + "_LORE", tokenPrefix); ((SceneDef)val).portalSelectionMessageString = FormatToken("BAZAAR_SEER_" + text, tokenPrefix); ((SceneDef)val).sceneType = (SceneType)1; AssignRequiredExpansion(ref ((SceneDef)val).requiredExpansion, contentPack); contentPack.sceneDefs.Add<SceneDef>((SceneDef)(object)val); return val; } public static ItemRelationshipType DefineItemRelationshipType(this ContentPack contentPack, string identifier) { return contentPack.DefineItemRelationshipType<ItemRelationshipType>(identifier); } public static TItemRelationshipType DefineItemRelationshipType<TItemRelationshipType>(this ContentPack contentPack, string identifier) where TItemRelationshipType : ItemRelationshipType { TItemRelationshipType val = ScriptableObject.CreateInstance<TItemRelationshipType>(); ((Object)(object)val).name = FormatAssetIdentifier(identifier, GetPrefix(contentPack)); contentPack.itemRelationshipTypes.Add<ItemRelationshipType>((ItemRelationshipType)(object)val); return val; } public static ItemRelationshipProvider DefineItemRelationshipProvider(this ContentPack contentPack, string identifier) { return contentPack.DefineItemRelationshipProvider<ItemRelationshipProvider>(identifier); } public static TItemRelationshipProvider DefineItemRelationshipProvider<TItemRelationshipProvider>(this ContentPack contentPack, string identifier) where TItemRelationshipProvider : ItemRelationshipProvider { TItemRelationshipProvider val = ScriptableObject.CreateInstance<TItemRelationshipProvider>(); ((Object)(object)val).name = FormatAssetIdentifier(identifier, GetPrefix(contentPack)); contentPack.itemRelationshipProviders.Add<ItemRelationshipProvider>((ItemRelationshipProvider)(object)val); return val; } public static DifficultyWrapper DefineDifficulty(this ContentPack contentPack, string identifier, bool preferPositiveIndex = false) { //IL_000f: 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: Unknown result type (might be due to invalid IL or missing references) var (difficultyDef, difficultyIndex) = DefineDifficultyImpl<DifficultyDef>(identifier, preferPositiveIndex, contentPack); return new DifficultyWrapper(difficultyDef, difficultyIndex); } public static DifficultyWrapper<TDifficultyDef> DefineDifficulty<TDifficultyDef>(this ContentPack contentPack, string identifier, bool preferPositiveIndex = false) where TDifficultyDef : DifficultyDef { //IL_000f: 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: Unknown result type (might be due to invalid IL or missing references) var (difficultyDef, difficultyIndex) = DefineDifficultyImpl<TDifficultyDef>(identifier, preferPositiveIndex, contentPack); return new DifficultyWrapper<TDifficultyDef>(difficultyDef, difficultyIndex); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static (TDifficultyDef, DifficultyIndex) DefineDifficultyImpl<TDifficultyDef>(string identifier, bool preferPositiveIndex, ContentPack contentPack) where TDifficultyDef : DifficultyDef { //IL_006d: Unknown result type (might be due to invalid IL or missing references) TDifficultyDef val = Activator.CreateInstance<TDifficultyDef>(); string text = identifier.ToUpperInvariant(); string tokenPrefix = GetPrefix(contentPack).ToUpperInvariant(); ((DifficultyDef)val).nameToken = FormatToken("DIFFICULTY_" + text + "_NAME", tokenPrefix); ((DifficultyDef)val).descriptionToken = FormatToken("DIFFICULTY_" + text + "_DESCRIPTION", tokenPrefix); ((DifficultyDef)val).foundIconSprite = true; return (val, DifficultyAPI.AddDifficulty((DifficultyDef)(object)val, preferPositiveIndex)); } public static EliteWrapper DefineElite(this ContentPack contentPack, string identifier) { var (eliteDef, eliteEquipmentDef, eliteBuffDef) = DefineEliteImpl<EliteDef, EquipmentDef, BuffDef>(identifier, contentPack); return new EliteWrapper(eliteDef, new List<EliteDef>(), eliteEquipmentDef, eliteBuffDef) { registerSubEliteCallback = delegate(EliteDef x) { contentPack?.eliteDefs.Add<EliteDef>(x); }, subElitePrefix = GetPrefix(contentPack) }; } public static EliteWrapper<TEliteDef, TEquipmentDef, TBuffDef> DefineElite<TEliteDef, TEquipmentDef, TBuffDef>(this ContentPack contentPack, string identifier) where TEliteDef : EliteDef where TEquipmentDef : EquipmentDef where TBuffDef : BuffDef { var (eliteDef, eliteEquipmentDef, eliteBuffDef) = DefineEliteImpl<TEliteDef, TEquipmentDef, TBuffDef>(identifier, contentPack); return new EliteWrapper<TEliteDef, TEquipmentDef, TBuffDef>(eliteDef, new List<TEliteDef>(), eliteEquipmentDef, eliteBuffDef) { registerSubEliteCallback = delegate(EliteDef x) { contentPack?.eliteDefs.Add<EliteDef>(x); }, subElitePrefix = GetPrefix(contentPack) }; } private static (TEliteDef, TEquipmentDef, TBuffDef) DefineEliteImpl<TEliteDef, TEquipmentDef, TBuffDef>(string identifier, ContentPack contentPack) where TEliteDef : EliteDef where TEquipmentDef : EquipmentDef where TBuffDef : BuffDef { TBuffDef val = contentPack.DefineBuff<TBuffDef>("Elite" + identifier); TEquipmentDef val2 = contentPack.DefineEquipment<TEquipmentDef>("Affix" + identifier).SetAvailability(EquipmentAvailability.Never).SetFlags(EquipmentFlags.NeverRandomlyTriggered | EquipmentFlags.EnigmaIncompatible) .SetPassiveBuff((BuffDef)(object)val); ((EquipmentDef)val2).dropOnDeathChance = 0.00025f; TEliteDef val3 = ScriptableObject.CreateInstance<TEliteDef>(); string prefix = GetPrefix(contentPack); ((Object)(object)val3).name = FormatAssetIdentifier(identifier, prefix); string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((EliteDef)val3).modifierToken = FormatToken("ELITE_MODIFIER_" + text, tokenPrefix); ((EliteDef)val3).eliteEquipmentDef = (EquipmentDef)(object)val2; ((EliteDef)val3).shaderEliteRampIndex = 0; ((BuffDef)val).eliteDef = (EliteDef)(object)val3; contentPack.eliteDefs.Add<EliteDef>((EliteDef)(object)val3); return (val3, val2, val); } public static UnlockableDef DefineUnlockable(this ContentPack contentPack, UnlockableType unlockableType, string identifier) { return contentPack.DefineUnlockable<UnlockableDef>(unlockableType, identifier); } public static TUnlockableDef DefineUnlockable<TUnlockableDef>(this ContentPack contentPack, UnlockableType unlockableType, string identifier) where TUnlockableDef : UnlockableDef { TUnlockableDef val = ScriptableObject.CreateInstance<TUnlockableDef>(); ((UnlockableDef)val).cachedName = GetUnlockableIdentifier(identifier, unlockableType); string text = identifier.ToUpperInvariant().Replace('.', '_'); string tokenPrefix = GetPrefix(contentPack).ToUpperInvariant(); ((UnlockableDef)val).nameToken = FormatToken("UNLOCKABLE_" + ((string)unlockableType).ToUpperInvariant() + "_" + text, tokenPrefix); contentPack.unlockableDefs.Add<UnlockableDef>((UnlockableDef)(object)val); return val; } public static AchievementWrapper DefineAchievementForItem(this ContentPack contentPack, string identifier, ItemDef item) { UnlockableDef val = (item.unlockableDef = UnlockableExtensions.SetNameToken<UnlockableDef>(contentPack.DefineUnlockable(UnlockableType.Items, ((Object)item).name), item.nameToken)); return new AchievementWrapper(DefineAchievementImpl<AchievementDef>(identifier, val, contentPack), val); } public static AchievementWrapper<TAchievementDef, TUnlockableDef> DefineAchievementForItem<TAchievementDef, TUnlockableDef>(this ContentPack contentPack, string identifier, ItemDef item) where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { TUnlockableDef val = UnlockableExtensions.SetNameToken(contentPack.DefineUnlockable<TUnlockableDef>(UnlockableType.Items, ((Object)item).name), item.nameToken); item.unlockableDef = (UnlockableDef)(object)val; return new AchievementWrapper<TAchievementDef, TUnlockableDef>(DefineAchievementImpl<TAchievementDef>(identifier, (UnlockableDef)(object)val, contentPack), val); } public static AchievementWrapper DefineAchievementForEquipment(this ContentPack contentPack, string identifier, EquipmentDef equipment) { UnlockableDef val = (equipment.unlockableDef = UnlockableExtensions.SetNameToken<UnlockableDef>(contentPack.DefineUnlockable(UnlockableType.Items, ((Object)equipment).name), equipment.nameToken)); return new AchievementWrapper(DefineAchievementImpl<AchievementDef>(identifier, val, contentPack), val); } public static AchievementWrapper<TAchievementDef, TUnlockableDef> DefineAchievementForEquipment<TAchievementDef, TUnlockableDef>(this ContentPack contentPack, string identifier, EquipmentDef equipment) where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { TUnlockableDef val = UnlockableExtensions.SetNameToken(contentPack.DefineUnlockable<TUnlockableDef>(UnlockableType.Items, ((Object)equipment).name), equipment.nameToken); equipment.unlockableDef = (UnlockableDef)(object)val; return new AchievementWrapper<TAchievementDef, TUnlockableDef>(DefineAchievementImpl<TAchievementDef>(identifier, (UnlockableDef)(object)val, contentPack), val); } public static AchievementWrapper DefineAchievementForSurvivor(this ContentPack contentPack, string identifier, SurvivorDef survivor) { UnlockableDef val = (survivor.unlockableDef = UnlockableExtensions.SetNameToken<UnlockableDef>(contentPack.DefineUnlockable(UnlockableType.Characters, survivor.cachedName), survivor.displayNameToken)); return new AchievementWrapper(DefineAchievementImpl<AchievementDef>(identifier, val, contentPack), val); } public static AchievementWrapper<TAchievementDef, TUnlockableDef> DefineAchievementForSurvivor<TAchievementDef, TUnlockableDef>(this ContentPack contentPack, string identifier, SurvivorDef survivor) where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { TUnlockableDef val = UnlockableExtensions.SetNameToken(contentPack.DefineUnlockable<TUnlockableDef>(UnlockableType.Characters, survivor.cachedName), survivor.displayNameToken); survivor.unlockableDef = (UnlockableDef)(object)val; return new AchievementWrapper<TAchievementDef, TUnlockableDef>(DefineAchievementImpl<TAchievementDef>(identifier, (UnlockableDef)(object)val, contentPack), val); } public static AchievementWrapper DefineAchievementForArtifact(this ContentPack contentPack, string identifier, ArtifactDef artifact) { UnlockableDef val = (artifact.unlockableDef = UnlockableExtensions.SetNameToken<UnlockableDef>(contentPack.DefineUnlockable(UnlockableType.Artifacts, artifact.cachedName), artifact.nameToken)); return new AchievementWrapper(DefineAchievementImpl<AchievementDef>(identifier, val, contentPack), val); } public static AchievementWrapper<TAchievementDef, TUnlockableDef> DefineAchievementForArtifact<TAchievementDef, TUnlockableDef>(this ContentPack contentPack, string identifier, ArtifactDef artifact) where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { TUnlockableDef val = UnlockableExtensions.SetNameToken(contentPack.DefineUnlockable<TUnlockableDef>(UnlockableType.Artifacts, artifact.cachedName), artifact.nameToken); artifact.unlockableDef = (UnlockableDef)(object)val; return new AchievementWrapper<TAchievementDef, TUnlockableDef>(DefineAchievementImpl<TAchievementDef>(identifier, (UnlockableDef)(object)val, contentPack), val); } public static AchievementWrapper DefineAchievementForSkill(this ContentPack contentPack, string identifier, ref Variant skillVariant) { if ((Object)(object)skillVariant.skillDef == (Object)null) { throw new ArgumentException("skillVariant"); } UnlockableDef val = (skillVariant.unlockableDef = DefineUnlockableForSkillImpl<UnlockableDef>(skillVariant.skillDef, contentPack)); return new AchievementWrapper(DefineAchievementImpl<AchievementDef>(identifier, val, contentPack), val); } public static AchievementWrapper<TAchievementDef, TUnlockableDef> DefineAchievementForSkill<TAchievementDef, TUnlockableDef>(this ContentPack contentPack, string identifier, ref Variant skillVariant) where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { if ((Object)(object)skillVariant.skillDef == (Object)null) { throw new ArgumentException("skillVariant"); } TUnlockableDef val = DefineUnlockableForSkillImpl<TUnlockableDef>(skillVariant.skillDef, contentPack); skillVariant.unlockableDef = (UnlockableDef)(object)val; return new AchievementWrapper<TAchievementDef, TUnlockableDef>(DefineAchievementImpl<TAchievementDef>(identifier, (UnlockableDef)(object)val, contentPack), val); } public static AchievementWrapper DefineAchievementForSkill(this ContentPack contentPack, string identifier, ref Variant skillVariant1, ref Variant skillVariant2) { if ((Object)(object)skillVariant1.skillDef == (Object)null) { throw new ArgumentException("skillVariant1"); } UnlockableDef val = (skillVariant2.unlockableDef = (skillVariant1.unlockableDef = DefineUnlockableForSkillImpl<UnlockableDef>(skillVariant1.skillDef, contentPack))); return new AchievementWrapper(DefineAchievementImpl<AchievementDef>(identifier, val, contentPack), val); } public static AchievementWrapper<TAchievementDef, TUnlockableDef> DefineAchievementForSkill<TAchievementDef, TUnlockableDef>(this ContentPack contentPack, string identifier, ref Variant skillVariant1, ref Variant skillVariant2) where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { if ((Object)(object)skillVariant1.skillDef == (Object)null) { throw new ArgumentException("skillVariant1"); } TUnlockableDef val = DefineUnlockableForSkillImpl<TUnlockableDef>(skillVariant1.skillDef, contentPack); skillVariant1.unlockableDef = (UnlockableDef)(object)val; skillVariant2.unlockableDef = (UnlockableDef)(object)val; return new AchievementWrapper<TAchievementDef, TUnlockableDef>(DefineAchievementImpl<TAchievementDef>(identifier, (UnlockableDef)(object)val, contentPack), val); } public static AchievementWrapper DefineAchievementForSkill(this ContentPack contentPack, string identifier, SkillDef skill) { UnlockableDef val = DefineUnlockableForSkillImpl<UnlockableDef>(skill, contentPack); return new AchievementWrapper(DefineAchievementImpl<AchievementDef>(identifier, val, contentPack), val); } public static AchievementWrapper<TAchievementDef, TUnlockableDef> DefineAchievementForSkill<TAchievementDef, TUnlockableDef>(this ContentPack contentPack, string identifier, SkillDef skill) where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { TUnlockableDef val = DefineUnlockableForSkillImpl<TUnlockableDef>(skill, contentPack); return new AchievementWrapper<TAchievementDef, TUnlockableDef>(DefineAchievementImpl<TAchievementDef>(identifier, (UnlockableDef)(object)val, contentPack), val); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static TUnlockableDef DefineUnlockableForSkillImpl<TUnlockableDef>(SkillDef skill, ContentPack contentPack) where TUnlockableDef : UnlockableDef { return UnlockableExtensions.SetNameToken(contentPack.DefineUnlockable<TUnlockableDef>(UnlockableType.Skills, skill.skillName), skill.skillNameToken); } public static AchievementWrapper DefineAchievementForSkin(this ContentPack contentPack, string identifier, SkinDef skin) { UnlockableDef val = (skin.unlockableDef = UnlockableExtensions.SetNameToken<UnlockableDef>(contentPack.DefineUnlockable(UnlockableType.Skins, ((Object)skin).name), skin.nameToken)); return new AchievementWrapper(DefineAchievementImpl<AchievementDef>(identifier, val, contentPack), val); } public static AchievementWrapper<TAchievementDef, TUnlockableDef> DefineAchievementForSkin<TAchievementDef, TUnlockableDef>(this ContentPack contentPack, string identifier, SkinDef skin) where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { TUnlockableDef val = UnlockableExtensions.SetNameToken(contentPack.DefineUnlockable<TUnlockableDef>(UnlockableType.Skins, ((Object)skin).name), skin.nameToken); skin.unlockableDef = (UnlockableDef)(object)val; return new AchievementWrapper<TAchievementDef, TUnlockableDef>(DefineAchievementImpl<TAchievementDef>(identifier, (UnlockableDef)(object)val, contentPack), val); } public static AchievementWrapper DefineAchievementForUnlockable(this ContentPack contentPack, string identifier, UnlockableDef unlockable) { return new AchievementWrapper(DefineAchievementImpl<AchievementDef>(identifier, unlockable, contentPack), unlockable); } public static AchievementWrapper<TAchievementDef, TUnlockableDef> DefineAchievementForUnlockable<TAchievementDef, TUnlockableDef>(this ContentPack contentPack, string identifier, TUnlockableDef unlockable) where TAchievementDef : AchievementDef where TUnlockableDef : UnlockableDef { return new AchievementWrapper<TAchievementDef, TUnlockableDef>(DefineAchievementImpl<TAchievementDef>(identifier, (UnlockableDef)(object)unlockable, contentPack), unlockable); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static TAchievementDef DefineAchievementImpl<TAchievementDef>(string identifier, UnlockableDef unlockable, ContentPack contentPack) where TAchievementDef : AchievementDef { TAchievementDef achievement = Activator.CreateInstance<TAchievementDef>(); string prefix = GetPrefix(contentPack); ((AchievementDef)achievement).identifier = FormatAssetIdentifier(identifier, prefix); string text = identifier.ToUpperInvariant(); string tokenPrefix = prefix.ToUpperInvariant(); ((AchievementDef)achievement).nameToken = FormatToken("ACHIEVEMENT_" + text + "_NAME", tokenPrefix); ((AchievementDef)achievement).descriptionToken = FormatToken("ACHIEVEMENT_" + text + "_DESCRIPTION", tokenPrefix); ((AchievementDef)achievement).unlockableRewardIdentifier = unlockable.cachedName; unlockable.getHowToUnlockString = () => Language.GetStringFormatted("UNLOCK_VIA_ACHIEVEMENT_FORMAT", new object[2] { Language.GetString(((AchievementDef)achievement).nameToken), Language.GetString(((AchievementDef)achievement).descriptionToken) }); unlockable.getUnlockedString = () => Language.GetStringFormatted("UNLOCKED_FORMAT", new object[2] { Language.GetString(((AchievementDef)achievement).nameToken), Language.GetString(((AchievementDef)achievement).descriptionToken) }); SaferAchievementManager.OnCollectAchievementDefs += OnCollectAchievementDefs; return achievement; void OnCollectAchievementDefs(List<string> identifiers, Dictionary<string, AchievementDef> identifierToAchievementDef, List<AchievementDef> achievementDefs) { if (identifierToAchievementDef.ContainsKey(((AchievementDef)achievement).identifier)) { Debug.LogError((object)("Class " + ((AchievementDef)achievement).type.FullName + " attempted to register as achievement " + ((AchievementDef)achievement).identifier + ", but class " + identifierToAchievementDef[((AchievementDef)achievement).identifier].type.FullName + " has already registered as that achievement.")); } else { identifiers.Add(((AchievementDef)achievement).identifier); identifierToAchievementDef.Add(((AchievementDef)achievement).identifier, (AchievementDef)(object)achievement); achievementDefs.Add((AchievementDef)(object)achievement); } SaferAchievementManager.OnCollectAchievementDefs -= OnCollectAchievementDefs; } } } public record DifficultyWrapper : DifficultyWrapper<DifficultyWrapper, DifficultyDef> { public DifficultyWrapper(DifficultyDef DifficultyDef, DifficultyIndex DifficultyIndex) : base(DifficultyDef, DifficultyIndex) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) public new void Deconstruct(out DifficultyDef DifficultyDef, out DifficultyIndex DifficultyIndex) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected I4, but got Unknown DifficultyDef = base.DifficultyDef; DifficultyIndex = (DifficultyIndex)(int)base.DifficultyIndex; } } public record DifficultyWrapper<TDifficultyDef> : DifficultyWrapper<DifficultyWrapper<TDifficultyDef>, TDifficultyDef> where TDifficultyDef : DifficultyDef { public DifficultyWrapper(TDifficultyDef DifficultyDef, DifficultyIndex DifficultyIndex) : base(DifficultyDef, DifficultyIndex) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) public new void Deconstruct(out TDifficultyDef DifficultyDef, out DifficultyIndex DifficultyIndex) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected I4, but got Unknown DifficultyDef = base.DifficultyDef; DifficultyIndex = (DifficultyIndex)(int)base.DifficultyIndex; } } public abstract record DifficultyWrapper<TDifficultyWrapper, TDifficultyDef>(TDifficultyDef DifficultyDef, DifficultyIndex DifficultyIndex) where TDifficultyWrapper : DifficultyWrapper<TDifficultyWrapper, TDifficultyDef> where TDifficultyDef : DifficultyDef { public string NameToken => ((DifficultyDef)DifficultyDef).nameToken; public string DescriptionToken => ((DifficultyDef)DifficultyDef).descriptionToken; [MethodImpl(MethodImplOptions.AggressiveInlining)] public TDifficultyWrapper SetScalingValue(float scalingValue) { ((DifficultyDef)DifficultyDef).scalingValue = scalingValue; return this as TDifficultyWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TDifficultyWrapper SetIconSprite(Sprite iconSprite) { ((DifficultyDef)DifficultyDef).iconSprite = iconSprite; ((DifficultyDef)DifficultyDef).foundIconSprite = true; return this as TDifficultyWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TDifficultyWrapper SetColor(Color color) { //IL_000b: 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) ((DifficultyDef)DifficultyDef).color = color; return this as TDifficultyWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TDifficultyWrapper SetServerTag(string serverTag) { ((DifficultyDef)DifficultyDef).serverTag = serverTag; return this as TDifficultyWrapper; } public TDifficultyWrapper SetFlags(DifficultyFlags flags) { ((DifficultyDef)DifficultyDef).countsAsHardMode = (flags & DifficultyFlags.HardMode) > DifficultyFlags.None; if ((flags & DifficultyFlags.Hidden) > DifficultyFlags.None) { DifficultyAPI.hiddenDifficulties.Add((DifficultyDef)(object)DifficultyDef); } else { DifficultyAPI.hiddenDifficulties.Remove((DifficultyDef)(object)DifficultyDef); } return this as TDifficultyWrapper; } protected virtual bool PrintMembers(StringBuilder builder) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) builder.Append("DifficultyDef"); builder.Append(" = "); builder.Append(DifficultyDef); builder.Append(", "); builder.Append("DifficultyIndex"); builder.Append(" = "); DifficultyIndex difficultyIndex = DifficultyIndex; builder.Append(((object)(DifficultyIndex)(ref difficultyIndex)).ToString()); builder.Append(", "); builder.Append("NameToken"); builder.Append(" = "); builder.Append((object?)NameToken); builder.Append(", "); builder.Append("DescriptionToken"); builder.Append(" = "); builder.Append((object?)DescriptionToken); return true; } public void Deconstruct(out TDifficultyDef DifficultyDef, out DifficultyIndex DifficultyIndex) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected I4, but got Unknown DifficultyDef = this.DifficultyDef; DifficultyIndex = (DifficultyIndex)(int)this.DifficultyIndex; } } public record EliteWrapper : EliteWrapper<EliteWrapper, EliteDef, EquipmentDef, BuffDef> { public EliteWrapper(EliteDef EliteDef, List<EliteDef> SubEliteDefs, EquipmentDef EliteEquipmentDef, BuffDef EliteBuffDef) : base(EliteDef, SubEliteDefs, EliteEquipmentDef, EliteBuffDef) { } public new void Deconstruct(out EliteDef EliteDef, out List<EliteDef> SubEliteDefs, out EquipmentDef EliteEquipmentDef, out BuffDef EliteBuffDef) { EliteDef = base.EliteDef; SubEliteDefs = base.SubEliteDefs; EliteEquipmentDef = base.EliteEquipmentDef; EliteBuffDef = base.EliteBuffDef; } } public record EliteWrapper<TEliteDef, TEquipmentDef, TBuffDef> : EliteWrapper<EliteWrapper<TEliteDef, TEquipmentDef, TBuffDef>, TEliteDef, TEquipmentDef, TBuffDef> where TEliteDef : EliteDef where TEquipmentDef : EquipmentDef where TBuffDef : BuffDef { public EliteWrapper(TEliteDef EliteDef, List<TEliteDef> SubEliteDefs, TEquipmentDef EliteEquipmentDef, TBuffDef EliteBuffDef) : base(EliteDef, SubEliteDefs, EliteEquipmentDef, EliteBuffDef) { } public new void Deconstruct(out TEliteDef EliteDef, out List<TEliteDef> SubEliteDefs, out TEquipmentDef EliteEquipmentDef, out TBuffDef EliteBuffDef) { EliteDef = base.EliteDef; SubEliteDefs = base.SubEliteDefs; EliteEquipmentDef = base.EliteEquipmentDef; EliteBuffDef = base.EliteBuffDef; } } public abstract record EliteWrapper<TEliteWrapper, TEliteDef, TEquipmentDef, TBuffDef>(TEliteDef EliteDef, List<TEliteDef> SubEliteDefs, TEquipmentDef EliteEquipmentDef, TBuffDef EliteBuffDef) where TEliteWrapper : EliteWrapper<TEliteWrapper, TEliteDef, TEquipmentDef, TBuffDef> where TEliteDef : EliteDef where TEquipmentDef : EquipmentDef where TBuffDef : BuffDef { public string ModifierToken => ((EliteDef)EliteDef).modifierToken; public Action<EliteDef> registerSubEliteCallback; public string subElitePrefix; private Texture2D _eliteRampTexture; [MethodImpl(MethodImplOptions.AggressiveInlining)] public TEliteWrapper SetStats(EliteStats stats) { ((EliteDef)EliteDef).healthBoostCoefficient = stats.healthBoostCoefficient; ((EliteDef)EliteDef).damageBoostCoefficient = stats.damageBoostCoefficient; return this as TEliteWrapper; } public TEliteWrapper SetEliteRampTexture(Texture2D eliteRampTexture) { EliteRamp.AddRampToMultipleElites((IEnumerable<EliteDef>)SubEliteDefs.Prepend(EliteDef), eliteRampTexture); _eliteRampTexture = eliteRampTexture; return this as TEliteWrapper; } public TEliteWrapper DefineSubElite(string identifier, EliteStats stats, params EliteTierDef[] subEliteTiers) { //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) TEliteDef val = ScriptableObject.CreateInstance<TEliteDef>(); ((Object)(object)val).name = (string.IsNullOrEmpty(subElitePrefix) ? identifier : ContentPackExtensions.FormatAssetIdentifier(identifier, subElitePrefix)); ((EliteDef)val).modifierToken = ((EliteDef)EliteDef).modifierToken; ((EliteDef)val).eliteEquipmentDef = ((EliteDef)EliteDef).eliteEquipmentDef; ((EliteDef)val).shaderEliteRampIndex = ((EliteDef)EliteDef).shaderEliteRampIndex; ((EliteDef)val).color = ((EliteDef)EliteDef).color; if (Object.op_Implicit((Object)(object)_eliteRampTexture)) { EliteRamp.AddRamp((EliteDef)(object)val, _eliteRampTexture); } ((EliteDef)val).healthBoostCoefficient = stats.healthBoostCoefficient; ((EliteDef)val).damageBoostCoefficient = stats.damageBoostCoefficient; for (int i = 0; i < subEliteTiers.Length; i++) { subEliteTiers[i].AddElite((EliteDef)(object)val); } registerSubEliteCallback?.Invoke((EliteDef)(object)val); SubEliteDefs.Add(val); return this as TEliteWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TEliteWrapper SetEliteEquipmentIconSprite(Sprite iconSprite) { ((EquipmentDef)EliteEquipmentDef).pickupIconSprite = iconSprite; return this as TEliteWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TEliteWrapper SetEliteEquipmentPickupModelPrefab(GameObject pickupModelPrefab) { ((EquipmentDef)EliteEquipmentDef).pickupModelPrefab = pickupModelPrefab; return this as TEliteWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TEliteWrapper SetEliteBuffIconSprite(Sprite iconSprite, Color spriteColor) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) ((BuffDef)EliteBuffDef).iconSprite = iconSprite; ((BuffDef)EliteBuffDef).buffColor = spriteColor; return this as TEliteWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TEliteWrapper SetEliteBuffIconSprite(Sprite iconSprite) { ((BuffDef)EliteBuffDef).iconSprite = iconSprite; return this as TEliteWrapper; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TEliteWrapper SetEliteBuffStartSfx(NetworkSoundEventDef startSfx) { ((BuffDef)EliteBuffDef).startSfx = startSfx; return this as TEliteWrapper; } protected virtual bool PrintMembers(StringBuilder builder) { builder.Append("EliteDef"); builder.Append(" = "); builder.Append(EliteDef); builder.Append(", "); builder.Append("SubEliteDefs"); builder.Append(" = "); builder.Append(SubEliteDefs); builder.Append(", "); builder.Append("EliteEquipmentDef"); builder.Append(" = "); builder.Append(EliteEquipmentDef); builder.Append(", "); builder.Append("EliteBuffDef"); builder.Append(" = "); builder.Append(EliteBuffDef); builder.Append(", "); builder.Append("registerSubEliteCallback"); builder.Append(" = "); builder.Append(registerSubEliteCallback); builder.Append(", "); builder.Append("subElitePrefix"); builder.Append(" = "); builder.Append((object?)subElitePrefix); builder.Append(", "); builder.Append("ModifierToken"); builder.Append(" = "); builder.Append((object?)ModifierToken); return true; } } public static class EquipmentExtensions { private static Dictionary<EquipmentDef, Func<EquipmentSlot, bool>> equipmentActivationFunctions; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TEquipmentDef SetIconSprite<TEquipmentDef>(this TEquipmentDef equipmentDef, Sprite iconSprite) where TEquipmentDef : EquipmentDef { ((EquipmentDef)equipmentDef).pickupIconSprite = iconSprite; return equipmentDef; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TEquipmentDef SetCooldown<TEquipmentDef>(this TEquipmentDef equipmentDef, float cooldown) where TEquipmentDef : EquipmentDef { ((EquipmentDef)equipmentDef).cooldown = cooldown; return equipmentDef; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TEquipmentDef SetPickupModelPrefab<TEquipmentDef>(this TEquipmentDef equipmentDef, GameObject pickupModelPrefab, ModelPanelParams logbookModelParams) where TEquipmentDef : EquipmentDef { ((EquipmentDef)equipmentDef).pickupModelPrefab = pickupModelPrefab; Ivyl.SetupModelPanelParameters(pickupModelPrefab, logbookModelParams); return equipmentDef; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TEquipmentDef SetPickupModelPrefab<TEquipmentDef>(this TEquipmentDef equipmentDef, GameObject pickupModelPrefab) where TEquipmentDef : EquipmentDef { ((EquipmentDef)equipmentDef).pickupModelPrefab = pickupModelPrefab;