Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of MoonstormSharedUtils v2.5.1
plugins/MSU.Runtime.dll
Decompiled 5 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.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Threading.Tasks; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using HG; using HG.Coroutines; using HG.Reflection; using IL.RoR2; using JetBrains.Annotations; using LoadingScreenFix; using MSU; using MSU.AddressReferencedAssets; using MSU.Config; using Mono.Cecil.Cil; using MonoMod.Cil; using Newtonsoft.Json; using On.RoR2; using On.RoR2.Items; using On.RoR2.UI; using R2API; using R2API.AddressReferencedAssets; using R2API.Networking; using R2API.Networking.Interfaces; using R2API.ScriptableObjects; using RiskOfOptions; using RiskOfOptions.Components.Panel; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.Achievements; using RoR2.ContentManagement; using RoR2.EntitlementManagement; using RoR2.ExpansionManagement; using RoR2.Items; using RoR2.Projectile; using RoR2.Skills; using RoR2.UI; using RoR2BepInExPack.VanillaFixes; using ShaderSwapper; using TMPro; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.Rendering; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.Serialization; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: InternalsVisibleTo("MoonstormSharedUtils", AllInternalsVisible = true)] [assembly: InternalsVisibleTo("MSU.Editor", AllInternalsVisible = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] namespace EntityStates.GameplayEvents { public class GameplayEventState : EntityState { public GameplayEvent gameplayEvent { get; private set; } public override void OnEnter() { ((EntityState)this).OnEnter(); gameplayEvent = ((EntityState)this).GetComponent<GameplayEvent>(); } } } namespace MSU { [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class AsyncAssetLoadAttribute : SearchableAttribute { public MethodInfo targetMethodInfo => ((SearchableAttribute)this).target as MethodInfo; [Obsolete("Use \"CreateParallelCoroutineForMod\"")] public static ParallelMultiStartCoroutine CreateCoroutineForMod(BaseUnityPlugin plugin) { List<SearchableAttribute> instances = SearchableAttribute.GetInstances<AsyncAssetLoadAttribute>(); if (instances == null) { return new ParallelMultiStartCoroutine(); } return CreateMultiStartCoroutineForMod((from att in instances.Where(IsValid) where IsFromMod((AsyncAssetLoadAttribute)(object)att, plugin) select att).Cast<AsyncAssetLoadAttribute>().ToList()); } public static ParallelCoroutine CreateParallelCoroutineForMod(BaseUnityPlugin plugin) { List<SearchableAttribute> instances = SearchableAttribute.GetInstances<AsyncAssetLoadAttribute>(); if (instances == null) { return new ParallelCoroutine(); } return CreateCoroutineForMod((from att in instances.Where(IsValid) where IsFromMod((AsyncAssetLoadAttribute)(object)att, plugin) select att).Cast<AsyncAssetLoadAttribute>().ToList()); } [Obsolete] private static ParallelMultiStartCoroutine CreateMultiStartCoroutineForMod(List<AsyncAssetLoadAttribute> attributes) { ParallelMultiStartCoroutine parallelMultiStartCoroutine = new ParallelMultiStartCoroutine(); foreach (AsyncAssetLoadAttribute attribute in attributes) { parallelMultiStartCoroutine.Add((Func<IEnumerator>)attribute.targetMethodInfo.CreateDelegate(typeof(Func<IEnumerator>))); } return parallelMultiStartCoroutine; } private static ParallelCoroutine CreateCoroutineForMod(List<AsyncAssetLoadAttribute> attributes) { ParallelCoroutine parallelCoroutine = new ParallelCoroutine(); foreach (AsyncAssetLoadAttribute attribute in attributes) { parallelCoroutine.Add((IEnumerator)attribute.targetMethodInfo.Invoke(null, null)); } return parallelCoroutine; } private static bool IsValid(SearchableAttribute _att) { if (!(_att is AsyncAssetLoadAttribute asyncAssetLoadAttribute)) { return false; } MethodInfo methodInfo = asyncAssetLoadAttribute.targetMethodInfo; if (!methodInfo.IsStatic) { MSULog.Info($"{asyncAssetLoadAttribute} is not applied to a Static method", 86, "IsValid"); } Type returnType = methodInfo.ReturnType; if (returnType == null || returnType == typeof(void)) { return false; } returnType.IsSameOrSubclassOf(typeof(IEnumerator)); if (methodInfo.GetGenericArguments().Length != 0) { return false; } return true; } private static bool IsFromMod(AsyncAssetLoadAttribute attribute, BaseUnityPlugin plugin) { return attribute.targetMethodInfo.DeclaringType.Assembly == ((object)plugin).GetType().Assembly; } public override string ToString() { return "AsyncAssetLoadAttribute(TargetMethod=" + targetMethodInfo.DeclaringType.FullName + "." + targetMethodInfo.Name + "())"; } } public abstract class BaseBuffBehaviour : MonoBehaviour { [AttributeUsage(AttributeTargets.Method)] public class BuffDefAssociation : SearchableAttribute { } private int _buffCount; public int buffCount { get { return _buffCount; } internal set { if (_buffCount != value) { int num = _buffCount; _buffCount = value; if (num == 0 && _buffCount > 0) { ((Behaviour)this).enabled = true; OnFirstStackGained(); } if (num > 0 && _buffCount == 0) { ((Behaviour)this).enabled = false; OnAllStacksLost(); } } } } public BuffIndex buffIndex { get; internal set; } public CharacterBody characterBody { get; internal set; } public bool hasAnyStacks => _buffCount > 0; protected virtual void OnFirstStackGained() { } protected virtual void OnAllStacksLost() { } protected virtual void Awake() { characterBody = ((Component)this).GetComponent<CharacterBody>(); } protected virtual void OnDestroy() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) MSUContentManagement.OnBuffBehaviourDestroyed(characterBody, buffIndex); } } public abstract class BaseItemMasterBehaviour : MonoBehaviour { private struct NetworkContextSet { public ItemTypePair[] itemTypePairs; public FixedSizeArrayPool<BaseItemMasterBehaviour> behaviorArraysPool; public void SetItemTypePairs(List<ItemTypePair> itemTypePairs) { this.itemTypePairs = itemTypePairs.ToArray(); behaviorArraysPool = new FixedSizeArrayPool<BaseItemMasterBehaviour>(this.itemTypePairs.Length); } } [MeansImplicitUse] [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class ItemDefAssociationAttribute : SearchableAttribute { public Type behaviorTypeOverride; public bool useOnServer = true; public bool useOnClient = true; public string GetMethodName() { if (((SearchableAttribute)this).target is MethodInfo methodInfo) { return methodInfo.DeclaringType.FullName + "." + methodInfo.Name + "()"; } return "NOT ON A METHOD"; } } public int stack; private static NetworkContextSet _server; private static NetworkContextSet _client; private static NetworkContextSet _shared; private static CharacterMaster _earlyAssignmentMaster = null; private static Dictionary<UnityObjectWrapperKey<CharacterMaster>, BaseItemMasterBehaviour[]> _masterToItemBehaviors = new Dictionary<UnityObjectWrapperKey<CharacterMaster>, BaseItemMasterBehaviour[]>(); public CharacterMaster master { get; private set; } protected virtual void Awake() { master = _earlyAssignmentMaster; _earlyAssignmentMaster = null; } [SystemInitializer(new Type[] { typeof(ItemCatalog) })] private static IEnumerator Init() { MSULog.Info("Initializing the BaseItemMasterBehaviour system...", 37, "Init"); List<ItemTypePair> server = new List<ItemTypePair>(); List<ItemTypePair> client = new List<ItemTypePair>(); List<ItemTypePair> shared = new List<ItemTypePair>(); List<ItemDefAssociationAttribute> list = new List<ItemDefAssociationAttribute>(); SearchableAttribute.GetInstances<ItemDefAssociationAttribute>(list); Type masterBehaviourType = typeof(BaseItemMasterBehaviour); Type itemDefType = typeof(ItemDef); foreach (ItemDefAssociationAttribute itemDefAssociationAttribute in list) { yield return null; if (!(((SearchableAttribute)itemDefAssociationAttribute).target is MethodInfo methodInfo)) { MSULog.Error("ItemDefAssociationAttribute cannot be applied to object of type \"" + ((itemDefAssociationAttribute != null) ? ((SearchableAttribute)itemDefAssociationAttribute).target.GetType().FullName : null) + "\"", 52, "Init"); continue; } if (!methodInfo.IsStatic) { MSULog.Error("ItemDefAssociationAttribute cannot be applied to method \"" + itemDefAssociationAttribute.GetMethodName() + "\", as the method is not static.", 58, "Init"); continue; } Type type = itemDefAssociationAttribute.behaviorTypeOverride ?? methodInfo.DeclaringType; if (!masterBehaviourType.IsAssignableFrom(type)) { MSULog.Error("ItemDefAssociationAttribute cannot be applied to method \"" + itemDefAssociationAttribute.GetMethodName() + "\", as " + type.FullName + " does not derive from " + masterBehaviourType.FullName, 65, "Init"); continue; } if (type.IsAbstract) { MSULog.Error("ItemDefAssociationAttribute cannot be applied to method " + itemDefAssociationAttribute.GetMethodName() + ", as " + type.FullName + " is an abstract type.", 71, "Init"); continue; } if (!itemDefType.IsAssignableFrom(methodInfo.ReturnType)) { MSULog.Error("ItemDefAssociationAttribute cannot be applied to method " + itemDefAssociationAttribute.GetMethodName() + ", as the method returns type " + (((methodInfo.ReturnType != null) ? methodInfo.ReturnType.FullName : null) ?? "void") + " instead of " + itemDefType.FullName, 77, "Init"); continue; } if (methodInfo.GetGenericArguments().Length != 0) { MSULog.Error("ItemDefASsociationAttribute cannot be applied to method " + itemDefAssociationAttribute.GetMethodName() + ", as the method must take no arguments.", 83, "Init"); continue; } ItemDef val = (ItemDef)methodInfo.Invoke(null, Array.Empty<object>()); if (Object.op_Implicit((Object)(object)val) && (int)val.itemIndex != -1) { if (itemDefAssociationAttribute.useOnServer) { server.Add(new ItemTypePair { itemIndex = val.itemIndex, behaviorType = type }); } if (itemDefAssociationAttribute.useOnClient) { client.Add(new ItemTypePair { itemIndex = val.itemIndex, behaviorType = type }); } if (itemDefAssociationAttribute.useOnServer || itemDefAssociationAttribute.useOnClient) { shared.Add(new ItemTypePair { itemIndex = val.itemIndex, behaviorType = type }); } } } _server.SetItemTypePairs(server); _client.SetItemTypePairs(client); _shared.SetItemTypePairs(shared); if (server.Count != 0 || client.Count != 0 || shared.Count != 0) { CharacterMaster.Awake += new hook_Awake(CharacterMaster_Awake); CharacterMaster.OnDestroy += new hook_OnDestroy(CharacterMaster_OnDestroy); CharacterMaster.OnInventoryChanged += new hook_OnInventoryChanged(CharacterMaster_OnInventoryChanged); } } private static void CharacterMaster_Awake(orig_Awake orig, CharacterMaster self) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) BaseItemMasterBehaviour[] value = GetNetworkContext().behaviorArraysPool.Request(); _masterToItemBehaviors.Add(UnityObjectWrapperKey<CharacterMaster>.op_Implicit(self), value); orig.Invoke(self); } 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_0034: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); BaseItemMasterBehaviour[] array = _masterToItemBehaviors[UnityObjectWrapperKey<CharacterMaster>.op_Implicit(self)]; for (int i = 0; i < array.Length; i++) { Object.Destroy((Object)(object)array[i]); } _masterToItemBehaviors.Remove(UnityObjectWrapperKey<CharacterMaster>.op_Implicit(self)); if (NetworkServer.active || NetworkClient.active) { GetNetworkContext().behaviorArraysPool.Return(array, (ClearType<BaseItemMasterBehaviour>)0); } } private static void CharacterMaster_OnInventoryChanged(orig_OnInventoryChanged orig, CharacterMaster self) { orig.Invoke(self); UpdateMasterItemBehaviorStacks(self); } private static ref NetworkContextSet GetNetworkContext() { bool active = NetworkServer.active; bool active2 = NetworkClient.active; if (active) { if (active2) { return ref _shared; } return ref _server; } if (active2) { return ref _client; } throw new InvalidOperationException("Neither server nor client is running."); } private static void UpdateMasterItemBehaviorStacks(CharacterMaster master) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) ref NetworkContextSet networkContext = ref GetNetworkContext(); if (!_masterToItemBehaviors.TryGetValue(UnityObjectWrapperKey<CharacterMaster>.op_Implicit(master), out var value)) { return; } ItemTypePair[] itemTypePairs = networkContext.itemTypePairs; Inventory inventory = master.inventory; 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 BaseItemMasterBehaviour reference = ref value[j]; if ((Object)(object)reference != (Object)null) { Object.Destroy((Object)(object)reference); reference = null; } } } private static void SetItemStack(CharacterMaster master, ref BaseItemMasterBehaviour 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 = (BaseItemMasterBehaviour)(object)((Component)master).gameObject.AddComponent(behaviorType); _earlyAssignmentMaster = null; } } if ((Object)(object)behavior != (Object)null) { behavior.stack = stack; } } } public sealed class GameplayEvent : NetworkBehaviour { [Tooltip("When set to true, this gameplay event will call \"StartEvent\" on it's Start method")] [SyncVar] public bool beginOnStart; [Header("Gameplay Event Metadata")] [SyncVar] [Tooltip("When the event does an announcement, the announcement duration of the text will be this value. This value can be overwritten by the GameplayEventManager's spawn method at runtime.")] [SerializeField] private float _announcementDuration = 6f; [SerializeField] [SyncVar] [Tooltip("Is this value is greater than 0, the event will automatically stop once it has existed for this duration.")] private float _eventDuration = -1f; [Tooltip("When the event starts, this Token is used to inform the players.")] [SerializeField] private string _eventStartToken; [Tooltip("When the event starts, this sound effect is played to inform the players.")] [SerializeField] private NetworkSoundEventDef _eventStartSfx; [Tooltip("When the event ends, this token is used to inform the players.")] [SerializeField] private string _eventEndToken; [Tooltip("When the event ends, this sound effect is played to inform the players.")] [SerializeField] private NetworkSoundEventDef _eventEndSfx; [Tooltip("This color is used for the messages displayed when the event starts and ends. An outline color is calculated automatically.")] [SerializeField] private Color _eventColor; [Space] [Header("Gameplay Event Hooks")] [Tooltip("Called when this specific event begins")] [SerializeField] private UnityGameplayEvent _onEventStart; [Tooltip("Called when this specific event ends")] [SerializeField] private UnityGameplayEvent _onEventEnd; [SyncVar(hook = "Client_OnIsPlayingChanged")] private bool _isPlaying; [SyncVar] private bool _doNotAnnounceStart; [SyncVar] private bool _doNotAnnounceEnd; private float _eventDurationStopwatch; public float announcementDuration { get { return _announcementDuration; } set { Network_announcementDuration = value; } } public float eventDuration { get { return _eventDuration; } set { Network_eventDuration = value; } } public string eventStartToken => _eventStartToken; public NetworkSoundEventDef eventStartSfx => _eventStartSfx; public string eventEndToken => _eventEndToken; public NetworkSoundEventDef eventEndSfx => _eventEndSfx; public Color eventColor => _eventColor; [field: NonSerialized] public GameplayEventIndex gameplayEventIndex { get; internal set; } public bool isPlaying { get { return _isPlaying; } private set { Network_isPlaying = value; } } public bool doNotAnnounceStart { get { return _doNotAnnounceStart; } set { Network_doNotAnnounceStart = value; } } public bool doNotAnnounceEnd { get { return _doNotAnnounceEnd; } set { Network_doNotAnnounceEnd = value; } } public EntityStateIndex? customTextStateIndex { get; set; } public GenericObjectIndex? customTMPFontAssetIndex { get; set; } public NullableRef<GameplayEventRequirement> gameplayEventRequirement { get; private set; } public bool NetworkbeginOnStart { get { return beginOnStart; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<bool>(value, ref beginOnStart, 1u); } } public float Network_announcementDuration { get { return _announcementDuration; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<float>(value, ref _announcementDuration, 2u); } } public float Network_eventDuration { get { return _eventDuration; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<float>(value, ref _eventDuration, 4u); } } public bool Network_isPlaying { get { return _isPlaying; } [param: In] set { ref bool reference = ref _isPlaying; if (NetworkServer.localClientActive && !((NetworkBehaviour)this).syncVarHookGuard) { ((NetworkBehaviour)this).syncVarHookGuard = true; Client_OnIsPlayingChanged(value); ((NetworkBehaviour)this).syncVarHookGuard = false; } ((NetworkBehaviour)this).SetSyncVar<bool>(value, ref reference, 8u); } } public bool Network_doNotAnnounceStart { get { return _doNotAnnounceStart; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<bool>(value, ref _doNotAnnounceStart, 16u); } } public bool Network_doNotAnnounceEnd { get { return _doNotAnnounceEnd; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<bool>(value, ref _doNotAnnounceEnd, 32u); } } public static event GameplayEventDelegate onEventStartServer; public static event GameplayEventDelegate onEventStartGlobal; public event GameplayEventDelegate onEventStart; public static event GameplayEventDelegate onEventEndServer; public static event GameplayEventDelegate onEventEndGlobal; public event GameplayEventDelegate onEventEnd; private void Awake() { InstanceTracker.Add<GameplayEvent>(this); gameplayEventRequirement = ((Component)this).GetComponent<GameplayEventRequirement>(); } private void Start() { if (beginOnStart && !isPlaying && NetworkServer.active) { StartEvent(); } } private void OnDestroy() { if (isPlaying && NetworkServer.active) { EndEvent(); } InstanceTracker.Remove<GameplayEvent>(this); } [Server] public void StartEvent() { if (!NetworkServer.active) { Debug.LogWarning((object)"[Server] function 'System.Void MSU.GameplayEvent::StartEvent()' called on client"); } else if (!isPlaying) { _eventDurationStopwatch = 0f; isPlaying = true; GameplayEvent.onEventStartServer?.Invoke(this); GameplayEvent.onEventStartGlobal?.Invoke(this); this.onEventStart?.Invoke(this); ((UnityEvent<GameplayEvent>)_onEventStart)?.Invoke(this); AnnounceEvent(); } } private void FixedUpdate() { if (NetworkServer.active && !(eventDuration < 0f) && isPlaying) { _eventDurationStopwatch += Time.fixedDeltaTime; if (_eventDurationStopwatch > eventDuration) { EndEvent(); } } } [Server] public void EndEvent() { if (!NetworkServer.active) { Debug.LogWarning((object)"[Server] function 'System.Void MSU.GameplayEvent::EndEvent()' called on client"); } else if (isPlaying) { _eventDurationStopwatch = 0f; isPlaying = false; GameplayEvent.onEventEndServer?.Invoke(this); GameplayEvent.onEventEndGlobal?.Invoke(this); this.onEventEnd?.Invoke(this); ((UnityEvent<GameplayEvent>)_onEventEnd)?.Invoke(this); AnnounceEvent(); } } private void AnnounceEvent() { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) if ((!isPlaying || !doNotAnnounceStart) && (isPlaying || !doNotAnnounceEnd) && Object.op_Implicit((Object)(object)GameplayEventTextController.instance)) { GameplayEventTextController.EventTextRequest request = default(GameplayEventTextController.EventTextRequest); if (customTextStateIndex.HasValue) { request.customTextState = new SerializableEntityStateType(EntityStateCatalog.GetStateType(customTextStateIndex.Value)); } if (customTMPFontAssetIndex.HasValue) { request.genericObjectIndexThatPointsToTMP_FontAsset = customTMPFontAssetIndex.Value; } request.textDuration = announcementDuration; request.eventToken = eventStartToken; request.eventColor = eventColor; GameplayEventTextController.instance.EnqueueNewTextRequest(request, sendOverNetwork: false); } } [Client] private void Client_OnIsPlayingChanged(bool newVal) { if (!NetworkClient.active) { Debug.LogWarning((object)"[Client] function 'System.Void MSU.GameplayEvent::Client_OnIsPlayingChanged(System.Boolean)' called on server"); return; } if (newVal) { GameplayEvent.onEventStartGlobal?.Invoke(this); this.onEventStart?.Invoke(this); ((UnityEvent<GameplayEvent>)_onEventStart).Invoke(this); } else { GameplayEvent.onEventEndGlobal?.Invoke(this); this.onEventEnd?.Invoke(this); ((UnityEvent<GameplayEvent>)_onEventEnd)?.Invoke(this); } AnnounceEvent(); } public override bool OnSerialize(NetworkWriter writer, bool initialState) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) if (!initialState) { return false; } writer.Write(customTextStateIndex.HasValue); if (customTextStateIndex.HasValue) { NetworkExtensions.Write(writer, customTextStateIndex.Value); } writer.Write(customTMPFontAssetIndex.HasValue); if (customTMPFontAssetIndex.HasValue) { writer.Write(customTMPFontAssetIndex.Value); } return true; } public override void OnDeserialize(NetworkReader reader, bool initialState) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) if (initialState) { if (reader.ReadBoolean()) { customTextStateIndex = NetworkExtensions.ReadEntityStateIndex(reader); } if (reader.ReadBoolean()) { customTMPFontAssetIndex = reader.ReadGenericObjectIndex(); } } } private void UNetVersion() { } public override void PreStartClient() { } } [Serializable] public class UnityGameplayEvent : UnityEvent<GameplayEvent> { } public delegate void GameplayEventDelegate(GameplayEvent gameplayEvent); [RequireComponent(typeof(GameplayEvent))] public class GameplayEventRequirement : MonoBehaviour { [Tooltip("At least this amount of stages should be completed before this GameplayEvent can spawn")] public int minimumStageCompletions = -1; [Tooltip("At least someone in the player team needs to have this unlockable unlocked before this GameplayEvent can spawn")] public AddressReferencedUnlockableDef requiredUnlockable; [Tooltip("None of the players should have this unlockable unlocked before this GameplayEvent can spawn")] public AddressReferencedUnlockableDef forbiddenUnlockable; [Tooltip("These ExpansionDefs need to be enabled in the run for this GameplayEvent to spawn")] public List<AddressReferencedExpansionDef> requiredExpansions; [Tooltip("The teleporter's charge needs to be bellow this value for a GameplayEvent to spawn")] [Range(0f, 1f)] public float maximumTeleportCharge = 0.25f; public GameplayEvent gameplayEvent { get; private set; } protected virtual void Awake() { gameplayEvent = ((Component)this).GetComponent<GameplayEvent>(); } public virtual bool IsAvailable() { if (!Object.op_Implicit((Object)(object)Run.instance)) { return false; } if (CheckStageCompletions() && CheckUnlockables() && CheckExpansions()) { return CheckTeleporterCharge(); } return false; } protected bool CheckStageCompletions() { if (!Object.op_Implicit((Object)(object)Run.instance)) { return false; } if (minimumStageCompletions == -1) { return true; } return Run.instance.stageClearCount > minimumStageCompletions; } protected bool CheckUnlockables() { bool num = !AddressReferencedUnlockableDef.op_Implicit(requiredUnlockable) || Run.instance.IsUnlockableUnlocked(AddressReferencedUnlockableDef.op_Implicit(requiredUnlockable)); bool flag = AddressReferencedUnlockableDef.op_Implicit(forbiddenUnlockable) && Run.instance.DoesEveryoneHaveThisUnlockableUnlocked(AddressReferencedUnlockableDef.op_Implicit(forbiddenUnlockable)); if (num) { return !flag; } return false; } protected bool CheckExpansions() { foreach (AddressReferencedExpansionDef requiredExpansion in requiredExpansions) { if (AddressReferencedExpansionDef.op_Implicit(requiredExpansion) && !Run.instance.IsExpansionEnabled(AddressReferencedExpansionDef.op_Implicit(requiredExpansion))) { return false; } } return true; } protected bool CheckTeleporterCharge() { if (!Object.op_Implicit((Object)(object)TeleporterInteraction.instance)) { return true; } return TeleporterInteraction.instance.chargeFraction < maximumTeleportCharge; } } public sealed class GameplayEventTextController : MonoBehaviour { public struct EventTextRequest { public string eventToken; public Color eventColor; public float textDuration; public SerializableEntityStateType? customTextState; public GenericObjectIndex genericObjectIndexThatPointsToTMP_FontAsset; public string tokenValue => Language.GetString(eventToken); public Color GetBestOutlineColor() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) float num = default(float); float num2 = default(float); float num3 = default(float); Color.RGBToHSV(eventColor, ref num, ref num2, ref num3); float num4 = ((num3 > 0.5f) ? (-0.5f) : 0.5f); float num5 = Mathf.Clamp01(num2 + num4); float num6 = Mathf.Clamp01(num3 + num4); return Color.HSVToRGB(num, num5, num6); } } public abstract class EventTextState : EntityState { public float duration; public GameplayEventTextController textController { get; private set; } public UIJuice uiJuice { get; private set; } public override void OnEnter() { ((EntityState)this).OnEnter(); textController = ((EntityState)this).GetComponent<GameplayEventTextController>(); uiJuice = ((EntityState)this).GetComponent<UIJuice>(); } protected virtual void NullRequest() { textController.NullCurrentRequest(); } } public class FadeInState : EventTextState { public override void OnEnter() { base.OnEnter(); base.uiJuice.destroyOnEndOfTransition = false; base.uiJuice.transitionDuration = duration; base.uiJuice.TransitionAlphaFadeIn(); base.uiJuice.originalAlpha = MSUConfig._maxOpacityForEventMessage; base.uiJuice.transitionEndAlpha = 1f; } public override void Update() { ((EntityState)this).Update(); if (((EntityState)this).age > duration) { ((EntityState)this).outer.SetNextState((EntityState)(object)new WaitState { duration = duration }); } } } public class WaitState : EventTextState { public override void Update() { ((EntityState)this).Update(); if (((EntityState)this).age > duration) { ((EntityState)this).outer.SetNextState((EntityState)(object)new FadeOutState { duration = duration }); } } } public class FadeOutState : EventTextState { public override void OnEnter() { base.OnEnter(); base.uiJuice.TransitionAlphaFadeOut(); } public override void Update() { ((EntityState)this).Update(); if (((EntityState)this).age > duration) { base.textController.NullCurrentRequest(); ((EntityState)this).outer.SetNextStateToMain(); } } } internal class SendEventTextRequestToClientsMessage : INetMessage, ISerializableObject { public EventTextRequest request; public void Deserialize(NetworkReader reader) { //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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) request = default(EventTextRequest); request.eventToken = reader.ReadString(); request.eventColor = reader.ReadColor(); request.textDuration = reader.ReadSingle(); if (reader.ReadBoolean()) { request.customTextState = new SerializableEntityStateType(EntityStateCatalog.GetStateType(NetworkExtensions.ReadEntityStateIndex(reader))); } request.genericObjectIndexThatPointsToTMP_FontAsset = reader.ReadGenericObjectIndex(); } public void OnReceived() { instance.EnqueueNewTextRequest(request, sendOverNetwork: false); } public void Serialize(NetworkWriter writer) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: 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) writer.Write(request.eventToken); writer.Write(request.eventColor); writer.Write(request.textDuration); writer.Write(request.customTextState.HasValue); if (request.customTextState.HasValue) { SerializableEntityStateType value = request.customTextState.Value; NetworkExtensions.Write(writer, EntityStateCatalog.GetStateIndex(((SerializableEntityStateType)(ref value)).stateType)); } writer.Write(request.genericObjectIndexThatPointsToTMP_FontAsset); } public SendEventTextRequestToClientsMessage(EventTextRequest request) { this.request = request; } public SendEventTextRequestToClientsMessage() { } } private static GameObject _prefab; private Queue<EventTextRequest> _textRequests = new Queue<EventTextRequest>(); private TMP_FontAsset _bombadierFontAsset; public static GameplayEventTextController instance { get; private set; } public EntityStateMachine textStateMachine { get; private set; } public HGTextMeshProUGUI textMeshProUGUI { get; private set; } public HUD hudInstance { get; private set; } public EventTextRequest? currentTextRequest { get; private set; } public RectTransform rectTransform { get; private set; } [SystemInitializer(new Type[] { })] private static IEnumerator SystemInit() { MSULog.Info("Initializing the GameplayEventTextController...", 59, "SystemInit"); AssetBundleRequest request = MSUMain.msuAssetBundle.LoadAssetAsync<GameObject>("GameplayEventText"); while (!((AsyncOperation)request).isDone) { yield return null; } Object asset = request.asset; _prefab = (GameObject)(object)((asset is GameObject) ? asset : null); HUD.Awake += new hook_Awake(SpawnAndGetInstance); MSUConfig._eventMessageFontSize.onConfigChanged += SetTextSize; MSUConfig._familyEventUsesEventAnnouncementInsteadOfChatMessage.onConfigChanged += ShouldAnnounceFamilyEventsAsGameplayEvents; NetworkingAPI.RegisterMessageType<SendEventTextRequestToClientsMessage>(); } private static void ShouldAnnounceFamilyEventsAsGameplayEvents(bool announceAsGameplayEvents) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown if (announceAsGameplayEvents) { ClassicStageInfo.BroadcastFamilySelection -= new hook_BroadcastFamilySelection(BroadcastFamilySelection); ClassicStageInfo.BroadcastFamilySelection += new hook_BroadcastFamilySelection(BroadcastFamilySelection); } else { ClassicStageInfo.BroadcastFamilySelection -= new hook_BroadcastFamilySelection(BroadcastFamilySelection); } } private static IEnumerator BroadcastFamilySelection(orig_BroadcastFamilySelection orig, ClassicStageInfo self, string familySelectionChatString) { if (!Object.op_Implicit((Object)(object)instance)) { yield return orig.Invoke(self, familySelectionChatString); yield break; } yield return (object)new WaitForSeconds(6f); instance.EnqueueNewTextRequest(new EventTextRequest { eventColor = Color.white, eventToken = familySelectionChatString, textDuration = 6f }, sendOverNetwork: true); } private static void SetTextSize(float newVal) { if (Object.op_Implicit((Object)(object)instance)) { ((TMP_Text)instance.textMeshProUGUI).fontSize = newVal; ((TMP_Text)instance.textMeshProUGUI).fontSizeMax = newVal; } } private static void SpawnAndGetInstance(orig_Awake orig, HUD self) { orig.Invoke(self); Object.Instantiate<GameObject>(_prefab, self.mainContainer.transform); instance.hudInstance = self; } [ConCommand(/*Could not decode attribute arguments.*/)] private static void CC_TestEventText(ConCommandArgs args) { //IL_0028: 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) if (Object.op_Implicit((Object)(object)instance)) { instance.EnqueueNewTextRequest(new EventTextRequest { eventToken = "Event Text Test", eventColor = Color.cyan, textDuration = 15f }, sendOverNetwork: true); } } public void EnqueueNewTextRequest(EventTextRequest request, bool sendOverNetwork) { if (sendOverNetwork) { SendRequestOverNetwork(request); } else { _textRequests.Enqueue(request); } } private void SendRequestOverNetwork(EventTextRequest request) { NetMessageExtensions.Send((INetMessage)(object)new SendEventTextRequestToClientsMessage(request), (NetworkDestination)3); } private void Update() { //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) if (!currentTextRequest.HasValue && _textRequests.Count > 0) { DequeueAndInitializeRequest(); } else if (currentTextRequest.HasValue && textStateMachine.state is Idle) { EventTextRequest value = currentTextRequest.Value; bool hasValue = value.customTextState.HasValue; EventTextState eventTextState = null; if (hasValue) { SerializableEntityStateType value2 = value.customTextState.Value; eventTextState = (EventTextState)(object)EntityStateCatalog.InstantiateState(ref value2); } else { eventTextState = new FadeInState(); } eventTextState.duration = (hasValue ? value.textDuration : (value.textDuration / 3f)); textStateMachine.SetNextState((EntityState)(object)eventTextState); } } internal void NullCurrentRequest() { currentTextRequest = null; } private void DequeueAndInitializeRequest() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) currentTextRequest = _textRequests.Dequeue(); string tokenValue = currentTextRequest.Value.tokenValue; Color eventColor = currentTextRequest.Value.eventColor; Color bestOutlineColor = currentTextRequest.Value.GetBestOutlineColor(); GenericObjectIndex genericObjectIndexThatPointsToTMP_FontAsset = currentTextRequest.Value.genericObjectIndexThatPointsToTMP_FontAsset; ((TMP_Text)textMeshProUGUI).text = tokenValue; ((Graphic)textMeshProUGUI).color = eventColor; ((TMP_Text)textMeshProUGUI).outlineColor = Color32.op_Implicit(bestOutlineColor); ((TMP_Text)textMeshProUGUI).font = ((genericObjectIndexThatPointsToTMP_FontAsset == GenericObjectIndex.None) ? HGTextMeshProUGUI.defaultLanguageFont : GenericUnityObjectCatalog.GetObject<TMP_FontAsset>(genericObjectIndexThatPointsToTMP_FontAsset)); rectTransform.anchoredPosition = Vector2.op_Implicit(new Vector3((float)MSUConfig._eventMessageXOffset, (float)MSUConfig._eventMessageYOffset)); } private void Start() { _bombadierFontAsset = ((TMP_Text)textMeshProUGUI).font; } private void Awake() { textStateMachine = ((Component)this).GetComponent<EntityStateMachine>(); textMeshProUGUI = ((Component)this).GetComponent<HGTextMeshProUGUI>(); rectTransform = ((Component)this).GetComponent<RectTransform>(); } private void OnEnable() { instance = this; ((TMP_Text)textMeshProUGUI).text = string.Empty; } private void OnDisable() { if ((Object)(object)instance == (Object)(object)this) { instance = null; } } } public class ItemTierPickupDisplayHelper : MonoBehaviour { private PickupDisplay _display; private GameObject _vfxInstance; private void Awake() { _display = ((Component)this).GetComponent<PickupDisplay>(); } public void RebuildCustomModel() { //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_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Invalid comparison between Unknown and I4 //IL_002f: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)_display)) { return; } PickupDef pickupDef = PickupCatalog.GetPickupDef(_display.GetPickupIndex()); if (pickupDef == null) { return; } ItemTier itemTier = pickupDef.itemTier; if ((int)itemTier > 11) { ItemTierDef itemTierDef = ItemTierCatalog.GetItemTierDef(itemTier); if (Object.op_Implicit((Object)(object)itemTierDef) && ItemTierModule._itemTierToPickupFX.TryGetValue(itemTierDef, out var value) && Object.op_Implicit((Object)(object)value)) { _vfxInstance = Object.Instantiate<GameObject>(value, ((Component)_display).transform.parent); } } } public void DestroyCustomModel() { if (Object.op_Implicit((Object)(object)_vfxInstance)) { Object.Destroy((Object)(object)_vfxInstance); } } } public sealed class MSUContentBehaviour : MonoBehaviour { public CharacterBody body; public MSUEliteBehaviour eliteBehaviour; private IStatItemBehavior[] _statItemBehaviors = Array.Empty<IStatItemBehavior>(); private IBodyStatArgModifier[] _bodyStatArgModifiers = Array.Empty<IBodyStatArgModifier>(); public bool hasMaster { get; private set; } private void Start() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) hasMaster = Object.op_Implicit((Object)(object)body.master); body.onInventoryChanged += CheckEquipmentAndStartGetInterfaces; EquipmentDef equipmentDef = EquipmentCatalog.GetEquipmentDef((EquipmentIndex)((!Object.op_Implicit((Object)(object)body.inventory)) ? (-1) : ((int)body.inventory.GetEquipmentIndex()))); if (Object.op_Implicit((Object)(object)equipmentDef) && EquipmentModule.allMoonstormEquipments.TryGetValue(equipmentDef, out var value)) { value.OnEquipmentObtained(body); if (Object.op_Implicit((Object)(object)equipmentDef.passiveBuffDef) && equipmentDef.passiveBuffDef.isElite) { eliteBehaviour.AssignNewIndex(equipmentDef.passiveBuffDef.eliteDef.eliteIndex); } } StartGetInterfaces(); } private void CheckEquipmentAndStartGetInterfaces() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) StartGetInterfaces(); if (!hasMaster) { return; } EquipmentDef equipmentDef = EquipmentCatalog.GetEquipmentDef(body.inventory.GetEquipmentIndex()); if (Object.op_Implicit((Object)(object)equipmentDef) && Object.op_Implicit((Object)(object)eliteBehaviour)) { if (!Object.op_Implicit((Object)(object)equipmentDef.passiveBuffDef) || !equipmentDef.passiveBuffDef.isElite) { eliteBehaviour.AssignNewIndex((EliteIndex)(-1)); } else { eliteBehaviour.AssignNewIndex(equipmentDef.passiveBuffDef.eliteDef.eliteIndex); } } } public void StartGetInterfaces() { ((MonoBehaviour)this).StartCoroutine(GetInterfaces()); } private IEnumerator GetInterfaces() { yield return null; _statItemBehaviors = ((Component)this).GetComponents<IStatItemBehavior>(); _bodyStatArgModifiers = ((Component)this).GetComponents<IBodyStatArgModifier>(); body.healthComponent.onIncomingDamageReceivers = ((Component)this).GetComponents<IOnIncomingDamageServerReceiver>(); body.healthComponent.onTakeDamageReceivers = ((Component)this).GetComponents<IOnTakeDamageServerReceiver>(); } internal void GetStatCoefficients(StatHookEventArgs args) { for (int i = 0; i < _bodyStatArgModifiers.Length; i++) { _bodyStatArgModifiers[i].ModifyStatArguments(args); } } internal void RecalculateStatsStart() { for (int i = 0; i < _statItemBehaviors.Length; i++) { _statItemBehaviors[i].RecalculateStatsStart(); } } internal void RecalculateStatsEnd() { for (int i = 0; i < _statItemBehaviors.Length; i++) { _statItemBehaviors[i].RecalculateStatsEnd(); } } private void OnDestroy() { Object.Destroy((Object)(object)eliteBehaviour); } } public sealed class MSUEliteBehaviour : MonoBehaviour { public CharacterBody body; public CharacterModel characterModel; private GameObject _effectInstance; private EliteIndex _assignedIndex = (EliteIndex)(-1); internal void AssignNewIndex(EliteIndex index) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_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) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Invalid comparison between Unknown and I4 //IL_0050: Unknown result type (might be due to invalid IL or missing references) if (_assignedIndex == index) { return; } _assignedIndex = index; if ((int)_assignedIndex == -1) { if (Object.op_Implicit((Object)(object)_effectInstance)) { Object.Destroy((Object)(object)_effectInstance); } return; } if (Object.op_Implicit((Object)(object)_effectInstance)) { Object.Destroy((Object)(object)_effectInstance); } if (EquipmentModule.eliteIndexToEffectPrefab.TryGetValue(index, out var value)) { _effectInstance = Object.Instantiate<GameObject>(value, Object.op_Implicit((Object)(object)characterModel) ? ((Component)characterModel).transform : (Object.op_Implicit((Object)(object)body) ? body.transform : ((Component)this).transform), false); } } private void OnDestroy() { if (Object.op_Implicit((Object)(object)_effectInstance)) { Object.Destroy((Object)(object)_effectInstance); } } } public interface IArtifactContentPiece : IContentPiece<ArtifactDef>, IContentPiece { NullableRef<ArtifactCode> artifactCode { get; } void OnArtifactEnabled(); void OnArtifactDisabled(); } public interface ICharacterContentPiece : IGameObjectContentPiece<CharacterBody>, IContentPiece<GameObject>, IContentPiece { NullableRef<GameObject> masterPrefab { get; } } public interface IEliteContentPiece : IEquipmentContentPiece, IContentPiece<EquipmentDef>, IContentPiece { List<EliteDef> eliteDefs { get; } } public interface IEquipmentContentPiece : IContentPiece<EquipmentDef>, IContentPiece { NullableRef<List<GameObject>> itemDisplayPrefabs { get; } bool Execute(EquipmentSlot slot); void OnEquipmentObtained(CharacterBody body); void OnEquipmentLost(CharacterBody body); } public interface IInteractableContentPiece : IGameObjectContentPiece<IInteractable>, IContentPiece<GameObject>, IContentPiece { NullableRef<InteractableCardProvider> cardProvider { get; } } public interface IItemContentPiece : IContentPiece<ItemDef>, IContentPiece { NullableRef<List<GameObject>> itemDisplayPrefabs { get; } } public interface IItemTierContentPiece : IContentPiece<ItemTierDef>, IContentPiece { NullableRef<SerializableColorCatalogEntry> colorIndex { get; } NullableRef<SerializableColorCatalogEntry> darkColorIndex { get; } GameObject pickupDisplayVFX { get; } List<ItemIndex> itemsWithThisTier { get; set; } List<PickupIndex> availableTierDropList { get; set; } } public interface IMonsterContentPiece : ICharacterContentPiece, IGameObjectContentPiece<CharacterBody>, IContentPiece<GameObject>, IContentPiece { NullableRef<MonsterCardProvider> cardProvider { get; } NullableRef<DirectorCardHolderExtended> dissonanceCard { get; } } public interface ISceneContentPiece : IContentPiece<SceneDef>, IContentPiece { NullableRef<MusicTrackDef> mainTrack { get; } NullableRef<MusicTrackDef> bossTrack { get; } NullableRef<Texture2D> bazaarTextureBase { get; } float? weightRelativeToSiblings { get; } bool? preLoop { get; } bool? postLoop { get; } void OnServerStageComplete(Stage stage); void OnServerStageBegin(Stage stage); } public interface ISurvivorContentPiece : ICharacterContentPiece, IGameObjectContentPiece<CharacterBody>, IContentPiece<GameObject>, IContentPiece { SurvivorDef survivorDef { get; } } public interface IVanillaSurvivorContentPiece : IContentPiece, IAsyncContentInitializer { SurvivorDef survivorDef { get; } new IEnumerator InitializeAsync(); IEnumerator IAsyncContentInitializer.InitializeAsync() { return InitializeAsync(); } } public interface IVoidItemContentPiece : IItemContentPiece, IContentPiece<ItemDef>, IContentPiece { List<ItemDef> GetInfectableItems(); } public interface IAsyncContentInitializer { IEnumerator InitializeAsync(); } public interface IContentPackModifier { void ModifyContentPack(ContentPack contentPack); } public interface IContentPiece { IEnumerator LoadContentAsync(); bool IsAvailable(ContentPack contentPack); void Initialize(); } public interface IContentPiece<T> : IContentPiece where T : Object { T asset { get; } } public interface IContentPieceProvider { ContentPack contentPack { get; } IContentPiece[] GetContents(); } public interface IContentPieceProvider<T> : IContentPieceProvider where T : Object { new IContentPiece<T>[] GetContents(); } public interface IGameObjectContentPiece<T> : IContentPiece<GameObject>, IContentPiece { T component { get; } } public static class ContentUtil { private class ContentPieceProvider : IContentPieceProvider { private ContentPack _contentPack; private IContentPiece[] _contentPieces; public ContentPack contentPack => _contentPack; public IContentPiece[] GetContents() { return _contentPieces; } public ContentPieceProvider(IEnumerable<IContentPiece> contentPieces, ContentPack contentPack) { _contentPieces = contentPieces.ToArray(); _contentPack = contentPack; } } private class GenericContentPieceProvider<T> : IContentPieceProvider<T>, IContentPieceProvider where T : Object { private ContentPack _contentPack; private IContentPiece<T>[] _contentPieces; public ContentPack contentPack => _contentPack; public IContentPiece<T>[] GetContents() { return _contentPieces; } IContentPiece[] IContentPieceProvider.GetContents() { return _contentPieces; } public GenericContentPieceProvider(IEnumerable<IContentPiece<T>> contentPieces, ContentPack contentPack) { _contentPieces = contentPieces.ToArray(); _contentPack = contentPack; } } private static ExpansionDef _dummyExpansion = ScriptableObject.CreateInstance<ExpansionDef>(); public static void DisableArtifact(ArtifactDef artifactDef) { artifactDef.requiredExpansion = _dummyExpansion; } public static void DisableSurvivor(SurvivorDef survivorDef) { survivorDef.hidden = true; } public static void DisableItem(ItemDef itemDef) { itemDef.requiredExpansion = _dummyExpansion; } public static void DisableEquipment(EquipmentDef equipmentDef) { equipmentDef.requiredExpansion = _dummyExpansion; } public static void DisableDrone(DroneDef droneDef) { droneDef.requiredExpansion = _dummyExpansion; } public static IContentPieceProvider CreateContentPieceProvider<TContentPieceType>(BaseUnityPlugin plugin, ContentPack contentPack) where TContentPieceType : IContentPiece { return new ContentPieceProvider(AnalyzeForContentPieces<TContentPieceType>(plugin).OfType<IContentPiece>(), contentPack); } public static IEnumerable<TContentPieceType> AnalyzeForContentPieces<TContentPieceType>(BaseUnityPlugin plugin) where TContentPieceType : IContentPiece { return from t in ReflectionCache.GetTypes(((object)plugin).GetType().Assembly).Where(PassesFilterForContentPieceInterface<TContentPieceType>) select (TContentPieceType)Activator.CreateInstance(t); } public static IContentPieceProvider<TUObjectType> CreateGenericContentPieceProvider<TUObjectType>(BaseUnityPlugin baseUnityPlugin, ContentPack contentPack) where TUObjectType : Object { return new GenericContentPieceProvider<TUObjectType>(AnalyzeForGenericContentPieces<TUObjectType>(baseUnityPlugin), contentPack); } public static IEnumerable<IContentPiece<TUObjectType>> AnalyzeForGenericContentPieces<TUObjectType>(BaseUnityPlugin baseUnityPlugin) where TUObjectType : Object { return from t in ReflectionCache.GetTypes(((object)baseUnityPlugin).GetType().Assembly).Where(PassesFilterForObjectType<TUObjectType>) select (IContentPiece<TUObjectType>)Activator.CreateInstance(t); } public static IContentPieceProvider<GameObject> CreateGameObjectGenericContentPieceProvider<TComponentType>(BaseUnityPlugin baseUnityPlugin, ContentPack contentPack) { return new GenericContentPieceProvider<GameObject>(AnalyzeForGameObjectGenericContentPieces<TComponentType>(baseUnityPlugin), contentPack); } public static IEnumerable<IContentPiece<GameObject>> AnalyzeForGameObjectGenericContentPieces<TComponentTYpe>(BaseUnityPlugin baseUnityPlugin) { return from t in ReflectionCache.GetTypes(((object)baseUnityPlugin).GetType().Assembly) where PassesFilterForObjectType<GameObject>(t) && t.GetInterfaces().Contains(typeof(IGameObjectContentPiece<TComponentTYpe>)) select (IContentPiece<GameObject>)Activator.CreateInstance(t); } public static void AddSingle<T>(this NamedAssetCollection<T> collection, T content) where T : class { //IL_006c: Unknown result type (might be due to invalid IL or missing references) string text = collection.nameProvider(content); string text2 = $"{content.GetType().Name}_{collection.Count}"; if (!collection.assetToName.ContainsKey(content)) { if (Utility.IsNullOrWhiteSpace(text)) { text = text2; } collection.nameToAsset.ContainsKey(text); _ = 1; _ = collection.assetInfos.Length; ref AssetInfo<T>[] assetInfos = ref collection.assetInfos; AssetInfo<T> val = new AssetInfo<T> { asset = content, assetName = text }; ArrayUtils.ArrayAppend<AssetInfo<T>>(ref assetInfos, ref val); collection.nameToAsset[text] = content; collection.assetToName[content] = text; Array.Sort(collection.assetInfos); } } public static void PopulateTypeFields<TAsset>(Type typeToPopulate, NamedAssetCollection<TAsset> assets) where TAsset : Object { PopulateTypeFields<TAsset>(typeToPopulate, assets, null); } public static void PopulateTypeFields<TAsset>(Type typeToPopulate, NamedAssetCollection<TAsset> assets, Func<string, string> fieldNameToAssetConverter = null) where TAsset : Object { string[] array = new string[assets.Length]; for (int i = 0; i < assets.Length; i++) { array[i] = ((Object)assets[i]).name; } int num = 0; FieldInfo[] fields = typeToPopulate.GetFields(BindingFlags.Static | BindingFlags.Public); foreach (FieldInfo fieldInfo in fields) { if (fieldInfo.FieldType.IsSameOrSubclassOf(typeof(TAsset))) { TargetAssetNameAttribute customAttribute = ((MemberInfo)fieldInfo).GetCustomAttribute<TargetAssetNameAttribute>(); string text = ((customAttribute != null) ? customAttribute.targetAssetName : ((fieldNameToAssetConverter == null) ? fieldInfo.Name : fieldNameToAssetConverter(fieldInfo.Name))); TAsset val = assets.Find(text); if ((Object)(object)val != (Object)null) { fieldInfo.SetValue(null, val); } else { num++; } } } } public static void AddContentFromAssetCollection(this ContentPack contentPack, AssetCollection assetCollection) { AddContentFromCollectionInternal(contentPack, assetCollection.assets); } public static void AddContentFromAssetCollection(this ContentPack contentPack, AssetCollection assetCollection, Func<Object, bool> predicate) { Object[] assetCollection2 = assetCollection.assets.Where(predicate).ToArray(); AddContentFromCollectionInternal(contentPack, assetCollection2); } public static TAsset FindAsset<TAsset>(this AssetCollection collection, string assetName) where TAsset : Object { return (from asset in collection.assets.OfType<TAsset>() where string.Equals(((Object)asset).name, assetName, StringComparison.OrdinalIgnoreCase) select asset).FirstOrDefault(); } public static TAsset[] FindAssets<TAsset>(this AssetCollection collection) where TAsset : Object { return collection.assets.OfType<TAsset>().ToArray(); } private static void AddContentFromCollectionInternal(ContentPack contentPack, Object[] assetCollection) { foreach (Object val in assetCollection) { try { if (Object.op_Implicit(val)) { HandleAssetAddition(val, contentPack); } } catch (Exception data) { MSULog.Error(data, 361, "AddContentFromCollectionInternal"); } } } private static void HandleAssetAddition(Object asset, ContentPack contentPack) { GameObject val = (GameObject)(object)((asset is GameObject) ? asset : null); if (val == null) { SkillDef val2 = (SkillDef)(object)((asset is SkillDef) ? asset : null); if (val2 == null) { SkillFamily val3 = (SkillFamily)(object)((asset is SkillFamily) ? asset : null); if (val3 == null) { SceneDef val4 = (SceneDef)(object)((asset is SceneDef) ? asset : null); if (val4 == null) { ItemDef val5 = (ItemDef)(object)((asset is ItemDef) ? asset : null); if (val5 == null) { ItemTierDef val6 = (ItemTierDef)(object)((asset is ItemTierDef) ? asset : null); if (val6 == null) { ItemRelationshipProvider val7 = (ItemRelationshipProvider)(object)((asset is ItemRelationshipProvider) ? asset : null); if (val7 == null) { ItemRelationshipType val8 = (ItemRelationshipType)(object)((asset is ItemRelationshipType) ? asset : null); if (val8 == null) { EquipmentDef val9 = (EquipmentDef)(object)((asset is EquipmentDef) ? asset : null); if (val9 == null) { BuffDef val10 = (BuffDef)(object)((asset is BuffDef) ? asset : null); if (val10 == null) { EliteDef val11 = (EliteDef)(object)((asset is EliteDef) ? asset : null); if (val11 == null) { UnlockableDef val12 = (UnlockableDef)(object)((asset is UnlockableDef) ? asset : null); if (val12 == null) { SurvivorDef val13 = (SurvivorDef)(object)((asset is SurvivorDef) ? asset : null); if (val13 == null) { ArtifactDef val14 = (ArtifactDef)(object)((asset is ArtifactDef) ? asset : null); if (val14 == null) { SurfaceDef val15 = (SurfaceDef)(object)((asset is SurfaceDef) ? asset : null); if (val15 == null) { NetworkSoundEventDef val16 = (NetworkSoundEventDef)(object)((asset is NetworkSoundEventDef) ? asset : null); if (val16 == null) { MusicTrackDef val17 = (MusicTrackDef)(object)((asset is MusicTrackDef) ? asset : null); if (val17 == null) { GameEndingDef val18 = (GameEndingDef)(object)((asset is GameEndingDef) ? asset : null); if (val18 == null) { EntityStateConfiguration val19 = (EntityStateConfiguration)(object)((asset is EntityStateConfiguration) ? asset : null); if (val19 == null) { ExpansionDef val20 = (ExpansionDef)(object)((asset is ExpansionDef) ? asset : null); if (val20 == null) { EntitlementDef val21 = (EntitlementDef)(object)((asset is EntitlementDef) ? asset : null); if (val21 == null) { MiscPickupDef val22 = (MiscPickupDef)(object)((asset is MiscPickupDef) ? asset : null); if (val22 == null) { DroneDef val23 = (DroneDef)(object)((asset is DroneDef) ? asset : null); if (val23 == null) { CraftableDef val24 = (CraftableDef)(object)((asset is CraftableDef) ? asset : null); if (val24 == null) { if (asset is EntityStateTypeCollection collection) { AddEntityStateTypes(collection, contentPack); } } else { contentPack.craftableDefs.AddSingle<CraftableDef>(val24); } } else { contentPack.droneDefs.AddSingle<DroneDef>(val23); } } else { contentPack.miscPickupDefs.AddSingle<MiscPickupDef>(val22); } } else { contentPack.entitlementDefs.AddSingle<EntitlementDef>(val21); } } else { contentPack.expansionDefs.AddSingle<ExpansionDef>(val20); } } else { contentPack.entityStateConfigurations.AddSingle<EntityStateConfiguration>(val19); } } else { contentPack.gameEndingDefs.AddSingle<GameEndingDef>(val18); } } else { contentPack.musicTrackDefs.AddSingle<MusicTrackDef>(val17); } } else { contentPack.networkSoundEventDefs.AddSingle<NetworkSoundEventDef>(val16); } } else { contentPack.surfaceDefs.AddSingle<SurfaceDef>(val15); } } else { contentPack.artifactDefs.AddSingle<ArtifactDef>(val14); } } else { contentPack.survivorDefs.AddSingle<SurvivorDef>(val13); } } else { contentPack.unlockableDefs.AddSingle<UnlockableDef>(val12); } } else { contentPack.eliteDefs.AddSingle<EliteDef>(val11); } } else { contentPack.buffDefs.AddSingle<BuffDef>(val10); } } else { contentPack.equipmentDefs.AddSingle<EquipmentDef>(val9); } } else { contentPack.itemRelationshipTypes.AddSingle<ItemRelationshipType>(val8); } } else { contentPack.itemRelationshipProviders.AddSingle<ItemRelationshipProvider>(val7); } } else { contentPack.itemTierDefs.AddSingle<ItemTierDef>(val6); } } else { contentPack.itemDefs.AddSingle<ItemDef>(val5); } } else { contentPack.sceneDefs.AddSingle<SceneDef>(val4); } } else { contentPack.skillFamilies.AddSingle<SkillFamily>(val3); } } else { contentPack.skillDefs.AddSingle<SkillDef>(val2); } } else { HandleGameObjectAddition(val, contentPack); } } private static void HandleGameObjectAddition(GameObject go, ContentPack contentPack) { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown NetworkIdentity component = go.GetComponent<NetworkIdentity>(); bool flag = false; CharacterBody val = default(CharacterBody); if (go.TryGetComponent<CharacterBody>(ref val)) { flag = true; contentPack.bodyPrefabs.AddSingle<GameObject>(go); } CharacterMaster val2 = default(CharacterMaster); if (go.TryGetComponent<CharacterMaster>(ref val2)) { flag = true; contentPack.masterPrefabs.AddSingle<GameObject>(go); } ProjectileController val3 = default(ProjectileController); if (go.TryGetComponent<ProjectileController>(ref val3)) { flag = true; contentPack.projectilePrefabs.AddSingle<GameObject>(go); } Run val4 = default(Run); if (go.TryGetComponent<Run>(ref val4)) { flag = true; contentPack.gameModePrefabs.AddSingle<GameObject>(go); } EffectComponent val5 = default(EffectComponent); if (go.TryGetComponent<EffectComponent>(ref val5)) { contentPack.effectDefs.AddSingle<EffectDef>(new EffectDef(go)); } if (Object.op_Implicit((Object)(object)component) && !flag) { contentPack.networkedObjectPrefabs.AddSingle<GameObject>(go); } } private static void AddEntityStateTypes(EntityStateTypeCollection collection, ContentPack contentPack) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) SerializableEntityStateType[] stateTypes = collection.stateTypes; for (int i = 0; i < stateTypes.Length; i++) { SerializableEntityStateType val = stateTypes[i]; if (((SerializableEntityStateType)(ref val)).stateType != null) { contentPack.entityStateTypes.AddSingle(((SerializableEntityStateType)(ref val)).stateType); } } } private static bool PassesFilterForContentPieceInterface<TContentPieceInterface>(Type t) where TContentPieceInterface : IContentPiece { bool num = !t.IsAbstract; bool flag = t.GetInterfaces().Contains(typeof(TContentPieceInterface)); return num && flag; } private static bool PassesFilterForObjectType<T>(Type t) where T : Object { bool num = !t.IsAbstract; bool flag = t.GetInterfaces().Contains(typeof(IContentPiece<T>)); return num && flag; } } [Obsolete("Use HG.Coroutines.ParallelCoroutine instead, calling all the enumerator methods at the same frame makes no difference in terms of code execution")] public class ParallelMultiStartCoroutine : IEnumerator { private struct Wrapper { public Delegate coroutineDelegate; public object[] args; public IEnumerator coroutine; } private List<Wrapper> _wrappers = new List<Wrapper>(); private IEnumerator _internalCoroutine; public bool isDone { get { if (_internalCoroutine == null) { Start(); } return _internalCoroutine.IsDone(); } } object IEnumerator.Current => _internalCoroutine.Current; public void Start() { for (int i = 0; i < _wrappers.Count; i++) { Wrapper value = _wrappers[i]; value.coroutine = (IEnumerator)(value.coroutineDelegate?.DynamicInvoke(value.args)); _wrappers[i] = value; } _internalCoroutine = InternalCoroutine(); } public void Add(Func<IEnumerator> func) { _wrappers.Add(new Wrapper { coroutineDelegate = func }); } public void Add<T1>(Func<T1, IEnumerator> func, T1 arg) { _wrappers.Add(new Wrapper { coroutineDelegate = func, args = new object[1] { arg } }); } public void Add<T1, T2>(Func<T1, T2, IEnumerator> func, T1 arg1, T2 arg2) { _wrappers.Add(new Wrapper { coroutineDelegate = func, args = new object[2] { arg1, arg2 } }); } public void Add<T1, T2, T3>(Func<T1, T2, T3, IEnumerator> func, T1 arg1, T2 arg2, T3 arg3) { _wrappers.Add(new Wrapper { coroutineDelegate = func, args = new object[3] { arg1, arg2, arg3 } }); } public void Add<T1, T2, T3, T4>(Func<T1, T2, T3, T4, IEnumerator> func, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { _wrappers.Add(new Wrapper { coroutineDelegate = func, args = new object[4] { arg1, arg2, arg3, arg4 } }); } public void Add<T1, T2, T3, T4, T5>(Func<T1, T2, T3, T4, T5, IEnumerator> func, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) { _wrappers.Add(new Wrapper { coroutineDelegate = func, args = new object[5] { arg1, arg2, arg3, arg4, arg5 } }); } private IEnumerator InternalCoroutine() { yield return null; bool encounteredUnfinished = true; while (encounteredUnfinished) { encounteredUnfinished = false; for (int i = _wrappers.Count - 1; i >= 0; i--) { Wrapper wrapper = _wrappers[i]; if (!wrapper.coroutine.IsDone()) { encounteredUnfinished = true; yield return wrapper.coroutine.Current; } else { _wrappers.RemoveAt(i); } } } } bool IEnumerator.MoveNext() { if (_internalCoroutine == null) { Start(); } return _internalCoroutine?.MoveNext() ?? false; } void IEnumerator.Reset() { if (_internalCoroutine == null) { Start(); } _internalCoroutine?.MoveNext(); } } [Obsolete("Utilize HG.Coroutines.ParallelCoroutine instead.")] public class ParallelCoroutine : IEnumerator { private readonly List<IEnumerator> _coroutinesList = new List<IEnumerator>(); private IEnumerator _internalCoroutine; public bool isDone => this.IsDone(); public object Current => _internalCoroutine.Current; public ParallelCoroutine() { _internalCoroutine = InternalCoroutine(); } public void Add(IEnumerator coroutine) { _coroutinesList.Add(coroutine); } public bool MoveNext() { return _internalCoroutine.MoveNext(); } public void Reset() { _internalCoroutine.Reset(); } private IEnumerator InternalCoroutine() { yield return null; bool encounteredUnfinished = true; while (encounteredUnfinished) { encounteredUnfinished = false; int i = _coroutinesList.Count - 1; while (i >= 0) { IEnumerator enumerator = _coroutinesList[i]; if (enumerator.MoveNext()) { encounteredUnfinished = true; yield return enumerator.Current; } else { _coroutinesList.RemoveAt(i); } int num = i - 1; i = num; } } } } public class CoroutineWithResult : IEnumerator { protected IEnumerator _runningCoroutine; object IEnumerator.Current { get { throw new NotImplementedException(); } } public object boxedResult { get; protected set; } public static CoroutineWithResult CompletedResult(object result) { return new CoroutineWithResult(YieldResultASAP(result)); static IEnumerator YieldResultASAP(object result) { yield return result; } } public virtual bool MoveNext() { bool num = _runningCoroutine.MoveNext(); if (num) { boxedResult = _runningCoroutine.Current; } return num; } public void StartNew(IEnumerator coroutineThatEventuallyYieldsAResult) { _runningCoroutine = coroutineThatEventuallyYieldsAResult; } void IEnumerator.Reset() { throw new NotSupportedException(); } public CoroutineWithResult(IEnumerator coroutineThatEventuallyYieldsAResult) { _runningCoroutine = coroutineThatEventuallyYieldsAResult; } } public sealed class CoroutineWithResult<T> : CoroutineWithResult, IEnumerator<T>, IEnumerator, IDisposable { private new IEnumerator<T> _runningCoroutine; T IEnumerator<T>.Current { get { throw new NotImplementedException(); } } object IEnumerator.Current { get { throw new NotImplementedException(); } } public T result { get; private set; } public static CoroutineWithResult<T> CompletedResult(T result) { return new CoroutineWithResult<T>(YieldResultASAP(result)); static IEnumerator<T> YieldResultASAP(T result) { yield return result; } } public override bool MoveNext() { bool num = _runningCoroutine.MoveNext(); if (num) { base.boxedResult = _runningCoroutine.Current; result = _runningCoroutine.Current; } return num; } public void StartNew(IEnumerator<T> coroutineThatEventuallyYieldsAResult) { _runningCoroutine = coroutineThatEventuallyYieldsAResult; base._runningCoroutine = coroutineThatEventuallyYieldsAResult; } void IEnumerator.Reset() { throw new NotSupportedException(); } void IDisposable.Dispose() { throw new NotSupportedException(); } public CoroutineWithResult(IEnumerator<T> coroutineThatEventuallyYieldsAResult) : base(coroutineThatEventuallyYieldsAResult) { _runningCoroutine = coroutineThatEventuallyYieldsAResult; } } public class DirectorCardHolderExtended : DirectorCardHolder { public ExpansionDef[] requiredExpansionDefs = Array.Empty<ExpansionDef>(); public bool IsAvailable() { if (base.Card.IsAvailable()) { return ExpansionRequirementMet(); } return false; } public bool ExpansionRequirementMet() { ExpansionDef[] enabledExpansions = Run.instance.GetEnabledExpansions(); ExpansionDef[] array = requiredExpansionDefs; foreach (ExpansionDef value in array) { if (!enabledExpansions.Contains(value)) { return false; } } return true; } } [StructLayout(LayoutKind.Sequential, Size = 1)] public struct CharacterBodyIndexEqualityComparer : IEqualityComparer<CharacterBody> { public bool Equals(CharacterBody x, CharacterBody y) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Invalid comparison between Unknown and I4 //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Invalid comparison between Unknown and I4 //IL_0027: 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) if (!Object.op_Implicit((Object)(object)x) || !Object.op_Implicit((Object)(object)y)) { return false; } if ((int)x.bodyIndex == -1 || (int)y.bodyIndex == -1) { return false; } return x.bodyIndex == y.bodyIndex; } public int GetHashCode(CharacterBody obj) { return ((object)obj).GetHashCode(); } } [StructLayout(LayoutKind.Sequential, Size = 1)] public struct IInteractableNetworkIdentityAssetIDComparer : IEqualityComparer<IInteractable> { public bool Equals(IInteractable x, IInteractable y) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) if (x == null || y == null) { return false; } MonoBehaviour val = (MonoBehaviour)(object)((x is MonoBehaviour) ? x : null); MonoBehaviour val2 = (MonoBehaviour)(object)((y is MonoBehaviour) ? y : null); if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val2)) { return false; } NetworkIdentity component = ((Component)val).GetComponent<NetworkIdentity>(); NetworkIdentity component2 = ((Component)val2).GetComponent<NetworkIdentity>(); if (!Object.op_Implicit((Object)(object)component) || !Object.op_Implicit((Object)(object)component2)) { return false; } NetworkHash128 assetId = component.assetId; return ((NetworkHash128)(ref assetId)).Equals(component2.assetId); } public int GetHashCode(IInteractable obj) { return ((object)obj)?.GetHashCode() ?? (-1); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)] public class FormatTokenAttribute : SearchableAttribute { public enum OperationTypeEnum { DivideByN, MultiplyByN, AddN, SubtractN, ModuloN } private object _cachedFormattingValue; public string languageToken { get; private set; } public OperationTypeEnum? operationType { get; private set; } public float? operationData { get; private set; } public int formattingIndex { get; private set; } internal object GetFormattingValue() { //IL_0085: Unknown result type (might be due to invalid IL or missing references) object obj = null; if (((SearchableAttribute)this).target is FieldInfo fieldInfo) { obj = fieldInfo.GetValue(null); } else { if (!(((SearchableAttribute)this).target is PropertyInfo propertyInfo)) { throw new InvalidOperationException("FormatTokenAttribute is only valid in Fields and Properties"); } obj = propertyInfo.GetMethod?.Invoke(null, null); } Type type = obj.GetType(); if (type.IsSubclassOf(typeof(ConfiguredVariable))) { obj = ((ConfigEntryBase)(type.GetProperty("configEntryBase", BindingFlags.Instance | BindingFlags.Public).GetMethod?.Invoke(obj, null))).BoxedValue; } if (obj == null) { return string.Empty; } if (IsNumber(obj)) { if (operationType.HasValue && operationData.HasValue) { switch (operationType.Value) { case OperationTypeEnum.MultiplyByN: obj = MultiplyByN(CastToFloat(obj)); break; case OperationTypeEnum.DivideByN: obj = DivideByN(CastToFloat(obj)); break; case OperationTypeEnum.AddN: obj = AddN(CastToFloat(obj)); break; case OperationTypeEnum.ModuloN: obj = ModuloN(CastToFloat(obj)); break; case OperationTypeEnum.SubtractN: obj = SubtractN(CastToFloat(obj)); break; } } _cachedFormattingValue = obj; } else { _cachedFormattingValue = obj; } return _cachedFormattingValue; } private float CastToFloat(object obj) { return Convert.ToSingle(obj, CultureInfo.InvariantCulture); } private object MultiplyByN(float number) { float value = operationData.Value; return number * value; } private object DivideByN(float number) { float value = operationData.Value; return number / value; } private object AddN(float number) { float value = operationData.Value; return number + value; } private object SubtractN(float number) { return number - operationData; } private object ModuloN(float number) { float value = operationData.Value; return number % value; } private bool IsNumber(object value) { if (!(value is sbyte) && !(value is byte) && !(value is short) && !(value is ushort) && !(value is int) && !(value is uint) && !(value is long) && !(value is ulong) && !(value is float) && !(value is double)) { return value is decimal; } return true; } public FormatTokenAttribute(string token, int formattingIndex = 0) { languageToken = token; this.formattingIndex = formattingIndex; } public FormatTokenAttribute(string token, OperationTypeEnum opType, float opData, int formattingIndex = 0) { languageToken = token; operationType = opType; operationData = opData; this.formattingIndex = formattingIndex; } } internal static class FormatTokenManager { private static Dictionary<string, FormatTokenAttribute[]> _cachedFormattingArray; [SystemInitializer(new Type[] { typeof(ConfigSystem) })] private static IEnumerator Init() { MSULog.Info("Initializing FormatTokenManager", 21, "Init"); IEnumerator subroutine = CreateFormattingArray(); while (!subroutine.IsDone()) { yield return null; } foreach (Language allLanguage in Language.GetAllLanguages()) { AddTokensFromLanguageFileLoaderAndFormatThem(allLanguage); } Language.onCurrentLanguageChanged += Language_onCurrentLanguageChanged; ModOptionPanelController.OnModOptionsExit = (Action)Delegate.Combine(ModOptionPanelController.OnModOptionsExit, (Action)delegate { MSULog.Info("Reformatting Tokens.", 40, "Init"); AddTokensFromLanguageFileLoaderAndFormatThem(Language.currentLanguage); }); } private static void Language_onCurrentLanguageChanged() { MSULog.Info("Changed to language " + Language.currentLanguageName + ".", 48, "Language_onCurrentLanguageChanged"); AddTokensFromLanguageFileLoaderAndFormatThem(Language.currentLanguage); } private static void AddTokensFromLanguageFileLoaderAndFormatThem(Language currentLanguage) { string name = currentLanguage.name; if (!LanguageFileLoader._languageNameToRawTokenData.TryGetValue(name, out var value)) { return; } List<(string, string)> list = new List<(string, string)>(); foreach (var (text3, text4) in value) { if (_cachedFormattingArray.TryGetValue(text3, out var _)) { list.Add((text3, text4)); } else { currentLanguage.stringsByToken[text3] = text4; } } if (list.Count > 0) { ((MonoBehaviour)MSUMain.instance).StartCoroutine(FormatTokensWhenConfigsAreBound(currentLanguage, list)); } } private static IEnumerator FormatTokensWhenConfigsAreBound(Language target, List<(string, string)> tokenValuePair) { while (!ConfigSystem.configsBound) { yield return null; } foreach (var (text, text2) in tokenValuePair) { try { target.SetStringByToken(text, FormatString(text, text2, _cachedFormattingArray[text])); } catch (Exception arg) { MSULog.Error($"Failed to format string value for token {text} in language {target.name}. unformatted string will be used.\n{arg}", 100, "FormatTokensWhenConfigsAreBound"); target.SetStringByToken(text, text2); } } } private static IEnumerator CreateFormattingArray() { List<FormatTokenAttribute> propertyFormatTokens = new List<FormatTokenAttribute>(); List<FormatTokenAttribute> fieldFormatTokens = new List<FormatTokenAttribute>(); IEnumerator subroutine = GetFormatTokenLists(propertyFormatTokens, fieldFormatTokens); while (!subroutine.IsDone()) { yield return null; } Dictionary<string, FormatTokenAttribute[]> formattingDictionaryFromFields = new Dictionary<string, FormatTokenAttribute[]>(); Dictionary<string, FormatTokenAttribute[]> formattingDictionaryFromProperties = new Dictionary<string, FormatTokenAttribute[]>(); ParallelCoroutine parallelSubroutine = new ParallelCoroutine(); parallelSubroutine.Add(CreateFormattingDictionary(propertyFormatTokens, formattingDictionaryFromProperties)); parallelSubroutine.Add(CreateFormattingDictionary(fieldFormatTokens, formattingDictionaryFromFields)); while (!parallelSubroutine.IsDone()) { yield return null; } _cachedFormattingArray = new Dictionary<string, FormatTokenAttribute[]>(); string key; FormatTokenAttribute[] value; foreach (KeyValuePair<string, FormatTokenAttribute[]> item in formattingDictionaryFromFields) { item.Deconstruct(out key, out value); string token2 = key; FormatTokenAttribute[] formattingArray2 = value; yield return null; _cachedFormattingArray[token2] = Array.Empty<FormatTokenAttribute>(); FormatTokenAttribute[] arrayFromCache2 = _cachedFormattingArray[token2]; for (int j = 0; j < formattingArray2.Length; j++) { yield return null; if (arrayFromCache2.Length < j + 1) { Array.Resize(ref arrayFromCache2, j + 1); } if (arrayFromCache2[j] == null) { arrayFromCache2[j] = formattingArray2[j]; } } _cachedFormattingArray[token2] = arrayFromCache2; } foreach (KeyValuePair<string, FormatTokenAttribute[]> item2 in formattingDictionaryFromProperties) { item2.Deconstruct(out key, out value); string token2 = key; FormatTokenAttribute[] formattingArray2 = value; yield return null; if (!_cachedFormattingArray.ContainsKey(token2)) { _cachedFormattingArray[token2] = Array.Empty<FormatTokenAttribute>(); } FormatTokenAttribute[] arrayFromCache2 = _cachedFormattingArray[token2]; for (int j = 0; j < formattingArray2.Length; j++) { yield return null; if (arrayFromCache2.Length < j + 1) { Array.Resize(ref arrayFromCache2, j + 1); } if (arrayFromCache2[j] == null) { arrayFromCache2[j] = formattingArray2[j]; } } _cachedFormattingArray[token2] = arrayFromCache2; } } private static IEnumerator GetFormatTokenLists(List<FormatTokenAttribute> propertyFormatTokens, List<FormatTokenAttribute> fieldFormatTokens) { List<SearchableAttribute> source = SearchableAttribute.GetInstances<FormatTokenAttribute>() ?? new List<SearchableAttribute>(); foreach (FormatTokenAttribute formatToken in source.Cast<FormatTokenAttribute>()) { yield return null; if (((SearchableAttribute)formatToken).target is FieldInfo) { fieldFormatTokens.Add(formatToken); } else { propertyFormatTokens.Add(formatToken); } } } private static IEnumerator CreateFormattingDictionary(List<FormatTokenAttribute> source, Dictionary<string, FormatTokenAttribute[]> dest) { if (source.Count == 0) { yield break; } foreach (FormatTokenAttribute formatToken in source) { yield return null; try { string languageToken = formatToken.languageToken; int formattingIndex = formatToken.formattingIndex; if (!dest.ContainsKey(languageToken)) { dest[languageToken] = Array.Empty<FormatTokenAttribute>(); } FormatTokenAttribute[] array = dest[languageToken]; if (array.Length < formattingIndex + 1) { Array.Resize(ref array, formattingIndex + 1); } if (array[formattingIndex] == null) { array[formattingIndex] = formatToken; } dest[languageToken] = array; } catch (Exception data) { MSULog.Error(data, 225, "CreateFormattingDictionary"); } } } private static string FormatString(string token, string value, FormatTokenAttribute[] formattingArray) { object[] args = formattingArray.Select((FormatTokenAttribute att) => att.GetFormattingValue()).ToArray(); return string.Format(value, args); } } public enum GameplayEventIndex { None = -1 } public static class GameplayEventCatalog { public delegate void AddGameplayEventContentProviderDelegate(IGameplayEventContentProvider provider); public delegate void CollectGameplayEventContentProvidersDelegate(AddGameplayEventContentProviderDelegate addGameplayEventContentProvider); public interface IGameplayEventContentProvider { IEnumerator LoadGameplayEventsAsync(List<GameObject> dest); } private static GameObject[] _registeredGameplayEventObjects = Array.Empty<GameObject>(); private static GameplayEvent[] _registeredGameplayEventComponents = Array.Empty<GameplayEvent>(); private static readonly Dictionary<string, GameplayEventIndex> _nameToEventIndex = new Dictionary<string, GameplayEventIndex>(StringComparer.OrdinalIgnoreCase); public static ResourceAvailability catalogAvailability = default(ResourceAvailability); private static bool _initialized = false; public static int registeredGameplayEventCount => _registeredGameplayEventObjects.Length; public static event CollectGameplayEventContentProvidersDelegate collectGameplayEventContentProviders; public static GameplayEventIndex FindEventIndex(string eventName) { ThrowIfNotInitialized(); if (_nameToEventIndex.TryGetValue(eventName, out var value)) { return value; } return GameplayEventIndex.None; } public static GameObject GetGameplayEventObject(GameplayEventIndex index) { ThrowIfNotInitialized(); return ArrayUtils.GetSafe<GameObject>(_registeredGameplayEventObjects, (int)index); } public static GameplayEvent GetGameplayEvent(GameplayEventIndex index) { ThrowIfNotInitialized(); return ArrayUtils.GetSafe<GameplayEvent>(_registeredGameplayEventComponents, (int)index); } [SystemInitializer(new Type[] { })] private static IEnumerator Init() { MSULog.Info("Initializing the GameplayEvent Catalog...", 95, "Init"); List<IGameplayEventContentProvider> contentProviders = new List<IGameplayEventContentProvider>(); GameplayEventCatalog.collectGameplayEventContentProviders?.Invoke(AddGameplayEventContentProvider); List<GameObject> loadedEvents2 = new List<GameObject>(); ParallelCoroutine coroutine = new ParallelCoroutine(); foreach (IGameplayEventContentProvider contentProvider2 in contentProviders) { yield return null; coroutine.Add(contentProvider2.LoadGameplayEventsAsync(loadedEvents2)); } while (!coroutine.isDone) { yield return null; } _nameToEventIndex.Clear(); loadedEvents2 = loadedEvents2.OrderBy((GameObject go) => ((Object)go).name).ToList(); _registeredGameplayEventObjects = RegisterGameplayEvents(loadedEvents2).ToArray(); _registeredGameplayEventComponents = _registeredGameplayEventObjects.Select((GameObject g) => g.GetComponent<GameplayEvent>()).ToArray(); _initialized = true; ((ResourceAvailability)(ref catalogAvailability)).MakeAvailable(); void AddGameplayEventContentProvider(IGameplayEventContentProvider contentProvider) { contentProviders.Add(contentProvider); } } private static List<GameObject> RegisterGameplayEvents(List<GameObject> _gameplayEvents) { List<GameObject> list = new List<GameObject>(); for (int i = 0; i < _gameplayEvents.Count; i++) { try { EnsureValidity(_gameplayEvents[i], list); } catch (Exception data) { MSULog.Error(data, 139, "RegisterGameplayEvents"); } } for (int j = 0; j < list.Count; j++) { GameObject val = list[j]; GameplayEvent component = val.GetComponent<GameplayEvent>(); component.gameplayEventIndex = (GameplayEventIndex)j; _nameToEventIndex.Add(((Object)val).name, component.gameplayEventIndex); } return list; } private static void EnsureValidity(GameObject gameplayEvent, List<GameObject> validEvents) { GameplayEvent gameplayEvent2 = default(GameplayEvent); if (!gameplayEvent.TryGetComponent<GameplayEvent>(ref gameplayEvent2)) { throw new NullReferenceException($"GameObject {gameplayEvent} does not contain a GameplayEvent component."); } validEvents.Add(gameplayEvent); } private static void ThrowIfNotInitialized() { if (!_initialized) { throw new InvalidOperationException("GameplayEventCatalog not Initialized. Use \"catalogAvailability\" to call a method when the GameplayEventCatalog is initialized."); } } } public static class GameplayEventManager { public readonly struct GameplayEventSpawnArgs { public readonly GameObject gameplayEventPrefab; public readonly bool skipEventRequirementChecks; public readonly bool ignoreDuplicateEvents; public readonly bool doNotAnnounceStart; public readonly bool doNotAnnounceEnd; public readonly bool? beginOnStartOverride; public readonly float? expirationTimerOverride; public readonly float? announcementDurationOverride; public readonly EntityStateIndex? customTextStateIndex; public readonly GenericObjectIndex? customTMPFontAssetIndex; } public static bool GameplayEventExists(GameplayEvent gameplayEvent) { return GameplayEventExists(Object.op_Implicit((Object)(object)gameplayEvent) ? gameplayEvent.gameplayEventIndex : GameplayEventIndex.None); } public static bool GameplayEventExists(GameplayEventIndex index) { if (index == GameplayEventIndex.None) { return false; } foreach (GameplayEvent instances in InstanceTracker.GetInstancesList<GameplayEvent>()) { if (instances.gameplayEventIndex == index) { return true; } } return false; } public static bool GameplayEventIsPlaying(GameplayEvent gameplayEvent) { return GameplayEventIsPlaying(Object.op_Implicit((Object)(object)gameplayEvent) ? gameplayEvent.gameplayEventIndex : GameplayEventIndex.None); } public static bool GameplayEventIsPlaying(GameplayEventIndex index) { foreach (GameplayEvent instances in InstanceTracker.GetInstancesList<GameplayEvent>()) { if (instances.gameplayEventIndex == index) { return instances.isPlaying; } } return false; } public static GameplayEvent GetGameplayEventInstance(GameplayEvent prefabComponent) { return GetGameplayEventInstance(Object.op_Implicit((Object)(object)prefabComponent) ? prefabComponent.gameplayEventIndex : GameplayEventIndex.None); } public static GameplayEvent GetGameplayEventInstance(GameplayEventIndex index) { if (!GameplayEventExists(index)) { return null; } foreach (GameplayEvent instances in InstanceTracker.GetInstancesList<GameplayEvent>()) { if (instances.gameplayEventIndex == index) { return instances; } } return null; } public static bool AnyGameplayEventIsPlaying() { List<GameplayEvent> instancesList = InstanceTracker.GetInstancesList<GameplayEvent>(); if (instancesList.Count == 0) { return false; } foreach (GameplayEvent item in instancesList) { if (item.isPlaying) { return true; } } return false; } public static bool AnyGameplayEventExists() { return InstanceTracker.GetInstancesList<GameplayEvent>().Count > 0; } public static GameplayEvent SpawnGameplayEvent(GameplayEventSpawnArgs args) { if (!NetworkServer.active) { return null; } GameObject gameplayEventPrefab = args.gameplayEventPrefab; GameplayEvent gameplayEvent = default(GameplayEvent); if (gameplayEventPrefab.TryGetComponent<GameplayEvent>(ref gameplayEvent)) { return null; } if (gameplayEvent.gameplayEventIndex == GameplayEventIndex.None) { return null; } GameplayEventRequirement gameplayEventRequirement = default(GameplayEventRequirement); if (!args.skipEventRequirementChecks && gameplayEventPrefab.TryGetComponent<GameplayEventRequirement>(ref gameplayEventRequirement) && !gameplayEventRequirement.IsAvailable()) { return null; } if (!args.ignoreDuplicateEvents && GameplayEventExists(gameplayEvent.gameplayEventIndex)) { return null; } GameplayEvent component = Object.Instantiate<GameObject>(gameplayEventPrefab).GetComponent<GameplayEvent>(); if (args.beginOnStartOverride.HasValue) { component.NetworkbeginOnStart = args.beginOnStartOverride.Value; } if (args.expirationTimerOverride.HasValue) { component.eventDuration = args.expirationTimerOverride.Value; } if (args.announcementDurationOverride.HasValue) { component.announcementDuration = args.announcementDurationOverride.Value; } component.doNotAnnounceEnd = args.doNotAnnounceEnd; component.doNotAnnounceStart = args.doNotAnnounceStart; NetworkServer.Spawn(((Component)component).gameObject); return component; } } public static class GenericUnityObjectCatalog { public delegate void AddGenericObjectContentProviderDelegate(IGenericObjectContentProvider provider); public delegate void CollectGenericObjectContentProvidersDelegate(AddGenericObjectContentProviderDelegate addGameplayEventContentProvider); public interface IGenericObjectContentProvider { IEnumerator LoadGenericObjectsAsync(List<GenericObjectEntry> dest); } public struct GenericObjectEntry { public Object unityObject; private string _nameOverride; public string name { get { if (!Utility.IsNullOrWhiteSpace(_nameOverride)) { return _nameOverride; } return unityObject.name; } } public GenericObjectEntry(Object unityObject, string nameOverride = null) { _nameOverride = nameOverride; this.unityObject = unityObject; } } private static Object[] _registeredObjects = Array.Empty<Object>(); private static Dictionary<string, GenericObjectIndex> _nameToGenericObjectIndex = new Dictionary<string, GenericObjectIndex>(); public static ResourceAvailability catalogAvailability = default(ResourceAvailability); private static bool _initialized; public static int registeredObjectsCount => _registeredObjects.Length; public static event CollectGenericObjectContentProvidersDelegate collectGenericObjectContentProviders; public static GenericObjectIndex FindGenericObjectIndex(string name) { ThrowIfNotInitialized(); if (_nameToGenericObjectIndex.TryGetValue(name, out var value)) { return value; } return GenericObjectIndex.None; } public static T GetObject<T>(GenericObjectIndex index) where T : Object { ThrowIfNotInitialized(); Object safe = ArrayUtils.GetSafe<Object>(_registeredObjects, (int)index); if (Object.op_Implicit(safe)) { return (T)(object)safe; } return default(T); } public static Object GetObject(GenericObjectIndex index) { ThrowIfNotInitialized(); return ArrayUtils.GetSafe<Object>(_registeredObjects, (int)index); } [SystemInitializer(new Type[] { })] private static IEnumerator Init() { MSULog.Info("Initializing the GenericObject Catalog...", 86, "Init"); List<IGenericObjectContentProvider> contentProviders = new List<IGenericObjectContentProvider>(); GenericUnityObjectCatalog.collectGenericObjectContentProviders?.Invoke(AddGenericObjectContentProvider); List<GenericObjectEntry> loadedObjects2 = new List<GenericObjectEntry>(); ParallelCoroutine coroutine = new ParallelCoroutine(); foreach (IGenericObjectContentProvider contentProvider2 in contentProviders) { yield return null; coroutine.Add(contentProvider2.LoadGenericObjectsAsync(loadedObjects2)); } while (!coroutine.isDone) { yield return null; } _nameToGenericObjectIndex.Clear(); loadedObjects2 = loadedObjects2.OrderBy((GenericObjectEntry obj) => obj.name).ToList(); _registeredObjects = RegisterObjects(loadedObjects2).ToArray(); _initialized = true; ((ResourceAvailability)(ref catalogAvailability)).MakeAvailable(); void AddGenericObjectContentProvider(IGenericObjectContentProvider contentProvider) { contentProviders.Add(contentProvider); } } private static List<Object> RegisterObjects(List<GenericObjectEntry> entries) { List<GenericObjectEntry> list = new List<GenericObjectEntry>(); for (int i = 0; i < entries.Count; i++) { try { EnsureValidity(entries[i], list); } catch (Exception data) { MSULog.Error(data, 130, "RegisterObjects"); } } for (int j = 0; j < list.Count; j++) { GenericObjectEntry genericObjectEntry = list[j]; _nameToGenericObjectIndex.Add(genericObjectEntry.name, (GenericObjectIndex)j); } return list.Select((GenericObjectEntry goe) => goe.unityObject).ToList(); } private static void EnsureValidity(GenericObjectEntry entry, List<GenericObjectEntry> validEntries) { if (Utility.IsNullOrWhiteSpace(entry.name)) { throw new NullReferenceException("Entry's name is null"); } validEntries.Add(entry); } private static void ThrowIfNotInitialized() { if (!_initialized) { throw new InvalidOperationException("GenericObjectCatalog not Initialized. Use \"catalogAvailability\" to call a method when the GenericObjectCatalog is initialized."); } } } public enum GenericObjectIndex { None = -1 } [Obsolete("The ItemDisplayCatalog is obsolete.")] internal static class ItemDisplayCatalog { private static StringComparer _comparer = StringComparer.OrdinalIgnoreCase; private static Dictionary<string, ItemDisplayRuleSet> _idrsDictionary = new Dictionary<string, ItemDisplayRuleSet>(_comparer); private static Dictionary<string, GameObject> _displayDictionary = new Dictionary<string, GameObject>(_comparer); public static ResourceAvailability catalogAvailability; private static HashSet<ItemDisplayRuleSet> _dirtyIDRS = new HashSet<ItemDisplayRuleSet>(); public static void SetIDRSDirty(ItemDisplayRuleSet idrs) { _dirtyIDRS.Add(idrs); } public static GameObject GetItemDisplay(string key) { if (!_displayDictionary.ContainsKey(key)) { return null; } return _displayDictionary[key]; } public static ItemDisplayRuleSet GetItemDisplayRuleSet(string key) { if (!_idrsDictionary.ContainsKey(key)) { return null;