

using System;
using System.Collections.Generic;
using System.Diagnostics;
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 BepInEx;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using Mono.Cecil;
using MonoMod.RuntimeDetour;
using MonoMod.Utils;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: InternalsVisibleTo("Sodalite")]
[assembly: AssemblyCompany("nrgill28")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Patching stage for Sodalite")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+1c8025ca5e9773be3b697e74a03f2377680d2805")]
[assembly: AssemblyProduct("Sodalite.Patcher")]
[assembly: AssemblyTitle("Sodalite.Patcher")]
[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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NativeIntegerAttribute : Attribute
{
public readonly bool[] TransformFlags;
public NativeIntegerAttribute()
{
TransformFlags = new bool[1] { true };
}
public NativeIntegerAttribute(bool[] P_0)
{
TransformFlags = P_0;
}
}
[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 Sodalite.Patcher
{
public static class FixPluginTypesSerialization
{
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void AwakeFromLoadDelegate(IntPtr monoManager, int awakeMode);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate bool ReadStringFromFileDelegate(IntPtr outData, IntPtr assemblyStringPathName);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate bool IsFileCreatedDelegate(IntPtr path);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate IntPtr StringAssignType(IntPtr ptr, string str, ulong len);
[StructLayout(LayoutKind.Sequential, Pack = 8)]
private struct AssemblyStringStruct
{
public const int ValidStringLabel = 66;
public nint data;
public ulong capacity;
public ulong extra;
public ulong size;
public int label;
}
private struct AssemblyList
{
public unsafe AssemblyStringStruct* first;
public unsafe AssemblyStringStruct* last;
public unsafe AssemblyStringStruct* end;
}
[StructLayout(LayoutKind.Explicit)]
private struct MonoManagerStruct
{
[FieldOffset(488)]
public AssemblyList m_AssemblyNames;
}
private class MonoManager
{
private unsafe readonly MonoManagerStruct* _this;
private readonly List<AssemblyStringStruct> _managedAssemblyList = new List<AssemblyStringStruct>();
public unsafe MonoManager(IntPtr pointer)
{
_this = (MonoManagerStruct*)(void*)pointer;
}
public unsafe void CopyNativeAssemblyListToManaged()
{
_managedAssemblyList.Clear();
for (AssemblyStringStruct* ptr = _this->m_AssemblyNames.first; ptr != _this->m_AssemblyNames.last; ptr++)
{
AssemblyStringStruct assemblyStringStruct = default(AssemblyStringStruct);
assemblyStringStruct.capacity = ptr->capacity;
assemblyStringStruct.extra = ptr->extra;
assemblyStringStruct.label = ptr->label;
assemblyStringStruct.size = ptr->size;
assemblyStringStruct.data = ptr->data;
AssemblyStringStruct item = assemblyStringStruct;
_managedAssemblyList.Add(item);
}
}
public void AddAssembliesToManagedList(List<string> pluginAssemblyPaths)
{
foreach (string pluginAssemblyPath in pluginAssemblyPaths)
{
string fileName = Path.GetFileName(pluginAssemblyPath);
ulong num = (ulong)fileName.Length;
AssemblyStringStruct assemblyStringStruct = default(AssemblyStringStruct);
assemblyStringStruct.label = 66;
assemblyStringStruct.data = Marshal.StringToHGlobalAnsi(fileName);
assemblyStringStruct.capacity = num;
assemblyStringStruct.size = num;
AssemblyStringStruct item = assemblyStringStruct;
_managedAssemblyList.Add(item);
}
}
public unsafe void AllocNativeAssemblyListFromManaged()
{
AssemblyStringStruct* ptr = (AssemblyStringStruct*)(void*)Marshal.AllocHGlobal(Marshal.SizeOf(typeof(AssemblyStringStruct)) * _managedAssemblyList.Count);
int i = 0;
AssemblyStringStruct* ptr2 = ptr;
for (; i < _managedAssemblyList.Count; i++)
{
ptr2->label = _managedAssemblyList[i].label;
ptr2->size = _managedAssemblyList[i].size;
ptr2->capacity = _managedAssemblyList[i].capacity;
ptr2->extra = _managedAssemblyList[i].extra;
ptr2->data = _managedAssemblyList[i].data;
ptr2++;
}
_this->m_AssemblyNames.first = ptr;
_this->m_AssemblyNames.last = ptr + _managedAssemblyList.Count;
_this->m_AssemblyNames.end = _this->m_AssemblyNames.last;
}
}
private static AwakeFromLoadDelegate _origAwakeFromLoad = null;
private static ReadStringFromFileDelegate _origReadStringFromFile = null;
private static IsFileCreatedDelegate _origIsFileCreated = null;
private static StringAssignType _assignNativeString = null;
private static NativeDetour? _detourReadStringFromFile;
private static NativeDetour? _detourIsFileCreated;
private static readonly List<string> PluginPaths = new List<string>();
public static void ApplyHooks()
{
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
//IL_01c6: Expected O, but got Unknown
//IL_0206: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_0216: Unknown result type (might be due to invalid IL or missing references)
//IL_0220: Expected O, but got Unknown
string[] files = Directory.GetFiles(Paths.PluginPath, "*.dll", SearchOption.AllDirectories);
foreach (string text in files)
{
try
{
AssemblyName.GetAssemblyName(text);
PluginPaths.Add(text);
}
catch (BadImageFormatException)
{
}
}
SodalitePatcher.Logger.LogDebug((object)$"[FixPluginTypesSerialization] Discovered {PluginPaths.Count} plugin assemblies");
ProcessModule? mainModule = Process.GetCurrentProcess().MainModule;
IntPtr baseAddress = mainModule.BaseAddress;
SodalitePatcher.Logger.LogDebug((object)$"[FixPluginTypesSerialization] Game base address: {(int)baseAddress:X}");
bool flag = mainModule.FileVersionInfo.FileVersion.Contains("5.6.7");
SodalitePatcher.Logger.LogDebug((object)("[FixPluginTypesSerialization] Using offsets for Unity " + (flag ? "5.6.7" : "5.6.3")));
int num = (flag ? 291024 : 291232);
int num2 = (flag ? 8644208 : 8640064);
int num3 = (flag ? 7415584 : 7411280);
int num4 = (flag ? 7420704 : 7416400);
_assignNativeString = (StringAssignType)Marshal.GetDelegateForFunctionPointer((IntPtr)(baseAddress.ToInt64() + num), typeof(StringAssignType));
IntPtr intPtr = (IntPtr)(baseAddress.ToInt64() + num2);
IntPtr functionPointerForDelegate = Marshal.GetFunctionPointerForDelegate((Delegate)new AwakeFromLoadDelegate(OnAwakeFromLoad));
NativeDetour val = new NativeDetour(intPtr, functionPointerForDelegate, new NativeDetourConfig
{
ManualApply = true
});
_origAwakeFromLoad = val.GenerateTrampoline<AwakeFromLoadDelegate>();
val.Apply();
IntPtr intPtr2 = (IntPtr)(baseAddress.ToInt64() + num3);
IntPtr functionPointerForDelegate2 = Marshal.GetFunctionPointerForDelegate((Delegate)new ReadStringFromFileDelegate(OnReadStringFromFile));
_detourReadStringFromFile = new NativeDetour(intPtr2, functionPointerForDelegate2, new NativeDetourConfig
{
ManualApply = true
});
_origReadStringFromFile = _detourReadStringFromFile.GenerateTrampoline<ReadStringFromFileDelegate>();
_detourReadStringFromFile.Apply();
IntPtr intPtr3 = (IntPtr)(baseAddress.ToInt64() + num4);
IntPtr functionPointerForDelegate3 = Marshal.GetFunctionPointerForDelegate((Delegate)new IsFileCreatedDelegate(OnIsFileCreated));
_detourIsFileCreated = new NativeDetour(intPtr3, functionPointerForDelegate3, new NativeDetourConfig
{
ManualApply = true
});
_origIsFileCreated = _detourIsFileCreated.GenerateTrampoline<IsFileCreatedDelegate>();
_detourIsFileCreated.Apply();
}
private static void OnAwakeFromLoad(IntPtr monoManagerPtr, int awakeMode)
{
MonoManager monoManager = new MonoManager(monoManagerPtr);
monoManager.CopyNativeAssemblyListToManaged();
monoManager.AddAssembliesToManagedList(PluginPaths);
monoManager.AllocNativeAssemblyListFromManaged();
_origAwakeFromLoad(monoManagerPtr, awakeMode);
NativeDetour? detourReadStringFromFile = _detourReadStringFromFile;
if (detourReadStringFromFile != null)
{
detourReadStringFromFile.Dispose();
}
NativeDetour? detourIsFileCreated = _detourIsFileCreated;
if (detourIsFileCreated != null)
{
detourIsFileCreated.Dispose();
}
}
private static bool OnReadStringFromFile(IntPtr outData, IntPtr assemblyStringPathName)
{
string text = ReadNativeString(assemblyStringPathName);
if (!string.IsNullOrEmpty(text))
{
string fileName = Path.GetFileName(text);
string text2 = PluginPaths.FirstOrDefault((string p) => Path.GetFileName(p) == fileName);
if (!string.IsNullOrEmpty(text2))
{
_assignNativeString(assemblyStringPathName, text2, (ulong)text2.Length);
}
}
return _origReadStringFromFile(outData, assemblyStringPathName);
}
private static bool OnIsFileCreated(IntPtr path)
{
string fileName = Path.GetFileName(ReadNativeString(path));
if (PluginPaths.Any((string p) => Path.GetFileName(p) == fileName))
{
return true;
}
return _origIsFileCreated(path);
}
private static string ReadNativeString(IntPtr ptr)
{
IntPtr intPtr = Marshal.ReadIntPtr(ptr);
if (intPtr == IntPtr.Zero)
{
long num = Marshal.ReadInt64(ptr, 24);
return Marshal.PtrToStringAnsi((IntPtr)(ptr.ToInt64() + 8), (int)num);
}
long num2 = Marshal.ReadInt64(ptr, 8);
return Marshal.PtrToStringAnsi(intPtr, (int)num2);
}
}
internal static class SodalitePatcher
{
private delegate ulong getSteamIDDelegate();
internal static ManualLogSource Logger;
public static IEnumerable<string> TargetDLLs => new string[0];
internal static LogBuffer LogBuffer { get; set; }
private static ulong SessionId { get; set; }
static SodalitePatcher()
{
LogBuffer = new LogBuffer();
Logger = Logger.CreateLogSource("Sodalite");
byte[] array = new byte[4];
new Random().NextBytes(array);
SessionId = BitConverter.ToUInt32(array, 0) | 0x110000100000000uL;
FixPluginTypesSerialization.ApplyHooks();
}
internal static void CheckSpoofSteamUserID()
{
//IL_019a: Unknown result type (might be due to invalid IL or missing references)
//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
try
{
Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly x) => x.GetName().Name == "Assembly-CSharp-firstpass");
if ((object)assembly == null)
{
return;
}
assembly.GetType("Steamworks.NativeMethods").GetMethod("SteamAPI_Init").Invoke(null, new object[0]);
IntPtr intPtr = IntPtr.Zero;
foreach (ProcessModule module in Process.GetCurrentProcess().Modules)
{
if (!(module.ModuleName != "CSteamworks.dll"))
{
intPtr = module.BaseAddress;
break;
}
}
if (intPtr == IntPtr.Zero)
{
Logger.LogError((object)"[SpoofSteamUserID] Steamworks module not found?? SpoofSteamUserID won't work.");
return;
}
IntPtr function = DynDll.GetFunction(intPtr, "ISteamUser_GetSteamID");
Logger.LogDebug((object)$"[SpoofSteamUserID] Steamworks base address: {(int)intPtr:X}");
Logger.LogDebug((object)$"[SpoofSteamUserID] ISteamUser_GetSteamID address: {(int)function:X}");
bool flag = false;
string path = Path.Combine(Paths.ConfigPath, "nrgill28.Sodalite.cfg");
if (File.Exists(path))
{
flag = File.ReadAllLines(path).Any((string line) => line.Contains("SpoofSteamUserID = true"));
}
if (flag)
{
IntPtr functionPointerForDelegate = Marshal.GetFunctionPointerForDelegate((Delegate)new Func<ulong>(GetSteamIDRandomized));
new NativeDetour(function, functionPointerForDelegate, new NativeDetourConfig
{
ManualApply = true
}).Apply();
}
else
{
SessionId = ((getSteamIDDelegate)Marshal.GetDelegateForFunctionPointer(function, typeof(getSteamIDDelegate)))();
}
}
catch (Exception)
{
}
}
private static ulong GetSteamIDRandomized()
{
return SessionId;
}
public static void Patch(AssemblyDefinition assembly)
{
}
}
internal class LogBuffer : ILogListener, IDisposable
{
internal readonly List<LogEventArgs> LogEvents = new List<LogEventArgs>();
public LogBuffer()
{
Logger.Listeners.Add((ILogListener)(object)this);
}
public void Dispose()
{
Logger.Listeners.Remove((ILogListener)(object)this);
}
public void LogEvent(object sender, LogEventArgs eventArgs)
{
LogEvents.Add(eventArgs);
if (eventArgs.Data is string text && text == "Chainloader started")
{
SodalitePatcher.CheckSpoofSteamUserID();
}
}
}
}using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
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.Text;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using FistVR;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour;
using Sodalite.Api;
using Sodalite.ModPanel;
using Sodalite.ModPanel.Components;
using Sodalite.ModPanel.Pages;
using Sodalite.Patcher;
using Sodalite.UiWidgets;
using Sodalite.UiWidgets.Components;
using Sodalite.Utilities;
using Steamworks;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.Rendering.PostProcessing;
using UnityEngine.UI;
using Valve.Newtonsoft.Json;
using Valve.Newtonsoft.Json.Linq;
using Valve.VR;
using YamlDotNet.Serialization;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyCompany("nrgill28")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("API and assistive interfacing code for modding H3VR with BepInEx")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+e6ec4b69b8886e687e5ef0b96356d3399cd2c81e")]
[assembly: AssemblyProduct("Sodalite")]
[assembly: AssemblyTitle("Sodalite")]
[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]
internal sealed class IsReadOnlyAttribute : Attribute
{
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[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;
}
}
}
[StructLayout(LayoutKind.Sequential, Size = 1)]
public struct ScriptableRenderContext
{
}
public static class RenderPipelineManager
{
public static event Action<ScriptableRenderContext, Camera> EndCameraRendering;
}
internal class ThisAssembly
{
public class Git
{
public class BaseVersion
{
public const string Major = "1";
public const string Minor = "5";
public const string Patch = "1";
}
public class SemVer
{
public const string Major = "1";
public const string Minor = "5";
public const string Patch = "1";
public const string Label = "";
public const string DashLabel = "";
public const string Source = "Tag";
}
public const bool IsDirty = true;
public const string IsDirtyString = "true";
public const string RepositoryUrl = "[email protected]:H3VR-Modding/Sodalite.git";
public const string Branch = "main";
public const string Commit = "e6ec4b6";
public const string Sha = "e6ec4b69b8886e687e5ef0b96356d3399cd2c81e";
public const string CommitDate = "2024-12-19T13:07:27-05:00";
public const string Commits = "0";
public const string Tag = "1.5.1";
public const string BaseTag = "1.5.1";
}
}
namespace Popcron
{
public class CubeDrawer : Drawer
{
public override int Draw(ref Vector3[] buffer, params object[] values)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: 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_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_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: 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_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: 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_008a: 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_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: 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)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: 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_00f3: Unknown result type (might be due to invalid IL or missing references)
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: 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_012e: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0177: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_0184: Unknown result type (might be due to invalid IL or missing references)
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
//IL_0196: Unknown result type (might be due to invalid IL or missing references)
//IL_0197: Unknown result type (might be due to invalid IL or missing references)
//IL_0198: Unknown result type (might be due to invalid IL or missing references)
//IL_0199: Unknown result type (might be due to invalid IL or missing references)
//IL_019e: Unknown result type (might be due to invalid IL or missing references)
//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
//IL_01af: Unknown result type (might be due to invalid IL or missing references)
//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
//IL_01da: Unknown result type (might be due to invalid IL or missing references)
//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0204: Unknown result type (might be due to invalid IL or missing references)
//IL_0206: Unknown result type (might be due to invalid IL or missing references)
//IL_0208: Unknown result type (might be due to invalid IL or missing references)
//IL_0209: Unknown result type (might be due to invalid IL or missing references)
//IL_020e: Unknown result type (might be due to invalid IL or missing references)
//IL_0210: Unknown result type (might be due to invalid IL or missing references)
//IL_0211: Unknown result type (might be due to invalid IL or missing references)
//IL_0213: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_0219: Unknown result type (might be due to invalid IL or missing references)
//IL_021e: Unknown result type (might be due to invalid IL or missing references)
//IL_0220: Unknown result type (might be due to invalid IL or missing references)
//IL_0222: Unknown result type (might be due to invalid IL or missing references)
//IL_0223: Unknown result type (might be due to invalid IL or missing references)
//IL_0228: Unknown result type (might be due to invalid IL or missing references)
//IL_022a: Unknown result type (might be due to invalid IL or missing references)
//IL_022b: Unknown result type (might be due to invalid IL or missing references)
//IL_022d: Unknown result type (might be due to invalid IL or missing references)
//IL_022e: Unknown result type (might be due to invalid IL or missing references)
//IL_0233: Unknown result type (might be due to invalid IL or missing references)
//IL_0238: Unknown result type (might be due to invalid IL or missing references)
//IL_023a: Unknown result type (might be due to invalid IL or missing references)
//IL_023c: Unknown result type (might be due to invalid IL or missing references)
//IL_023d: Unknown result type (might be due to invalid IL or missing references)
//IL_0242: Unknown result type (might be due to invalid IL or missing references)
//IL_0244: Unknown result type (might be due to invalid IL or missing references)
//IL_0246: Unknown result type (might be due to invalid IL or missing references)
//IL_0247: Unknown result type (might be due to invalid IL or missing references)
//IL_024c: Unknown result type (might be due to invalid IL or missing references)
//IL_0251: Unknown result type (might be due to invalid IL or missing references)
//IL_0253: Unknown result type (might be due to invalid IL or missing references)
//IL_0255: Unknown result type (might be due to invalid IL or missing references)
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
//IL_025b: Unknown result type (might be due to invalid IL or missing references)
//IL_0260: Unknown result type (might be due to invalid IL or missing references)
//IL_0261: Unknown result type (might be due to invalid IL or missing references)
//IL_0269: Unknown result type (might be due to invalid IL or missing references)
//IL_026a: Unknown result type (might be due to invalid IL or missing references)
//IL_0272: Unknown result type (might be due to invalid IL or missing references)
//IL_0273: Unknown result type (might be due to invalid IL or missing references)
//IL_027b: Unknown result type (might be due to invalid IL or missing references)
//IL_027d: Unknown result type (might be due to invalid IL or missing references)
//IL_0285: Unknown result type (might be due to invalid IL or missing references)
//IL_0287: Unknown result type (might be due to invalid IL or missing references)
//IL_028f: Unknown result type (might be due to invalid IL or missing references)
//IL_0291: Unknown result type (might be due to invalid IL or missing references)
//IL_0299: Unknown result type (might be due to invalid IL or missing references)
//IL_029b: Unknown result type (might be due to invalid IL or missing references)
//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
//IL_02b9: Unknown result type (might be due to invalid IL or missing references)
//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
//IL_02da: Unknown result type (might be due to invalid IL or missing references)
//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0304: Unknown result type (might be due to invalid IL or missing references)
//IL_0305: Unknown result type (might be due to invalid IL or missing references)
//IL_030e: Unknown result type (might be due to invalid IL or missing references)
//IL_0310: Unknown result type (might be due to invalid IL or missing references)
//IL_0319: Unknown result type (might be due to invalid IL or missing references)
//IL_031a: Unknown result type (might be due to invalid IL or missing references)
//IL_0323: Unknown result type (might be due to invalid IL or missing references)
//IL_0325: Unknown result type (might be due to invalid IL or missing references)
//IL_032e: Unknown result type (might be due to invalid IL or missing references)
//IL_0330: Unknown result type (might be due to invalid IL or missing references)
//IL_0339: Unknown result type (might be due to invalid IL or missing references)
//IL_033b: Unknown result type (might be due to invalid IL or missing references)
//IL_0344: Unknown result type (might be due to invalid IL or missing references)
//IL_0346: Unknown result type (might be due to invalid IL or missing references)
//IL_034f: Unknown result type (might be due to invalid IL or missing references)
//IL_0351: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = (Vector3)values[0];
Quaternion val2 = (Quaternion)values[1];
Vector3 val3 = (Vector3)values[2];
val3 *= 0.5f;
Vector3 val4 = default(Vector3);
((Vector3)(ref val4))..ctor(val.x - val3.x, val.y - val3.y, val.z - val3.z);
Vector3 val5 = default(Vector3);
((Vector3)(ref val5))..ctor(val.x + val3.x, val.y - val3.y, val.z - val3.z);
Vector3 val6 = default(Vector3);
((Vector3)(ref val6))..ctor(val.x + val3.x, val.y + val3.y, val.z - val3.z);
Vector3 val7 = default(Vector3);
((Vector3)(ref val7))..ctor(val.x - val3.x, val.y + val3.y, val.z - val3.z);
Vector3 val8 = default(Vector3);
((Vector3)(ref val8))..ctor(val.x - val3.x, val.y - val3.y, val.z + val3.z);
Vector3 val9 = default(Vector3);
((Vector3)(ref val9))..ctor(val.x + val3.x, val.y - val3.y, val.z + val3.z);
Vector3 val10 = default(Vector3);
((Vector3)(ref val10))..ctor(val.x + val3.x, val.y + val3.y, val.z + val3.z);
Vector3 val11 = default(Vector3);
((Vector3)(ref val11))..ctor(val.x - val3.x, val.y + val3.y, val.z + val3.z);
val4 = val2 * (val4 - val);
val4 += val;
val5 = val2 * (val5 - val);
val5 += val;
val6 = val2 * (val6 - val);
val6 += val;
val7 = val2 * (val7 - val);
val7 += val;
val8 = val2 * (val8 - val);
val8 += val;
val9 = val2 * (val9 - val);
val9 += val;
val10 = val2 * (val10 - val);
val10 += val;
val11 = val2 * (val11 - val);
val11 += val;
buffer[0] = val4;
buffer[1] = val5;
buffer[2] = val5;
buffer[3] = val6;
buffer[4] = val6;
buffer[5] = val7;
buffer[6] = val7;
buffer[7] = val4;
buffer[8] = val8;
buffer[9] = val9;
buffer[10] = val9;
buffer[11] = val10;
buffer[12] = val10;
buffer[13] = val11;
buffer[14] = val11;
buffer[15] = val8;
buffer[16] = val4;
buffer[17] = val8;
buffer[18] = val5;
buffer[19] = val9;
buffer[20] = val6;
buffer[21] = val10;
buffer[22] = val7;
buffer[23] = val11;
return 24;
}
}
public abstract class Drawer
{
private static Dictionary<Type, Drawer>? _typeToDrawer;
public abstract int Draw(ref Vector3[] buffer, params object[] args);
public static Drawer? Get<T>() where T : class
{
if (_typeToDrawer == null)
{
_typeToDrawer = new Dictionary<Type, Drawer>
{
{
typeof(CubeDrawer),
new CubeDrawer()
},
{
typeof(LineDrawer),
new LineDrawer()
},
{
typeof(PolygonDrawer),
new PolygonDrawer()
},
{
typeof(SquareDrawer),
new SquareDrawer()
}
};
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
for (int i = 0; i < assemblies.Length; i++)
{
foreach (Type item in assemblies[i].GetTypesSafe())
{
if (!item.IsAbstract && item.IsSubclassOf(typeof(Drawer)) && !_typeToDrawer.ContainsKey(item))
{
try
{
Drawer value = (Drawer)Activator.CreateInstance(item);
_typeToDrawer[item] = value;
}
catch (Exception ex)
{
Debug.LogError((object)$"Couldn't register drawer of type {item} because {ex.Message}");
}
}
}
}
}
if (!_typeToDrawer.TryGetValue(typeof(T), out Drawer value2))
{
return null;
}
return value2;
}
}
internal class Element
{
public Vector3[] Points = (Vector3[])(object)new Vector3[0];
public Color Color = Color.white;
public bool Dashed;
}
public static class Gizmos
{
public static readonly Func<Camera, bool> CameraFilter = (Camera cam) => false;
private const int InitialBufferSize = 4096;
private static Vector3[] _buffer = (Vector3[])(object)new Vector3[4096];
public static int BufferSize
{
get
{
return _buffer.Length;
}
set
{
_buffer = (Vector3[])(object)new Vector3[value];
}
}
public static bool Enabled { get; set; } = true;
public static float DashGap { get; set; } = 0.1f;
public static bool FrustumCulling { get; set; } = true;
public static Material Material
{
get
{
return GizmosInstance.Material;
}
set
{
GizmosInstance.Material = value;
}
}
public static int Pass { get; set; } = 0;
public static Vector3 Offset { get; set; } = Vector3.zero;
public static void Draw<T>(Color? color, bool dashed, params object[] args) where T : Drawer
{
if (Enabled)
{
Drawer drawer = Drawer.Get<T>();
if (drawer != null)
{
int num = drawer.Draw(ref _buffer, args);
Vector3[] array = (Vector3[])(object)new Vector3[num];
Array.Copy(_buffer, array, num);
GizmosInstance.Submit(array, color, dashed);
}
}
}
public static void Lines(Vector3[] lines, Color? color = null, bool dashed = false)
{
if (Enabled)
{
GizmosInstance.Submit(lines, color, dashed);
}
}
public static void Line(Vector3 a, Vector3 b, Color? color = null, bool dashed = false)
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
Draw<LineDrawer>(color, dashed, new object[2] { a, b });
}
public static void Square(Vector2 position, Vector2 size, Color? color = null, bool dashed = false)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//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)
Square(position, Quaternion.identity, size, color, dashed);
}
public static void Square(Vector2 position, float diameter, Color? color = null, bool dashed = false)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//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_000c: Unknown result type (might be due to invalid IL or missing references)
Square(position, Quaternion.identity, Vector2.one * diameter, color, dashed);
}
public static void Square(Vector2 position, Quaternion rotation, Vector2 size, Color? color = null, bool dashed = false)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
Draw<SquareDrawer>(color, dashed, new object[3] { position, rotation, size });
}
public static void Cube(Vector3 position, Quaternion rotation, Vector3 size, Color? color = null, bool dashed = false)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
Draw<CubeDrawer>(color, dashed, new object[3] { position, rotation, size });
}
public static void Rect(Rect rect, Camera camera, Color? color = null, bool dashed = false)
{
//IL_002c: 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_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: 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)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
((Rect)(ref rect)).y = (float)Screen.height - ((Rect)(ref rect)).y;
Vector2 val = Vector2.op_Implicit(camera.ScreenToWorldPoint(Vector2.op_Implicit(new Vector2(((Rect)(ref rect)).x, ((Rect)(ref rect)).y - ((Rect)(ref rect)).height))));
Draw<SquareDrawer>(color, dashed, new object[3]
{
val + ((Rect)(ref rect)).size * 0.5f,
Quaternion.identity,
((Rect)(ref rect)).size
});
}
public static void Bounds(Bounds bounds, Color? color = null, bool dashed = false)
{
//IL_000c: 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_0028: Unknown result type (might be due to invalid IL or missing references)
Draw<CubeDrawer>(color, dashed, new object[3]
{
((Bounds)(ref bounds)).center,
Quaternion.identity,
((Bounds)(ref bounds)).size
});
}
public static void Cone(Vector3 position, Quaternion rotation, float length, float angle, Color? color = null, bool dashed = false, int pointsCount = 16)
{
//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_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_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_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: 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_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: 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)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: 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)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
float num = Mathf.Tan(angle * 0.5f * ((float)Math.PI / 180f)) * length;
Vector3 val = rotation * Vector3.forward;
Vector3 val2 = position + val * length;
Draw<PolygonDrawer>(color, dashed, new object[5] { val2, pointsCount, num, 0f, rotation });
for (int i = 0; i < 4; i++)
{
float num2 = (float)i * 90f * ((float)Math.PI / 180f);
Vector3 val3 = rotation * new Vector3(Mathf.Cos(num2), Mathf.Sin(num2)) * num;
Line(position, position + val3 + val * length, color, dashed);
}
}
public static void Sphere(Vector3 position, float radius, Color? color = null, bool dashed = false, int pointsCount = 16)
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: 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_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
Draw<PolygonDrawer>(color, dashed, new object[5]
{
position,
pointsCount,
radius,
0f,
Quaternion.Euler(0f, 0f, 0f)
});
Draw<PolygonDrawer>(color, dashed, new object[5]
{
position,
pointsCount,
radius,
0f,
Quaternion.Euler(90f, 0f, 0f)
});
Draw<PolygonDrawer>(color, dashed, new object[5]
{
position,
pointsCount,
radius,
0f,
Quaternion.Euler(0f, 90f, 90f)
});
}
public static void Circle(Vector3 position, float radius, Camera camera, Color? color = null, bool dashed = false, int pointsCount = 16)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: 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_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
Quaternion val = Quaternion.LookRotation(position - ((Component)camera).transform.position);
Draw<PolygonDrawer>(color, dashed, new object[5] { position, pointsCount, radius, 0f, val });
}
public static void Circle(Vector3 position, float radius, Quaternion rotation, Color? color = null, bool dashed = false, int pointsCount = 16)
{
//IL_000b: 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)
Draw<PolygonDrawer>(color, dashed, new object[5] { position, pointsCount, radius, 0f, rotation });
}
}
[ExecuteInEditMode]
[AddComponentMenu("")]
public class GizmosInstance : MonoBehaviour
{
private const int DefaultQueueSize = 4096;
private static GizmosInstance _instance;
private static bool _hotReloaded = true;
private static Material _defaultMaterial;
private Material _overrideMaterial;
private int _queueIndex;
private int _lastFrame;
private Element[] _queue = new Element[4096];
public static Material Material
{
get
{
GizmosInstance orCreate = GetOrCreate();
if (!Object.op_Implicit((Object)(object)orCreate._overrideMaterial))
{
return DefaultMaterial;
}
return orCreate._overrideMaterial;
}
set
{
GetOrCreate()._overrideMaterial = value;
}
}
private static Material DefaultMaterial
{
get
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Expected O, but got Unknown
if (!Object.op_Implicit((Object)(object)_defaultMaterial))
{
_defaultMaterial = new Material(Shader.Find("Hidden/Internal-Colored"))
{
hideFlags = (HideFlags)61
};
_defaultMaterial.SetInt("_SrcBlend", 5);
_defaultMaterial.SetInt("_DstBlend", 10);
_defaultMaterial.SetInt("_Cull", 0);
_defaultMaterial.SetInt("_ZWrite", 0);
}
return _defaultMaterial;
}
}
private static GizmosInstance GetOrCreate()
{
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
if (_hotReloaded || !Object.op_Implicit((Object)(object)_instance))
{
GizmosInstance[] array = Object.FindObjectsOfType<GizmosInstance>();
for (int i = 0; i < array.Length; i++)
{
_instance = array[i];
if (i > 0)
{
if (Application.isPlaying)
{
Object.Destroy((Object)(object)array[i]);
}
else
{
Object.DestroyImmediate((Object)(object)array[i]);
}
}
}
if (!Object.op_Implicit((Object)(object)_instance))
{
_instance = new GameObject(typeof(GizmosInstance).FullName).AddComponent<GizmosInstance>();
((Object)((Component)_instance).gameObject).hideFlags = (HideFlags)3;
}
_hotReloaded = false;
}
return _instance;
}
internal static void Submit(Vector3[] points, Color? color, bool dashed)
{
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
GizmosInstance orCreate = GetOrCreate();
if (orCreate._lastFrame != Time.frameCount)
{
orCreate._lastFrame = Time.frameCount;
orCreate._queueIndex = 0;
}
if (orCreate._queueIndex >= orCreate._queue.Length)
{
Element[] array = new Element[orCreate._queue.Length + 4096];
for (int i = orCreate._queue.Length; i < array.Length; i++)
{
array[i] = new Element();
}
Array.Copy(orCreate._queue, 0, array, 0, orCreate._queue.Length);
orCreate._queue = array;
}
orCreate._queue[orCreate._queueIndex].Color = (Color)(((??)color) ?? Color.white);
orCreate._queue[orCreate._queueIndex].Points = points;
orCreate._queue[orCreate._queueIndex].Dashed = dashed;
orCreate._queueIndex++;
}
private void OnEnable()
{
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Expected O, but got Unknown
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Expected O, but got Unknown
_queue = new Element[4096];
for (int i = 0; i < 4096; i++)
{
_queue[i] = new Element();
}
if ((Object)(object)GraphicsSettings.renderPipelineAsset == (Object)null)
{
Camera.onPostRender = (CameraCallback)Delegate.Combine((Delegate?)(object)Camera.onPostRender, (Delegate?)new CameraCallback(OnRendered));
}
else
{
RenderPipelineManager.EndCameraRendering += OnRendered;
}
}
private void OnDisable()
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Expected O, but got Unknown
if ((Object)(object)GraphicsSettings.renderPipelineAsset == (Object)null)
{
Camera.onPostRender = (CameraCallback)Delegate.Remove((Delegate?)(object)Camera.onPostRender, (Delegate?)new CameraCallback(OnRendered));
}
else
{
RenderPipelineManager.EndCameraRendering -= OnRendered;
}
}
private void OnRendered(ScriptableRenderContext context, Camera camera)
{
OnRendered(camera);
}
private static bool ShouldRenderCamera(Camera camera)
{
if (!Object.op_Implicit((Object)(object)camera))
{
return false;
}
if (!((Component)camera).CompareTag("MainCamera"))
{
return Gizmos.CameraFilter(camera);
}
return true;
}
private static bool IsVisibleByCamera(Element points, Camera camera)
{
if (Object.op_Implicit((Object)(object)camera))
{
return ((IEnumerable<Vector3>)points.Points).Select((Func<Vector3, Vector3>)camera.WorldToViewportPoint).Any(delegate(Vector3 vp)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
float x = vp.x;
if (x >= 0f && x <= 1f)
{
x = vp.y;
if (x >= 0f)
{
return x <= 1f;
}
return false;
}
return false;
});
}
return false;
}
private void Update()
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: 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_0011: Unknown result type (might be due to invalid IL or missing references)
Gizmos.Line(default(Vector3), default(Vector3));
}
private void OnRendered(Camera camera)
{
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00e7: 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_00f9: 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_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
//IL_0195: Unknown result type (might be due to invalid IL or missing references)
//IL_019e: Unknown result type (might be due to invalid IL or missing references)
//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
//IL_0159: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Unknown result type (might be due to invalid IL or missing references)
//IL_0166: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: 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_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
Material.SetPass(Gizmos.Pass);
if (!Gizmos.Enabled)
{
_queueIndex = 0;
}
if (!ShouldRenderCamera(camera))
{
GL.PushMatrix();
GL.Begin(1);
GL.End();
GL.PopMatrix();
return;
}
Vector3 offset = Gizmos.Offset;
GL.PushMatrix();
GL.MultMatrix(Matrix4x4.identity);
GL.Begin(1);
bool flag = Time.time % 1f > 0.5f;
float num = Mathf.Clamp(Gizmos.DashGap, 0.01f, 32f);
bool frustumCulling = Gizmos.FrustumCulling;
List<Vector3> list = new List<Vector3>();
for (int i = 0; i < _queueIndex && _queue.Length > i; i++)
{
Element element = _queue[i];
if (frustumCulling && !IsVisibleByCamera(element, camera))
{
continue;
}
list.Clear();
if (element.Dashed)
{
for (int j = 0; j < element.Points.Length - 1; j++)
{
Vector3 val = element.Points[j];
Vector3 val2 = element.Points[j + 1];
Vector3 val3 = val2 - val;
if (((Vector3)(ref val3)).sqrMagnitude > num * num * 2f)
{
int num2 = Mathf.RoundToInt(((Vector3)(ref val3)).magnitude / num);
for (int k = 0; k < num2 - 1; k++)
{
if (k % 2 == (flag ? 1 : 0))
{
float num3 = (float)k / ((float)num2 - 1f);
float num4 = (float)(k + 1) / ((float)num2 - 1f);
Vector3 item = Vector3.Lerp(val, val2, num3);
Vector3 item2 = Vector3.Lerp(val, val2, num4);
list.Add(item);
list.Add(item2);
}
}
}
else
{
list.Add(val);
list.Add(val2);
}
}
}
else
{
list.AddRange(element.Points);
}
GL.Color(element.Color);
foreach (Vector3 item3 in list)
{
GL.Vertex(item3 + offset);
}
}
GL.End();
GL.PopMatrix();
}
}
public class LineDrawer : Drawer
{
public override int Draw(ref Vector3[] buffer, params object[] args)
{
//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_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
buffer[0] = (Vector3)args[0];
buffer[1] = (Vector3)args[1];
return 2;
}
}
public class PolygonDrawer : Drawer
{
public override int Draw(ref Vector3[] buffer, params object[] values)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = (Vector3)values[0];
int num = (int)values[1];
float num2 = (float)values[2];
float num3 = (float)values[3];
Quaternion val2 = (Quaternion)values[4];
float num4 = 360f / (float)num;
num3 *= (float)Math.PI / 180f;
Vector3 val3 = default(Vector3);
Vector3 val4 = default(Vector3);
for (int i = 0; i < num; i++)
{
float num5 = Mathf.Cos((float)Math.PI / 180f * num4 * (float)i + num3) * num2;
float num6 = Mathf.Sin((float)Math.PI / 180f * num4 * (float)i + num3) * num2;
((Vector3)(ref val3))..ctor(num5, num6);
float num7 = Mathf.Cos((float)Math.PI / 180f * num4 * (float)(i + 1) + num3) * num2;
float num8 = Mathf.Sin((float)Math.PI / 180f * num4 * (float)(i + 1) + num3) * num2;
((Vector3)(ref val4))..ctor(num7, num8);
buffer[i * 2] = val + val2 * val3;
buffer[i * 2 + 1] = val + val2 * val4;
}
return num * 2;
}
}
public class SquareDrawer : Drawer
{
public override int Draw(ref Vector3[] buffer, params object[] values)
{
//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_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: 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_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: 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_0050: 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_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: 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_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: 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_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: 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_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: 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_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
//IL_0145: Unknown result type (might be due to invalid IL or missing references)
//IL_0146: Unknown result type (might be due to invalid IL or missing references)
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_014c: Unknown result type (might be due to invalid IL or missing references)
//IL_0151: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: 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_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
//IL_0166: Unknown result type (might be due to invalid IL or missing references)
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
//IL_0171: Unknown result type (might be due to invalid IL or missing references)
//IL_0176: Unknown result type (might be due to invalid IL or missing references)
//IL_017b: Unknown result type (might be due to invalid IL or missing references)
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_017e: Unknown result type (might be due to invalid IL or missing references)
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
//IL_0184: Unknown result type (might be due to invalid IL or missing references)
//IL_0185: Unknown result type (might be due to invalid IL or missing references)
//IL_0187: Unknown result type (might be due to invalid IL or missing references)
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
//IL_018d: Unknown result type (might be due to invalid IL or missing references)
//IL_0192: Unknown result type (might be due to invalid IL or missing references)
//IL_0197: Unknown result type (might be due to invalid IL or missing references)
//IL_019c: Unknown result type (might be due to invalid IL or missing references)
//IL_019e: Unknown result type (might be due to invalid IL or missing references)
//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0207: Unknown result type (might be due to invalid IL or missing references)
//IL_0209: Unknown result type (might be due to invalid IL or missing references)
//IL_020e: Unknown result type (might be due to invalid IL or missing references)
//IL_0216: Unknown result type (might be due to invalid IL or missing references)
//IL_0218: Unknown result type (might be due to invalid IL or missing references)
//IL_021d: Unknown result type (might be due to invalid IL or missing references)
//IL_0225: Unknown result type (might be due to invalid IL or missing references)
//IL_0227: Unknown result type (might be due to invalid IL or missing references)
//IL_022c: Unknown result type (might be due to invalid IL or missing references)
//IL_0234: Unknown result type (might be due to invalid IL or missing references)
//IL_0235: Unknown result type (might be due to invalid IL or missing references)
//IL_023a: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
object obj = values[0];
Vector2 val3 = (Vector2)((obj is Vector2 val) ? val : ((!(obj is Vector3 val2)) ? default(Vector2) : Vector2.op_Implicit(val2)));
Vector2 val4 = val3;
Quaternion val5 = (Quaternion)values[1];
obj = values[2];
val3 = (Vector2)((obj is Vector2 val6) ? val6 : ((!(obj is Vector3 val7)) ? default(Vector2) : Vector2.op_Implicit(val7)));
Vector2 val8 = val3;
val8 *= 0.5f;
Vector2 val9 = Vector2.op_Implicit(new Vector3(val4.x - val8.x, val4.y - val8.y));
Vector2 val10 = Vector2.op_Implicit(new Vector3(val4.x + val8.x, val4.y - val8.y));
Vector2 val11 = Vector2.op_Implicit(new Vector3(val4.x + val8.x, val4.y + val8.y));
Vector2 val12 = Vector2.op_Implicit(new Vector3(val4.x - val8.x, val4.y + val8.y));
val9 = Vector2.op_Implicit(val5 * Vector2.op_Implicit(val9 - val4));
val9 += val4;
val10 = Vector2.op_Implicit(val5 * Vector2.op_Implicit(val10 - val4));
val10 += val4;
val11 = Vector2.op_Implicit(val5 * Vector2.op_Implicit(val11 - val4));
val11 += val4;
val12 = Vector2.op_Implicit(val5 * Vector2.op_Implicit(val12 - val4));
val12 += val4;
buffer[0] = Vector2.op_Implicit(val9);
buffer[1] = Vector2.op_Implicit(val10);
buffer[2] = Vector2.op_Implicit(val10);
buffer[3] = Vector2.op_Implicit(val11);
buffer[4] = Vector2.op_Implicit(val11);
buffer[5] = Vector2.op_Implicit(val12);
buffer[6] = Vector2.op_Implicit(val12);
buffer[7] = Vector2.op_Implicit(val9);
return 8;
}
}
}
namespace Sodalite
{
internal class SodaliteConfig
{
public ConfigEntry<bool> SpoofSteamUserID;
public ConfigEntry<LogLevel> LogPanelFilter;
public SodaliteConfig(ConfigFile config)
{
SpoofSteamUserID = config.Bind<bool>("Privacy", "SpoofSteamUserID", false, "Randomizes your Steam User ID on every startup (requires restart)");
LogPanelFilter = config.Bind<LogLevel>("Universal Panel", "LogPanelFilter", (LogLevel)31, "Configures which types of log messages show up in the log panel");
}
}
internal static class Hooks
{
[HarmonyPatch(typeof(FVRWristMenu2), "Awake")]
[HarmonyPostfix]
private static void FVRWriteMenuOnAwake(FVRWristMenu2 __instance)
{
WristMenuAPI.WristMenuAwake(__instance);
}
[HarmonyPatch(typeof(SteamUserStats), "UploadLeaderboardScore")]
[HarmonyPrefix]
public static bool OnSteamUserStatsUploadLeaderboardScore(ref SteamAPICall_t __result)
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
if (!LeaderboardAPI.LeaderboardDisabled.IsLocked)
{
return true;
}
__result = SteamAPICall_t.Invalid;
return false;
}
[HarmonyPatch(typeof(SteamUserStats), "FindOrCreateLeaderboard")]
[HarmonyPrefix]
public static bool OnSteamUserStatsFindOrCreateLeaderboard(string pchLeaderboardName, ref SteamAPICall_t __result)
{
//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)
if (!LeaderboardAPI.LeaderboardDisabled.IsLocked)
{
return true;
}
__result = SteamUserStats.FindLeaderboard(pchLeaderboardName);
return false;
}
}
public static class SodaliteConstants
{
public const string Guid = "nrgill28.Sodalite";
public const string Name = "Sodalite";
public const string Version = "1.5.1";
}
[BepInPlugin("nrgill28.Sodalite", "Sodalite", "1.5.1")]
[BepInProcess("h3vr.exe")]
public class Sodalite : BaseUnityPlugin, ILogListener, IDisposable
{
private static ManualLogSource? _logger;
private static SodaliteConfig? _config;
private static readonly string BasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
internal static List<LogEventArgs>? LogEvents;
internal static Dictionary<LogEventArgs, int> LogEventLineCount = null;
private LockablePanel _modPanel;
private UniversalModPanel? _modPanelComponent;
private GameObject? _modPanelPrefab;
internal static ManualLogSource Logger => _logger ?? throw new InvalidOperationException("Cannot get logger before the behaviour is initialized!");
internal static SodaliteConfig Config => _config ?? throw new InvalidOperationException("Can't get config before the behaviour is initialized!");
private void Awake()
{
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
LogEvents = SodalitePatcher.LogBuffer.LogEvents;
LogEventLineCount = new Dictionary<LogEventArgs, int>();
foreach (LogEventArgs logEvent in LogEvents)
{
LogEventLineCount[logEvent] = ((object)logEvent).ToString().CountLines();
}
SodalitePatcher.LogBuffer.Dispose();
_config = new SodaliteConfig(((BaseUnityPlugin)this).Config);
UniversalModPanel.RegisterPluginSettings(((BaseUnityPlugin)this).Info, (ConfigEntryBase[])(object)new ConfigEntryBase[1] { (ConfigEntryBase)Config.SpoofSteamUserID });
new Hook((MethodBase)typeof(PostProcessManager).GetMethod("<ReloadBaseTypes>m__0", BindingFlags.Static | BindingFlags.NonPublic), ((object)this).GetType().GetMethod("EnumerateTypesSafe", BindingFlags.Static | BindingFlags.NonPublic));
_logger = ((BaseUnityPlugin)this).Logger;
Logger.Listeners.Add((ILogListener)(object)this);
Harmony.CreateAndPatchAll(typeof(Hooks), "nrgill28.Sodalite");
AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(BasePath, "universalpanel"));
if (Object.op_Implicit((Object)(object)val))
{
_modPanelPrefab = val.LoadAsset<GameObject>("Universal Mod Panel");
_modPanel = new LockablePanel();
_modPanel.Configure += ConfigureModPanel;
_modPanel.TextureOverride = val.LoadAsset<Texture2D>("LogPanel");
WristMenuAPI.SpawnSection.Buttons.Add(new WristMenuButton("Spawn Mod Panel", 2147483646, SpawnModPanel));
}
else
{
Logger.LogError((object)"Guess who forgot to bundle the universal panel in with the release again!!!");
}
try
{
SteamAPI.Init();
string text = default(string);
bool currentBetaName = SteamApps.GetCurrentBetaName(ref text, 128);
GameAPI.BetaName = (currentBetaName ? text : string.Empty);
GameAPI.BuildId = SteamApps.GetAppBuildId();
Logger.LogInfo((object)string.Format("Game build ID: {0} ({1}).", GameAPI.BuildId, currentBetaName ? text : "main"));
}
catch (InvalidOperationException)
{
Logger.LogWarning((object)"Game build ID unknown: unable to initialize Steamworks.");
}
}
private void Start()
{
GM.SetRunningModded();
ModsAPI.Discover();
UniversalModPanel.RegisterUnregisteredPluginConfigs();
Transform transform = GameObject.Find("MainMenuSceneProtoBase/LevelLoadScreen/LevelLoadHolder/Canvas/Button").transform;
WidgetStyle.DefaultButtonSprite = ((Component)transform).GetComponent<Image>().sprite;
WidgetStyle.DefaultTextFont = ((Component)transform.GetChild(0)).GetComponent<Text>().font;
}
private static IEnumerable<Type> EnumerateTypesSafe(Assembly assembly)
{
return from t in assembly.GetTypesSafe()
where t.IsSubclassOf(typeof(PostProcessEffectSettings)) && t.IsDefined(typeof(PostProcessAttribute), inherit: false)
select t;
}
private void SpawnModPanel(object sender, ButtonClickEventArgs args)
{
GameObject orCreatePanel = _modPanel.GetOrCreatePanel();
args.Hand.OtherHand.RetrieveObject(orCreatePanel.GetComponent<FVRPhysicalObject>());
}
private void ConfigureModPanel(GameObject panel)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
Transform val = panel.transform.Find("OptionsCanvas_0_Main/Canvas");
_modPanelComponent = Object.Instantiate<GameObject>(_modPanelPrefab, val.position, val.rotation, val.parent).GetComponent<UniversalModPanel>();
Object.Destroy((Object)(object)((Component)val).gameObject);
}
void ILogListener.LogEvent(object sender, LogEventArgs eventArgs)
{
if (LogEvents != null)
{
LogEvents.Add(eventArgs);
LogEventLineCount.Add(eventArgs, ((object)eventArgs).ToString().CountLines());
if (Object.op_Implicit((Object)(object)_modPanelComponent))
{
_modPanelComponent.LogPage.LogEvent(eventArgs);
}
}
}
void IDisposable.Dispose()
{
Logger.Listeners.Remove((ILogListener)(object)this);
LogEvents?.Clear();
}
}
public delegate void ButtonClickEvent(object sender, ButtonClickEventArgs args);
public class ButtonClickEventArgs : EventArgs
{
public FVRViveHand Hand { get; }
public ButtonClickEventArgs(FVRViveHand hand)
{
Hand = hand;
}
}
}
namespace Sodalite.Utilities
{
public class Vector3Converter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: 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_0022: 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)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
if (!(value is Vector3 val))
{
throw new JsonSerializationException("Expected Vector3 object value");
}
writer.WriteValue($"{val.x},{val.y},{val.z}");
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Invalid comparison between Unknown and I4
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
if ((int)reader.TokenType != 9)
{
throw new JsonSerializationException("Expected value to be a string");
}
float[] array = ((string)reader.Value).Split(new char[1] { ',' }).Select(float.Parse).ToArray();
if (array.Length != 3)
{
throw new JsonSerializationException("Expected array to be of length 3");
}
return (object)new Vector3(array[0], array[1], array[2]);
}
public override bool CanConvert(Type objectType)
{
return (object)objectType == typeof(Vector3);
}
}
public static class Math3D
{
public static Vector3 ProjectPointOnLine(Vector3 linePoint, Vector3 lineVec, Vector3 point)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0001: 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_0007: 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_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: 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)
float num = Vector3.Dot(point - linePoint, lineVec);
return linePoint + lineVec * num;
}
public static Vector3 ProjectPointOnLineSegment(Vector3 linePoint1, Vector3 linePoint2, Vector3 point)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0001: 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_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: 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_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: 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_0017: 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_0019: 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)
//IL_0035: 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_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: 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_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = linePoint2 - linePoint1;
Vector3 val2 = ProjectPointOnLine(linePoint1, ((Vector3)(ref val)).normalized, point);
return (Vector3)(PointOnWhichSideOfLineSegment(linePoint1, linePoint2, val2) switch
{
0 => val2,
1 => linePoint1,
2 => linePoint2,
_ => Vector3.zero,
});
}
public static int PointOnWhichSideOfLineSegment(Vector3 linePoint1, Vector3 linePoint2, Vector3 point)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0001: 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_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = linePoint2 - linePoint1;
Vector3 val2 = point - linePoint1;
if (Vector3.Dot(val2, val) > 0f)
{
if (!(((Vector3)(ref val2)).magnitude <= ((Vector3)(ref val)).magnitude))
{
return 2;
}
return 0;
}
return 1;
}
public static Vector3 ProjectPointOnPlane(Vector3 planeNormal, Vector3 planePoint, Vector3 point)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0001: 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_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: 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_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
float num = SignedDistancePlanePoint(planeNormal, planePoint, point);
num *= -1f;
Vector3 val = SetVectorLength(planeNormal, num);
return point + val;
}
public static float SignedDistancePlanePoint(Vector3 planeNormal, Vector3 planePoint, Vector3 point)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0001: 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_0003: Unknown result type (might be due to invalid IL or missing references)
return Vector3.Dot(planeNormal, point - planePoint);
}
public static Vector3 SetVectorLength(Vector3 vector, float size)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
return Vector3.Normalize(vector) * size;
}
public static float InverseLerpVector3(Vector3 a, Vector3 b, Vector3 value)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0001: 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_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: 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)
Vector3 val = b - a;
return Vector3.Dot(value - a, val) / Vector3.Dot(val, val);
}
}
public class ObservableHashSet<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable
{
private readonly List<T> _list = new List<T>();
public T this[int index]
{
get
{
return _list[index];
}
set
{
_list[index] = value;
}
}
public int Count => _list.Count;
public bool IsReadOnly => false;
public event Action<T>? ItemAdded;
public event Action<T>? ItemRemoved;
public void Add(T item)
{
if (!_list.Contains(item))
{
_list.Add(item);
this.ItemAdded?.Invoke(item);
}
}
public bool Remove(T item)
{
bool num = _list.Remove(item);
if (num)
{
Action<T>? itemRemoved = this.ItemRemoved;
if (itemRemoved == null)
{
return num;
}
itemRemoved(item);
}
return num;
}
public void RemoveAt(int index)
{
if (index >= _list.Count)
{
throw new IndexOutOfRangeException();
}
Remove(_list[index]);
}
public void Clear()
{
_list.Clear();
}
public bool Contains(T item)
{
return _list.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
_list.CopyTo(array, arrayIndex);
}
public IEnumerator<T> GetEnumerator()
{
return _list.GetEnumerator();
}
public int IndexOf(T item)
{
return _list.IndexOf(item);
}
public void Insert(int index, T item)
{
_list.Insert(index, item);
}
IEnumerator IEnumerable.GetEnumerator()
{
return _list.GetEnumerator();
}
}
public class SafeMultiLock
{
private class Lock : IDisposable
{
private readonly HashSet<Lock> _locks;
public Lock(HashSet<Lock> locks)
{
_locks = locks;
_locks.Add(this);
}
void IDisposable.Dispose()
{
_locks.Remove(this);
}
}
private readonly HashSet<Lock> _locks = new HashSet<Lock>();
public bool IsLocked => _locks.Count > 0;
public IDisposable TakeLock()
{
return new Lock(_locks);
}
}
public static class SodaliteUtils
{
public static Texture2D LoadTextureFromFile(string file)
{
return LoadTextureFromBytes(File.ReadAllBytes(file));
}
public static Texture2D LoadTextureFromBytes(byte[] bytes)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Expected O, but got Unknown
Texture2D val = new Texture2D(0, 0);
val.LoadImage(bytes);
return val;
}
public static byte[] GetResource(this Assembly asm, string file)
{
string file2 = file;
string text = asm.GetManifestResourceNames().FirstOrDefault((string x) => x.EndsWith(file2));
if (text == null)
{
throw new FileNotFoundException("A resource with the name '" + file2 + "' was not found.", file2);
}
using Stream stream = asm.GetManifestResourceStream(text) ?? throw new FileNotFoundException("Somehow the file was found but the stream couldn't be gotten.");
byte[] array = new byte[stream.Length];
stream.Read(array, 0, array.Length);
return array;
}
public static IEnumerable<Type> GetTypesSafe(this Assembly asm)
{
try
{
return asm.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
return ex.Types.Where((Type t) => (object)t != null);
}
}
public static bool HasFlag<TEnum>(this TEnum value, TEnum flag) where TEnum : Enum
{
return (Convert.ToInt32(value) & Convert.ToInt32(flag)) != 0;
}
public static T GetRandom<T>(this IList<T> list)
{
if (list.Count < 1)
{
throw new InvalidOperationException("Cannot get random item from empty list!");
}
return list[Random.Range(0, list.Count)];
}
public static IEnumerator TryCatch<T>(this IEnumerator @this, Action<T> handler) where T : Exception
{
IEnumerator this2 = @this;
Action<T> handler2 = handler;
while (MoveNext())
{
yield return this2.Current;
}
bool MoveNext()
{
try
{
return this2.MoveNext();
}
catch (T obj)
{
handler2(obj);
return false;
}
}
}
public static IEnumerator TryCatch(this IEnumerator @this, Action<Exception> handler)
{
return @this.TryCatch<Exception>(handler);
}
public static string AsRGBA(this Color c)
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
return $"rgba({c.r * 255f:N0}, {c.g * 255f:N0}, {c.b * 255f:N0}, {c.a * 255f:N0})";
}
public static bool IsInstanceOfGenericType(Type genericType, object? instance)
{
if ((object)genericType == null)
{
throw new ArgumentNullException("genericType");
}
if (instance == null)
{
return false;
}
Type type = instance.GetType();
while ((object)type != null)
{
if (type.IsGenericType && (object)type.GetGenericTypeDefinition() == genericType)
{
return true;
}
type = type.BaseType;
}
return false;
}
public static int CountLines(this string str)
{
if (str == null)
{
throw new ArgumentNullException("str");
}
if (str == string.Empty)
{
return 0;
}
int num = -1;
int num2 = 0;
while (-1 != (num = str.IndexOf('\n', num + 1)))
{
num2++;
}
return num2 + 1;
}
public static IEnumerable<GameObject> EnumerateChildren(this GameObject go)
{
Transform transform = go.transform;
for (int i = 0; i < transform.childCount; i++)
{
yield return ((Component)transform.GetChild(i)).gameObject;
}
}
}
}
namespace Sodalite.UiWidgets
{
public static class Extensions
{
public static void FillParent(this RectTransform rt)
{
//IL_0001: 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_0017: Unknown result type (might be due to invalid IL or missing references)
rt.anchorMin = Vector2.zero;
rt.anchorMax = Vector2.one;
rt.sizeDelta = Vector2.zero;
}
}
public static class WidgetStyle
{
internal static Font? DefaultTextFont;
internal static Sprite? DefaultButtonSprite;
public static Font TextFont
{
get
{
if (DefaultTextFont == null || !Object.op_Implicit((Object)(object)DefaultTextFont))
{
throw new InvalidOperationException("Default text font was null!");
}
return DefaultTextFont;
}
}
public static Color TextColor { get; } = Color.white;
public static Sprite ButtonSprite
{
get
{
if (DefaultButtonSprite == null || !Object.op_Implicit((Object)(object)DefaultButtonSprite))
{
throw new InvalidOperationException("Default text font was null!");
}
return DefaultButtonSprite;
}
}
public static Color ButtonColorUnselected { get; } = new Color(9f / 85f, 0.28627452f, 31f / 51f, 32f / 51f);
public static Color ButtonColorSelected { get; } = new Color(64f / 85f, 0.7921569f, 74f / 85f, 72f / 85f);
}
public class ButtonWidget : UiWidget
{
public Button Button;
public Text ButtonText;
public Image ButtonImage;
public SodalitePointableButton Pointable;
private BoxCollider _boxCollider;
protected override void Awake()
{
//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_0053: Expected O, but got Unknown
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Expected O, but got Unknown
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
base.Awake();
ButtonImage = ((Component)this).gameObject.AddComponent<Image>();
Button = ((Component)this).gameObject.AddComponent<Button>();
ButtonImage.sprite = WidgetStyle.ButtonSprite;
((Graphic)ButtonImage).color = WidgetStyle.ButtonColorUnselected;
GameObject val = new GameObject("Text");
val.transform.SetParent(((Component)this).transform);
val.transform.localRotation = Quaternion.identity;
ButtonText = val.AddComponent<Text>();
Extensions.FillParent((RectTransform)val.transform);
ButtonText.alignment = (TextAnchor)4;
((Graphic)ButtonText).color = WidgetStyle.TextColor;
ButtonText.font = WidgetStyle.TextFont;
Pointable = ((Component)this).gameObject.AddComponent<SodalitePointableButton>();
((FVRPointable)Pointable).MaxPointingRange = 2f;
((FVRPointableButton)Pointable).Button = Button;
((FVRPointableButton)Pointable).Image = ButtonImage;
((FVRPointableButton)Pointable).ColorUnselected = WidgetStyle.ButtonColorUnselected;
((FVRPointableButton)Pointable).ColorSelected = WidgetStyle.ButtonColorSelected;
}
private IEnumerator Start()
{
yield return null;
_boxCollider = ((Component)this).gameObject.AddComponent<BoxCollider>();
Vector2 sizeDelta = RectTransform.sizeDelta;
_boxCollider.center = Vector3.zero;
_boxCollider.size = new Vector3(Mathf.Abs(sizeDelta.x), Mathf.Abs(sizeDelta.y), 5f);
}
public void AddButtonListener(ButtonClickEvent callback)
{
ButtonClickEvent callback2 = callback;
Pointable.ButtonClicked += delegate(object _, ButtonClickEventArgs args)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
SM.PlayGlobalUISound((GlobalUISound)1, ((Component)this).transform.position);
callback2(this, args);
};
}
}
public abstract class LayoutWidget<TLayout> : UiWidget where TLayout : LayoutGroup
{
public TLayout LayoutGroup;
protected override void Awake()
{
base.Awake();
LayoutGroup = ((Component)this).gameObject.AddComponent<TLayout>();
RectTransform.FillParent();
}
public void AddChild<T>(Action<T> configure) where T : UiWidget
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
T val = UiWidget.CreateAndConfigureWidget(((Component)this).gameObject, configure);
((Transform)val.RectTransform).localPosition = Vector3.zero;
((Transform)val.RectTransform).localScale = Vector3.one;
}
}
public class GridLayoutWidget : LayoutWidget<GridLayoutGroup>
{
protected override void Awake()
{
//IL_000c: 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)
base.Awake();
LayoutGroup.spacing = Vector2.one * 4f;
LayoutGroup.startCorner = (Corner)0;
LayoutGroup.startAxis = (Axis)0;
((LayoutGroup)LayoutGroup).childAlignment = (TextAnchor)0;
LayoutGroup.constraint = (Constraint)1;
}
public void SetGrid(int rows, int columns)
{
//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_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
Vector2 sizeDelta = RectTransform.sizeDelta;
float num = (sizeDelta.x - (float)columns * LayoutGroup.spacing.x) / (float)columns;
float num2 = (sizeDelta.y - (float)rows * LayoutGroup.spacing.y) / (float)rows;
LayoutGroup.cellSize = new Vector2(num, num2);
LayoutGroup.constraintCount = columns;
}
}
public class VerticalLayoutWidget : LayoutWidget<VerticalLayoutGroup>
{
}
public class HorizontalLayoutWidget : LayoutWidget<HorizontalLayoutGroup>
{
}
public class TextWidget : UiWidget
{
public Text Text;
protected override void Awake()
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
base.Awake();
Text = ((Component)this).gameObject.AddComponent<Text>();
Text.font = WidgetStyle.TextFont;
((Graphic)Text).color = WidgetStyle.TextColor;
}
}
public abstract class UiWidget : MonoBehaviour
{
public RectTransform RectTransform;
protected virtual void Awake()
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
RectTransform = ((Component)this).gameObject.AddComponent<RectTransform>();
((Transform)RectTransform).localRotation = Quaternion.identity;
}
public static TWidget CreateAndConfigureWidget<TWidget>(GameObject go, Action<TWidget> configureWidget) where TWidget : UiWidget
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject(typeof(TWidget).Name);
val.transform.SetParent(go.transform);
TWidget val2 = val.AddComponent<TWidget>();
configureWidget(val2);
return val2;
}
}
}
namespace Sodalite.UiWidgets.Components
{
public class SodalitePointableButton : FVRPointableButton
{
public event EventHandler<ButtonClickEventArgs>? ButtonClicked;
public override void OnPoint(FVRViveHand hand)
{
((FVRPointableButton)this).OnPoint(hand);
if (hand.Input.TriggerDown)
{
this.ButtonClicked?.Invoke(this, new ButtonClickEventArgs(hand));
}
}
}
}
namespace Sodalite.ModPanel
{
public class AcceptableValueIntRangeStep : AcceptableValueRange<int>
{
public int Step { get; }
public AcceptableValueIntRangeStep(int minValue, int maxValue, int step)
: base(minValue, maxValue)
{
Step = step;
}
public override object Clamp(object value)
{
int num = (int)Math.Round((float)((int)base.Clamp(value) - ((AcceptableValueRange<int>)this).MinValue) / (float)Step);
return ((AcceptableValueRange<int>)this).MinValue + num * Step;
}
public override bool IsValid(object value)
{
int num = (int)value;
if (base.IsValid(value))
{
return (num - ((AcceptableValueRange<int>)this).MinValue) % Step == 0;
}
return false;
}
public override string ToDescriptionString()
{
return $"# Acceptable value range: From {((AcceptableValueRange<int>)this).MinValue} to {((AcceptableValueRange<int>)this).MaxValue} in increments of {Step}";
}
}
public class AcceptableValueFloatRangeStep : AcceptableValueRange<float>
{
public float Step { get; }
public AcceptableValueFloatRangeStep(float minValue, float maxValue, float step)
: base(minValue, maxValue)
{
Step = step;
}
public override object Clamp(object value)
{
float num = (float)Math.Round(((float)base.Clamp(value) - ((AcceptableValueRange<float>)this).MinValue) / Step);
return ((AcceptableValueRange<float>)this).MinValue + num * Step;
}
public override bool IsValid(object value)
{
float num = (float)value;
if (base.IsValid(value))
{
return (num - ((AcceptableValueRange<float>)this).MinValue) % Step == 0f;
}
return false;
}
public override string ToDescriptionString()
{
return $"# Acceptable value range: From {((AcceptableValueRange<float>)this).MinValue} to {((AcceptableValueRange<float>)this).MaxValue} in increments of {Step}";
}
}
public abstract class ConfigFieldBase : MonoBehaviour
{
public Text Name;
public Text Description;
protected ConfigEntryBase ConfigEntry;
public virtual void Apply(ConfigEntryBase entry)
{
ConfigEntry = entry;
Name.text = entry.Definition.Key;
Description.text = entry.Description.Description + $"\nDefault Value: {entry.DefaultValue}";
}
protected void SetValue(object val)
{
ConfigEntry.BoxedValue = val;
}
public abstract void Redraw();
}
public class UniversalModPanelPage : MonoBehaviour
{
public UniversalModPanel Panel;
public string DisplayName;
}
public class UniversalModPanel : MonoBehaviour
{
[Header("References")]
[SerializeField]
private Button HomeButton;
[SerializeField]
private RectTransform PagesRoot;
[SerializeField]
private Button BackButton;
[SerializeField]
private RectTransform HomePage;
[SerializeField]
private GameObject HomeScreenButtonPrefab;
[SerializeField]
private Text Breadcrumb;
[SerializeField]
private List<UniversalModPanelPage> SerializedPages;
[SerializeField]
internal UniversalModPanelLogPage LogPage;
[SerializeField]
private Button PaginatePreviousButton;
[SerializeField]
private Button PaginateNextButton;
[SerializeField]
private Text PaginateText;
internal static readonly Dictionary<PluginInfo, ConfigEntryBase[]> RegisteredConfigs = new Dictionary<PluginInfo, ConfigEntryBase[]>();
internal static readonly Dictionary<ConfigFieldBase, Func<ConfigEntryBase, bool>> RegisteredInputFields = new Dictionary<ConfigFieldBase, Func<ConfigEntryBase, bool>>();
private static readonly Dictionary<string, UniversalModPanelPage> RegisteredCustomPages = new Dictionary<string, UniversalModPanelPage>();
private static readonly Dictionary<string, string> CustomHomepageButtons = new Dictionary<string, string>();
internal static readonly HashSet<PluginInfo> PluginsWithDocumentation = new HashSet<PluginInfo>();
private readonly Dictionary<string, UniversalModPanelPage> _pages = new Dictionary<string, UniversalModPanelPage>();
private readonly Stack<UniversalModPanelPage> _stack = new Stack<UniversalModPanelPage>();
private UniversalModPanelPage _currentPage;
public static UniversalModPanel Instance { get; private set; } = null;
private void Awake()
{
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Expected O, but got Unknown
Instance = this;
foreach (UniversalModPanelPage serializedPage in SerializedPages)
{
_pages.Add(((Object)((Component)serializedPage).gameObject).name, serializedPage);
((Component)serializedPage).gameObject.SetActive(false);
}
foreach (KeyValuePair<string, UniversalModPanelPage> registeredCustomPage in RegisteredCustomPages)
{
UniversalModPanelPage universalModPanelPage = Object.Instantiate<UniversalModPanelPage>(registeredCustomPage.Value, ((Transform)PagesRoot).position, ((Transform)PagesRoot).rotation, (Transform)(object)PagesRoot);
_pages.Add(registeredCustomPage.Key, universalModPanelPage);
universalModPanelPage.Panel = this;
((Component)universalModPanelPage).gameObject.SetActive(false);
}
foreach (KeyValuePair<string, string> button in CustomHomepageButtons)
{
GameObject obj = Object.Instantiate<GameObject>(HomeScreenButtonPrefab, (Transform)(object)HomePage);
obj.GetComponentInChildren<Text>().text = button.Key;
((UnityEvent)obj.GetComponent<Button>().onClick).AddListener((UnityAction)delegate
{
Navigate(button.Value);
});
}
NavigateHome();
}
public TPage? GetPageOfType<TPage>() where TPage : UniversalModPanelPage
{
return _pages.Values.FirstOrDefault((UniversalModPanelPage p) => (object)((object)p).GetType() == typeof(TPage)) as TPage;
}
public void NavigateHome()
{
_stack.Clear();
((Selectable)HomeButton).interactable = false;
((Selectable)BackButton).interactable = false;
if (Object.op_Implicit((Object)(object)_currentPage))
{
((Component)_currentPage).gameObject.SetActive(false);
}
_currentPage = _pages["Home"];
((Component)_currentPage).gameObject.SetActive(true);
UpdatePaginationBar();
UpdateBreadcrumb();
}
public void NavigateBack()
{
if (_stack.Count != 0)
{
((Component)_currentPage).gameObject.SetActive(false);
_currentPage = _stack.Pop();
((Component)_currentPage).gameObject.SetActive(true);
if (_stack.Count == 0)
{
((Selectable)BackButton).interactable = false;
}
UpdatePaginationBar();
UpdateBreadcrumb();
}
}
public void Navigate(string pageName)
{
if (_pages.TryGetValue(pageName, out UniversalModPanelPage value))
{
Navigate(value);
return;
}
throw new InvalidOperationException("There is no page with the name '" + pageName + "'");
}
public void Navigate(UniversalModPanelPage page)
{
((Selectable)HomeButton).interactable = true;
if (((Object)((Component)_currentPage).gameObject).name != "Home")
{
_stack.Push(_currentPage);
((Selectable)BackButton).interactable = true;
}
((Component)_currentPage).gameObject.SetActive(false);
_currentPage = page;
((Component)_currentPage).gameObject.SetActive(true);
UpdateBreadcrumb();
UpdatePaginationBar();
}
public void PaginatePrevious()
{
}
public void PaginateNext()
{
}
private void UpdatePaginationBar()
{
}
private void UpdateBreadcrumb()
{
string text = string.Join(" / ", _stack.Select((UniversalModPanelPage p) => p.DisplayName).Concat(new string[1] { _currentPage.DisplayName }).ToArray());
Breadcrumb.text = text;
}
public static void RegisterPluginSettings(PluginInfo plugin, params ConfigEntryBase[] configEntries)
{
RegisteredConfigs[plugin] = configEntries;
}
public static void RegisterPluginSettings(PluginInfo plugin, ConfigFile configFile)
{
if (configFile.Count == 0)
{
return;
}
int num = 0;
ConfigEntryBase[] array = (ConfigEntryBase[])(object)new ConfigEntryBase[configFile.Count];
foreach (ConfigDefinition key in configFile.Keys)
{
array[num++] = configFile[key];
}
RegisterPluginSettings(plugin, array);
}
public static void RegisterConfigField(ConfigFieldBase inputField, Func<ConfigEntryBase, bool> predicate)
{
RegisteredInputFields[inputField] = predicate;
}
public static void RegisterCustomPage<TPage>(string identifier, TPage page) where TPage : UniversalModPanelPage
{
if (string.IsNullOrEmpty(identifier))
{
throw new ArgumentException("Identifier cannot be null or empty", "identifier");
}
if (page == null)
{
throw new ArgumentNullException("page");
}
RegisteredCustomPages.Add(identifier, page);
}
public static void AddHomepageButton(string buttonText, string targetPage)
{
if (string.IsNullOrEmpty(buttonText))
{
throw new ArgumentException("Button text cannot be empty", "buttonText");
}
if (string.IsNullOrEmpty(targetPage))
{
throw new ArgumentException("Target page cannot be empty", "targetPage");
}
CustomHomepageButtons.Add(buttonText, targetPage);
}
internal static void RegisterUnregisteredPluginConfigs()
{
BaseUnityPlugin[] components = Chainloader.ManagerObject.GetComponents<BaseUnityPlugin>();
foreach (BaseUnityPlugin val in components)
{
if (!RegisteredConfigs.ContainsKey(val.Info))
{
RegisterPluginSettings(val.Info, val.Config);
}
string name = ModsAPI.PluginToPackageLookup[val.Info].Name;
if (Directory.Exists(Path.Combine(Path.Combine(Paths.BepInExRootPath, "docs"), name)))
{
PluginsWithDocumentation.Add(val.Info);
}
}
if (Object.op_Implicit((Object)(object)Instance))
{
Instance.GetPageOfType<ModPanelPluginListPage>().RedrawList();
}
}
}
}
namespace Sodalite.ModPanel.Pages
{
public sealed class ModPanelColorPickerPage : UniversalModPanelPage
{
public Slider RedSlider;
public Slider GreenSlider;
public Slider BlueSlider;
public Slider AlphaSlider;
public Text FieldName;
public Image OldColor;
public Image NewColor;
public Text OldColorText;
public Text NewColorText;
private Color _newColor;
private Action<Color>? _onSuccess;
private Action<Color>? _onUpdate;
public void PickColor(string fieldName, Color currentColor, Action<Color> onSuccess, Action<Color>? onUpdate = null)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
Panel.Navigate(this);
_onSuccess = onSuccess;
_onUpdate = onUpdate;
_newColor = currentColor;
RedSlider.value = currentColor.r * RedSlider.maxValue;
GreenSlider.value = currentColor.g * GreenSlider.maxValue;
BlueSlider.value = currentColor.b * BlueSlider.maxValue;
AlphaSlider.value = currentColor.a * AlphaSlider.maxValue;
FieldName.text = fieldName;
((Graphic)OldColor).color = currentColor;
OldColorText.text = "Old color: " + currentColor.AsRGBA();
((Graphic)NewColor).color = _newColor;
NewColorText.text = "New color: " + _newColorusing System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using Microsoft.CodeAnalysis;
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Core.Tokens;
using YamlDotNet.Helpers;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.BufferedDeserialization;
using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators;
using YamlDotNet.Serialization.Callbacks;
using YamlDotNet.Serialization.Converters;
using YamlDotNet.Serialization.EventEmitters;
using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization.NodeDeserializers;
using YamlDotNet.Serialization.NodeTypeResolvers;
using YamlDotNet.Serialization.ObjectFactories;
using YamlDotNet.Serialization.ObjectGraphTraversalStrategies;
using YamlDotNet.Serialization.ObjectGraphVisitors;
using YamlDotNet.Serialization.Schemas;
using YamlDotNet.Serialization.TypeInspectors;
using YamlDotNet.Serialization.TypeResolvers;
using YamlDotNet.Serialization.Utilities;
using YamlDotNet.Serialization.ValueDeserializers;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: ComVisible(false)]
[assembly: AssemblyFileVersion("13.7.1.0")]
[assembly: AssemblyInformationalVersion("13.7.1")]
[assembly: AssemblyTitle("YamlDotNet")]
[assembly: AssemblyDescription("The YamlDotNet library.")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("YamlDotNet")]
[assembly: AssemblyCopyright("Copyright (c) Antoine Aubry and contributors 2008 - 2019")]
[assembly: AssemblyTrademark("")]
[assembly: CLSCompliant(true)]
[assembly: InternalsVisibleTo("YamlDotNet.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010065e52a453dde5c5b4be5bbe2205755727fce80244b79b894faf8793d80f7db9a96d360b51c220782db32aacee4cb5b8a91bee33aeec700e1f21895c4baadef501eeeac609220d1651603b378173811ee5bb6a002df973d38821bd2fef820c00c174a69faec326a1983b570f07ec66147026b9c8753465de3a8d0c44b613b02af")]
[assembly: AssemblyVersion("13.0.0.0")]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class IsReadOnlyAttribute : Attribute
{
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
}
namespace YamlDotNet
{
internal sealed class CultureInfoAdapter : CultureInfo
{
private readonly IFormatProvider provider;
public CultureInfoAdapter(CultureInfo baseCulture, IFormatProvider provider)
: base(baseCulture.LCID)
{
this.provider = provider;
}
public override object? GetFormat(Type? formatType)
{
return provider.GetFormat(formatType);
}
}
internal static class ReflectionExtensions
{
private static readonly FieldInfo? RemoteStackTraceField = typeof(Exception).GetField("_remoteStackTraceString", BindingFlags.Instance | BindingFlags.NonPublic);
public static Type? BaseType(this Type type)
{
return type.BaseType;
}
public static bool IsValueType(this Type type)
{
return type.IsValueType;
}
public static bool IsGenericType(this Type type)
{
return type.IsGenericType;
}
public static bool IsGenericTypeDefinition(this Type type)
{
return type.IsGenericTypeDefinition;
}
public static bool IsInterface(this Type type)
{
return type.IsInterface;
}
public static bool IsEnum(this Type type)
{
return type.IsEnum;
}
public static bool IsDbNull(this object value)
{
return value is DBNull;
}
public static bool HasDefaultConstructor(this Type type, bool allowPrivateConstructors)
{
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public;
if (allowPrivateConstructors)
{
bindingFlags |= BindingFlags.NonPublic;
}
if (!type.IsValueType)
{
return (object)type.GetConstructor(bindingFlags, null, Type.EmptyTypes, null) != null;
}
return true;
}
public static TypeCode GetTypeCode(this Type type)
{
return Type.GetTypeCode(type);
}
public static PropertyInfo? GetPublicProperty(this Type type, string name)
{
return type.GetProperty(name);
}
public static FieldInfo? GetPublicStaticField(this Type type, string name)
{
return type.GetField(name, BindingFlags.Static | BindingFlags.Public);
}
public static IEnumerable<PropertyInfo> GetProperties(this Type type, bool includeNonPublic)
{
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public;
if (includeNonPublic)
{
bindingFlags |= BindingFlags.NonPublic;
}
if (!type.IsInterface)
{
return type.GetProperties(bindingFlags);
}
return new Type[1] { type }.Concat(type.GetInterfaces()).SelectMany((Type i) => i.GetProperties(bindingFlags));
}
public static IEnumerable<PropertyInfo> GetPublicProperties(this Type type)
{
return type.GetProperties(includeNonPublic: false);
}
public static IEnumerable<FieldInfo> GetPublicFields(this Type type)
{
return type.GetFields(BindingFlags.Instance | BindingFlags.Public);
}
public static IEnumerable<MethodInfo> GetPublicStaticMethods(this Type type)
{
return type.GetMethods(BindingFlags.Static | BindingFlags.Public);
}
public static MethodInfo GetPrivateStaticMethod(this Type type, string name)
{
return type.GetMethod(name, BindingFlags.Static | BindingFlags.NonPublic) ?? throw new MissingMethodException("Expected to find a method named '" + name + "' in '" + type.FullName + "'.");
}
public static MethodInfo? GetPublicStaticMethod(this Type type, string name, params Type[] parameterTypes)
{
return type.GetMethod(name, BindingFlags.Static | BindingFlags.Public, null, parameterTypes, null);
}
public static MethodInfo? GetPublicInstanceMethod(this Type type, string name)
{
return type.GetMethod(name, BindingFlags.Instance | BindingFlags.Public);
}
public static Exception Unwrap(this TargetInvocationException ex)
{
Exception innerException = ex.InnerException;
if (innerException == null)
{
return ex;
}
if ((object)RemoteStackTraceField != null)
{
RemoteStackTraceField.SetValue(innerException, innerException.StackTrace + "\r\n");
}
return innerException;
}
public static bool IsInstanceOf(this Type type, object o)
{
return type.IsInstanceOfType(o);
}
public static Attribute[] GetAllCustomAttributes<TAttribute>(this PropertyInfo property)
{
return Attribute.GetCustomAttributes(property, typeof(TAttribute), inherit: true);
}
}
internal static class PropertyInfoExtensions
{
public static object? ReadValue(this PropertyInfo property, object target)
{
return property.GetValue(target, null);
}
}
internal static class StandardRegexOptions
{
public const RegexOptions Compiled = RegexOptions.Compiled;
}
}
namespace YamlDotNet.Serialization
{
public abstract class BuilderSkeleton<TBuilder> where TBuilder : BuilderSkeleton<TBuilder>
{
internal INamingConvention namingConvention = NullNamingConvention.Instance;
internal ITypeResolver typeResolver;
internal readonly YamlAttributeOverrides overrides;
internal readonly LazyComponentRegistrationList<Nothing, IYamlTypeConverter> typeConverterFactories;
internal readonly LazyComponentRegistrationList<ITypeInspector, ITypeInspector> typeInspectorFactories;
internal bool ignoreFields;
internal bool includeNonPublicProperties;
internal Settings settings;
internal YamlFormatter yamlFormatter = YamlFormatter.Default;
protected abstract TBuilder Self { get; }
internal BuilderSkeleton(ITypeResolver typeResolver)
{
overrides = new YamlAttributeOverrides();
typeConverterFactories = new LazyComponentRegistrationList<Nothing, IYamlTypeConverter>
{
{
typeof(YamlDotNet.Serialization.Converters.GuidConverter),
(Nothing _) => new YamlDotNet.Serialization.Converters.GuidConverter(jsonCompatible: false)
},
{
typeof(SystemTypeConverter),
(Nothing _) => new SystemTypeConverter()
}
};
typeInspectorFactories = new LazyComponentRegistrationList<ITypeInspector, ITypeInspector>();
this.typeResolver = typeResolver ?? throw new ArgumentNullException("typeResolver");
settings = new Settings();
}
public TBuilder IgnoreFields()
{
ignoreFields = true;
return Self;
}
public TBuilder IncludeNonPublicProperties()
{
includeNonPublicProperties = true;
return Self;
}
public TBuilder EnablePrivateConstructors()
{
settings.AllowPrivateConstructors = true;
return Self;
}
public TBuilder WithNamingConvention(INamingConvention namingConvention)
{
this.namingConvention = namingConvention ?? throw new ArgumentNullException("namingConvention");
return Self;
}
public TBuilder WithTypeResolver(ITypeResolver typeResolver)
{
this.typeResolver = typeResolver ?? throw new ArgumentNullException("typeResolver");
return Self;
}
public abstract TBuilder WithTagMapping(TagName tag, Type type);
public TBuilder WithAttributeOverride<TClass>(Expression<Func<TClass, object>> propertyAccessor, Attribute attribute)
{
overrides.Add(propertyAccessor, attribute);
return Self;
}
public TBuilder WithAttributeOverride(Type type, string member, Attribute attribute)
{
overrides.Add(type, member, attribute);
return Self;
}
public TBuilder WithTypeConverter(IYamlTypeConverter typeConverter)
{
return WithTypeConverter(typeConverter, delegate(IRegistrationLocationSelectionSyntax<IYamlTypeConverter> w)
{
w.OnTop();
});
}
public TBuilder WithTypeConverter(IYamlTypeConverter typeConverter, Action<IRegistrationLocationSelectionSyntax<IYamlTypeConverter>> where)
{
IYamlTypeConverter typeConverter2 = typeConverter;
if (typeConverter2 == null)
{
throw new ArgumentNullException("typeConverter");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(typeConverterFactories.CreateRegistrationLocationSelector(typeConverter2.GetType(), (Nothing _) => typeConverter2));
return Self;
}
public TBuilder WithTypeConverter<TYamlTypeConverter>(WrapperFactory<IYamlTypeConverter, IYamlTypeConverter> typeConverterFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IYamlTypeConverter>> where) where TYamlTypeConverter : IYamlTypeConverter
{
WrapperFactory<IYamlTypeConverter, IYamlTypeConverter> typeConverterFactory2 = typeConverterFactory;
if (typeConverterFactory2 == null)
{
throw new ArgumentNullException("typeConverterFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(typeConverterFactories.CreateTrackingRegistrationLocationSelector(typeof(TYamlTypeConverter), (IYamlTypeConverter wrapped, Nothing _) => typeConverterFactory2(wrapped)));
return Self;
}
public TBuilder WithoutTypeConverter<TYamlTypeConverter>() where TYamlTypeConverter : IYamlTypeConverter
{
return WithoutTypeConverter(typeof(TYamlTypeConverter));
}
public TBuilder WithoutTypeConverter(Type converterType)
{
if ((object)converterType == null)
{
throw new ArgumentNullException("converterType");
}
typeConverterFactories.Remove(converterType);
return Self;
}
public TBuilder WithTypeInspector<TTypeInspector>(Func<ITypeInspector, TTypeInspector> typeInspectorFactory) where TTypeInspector : ITypeInspector
{
return WithTypeInspector(typeInspectorFactory, delegate(IRegistrationLocationSelectionSyntax<ITypeInspector> w)
{
w.OnTop();
});
}
public TBuilder WithTypeInspector<TTypeInspector>(Func<ITypeInspector, TTypeInspector> typeInspectorFactory, Action<IRegistrationLocationSelectionSyntax<ITypeInspector>> where) where TTypeInspector : ITypeInspector
{
Func<ITypeInspector, TTypeInspector> typeInspectorFactory2 = typeInspectorFactory;
if (typeInspectorFactory2 == null)
{
throw new ArgumentNullException("typeInspectorFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(typeInspectorFactories.CreateRegistrationLocationSelector(typeof(TTypeInspector), (ITypeInspector inner) => typeInspectorFactory2(inner)));
return Self;
}
public TBuilder WithTypeInspector<TTypeInspector>(WrapperFactory<ITypeInspector, ITypeInspector, TTypeInspector> typeInspectorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<ITypeInspector>> where) where TTypeInspector : ITypeInspector
{
WrapperFactory<ITypeInspector, ITypeInspector, TTypeInspector> typeInspectorFactory2 = typeInspectorFactory;
if (typeInspectorFactory2 == null)
{
throw new ArgumentNullException("typeInspectorFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(typeInspectorFactories.CreateTrackingRegistrationLocationSelector(typeof(TTypeInspector), (ITypeInspector wrapped, ITypeInspector inner) => typeInspectorFactory2(wrapped, inner)));
return Self;
}
public TBuilder WithoutTypeInspector<TTypeInspector>() where TTypeInspector : ITypeInspector
{
return WithoutTypeInspector(typeof(TTypeInspector));
}
public TBuilder WithoutTypeInspector(Type inspectorType)
{
if ((object)inspectorType == null)
{
throw new ArgumentNullException("inspectorType");
}
typeInspectorFactories.Remove(inspectorType);
return Self;
}
public TBuilder WithYamlFormatter(YamlFormatter formatter)
{
yamlFormatter = formatter ?? throw new ArgumentNullException("formatter");
return Self;
}
protected IEnumerable<IYamlTypeConverter> BuildTypeConverters()
{
return typeConverterFactories.BuildComponentList();
}
}
public delegate TComponent WrapperFactory<TComponentBase, TComponent>(TComponentBase wrapped) where TComponent : TComponentBase;
public delegate TComponent WrapperFactory<TArgument, TComponentBase, TComponent>(TComponentBase wrapped, TArgument argument) where TComponent : TComponentBase;
[Flags]
public enum DefaultValuesHandling
{
Preserve = 0,
OmitNull = 1,
OmitDefaults = 2,
OmitEmptyCollections = 4
}
public sealed class Deserializer : IDeserializer
{
private readonly IValueDeserializer valueDeserializer;
public Deserializer()
: this(new DeserializerBuilder().BuildValueDeserializer())
{
}
private Deserializer(IValueDeserializer valueDeserializer)
{
this.valueDeserializer = valueDeserializer ?? throw new ArgumentNullException("valueDeserializer");
}
public static Deserializer FromValueDeserializer(IValueDeserializer valueDeserializer)
{
return new Deserializer(valueDeserializer);
}
public T Deserialize<T>(string input)
{
using StringReader input2 = new StringReader(input);
return Deserialize<T>(input2);
}
public T Deserialize<T>(TextReader input)
{
return Deserialize<T>(new Parser(input));
}
public T Deserialize<T>(IParser parser)
{
return (T)Deserialize(parser, typeof(T));
}
public object? Deserialize(string input)
{
return Deserialize(input, typeof(object));
}
public object? Deserialize(TextReader input)
{
return Deserialize(input, typeof(object));
}
public object? Deserialize(IParser parser)
{
return Deserialize(parser, typeof(object));
}
public object? Deserialize(string input, Type type)
{
using StringReader input2 = new StringReader(input);
return Deserialize(input2, type);
}
public object? Deserialize(TextReader input, Type type)
{
return Deserialize(new Parser(input), type);
}
public object? Deserialize(IParser parser, Type type)
{
if (parser == null)
{
throw new ArgumentNullException("parser");
}
if ((object)type == null)
{
throw new ArgumentNullException("type");
}
YamlDotNet.Core.Events.StreamStart @event;
bool flag = parser.TryConsume<YamlDotNet.Core.Events.StreamStart>(out @event);
YamlDotNet.Core.Events.DocumentStart event2;
bool flag2 = parser.TryConsume<YamlDotNet.Core.Events.DocumentStart>(out event2);
object result = null;
if (!parser.Accept<YamlDotNet.Core.Events.DocumentEnd>(out var _) && !parser.Accept<YamlDotNet.Core.Events.StreamEnd>(out var _))
{
using SerializerState serializerState = new SerializerState();
result = valueDeserializer.DeserializeValue(parser, type, serializerState, valueDeserializer);
serializerState.OnDeserialization();
}
if (flag2)
{
parser.Consume<YamlDotNet.Core.Events.DocumentEnd>();
}
if (flag)
{
parser.Consume<YamlDotNet.Core.Events.StreamEnd>();
}
return result;
}
}
public sealed class DeserializerBuilder : BuilderSkeleton<DeserializerBuilder>
{
private Lazy<IObjectFactory> objectFactory;
private readonly LazyComponentRegistrationList<Nothing, INodeDeserializer> nodeDeserializerFactories;
private readonly LazyComponentRegistrationList<Nothing, INodeTypeResolver> nodeTypeResolverFactories;
private readonly Dictionary<TagName, Type> tagMappings;
private readonly Dictionary<Type, Type> typeMappings;
private readonly ITypeConverter typeConverter;
private bool ignoreUnmatched;
private bool duplicateKeyChecking;
private bool attemptUnknownTypeDeserialization;
protected override DeserializerBuilder Self => this;
public DeserializerBuilder()
: base((ITypeResolver)new StaticTypeResolver())
{
typeMappings = new Dictionary<Type, Type>();
objectFactory = new Lazy<IObjectFactory>(() => new DefaultObjectFactory(typeMappings, settings), isThreadSafe: true);
tagMappings = new Dictionary<TagName, Type>
{
{
FailsafeSchema.Tags.Map,
typeof(Dictionary<object, object>)
},
{
FailsafeSchema.Tags.Str,
typeof(string)
},
{
JsonSchema.Tags.Bool,
typeof(bool)
},
{
JsonSchema.Tags.Float,
typeof(double)
},
{
JsonSchema.Tags.Int,
typeof(int)
},
{
DefaultSchema.Tags.Timestamp,
typeof(DateTime)
}
};
typeInspectorFactories.Add(typeof(CachedTypeInspector), (ITypeInspector inner) => new CachedTypeInspector(inner));
typeInspectorFactories.Add(typeof(NamingConventionTypeInspector), (ITypeInspector inner) => (!(namingConvention is NullNamingConvention)) ? new NamingConventionTypeInspector(inner, namingConvention) : inner);
typeInspectorFactories.Add(typeof(YamlAttributesTypeInspector), (ITypeInspector inner) => new YamlAttributesTypeInspector(inner));
typeInspectorFactories.Add(typeof(YamlAttributeOverridesInspector), (ITypeInspector inner) => (overrides == null) ? inner : new YamlAttributeOverridesInspector(inner, overrides.Clone()));
typeInspectorFactories.Add(typeof(ReadableAndWritablePropertiesTypeInspector), (ITypeInspector inner) => new ReadableAndWritablePropertiesTypeInspector(inner));
nodeDeserializerFactories = new LazyComponentRegistrationList<Nothing, INodeDeserializer>
{
{
typeof(YamlConvertibleNodeDeserializer),
(Nothing _) => new YamlConvertibleNodeDeserializer(objectFactory.Value)
},
{
typeof(YamlSerializableNodeDeserializer),
(Nothing _) => new YamlSerializableNodeDeserializer(objectFactory.Value)
},
{
typeof(TypeConverterNodeDeserializer),
(Nothing _) => new TypeConverterNodeDeserializer(BuildTypeConverters())
},
{
typeof(NullNodeDeserializer),
(Nothing _) => new NullNodeDeserializer()
},
{
typeof(ScalarNodeDeserializer),
(Nothing _) => new ScalarNodeDeserializer(attemptUnknownTypeDeserialization, typeConverter, yamlFormatter)
},
{
typeof(ArrayNodeDeserializer),
(Nothing _) => new ArrayNodeDeserializer()
},
{
typeof(DictionaryNodeDeserializer),
(Nothing _) => new DictionaryNodeDeserializer(objectFactory.Value, duplicateKeyChecking)
},
{
typeof(CollectionNodeDeserializer),
(Nothing _) => new CollectionNodeDeserializer(objectFactory.Value)
},
{
typeof(EnumerableNodeDeserializer),
(Nothing _) => new EnumerableNodeDeserializer()
},
{
typeof(ObjectNodeDeserializer),
(Nothing _) => new ObjectNodeDeserializer(objectFactory.Value, BuildTypeInspector(), ignoreUnmatched, duplicateKeyChecking, typeConverter)
}
};
nodeTypeResolverFactories = new LazyComponentRegistrationList<Nothing, INodeTypeResolver>
{
{
typeof(MappingNodeTypeResolver),
(Nothing _) => new MappingNodeTypeResolver(typeMappings)
},
{
typeof(YamlConvertibleTypeResolver),
(Nothing _) => new YamlConvertibleTypeResolver()
},
{
typeof(YamlSerializableTypeResolver),
(Nothing _) => new YamlSerializableTypeResolver()
},
{
typeof(TagNodeTypeResolver),
(Nothing _) => new TagNodeTypeResolver(tagMappings)
},
{
typeof(PreventUnknownTagsNodeTypeResolver),
(Nothing _) => new PreventUnknownTagsNodeTypeResolver()
},
{
typeof(DefaultContainersNodeTypeResolver),
(Nothing _) => new DefaultContainersNodeTypeResolver()
}
};
typeConverter = new ReflectionTypeConverter();
}
internal ITypeInspector BuildTypeInspector()
{
ITypeInspector typeInspector = new WritablePropertiesTypeInspector(typeResolver, includeNonPublicProperties);
if (!ignoreFields)
{
typeInspector = new CompositeTypeInspector(new ReadableFieldsTypeInspector(typeResolver), typeInspector);
}
return typeInspectorFactories.BuildComponentChain(typeInspector);
}
public DeserializerBuilder WithAttemptingUnquotedStringTypeDeserialization()
{
attemptUnknownTypeDeserialization = true;
return this;
}
public DeserializerBuilder WithObjectFactory(IObjectFactory objectFactory)
{
IObjectFactory objectFactory2 = objectFactory;
if (objectFactory2 == null)
{
throw new ArgumentNullException("objectFactory");
}
this.objectFactory = new Lazy<IObjectFactory>(() => objectFactory2, isThreadSafe: true);
return this;
}
public DeserializerBuilder WithObjectFactory(Func<Type, object> objectFactory)
{
if (objectFactory == null)
{
throw new ArgumentNullException("objectFactory");
}
return WithObjectFactory(new LambdaObjectFactory(objectFactory));
}
public DeserializerBuilder WithNodeDeserializer(INodeDeserializer nodeDeserializer)
{
return WithNodeDeserializer(nodeDeserializer, delegate(IRegistrationLocationSelectionSyntax<INodeDeserializer> w)
{
w.OnTop();
});
}
public DeserializerBuilder WithNodeDeserializer(INodeDeserializer nodeDeserializer, Action<IRegistrationLocationSelectionSyntax<INodeDeserializer>> where)
{
INodeDeserializer nodeDeserializer2 = nodeDeserializer;
if (nodeDeserializer2 == null)
{
throw new ArgumentNullException("nodeDeserializer");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(nodeDeserializerFactories.CreateRegistrationLocationSelector(nodeDeserializer2.GetType(), (Nothing _) => nodeDeserializer2));
return this;
}
public DeserializerBuilder WithNodeDeserializer<TNodeDeserializer>(WrapperFactory<INodeDeserializer, TNodeDeserializer> nodeDeserializerFactory, Action<ITrackingRegistrationLocationSelectionSyntax<INodeDeserializer>> where) where TNodeDeserializer : INodeDeserializer
{
WrapperFactory<INodeDeserializer, TNodeDeserializer> nodeDeserializerFactory2 = nodeDeserializerFactory;
if (nodeDeserializerFactory2 == null)
{
throw new ArgumentNullException("nodeDeserializerFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(nodeDeserializerFactories.CreateTrackingRegistrationLocationSelector(typeof(TNodeDeserializer), (INodeDeserializer wrapped, Nothing _) => nodeDeserializerFactory2(wrapped)));
return this;
}
public DeserializerBuilder WithoutNodeDeserializer<TNodeDeserializer>() where TNodeDeserializer : INodeDeserializer
{
return WithoutNodeDeserializer(typeof(TNodeDeserializer));
}
public DeserializerBuilder WithoutNodeDeserializer(Type nodeDeserializerType)
{
if ((object)nodeDeserializerType == null)
{
throw new ArgumentNullException("nodeDeserializerType");
}
nodeDeserializerFactories.Remove(nodeDeserializerType);
return this;
}
public DeserializerBuilder WithTypeDiscriminatingNodeDeserializer(Action<ITypeDiscriminatingNodeDeserializerOptions> configureTypeDiscriminatingNodeDeserializerOptions, int maxDepth = -1, int maxLength = -1)
{
TypeDiscriminatingNodeDeserializerOptions typeDiscriminatingNodeDeserializerOptions = new TypeDiscriminatingNodeDeserializerOptions();
configureTypeDiscriminatingNodeDeserializerOptions(typeDiscriminatingNodeDeserializerOptions);
TypeDiscriminatingNodeDeserializer nodeDeserializer = new TypeDiscriminatingNodeDeserializer(nodeDeserializerFactories.BuildComponentList(), typeDiscriminatingNodeDeserializerOptions.discriminators, maxDepth, maxLength);
return WithNodeDeserializer(nodeDeserializer, delegate(IRegistrationLocationSelectionSyntax<INodeDeserializer> s)
{
s.Before<DictionaryNodeDeserializer>();
});
}
public DeserializerBuilder WithNodeTypeResolver(INodeTypeResolver nodeTypeResolver)
{
return WithNodeTypeResolver(nodeTypeResolver, delegate(IRegistrationLocationSelectionSyntax<INodeTypeResolver> w)
{
w.OnTop();
});
}
public DeserializerBuilder WithNodeTypeResolver(INodeTypeResolver nodeTypeResolver, Action<IRegistrationLocationSelectionSyntax<INodeTypeResolver>> where)
{
INodeTypeResolver nodeTypeResolver2 = nodeTypeResolver;
if (nodeTypeResolver2 == null)
{
throw new ArgumentNullException("nodeTypeResolver");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(nodeTypeResolverFactories.CreateRegistrationLocationSelector(nodeTypeResolver2.GetType(), (Nothing _) => nodeTypeResolver2));
return this;
}
public DeserializerBuilder WithNodeTypeResolver<TNodeTypeResolver>(WrapperFactory<INodeTypeResolver, TNodeTypeResolver> nodeTypeResolverFactory, Action<ITrackingRegistrationLocationSelectionSyntax<INodeTypeResolver>> where) where TNodeTypeResolver : INodeTypeResolver
{
WrapperFactory<INodeTypeResolver, TNodeTypeResolver> nodeTypeResolverFactory2 = nodeTypeResolverFactory;
if (nodeTypeResolverFactory2 == null)
{
throw new ArgumentNullException("nodeTypeResolverFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(nodeTypeResolverFactories.CreateTrackingRegistrationLocationSelector(typeof(TNodeTypeResolver), (INodeTypeResolver wrapped, Nothing _) => nodeTypeResolverFactory2(wrapped)));
return this;
}
public DeserializerBuilder WithoutNodeTypeResolver<TNodeTypeResolver>() where TNodeTypeResolver : INodeTypeResolver
{
return WithoutNodeTypeResolver(typeof(TNodeTypeResolver));
}
public DeserializerBuilder WithoutNodeTypeResolver(Type nodeTypeResolverType)
{
if ((object)nodeTypeResolverType == null)
{
throw new ArgumentNullException("nodeTypeResolverType");
}
nodeTypeResolverFactories.Remove(nodeTypeResolverType);
return this;
}
public override DeserializerBuilder WithTagMapping(TagName tag, Type type)
{
if (tag.IsEmpty)
{
throw new ArgumentException("Non-specific tags cannot be maped");
}
if ((object)type == null)
{
throw new ArgumentNullException("type");
}
if (tagMappings.TryGetValue(tag, out Type value))
{
throw new ArgumentException($"Type already has a registered type '{value.FullName}' for tag '{tag}'", "tag");
}
tagMappings.Add(tag, type);
return this;
}
public DeserializerBuilder WithTypeMapping<TInterface, TConcrete>() where TConcrete : TInterface
{
Type typeFromHandle = typeof(TInterface);
Type typeFromHandle2 = typeof(TConcrete);
if (!typeFromHandle.IsAssignableFrom(typeFromHandle2))
{
throw new InvalidOperationException("The type '" + typeFromHandle2.Name + "' does not implement interface '" + typeFromHandle.Name + "'.");
}
if (typeMappings.ContainsKey(typeFromHandle))
{
typeMappings[typeFromHandle] = typeFromHandle2;
}
else
{
typeMappings.Add(typeFromHandle, typeFromHandle2);
}
return this;
}
public DeserializerBuilder WithoutTagMapping(TagName tag)
{
if (tag.IsEmpty)
{
throw new ArgumentException("Non-specific tags cannot be maped");
}
if (!tagMappings.Remove(tag))
{
throw new KeyNotFoundException($"Tag '{tag}' is not registered");
}
return this;
}
public DeserializerBuilder IgnoreUnmatchedProperties()
{
ignoreUnmatched = true;
return this;
}
public DeserializerBuilder WithDuplicateKeyChecking()
{
duplicateKeyChecking = true;
return this;
}
public IDeserializer Build()
{
return Deserializer.FromValueDeserializer(BuildValueDeserializer());
}
public IValueDeserializer BuildValueDeserializer()
{
return new AliasValueDeserializer(new NodeValueDeserializer(nodeDeserializerFactories.BuildComponentList(), nodeTypeResolverFactories.BuildComponentList(), typeConverter));
}
}
public sealed class EmissionPhaseObjectGraphVisitorArgs
{
private readonly IEnumerable<IObjectGraphVisitor<Nothing>> preProcessingPhaseVisitors;
public IObjectGraphVisitor<IEmitter> InnerVisitor { get; private set; }
public IEventEmitter EventEmitter { get; private set; }
public ObjectSerializer NestedObjectSerializer { get; private set; }
public IEnumerable<IYamlTypeConverter> TypeConverters { get; private set; }
public EmissionPhaseObjectGraphVisitorArgs(IObjectGraphVisitor<IEmitter> innerVisitor, IEventEmitter eventEmitter, IEnumerable<IObjectGraphVisitor<Nothing>> preProcessingPhaseVisitors, IEnumerable<IYamlTypeConverter> typeConverters, ObjectSerializer nestedObjectSerializer)
{
InnerVisitor = innerVisitor ?? throw new ArgumentNullException("innerVisitor");
EventEmitter = eventEmitter ?? throw new ArgumentNullException("eventEmitter");
this.preProcessingPhaseVisitors = preProcessingPhaseVisitors ?? throw new ArgumentNullException("preProcessingPhaseVisitors");
TypeConverters = typeConverters ?? throw new ArgumentNullException("typeConverters");
NestedObjectSerializer = nestedObjectSerializer ?? throw new ArgumentNullException("nestedObjectSerializer");
}
public T GetPreProcessingPhaseObjectGraphVisitor<T>() where T : IObjectGraphVisitor<Nothing>
{
return preProcessingPhaseVisitors.OfType<T>().Single();
}
}
public abstract class EventInfo
{
public IObjectDescriptor Source { get; }
protected EventInfo(IObjectDescriptor source)
{
Source = source ?? throw new ArgumentNullException("source");
}
}
public class AliasEventInfo : EventInfo
{
public AnchorName Alias { get; }
public bool NeedsExpansion { get; set; }
public AliasEventInfo(IObjectDescriptor source, AnchorName alias)
: base(source)
{
if (alias.IsEmpty)
{
throw new ArgumentNullException("alias");
}
Alias = alias;
}
}
public class ObjectEventInfo : EventInfo
{
public AnchorName Anchor { get; set; }
public TagName Tag { get; set; }
protected ObjectEventInfo(IObjectDescriptor source)
: base(source)
{
}
}
public sealed class ScalarEventInfo : ObjectEventInfo
{
public string RenderedValue { get; set; }
public ScalarStyle Style { get; set; }
public bool IsPlainImplicit { get; set; }
public bool IsQuotedImplicit { get; set; }
public ScalarEventInfo(IObjectDescriptor source)
: base(source)
{
Style = source.ScalarStyle;
RenderedValue = string.Empty;
}
}
public sealed class MappingStartEventInfo : ObjectEventInfo
{
public bool IsImplicit { get; set; }
public MappingStyle Style { get; set; }
public MappingStartEventInfo(IObjectDescriptor source)
: base(source)
{
}
}
public sealed class MappingEndEventInfo : EventInfo
{
public MappingEndEventInfo(IObjectDescriptor source)
: base(source)
{
}
}
public sealed class SequenceStartEventInfo : ObjectEventInfo
{
public bool IsImplicit { get; set; }
public SequenceStyle Style { get; set; }
public SequenceStartEventInfo(IObjectDescriptor source)
: base(source)
{
}
}
public sealed class SequenceEndEventInfo : EventInfo
{
public SequenceEndEventInfo(IObjectDescriptor source)
: base(source)
{
}
}
public interface IAliasProvider
{
AnchorName GetAlias(object target);
}
public interface IDeserializer
{
T Deserialize<T>(string input);
T Deserialize<T>(TextReader input);
T Deserialize<T>(IParser parser);
object? Deserialize(string input);
object? Deserialize(TextReader input);
object? Deserialize(IParser parser);
object? Deserialize(string input, Type type);
object? Deserialize(TextReader input, Type type);
object? Deserialize(IParser parser, Type type);
}
public interface IEventEmitter
{
void Emit(AliasEventInfo eventInfo, IEmitter emitter);
void Emit(ScalarEventInfo eventInfo, IEmitter emitter);
void Emit(MappingStartEventInfo eventInfo, IEmitter emitter);
void Emit(MappingEndEventInfo eventInfo, IEmitter emitter);
void Emit(SequenceStartEventInfo eventInfo, IEmitter emitter);
void Emit(SequenceEndEventInfo eventInfo, IEmitter emitter);
}
public interface INamingConvention
{
string Apply(string value);
}
public interface INodeDeserializer
{
bool Deserialize(IParser reader, Type expectedType, Func<IParser, Type, object?> nestedObjectDeserializer, out object? value);
}
public interface INodeTypeResolver
{
bool Resolve(NodeEvent? nodeEvent, ref Type currentType);
}
public interface IObjectAccessor
{
void Set(string name, object target, object value);
object? Read(string name, object target);
}
public interface IObjectDescriptor
{
object? Value { get; }
Type Type { get; }
Type StaticType { get; }
ScalarStyle ScalarStyle { get; }
}
public static class ObjectDescriptorExtensions
{
public static object NonNullValue(this IObjectDescriptor objectDescriptor)
{
return objectDescriptor.Value ?? throw new InvalidOperationException("Attempted to use a IObjectDescriptor of type '" + objectDescriptor.Type.FullName + "' whose Value is null at a point whete it is invalid to do so. This may indicate a bug in YamlDotNet.");
}
}
public interface IObjectFactory
{
object Create(Type type);
object? CreatePrimitive(Type type);
bool GetDictionary(IObjectDescriptor descriptor, out IDictionary? dictionary, out Type[]? genericArguments);
Type GetValueType(Type type);
void ExecuteOnDeserializing(object value);
void ExecuteOnDeserialized(object value);
void ExecuteOnSerializing(object value);
void ExecuteOnSerialized(object value);
}
public interface IObjectGraphTraversalStrategy
{
void Traverse<TContext>(IObjectDescriptor graph, IObjectGraphVisitor<TContext> visitor, TContext context);
}
public interface IObjectGraphVisitor<TContext>
{
bool Enter(IObjectDescriptor value, TContext context);
bool EnterMapping(IObjectDescriptor key, IObjectDescriptor value, TContext context);
bool EnterMapping(IPropertyDescriptor key, IObjectDescriptor value, TContext context);
void VisitScalar(IObjectDescriptor scalar, TContext context);
void VisitMappingStart(IObjectDescriptor mapping, Type keyType, Type valueType, TContext context);
void VisitMappingEnd(IObjectDescriptor mapping, TContext context);
void VisitSequenceStart(IObjectDescriptor sequence, Type elementType, TContext context);
void VisitSequenceEnd(IObjectDescriptor sequence, TContext context);
}
public interface IPropertyDescriptor
{
string Name { get; }
bool CanWrite { get; }
Type Type { get; }
Type? TypeOverride { get; set; }
int Order { get; set; }
ScalarStyle ScalarStyle { get; set; }
T? GetCustomAttribute<T>() where T : Attribute;
IObjectDescriptor Read(object target);
void Write(object target, object? value);
}
public interface IRegistrationLocationSelectionSyntax<TBaseRegistrationType>
{
void InsteadOf<TRegistrationType>() where TRegistrationType : TBaseRegistrationType;
void Before<TRegistrationType>() where TRegistrationType : TBaseRegistrationType;
void After<TRegistrationType>() where TRegistrationType : TBaseRegistrationType;
void OnTop();
void OnBottom();
}
public interface ITrackingRegistrationLocationSelectionSyntax<TBaseRegistrationType>
{
void InsteadOf<TRegistrationType>() where TRegistrationType : TBaseRegistrationType;
}
public interface ISerializer
{
string Serialize(object? graph);
string Serialize(object? graph, Type type);
void Serialize(TextWriter writer, object? graph);
void Serialize(TextWriter writer, object? graph, Type type);
void Serialize(IEmitter emitter, object? graph);
void Serialize(IEmitter emitter, object? graph, Type type);
}
public interface ITypeInspector
{
IEnumerable<IPropertyDescriptor> GetProperties(Type type, object? container);
IPropertyDescriptor GetProperty(Type type, object? container, string name, [MaybeNullWhen(true)] bool ignoreUnmatched);
}
public interface ITypeResolver
{
Type Resolve(Type staticType, object? actualValue);
}
public interface IValueDeserializer
{
object? DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer);
}
public interface IValuePromise
{
event Action<object?> ValueAvailable;
}
public interface IValueSerializer
{
void SerializeValue(IEmitter emitter, object? value, Type? type);
}
public interface IYamlConvertible
{
void Read(IParser parser, Type expectedType, ObjectDeserializer nestedObjectDeserializer);
void Write(IEmitter emitter, ObjectSerializer nestedObjectSerializer);
}
public delegate object? ObjectDeserializer(Type type);
public delegate void ObjectSerializer(object? value, Type? type = null);
[Obsolete("Please use IYamlConvertible instead")]
public interface IYamlSerializable
{
void ReadYaml(IParser parser);
void WriteYaml(IEmitter emitter);
}
public interface IYamlTypeConverter
{
bool Accepts(Type type);
object? ReadYaml(IParser parser, Type type);
void WriteYaml(IEmitter emitter, object? value, Type type);
}
internal sealed class LazyComponentRegistrationList<TArgument, TComponent> : IEnumerable<Func<TArgument, TComponent>>, IEnumerable
{
public sealed class LazyComponentRegistration
{
public readonly Type ComponentType;
public readonly Func<TArgument, TComponent> Factory;
public LazyComponentRegistration(Type componentType, Func<TArgument, TComponent> factory)
{
ComponentType = componentType;
Factory = factory;
}
}
public sealed class TrackingLazyComponentRegistration
{
public readonly Type ComponentType;
public readonly Func<TComponent, TArgument, TComponent> Factory;
public TrackingLazyComponentRegistration(Type componentType, Func<TComponent, TArgument, TComponent> factory)
{
ComponentType = componentType;
Factory = factory;
}
}
private class RegistrationLocationSelector : IRegistrationLocationSelectionSyntax<TComponent>
{
private readonly LazyComponentRegistrationList<TArgument, TComponent> registrations;
private readonly LazyComponentRegistration newRegistration;
public RegistrationLocationSelector(LazyComponentRegistrationList<TArgument, TComponent> registrations, LazyComponentRegistration newRegistration)
{
this.registrations = registrations;
this.newRegistration = newRegistration;
}
void IRegistrationLocationSelectionSyntax<TComponent>.InsteadOf<TRegistrationType>()
{
if ((object)newRegistration.ComponentType != typeof(TRegistrationType))
{
registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType);
}
int index = registrations.EnsureRegistrationExists<TRegistrationType>();
registrations.entries[index] = newRegistration;
}
void IRegistrationLocationSelectionSyntax<TComponent>.After<TRegistrationType>()
{
registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType);
int num = registrations.EnsureRegistrationExists<TRegistrationType>();
registrations.entries.Insert(num + 1, newRegistration);
}
void IRegistrationLocationSelectionSyntax<TComponent>.Before<TRegistrationType>()
{
registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType);
int index = registrations.EnsureRegistrationExists<TRegistrationType>();
registrations.entries.Insert(index, newRegistration);
}
void IRegistrationLocationSelectionSyntax<TComponent>.OnBottom()
{
registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType);
registrations.entries.Add(newRegistration);
}
void IRegistrationLocationSelectionSyntax<TComponent>.OnTop()
{
registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType);
registrations.entries.Insert(0, newRegistration);
}
}
private class TrackingRegistrationLocationSelector : ITrackingRegistrationLocationSelectionSyntax<TComponent>
{
private readonly LazyComponentRegistrationList<TArgument, TComponent> registrations;
private readonly TrackingLazyComponentRegistration newRegistration;
public TrackingRegistrationLocationSelector(LazyComponentRegistrationList<TArgument, TComponent> registrations, TrackingLazyComponentRegistration newRegistration)
{
this.registrations = registrations;
this.newRegistration = newRegistration;
}
void ITrackingRegistrationLocationSelectionSyntax<TComponent>.InsteadOf<TRegistrationType>()
{
if ((object)newRegistration.ComponentType != typeof(TRegistrationType))
{
registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType);
}
int index = registrations.EnsureRegistrationExists<TRegistrationType>();
Func<TArgument, TComponent> innerComponentFactory = registrations.entries[index].Factory;
registrations.entries[index] = new LazyComponentRegistration(newRegistration.ComponentType, (TArgument arg) => newRegistration.Factory(innerComponentFactory(arg), arg));
}
}
private readonly List<LazyComponentRegistration> entries = new List<LazyComponentRegistration>();
public int Count => entries.Count;
public IEnumerable<Func<TArgument, TComponent>> InReverseOrder
{
get
{
int i = entries.Count - 1;
while (i >= 0)
{
yield return entries[i].Factory;
int num = i - 1;
i = num;
}
}
}
public LazyComponentRegistrationList<TArgument, TComponent> Clone()
{
LazyComponentRegistrationList<TArgument, TComponent> lazyComponentRegistrationList = new LazyComponentRegistrationList<TArgument, TComponent>();
foreach (LazyComponentRegistration entry in entries)
{
lazyComponentRegistrationList.entries.Add(entry);
}
return lazyComponentRegistrationList;
}
public void Clear()
{
entries.Clear();
}
public void Add(Type componentType, Func<TArgument, TComponent> factory)
{
entries.Add(new LazyComponentRegistration(componentType, factory));
}
public void Remove(Type componentType)
{
for (int i = 0; i < entries.Count; i++)
{
if ((object)entries[i].ComponentType == componentType)
{
entries.RemoveAt(i);
return;
}
}
throw new KeyNotFoundException("A component registration of type '" + componentType.FullName + "' was not found.");
}
public IRegistrationLocationSelectionSyntax<TComponent> CreateRegistrationLocationSelector(Type componentType, Func<TArgument, TComponent> factory)
{
return new RegistrationLocationSelector(this, new LazyComponentRegistration(componentType, factory));
}
public ITrackingRegistrationLocationSelectionSyntax<TComponent> CreateTrackingRegistrationLocationSelector(Type componentType, Func<TComponent, TArgument, TComponent> factory)
{
return new TrackingRegistrationLocationSelector(this, new TrackingLazyComponentRegistration(componentType, factory));
}
public IEnumerator<Func<TArgument, TComponent>> GetEnumerator()
{
return entries.Select((LazyComponentRegistration e) => e.Factory).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
private int IndexOfRegistration(Type registrationType)
{
for (int i = 0; i < entries.Count; i++)
{
if ((object)registrationType == entries[i].ComponentType)
{
return i;
}
}
return -1;
}
private void EnsureNoDuplicateRegistrationType(Type componentType)
{
if (IndexOfRegistration(componentType) != -1)
{
throw new InvalidOperationException("A component of type '" + componentType.FullName + "' has already been registered.");
}
}
private int EnsureRegistrationExists<TRegistrationType>()
{
int num = IndexOfRegistration(typeof(TRegistrationType));
if (num == -1)
{
throw new InvalidOperationException("A component of type '" + typeof(TRegistrationType).FullName + "' has not been registered.");
}
return num;
}
}
internal static class LazyComponentRegistrationListExtensions
{
public static TComponent BuildComponentChain<TComponent>(this LazyComponentRegistrationList<TComponent, TComponent> registrations, TComponent innerComponent)
{
return registrations.InReverseOrder.Aggregate(innerComponent, (TComponent inner, Func<TComponent, TComponent> factory) => factory(inner));
}
public static TComponent BuildComponentChain<TArgument, TComponent>(this LazyComponentRegistrationList<TArgument, TComponent> registrations, TComponent innerComponent, Func<TComponent, TArgument> argumentBuilder)
{
Func<TComponent, TArgument> argumentBuilder2 = argumentBuilder;
return registrations.InReverseOrder.Aggregate(innerComponent, (TComponent inner, Func<TArgument, TComponent> factory) => factory(argumentBuilder2(inner)));
}
public static List<TComponent> BuildComponentList<TComponent>(this LazyComponentRegistrationList<Nothing, TComponent> registrations)
{
return registrations.Select((Func<Nothing, TComponent> factory) => factory(default(Nothing))).ToList();
}
public static List<TComponent> BuildComponentList<TArgument, TComponent>(this LazyComponentRegistrationList<TArgument, TComponent> registrations, TArgument argument)
{
TArgument argument2 = argument;
return registrations.Select((Func<TArgument, TComponent> factory) => factory(argument2)).ToList();
}
}
[StructLayout(LayoutKind.Sequential, Size = 1)]
public struct Nothing
{
}
public sealed class ObjectDescriptor : IObjectDescriptor
{
public object? Value { get; private set; }
public Type Type { get; private set; }
public Type StaticType { get; private set; }
public ScalarStyle ScalarStyle { get; private set; }
public ObjectDescriptor(object? value, Type type, Type staticType)
: this(value, type, staticType, ScalarStyle.Any)
{
}
public ObjectDescriptor(object? value, Type type, Type staticType, ScalarStyle scalarStyle)
{
Value = value;
Type = type ?? throw new ArgumentNullException("type");
StaticType = staticType ?? throw new ArgumentNullException("staticType");
ScalarStyle = scalarStyle;
}
}
public delegate IObjectGraphTraversalStrategy ObjectGraphTraversalStrategyFactory(ITypeInspector typeInspector, ITypeResolver typeResolver, IEnumerable<IYamlTypeConverter> typeConverters, int maximumRecursion);
public sealed class PropertyDescriptor : IPropertyDescriptor
{
private readonly IPropertyDescriptor baseDescriptor;
public string Name { get; set; }
public Type Type => baseDescriptor.Type;
public Type? TypeOverride
{
get
{
return baseDescriptor.TypeOverride;
}
set
{
baseDescriptor.TypeOverride = value;
}
}
public int Order { get; set; }
public ScalarStyle ScalarStyle
{
get
{
return baseDescriptor.ScalarStyle;
}
set
{
baseDescriptor.ScalarStyle = value;
}
}
public bool CanWrite => baseDescriptor.CanWrite;
public PropertyDescriptor(IPropertyDescriptor baseDescriptor)
{
this.baseDescriptor = baseDescriptor;
Name = baseDescriptor.Name;
}
public void Write(object target, object? value)
{
baseDescriptor.Write(target, value);
}
public T? GetCustomAttribute<T>() where T : Attribute
{
return baseDescriptor.GetCustomAttribute<T>();
}
public IObjectDescriptor Read(object target)
{
return baseDescriptor.Read(target);
}
}
public sealed class Serializer : ISerializer
{
private readonly IValueSerializer valueSerializer;
private readonly EmitterSettings emitterSettings;
public Serializer()
: this(new SerializerBuilder().BuildValueSerializer(), EmitterSettings.Default)
{
}
private Serializer(IValueSerializer valueSerializer, EmitterSettings emitterSettings)
{
this.valueSerializer = valueSerializer ?? throw new ArgumentNullException("valueSerializer");
this.emitterSettings = emitterSettings ?? throw new ArgumentNullException("emitterSettings");
}
public static Serializer FromValueSerializer(IValueSerializer valueSerializer, EmitterSettings emitterSettings)
{
return new Serializer(valueSerializer, emitterSettings);
}
public string Serialize(object? graph)
{
using StringWriter stringWriter = new StringWriter();
Serialize(stringWriter, graph);
return stringWriter.ToString();
}
public string Serialize(object? graph, Type type)
{
using StringWriter stringWriter = new StringWriter();
Serialize(stringWriter, graph, type);
return stringWriter.ToString();
}
public void Serialize(TextWriter writer, object? graph)
{
Serialize(new Emitter(writer, emitterSettings), graph);
}
public void Serialize(TextWriter writer, object? graph, Type type)
{
Serialize(new Emitter(writer, emitterSettings), graph, type);
}
public void Serialize(IEmitter emitter, object? graph)
{
if (emitter == null)
{
throw new ArgumentNullException("emitter");
}
EmitDocument(emitter, graph, null);
}
public void Serialize(IEmitter emitter, object? graph, Type type)
{
if (emitter == null)
{
throw new ArgumentNullException("emitter");
}
if ((object)type == null)
{
throw new ArgumentNullException("type");
}
EmitDocument(emitter, graph, type);
}
private void EmitDocument(IEmitter emitter, object? graph, Type? type)
{
emitter.Emit(new YamlDotNet.Core.Events.StreamStart());
emitter.Emit(new YamlDotNet.Core.Events.DocumentStart());
valueSerializer.SerializeValue(emitter, graph, type);
emitter.Emit(new YamlDotNet.Core.Events.DocumentEnd(isImplicit: true));
emitter.Emit(new YamlDotNet.Core.Events.StreamEnd());
}
}
public sealed class SerializerBuilder : BuilderSkeleton<SerializerBuilder>
{
private class ValueSerializer : IValueSerializer
{
private readonly IObjectGraphTraversalStrategy traversalStrategy;
private readonly IEventEmitter eventEmitter;
private readonly IEnumerable<IYamlTypeConverter> typeConverters;
private readonly LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories;
private readonly LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories;
public ValueSerializer(IObjectGraphTraversalStrategy traversalStrategy, IEventEmitter eventEmitter, IEnumerable<IYamlTypeConverter> typeConverters, LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories, LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories)
{
this.traversalStrategy = traversalStrategy;
this.eventEmitter = eventEmitter;
this.typeConverters = typeConverters;
this.preProcessingPhaseObjectGraphVisitorFactories = preProcessingPhaseObjectGraphVisitorFactories;
this.emissionPhaseObjectGraphVisitorFactories = emissionPhaseObjectGraphVisitorFactories;
}
public void SerializeValue(IEmitter emitter, object? value, Type? type)
{
IEmitter emitter2 = emitter;
Type type2 = type ?? ((value != null) ? value.GetType() : typeof(object));
Type staticType = type ?? typeof(object);
ObjectDescriptor graph = new ObjectDescriptor(value, type2, staticType);
List<IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitors = preProcessingPhaseObjectGraphVisitorFactories.BuildComponentList(typeConverters);
foreach (IObjectGraphVisitor<Nothing> item in preProcessingPhaseObjectGraphVisitors)
{
traversalStrategy.Traverse(graph, item, default(Nothing));
}
IObjectGraphVisitor<IEmitter> visitor = emissionPhaseObjectGraphVisitorFactories.BuildComponentChain<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>>(new EmittingObjectGraphVisitor(eventEmitter), (IObjectGraphVisitor<IEmitter> inner) => new EmissionPhaseObjectGraphVisitorArgs(inner, eventEmitter, preProcessingPhaseObjectGraphVisitors, typeConverters, NestedObjectSerializer));
traversalStrategy.Traverse(graph, visitor, emitter2);
void NestedObjectSerializer(object? v, Type? t)
{
SerializeValue(emitter2, v, t);
}
}
}
private ObjectGraphTraversalStrategyFactory objectGraphTraversalStrategyFactory;
private readonly LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories;
private readonly LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories;
private readonly LazyComponentRegistrationList<IEventEmitter, IEventEmitter> eventEmitterFactories;
private readonly IDictionary<Type, TagName> tagMappings = new Dictionary<Type, TagName>();
private readonly IObjectFactory objectFactory;
private int maximumRecursion = 50;
private EmitterSettings emitterSettings = EmitterSettings.Default;
private DefaultValuesHandling defaultValuesHandlingConfiguration;
private ScalarStyle defaultScalarStyle;
private bool quoteNecessaryStrings;
private bool quoteYaml1_1Strings;
protected override SerializerBuilder Self => this;
public SerializerBuilder()
: base((ITypeResolver)new DynamicTypeResolver())
{
typeInspectorFactories.Add(typeof(CachedTypeInspector), (ITypeInspector inner) => new CachedTypeInspector(inner));
typeInspectorFactories.Add(typeof(NamingConventionTypeInspector), (ITypeInspector inner) => (!(namingConvention is NullNamingConvention)) ? new NamingConventionTypeInspector(inner, namingConvention) : inner);
typeInspectorFactories.Add(typeof(YamlAttributesTypeInspector), (ITypeInspector inner) => new YamlAttributesTypeInspector(inner));
typeInspectorFactories.Add(typeof(YamlAttributeOverridesInspector), (ITypeInspector inner) => (overrides == null) ? inner : new YamlAttributeOverridesInspector(inner, overrides.Clone()));
preProcessingPhaseObjectGraphVisitorFactories = new LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> {
{
typeof(AnchorAssigner),
(IEnumerable<IYamlTypeConverter> typeConverters) => new AnchorAssigner(typeConverters)
} };
emissionPhaseObjectGraphVisitorFactories = new LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>>
{
{
typeof(CustomSerializationObjectGraphVisitor),
(EmissionPhaseObjectGraphVisitorArgs args) => new CustomSerializationObjectGraphVisitor(args.InnerVisitor, args.TypeConverters, args.NestedObjectSerializer)
},
{
typeof(AnchorAssigningObjectGraphVisitor),
(EmissionPhaseObjectGraphVisitorArgs args) => new AnchorAssigningObjectGraphVisitor(args.InnerVisitor, args.EventEmitter, args.GetPreProcessingPhaseObjectGraphVisitor<AnchorAssigner>())
},
{
typeof(DefaultValuesObjectGraphVisitor),
(EmissionPhaseObjectGraphVisitorArgs args) => new DefaultValuesObjectGraphVisitor(defaultValuesHandlingConfiguration, args.InnerVisitor, new DefaultObjectFactory())
},
{
typeof(CommentsObjectGraphVisitor),
(EmissionPhaseObjectGraphVisitorArgs args) => new CommentsObjectGraphVisitor(args.InnerVisitor)
}
};
eventEmitterFactories = new LazyComponentRegistrationList<IEventEmitter, IEventEmitter> {
{
typeof(TypeAssigningEventEmitter),
(IEventEmitter inner) => new TypeAssigningEventEmitter(inner, requireTagWhenStaticAndActualTypesAreDifferent: false, tagMappings, quoteNecessaryStrings, quoteYaml1_1Strings, defaultScalarStyle, yamlFormatter)
} };
objectFactory = new DefaultObjectFactory();
objectGraphTraversalStrategyFactory = (ITypeInspector typeInspector, ITypeResolver typeResolver, IEnumerable<IYamlTypeConverter> typeConverters, int maximumRecursion) => new FullObjectGraphTraversalStrategy(typeInspector, typeResolver, maximumRecursion, namingConvention, objectFactory);
}
public SerializerBuilder WithQuotingNecessaryStrings(bool quoteYaml1_1Strings = false)
{
quoteNecessaryStrings = true;
this.quoteYaml1_1Strings = quoteYaml1_1Strings;
return this;
}
public SerializerBuilder WithDefaultScalarStyle(ScalarStyle style)
{
defaultScalarStyle = style;
return this;
}
public SerializerBuilder WithMaximumRecursion(int maximumRecursion)
{
if (maximumRecursion <= 0)
{
throw new ArgumentOutOfRangeException("maximumRecursion", $"The maximum recursion specified ({maximumRecursion}) is invalid. It should be a positive integer.");
}
this.maximumRecursion = maximumRecursion;
return this;
}
public SerializerBuilder WithEventEmitter<TEventEmitter>(Func<IEventEmitter, TEventEmitter> eventEmitterFactory) where TEventEmitter : IEventEmitter
{
return WithEventEmitter(eventEmitterFactory, delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> w)
{
w.OnTop();
});
}
public SerializerBuilder WithEventEmitter<TEventEmitter>(Func<IEventEmitter, TEventEmitter> eventEmitterFactory, Action<IRegistrationLocationSelectionSyntax<IEventEmitter>> where) where TEventEmitter : IEventEmitter
{
Func<IEventEmitter, TEventEmitter> eventEmitterFactory2 = eventEmitterFactory;
if (eventEmitterFactory2 == null)
{
throw new ArgumentNullException("eventEmitterFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(eventEmitterFactories.CreateRegistrationLocationSelector(typeof(TEventEmitter), (IEventEmitter inner) => eventEmitterFactory2(inner)));
return Self;
}
public SerializerBuilder WithEventEmitter<TEventEmitter>(WrapperFactory<IEventEmitter, IEventEmitter, TEventEmitter> eventEmitterFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IEventEmitter>> where) where TEventEmitter : IEventEmitter
{
WrapperFactory<IEventEmitter, IEventEmitter, TEventEmitter> eventEmitterFactory2 = eventEmitterFactory;
if (eventEmitterFactory2 == null)
{
throw new ArgumentNullException("eventEmitterFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(eventEmitterFactories.CreateTrackingRegistrationLocationSelector(typeof(TEventEmitter), (IEventEmitter wrapped, IEventEmitter inner) => eventEmitterFactory2(wrapped, inner)));
return Self;
}
public SerializerBuilder WithoutEventEmitter<TEventEmitter>() where TEventEmitter : IEventEmitter
{
return WithoutEventEmitter(typeof(TEventEmitter));
}
public SerializerBuilder WithoutEventEmitter(Type eventEmitterType)
{
if ((object)eventEmitterType == null)
{
throw new ArgumentNullException("eventEmitterType");
}
eventEmitterFactories.Remove(eventEmitterType);
return this;
}
public override SerializerBuilder WithTagMapping(TagName tag, Type type)
{
if (tag.IsEmpty)
{
throw new ArgumentException("Non-specific tags cannot be maped");
}
if ((object)type == null)
{
throw new ArgumentNullException("type");
}
if (tagMappings.TryGetValue(type, out var value))
{
throw new ArgumentException($"Type already has a registered tag '{value}' for type '{type.FullName}'", "type");
}
tagMappings.Add(type, tag);
return this;
}
public SerializerBuilder WithoutTagMapping(Type type)
{
if ((object)type == null)
{
throw new ArgumentNullException("type");
}
if (!tagMappings.Remove(type))
{
throw new KeyNotFoundException("Tag for type '" + type.FullName + "' is not registered");
}
return this;
}
public SerializerBuilder EnsureRoundtrip()
{
objectGraphTraversalStrategyFactory = (ITypeInspector typeInspector, ITypeResolver typeResolver, IEnumerable<IYamlTypeConverter> typeConverters, int maximumRecursion) => new RoundtripObjectGraphTraversalStrategy(typeConverters, typeInspector, typeResolver, maximumRecursion, namingConvention, settings, objectFactory);
WithEventEmitter((IEventEmitter inner) => new TypeAssigningEventEmitter(inner, requireTagWhenStaticAndActualTypesAreDifferent: true, tagMappings, quoteNecessaryStrings, quoteYaml1_1Strings, defaultScalarStyle, yamlFormatter), delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> loc)
{
loc.InsteadOf<TypeAssigningEventEmitter>();
});
return WithTypeInspector((ITypeInspector inner) => new ReadableAndWritablePropertiesTypeInspector(inner), delegate(IRegistrationLocationSelectionSyntax<ITypeInspector> loc)
{
loc.OnBottom();
});
}
public SerializerBuilder DisableAliases()
{
preProcessingPhaseObjectGraphVisitorFactories.Remove(typeof(AnchorAssigner));
emissionPhaseObjectGraphVisitorFactories.Remove(typeof(AnchorAssigningObjectGraphVisitor));
return this;
}
[Obsolete("The default behavior is now to always emit default values, thefore calling this method has no effect. This behavior is now controlled by ConfigureDefaultValuesHandling.", true)]
public SerializerBuilder EmitDefaults()
{
return ConfigureDefaultValuesHandling(DefaultValuesHandling.Preserve);
}
public SerializerBuilder ConfigureDefaultValuesHandling(DefaultValuesHandling configuration)
{
defaultValuesHandlingConfiguration = configuration;
return this;
}
public SerializerBuilder JsonCompatible()
{
emitterSettings = emitterSettings.WithMaxSimpleKeyLength(int.MaxValue).WithoutAnchorName();
return WithTypeConverter(new YamlDotNet.Serialization.Converters.GuidConverter(jsonCompatible: true), delegate(IRegistrationLocationSelectionSyntax<IYamlTypeConverter> w)
{
w.InsteadOf<YamlDotNet.Serialization.Converters.GuidConverter>();
}).WithTypeConverter(new YamlDotNet.Serialization.Converters.DateTimeConverter(DateTimeKind.Utc, null, true)).WithEventEmitter((IEventEmitter inner) => new JsonEventEmitter(inner, yamlFormatter), delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> loc)
{
loc.InsteadOf<TypeAssigningEventEmitter>();
});
}
public SerializerBuilder WithNewLine(string newLine)
{
emitterSettings = emitterSettings.WithNewLine(newLine);
return this;
}
public SerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(TObjectGraphVisitor objectGraphVisitor) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing>
{
return WithPreProcessingPhaseObjectGraphVisitor(objectGraphVisitor, delegate(IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>> w)
{
w.OnTop();
});
}
public SerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(TObjectGraphVisitor objectGraphVisitor, Action<IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing>
{
TObjectGraphVisitor objectGraphVisitor2 = objectGraphVisitor;
if (objectGraphVisitor2 == null)
{
throw new ArgumentNullException("objectGraphVisitor");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(preProcessingPhaseObjectGraphVisitorFactories.CreateRegistrationLocationSelector(typeof(TObjectGraphVisitor), (IEnumerable<IYamlTypeConverter> _) => objectGraphVisitor2));
return this;
}
public SerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(WrapperFactory<IObjectGraphVisitor<Nothing>, TObjectGraphVisitor> objectGraphVisitorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing>
{
WrapperFactory<IObjectGraphVisitor<Nothing>, TObjectGraphVisitor> objectGraphVisitorFactory2 = objectGraphVisitorFactory;
if (objectGraphVisitorFactory2 == null)
{
throw new ArgumentNullException("objectGraphVisitorFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(preProcessingPhaseObjectGraphVisitorFactories.CreateTrackingRegistrationLocationSelector(typeof(TObjectGraphVisitor), (IObjectGraphVisitor<Nothing> wrapped, IEnumerable<IYamlTypeConverter> _) => objectGraphVisitorFactory2(wrapped)));
return this;
}
public SerializerBuilder WithoutPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>() where TObjectGraphVisitor : IObjectGraphVisitor<Nothing>
{
return WithoutPreProcessingPhaseObjectGraphVisitor(typeof(TObjectGraphVisitor));
}
public SerializerBuilder WithoutPreProcessingPhaseObjectGraphVisitor(Type objectGraphVisitorType)
{
if ((object)objectGraphVisitorType == null)
{
throw new ArgumentNullException("objectGraphVisitorType");
}
preProcessingPhaseObjectGraphVisitorFactories.Remove(objectGraphVisitorType);
return this;
}
public SerializerBuilder WithObjectGraphTraversalStrategyFactory(ObjectGraphTraversalStrategyFactory objectGraphTraversalStrategyFactory)
{
this.objectGraphTraversalStrategyFactory = objectGraphTraversalStrategyFactory;
return this;
}
public SerializerBuilder WithEmissionPhaseObjectGraphVisitor<TObjectGraphVisitor>(Func<EmissionPhaseObjectGraphVisitorArgs, TObjectGraphVisitor> objectGraphVisitorFactory) where TObjectGraphVisitor : IObjectGraphVisitor<IEmitter>
{
return WithEmissionPhaseObjectGraphVisitor(objectGraphVisitorFactory, delegate(IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<IEmitter>> w)
{
w.OnTop();
});
}
public SerializerBuilder WithEmissionPhaseObjectGraphVisitor<TObjectGraphVisitor>(Func<EmissionPhaseObjectGraphVisitorArgs, TObjectGraphVisitor> objectGraphVisitorFactory, Action<IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<IEmitter>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<IEmitter>
{
Func<EmissionPhaseObjectGraphVisitorArgs, TObjectGraphVisitor> objectGraphVisitorFactory2 = objectGraphVisitorFactory;
if (objectGraphVisitorFactory2 == null)
{
throw new ArgumentNullException("objectGraphVisitorFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(emissionPhaseObjectGraphVisitorFactories.CreateRegistrationLocationSelector(typeof(TObjectGraphVisitor), (EmissionPhaseObjectGraphVisitorArgs args) => objectGraphVisitorFactory2(args)));
return this;
}
public SerializerBuilder WithEmissionPhaseObjectGraphVisitor<TObjectGraphVisitor>(WrapperFactory<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>, TObjectGraphVisitor> objectGraphVisitorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IObjectGraphVisitor<IEmitter>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<IEmitter>
{
WrapperFactory<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>, TObjectGraphVisitor> objectGraphVisitorFactory2 = objectGraphVisitorFactory;
if (objectGraphVisitorFactory2 == null)
{
throw new ArgumentNullException("objectGraphVisitorFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(emissionPhaseObjectGraphVisitorFactories.CreateTrackingRegistrationLocationSelector(typeof(TObjectGraphVisitor), (IObjectGraphVisitor<IEmitter> wrapped, EmissionPhaseObjectGraphVisitorArgs args) => objectGraphVisitorFactory2(wrapped, args)));
return this;
}
public SerializerBuilder WithoutEmissionPhaseObjectGraphVisitor<TObjectGraphVisitor>() where TObjectGraphVisitor : IObjectGraphVisitor<IEmitter>
{
return WithoutEmissionPhaseObjectGraphVisitor(typeof(TObjectGraphVisitor));
}
public SerializerBuilder WithoutEmissionPhaseObjectGraphVisitor(Type objectGraphVisitorType)
{
if ((object)objectGraphVisitorType == null)
{
throw new ArgumentNullException("objectGraphVisitorType");
}
emissionPhaseObjectGraphVisitorFactories.Remove(objectGraphVisitorType);
return this;
}
public SerializerBuilder WithIndentedSequences()
{
emitterSettings = emitterSettings.WithIndentedSequences();
return this;
}
public ISerializer Build()
{
return Serializer.FromValueSerializer(BuildValueSerializer(), emitterSettings);
}
public IValueSerializer BuildValueSerializer()
{
IEnumerable<IYamlTypeConverter> typeConverters = BuildTypeConverters();
ITypeInspector typeInspector = BuildTypeInspector();
IObjectGraphTraversalStrategy traversalStrategy = objectGraphTraversalStrategyFactory(typeInspector, typeResolver, typeConverters, maximumRecursion);
IEventEmitter eventEmitter = eventEmitterFactories.BuildComponentChain(new WriterEventEmitter());
return new ValueSerializer(traversalStrategy, eventEmitter, typeConverters, preProcessingPhaseObjectGraphVisitorFactories.Clone(), emissionPhaseObjectGraphVisitorFactories.Clone());
}
internal ITypeInspector BuildTypeInspector()
{
ITypeInspector typeInspector = new ReadablePropertiesTypeInspector(typeResolver, includeNonPublicProperties);
if (!ignoreFields)
{
typeInspector = new CompositeTypeInspector(new ReadableFieldsTypeInspector(typeResolver), typeInspector);
}
return typeInspectorFactories.BuildComponentChain(typeInspector);
}
}
public class Settings
{
public bool AllowPrivateConstructors { get; set; }
}
public abstract class StaticBuilderSkeleton<TBuilder> where TBuilder : StaticBuilderSkeleton<TBuilder>
{
internal INamingConvention namingConvention = NullNamingConvention.Instance;
internal ITypeResolver typeResolver;
internal readonly LazyComponentRegistrationList<Nothing, IYamlTypeConverter> typeConverterFactories;
internal readonly LazyComponentRegistrationList<ITypeInspector, ITypeInspector> typeInspectorFactories;
internal bool includeNonPublicProperties;
internal Settings settings;
internal YamlFormatter yamlFormatter = YamlFormatter.Default;
protected abstract TBuilder Self { get; }
internal StaticBuilderSkeleton(ITypeResolver typeResolver)
{
typeConverterFactories = new LazyComponentRegistrationList<Nothing, IYamlTypeConverter> {
{
typeof(YamlDotNet.Serialization.Converters.GuidConverter),
(Nothing _) => new YamlDotNet.Serialization.Converters.GuidConverter(jsonCompatible: false)
} };
typeInspectorFactories = new LazyComponentRegistrationList<ITypeInspector, ITypeInspector>();
this.typeResolver = typeResolver ?? throw new ArgumentNullException("typeResolver");
settings = new Settings();
}
public TBuilder WithNamingConvention(INamingConvention namingConvention)
{
this.namingConvention = namingConvention ?? throw new ArgumentNullException("namingConvention");
return Self;
}
public TBuilder WithTypeResolver(ITypeResolver typeResolver)
{
this.typeResolver = typeResolver ?? throw new ArgumentNullException("typeResolver");
return Self;
}
public abstract TBuilder WithTagMapping(TagName tag, Type type);
public TBuilder WithTypeConverter(IYamlTypeConverter typeConverter)
{
return WithTypeConverter(typeConverter, delegate(IRegistrationLocationSelectionSyntax<IYamlTypeConverter> w)
{
w.OnTop();
});
}
public TBuilder WithTypeConverter(IYamlTypeConverter typeConverter, Action<IRegistrationLocationSelectionSyntax<IYamlTypeConverter>> where)
{
IYamlTypeConverter typeConverter2 = typeConverter;
if (typeConverter2 == null)
{
throw new ArgumentNullException("typeConverter");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(typeConverterFactories.CreateRegistrationLocationSelector(typeConverter2.GetType(), (Nothing _) => typeConverter2));
return Self;
}
public TBuilder WithTypeConverter<TYamlTypeConverter>(WrapperFactory<IYamlTypeConverter, IYamlTypeConverter> typeConverterFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IYamlTypeConverter>> where) where TYamlTypeConverter : IYamlTypeConverter
{
WrapperFactory<IYamlTypeConverter, IYamlTypeConverter> typeConverterFactory2 = typeConverterFactory;
if (typeConverterFactory2 == null)
{
throw new ArgumentNullException("typeConverterFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(typeConverterFactories.CreateTrackingRegistrationLocationSelector(typeof(TYamlTypeConverter), (IYamlTypeConverter wrapped, Nothing _) => typeConverterFactory2(wrapped)));
return Self;
}
public TBuilder WithoutTypeConverter<TYamlTypeConverter>() where TYamlTypeConverter : IYamlTypeConverter
{
return WithoutTypeConverter(typeof(TYamlTypeConverter));
}
public TBuilder WithoutTypeConverter(Type converterType)
{
if ((object)converterType == null)
{
throw new ArgumentNullException("converterType");
}
typeConverterFactories.Remove(converterType);
return Self;
}
public TBuilder WithTypeInspector<TTypeInspector>(Func<ITypeInspector, TTypeInspector> typeInspectorFactory) where TTypeInspector : ITypeInspector
{
return WithTypeInspector(typeInspectorFactory, delegate(IRegistrationLocationSelectionSyntax<ITypeInspector> w)
{
w.OnTop();
});
}
public TBuilder WithTypeInspector<TTypeInspector>(Func<ITypeInspector, TTypeInspector> typeInspectorFactory, Action<IRegistrationLocationSelectionSyntax<ITypeInspector>> where) where TTypeInspector : ITypeInspector
{
Func<ITypeInspector, TTypeInspector> typeInspectorFactory2 = typeInspectorFactory;
if (typeInspectorFactory2 == null)
{
throw new ArgumentNullException("typeInspectorFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(typeInspectorFactories.CreateRegistrationLocationSelector(typeof(TTypeInspector), (ITypeInspector inner) => typeInspectorFactory2(inner)));
return Self;
}
public TBuilder WithTypeInspector<TTypeInspector>(WrapperFactory<ITypeInspector, ITypeInspector, TTypeInspector> typeInspectorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<ITypeInspector>> where) where TTypeInspector : ITypeInspector
{
WrapperFactory<ITypeInspector, ITypeInspector, TTypeInspector> typeInspectorFactory2 = typeInspectorFactory;
if (typeInspectorFactory2 == null)
{
throw new ArgumentNullException("typeInspectorFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(typeInspectorFactories.CreateTrackingRegistrationLocationSelector(typeof(TTypeInspector), (ITypeInspector wrapped, ITypeInspector inner) => typeInspectorFactory2(wrapped, inner)));
return Self;
}
public TBuilder WithoutTypeInspector<TTypeInspector>() where TTypeInspector : ITypeInspector
{
return WithoutTypeInspector(typeof(TTypeInspector));
}
public TBuilder WithoutTypeInspector(Type inspectorType)
{
if ((object)inspectorType == null)
{
throw new ArgumentNullException("inspectorType");
}
typeInspectorFactories.Remove(inspectorType);
return Self;
}
public TBuilder WithYamlFormatter(YamlFormatter formatter)
{
yamlFormatter = formatter ?? throw new ArgumentNullException("formatter");
return Self;
}
protected IEnumerable<IYamlTypeConverter> BuildTypeConverters()
{
return typeConverterFactories.BuildComponentList();
}
}
public abstract class StaticContext
{
public virtual bool IsKnownType(Type type)
{
throw new NotImplementedException();
}
public virtual ITypeResolver GetTypeResolver()
{
throw new NotImplementedException();
}
public virtual StaticObjectFactory GetFactory()
{
throw new NotImplementedException();
}
public virtual ITypeInspector GetTypeInspector()
{
throw new NotImplementedException();
}
}
public sealed class StaticDeserializerBuilder : StaticBuilderSkeleton<StaticDeserializerBuilder>
{
private readonly StaticContext context;
private readonly StaticObjectFactory factory;
private readonly LazyComponentRegistrationList<Nothing, INodeDeserializer> nodeDeserializerFactories;
private readonly LazyComponentRegistrationList<Nothing, INodeTypeResolver> nodeTypeResolverFactories;
private readonly Dictionary<TagName, Type> tagMappings;
private readonly ITypeConverter typeConverter;
private readonly Dictionary<Type, Type> typeMappings;
private bool ignoreUnmatched;
private bool duplicateKeyChecking;
private bool attemptUnknownTypeDeserialization;
protected override StaticDeserializerBuilder Self => this;
public StaticDeserializerBuilder(StaticContext context)
: base(context.GetTypeResolver())
{
this.context = context;
factory = context.GetFactory();
typeMappings = new Dictionary<Type, Type>();
tagMappings = new Dictionary<TagName, Type>
{
{
FailsafeSchema.Tags.Map,
typeof(Dictionary<object, object>)
},
{
FailsafeSchema.Tags.Str,
typeof(string)
},
{
JsonSchema.Tags.Bool,
typeof(bool)
},
{
JsonSchema.Tags.Float,
typeof(double)
},
{
JsonSchema.Tags.Int,
typeof(int)
},
{
DefaultSchema.Tags.Timestamp,
typeof(DateTime)
}
};
typeInspectorFactories.Add(typeof(CachedTypeInspector), (ITypeInspector inner) => new CachedTypeInspector(inner));
typeInspectorFactories.Add(typeof(NamingConventionTypeInspector), (ITypeInspector inner) => (!(namingConvention is NullNamingConvention)) ? new NamingConventionTypeInspector(inner, namingConvention) : inner);
typeInspectorFactories.Add(typeof(YamlAttributesTypeInspector), (ITypeInspector inner) => new YamlAttributesTypeInspector(inner));
nodeDeserializerFactories = new LazyComponentRegistrationList<Nothing, INodeDeserializer>
{
{
typeof(YamlConvertibleNodeDeserializer),
(Nothing _) => new YamlConvertibleNodeDeserializer(factory)
},
{
typeof(YamlSerializableNodeDeserializer),
(Nothing _) => new YamlSerializableNodeDeserializer(factory)
},
{
typeof(TypeConverterNodeDeserializer),
(Nothing _) => new TypeConverterNodeDeserializer(BuildTypeConverters())
},
{
typeof(NullNodeDeserializer),
(Nothing _) => new NullNodeDeserializer()
},
{
typeof(ScalarNodeDeserializer),
(Nothing _) => new ScalarNodeDeserializer(attemptUnknownTypeDeserialization, typeConverter, yamlFormatter)
},
{
typeof(StaticArrayNodeDeserializer),
(Nothing _) => new StaticArrayNodeDeserializer(factory)
},
{
typeof(StaticDictionaryNodeDeserializer),
(Nothing _) => new StaticDictionaryNodeDeserializer(factory, duplicateKeyChecking)
},
{
typeof(StaticCollectionNodeDeserializer),
(Nothing _) => new StaticCollectionNodeDeserializer(factory)
},
{
typeof(ObjectNodeDeserializer),
(Nothing _) => new ObjectNodeDeserializer(factory, BuildTypeInspector(), ignoreUnmatched, duplicateKeyChecking, typeConverter)
}
};
nodeTypeResolverFactories = new LazyComponentRegistrationList<Nothing, INodeTypeResolver>
{
{
typeof(MappingNodeTypeResolver),
(Nothing _) => new MappingNodeTypeResolver(typeMappings)
},
{
typeof(YamlConvertibleTypeResolver),
(Nothing _) => new YamlConvertibleTypeResolver()
},
{
typeof(YamlSerializableTypeResolver),
(Nothing _) => new YamlSerializableTypeResolver()
},
{
typeof(TagNodeTypeResolver),
(Nothing _) => new TagNodeTypeResolver(tagMappings)
},
{
typeof(PreventUnknownTagsNodeTypeResolver),
(Nothing _) => new PreventUnknownTagsNodeTypeResolver()
},
{
typeof(DefaultContainersNodeTypeResolver),
(Nothing _) => new DefaultContainersNodeTypeResolver()
}
};
typeConverter = new NullTypeConverter();
}
internal ITypeInspector BuildTypeInspector()
{
ITypeInspector typeInspector = context.GetTypeInspector();
return typeInspectorFactories.BuildComponentChain(typeInspector);
}
public StaticDeserializerBuilder WithAttemptingUnquotedStringTypeDeserialization()
{
attemptUnknownTypeDeserialization = true;
return this;
}
public StaticDeserializerBuilder WithNodeDeserializer(INodeDeserializer nodeDeserializer)
{
return WithNodeDeserializer(nodeDeserializer, delegate(IRegistrationLocationSelectionSyntax<INodeDeserializer> w)
{
w.OnTop();
});
}
public StaticDeserializerBuilder WithNodeDeserializer(INodeDeserializer nodeDeserializer, Action<IRegistrationLocationSelectionSyntax<INodeDeserializer>> where)
{
INodeDeserializer nodeDeserializer2 = nodeDeserializer;
if (nodeDeserializer2 == null)
{
throw new ArgumentNullException("nodeDeserializer");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(nodeDeserializerFactories.CreateRegistrationLocationSelector(nodeDeserializer2.GetType(), (Nothing _) => nodeDeserializer2));
return this;
}
public StaticDeserializerBuilder WithNodeDeserializer<TNodeDeserializer>(WrapperFactory<INodeDeserializer, TNodeDeserializer> nodeDeserializerFactory, Action<ITrackingRegistrationLocationSelectionSyntax<INodeDeserializer>> where) where TNodeDeserializer : INodeDeserializer
{
WrapperFactory<INodeDeserializer, TNodeDeserializer> nodeDeserializerFactory2 = nodeDeserializerFactory;
if (nodeDeserializerFactory2 == null)
{
throw new ArgumentNullException("nodeDeserializerFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(nodeDeserializerFactories.CreateTrackingRegistrationLocationSelector(typeof(TNodeDeserializer), (INodeDeserializer wrapped, Nothing _) => nodeDeserializerFactory2(wrapped)));
return this;
}
public StaticDeserializerBuilder WithoutNodeDeserializer<TNodeDeserializer>() where TNodeDeserializer : INodeDeserializer
{
return WithoutNodeDeserializer(typeof(TNodeDeserializer));
}
public StaticDeserializerBuilder WithoutNodeDeserializer(Type nodeDeserializerType)
{
if ((object)nodeDeserializerType == null)
{
throw new ArgumentNullException("nodeDeserializerType");
}
nodeDeserializerFactories.Remove(nodeDeserializerType);
return this;
}
public StaticDeserializerBuilder WithTypeDiscriminatingNodeDeserializer(Action<ITypeDiscriminatingNodeDeserializerOptions> configureTypeDiscriminatingNodeDeserializerOptions, int maxDepth = -1, int maxLength = -1)
{
TypeDiscriminatingNodeDeserializerOptions typeDiscriminatingNodeDeserializerOptions = new TypeDiscriminatingNodeDeserializerOptions();
configureTypeDiscriminatingNodeDeserializerOptions(typeDiscriminatingNodeDeserializerOptions);
TypeDiscriminatingNodeDeserializer nodeDeserializer = new TypeDiscriminatingNodeDeserializer(nodeDeserializerFactories.BuildComponentList(), typeDiscriminatingNodeDeserializerOptions.discriminators, maxDepth, maxLength);
return WithNodeDeserializer(nodeDeserializer, delegate(IRegistrationLocationSelectionSyntax<INodeDeserializer> s)
{
s.Before<DictionaryNodeDeserializer>();
});
}
public StaticDeserializerBuilder WithNodeTypeResolver(INodeTypeResolver nodeTypeResolver)
{
return WithNodeTypeResolver(nodeTypeResolver, delegate(IRegistrationLocationSelectionSyntax<INodeTypeResolver> w)
{
w.OnTop();
});
}
public StaticDeserializerBuilder WithNodeTypeResolver(INodeTypeResolver nodeTypeResolver, Action<IRegistrationLocationSelectionSyntax<INodeTypeResolver>> where)
{
INodeTypeResolver nodeTypeResolver2 = nodeTypeResolver;
if (nodeTypeResolver2 == null)
{
throw new ArgumentNullException("nodeTypeResolver");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(nodeTypeResolverFactories.CreateRegistrationLocationSelector(nodeTypeResolver2.GetType(), (Nothing _) => nodeTypeResolver2));
return this;
}
public StaticDeserializerBuilder WithNodeTypeResolver<TNodeTypeResolver>(WrapperFactory<INodeTypeResolver, TNodeTypeResolver> nodeTypeResolverFactory, Action<ITrackingRegistrationLocationSelectionSyntax<INodeTypeResolver>> where) where TNodeTypeResolver : INodeTypeResolver
{
WrapperFactory<INodeTypeResolver, TNodeTypeResolver> nodeTypeResolverFactory2 = nodeTypeResolverFactory;
if (nodeTypeResolverFactory2 == null)
{
throw new ArgumentNullException("nodeTypeResolverFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(nodeTypeResolverFactories.CreateTrackingRegistrationLocationSelector(typeof(TNodeTypeResolver), (INodeTypeResolver wrapped, Nothing _) => nodeTypeResolverFactory2(wrapped)));
return this;
}
public StaticDeserializerBuilder WithoutNodeTypeResolver<TNodeTypeResolver>() where TNodeTypeResolver : INodeTypeResolver
{
return WithoutNodeTypeResolver(typeof(TNodeTypeResolver));
}
public StaticDeserializerBuilder WithoutNodeTypeResolver(Type nodeTypeResolverType)
{
if ((object)nodeTypeResolverType == null)
{
throw new ArgumentNullException("nodeTypeResolverType");
}
nodeTypeResolverFactories.Remove(nodeTypeResolverType);
return this;
}
public override StaticDeserializerBuilder WithTagMapping(TagName tag, Type type)
{
if (tag.IsEmpty)
{
throw new ArgumentException("Non-specific tags cannot be maped");
}
if ((object)type == null)
{
throw new ArgumentNullException("type");
}
if (tagMappings.TryGetValue(tag, out Type value))
{
throw new ArgumentException($"Type already has a registered type '{value.FullName}' for tag '{tag}'", "tag");
}
tagMappings.Add(tag, type);
return this;
}
public StaticDeserializerBuilder WithTypeMapping<TInterface, TConcrete>() where TConcrete : TInterface
{
Type typeFromHandle = typeof(TInterface);
Type typeFromHandle2 = typeof(TConcrete);
if (!typeFromHandle.IsAssignableFrom(typeFromHandle2))
{
throw new InvalidOperationException("The type '" + typeFromHandle2.Name + "' does not implement interface '" + typeFromHandle.Name + "'.");
}
if (typeMappings.ContainsKey(typeFromHandle))
{
typeMappings[typeFromHandle] = typeFromHandle2;
}
else
{
typeMappings.Add(typeFromHandle, typeFromHandle2);
}
return this;
}
public StaticDeserializerBuilder WithoutTagMapping(TagName tag)
{
if (tag.IsEmpty)
{
throw new ArgumentException("Non-specific tags cannot be maped");
}
if (!tagMappings.Remove(tag))
{
throw new KeyNotFoundException($"Tag '{tag}' is not registered");
}
return this;
}
public StaticDeserializerBuilder IgnoreUnmatchedProperties()
{
ignoreUnmatched = true;
return this;
}
public StaticDeserializerBuilder WithDuplicateKeyChecking()
{
duplicateKeyChecking = true;
return this;
}
public IDeserializer Build()
{
return Deserializer.FromValueDeserializer(BuildValueDeserializer());
}
public IValueDeserializer BuildValueDeserializer()
{
return new AliasValueDeserializer(new NodeValueDeserializer(nodeDeserializerFactories.BuildComponentList(), nodeTypeResolverFactories.BuildComponentList(), typeConverter));
}
}
public sealed class StaticSerializerBuilder : StaticBuilderSkeleton<StaticSerializerBuilder>
{
private class ValueSerializer : IValueSerializer
{
private readonly IObjectGraphTraversalStrategy traversalStrategy;
private readonly IEventEmitter eventEmitter;
private readonly IEnumerable<IYamlTypeConverter> typeConverters;
private readonly LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories;
private readonly LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories;
public ValueSerializer(IObjectGraphTraversalStrategy traversalStrategy, IEventEmitter eventEmitter, IEnumerable<IYamlTypeConverter> typeConverters, LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories, LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories)
{
this.traversalStrategy = traversalStrategy;
this.eventEmitter = eventEmitter;
this.typeConverters = typeConverters;
this.preProcessingPhaseObjectGraphVisitorFactories = preProcessingPhaseObjectGraphVisitorFactories;
this.emissionPhaseObjectGraphVisitorFactories = emissionPhaseObjectGraphVisitorFactories;
}
public void SerializeValue(IEmitter emitter, object? value, Type? type)
{
IEmitter emitter2 = emitter;
Type type2 = type ?? ((value != null) ? value.GetType() : typeof(object));
Type staticType = type ?? typeof(object);
ObjectDescriptor graph = new ObjectDescriptor(value, type2, staticType);
List<IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitors = preProcessingPhaseObjectGraphVisitorFactories.BuildComponentList(typeConverters);
foreach (IObjectGraphVisitor<Nothing> item in preProcessingPhaseObjectGraphVisitors)
{
traversalStrategy.Traverse(graph, item, default(Nothing));
}
IObjectGraphVisitor<IEmitter> visitor = emissionPhaseObjectGraphVisitorFactories.BuildComponentChain<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>>(new EmittingObjectGraphVisitor(eventEmitter), (IObjectGraphVisitor<IEmitter> inner) => new EmissionPhaseObjectGraphVisitorArgs(inner, eventEmitter, preProcessingPhaseObjectGraphVisitors, typeConverters, NestedObjectSerializer));
traversalStrategy.Traverse(graph, visitor, emitter2);
void NestedObjectSerializer(object? v, Type? t)
{
SerializeValue(emitter2, v, t);
}
}
}
private readonly StaticContext context;
private readonly StaticObjectFactory factory;
private ObjectGraphTraversalStrategyFactory objectGraphTraversalStrategyFactory;
private readonly LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories;
private readonly LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories;
private readonly LazyComponentRegistrationList<IEventEmitter, IEventEmitter> eventEmitterFactories;
private readonly IDictionary<Type, TagName> tagMappings = new Dictionary<Type, TagName>();
private int maximumRecursion = 50;
private EmitterSettings emitterSettings = EmitterSettings.Default;
private DefaultValuesHandling defaultValuesHandlingConfiguration;
private bool quoteNecessaryStrings;
private bool quoteYaml1_1Strings;
private ScalarStyle defaultScalarStyle;
protected override StaticSerializerBuilder Self => this;
public StaticSerializerBuilder(StaticContext context)
: base((ITypeResolver)new DynamicTypeResolver())
{
this.context = context;
factory = context.GetFactory();
typeInspectorFactories.Add(typeof(CachedTypeInspector), (ITypeInspector inner) => new CachedTypeInspector(inner));
typeInspectorFactories.Add(typeof(NamingConventionTypeInspector), (ITypeInspector inner) => (!(namingConvention is NullNamingConvention)) ? new NamingConventionTypeInspector(inner, namingConvention) : inner);
typeInspectorFactories.Add(typeof(YamlAttributesTypeInspector), (ITypeInspector inner) => new YamlAttributesTypeInspector(inner));
preProcessingPhaseObjectGraphVisitorFactories = new LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> {
{
typeof(AnchorAssigner),
(IEnumerable<IYamlTypeConverter> typeConverters) => new AnchorAssigner(typeConverters)
} };
emissionPhaseObjectGraphVisitorFactories = new LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>>
{
{
typeof(CustomSerializationObjectGraphVisitor),
(EmissionPhaseObjectGraphVisitorArgs args) => new CustomSerializationObjectGraphVisitor(args.InnerVisitor, args.TypeConverters, args.NestedObjectSerializer)
},
{
typeof(AnchorAssigningObjectGraphVisitor),
(EmissionPhaseObjectGraphVisitorArgs args) => new AnchorAssigningObjectGraphVisitor(args.InnerVisitor, args.EventEmitter, args.GetPreProcessingPhaseObjectGraphVisitor<AnchorAssigner>())
},
{
typeof(DefaultValuesObjectGraphVisitor),
(EmissionPhaseObjectGraphVisitorArgs args) => new DefaultValuesObjectGraphVisitor(defaultValuesHandlingConfiguration, args.InnerVisitor, factory)
},
{
typeof(CommentsObjectGraphVisitor),
(EmissionPhaseObjectGraphVisitorArgs args) => new CommentsObjectGraphVisitor(args.InnerVisitor)
}
};
eventEmitterFactories = new LazyComponentRegistrationList<IEventEmitter, IEventEmitter> {
{
typeof(TypeAssigningEventEmitter),
(IEventEmitter inner) => new TypeAssigningEventEmitter(inner, requireTagWhenStaticAndActualTypesAreDifferent: false, tagMappings, quoteNecessaryStrings, quoteYaml1_1Strings, defaultScalarStyle, yamlFormatter)
} };
objectGraphTraversalStrategyFactory = (ITypeInspector typeInspector, ITypeResolver typeResolver, IEnumerable<IYamlTypeConverter> typeConverters, int maximumRecursion) => new FullObjectGraphTraversalStrategy(typeInspector, typeResolver, maximumRecursion, namingConvention, factory);
}
public StaticSerializerBuilder WithQuotingNecessaryStrings(bool quoteYaml1_1Strings = false)
{
quoteNecessaryStrings = true;
this.quoteYaml1_1Strings = quoteYaml1_1Strings;
return this;
}
public StaticSerializerBuilder WithQuotingNecessaryStrings()
{
quoteNecessaryStrings = true;
return this;
}
public StaticSerializerBuilder WithDefaultScalarStyle(ScalarStyle style)
{
defaultScalarStyle = style;
return this;
}
public StaticSerializerBuilder WithMaximumRecursion(int maximumRecursion)
{
if (maximumRecursion <= 0)
{
throw new ArgumentOutOfRangeException("maximumRecursion", $"The maximum recursion specified ({maximumRecursion}) is invalid. It should be a positive integer.");
}
this.maximumRecursion = maximumRecursion;
return this;
}
public StaticSerializerBuilder WithEventEmitter<TEventEmitter>(Func<IEventEmitter, TEventEmitter> eventEmitterFactory) where TEventEmitter : IEventEmitter
{
return WithEventEmitter(eventEmitterFactory, delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> w)
{
w.OnTop();
});
}
public StaticSerializerBuilder WithEventEmitter<TEventEmitter>(Func<IEventEmitter, TEventEmitter> eventEmitterFactory, Action<IRegistrationLocationSelectionSyntax<IEventEmitter>> where) where TEventEmitter : IEventEmitter
{
Func<IEventEmitter, TEventEmitter> eventEmitterFactory2 = eventEmitterFactory;
if (eventEmitterFactory2 == null)
{
throw new ArgumentNullException("eventEmitterFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(eventEmitterFactories.CreateRegistrationLocationSelector(typeof(TEventEmitter), (IEventEmitter inner) => eventEmitterFactory2(inner)));
return Self;
}
public StaticSerializerBuilder WithEventEmitter<TEventEmitter>(WrapperFactory<IEventEmitter, IEventEmitter, TEventEmitter> eventEmitterFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IEventEmitter>> where) where TEventEmitter : IEventEmitter
{
WrapperFactory<IEventEmitter, IEventEmitter, TEventEmitter> eventEmitterFactory2 = eventEmitterFactory;
if (eventEmitterFactory2 == null)
{
throw new ArgumentNullException("eventEmitterFactory");
}
if (where == null)
{
throw new ArgumentNullException("where");
}
where(eventEmitterFactories.CreateTrackingRegistrationLocationSelector(typeof(TEventEmitter), (IEventEmitter wrapped, IEventEmitter inner) => eventEmitterFactory2(wrapped, inner)));
return Self;
}
public StaticSerializerBuilder WithoutEventEmitter<TEventEmitter>() where TEventEmitter : IEventEmitter
{
return WithoutEventEmitter(typeof(TEventEmitter));
}
public StaticSerializerBuilder WithoutEventEmitter(Type eventEmitterType)
{
if ((object)eventEmitterType == null)
{
throw new ArgumentNullException("eventEmitterType");
}
eventEmitterFactories.Remove(eventEmitterType);
return this;
}
public override StaticSerializerBuilder WithTagMapping(TagName tag, Type type)
{
if (tag.IsEmpty)
{
throw new ArgumentException("Non-specific tags cannot be maped");
}
if ((object)type == null)
{
throw new ArgumentNullException("type");
}
if (tagMappings.TryGetValue(type, out var value))
{
throw new ArgumentException($"Type already has a registered tag '{value}' for type '{type.FullName}'", "type");
}
tagMappings.Add(type, tag);
return this;
}
public StaticSerializerBuilder WithoutTagMapping(Type type)
{
if ((object)type == null)
{
throw new ArgumentNullException("type");
}
if (!tagMappings.Remove(type))
{
throw new KeyNotFoundException("Tag for type '" + type.FullName + "' is not registered");
}
return this;
}
public StaticSerializerBuilder EnsureRoundtrip()
{
objectGraphTraversalStrategyFactory = (ITypeInspector typeInspector, ITypeResolver typeResolver, IEnumerable<IYamlTypeConverter> typeConverters, int maximumRecursion) => new RoundtripObjectGraphTraversalStrategy(typeConverters, typeInspector, typeResolver, maximumRecursion, namingConvention, settings, factory);
WithEventEmitter((IEventEmitter inner) => new TypeAssigningEventEmitter(inner, requireTagWhenStaticAndActualTypesAreDifferent: true, tagMappings, quoteNecessaryStrings), delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> loc)
{
loc.InsteadOf<TypeAssigningEventEmitter>();
});
return WithTypeInspector((ITypeInspector inner) => new ReadableAndWritablePropertiesTypeInspector(inner), delegate(IRegistrationLocationSelectionSyntax<ITypeInspector> loc)
{
loc.OnBottom();
});
}
public StaticSerializerBuilder DisableAliases()
{
preProcessingPhaseObjectGraphVisitorFactories.Remove(typeof(AnchorAssigner));
emissionPhaseObjectGraphVisitorFactories.Remove(typeof(AnchorAssigningObjectGraphVisitor));
return this;
}
[Obsolete("The default behavior is now to always emit default values, thefore calling this method has no effect. This behavior is now controlled by ConfigureDefaultValuesHandling.", true)]
public StaticSerializerBuilder EmitDefaults()
{
return ConfigureDefaultValuesHandling(DefaultValuesHandling.Preserve);
}
public StaticSerializerBuilder ConfigureDefaultValuesHandling(DefaultValuesHandling configuration)
{
defaultValuesHandlingConfiguration = configuration;
return this;
}
public StaticSerializerBuilder JsonCompatible()
{
emitterSettings = emitterSettings.WithMaxSimpleKeyLength(int.MaxValue).WithoutAnchorName();
return WithTypeConverter(new YamlDotNet.Serialization.Converters.GuidConverter(jsonCompatible: true), delegate(IRegistrationLocationSelectionSyntax<IYamlTypeConverter> w)
{
w.InsteadOf<YamlDotNet.Serialization.Converters.GuidConverter>();
}).WithTypeConverter(new YamlDotNet.Serialization.Converters.DateTimeConverter(DateTimeKind.Utc, null, true)).WithEventEmitter((IEventEmitter inner) => new JsonEventEmitter(inner, yamlFormatter), delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> loc)
{
loc.InsteadOf<TypeAssigningEventEmitter>();
});
}
public StaticSerializerBuilder WithNewLine(string newLine)
{
emitterSettings = emitterSettings.WithNewLine(newLine);
return this;
}
public StaticSerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(TObjectGraphVisitor objectGraphVisitor) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing>
{
return WithPreProcessingPhaseObjectGraphVisitor(objectGraphVisitor, delegate(IRegistrationLocationSelectionSyntax<IO