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 VFiX v1.1.2
plugins/VFiX/VFiX.dll
Decompiled 5 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Logging; using HG; using HG.Coroutines; using HG.Reflection; using IL.RoR2; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using R2API.Utils; using RoR2; using RoR2.ContentManagement; using RoR2.DispatachableEffects; using RoR2BepInExPack.GameAssetPathsBetter; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Rendering; using UnityEngine.ResourceManagement.AsyncOperations; using VFiX.GrandparentPreSpawnEffect; using VFiX.MeteorStrikePredictionEffect; using VFiX.PooledEffectCleanup; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: NetworkCompatibility(/*Could not decode attribute arguments.*/)] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("VFiX")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+cf448d0254e3b3e8d0339c34c1081e99b4549727")] [assembly: AssemblyProduct("VFiX")] [assembly: AssemblyTitle("VFiX")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace VFiX { public static class AddressableExtensions { public static void CallOnSuccess<T>(this AsyncOperationHandle<T> handle, Action<T> onSuccess) { handle.Completed += delegate(AsyncOperationHandle<T> handle) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 if ((int)handle.Status != 1) { Log.Error("Failed to load asset " + handle.LocationName, "X:\\Git\\RoR2\\VFiX\\VFiX\\AddressableExtensions.cs", "CallOnSuccess", 24); } else { onSuccess(handle.Result); } }; } } public static class AssetLoadUtils { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AsyncOperationHandle<T> LoadTempAssetAsync<T>(string assetKey) where T : Object { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return LoadTempAssetAsync<T>(new AssetReferenceT<T>(assetKey)); } public static AsyncOperationHandle<T> LoadTempAssetAsync<T>(AssetReferenceT<T> assetReference) where T : Object { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) AsyncOperationHandle<T> result = AssetAsyncReferenceManager<T>.LoadAsset(assetReference, (AsyncReferenceHandleUnloadType)2); result.Completed += delegate { AssetAsyncReferenceManager<T>.UnloadAsset(assetReference); }; return result; } } internal static class Log { private static readonly StringBuilder _sharedStringBuilder; private static readonly int _cachedCallerPathPrefixLength; private static ManualLogSource _logSource; static Log() { _sharedStringBuilder = new StringBuilder(256); _cachedCallerPathPrefixLength = getCallerPathPrefixLength("X:\\Git\\RoR2\\VFiX\\VFiX\\Log.cs"); static int getCallerPathPrefixLength([CallerFilePath] string callerPath = null) { int num = callerPath.LastIndexOf("VFiX\\"); if (num >= 0) { return num + "VFiX\\".Length; } Debug.LogError((object)"[VFiX] Logger failed to determine caller path prefix length"); return 0; } } internal static void Init(ManualLogSource logSource) { _logSource = logSource; } private static StringBuilder AppendCallerPrefix(this StringBuilder stringBuilder, string callerPath, string callerMemberName, int callerLineNumber) { return stringBuilder.Append(callerPath, _cachedCallerPathPrefixLength, callerPath.Length - _cachedCallerPathPrefixLength).Append(':').Append(callerLineNumber) .Append(" (") .Append(callerMemberName) .Append("):"); } private static StringBuilder buildCallerLogString(string callerPath, string callerMemberName, int callerLineNumber, object data) { return _sharedStringBuilder.Clear().AppendCallerPrefix(callerPath, callerMemberName, callerLineNumber).Append(' ') .Append(data); } [Conditional("DEBUG")] internal static void Debug(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogDebug((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] [Conditional("DEBUG")] internal static void Debug_NoCallerPrefix(object data) { _logSource.LogDebug(data); } internal static void Error(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogError((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Error_NoCallerPrefix(object data) { _logSource.LogError(data); } internal static void Fatal(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogFatal((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Fatal_NoCallerPrefix(object data) { _logSource.LogFatal(data); } internal static void Info(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogInfo((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Info_NoCallerPrefix(object data) { _logSource.LogInfo(data); } internal static void Message(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogMessage((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Message_NoCallerPrefix(object data) { _logSource.LogMessage(data); } internal static void Warning(object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { _logSource.LogWarning((object)buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static void Warning_NoCallerPrefix(object data) { _logSource.LogWarning(data); } internal static void LogType(LogLevel level, object data, [CallerFilePath] string callerPath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = -1) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) LogType_NoCallerPrefix(level, buildCallerLogString(callerPath, callerMemberName, callerLineNumber, data)); } internal static void LogType_NoCallerPrefix(LogLevel level, object data) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001a: 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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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) if ((level & 1) != 0) { Fatal_NoCallerPrefix(data); } else if ((level & 2) != 0) { Error_NoCallerPrefix(data); } else if ((level & 4) != 0) { Warning_NoCallerPrefix(data); } else if ((level & 8) != 0) { Message_NoCallerPrefix(data); } else if ((level & 0x10) != 0) { Info_NoCallerPrefix(data); } else { _ = level & 0x20; } } } [BepInPlugin("Gorakh.VFiX", "VFiX", "1.1.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class VFiXPlugin : BaseUnityPlugin { public const string PluginGUID = "Gorakh.VFiX"; public const string PluginAuthor = "Gorakh"; public const string PluginName = "VFiX"; public const string PluginVersion = "1.1.2"; private static VFiXPlugin _instance; internal static VFiXPlugin Instance => _instance; private void Awake() { Stopwatch stopwatch = Stopwatch.StartNew(); SingletonHelper.Assign<VFiXPlugin>(ref _instance, this); Log.Init(((BaseUnityPlugin)this).Logger); EffectPoolPreventInUsePoolClearFix.Init(); GrandparentPreSpawnEffectFix.Init(); MeteorStrikePredictionEffectFix.Init(); PooledEffectCleanupSoundFix.Init(); stopwatch.Stop(); Log.Message_NoCallerPrefix($"Initialized in {stopwatch.Elapsed.TotalMilliseconds:F0}ms"); } private void OnDestroy() { SingletonHelper.Unassign<VFiXPlugin>(ref _instance, this); } } } namespace VFiX.PooledEffectStart { public sealed class ApplyForceOnStartRestarter : MonoBehaviour, IEffectRestarter { private ApplyForceOnStart _applyForceOnStart; private void Awake() { _applyForceOnStart = ((Component)this).GetComponent<ApplyForceOnStart>(); } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_applyForceOnStart)) { _applyForceOnStart.Start(); } } } public sealed class ApplyTorqueOnStartRestarter : MonoBehaviour, IEffectRestarter { private ApplyTorqueOnStart _applyTorqueOnStart; private void Awake() { _applyTorqueOnStart = ((Component)this).GetComponent<ApplyTorqueOnStart>(); } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_applyTorqueOnStart)) { _applyTorqueOnStart.Start(); } } } public class CoinBehaviorRestarter : MonoBehaviour, IEffectRestarter { private CoinBehavior _coinBehavior; private void Awake() { _coinBehavior = ((Component)this).GetComponent<CoinBehavior>(); } void IEffectRestarter.Restart() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)_coinBehavior)) { return; } CoinTier[] coinTiers = _coinBehavior.coinTiers; for (int i = 0; i < coinTiers.Length; i++) { ParticleSystem particleSystem = coinTiers[i].particleSystem; if (Object.op_Implicit((Object)(object)particleSystem)) { EmissionModule emission = particleSystem.emission; ((EmissionModule)(ref emission)).enabled = false; particleSystem.Stop(); particleSystem.Clear(); ((Component)particleSystem).gameObject.SetActive(false); } } _coinBehavior.Start(); } } public sealed class EffectPassArgsToLocalTokenRestarter : MonoBehaviour, IEffectRestarter { private EffectPassArgsToLocalToken _effectPassArgsToLocalToken; private void Awake() { _effectPassArgsToLocalToken = ((Component)this).GetComponent<EffectPassArgsToLocalToken>(); } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_effectPassArgsToLocalToken)) { _effectPassArgsToLocalToken.Start(); } } } public sealed class EffectRestarterController : MonoBehaviour { private EffectComponent _effectComponent; private Rigidbody[] _rigidbodies = Array.Empty<Rigidbody>(); private IEffectRestarter[] _restarters = Array.Empty<IEffectRestarter>(); private Vector3 _originalScale = Vector3.one; private void Awake() { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) _effectComponent = ((Component)this).GetComponent<EffectComponent>(); if (Object.op_Implicit((Object)(object)_effectComponent)) { EffectComponent effectComponent = _effectComponent; effectComponent.OnEffectComponentReset = (Action<bool>)Delegate.Combine(effectComponent.OnEffectComponentReset, new Action<bool>(onEffectComponentReset)); } _rigidbodies = ((Component)this).GetComponentsInChildren<Rigidbody>(true); _restarters = ((Component)this).GetComponentsInChildren<IEffectRestarter>(true); _originalScale = ((Component)this).transform.localScale; } private void OnDestroy() { if (Object.op_Implicit((Object)(object)_effectComponent)) { EffectComponent effectComponent = _effectComponent; effectComponent.OnEffectComponentReset = (Action<bool>)Delegate.Remove(effectComponent.OnEffectComponentReset, new Action<bool>(onEffectComponentReset)); } } private void onEffectComponentReset(bool hasEffectData) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) if (((Component)this).gameObject.activeSelf) { return; } if (!hasEffectData || !_effectComponent.applyScale) { ((Component)this).transform.localScale = _originalScale; } Rigidbody[] rigidbodies = _rigidbodies; foreach (Rigidbody val in rigidbodies) { if (Object.op_Implicit((Object)(object)val)) { val.velocity = Vector3.zero; val.angularVelocity = Vector3.zero; } } IEffectRestarter[] restarters = _restarters; foreach (IEffectRestarter effectRestarter in restarters) { if (effectRestarter != null) { Object val2 = (Object)((effectRestarter is Object) ? effectRestarter : null); if (val2 == null || Object.op_Implicit(val2)) { effectRestarter.Restart(); } } } } } public sealed class ExplodeRigidbodiesOnStartRestarter : MonoBehaviour, IEffectRestarter { private ExplodeRigidbodiesOnStart _explodeRigidbodiesOnStart; private void Awake() { _explodeRigidbodiesOnStart = ((Component)this).GetComponent<ExplodeRigidbodiesOnStart>(); } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_explodeRigidbodiesOnStart)) { _explodeRigidbodiesOnStart.Start(); } } } public interface IEffectRestarter { void Restart(); } public sealed class ImpactEffectRestarter : MonoBehaviour, IEffectRestarter { private ImpactEffect _impactEffect; private void Awake() { _impactEffect = ((Component)this).GetComponent<ImpactEffect>(); } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_impactEffect)) { ParticleSystem[] particleSystems = _impactEffect.particleSystems; foreach (ParticleSystem obj in particleSystems) { obj.Stop(); obj.Clear(); } _impactEffect.Start(); } } } public sealed class LightScaleFromParentRestarter : MonoBehaviour, IEffectRestarter { private LightScaleFromParent _lightScaleFromParent; private Light _light; private float _originalRange; private void Awake() { _lightScaleFromParent = ((Component)this).GetComponent<LightScaleFromParent>(); Light val = default(Light); if (((Component)this).TryGetComponent<Light>(ref val)) { _light = val; _originalRange = val.range; } else { Log.Warning("No light reference, light range will not be restored: " + Util.GetGameObjectHierarchyName(((Component)this).gameObject), "X:\\Git\\RoR2\\VFiX\\VFiX\\PooledEffectStart\\LightScaleFromParentRestarter.cs", "Awake", 25); } } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_light)) { _light.range = _originalRange; } else { Log.Warning("No light reference, light range will not be restored: " + Util.GetGameObjectHierarchyName(((Component)this).gameObject), "X:\\Git\\RoR2\\VFiX\\VFiX\\PooledEffectStart\\LightScaleFromParentRestarter.cs", "Restart", 38); } if (Object.op_Implicit((Object)(object)_lightScaleFromParent)) { _lightScaleFromParent.Start(); } } } public sealed class ParticleSystemColorFromEffectDataRestarter : MonoBehaviour, IEffectRestarter { private ParticleSystemColorFromEffectData _particleSystemColorFromEffectData; private void Awake() { _particleSystemColorFromEffectData = ((Component)this).GetComponent<ParticleSystemColorFromEffectData>(); } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_particleSystemColorFromEffectData)) { ParticleSystem[] particleSystems = _particleSystemColorFromEffectData.particleSystems; foreach (ParticleSystem obj in particleSystems) { obj.Stop(); obj.Clear(); } _particleSystemColorFromEffectData.Start(); } } } public sealed class ParticleSystemRandomColorRestarter : MonoBehaviour, IEffectRestarter { private ParticleSystemRandomColor _particleSystemRandomColor; private void Awake() { _particleSystemRandomColor = ((Component)this).GetComponent<ParticleSystemRandomColor>(); } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_particleSystemRandomColor)) { _particleSystemRandomColor.Awake(); } } } internal static class PooledEffectStartFix { [SystemInitializer(new Type[] { typeof(EffectCatalog) })] private static void Init() { for (int i = 0; i < EffectCatalog.effectCount; i++) { EffectDef effectDef = EffectCatalog.GetEffectDef((EffectIndex)i); GameObject prefab; if (effectDef != null && Object.op_Implicit((Object)(object)effectDef.prefab) && (!Object.op_Implicit((Object)(object)effectDef.prefabVfxAttributes) || !effectDef.prefabVfxAttributes.DoNotPool)) { prefab = effectDef.prefab; if (false | tryAddRestarters<LightScaleFromParent, LightScaleFromParentRestarter>() | tryAddRestarters<ImpactEffect, ImpactEffectRestarter>() | tryAddRestarters<ParticleSystemColorFromEffectData, ParticleSystemColorFromEffectDataRestarter>() | tryAddRestarters<CoinBehavior, CoinBehaviorRestarter>() | tryAddRestarters<VelocityRandomOnStart, VelocityRandomOnStartRestarter>() | tryAddRestarters<ParticleSystemRandomColor, ParticleSystemRandomColorRestarter>() | tryAddRestarters<ApplyTorqueOnStart, ApplyTorqueOnStartRestarter>() | tryAddRestarters<ApplyForceOnStart, ApplyForceOnStartRestarter>() | tryAddRestarters<ExplodeRigidbodiesOnStart, ExplodeRigidbodiesOnStartRestarter>() | tryAddRestarters<SetRandomRotation, SetRandomRotationRestarter>() | tryAddRestarters<EffectPassArgsToLocalToken, EffectPassArgsToLocalTokenRestarter>()) { UnityObjectExtensions.EnsureComponent<EffectRestarterController>(prefab); } } bool tryAddRestarters<TComponent, TRestarter>() where TComponent : Component where TRestarter : MonoBehaviour, IEffectRestarter { bool result = false; TComponent[] componentsInChildren = prefab.GetComponentsInChildren<TComponent>(true); for (int j = 0; j < componentsInChildren.Length; j++) { ((Component)componentsInChildren[j]).gameObject.AddComponent<TRestarter>(); result = true; } return result; } } } [Conditional("DEBUG")] private static void logUnhandledStartComponents(EffectDef effectDef) { MonoBehaviour[] componentsInChildren = effectDef.prefab.GetComponentsInChildren<MonoBehaviour>(); foreach (MonoBehaviour val in componentsInChildren) { Type type = ((object)val).GetType(); if (type == typeof(EffectComponent) || type == typeof(DestroyOnTimer) || type == typeof(DestroyOnParticleEnd) || type == typeof(AnimateShaderAlpha) || type == typeof(LightScaleFromParent) || type == typeof(RTPCController) || type == typeof(TeamFilter) || type == typeof(ScaleParticleSystemDuration) || type == typeof(RotateObject) || type == typeof(AlignToNormal) || type == typeof(OmniEffect) || type == typeof(ImpactEffect) || type == typeof(ParticleSystemColorFromEffectData) || type == typeof(LaserPointer) || type == typeof(CoinBehavior) || type == typeof(VelocityRandomOnStart) || type == typeof(ParticleSystemRandomColor) || type == typeof(RigidbodyStickOnImpact) || type == typeof(ApplyTorqueOnStart) || type == typeof(ApplyForceOnStart) || type == typeof(ExplodeRigidbodiesOnStart) || type == typeof(MaintainRotation) || type == typeof(RotateItem) || type == typeof(SetRandomRotation) || type == typeof(Tracer) || type == typeof(BeamPointsFromTransforms) || type == typeof(LineBetweenTransforms) || type == typeof(MultiPointBezierCurveLine) || type == typeof(AddOverlayToReferencedObject) || type == typeof(TemporaryOverlay) || type == typeof(RendererColorFromEffectData) || type == typeof(EffectRetimer) || type == typeof(EffectPassArgsToLocalToken) || type == typeof(RotateIfMoving) || type == typeof(PickRandomObjectOnAwake) || type == typeof(PlatformToggle)) { continue; } bool num = type.GetMethod("Awake", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) != null || type.GetMethod("Start", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) != null; bool flag = type.GetMethod("OnEnable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) != null; if (num && !flag) { string text = "Init-only component " + type.FullName + " on " + effectDef.prefabName; if ((Object)(object)((Component)val).transform != (Object)(object)effectDef.prefab.transform) { text = text + ", at " + Util.BuildPrefabTransformPath(effectDef.prefab.transform, ((Component)val).transform, false, true); } Log.Info(text, "X:\\Git\\RoR2\\VFiX\\VFiX\\PooledEffectStart\\PooledEffectStartFix.cs", "logUnhandledStartComponents", 92); } } } } public sealed class RotateIfMovingRestarter : MonoBehaviour, IEffectRestarter { private RotateIfMoving _rotateIfMoving; private void Awake() { _rotateIfMoving = ((Component)this).GetComponent<RotateIfMoving>(); } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_rotateIfMoving)) { _rotateIfMoving.Start(); } } } public sealed class SetRandomRotationRestarter : MonoBehaviour, IEffectRestarter { private SetRandomRotation _setRandomRotation; private Vector3 _originalEulerAngles; private void Awake() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) _setRandomRotation = ((Component)this).GetComponent<SetRandomRotation>(); _originalEulerAngles = ((Component)this).transform.localEulerAngles; } void IEffectRestarter.Restart() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)_setRandomRotation)) { ((Component)this).transform.localEulerAngles = _originalEulerAngles; _setRandomRotation.Start(); } } } public sealed class VelocityRandomOnStartRestarter : MonoBehaviour, IEffectRestarter { private VelocityRandomOnStart _velocityRandomOnStart; private void Awake() { _velocityRandomOnStart = ((Component)this).GetComponent<VelocityRandomOnStart>(); } void IEffectRestarter.Restart() { if (Object.op_Implicit((Object)(object)_velocityRandomOnStart)) { _velocityRandomOnStart.Start(); } } } } namespace VFiX.PooledEffectEvents { internal static class PooledEffectStartEventFix { [SystemInitializer(new Type[] { })] private static void Init() { convertStartEventsToEnable(RoR2_Base_Captain.CaptainAirstrikeGhost1_prefab); static void convertStartEventsToEnable(string assetGuid) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) AssetLoadUtils.LoadTempAssetAsync<GameObject>(assetGuid).CallOnSuccess<GameObject>(transferStartEventsToEnable); } } private static void transferStartEventsToEnable(GameObject obj) { //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Expected O, but got Unknown StartEvent val = default(StartEvent); if (!obj.TryGetComponent<StartEvent>(ref val) || val.action == null) { return; } List<BaseInvokableCall> list = new List<BaseInvokableCall>(); List<PersistentCall> list2 = new List<PersistentCall>(); if (((UnityEventBase)val.action).m_Calls?.m_ExecutingCalls != null) { foreach (BaseInvokableCall executingCall in ((UnityEventBase)val.action).m_Calls.m_ExecutingCalls) { list.Add(executingCall); } } if (((UnityEventBase)val.action).m_PersistentCalls != null) { foreach (PersistentCall listener in ((UnityEventBase)val.action).m_PersistentCalls.GetListeners()) { list2.Add(listener); } } if (list.Count <= 0 && list2.Count <= 0) { return; } OnEnableEvent val2 = UnityObjectExtensions.EnsureComponent<OnEnableEvent>(obj); OnEnableEvent val3 = val2; if (val3.action == null) { val3.action = new UnityEvent(); } foreach (BaseInvokableCall item in list) { ((UnityEventBase)val2.action).AddCall(item); } foreach (PersistentCall item2 in list2) { ((UnityEventBase)val2.action).m_PersistentCalls.AddListener(item2); } ((Behaviour)val).enabled = false; } } } namespace VFiX.PooledEffectCleanup { internal static class EffectPoolPreventInUsePoolClearFix { [CompilerGenerated] private static class <>O { public static Manipulator <0>__EffectManager_UnloadOutdatedPools; } public static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown object obj = <>O.<0>__EffectManager_UnloadOutdatedPools; if (obj == null) { Manipulator val = EffectManager_UnloadOutdatedPools; <>O.<0>__EffectManager_UnloadOutdatedPools = val; obj = (object)val; } EffectManager.UnloadOutdatedPools += (Manipulator)obj; } private static void EffectManager_UnloadOutdatedPools(ILContext il) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); PropertyInfo effectPrefabMapCount = typeof(Dictionary<GameObject, EffectPool>).GetProperty("Count"); if (effectPrefabMapCount == null) { Log.Error("Failed to find Dictionary Count property", "X:\\Git\\RoR2\\VFiX\\VFiX\\PooledEffectCleanup\\EffectPoolPreventInUsePoolClearFix.cs", "EffectManager_UnloadOutdatedPools", 26); return; } int num = default(int); if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, (MethodBase)effectPrefabMapCount.GetMethod), (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, ref num) })) { Log.Error("Failed to find patch location", "X:\\Git\\RoR2\\VFiX\\VFiX\\PooledEffectCleanup\\EffectPoolPreventInUsePoolClearFix.cs", "EffectManager_UnloadOutdatedPools", 34); return; } val.Emit(OpCodes.Pop); val.Emit(OpCodes.Ldc_I4, int.MaxValue); } } internal static class PooledEffectCleanupSoundFix { [CompilerGenerated] private static class <>O { public static hook_PreDestroyObject <0>__EffectPool_PreDestroyObject; } public static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown object obj = <>O.<0>__EffectPool_PreDestroyObject; if (obj == null) { hook_PreDestroyObject val = EffectPool_PreDestroyObject; <>O.<0>__EffectPool_PreDestroyObject = val; obj = (object)val; } EffectPool.PreDestroyObject += (hook_PreDestroyObject)obj; } private static void EffectPool_PreDestroyObject(orig_PreDestroyObject orig, EffectPool self, EffectManagerHelper inKillObject) { orig.Invoke(self, inKillObject); AkTriggerHandler val = default(AkTriggerHandler); if (Object.op_Implicit((Object)(object)inKillObject) && ((Component)inKillObject).TryGetComponent<AkTriggerHandler>(ref val)) { val.triggerList.Clear(); } } } } namespace VFiX.MeteorStrikePredictionEffect { internal static class MeteorStrikePredictionEffectFix { public static void Init() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) AssetLoadUtils.LoadTempAssetAsync<GameObject>(RoR2_Base_Meteor.MeteorStrikePredictionEffect_prefab).CallOnSuccess(delegate(GameObject meteorStrikePredictionEffect) { Transform val = meteorStrikePredictionEffect.transform.Find("GroundSlamIndicator"); AnimateShaderAlpha val2 = default(AnimateShaderAlpha); if (!Object.op_Implicit((Object)(object)val)) { Log.Error("Failed to find GroundSlamIndicator", "X:\\Git\\RoR2\\VFiX\\VFiX\\MeteorStrikePredictionEffect\\MeteorStrikePredictionEffectFix.cs", "Init", 16); } else if (!((Component)val).TryGetComponent<AnimateShaderAlpha>(ref val2)) { Log.Error(((Object)val).name + " is missing AnimateShaderAlpha component", "X:\\Git\\RoR2\\VFiX\\VFiX\\MeteorStrikePredictionEffect\\MeteorStrikePredictionEffectFix.cs", "Init", 22); } else { val2.continueExistingAfterTimeMaxIsReached = true; } }); } } } namespace VFiX.GrandparentPreSpawnEffect { internal static class GrandparentPreSpawnEffectFix { public static void Init() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) AssetLoadUtils.LoadTempAssetAsync<GameObject>(RoR2_Base_Grandparent.GrandparentPreSpawnEffect_prefab).CallOnSuccess(delegate(GameObject grandparentPreSpawnEffect) { VFXAttributes val = default(VFXAttributes); if (grandparentPreSpawnEffect.TryGetComponent<VFXAttributes>(ref val)) { val.DoNotPool = true; } }); } } } namespace VFiX.DitherFix { internal static class ModelDitherFix { [CompilerGenerated] private sealed class <>c__DisplayClass1_0 { public HashSet<string> loadedAssets; public HashSet<Material> handledMaterials; public int numFixedMaterials; public ParallelCoroutine loadCoroutine; public Stopwatch stopwatch; } private static readonly int _FadeOn = Shader.PropertyToID("_FadeOn"); [SystemInitializer(new Type[] { typeof(SkinCatalog), typeof(BodyCatalog), typeof(ItemDisplayRuleSet) })] private static void Init() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Invalid comparison between Unknown and I4 //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) <>c__DisplayClass1_0 CS$<>8__locals0 = new <>c__DisplayClass1_0(); CS$<>8__locals0.stopwatch = Stopwatch.StartNew(); CS$<>8__locals0.loadedAssets = new HashSet<string>(); CS$<>8__locals0.handledMaterials = new HashSet<Material>(); CS$<>8__locals0.numFixedMaterials = 0; CS$<>8__locals0.loadCoroutine = new ParallelCoroutine(); for (SkinIndex val = (SkinIndex)0; (int)val < SkinCatalog.skinCount; val = (SkinIndex)(val + 1)) { SkinDef skinDef = SkinCatalog.GetSkinDef(val); if (Object.op_Implicit((Object)(object)skinDef)) { var (val2, val3) = skinDef.GetSkinParams(); if (Object.op_Implicit((Object)(object)val3)) { CS$<>8__locals0.loadCoroutine.Add(handleSkinParamsAsync(val3)); } else if (val2 != null && ((AssetReference)val2).RuntimeKeyIsValid() && CS$<>8__locals0.loadedAssets.Add(((AssetReference)val2).RuntimeKey.ToString())) { CS$<>8__locals0.loadCoroutine.Add(loadSkinParamsAsync(val2)); } } } foreach (ItemDisplayRuleSet instances in ItemDisplayRuleSet.instancesList) { KeyAssetRuleGroup[] keyAssetRuleGroups = instances.keyAssetRuleGroups; foreach (KeyAssetRuleGroup val4 in keyAssetRuleGroups) { DisplayRuleGroup displayRuleGroup = val4.displayRuleGroup; if (((DisplayRuleGroup)(ref displayRuleGroup)).isEmpty) { continue; } ItemDisplayRule[] rules = val4.displayRuleGroup.rules; foreach (ItemDisplayRule val5 in rules) { if (Object.op_Implicit((Object)(object)val5.followerPrefab)) { CS$<>8__locals0.loadCoroutine.Add(handleDisplayPrefabAsync(val5.followerPrefab)); } else if (val5.followerPrefabAddress != null && ((AssetReference)val5.followerPrefabAddress).RuntimeKeyIsValid() && CS$<>8__locals0.loadedAssets.Add(((AssetReference)val5.followerPrefabAddress).RuntimeKey.ToString())) { CS$<>8__locals0.loadCoroutine.Add(loadDisplayPrefabAsync((AssetReferenceT<GameObject>)(object)val5.followerPrefabAddress)); } } } } ((MonoBehaviour)RoR2Application.instance).StartCoroutine(runLoadCoroutine()); [IteratorStateMachine(typeof(<>c__DisplayClass1_0.<<Init>g__handleDisplayPrefabAsync|7>d))] IEnumerator handleDisplayPrefabAsync(GameObject displayPrefab) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <>c__DisplayClass1_0.<<Init>g__handleDisplayPrefabAsync|7>d(0) { <>4__this = CS$<>8__locals0, displayPrefab = displayPrefab }; } void handleMaterial(Material material) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)material)) { Shader shader = material.shader; if (Object.op_Implicit((Object)(object)shader) && CS$<>8__locals0.handledMaterials.Add(material)) { bool flag = false; LocalKeywordSpace keywordSpace = shader.keywordSpace; LocalKeyword val6 = ((LocalKeywordSpace)(ref keywordSpace)).FindKeyword("DITHER"); if (((LocalKeyword)(ref val6)).isValid && !material.IsKeywordEnabled("DITHER")) { material.EnableKeyword("DITHER"); flag = true; } if (material.HasInt(_FadeOn) && material.GetInt(_FadeOn) == 0) { material.SetInt(_FadeOn, 1); flag = true; } if (flag) { CS$<>8__locals0.numFixedMaterials++; } } } } IEnumerator handleRendererInfosAsync(IEnumerable<RendererInfo> rendererInfos) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_0031: 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_0039: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) ParallelCoroutine val7 = new ParallelCoroutine(); foreach (RendererInfo rendererInfo in rendererInfos) { if (Object.op_Implicit((Object)(object)rendererInfo.defaultMaterial)) { handleMaterial(rendererInfo.defaultMaterial); } else if (rendererInfo.defaultMaterialAddress != null && ((AssetReference)rendererInfo.defaultMaterialAddress).RuntimeKeyIsValid() && CS$<>8__locals0.loadedAssets.Add(((AssetReference)rendererInfo.defaultMaterialAddress).RuntimeKey.ToString())) { val7.Add(loadMaterialAsync(rendererInfo.defaultMaterialAddress)); } } return (IEnumerator)val7; } IEnumerator handleSkinParamsAsync(SkinDefParams skinDefParams) { return handleRendererInfosAsync(skinDefParams.rendererInfos); } [IteratorStateMachine(typeof(<>c__DisplayClass1_0.<<Init>g__loadDisplayPrefabAsync|6>d))] IEnumerator loadDisplayPrefabAsync(AssetReferenceT<GameObject> displayPrefabReference) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <>c__DisplayClass1_0.<<Init>g__loadDisplayPrefabAsync|6>d(0) { <>4__this = CS$<>8__locals0, displayPrefabReference = displayPrefabReference }; } [IteratorStateMachine(typeof(<>c__DisplayClass1_0.<<Init>g__loadMaterialAsync|1>d))] IEnumerator loadMaterialAsync(AssetReferenceT<Material> materialReference) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <>c__DisplayClass1_0.<<Init>g__loadMaterialAsync|1>d(0) { <>4__this = CS$<>8__locals0, materialReference = materialReference }; } [IteratorStateMachine(typeof(<>c__DisplayClass1_0.<<Init>g__loadSkinParamsAsync|5>d))] IEnumerator loadSkinParamsAsync(AssetReferenceT<SkinDefParams> skinParamsReference) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <>c__DisplayClass1_0.<<Init>g__loadSkinParamsAsync|5>d(0) { <>4__this = CS$<>8__locals0, skinParamsReference = skinParamsReference }; } [IteratorStateMachine(typeof(<>c__DisplayClass1_0.<<Init>g__runLoadCoroutine|3>d))] IEnumerator runLoadCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <>c__DisplayClass1_0.<<Init>g__runLoadCoroutine|3>d(0) { <>4__this = CS$<>8__locals0 }; } } } }