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<float>
{
public int Compare(float x, float y)
{
return -x.CompareTo(y);
}
}
public float priority = 0f;
private static HashSet<string> assemblyBlacklist = new HashSet<string>
{
"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<float, List<MethodInfo>> sortedList = new SortedList<float, List<MethodInfo>>(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<Initializer>(inherit: false))
{
if (sortedList.ContainsKey(customAttribute.priority))
{
DictionaryExtensions.Get<float, List<MethodInfo>>((IDictionary<float, List<MethodInfo>>)sortedList, customAttribute.priority, (List<MethodInfo>)null).Add(methodInfo);
continue;
}
sortedList.Add(customAttribute.priority, new List<MethodInfo>(1) { methodInfo });
}
}
}
}
foreach (List<MethodInfo> value in sortedList.Values)
{
foreach (MethodInfo item in value)
{
item.Invoke(null, null);
}
}
}
public Initializer(float priority = 0f)
{
this.priority = priority;
}
public static IEnumerable<Assembly> 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<ModUtil>();
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)
{
}
}
}