using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using JetBrains.Annotations; using JoelG.ENA4; using Logger; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.UIElements.Collections; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ENA_Utils")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+d9157ff434ff625571c8589452dcaad36f2ea474")] [assembly: AssemblyProduct("ENA_Utils")] [assembly: AssemblyTitle("ENA_Utils")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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; } } } [PublicAPI] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)] [MeansImplicitUse] public class Initializer : Attribute { private class DescendingComp : IComparer { public int Compare(float x, float y) { return -x.CompareTo(y); } } public float priority = 0f; private static HashSet assemblyBlacklist = new HashSet { "mscorlib", "BepInEx.Preloader", "BepInEx", "System.Core", "MonoMod.Utils", "Mono.Cecil", "Mono.Cecil.Mdb", "Mono.Cecil.Pdb", "Mono.Cecil.Rocks", "MonoMod.RuntimeDetour", "0Harmony", "System", "HarmonyXInterop", "Mono.Security", "System.Configuration", "System.Xml", "BepInEx.MonoMod.HookGenPatcher", "MonoMod", "MonoMod.RuntimeDetour.HookGen", "netstandard", "UnityEngine.CoreModule", "UnityEngine", "UnityEngine.AIModule", "UnityEngine.ARModule", "UnityEngine.AccessibilityModule", "UnityEngine.AndroidJNIModule", "UnityEngine.AnimationModule", "UnityEngine.AssetBundleModule", "UnityEngine.AudioModule", "UnityEngine.ClothModule", "UnityEngine.ClusterInputModule", "UnityEngine.ClusterRendererModule", "UnityEngine.CrashReportingModule", "UnityEngine.DSPGraphModule", "UnityEngine.DirectorModule", "UnityEngine.GIModule", "UnityEngine.GameCenterModule", "UnityEngine.GridModule", "UnityEngine.HotReloadModule", "UnityEngine.IMGUIModule", "UnityEngine.ImageConversionModule", "UnityEngine.InputModule", "UnityEngine.InputLegacyModule", "UnityEngine.JSONSerializeModule", "UnityEngine.LocalizationModule", "UnityEngine.NVIDIAModule", "UnityEngine.ParticleSystemModule", "UnityEngine.PerformanceReportingModule", " UnityEngine.PhysicsModule", "UnityEngine.Physics2DModule", "UnityEngine.ProfilerModule", "UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule", "UnityEngine.ScreenCaptureModule", "UnityEngine.SharedInternalsModule", "UnityEngine.SpriteMaskModule", "UnityEngine.SpriteShapeModule", "UnityEngine.StreamingModule", " UnityEngine.SubstanceModule", "UnityEngine.SubsystemsModule", "UnityEngine.TLSModule", "UnityEngine.TerrainModule", "UnityEngine.TerrainPhysicsModule", "UnityEngine.TextCoreFontEngineModule", "UnityEngine.TextCoreTextEngineModule", "UnityEngine.TextRenderingModule", "UnityEngine.TilemapModule", "UnityEngine.UIModule", "UnityEngine.UIElementsModule", "UnityEngine.UIElementsNativeModule", "UnityEngine.UNETModule", "UnityEngine.UmbraModule", "UnityEngine.UnityAnalyticsModule", "UnityEngine.UnityAnalyticsCommonModule", "UnityEngine.UnityConnectModule", "UnityEngine.UnityCurlModule", "UnityEngine.UnityTestProtocolModule", "UnityEngine.UnityWebRequestModule", "UnityEngine.UnityWebRequestAssetBundleModule", "UnityEngine.UnityWebRequestAudioModule", "UnityEngine.UnityWebRequestTextureModule", "UnityEngine.UnityWebRequestWWWModule", "UnityEngine.VFXModule", "UnityEngine.VRModule", "UnityEngine.VehiclesModule", "UnityEngine.VideoModule", "UnityEngine.VirtualTexturingModule", "UnityEngine.WindModule", "UnityEngine.XRModule", "Assembly-CSharp-firstpass", "Assembly-CSharp", "DOTween.Modules", "UnityFx.Outline", "Unity.RenderPipelines.Universal.Shaders", "DOTweenPro.Scripts", "Unity.Addressables", "UnityFx.Outline.URP", "Unity.ProBuilder", "Unity.RenderPipelines.Core.ShaderLibrary", "UnityEngine.UI", "UnityHierarchyFolders.Runtime", "Unity.ProBuilder.Poly2Tri", "YarnSpinner.Unity", "Cinemachine", "LMirman.VespaIO.LLAPI", "PathCreator.Examples", "Unity.RenderPipeline.Universal.ShaderLibrary", "Rewired_Windows_Functions", "Coffee.UIParticle", "ScreenSpaceReflections", "Unity.Recorder", "JoelG.ENA4", "Unity.Recorder.Base", "Unity.RenderPipelines.Universal.Runtime", "NaughtyAttributes.Test", "Unity.VisualEffectGraph.Runtime", "Unity.Timeline", "LMirman.Utilities", "Unity.TextMeshPro", "Unity.ProBuilder.Csg", "Unity.ResourceManager", "Unity.RenderPipelines.Core.Runtime", "Febucci.TextAnimator.Runtime", "PathCreator", "com.rlabrecque.steamworks.net", "Unity.Mathematics", "Unity.ProBuilder.KdTree", "LMirman.RewiredGlyphs", "Unity.Burst", "YarnSpinnerTests.CommandsInAnAssemblyDefinition", "Unity.ProBuilder.Stl", "NaughtyAttributes.Core", "LMirman.VespaIO", "Unity.ScriptableBuildPipeline", "FMODUnityResonance", "FMODUnity", "Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary", "Yarn.Microsoft.Extensions.FileSystemGlobbing", "DOTween", "Yarn.System.Buffers", "Yarn.Antlr4.Runtime.Standard", "Rewired_Windows", "YarnSpinner.Compiler", "System.Drawing.Common", "Yarn.System.Runtime.CompilerServices.Unsafe", "Unity.Burst.Unsafe", "Yarn.Google.Protobuf", "Yarn.System.Text.Encodings.Web", "Rewired_Core", "Yarn.Microsoft.Bcl.AsyncInterfaces", "Newtonsoft.Json", "YarnSpinner", "System.IO.Packaging", "Yarn.System.Threading.Tasks.Extensions", "Yarn.System.Numerics.Vectors", "DOTweenPro", "DemiLib", "Microsoft.Win32.SystemEvents", "Yarn.CsvHelper", "Yarn.System.Reflection.TypeExtensions", "Yarn.System.Text.Json", "Yarn.System.Memory", "UnityExplorer.BIE5.Mono", "UniverseLib.Mono", "Microsoft.CSharp", "System.Collections.Concurrent", "System.Collections", "System.ComponentModel.Composition", "System.Console", "System.Data.DataSetExtensions", "System.Data", "System.Transactions", "System.Diagnostics.Debug", "System.Diagnostics.Tools", "System.Drawing", "System.EnterpriseServices", "System.Globalization", "System.IO.Compression", "System.IO.Compression.FileSystem", "System.IO", "System.IO.FileSystem", "System.IO.FileSystem.Primitives", "System.Linq", "System.Net.Http", "System.Numerics", "System.ObjectModel", "System.Reflection", " System.Reflection.Extensions", "System.Resources.ResourceManager", "System.Runtime", "System.Runtime.Extensions", "System.Runtime.InteropServices", "System.Runtime.Serialization", "System.ServiceModel.Internals", "System.Security", "System.Text.Encoding", "System.Threading", "System.Threading.Tasks", "System.Xml.Linq", "System.Xml.ReaderWriter", "UnityEngine.CoreModule", "MonoMod.Utils.GetManagedSizeHelper" }; public static void Init() { SortedList> sortedList = new SortedList>(new DescendingComp()); foreach (Assembly scannableAssembly in GetScannableAssemblies()) { Type[] types = GetTypes(scannableAssembly); foreach (Type type in types) { if (!type.IsClass) { continue; } MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { foreach (Initializer customAttribute in methodInfo.GetCustomAttributes(inherit: false)) { if (sortedList.ContainsKey(customAttribute.priority)) { DictionaryExtensions.Get>((IDictionary>)sortedList, customAttribute.priority, (List)null).Add(methodInfo); continue; } sortedList.Add(customAttribute.priority, new List(1) { methodInfo }); } } } } foreach (List value in sortedList.Values) { foreach (MethodInfo item in value) { item.Invoke(null, null); } } } public Initializer(float priority = 0f) { this.priority = priority; } public static IEnumerable GetScannableAssemblies() { return from a in AppDomain.CurrentDomain.GetAssemblies() where !assemblyBlacklist.Contains(a.GetName().Name) select a; } public static Type[] GetTypes(Assembly assembly) { Type[] types; try { types = assembly.GetTypes(); } catch (ReflectionTypeLoadException ex) { Log.Error($"ScanAssembly: {ex}"); types = ex.Types; if (types == null) { return null; } } catch (Exception arg) { Log.Error($"ScanAssembly: {arg}"); return null; } return types; } } namespace Logger { internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { StackFrame stackFrame = new StackFrame(1); MethodBase method = stackFrame.GetMethod(); _logSource.LogInfo((object)("[" + method.Name + "]: " + data)); } internal static void Warning(object data) { _logSource.LogWarning(data); } } } namespace ENA_Utils { [BepInPlugin("Onyx.ENA_Utils", "ENA_Utils", "1.0.0")] public class ENA_Utils : BaseUnityPlugin { public class ModUtil : MonoBehaviour { private void Start() { Initializer.Init(); } } public const string PluginGUID = "Onyx.ENA_Utils"; public const string PluginAuthor = "Onyx"; public const string PluginName = "ENA_Utils"; public const string PluginVersion = "1.0.0"; public static GameObject ModUtilObj; private static ModUtil _modUtil; public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); SceneChanger.SceneChangeEvent += SceneChangeEvent; } private void SceneChangeEvent(SceneChangeEventArgs args) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown if (!Object.op_Implicit((Object)(object)ModUtilObj)) { ModUtilObj = new GameObject("ModUtil"); _modUtil = ModUtilObj.AddComponent(); Object.DontDestroyOnLoad((Object)(object)ModUtilObj); } } public static void StartCoroutine(IEnumerator enumerator) { if (Object.op_Implicit((Object)(object)ModUtilObj) && Object.op_Implicit((Object)(object)_modUtil)) { ((MonoBehaviour)_modUtil).StartCoroutine(enumerator); } else { Log.Error("ModUtilobject doesn't exist"); } } public static string GetModBundlePath(string bundleName) { return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), bundleName + ".bundle"); } public static string GetGameBundlePath(string bundleName) { return Path.Combine(Addressables.RuntimePath, "StandaloneWindows64", bundleName + ".bundle"); } } public static class Reflection { private const BindingFlags AllFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; public static MethodInfo GetPropertyGetter(this Type type, string propName) { return type.GetProperty(propName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).GetGetMethod(nonPublic: true); } public static MethodInfo GetPropertySetter(this Type type, string propName) { return type.GetProperty(propName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).GetSetMethod(nonPublic: true); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }