Decompiled source of AutogenRundown v0.75.2
AutogenRundown.dll
Decompiled 13 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Numerics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using AIGraph; using AutogenRundown.DataBlocks; using AutogenRundown.DataBlocks.Alarms; using AutogenRundown.DataBlocks.ComplexResourceSets; using AutogenRundown.DataBlocks.Custom.AdvancedWardenObjective; using AutogenRundown.DataBlocks.Custom.AutogenRundown; using AutogenRundown.DataBlocks.Custom.AutogenRundown.SecurityDoors; using AutogenRundown.DataBlocks.Custom.AutogenRundown.TerminalPlacements; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization.Abilities; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization.EnemyAbilities; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization.Models; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization.Models.Bones; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization.Models.Glows; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization.Models.Materials; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization.Projectiles; using AutogenRundown.DataBlocks.Custom.ExtraObjectiveSetup; using AutogenRundown.DataBlocks.Custom.ExtraObjectiveSetup.ExtensionSecuritySensor; using AutogenRundown.DataBlocks.Dimensions; using AutogenRundown.DataBlocks.Enemies; using AutogenRundown.DataBlocks.Enums; using AutogenRundown.DataBlocks.Items; using AutogenRundown.DataBlocks.Levels; using AutogenRundown.DataBlocks.Light; using AutogenRundown.DataBlocks.Objectives; using AutogenRundown.DataBlocks.Objectives.CentralGeneratorCluster; using AutogenRundown.DataBlocks.Objectives.Reactor; using AutogenRundown.DataBlocks.Terminals; using AutogenRundown.DataBlocks.ZoneData; using AutogenRundown.DataBlocks.Zones; using AutogenRundown.Extensions; using AutogenRundown.GeneratorData; using AutogenRundown.Managers; using AutogenRundown.Patches; using AutogenRundown.PeerMods; using AutogenRundown.Utils; using BepInEx; using BepInEx.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using CellMenu; using GTFO.API; using GameData; using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using LevelGeneration; using Localization; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using TMPro; using UnityEngine; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("AutogenRundown")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("AutogenRundown")] [assembly: AssemblyTitle("AutogenRundown")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] 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; } } } namespace AutogenRundown { public enum Complexity { Low, Medium, High } public class BuildDirector { public int Points { get; set; } public Complexity Complexity { get; set; } public string Tier { get; set; } = "A"; public Bulkhead Bulkhead { get; set; } = Bulkhead.Main; public Complex Complex { get; set; } public LevelSettings Settings { get; set; } = new LevelSettings(); public WardenObjectiveType Objective { get; set; } = WardenObjectiveType.GatherSmallItems; [Obsolete("Prefer specifying the number of zones in each objective layout")] public int ZoneCount { get; set; } public List<int> EnemyPointPool { get; set; } = new List<int>(); public void GenObjective(IEnumerable<WardenObjectiveType> exclude) { IEnumerable<WardenObjectiveType> exclude2 = exclude; List<WardenObjectiveType> list = new List<WardenObjectiveType> { WardenObjectiveType.HsuFindSample, WardenObjectiveType.ReactorStartup, WardenObjectiveType.ReactorShutdown, WardenObjectiveType.GatherSmallItems, WardenObjectiveType.ClearPath, WardenObjectiveType.SpecialTerminalCommand, WardenObjectiveType.RetrieveBigItems, WardenObjectiveType.PowerCellDistribution, WardenObjectiveType.TerminalUplink, WardenObjectiveType.CentralGeneratorCluster, WardenObjectiveType.HsuActivateSmall, WardenObjectiveType.Survival, WardenObjectiveType.GatherTerminal, WardenObjectiveType.CorruptedTerminalUplink, WardenObjectiveType.TimedTerminalSequence }; list.RemoveAll((WardenObjectiveType o) => exclude2.Contains(o)); if (!Bulkhead.HasFlag(Bulkhead.Main)) { list.Remove(WardenObjectiveType.HsuActivateSmall); list.Remove(WardenObjectiveType.ClearPath); list.Remove(WardenObjectiveType.Survival); } if (Bulkhead.HasFlag(Bulkhead.Main)) { list.Remove(WardenObjectiveType.SpecialTerminalCommand); } if (Bulkhead.HasFlag(Bulkhead.Overload) && exclude2.Contains(WardenObjectiveType.Survival)) { list = new List<WardenObjectiveType> { WardenObjectiveType.SpecialTerminalCommand }; } Objective = Generator.Pick(list); } public void GenPoints() { string tier = Tier; Bulkhead bulkhead = Bulkhead; int points; switch (tier) { case "A": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_010a; case Bulkhead.Overload: goto IL_0132; default: goto IL_015a; } points = 400; break; case "B": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_0112; case Bulkhead.Overload: goto IL_013a; default: goto IL_015a; } points = 500; break; case "C": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_011a; case Bulkhead.Overload: goto IL_0142; default: goto IL_015a; } points = 800; break; case "D": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_0122; case Bulkhead.Overload: goto IL_014a; default: goto IL_015a; } points = 800; break; case "E": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_012a; case Bulkhead.Overload: goto IL_0152; default: goto IL_015a; } points = 800; break; default: goto IL_015a; IL_0152: points = 800; break; IL_012a: points = 800; break; IL_014a: points = 800; break; IL_0122: points = 800; break; IL_015a: points = 600; break; IL_0142: points = 800; break; IL_011a: points = 800; break; IL_0132: points = 400; break; IL_013a: points = 500; break; IL_0112: points = 500; break; IL_010a: points = 400; break; } Points = points; } [Obsolete("Prefer specifying the number of zones in each objective layout")] public void GenZones() { string tier = Tier; Bulkhead bulkhead = Bulkhead; ZoneCount = tier switch { "A" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.4, 1), (1.0, 2) }) : Generator.Select(new List<(double, int)> { (0.4, 1), (1.0, 2), (1.0, 3) }), "B" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.4, 1), (1.0, 2), (1.0, 3) }) : Generator.Select(new List<(double, int)> { (0.4, 2), (1.0, 3), (1.0, 4), (0.2, 5) }), "C" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.3, 1), (0.9, 2), (1.0, 3) }) : Generator.Select(new List<(double, int)> { (0.9, 3), (1.0, 4), (1.0, 5) }), "D" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.6, 2), (0.9, 3), (1.0, 4) }) : Generator.Select(new List<(double, int)> { (0.6, 3), (0.9, 4), (1.0, 5), (0.3, 6) }), "E" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.5, 2), (1.0, 3), (1.0, 4), (0.1, 5) }) : Generator.Select(new List<(double, int)> { (0.4, 3), (0.9, 4), (1.0, 5), (0.8, 6), (0.1, 7) }), _ => 1, }; EnemyPointPool = (from _ in Enumerable.Range(0, ZoneCount) select Points / ZoneCount).ToList(); } public int GetPoints(Zone zone) { double num = (zone.Coverage.Min + zone.Coverage.Max) / 2.0 / 30.0 * zone.EnemyPointsMultiplier; return (int)(num * (double)(Tier switch { "A" => Generator.Random.Next(20, 25), "B" => Generator.Random.Next(23, 27), "C" => Generator.Random.Next(25, 30), "D" => Generator.Random.Next(30, 35), "E" => Generator.Random.Next(35, 40), _ => 25, })); } } public class Collections { public static List<T> Flatten<T>(params ICollection<T>[] collections) { return collections.SelectMany((ICollection<T> c) => c).ToList(); } } [Obsolete("Use ComplexResourceSet")] public class ComplexResource { } public static class Text { public static string ToRoman(int number) { if (number < 0 || number > 3999) { throw new ArgumentOutOfRangeException("number", "insert value between 1 and 3999"); } if (number < 1) { return string.Empty; } if (number >= 1000) { return "M" + ToRoman(number - 1000); } if (number >= 900) { return "CM" + ToRoman(number - 900); } if (number >= 500) { return "D" + ToRoman(number - 500); } if (number >= 400) { return "CD" + ToRoman(number - 400); } if (number >= 100) { return "C" + ToRoman(number - 100); } if (number >= 90) { return "XC" + ToRoman(number - 90); } if (number >= 50) { return "L" + ToRoman(number - 50); } if (number >= 40) { return "XL" + ToRoman(number - 40); } if (number >= 10) { return "X" + ToRoman(number - 10); } if (number >= 9) { return "IX" + ToRoman(number - 9); } if (number >= 5) { return "V" + ToRoman(number - 5); } if (number >= 4) { return "IV" + ToRoman(number - 4); } if (number >= 1) { return "I" + ToRoman(number - 1); } return ""; } } public enum PidOffsets { None, Normal, Enemy, EnemyGroup, WavePopulation, WaveSettings } public static class Generator { public interface ISelectable { double Weight { get; set; } } public static uint pid = 100000u; private static uint enemyPid = 70u; private static uint enemyGroupPid = 63u; private static uint wavePopulationPid = 200u; private static uint waveSettingsPid = 1u; public static string InputDailySeed { get; set; } = ""; public static string InputWeeklySeed { get; set; } = ""; public static string InputMonthlySeed { get; set; } = ""; public static string InputSeasonalSeed { get; set; } = ""; public static string SeasonalSeason { get; set; } = ""; public static int SeasonalYear { get; set; } = 1; public static int MonthNumber { get; set; } = -1; public static int WeekNumber { get; set; } = -1; public static string DisplaySeed { get; set; } = ""; public static string Seed { get; set; } = ""; public static Random Random { get; private set; } = new Random(); public static double NextDouble() { return Random.NextDouble(); } public static double NextDouble(double min, double max) { return Random.NextDouble() * (max - min) + min; } public static double NextDouble(double max) { return Random.NextDouble() * max; } public static int Between(int min, int max) { return Random.Next(min, max + 1); } public static int BetweenConstrained(int min, int max, IEnumerable<(int start, int end)> blockedRanges, int freeAfter = 1) { List<(int start, int end)> list = MergeRanges(from r in blockedRanges select (Math.Max(min, Math.Min(r.start, r.end)), Math.Min(max, Math.Max(r.start, r.end))) into r where r.start <= r.end orderby r.start, r.end select r); List<(int, int)> list2 = new List<(int, int)>(); int num = min; foreach (var (num2, num3) in list) { if (num < num2) { list2.Add((num, num2 - 1)); } num = num3 + 1; if (num > max) { break; } } if (num <= max) { list2.Add((num, max)); } List<(int, int)> list3 = new List<(int, int)>(); int num4 = 0; foreach (var item2 in list2) { int item = item2.Item1; int num5 = item2.Item2 - freeAfter; if (num5 >= item) { int num6 = num5 - item + 1; list3.Add((item, num6)); num4 += num6; } } if (num4 == 0) { throw new InvalidOperationException("No valid numbers available with the given constraints and tail requirement."); } int num7 = Between(0, num4); foreach (var (num8, num9) in list3) { if (num7 < num9) { return num8 + num7; } num7 -= num9; } throw new InvalidOperationException("Selection failed unexpectedly."); } private static List<(int start, int end)> MergeRanges(IEnumerable<(int start, int end)> ranges) { List<(int, int)> list = new List<(int, int)>(); int? num = null; int num2 = 0; foreach (var (num3, num4) in ranges) { if (!num.HasValue) { num = num3; num2 = num4; } else if (num3 <= num2 + 1) { num2 = Math.Max(num2, num4); } else { list.Add((num.Value, num2)); num = num3; num2 = num4; } } if (num.HasValue) { list.Add((num.Value, num2)); } return list; } public static bool Flip(double chance = 0.5) { return Random.NextDouble() < chance; } public static T? Pick<T>(IEnumerable<T> collection) { if (collection.Count() <= 0) { return default(T); } return collection.ElementAt(Random.Next(collection.Count())); } public static T? Draw<T>(ICollection<T> collection) { T val = Pick(collection); if (val != null) { collection.Remove(val); } return val; } public static List<T> Shuffle<T>(ICollection<T> collection) { return collection.OrderBy((T _) => Random.Next()).ToList(); } public static T Select<T>(ICollection<T> collection) where T : ISelectable { double num = collection.Sum((T x) => x.Weight); double num2 = Random.NextDouble() * num; double num3 = 0.0; foreach (T item in collection) { num3 += item.Weight; if (num2 <= num3) { return item; } } return collection.Last(); } public static T Select<T>(ICollection<(double, T)> collection) { double num = collection.Sum<(double, T)>(((double, T) x) => x.Item1); double num2 = Random.NextDouble() * num; double num3 = 0.0; foreach (var item3 in collection) { double item = item3.Item1; T item2 = item3.Item2; num3 += item; if (num2 <= num3) { return item2; } } return collection.Last().Item2; } public static void SelectRun(ICollection<(double, Action)> collection) { double num = collection.Sum<(double, Action)>(((double, Action) x) => x.Item1); double num2 = Random.NextDouble() * num; double num3 = 0.0; foreach (var item3 in collection) { double item = item3.Item1; Action item2 = item3.Item2; num3 += item; if (!(num2 > num3)) { item2(); return; } } collection.Last().Item2(); } public static void DrawSelectRun_PersistedList(ICollection<(double weight, int count, Action action)> collection) { } public static T DrawSelect<T>(ICollection<(double, int, T)> collection, bool fixedWeights = false) { double num = collection.Sum<(double, int, T)>(((double, int, T) x) => fixedWeights ? x.Item1 : (x.Item1 * (double)x.Item2)); double num2 = Random.NextDouble() * num; double num3 = 0.0; for (int i = 0; i < collection.Count; i++) { (double, int, T) tuple = collection.ElementAt(i); (double, int, T) tuple2 = tuple; double item = tuple2.Item1; int item2 = tuple2.Item2; T item3 = tuple2.Item3; num3 += item * (double)item2; if (num2 <= num3) { collection.Remove(tuple); tuple.Item2--; if (tuple.Item2 > 0) { collection.Add(tuple); } return item3; } } (double, int, T) item4 = collection.Last(); collection.Remove(item4); item4.Item2--; if (item4.Item2 > 0) { collection.Add(item4); } return item4.Item3; } public static T DrawSelectFrequency<T>(ICollection<(double, int, T)> collection) { int num = collection.Sum<(double, int, T)>(((double, int, T) x) => x.Item2); double num2 = Random.NextDouble() * (double)num; double num3 = 0.0; for (int i = 0; i < collection.Count; i++) { (double, int, T) tuple = collection.ElementAt(i); (double, int, T) tuple2 = tuple; int item = tuple2.Item2; T item2 = tuple2.Item3; num3 += (double)item; if (num2 <= num3) { collection.Remove(tuple); tuple.Item2--; if (tuple.Item2 > 0) { collection.Add(tuple); } return item2; } } (double, int, T) item3 = collection.Last(); collection.Remove(item3); item3.Item2--; if (item3.Item2 > 0) { collection.Add(item3); } return item3.Item3; } public static uint GetPersistentId(PidOffsets offset = PidOffsets.Normal) { return offset switch { PidOffsets.None => 0u, PidOffsets.Normal => pid++, PidOffsets.Enemy => enemyPid++, PidOffsets.EnemyGroup => enemyGroupPid++, PidOffsets.WavePopulation => wavePopulationPid++, PidOffsets.WaveSettings => waveSettingsPid++, _ => throw new ArgumentOutOfRangeException("offset", offset, null), }; } public static void GenerateTimeSeed() { DateTime utcNow = DateTime.UtcNow; TimeZoneInfo destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); DateTime value = TimeZoneInfo.ConvertTimeFromUtc(utcNow, destinationTimeZone); string seed = $"{value:yyyy_MM_dd}"; string text = $"{value:MM/dd}"; Seed = seed; DisplaySeed = "<color=orange>" + text + "</color>"; } public static string GetSeason(int month) { return (new string[4] { "Winter", "Spring", "Summer", "Fall" })[month % 12 / 3]; } public static int GetSeasonYear(DateTime date) { int month = date.Month; if ((uint)(month - 1) <= 1u) { return date.Year - 1; } return date.Year; } public static void SetSeasonSeed(string seed = "") { //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Expected O, but got Unknown //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown DateTime utcNow = DateTime.UtcNow; TimeZoneInfo destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); DateTime dateTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, destinationTimeZone); bool flag = false; InputSeasonalSeed = $"{GetSeason(dateTime.Month)}_{GetSeasonYear(dateTime)}".ToUpperInvariant(); bool flag2 = default(bool); if (!string.IsNullOrWhiteSpace(seed)) { if (TryParseSeasonalSeed(seed, out string seasonTitleCase, out int year)) { InputSeasonalSeed = $"{seasonTitleCase.ToUpperInvariant()}_{year}"; SeasonalSeason = seasonTitleCase; SeasonalYear = year; flag = true; } else { ManualLogSource logger = Plugin.Logger; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(33, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Unable to parse seasonal seed: \""); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(seed); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\""); } logger.LogWarning(val); } } if (!flag) { SeasonalSeason = GetSeason(dateTime.Month); SeasonalYear = GetSeasonYear(dateTime); } ManualLogSource logger2 = Plugin.Logger; BepInExDebugLogInterpolatedStringHandler val2 = new BepInExDebugLogInterpolatedStringHandler(20, 1, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Seasonal date seed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<DateTime>(dateTime); } logger2.LogDebug(val2); string inputSeasonalSeed = InputSeasonalSeed; string text = $"{SeasonalSeason} {SeasonalYear}"; Seed = inputSeasonalSeed; DisplaySeed = "<color=orange>" + text + "</color>"; } private static bool TryParseSeasonalSeed(string seed, out string seasonTitleCase, out int year) { seasonTitleCase = ""; year = 0; if (string.IsNullOrWhiteSpace(seed)) { return false; } string[] array = seed.Trim().Replace('-', ' ').Replace('_', ' ') .ToUpperInvariant() .Split(' ', StringSplitOptions.RemoveEmptyEntries); if (array.Length != 2) { return false; } string text = null; string text2 = null; if (IsSeasonToken(array[0])) { text = array[0]; text2 = array[1]; } else { if (!IsSeasonToken(array[1])) { return false; } text = array[1]; text2 = array[0]; } if (!int.TryParse(text2, out year) || year < 1 || year > 9999) { return false; } seasonTitleCase = text switch { "WINTER" => "Winter", "SPRING" => "Spring", "SUMMER" => "Summer", "AUTUMN" => "Fall", "FALL" => "Fall", _ => "", }; return seasonTitleCase != ""; } private static bool IsSeasonToken(string token) { switch (token) { default: return token == "AUTUMN"; case "WINTER": case "SPRING": case "SUMMER": case "FALL": return true; } } public static void SetMonthSeed(string seed = "") { //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown DateTime utcNow = DateTime.UtcNow; TimeZoneInfo destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); DateTime result = TimeZoneInfo.ConvertTimeFromUtc(utcNow, destinationTimeZone); InputMonthlySeed = $"{result:yyyy_MM}"; bool flag = default(bool); if (!string.IsNullOrWhiteSpace(seed)) { if (DateTime.TryParseExact(seed.Trim(), "yyyy_MM", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) { InputMonthlySeed = seed.Trim(); } else { ManualLogSource logger = Plugin.Logger; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(32, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Unable to parse monthly seed: \""); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(seed); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\""); } logger.LogWarning(val); } } ManualLogSource logger2 = Plugin.Logger; BepInExDebugLogInterpolatedStringHandler val2 = new BepInExDebugLogInterpolatedStringHandler(19, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Monthly date seed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<DateTime>(result); } logger2.LogDebug(val2); string seed2 = $"{result:yyyy_MM}"; string text = $"{result:MMMM}"; Seed = seed2; DisplaySeed = "<color=orange>" + text + "</color>"; MonthNumber = result.Month; } public static void SetWeeklySeed(string seed = "") { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown DateTime utcNow = DateTime.UtcNow; TimeZoneInfo destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); DateTime result = TimeZoneInfo.ConvertTimeFromUtc(utcNow, destinationTimeZone); InputWeeklySeed = $"{result:yyyy_MM_dd}"; if (!string.IsNullOrWhiteSpace(seed)) { if (DateTime.TryParseExact(seed.Trim(), "yyyy_MM_dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) { InputWeeklySeed = seed.Trim(); } else { ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(31, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Unable to parse weekly seed: \""); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(seed); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\""); } logger.LogWarning(val); } } int weekOfYear = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(result, CalendarWeekRule.FirstFullWeek, DayOfWeek.Tuesday); string seed2 = $"{result:yyyy}_W{weekOfYear}"; string text = $"Week {weekOfYear}"; Seed = seed2; DisplaySeed = "<color=orange>" + text + "</color>"; WeekNumber = weekOfYear; } public static void Reload() { Random = new Random(GetHashCode(Seed)); } public static void ReadOrSetSeed(string seed = "") { if (seed != "") { Seed = seed; DisplaySeed = "<color=orange>" + seed + "</color>"; InputDailySeed = seed.Trim(); } else { GenerateTimeSeed(); InputDailySeed = Seed; } } public static void AdvanceSequence(int rounds) { while (rounds-- > 0) { Random.Next(); } } public static void WriteSeed() { string text = Path.Combine(Paths.PluginPath, "MyFirstPlugin"); string path = Path.Combine(text, "seed.txt"); Directory.CreateDirectory(text); using FileStream stream = File.Create(path); using StreamWriter streamWriter = new StreamWriter(stream); streamWriter.WriteLine(Seed); } public static int GetHashCode(this string str) { int num = 5381; int num2 = num; for (int i = 0; i < str.Length && str[i] != 0; i += 2) { num = ((num << 5) + num) ^ str[i]; if (i == str.Length - 1 || str[i + 1] == '\0') { break; } num2 = ((num2 << 5) + num2) ^ str[i + 1]; } return num + num2 * 1566083941; } } public class LocalProgression { public static void WriteConfig() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) new JsonSerializer().Formatting = (Formatting)1; int revision = CellBuildData.GetRevision(); string text = Path.Combine(Paths.BepInExRootPath, "GameData", $"{revision}", "Custom", "LocalProgressionConfig"); string path = Path.Combine(text, "ProgressionConfig.json"); Directory.CreateDirectory(text); using StreamWriter streamWriter = new StreamWriter(path); streamWriter.Write($"{{\n \"Configs\": [\n {{\n \"RundownID\": {Rundown.R_Daily},\n \"EnableNoBoosterUsedProgressionForRundown\": true,\n \"AlwaysShowIcon\": true,\n \"Expeditions\": []\n }},\n {{\n \"RundownID\": {Rundown.R_Weekly},\n \"EnableNoBoosterUsedProgressionForRundown\": true,\n \"AlwaysShowIcon\": true,\n \"Expeditions\": []\n }},\n {{\n \"RundownID\": {Rundown.R_Monthly},\n \"EnableNoBoosterUsedProgressionForRundown\": true,\n \"AlwaysShowIcon\": true,\n \"Expeditions\": []\n }}\n ]\n}}"); streamWriter.Flush(); } } public static class Peers { private static List<Mod> Mods { get; set; } = new List<Mod>(); public static void Init() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown try { string text = File.ReadAllText(Path.Combine(Paths.BepInExRootPath, "..", "mods.yml")); Mods = ((BuilderSkeleton<DeserializerBuilder>)new DeserializerBuilder()).WithNamingConvention(CamelCaseNamingConvention.Instance).Build().Deserialize<List<Mod>>(text); } catch (FileNotFoundException) { Plugin.Logger.LogWarning((object)"Peers.Init(): Could not find mods.yml"); } } public static bool HasMod(string name) { string name2 = name; return Mods.Any((Mod mod) => mod.Name == name2 && mod.Enabled); } public static void Configure() { LocalProgression.WriteConfig(); Arsenality.Configure(); ArsenalityRebalance.Configure(); VanillaReloaded.Configure(); } } [BepInPlugin("000-the_tavern-AutogenRundown", "AutogenRundown", "0.75.2")] [BepInProcess("GTFO.exe")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BasePlugin { public const string Version = "0.75.2"; public const string Name = "the_tavern-AutogenRundown"; public static string GameRevision => CellBuildData.GetRevision().ToString(); public static string GameDataPath => Path.Combine(Paths.BepInExRootPath, "GameData", GameRevision); public static ManualLogSource Logger { get; private set; } = new ManualLogSource("AutogenRundown"); public static bool Config_UsePlayerColoredGlowsticks { get; set; } public override void Load() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_003a: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_006a: Expected O, but got Unknown //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Expected O, but got Unknown //IL_009a: Expected O, but got Unknown //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Expected O, but got Unknown //IL_00ca: Expected O, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected O, but got Unknown //IL_00f6: Expected O, but got Unknown //IL_0106: 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_0121: Expected O, but got Unknown //IL_0121: Expected O, but got Unknown //IL_01ec: Unknown result type (might be due to invalid IL or missing references) Logger = ((BasePlugin)this).Log; ConfigEntry<string> val = ((BasePlugin)this).Config.Bind<string>(new ConfigDefinition("AutogenRundown.Seeds", "DailySeed"), "", new ConfigDescription("Specify a seed for the Daily Rundown generation. Any string can be used here, this defaults to today's date. E.g. 2025_08_15 for August 15th 2025.", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> val2 = ((BasePlugin)this).Config.Bind<string>(new ConfigDefinition("AutogenRundown.Seeds", "WeeklySeed"), "", new ConfigDescription("Specify a seed for the Weekly Rundown.\nExpected format is \"YYYY_MM_DD\" where YYYY is the year, MM is the month, and DD is the day.\ne.g 2025_08_03 for August 3rd 2025.\nWeek number is automatically calculated from the date.", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> val3 = ((BasePlugin)this).Config.Bind<string>(new ConfigDefinition("AutogenRundown.Seeds", "MonthlySeed"), "", new ConfigDescription("Specify a seed for the Monthly Rundown.\nExpected format is \"YYYY_MM\" where YYYY is the year (e.g 2025) and MM is the month (e.g 03 for March)", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<string> val4 = ((BasePlugin)this).Config.Bind<string>(new ConfigDefinition("AutogenRundown.Seeds", "SeasonalSeed"), "", new ConfigDescription("Specify a seed for the Seasonal Rundown.\nExpected format is \"SEASON_YYYY\" where YYYY is the year (e.g 2025) and SEASONis one of the four seasons (Winter, Spring, Summer, Fall).e.g SPRING_2025", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<bool> obj = ((BasePlugin)this).Config.Bind<bool>(new ConfigDefinition("AutogenRundown", "RegenerateOnStartup"), true, new ConfigDescription("Should datablocks be regenerated on game startup. Applies to all rundowns.", (AcceptableValueBase)null, Array.Empty<object>())); Config_UsePlayerColoredGlowsticks = ((BasePlugin)this).Config.Bind<bool>(new ConfigDefinition("AutogenRundown", "UsePlayerColorGlowsticks"), false, new ConfigDescription("Use per player color glow sticks. Client side only.", (AcceptableValueBase)null, Array.Empty<object>())).Value; if (val.Value == "Todays date, YYYY_MM_DD") { val.Value = ""; } if (val2.Value == "Todays date, YYYY_MM_DD") { val2.Value = ""; } if (val3.Value == "Todays month, YYYY_MM") { val3.Value = ""; } ((BasePlugin)this).Config.Save(); if (obj.Value) { Peers.Init(); RundownFactory.Build(val.Value, val2.Value, val3.Value, val4.Value); } PlayFabManager.OnTitleDataUpdated += Action.op_Implicit((Action)RundownNames.OnTitleDataUpdated); Patch_LG_ComputerTerminal_Setup.Setup(); Patch_LG_SecurityDoor.Setup(); GameDataAPI.OnGameDataInitialized += Patch_CentralGeneratorCluster.Setup; new Harmony("the_tavern-AutogenRundown").PatchAll(); } } public enum PluginRundown { None, Daily, Weekly, Monthly, Seasonal } public record Prefab { [JsonProperty("Prefab")] public string Asset { get; set; } = ""; public SubComplex SubComplex { get; set; } = SubComplex.All; public int Shard { get; set; } = 1; } public static class RundownFactory { private static string DescriptionHeader(WardenObjectiveType objectiveType) { return objectiveType switch { WardenObjectiveType.HsuFindSample => "<color=#444444>Objective Dispatch:</color> <color=orange>HSU Extraction</color>\n", WardenObjectiveType.ReactorStartup => "<color=#444444>Objective Dispatch:</color> <color=orange>Reactor Startup</color>\n", WardenObjectiveType.ReactorShutdown => "<color=#444444>Objective Dispatch:</color> <color=orange>Reactor Shutdown</color>\n", WardenObjectiveType.GatherSmallItems => "<color=#444444>Objective Dispatch:</color> <color=orange>Gather Items</color>\n", WardenObjectiveType.ClearPath => "<color=#444444>Objective Dispatch:</color> <color=orange>Sector Survey</color>\n", WardenObjectiveType.SpecialTerminalCommand => "<color=#444444>Objective Dispatch:</color> <color=orange>Manual Terminal Override</color>\n", WardenObjectiveType.RetrieveBigItems => "<color=#444444>Objective Dispatch:</color> <color=orange>Package Extraction</color>\n", WardenObjectiveType.PowerCellDistribution => "<color=#444444>Objective Dispatch:</color> <color=orange>Power Cell Distribution</color>\n", WardenObjectiveType.TerminalUplink => "<color=#444444>Objective Dispatch:</color> <color=orange>Network Uplink</color>\n", WardenObjectiveType.CentralGeneratorCluster => "<color=#444444>Objective Dispatch:</color> <color=orange>Generator Cluster</color>\n", WardenObjectiveType.HsuActivateSmall => "<color=#444444>Objective Dispatch:</color> <color=orange>Activate Item</color>\n", WardenObjectiveType.Survival => "<color=#444444>Objective Dispatch:</color> <color=orange>Diversion Protocol</color>\n", WardenObjectiveType.GatherTerminal => "<color=#444444>Objective Dispatch:</color> <color=orange>Extract Terminal Keys</color>\n", WardenObjectiveType.CorruptedTerminalUplink => "<color=#444444>Objective Dispatch:</color> <color=orange>Dual Network Uplink</color>\n", WardenObjectiveType.TimedTerminalSequence => "<color=#444444>Objective Dispatch:</color> <color=orange>Timed Sequence</color>\n", _ => "", }; } private static void CleanFolders() { string path = Path.Combine(Plugin.GameDataPath, "Custom", "AutogenRundown"); if (Directory.Exists(path)) { Directory.Delete(path, recursive: true); } } public static Rundown BuildRundown(Rundown newRundown, bool withFixed = true, bool withUnlocks = true) { Rundown rundown = Rundown.Build(newRundown); List<string> collection = Words.NewLevelNamesPack(); for (int i = 0; i < rundown.TierA_Count; i++) { int num = 1; if (rundown.BuildSeedPool.Count > 0) { num = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num); } Level level = Level.Build(new Level("A") { Name = Generator.Draw(collection), Index = i + 1, BuildSeed = num }); rundown.AddLevel(level); } for (int j = 0; j < rundown.TierB_Count; j++) { int num2 = 1; if (rundown.BuildSeedPool.Count > 0) { num2 = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num2); } Level level2 = Level.Build(new Level("B") { Name = Generator.Draw(collection), Index = j + 1, BuildSeed = num2 }); rundown.AddLevel(level2); } for (int k = 0; k < rundown.TierC_Count; k++) { int num3 = 1; if (rundown.BuildSeedPool.Count > 0) { num3 = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num3); } Level level3 = Level.Build(new Level("C") { Name = Generator.Draw(collection), Index = k + 1, BuildSeed = num3 }); rundown.AddLevel(level3); } if (withFixed) { WardenObjectiveType wardenObjectiveType = WardenObjectiveType.Survival; BuildDirector buildDirector = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = Complex.Tech, Tier = "B", Objective = wardenObjectiveType }; buildDirector.GenPoints(); BuildDirector buildDirector2 = new BuildDirector { Bulkhead = Bulkhead.Extreme, Complex = Complex.Tech, Complexity = Complexity.Low, Tier = "B", Objective = WardenObjectiveType.SpecialTerminalCommand }; buildDirector2.GenPoints(); LevelSettings settings = new LevelSettings("B"); AutogenRundown.DataBlocks.Text text = new AutogenRundown.DataBlocks.Text(DescriptionHeader(wardenObjectiveType) + WardenObjective.GenLevelDescription(wardenObjectiveType)); Level level4 = Level.Build(new Level("B") { Prefix = "<color=orange>X</color><color=#444444>:</color>B", Description = text.PersistentId, Complex = Complex.Tech, MainDirector = buildDirector, SecondaryDirector = buildDirector2, Settings = settings, Index = rundown.TierB_Count }); rundown.AddLevel(level4); } for (int l = 1; l < rundown.TierD_Count + 1; l++) { int num4 = 1; if (rundown.BuildSeedPool.Count > 0) { num4 = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num4); } Level level5 = Level.Build(new Level("D") { Name = Generator.Draw(collection), Index = l + 1, BuildSeed = num4 }); rundown.AddLevel(level5); } for (int m = 0; m < rundown.TierE_Count; m++) { int num5 = 1; if (rundown.BuildSeedPool.Count > 0) { num5 = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num5); } Level level6 = Level.Build(new Level("E") { Name = Generator.Draw(collection), Index = m + 1, BuildSeed = num5 }); rundown.AddLevel(level6); } if (!withUnlocks) { return rundown; } rundown.UseTierUnlockRequirements = true; rundown.ReqToReachTierB.MainSectors = Math.Max(1, rundown.TierA.Count - 1); rundown.ReqToReachTierC.MainSectors = Math.Max(0, rundown.ReqToReachTierB.MainSectors + rundown.TierB.Count - 1); rundown.ReqToReachTierD.MainSectors = Math.Max(0, rundown.ReqToReachTierC.MainSectors + rundown.TierC.Count - 1); rundown.ReqToReachTierE.MainSectors = Math.Max(0, rundown.ReqToReachTierD.MainSectors + rundown.TierD.Count - 1); return rundown; } public static Rundown BuildSeasonalRundown(Rundown newRundown) { Rundown rundown = Rundown.Build(newRundown); List<string> collection = Words.NewLevelNamesPack(); Dictionary<string, List<List<int>>> dictionary = new Dictionary<string, List<List<int>>>(); dictionary.Add("FALL_2025", new List<List<int>> { new List<int> { 1, 1, 1, 1, 1 }, new List<int> { 1, 1, 1, 1, 1, 3 }, new List<int> { 2, 1, 2, 1, 1, 1 }, new List<int> { 1, 1, 1, 1, 2, 2 }, new List<int> { 1, 1, 2, 1 } }); dictionary.TryGetValue(Generator.Seed, out var value); if (value == null) { value = new List<List<int>> { new List<int> { 1, 1, 1, 1, 1 }, new List<int> { 1, 1, 1, 1, 1, 1 }, new List<int> { 1, 1, 1, 1, 1, 1 }, new List<int> { 1, 1, 1, 1, 1, 1 }, new List<int> { 1, 1, 1, 1 } }; } List<(double, int, WardenObjectiveType)> collection2 = new List<(double, int, WardenObjectiveType)> { (1.0, 3, WardenObjectiveType.HsuFindSample), (1.0, 3, WardenObjectiveType.ReactorStartup), (1.0, 3, WardenObjectiveType.ReactorShutdown), (1.0, 2, WardenObjectiveType.GatherSmallItems), (1.0, 2, WardenObjectiveType.ClearPath), (1.0, 1, WardenObjectiveType.SpecialTerminalCommand), (1.0, 2, WardenObjectiveType.RetrieveBigItems), (1.0, 2, WardenObjectiveType.PowerCellDistribution), (1.0, 3, WardenObjectiveType.TerminalUplink), (1.0, 3, WardenObjectiveType.CentralGeneratorCluster), (1.0, 3, WardenObjectiveType.HsuActivateSmall), (1.0, 3, WardenObjectiveType.Survival), (1.0, 2, WardenObjectiveType.GatherTerminal), (1.0, 2, WardenObjectiveType.CorruptedTerminalUplink), (1.0, 2, WardenObjectiveType.TimedTerminalSequence) }; List<(double, int, Complex)> collection3 = new List<(double, int, Complex)> { (1.0, 14, Complex.Mining), (1.0, 14, Complex.Tech), (1.0, 12, Complex.Service) }; List<(double, Bulkhead)> bulkheadChanceTable = new List<(double, Bulkhead)> { (0.2, Bulkhead.Main), (0.3, Bulkhead.Main | Bulkhead.Extreme), (0.25, Bulkhead.Main | Bulkhead.Overload), (0.25, Bulkhead.PrisonerEfficiency) }; rundown.TierA_Count = value[0].Count; rundown.TierB_Count = value[1].Count; rundown.TierC_Count = value[2].Count; rundown.TierD_Count = value[3].Count; rundown.TierE_Count = value[4].Count; for (int i = 0; i < rundown.TierA_Count; i++) { int num = value[0][i]; Generator.AdvanceSequence(num); Complex complex = Generator.DrawSelect(collection3); WardenObjectiveType objective = Generator.DrawSelect(collection2); BuildDirector mainDirector = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex, Tier = "A", Objective = objective }; Level level = Level.Build(new Level("A") { Name = Generator.Draw(collection), Index = i + 1, Complex = complex, MainDirector = mainDirector, BuildSeed = num, BulkheadChanceTable = bulkheadChanceTable }); rundown.AddLevel(level); } for (int j = 0; j < rundown.TierB_Count; j++) { int num2 = value[1][j]; Generator.AdvanceSequence(num2); Complex complex2 = Generator.DrawSelect(collection3); WardenObjectiveType objective2 = Generator.DrawSelect(collection2); BuildDirector mainDirector2 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex2, Tier = "B", Objective = objective2 }; Level level2 = Level.Build(new Level("B") { Name = Generator.Draw(collection), Index = j + 1, Complex = complex2, MainDirector = mainDirector2, BuildSeed = num2, BulkheadChanceTable = bulkheadChanceTable }); rundown.AddLevel(level2); } for (int k = 0; k < rundown.TierC_Count; k++) { int num3 = value[2][k]; Generator.AdvanceSequence(num3); Complex complex3 = Generator.DrawSelect(collection3); WardenObjectiveType objective3 = Generator.DrawSelect(collection2); BuildDirector mainDirector3 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex3, Tier = "C", Objective = objective3 }; Level level3 = Level.Build(new Level("C") { Name = Generator.Draw(collection), Index = k + 1, Complex = complex3, MainDirector = mainDirector3, BuildSeed = num3, BulkheadChanceTable = bulkheadChanceTable }); rundown.AddLevel(level3); } for (int l = 0; l < rundown.TierD_Count; l++) { int num4 = value[3][l]; Generator.AdvanceSequence(num4); Complex complex4 = Generator.DrawSelect(collection3); WardenObjectiveType objective4 = Generator.DrawSelect(collection2); BuildDirector mainDirector4 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex4, Tier = "D", Objective = objective4 }; Level level4 = Level.Build(new Level("D") { Name = Generator.Draw(collection), Index = l + 1, Complex = complex4, MainDirector = mainDirector4, BuildSeed = num4, BulkheadChanceTable = bulkheadChanceTable }); rundown.AddLevel(level4); } for (int m = 0; m < rundown.TierE_Count; m++) { int num5 = value[4][m]; Generator.AdvanceSequence(num5); Complex complex5 = Generator.DrawSelect(collection3); WardenObjectiveType objective5 = Generator.DrawSelect(collection2); BuildDirector mainDirector5 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex5, Tier = "E", Objective = objective5 }; Level level5 = Level.Build(new Level("E") { Name = Generator.Draw(collection), Index = m + 1, Complex = complex5, MainDirector = mainDirector5, BuildSeed = num5, BulkheadChanceTable = bulkheadChanceTable }); rundown.AddLevel(level5); } rundown.UseTierUnlockRequirements = true; rundown.ReqToReachTierB.MainSectors = Math.Max(1, rundown.TierA.Count - 3); rundown.ReqToReachTierC.MainSectors = Math.Max(0, rundown.ReqToReachTierB.MainSectors + rundown.TierB.Count - 3); rundown.ReqToReachTierD.MainSectors = Math.Max(0, rundown.ReqToReachTierC.MainSectors + rundown.TierC.Count - 3); rundown.ReqToReachTierE.MainSectors = Math.Max(0, rundown.ReqToReachTierD.MainSectors + rundown.TierD.Count - 3); rundown.VisualsETier = Color.MenuVisuals_SeasonalE; return rundown; } public static Rundown BuildMonthlyRundown(Rundown newRundown) { Rundown rundown = Rundown.Build(newRundown); List<string> collection = Words.NewLevelNamesPack(); Dictionary<string, List<List<int>>> dictionary = new Dictionary<string, List<List<int>>>(); dictionary.Add("2025_08", new List<List<int>> { new List<int> { 2, 1 }, new List<int> { 1, 1 }, new List<int> { 1, 1, 1, 1 }, new List<int> { 1, 1, 1, 1 }, new List<int> { 1, 2, 1 } }); dictionary.Add("2025_09", new List<List<int>> { new List<int> { 1, 1, 2 }, new List<int> { 1, 1 }, new List<int> { 2, 1, 1, 2 }, new List<int> { 1, 1, 1, 1 }, new List<int> { 1, 1 } }); dictionary.TryGetValue(Generator.Seed, out var value); if (value == null) { value = new List<List<int>> { new List<int> { 2, 1 }, new List<int> { 1, 1, 1 }, new List<int> { 1, 1, 1, 1 }, new List<int> { 2, 1, 1, 1 }, new List<int> { 1, 1 } }; } List<(double, int, WardenObjectiveType)> collection2 = new List<(double, int, WardenObjectiveType)> { (1.0, 3, WardenObjectiveType.HsuFindSample), (1.0, 3, WardenObjectiveType.ReactorStartup), (1.0, 3, WardenObjectiveType.ReactorShutdown), (1.0, 2, WardenObjectiveType.GatherSmallItems), (1.0, 2, WardenObjectiveType.ClearPath), (1.0, 1, WardenObjectiveType.SpecialTerminalCommand), (1.0, 2, WardenObjectiveType.RetrieveBigItems), (1.0, 2, WardenObjectiveType.PowerCellDistribution), (1.0, 3, WardenObjectiveType.TerminalUplink), (1.0, 3, WardenObjectiveType.CentralGeneratorCluster), (1.0, 3, WardenObjectiveType.HsuActivateSmall), (1.0, 3, WardenObjectiveType.Survival), (1.0, 2, WardenObjectiveType.GatherTerminal), (1.0, 2, WardenObjectiveType.CorruptedTerminalUplink), (1.0, 2, WardenObjectiveType.TimedTerminalSequence) }; List<(double, int, Complex)> collection3 = new List<(double, int, Complex)> { (1.0, 10, Complex.Mining), (1.0, 10, Complex.Tech), (0.8, 10, Complex.Service) }; rundown.TierA_Count = value[0].Count; rundown.TierB_Count = value[1].Count; rundown.TierC_Count = value[2].Count; rundown.TierD_Count = value[3].Count; rundown.TierE_Count = value[4].Count; for (int i = 0; i < rundown.TierA_Count; i++) { int num = value[0][i]; Generator.AdvanceSequence(num); Complex complex = Generator.DrawSelect(collection3); WardenObjectiveType objective = Generator.DrawSelect(collection2); BuildDirector mainDirector = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex, Tier = "A", Objective = objective }; Level level = Level.Build(new Level("A") { Name = Generator.Draw(collection), Index = i + 1, Complex = complex, MainDirector = mainDirector, BuildSeed = num }); rundown.AddLevel(level); } for (int j = 0; j < rundown.TierB_Count; j++) { int num2 = value[1][j]; Generator.AdvanceSequence(num2); Complex complex2 = Generator.DrawSelect(collection3); WardenObjectiveType objective2 = Generator.DrawSelect(collection2); BuildDirector mainDirector2 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex2, Tier = "B", Objective = objective2 }; Level level2 = Level.Build(new Level("B") { Name = Generator.Draw(collection), Index = j + 1, Complex = complex2, MainDirector = mainDirector2, BuildSeed = num2 }); rundown.AddLevel(level2); } for (int k = 0; k < rundown.TierC_Count; k++) { int num3 = value[2][k]; Generator.AdvanceSequence(num3); Complex complex3 = Generator.DrawSelect(collection3); WardenObjectiveType objective3 = Generator.DrawSelect(collection2); BuildDirector mainDirector3 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex3, Tier = "C", Objective = objective3 }; Level level3 = Level.Build(new Level("C") { Name = Generator.Draw(collection), Index = k + 1, Complex = complex3, MainDirector = mainDirector3, BuildSeed = num3 }); rundown.AddLevel(level3); } for (int l = 0; l < rundown.TierD_Count; l++) { int num4 = value[3][l]; Generator.AdvanceSequence(num4); Complex complex4 = Generator.DrawSelect(collection3); WardenObjectiveType objective4 = Generator.DrawSelect(collection2); BuildDirector mainDirector4 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex4, Tier = "D", Objective = objective4 }; Level level4 = Level.Build(new Level("D") { Name = Generator.Draw(collection), Index = l + 1, Complex = complex4, MainDirector = mainDirector4, BuildSeed = num4 }); rundown.AddLevel(level4); } for (int m = 0; m < rundown.TierE_Count; m++) { int num5 = value[4][m]; Generator.AdvanceSequence(num5); Complex complex5 = Generator.DrawSelect(collection3); WardenObjectiveType objective5 = Generator.DrawSelect(collection2); BuildDirector mainDirector5 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex5, Tier = "E", Objective = objective5 }; Level level5 = Level.Build(new Level("E") { Name = Generator.Draw(collection), Index = m + 1, Complex = complex5, MainDirector = mainDirector5, BuildSeed = num5 }); rundown.AddLevel(level5); } rundown.UseTierUnlockRequirements = true; rundown.ReqToReachTierB.MainSectors = Math.Max(1, rundown.TierA.Count - 1); rundown.ReqToReachTierC.MainSectors = Math.Max(0, rundown.ReqToReachTierB.MainSectors + rundown.TierB.Count - 1); rundown.ReqToReachTierD.MainSectors = Math.Max(0, rundown.ReqToReachTierC.MainSectors + rundown.TierC.Count - 1); rundown.ReqToReachTierE.MainSectors = Math.Max(0, rundown.ReqToReachTierD.MainSectors + rundown.TierD.Count - 1); rundown.VisualsETier = Color.MenuVisuals_MonthlyE; return rundown; } public static void Build(string dailySeed, string weeklySeed, string monthlySeed, string seasonalSeed) { CleanFolders(); Bins.Setup(); LayoutDefinitions.Setup(); GameSetup gameSetup = new GameSetup { PersistentId = 1u, Name = "Default" }; Generator.SetSeasonSeed(seasonalSeed); Generator.Reload(); string text = Generator.Pick(Words.Adjectives) + " " + Generator.Pick(Words.NounsRundown); Rundown block = BuildSeasonalRundown(new Rundown { PersistentId = Rundown.R_Seasonal, Title = $"{Generator.SeasonalSeason.ToUpper()} '{Generator.SeasonalYear % 100}", StoryTitle = "SEASON " + Generator.DisplaySeed + "\r\nTITLE: " + text.ToUpper() }); Bins.Rundowns.AddBlock(block); Generator.SetMonthSeed(monthlySeed); Generator.Reload(); string text2 = Words.RundownNameMonthly(); Rundown block2 = BuildMonthlyRundown(new Rundown { PersistentId = Rundown.R_Monthly, Title = (text2.ToUpper() ?? ""), StoryTitle = "MONTHLY " + Generator.DisplaySeed + "\r\nTITLE: " + text2.ToUpper() }); Bins.Rundowns.AddBlock(block2); Generator.SetWeeklySeed(weeklySeed); Generator.Reload(); string text3 = Generator.Pick(Words.Adjectives) + " " + Generator.Pick(Words.NounsRundown); bool withUnlocks = false; Rundown rundown = BuildRundown(new Rundown { PersistentId = Rundown.R_Weekly, Title = (text3.ToUpper() ?? ""), StoryTitle = "WEEKLY " + Generator.DisplaySeed + "\r\nTITLE: " + text3.ToUpper() }, withFixed: false, withUnlocks); rundown.VisualsETier = Color.MenuVisuals_WeeklyE; Bins.Rundowns.AddBlock(rundown); Generator.ReadOrSetSeed(dailySeed); Generator.Reload(); string text4 = Generator.Pick(Words.Adjectives) + " " + Generator.Pick(Words.NounsRundown); Rundown rundown2 = BuildRundown(new Rundown { PersistentId = Rundown.R_Daily, Title = (text4.ToUpper() ?? ""), StoryTitle = "DAILY " + Generator.DisplaySeed + "\r\nTITLE: " + text4.ToUpper(), TierA_Count = 1, TierD_Count = 3, TierE_Count = 1 }, withFixed: true, withUnlocks: false); rundown2.VisualsETier = Color.MenuVisuals_DailyE; Bins.Rundowns.AddBlock(rundown2); gameSetup.RundownIdsToLoad = new List<uint> { Rundown.R_Daily, Rundown.R_Monthly, Rundown.R_Weekly, Rundown.R_Daily, Rundown.R_Daily, Rundown.R_Daily, Rundown.R_Daily, Rundown.R_Seasonal }; Bins.GameSetups.AddBlock(gameSetup); Peers.Configure(); Bins.Save(); EnemyCustomization.Ability.Save(); EnemyCustomization.EnemyAbility.Save(); EnemyCustomization.Model.Save(); EnemyCustomization.Projectile.Save(); GlobalConfig.Save(); } } } namespace AutogenRundown.Utils { public class PriorityList { } public class Tags { private HashSet<string> tags = new HashSet<string>(); public Tags(params string[] initialTags) { foreach (string item in initialTags) { tags.Add(item); } } public Tags(Tags previous) { tags = new HashSet<string>(previous.tags); } public bool Add(string tag) { return tags.Add(tag); } public bool Contains(string tag) { return tags.Contains(tag); } public Tags Extend(params string[] tags) { Tags tags2 = new Tags(this); foreach (string tag in tags) { tags2.Add(tag); } return tags2; } public override string ToString() { return "{" + string.Join(", ", tags.ToArray()) + "}"; } } } namespace AutogenRundown.PeerMods { public class Arsenality : SupportedMod { public static string MOD_NAME = "W33B-Arsenality"; public Arsenality() { ModName = "W33B-Arsenality"; } public static void Configure() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown if (Peers.HasMod(MOD_NAME)) { ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(22, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Configuring peer mod: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(MOD_NAME); } logger.LogInfo(val); string pluginData = Path.Combine(Paths.BepInExRootPath, "plugins", MOD_NAME, "arsenality"); int revision = CellBuildData.GetRevision(); string gameData = Path.Combine(Paths.BepInExRootPath, "GameData", $"{revision}"); Directory.CreateDirectory(Path.Combine(gameData, "Custom", "mccad00")); List<string> list = new List<string>(); list.Add(Path.Combine("Custom", "mccad00", "GearPartTransform.json")); list.Add("GameData_ArchetypeDataBlock_bin.json"); list.Add("GameData_GearCategoryDataBlock_bin.json"); list.Add("GameData_GearMeleeHandlePartDataBlock_bin.json"); list.Add("GameData_GearMeleeHeadPartDataBlock_bin.json"); list.Add("GameData_GearMeleeNeckPartDataBlock_bin.json"); list.Add("GameData_GearMeleePommelPartDataBlock_bin.json"); list.Add("GameData_GearSightPartDataBlock_bin.json"); list.Add("GameData_GearStockPartDataBlock_bin.json"); list.Add("GameData_GearToolPayloadPartDataBlock_bin.json"); list.Add("GameData_GearToolScreenPartDataBlock_bin.json"); list.Add("GameData_GearToolTargetingPartDataBlock_bin.json"); list.Add("GameData_MeleeAnimationSetDataBlock_bin.json"); list.Add("GameData_MeleeArchetypeDataBlock_bin.json"); list.Add("GameData_PlayerOfflineGearDataBlock_bin.json"); list.ForEach(delegate(string path) { File.Copy(Path.Combine(pluginData, path), Path.Combine(gameData, path), overwrite: true); }); } } } public class ArsenalityRebalance : SupportedMod { public ArsenalityRebalance() { ModName = "leezurli-ArsenalityRebalance"; } public static void Configure() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown ArsenalityRebalance arsenalityRebalance = new ArsenalityRebalance(); if (!Peers.HasMod(arsenalityRebalance.ModName)) { return; } ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(22, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Configuring peer mod: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(arsenalityRebalance.ModName); } logger.LogInfo(val); arsenalityRebalance.CopyGameDataJson(); string text = Path.Combine(arsenalityRebalance.PluginFolder, "GearPartTransform.json"); string text2 = Path.Combine(arsenalityRebalance.GameDataFolder, "Custom", "mccad00", "GearPartTransform.json"); if (File.Exists(text)) { Directory.CreateDirectory(Path.GetDirectoryName(text2)); File.Copy(text, text2, overwrite: true); ManualLogSource logger2 = Plugin.Logger; BepInExDebugLogInterpolatedStringHandler val2 = new BepInExDebugLogInterpolatedStringHandler(34, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(arsenalityRebalance.ModName); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(": Copied -> GearPartTransform.json"); } logger2.LogDebug(val2); } } } public class Mod { public int ManifestVersion { get; set; } public string Name { get; set; } = ""; public string AuthorName { get; set; } = ""; public string WebsiteUrl { get; set; } = ""; public string DisplayName { get; set; } = ""; public string Description { get; set; } = ""; public string GameVersion { get; set; } = ""; public string NetworkMode { get; set; } = ""; public string PackageType { get; set; } = ""; public string InstallMode { get; set; } = ""; public long InstalledAtTime { get; set; } public List<string> Loaders { get; set; } = new List<string>(); public List<string> Dependencies { get; set; } = new List<string>(); public List<string> Incompatibilities { get; set; } = new List<string>(); public List<string> OptionalDependencies { get; set; } = new List<string>(); public VersionNumber VersionNumber { get; set; } = new VersionNumber(); public bool Enabled { get; set; } public string Icon { get; set; } = ""; } public class SupportedMod { protected string ModName = ""; protected string PluginFolder => Path.Combine(Paths.BepInExRootPath, "plugins", ModName); protected string GameDataFolder => Path.Combine(Paths.BepInExRootPath, "GameData", $"{CellBuildData.GetRevision()}"); protected void CopyGameDataJson() { Directory.GetFiles(Path.Combine(Paths.BepInExRootPath, "plugins", ModName), "GameData_*DataBlock_bin.json", SearchOption.AllDirectories).ToList().ForEach(delegate(string path) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown string fileName = Path.GetFileName(path); File.Copy(path, Path.Combine(GameDataFolder, fileName), overwrite: true); ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(22, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ModName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": Copied datablock -> "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(fileName); } logger.LogDebug(val); }); } protected void CopyCustomMccad00() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown string text = Path.Combine("Custom", "mccad00", "GearPartTransform.json"); string text2 = Path.Combine(PluginFolder, text); string text3 = Path.Combine(GameDataFolder, text); if (File.Exists(text2)) { Directory.CreateDirectory(Path.GetDirectoryName(text3)); File.Copy(text2, text3, overwrite: true); ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(12, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ModName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": Copied -> "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text); } logger.LogDebug(val); } } protected void CopyGearPartTransform() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown string text = "GearPartTransform.json"; string text2 = Path.Combine(PluginFolder, "GearPartTransform.json"); string destFileName = Path.Combine(GameDataFolder, "GearPartTransform.json"); if (File.Exists(text2)) { File.Copy(text2, destFileName, overwrite: true); ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(12, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ModName); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": Copied -> "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text); } logger.LogDebug(val); } } } public class VanillaReloaded : SupportedMod { public VanillaReloaded() { ModName = "tru0067-VanillaReloaded"; } public static void Configure() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown VanillaReloaded vanillaReloaded = new VanillaReloaded(); if (!Peers.HasMod(vanillaReloaded.ModName)) { return; } ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(22, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Configuring peer mod: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(vanillaReloaded.ModName); } logger.LogInfo(val); vanillaReloaded.CopyGameDataJson(); string text = Path.Combine("Custom", "ExtraWeaponCustomization", "VanillaReloaded-ExtraWeaponCustomization.json"); string text2 = Path.Combine(vanillaReloaded.PluginFolder, text); string text3 = Path.Combine(vanillaReloaded.GameDataFolder, text); if (File.Exists(text2)) { Directory.CreateDirectory(Path.GetDirectoryName(text3)); File.Copy(text2, text3, overwrite: true); ManualLogSource logger2 = Plugin.Logger; BepInExDebugLogInterpolatedStringHandler val2 = new BepInExDebugLogInterpolatedStringHandler(12, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(vanillaReloaded.ModName); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(": Copied -> "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(text); } logger2.LogDebug(val2); } } } public class VersionNumber { public int Major { get; set; } public int Minor { get; set; } public int Patch { get; set; } } } namespace AutogenRundown.Patches { [HarmonyPatch] internal static class Artifacts { [HarmonyPatch(typeof(DropServerGameSession), "ConsumeBoosters")] [HarmonyPrefix] internal static bool Pre_DropServerGameSession_ConsumeBoosters() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(28, 0, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Skipping booster consumption"); } logger.LogInfo(val); return false; } } [HarmonyPatch] public class Glowsticks { private const float MaxIntensity = 0.2f; private const double FadeInDuration = 6.0; private const double FadeOutDuration = 12.0; private const double Duration = 75.0; [HarmonyPatch(typeof(GlowstickInstance), "Update")] [HarmonyPrefix] internal static void Pre_GlowstickInstance_Update(GlowstickInstance __instance) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Invalid comparison between Unknown and I4 __instance.s_lightLifeTime = 75f; if ((int)__instance.m_state == 1 && Numeric.ApproxEqual(__instance.m_progression, 0.0)) { __instance.m_progressionSpeed = 1f / 6f; } if ((int)__instance.m_state == 3 && Numeric.ApproxEqual(__instance.m_progression, 1.0)) { __instance.m_progressionSpeed = 1f / 12f; } } [HarmonyPatch(typeof(GlowstickInstance), "Update")] [HarmonyPostfix] internal static void Post_GlowstickInstance_Update(GlowstickInstance __instance) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected I4, but got Unknown if (Plugin.Config_UsePlayerColoredGlowsticks) { ((LightBase)__instance.m_light).Color = ((Item)__instance).Owner.Owner.PlayerColor; eFadeState state = __instance.m_state; switch ((int)state) { case 0: ((LightBase)__instance.m_light).Intensity = 0f; break; case 2: ((LightBase)__instance.m_light).Intensity = 0.2f; break; case 1: case 3: ((LightBase)__instance.m_light).Intensity = __instance.m_progression * 0.2f; break; } } } } [HarmonyPatch(typeof(CM_PageRundown_New), "OnExpeditionUpdated")] [HarmonyPatch(typeof(CM_PageRundown_New), "UpdateVanityItemUnlocks")] public class HideMenuItems { public static void Postfix(CM_PageRundown_New __instance) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0080: 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_00ae: 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_00dc: 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_010a: 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_0138: Unknown result type (might be due to invalid IL or missing references) ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/Rundown/Button VanityItemDrops")).transform.localPosition = Vector3.up * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/Rundown/CM_PageRundown_VanityItemDropsNext")).transform.localPosition = Vector3.up * 2000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/TutorialButton")).transform.localPosition = Vector3.left * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/Button Matchmake All")).transform.localPosition = Vector3.left * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/Button Rundown")).transform.localPosition = Vector3.left * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/Button Discord")).transform.localPosition = Vector3.left * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/ButtonGIF")).transform.localPosition = Vector3.left * 1000f; } } [HarmonyPatch] public class Patch_CentralGeneratorCluster { [HarmonyPrefix] [HarmonyPatch(typeof(LG_DistributionJobUtils), "GetRandomNodeFromZoneForFunction")] public static bool FixGeneratorClusterSpawn(LG_Zone zone, ExpeditionFunction func, float randomValue, ref AIG_CourseNode __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown if ((int)func != 19) { return true; } List<LG_Area> areas = zone.m_areas; List<LG_Area> list = new List<LG_Area>(); Enumerator<LG_Area> enumerator = areas.GetEnumerator(); while (enumerator.MoveNext()) { LG_Area current = enumerator.Current; if (current.GetMarkerSpawnerCount((ExpeditionFunction)19) > 0) { list.Add(current); } } if (list.Count == 0) { return true; } int index = Mathf.Clamp((int)(randomValue * (float)list.Count), 0, list.Count - 1); LG_Area val = list[index]; ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExDebugLogInterpolatedStringHandler val2 = new BepInExDebugLogInterpolatedStringHandler(37, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Selected area for generator cluster: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(val.m_navInfo.m_suffix); } logger.LogDebug(val2); __result = val.m_courseNode; return false; } public static void Setup() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown ServiceMarkerDataBlock block = GameDataBlockBase<ServiceMarkerDataBlock>.GetBlock(11u); bool flag = false; Enumerator<MarkerComposition> enumerator = block.CommonData.Compositions.GetEnumerator(); while (enumerator.MoveNext()) { if (enumerator.Current.prefab == "Assets/GameObject/Floodways_open_1400x1000x1000_V09.prefab") { flag = true; } } if (!flag) { block.CommonData.Compositions.Add(new MarkerComposition { weight = 0f, preppedInstance = null, prefab = "Assets/GameObject/Floodways_open_1400x1000x1000_V09.prefab", function = (ExpeditionFunction)19, Shard = (AssetBundleShard)4 }); ManualLogSource logger = Plugin.Logger; bool flag2 = default(bool); BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(71, 0, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Patched ServiceMarkerDataBlock for Generator Cluster in Complex=Service"); } logger.LogDebug(val); } } } [HarmonyPatch] public class Patch_CM_RundownSelection { private static readonly Color Disabled = new Color { r = 0.04f, g = 0.04f, b = 0.04f, a = 0.0314f }; private static readonly Color Enabled = new Color { r = 0.4f, g = 0.4f, b = 0.4f, a = 0.3137f }; public static Random randomDaily { get; private set; } = new Random(Generator.GetHashCode("Daily_0")); public static Random randomWeekly { get; private set; } = new Random(Generator.GetHashCode("Weekly_0")); public static Random randomMonthly { get; private set; } = new Random(Generator.GetHashCode("Monthly_0")); public static Random randomSeasonal { get; private set; } = new Random(Generator.GetHashCode("Seasonal_0")); [HarmonyPostfix] [HarmonyPatch(typeof(CM_RundownSelection), "Setup")] public static void SetupPostfix(ref CM_RundownSelection __instance) { //IL_0115: 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_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_0177: 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_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: 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_020a: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) string text = ((TMP_Text)__instance.m_rundownText).text; if ((!RundownSelection.R1.Enabled && text == "R1") || (!RundownSelection.R2.Enabled && text == "R2") || (!RundownSelection.R3.Enabled && text == "R3") || (!RundownSelection.R4.Enabled && text == "R4") || (!RundownSelection.R5.Enabled && text == "R5") || (!RundownSelection.R6.Enabled && text == "R6") || (!RundownSelection.R7.Enabled && text == "R7") || (!RundownSelection.R8.Enabled && text == "R8")) { ((TMP_Text)__instance.m_rundownText).text = ""; ((CM_Item)__instance).SetButtonEnabled(false); } if (RundownSelection.R1.Enabled && text == "R1") { Transform transform = ((Component)__instance).transform; transform.localPosition += new Vector3 { x = -10f, y = 10f, z = 0f }; } if (RundownSelection.R2.Enabled && text == "R2") { Transform transform2 = __instance.m_rundownText.transform; transform2.localPosition += new Vector3 { x = 0f, y = -10f, z = 0f }; } if (RundownSelection.R8.Enabled && text == "R8") { Transform transform3 = __instance.m_rundownText.transform; transform3.localPosition += new Vector3 { x = -10f, y = -60f, z = 0f }; } } [HarmonyPrefix] [HarmonyPatch(typeof(GUIX_Layer), "SetColor")] public static bool GUIX_Layer_SetColor_Prefix(GUIX_Layer __instance, ref Color color) { //IL_001f: 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_0048: 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_0071: 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_009a: 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_00c3: 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_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: 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) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) if (!RundownSelection.R1.Enabled && LayerHasParent(__instance, RundownSelection.R1.UnityName)) { color = Disabled; } if (!RundownSelection.R2.Enabled && LayerHasParent(__instance, RundownSelection.R2.UnityName)) { color = Disabled; } if (!RundownSelection.R3.Enabled && LayerHasParent(__instance, RundownSelection.R3.UnityName)) { color = Disabled; } if (!RundownSelection.R4.Enabled && LayerHasParent(__instance, RundownSelection.R4.UnityName)) { color = Disabled; } if (!RundownSelection.R5.Enabled && LayerHasParent(__instance, RundownSelection.R5.UnityName)) { color = Disabled; } if (!RundownSelection.R6.Enabled && LayerHasParent(__instance, RundownSelection.R6.UnityName)) { color = Disabled; } if (!RundownSelection.R7.Enabled && LayerHasParent(__instance, RundownSelection.R7.UnityName)) { color = Disabled; } if (!RundownSelection.R8.Enabled && LayerHasParent(__instance, RundownSelection.R8.UnityName)) { color = Disabled; } return true; } private static void SetRadarColor(GUIX_Layer layer, Color color) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) try { List<Transform> val = CustomExtensions.FindChildrenRecursive(((Component)layer).transform, "radar", false); if (val.Count < 1) { return; } for (int i = 0; i < val.Count - 1; i++) { GUIX_ElementSprite component = ((Component)val[i]).GetComponent<GUIX_ElementSprite>(); if ((Object)(object)component != (Object)null) { component.spriteRenderer.color = color; } } } catch (NullReferenceException) { } } private static void SetLineSubsetColor(GUIX_Layer layer, int count, Color color, Random rng) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) List<Transform> val = CustomExtensions.FindChildrenRecursive(((Component)layer).transform, "Line", false); if (val == null) { return; } int num = 300; List<Transform> range = val.GetRange(num, val.Count - num); for (int num2 = Math.Min(count, range.Count); num2 > 0; num2--) { int num3 = rng.Next(0, range.Count); try { GUIX_ElementSprite component = ((Component)range[num3]).GetComponent<GUIX_ElementSprite>(); if ((Object)(object)component != (Object)null) { component.spriteRenderer.color = color; } } catch (NullReferenceException) { } range.RemoveAt(num3); } } private static bool LayerHasParent(GUIX_Layer layer, string parentName) { Transform val = ((Component)layer).gameObject.transform; while ((Object)(object)val != (Object)null) { if (((Object)val).name == parentName) { return true; } val = val.parent; } return false; } } [HarmonyPatch] public static class Patch_CP_Bioscan_Hud { } [HarmonyPatch] internal static class Patch_LG_ComputerTerminal_Setup { private static List<LevelTerminalPlacements> _levelPlacements = new List<LevelTerminalPlacements>(); public static void Setup() { _levelPlacements = LevelTerminalPlacements.LoadAll(); } [HarmonyPostfix] [HarmonyPatch(typeof(LG_ComputerTerminal), "Setup")] private static void Post_LG_ComputerTerminal_Setup(LG_ComputerTerminal __instance) { //IL_00da: 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_012c: 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_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014e: 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_0161: 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_018a: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: 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_01da: 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_01e7: 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_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Expected O, but got Unknown //IL_023f: Unknown result type (might be due to invalid IL or missing references) ExpeditionInTierData activeExpedition = RundownManager.ActiveExpedition; uint mainLayoutId = ((activeExpedition != null) ? activeExpedition.LevelLayoutData : 0u); LevelTerminalPlacements levelTerminalPlacements = _levelPlacements.Find((LevelTerminalPlacements ltp) => ltp.MainLevelLayout == mainLayoutId); if ((object)levelTerminalPlacements == null || !levelTerminalPlacements.Placements.Any()) { return; } LG_Zone zone = __instance.SpawnNode.m_zone; List<LG_Area> areas = zone.m_areas; LG_Layer layer = zone.m_layer; List<TerminalPosition> list = levelTerminalPlacements.Placements.Where(delegate(TerminalPosition terminal) { //IL_002f: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) string obj = $"Zone_{terminal.LocalIndex}"; eLocalZoneIndex localIndex = zone.LocalIndex; if (obj == ((object)(eLocalZoneIndex)(ref localIndex)).ToString()) { string layer2 = terminal.Layer; LG_LayerType type = layer.m_type; return layer2 == ((object)(LG_LayerType)(ref type)).ToString(); } return false; }).ToList(); if (!list.Any()) { return; } Enumerator<LG_Area> enumerator = areas.GetEnumerator(); bool flag = default(bool); while (enumerator.MoveNext()) { LG_Area area = enumerator.Current; TerminalPosition terminalPosition = list.Find((TerminalPosition terminal) => terminal.HasGeomorphName(((Object)area.m_geomorph).name)); if ((object)terminalPosition != null) { Vector3 val = default(Vector3); val.x = (float)terminalPosition.Position.X; val.y = (float)terminalPosition.Position.Y; val.z = (float)terminalPosition.Position.Z; Vector3 val2 = val; Vector3 val3 = ((Component)area).transform.position + ((Component)area).transform.rotation * val2; Quaternion rotation = ((Component)area).transform.rotation; float num = (float)((double)((Quaternion)(ref rotation)).eulerAngles.x + terminalPosition.Rotation.X); rotation = ((Component)area).transform.rotation; float num2 = (float)((double)((Quaternion)(ref rotation)).eulerAngles.y + terminalPosition.Rotation.Y); rotation = ((Component)area).transform.rotation; Quaternion rotation2 = Quaternion.Euler(num, num2, (float)((double)((Quaternion)(ref rotation)).eulerAngles.z + terminalPosition.Rotation.Z)); ((Component)__instance).transform.position = val3; __instance.m_position = val3; ((Component)__instance).transform.rotation = rotation2; ManualLogSource logger = Plugin.Logger; BepInExInfoLogInterpolatedStringHandler val4 = new BepInExInfoLogInterpolatedStringHandler(38, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("Repositioned Terminal "); ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted<string>(((Object)__instance).name); ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral(" { Position = "); ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted<Vector3>(val3); ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral(" }"); } logger.LogInfo(val4); } } } } [HarmonyPatch] public static class Patch_LG_SecurityDoor { private static List<LevelSecurityDoors> _levelDoors = new List<LevelSecurityDoors>(); public static readonly Dictionary<(string item, int dimension, int layer, int zone), List<string>> map = new Dictionary<(string, int, int, int), List<string>>(); private static bool _isReady = false; private static readonly List<Action> _deferredActions = new List<Action>(); private const string Pattern = "\\[(?<ItemName>[A-Z_]+?)_(?:(?:[^\\d_]*)(?<Dimension>\\d+))_(?:(?:[^\\d_]*)(?<Layer>\\d+))_(?:(?:[^\\d_]*)(?<Zone>\\d+))(?:_(?<InstanceIndex>\\d+))?\\]"; private const string Terminal = "TERMINAL"; private const string Zone = "ZONE"; internal static void Setup() { _levelDoors = LevelSecurityDoors.LoadAll(); LevelAPI.OnBuildDone += delegate { BuildMap(); _isReady = true; _deferredActions.ForEach(delegate(Action action) { action(); }); _deferredActions.Clear(); }; LevelAPI.OnLevelCleanup += delegate { _isReady = false; _deferredActions.Clear(); map.Clear(); }; } public static LevelSecurityDoors? GetDoors() { ExpeditionInTierData activeExpedition = RundownManager.ActiveExpedition; uint mainLayoutId = ((activeExpedition != null) ? activeExpedition.LevelLayoutData : 0u); LevelSecurityDoors levelSecurityDoors = _levelDoors.Find((LevelSecurityDoors lsd) => lsd.MainLevelLayout == mainLayoutId); if ((object)levelSecurityDoors == null) { return null; } if (levelSecurityDoors.Doors.Any()) { return levelSecurityDoors; } return null; } public static List<string> Find((string name, int dimension, int layer, int zone) key) { if (map.TryGetValue(key, out List<string> value)) { return value; } List<string> list = new List<string>(); map.Add(key, list); return list; } internal static void BuildMap() { //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Expected O, but got Unknown //IL_0106: 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_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected I4, but got Unknown //IL_0123: Expected I4, but got Unknown //IL_0123: Expected I4, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected I4, but got Unknown //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected I4, but got Unknown //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected I4, but got Unknown //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Expected I4, but got Unknown //IL_01b3: Expected I4, but got Unknown //IL_01b3: Expected I4, but got Unknown int num = 0; try { Enumerator<string, iTerminalItem> enumerator = LG_LevelInteractionManager.GetAllTerminalInterfaces().GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair<string, iTerminalItem> current = enumerator.Current; object obj; if (current == null) { obj = null; } else { iTerminalItem value = current.Value; obj = ((value != null) ? value.SpawnNode : null); } if (obj == null) { continue; } int num2 = current.Key.LastIndexOf('_'); if (num2 != -1) { string text = current.Key.Substring(0, num2); string item = current.Key.Substring(num2 + 1); if (!(text == "TERMINAL")) { int item2 = (int)current.Value.SpawnNode.m_dimension.DimensionIndex; int item3 = (int)current.Value.SpawnNode.LayerType; int item4 = (int)current.Value.SpawnNode.m_zone.LocalIndex; Find((text, item2, item3, item4)).Add(item); num++; } } } Enumerator<LG_Zone> enumerator2 = Builder.CurrentFloor.allZones.GetEnumerator(); while (enumerator2.MoveNext()) { LG_Zone current2 = enumerator2.Current; Find(("ZONE", (int)current2.DimensionIndex, (int)current2.Layer.m_type, (int)current2.LocalIndex)).Add(current2.Alias.ToString()); num++; Enumerator<LG_ComputerTerminal> enumerator3 = current2.TerminalsSpawnedInZone.GetEnumerator(); while (enumerator3.MoveNext()) { LG_ComputerTerminal current3 = enumerator3.Current; if (current3 != null) { int num3 = current3.m_terminalItem.TerminalItemKey.LastIndexOf('_'); if (num3 != -1) { string item5 = current3.m_terminalItem.TerminalItemKey.Substring(num3 + 1); Find(("TERMINAL", (int)current2.DimensionIndex, (int)current2.Layer.m_type, (int)current2.LocalIndex)).Add(item5); num++; } } } } } catch (Exception ex) { ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(32, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Building map failed with error:\n"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex); } logger.LogError(val); } } public static string ReplaceAll(string input) { if (Utility.IsNullOrWhiteSpace(input)) { return input; } string text = input ?? ""; foreach (Match item in Regex.Matches(input, "\\[(?<ItemName>[A-Z_]+?)_(?:(?:[^\\d_]*)(?<Dimension>\\d+))_(?:(?:[^\\d_]*)(?<Layer>\\d+))_(?:(?:[^\\d_]*)(?<Zone>\\d+))(?:_(?<InstanceIndex>\\d+))?\\]")) { if (item.Success && TryFindSerialNumber(item, out string serialStr)) { text = text.Replace(item.Value, serialStr); } } return text; } public static bool TryFindSerialNumber(Match match, out string serialStr) { //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Expected O, but got Unknown //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Expected O, but got Unknown string value = match.Groups["ItemName"].Value; int num = int.Parse(match.Groups["Dimension"].Value); int num2 = int.Parse(match.Groups["Layer"].Value); int num3 = int.Parse(match.Groups["Zone"].Value); int num4 = (match.Groups["InstanceIndex"].Success ? int.Parse(match.Groups["InstanceIndex"].Value) : 0); bool flag = default(bool); if (map.TryGetValue((value, num, num2, num3), out List<string> value2)) { ManualLogSource logger = Plugin.Logger; BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(41, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[SerialLookupManager] Got to first part: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<List<string>>(value2); } logger.LogInfo(val); if (num4 < value2.Count) { string value3 = value2[num4]; serialStr = $"<color=orange>{value}{((value != "ZONE") ? "_" : " ")}{value3}</color>"; return true; } } serialStr = match.Value; ManualLogSource logger2 = Plugin.Logger; BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(98, 6, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("[SerialLookupManager] No match found (map size = "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(map.Count); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(") for TerminalItem: '"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(value); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("' in (D"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(num); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(", L"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(num2); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(", Z"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(num3); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(") at instance #"); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<int>(num4); } logger2.LogError(val2); return false; } public static string PrintMap() { return GeneralExtensions.Join<string>(map.Select<KeyValuePair<(string, int, int, int), List<string>>, string>((KeyValuePair<(string item, int dimension, int layer, int zone), List<string>> entry) => $"[{entry.Key.item}_{entry.Key.dimension}_{entry.Key.layer}_{entry.Key.zone}] -> [{string.Join(",", entry.Value)}]"), (Func<string, string>)null, "\n"); } [HarmonyPatch(typeof(LG_SecurityDoor_Locks), "OnDoorState")] [HarmonyPostfix] private static void Post_LG_SecurityDoor_Locks_OnDoorState(LG_SecurityDoor_Locks __instance, pDoorState state, bool isDropinState = false) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: 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_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Invalid comparison between Unknown and I4 LG_SecurityDoor_Locks __instance2 = __instance; LevelSecurityDoors doors = GetDoors(); if ((object)doors == null) { return; } _ = __instance2.m_door.Gate.DimensionIndex; LG_LayerType layer = __instance2.m_door.LinksToLayerType; eLocalZoneIndex localIndex = __instance2.m_door.LinkedToZoneData.LocalIndex; SecurityDoor door2 = doors.Doors.Find((SecurityDoor door) => door.Layer == (int)layer && door.ZoneNumber == (int)localIndex); if (door2?.InteractionMessage == null) { return; } eDoorStatus status = state.status; if (status - 4 <= 3) { if (_isReady) { SetMessage(); } else { _deferredActions.Add(SetMessage); } } void SetMessage() { __instance2.m_intOpenDoor.InteractionMessage = ReplaceAll(door2.InteractionMessage); } } } [HarmonyPatch] internal static class Patch_LG_ZoneJob_CreateExpandFromData { [HarmonyPatch(typeof(LG_ZoneJob_CreateExpandFromData), "Build")] [HarmonyFinalizer] public static void Post_LG_ZoneJob_CreateExpandFromData_Build(LG_ZoneJob_CreateExpandFromData __instance, ref Exception? __exception)
GTFO-API.dll
Decompiled 13 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.Linq; using System.Net.Http; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using System.Text.RegularExpressions; using AIGraph; using AssetShards; using BepInEx; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using BepInEx.Unity.IL2CPP.Hook; using BepInEx.Unity.IL2CPP.Utils; using GTFO.API.Attributes; using GTFO.API.Components; using GTFO.API.Extensions; using GTFO.API.Impl; using GTFO.API.JSON; using GTFO.API.JSON.Converters; using GTFO.API.Native; using GTFO.API.Resources; using GTFO.API.Utilities; using GTFO.API.Utilities.Impl; using GTFO.API.Wrappers; using GameData; using Gear; using Globals; using HarmonyLib; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.Attributes; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppInterop.Runtime.Runtime; using Il2CppInterop.Runtime.Runtime.VersionSpecific.Class; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using Il2CppSystem.Reflection; using ItemSetup; using LevelGeneration; using Localization; using Microsoft.CodeAnalysis; using Player; using SNetwork; using UnityEngine; using UnityEngine.Analytics; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("GTFO-API")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.4.1")] [assembly: AssemblyInformationalVersion("0.4.1+git1e8fe81-main")] [assembly: AssemblyProduct("GTFO-API")] [assembly: AssemblyTitle("GTFO-API")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.4.1.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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace GTFO.API { internal static class APILogger { private static readonly ManualLogSource _logger; static APILogger() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown _logger = new ManualLogSource("GTFO-API"); Logger.Sources.Add((ILogSource)(object)_logger); } private static string Format(string module, object msg) { return $"[{module}]: {msg}"; } public static void Info(string module, object data) { _logger.LogMessage((object)Format(module, data)); } public static void Verbose(string module, object data) { } public static void Debug(string module, object data) { _logger.LogDebug((object)Format(module, data)); } public static void Warn(string module, object data) { _logger.LogWarning((object)Format(module, data)); } public static void Error(string module, object data) { _logger.LogError((object)Format(module, data)); } } [API("Asset")] public static class AssetAPI { internal static ConcurrentDictionary<string, Object> s_RegistryCache = new ConcurrentDictionary<string, Object>(); public static ApiStatusInfo Status => APIStatus.Asset; public static event Action OnStartupAssetsLoaded; public static event Action OnAssetBundlesLoaded; public static event Action OnImplReady; public static bool ContainsAsset(string assetName) { string text = assetName.ToUpper(); if (!APIStatus.Asset.Ready) { return s_RegistryCache.ContainsKey(text); } return AssetShardManager.s_loadedAssetsLookup.ContainsKey(text); } public static Object GetLoadedAsset(string path) { string text = path.ToUpper(); APILogger.Verbose("Asset", "Requested Asset: " + text); try { if (!APIStatus.Asset.Ready && s_RegistryCache.TryGetValue(text, out var value)) { return value; } return AssetShardManager.GetLoadedAsset(text, false); } catch { return null; } } public static TAsset GetLoadedAsset<TAsset>(string path) where TAsset : Object { Object loadedAsset = GetLoadedAsset(path); if (loadedAsset == null) { return default(TAsset); } return ((Il2CppObjectBase)loadedAsset).Cast<TAsset>(); } public static void RegisterAsset(string name, Object gameObject) { string text = name.ToUpper(); if (!APIStatus.Asset.Ready) { if (s_RegistryCache.ContainsKey(text)) { throw new ArgumentException("The asset with " + text + " has already been registered.", "name"); } s_RegistryCache.TryAdd(text, gameObject); } else { AssetAPI_Impl.Instance.RegisterAsset(text, gameObject); } } public static void RegisterAssetBundle(AssetBundle bundle) { string[] array = Il2CppArrayBase<string>.op_Implicit((Il2CppArrayBase<string>)(object)bundle.AllAssetNames()); APILogger.Verbose("Asset", "Bundle names: [" + string.Join(", ", array) + "]"); string[] array2 = array; foreach (string text in array2) { Object val = bundle.LoadAsset(text); if (val != (Object)null) { RegisterAsset(text, val); } else { APILogger.Warn("Asset", "Skipping asset " + text); } } } public static void LoadAndRegisterAssetBundle(string pathToBundle) { AssetBundle obj = AssetBundle.LoadFromFile(pathToBundle); if ((Object)(object)obj == (Object)null) { throw new Exception("Failed to load asset bundle"); } RegisterAssetBundle(obj); } public static void LoadAndRegisterAssetBundle(byte[] bundleBytes) { AssetBundle obj = AssetBundle.LoadFromMemory(Il2CppStructArray<byte>.op_Implicit(bundleBytes)); if ((Object)(object)obj == (Object)null) { throw new Exception("Failed to load asset bundle"); } RegisterAssetBundle(obj); } public static Object InstantiateAsset(string assetName, string copyName) { if (ContainsAsset(copyName)) { throw new ArgumentException("The asset you're trying to copy into is already registered", "copyName"); } RegisterAsset(copyName, Object.Instantiate(GetLoadedAsset(assetName) ?? throw new ArgumentException("Couldn't find an asset with the name '" + assetName + "'", "assetName"))); return GetLoadedAsset(copyName); } public static TAsset InstantiateAsset<TAsset>(string assetName, string copyName) where TAsset : Object { Object obj = InstantiateAsset(assetName, copyName); if (obj == null) { return default(TAsset); } return ((Il2CppObjectBase)obj).Cast<TAsset>(); } public static bool TryInstantiateAsset<TAsset>(string assetName, string copyName, out TAsset clonedObj) where TAsset : Object { Object obj = InstantiateAsset(assetName, copyName); clonedObj = ((obj != null) ? ((Il2CppObjectBase)obj).TryCast<TAsset>() : default(TAsset)); return (Object)(object)clonedObj != (Object)null; } private static void OnAssetsLoaded() { if (!APIStatus.Asset.Created) { APIStatus.CreateApi<AssetAPI_Impl>("Asset"); } AssetAPI.OnStartupAssetsLoaded?.Invoke(); } internal static void InvokeImplReady() { AssetAPI.OnImplReady?.Invoke(); } internal static void Setup() { EventAPI.OnAssetsLoaded += OnAssetsLoaded; OnImplReady += LoadAssetBundles; } private static void LoadAssetBundles() { string assetBundlesDir = Path.Combine(Paths.BepInExRootPath, "Assets", "AssetBundles"); string assetBundlesDir2 = Path.Combine(Paths.ConfigPath, "Assets", "AssetBundles"); if (LoadAssetBundles(assetBundlesDir) | LoadAssetBundles(assetBundlesDir2, outdated: true)) { AssetAPI.OnAssetBundlesLoaded?.Invoke(); } } private static bool LoadAssetBundles(string assetBundlesDir, bool outdated = false) { if (outdated) { if (!Directory.Exists(assetBundlesDir)) { return false; } APILogger.Warn("AssetAPI", "Storing asset bundles in the config path is deprecated and will be removed in a future version of GTFO-API. The path has been moved to 'BepInEx\\Assets\\AssetBundles'."); } if (!Directory.Exists(assetBundlesDir)) { Directory.CreateDirectory(assetBundlesDir); return false; } string[] array = (from x in Directory.GetFiles(assetBundlesDir, "*", SearchOption.AllDirectories) where !x.EndsWith(".manifest", StringComparison.InvariantCultureIgnoreCase) select x).ToArray(); if (array.Length == 0) { return false; } for (int i = 0; i < array.Length; i++) { try { LoadAndRegisterAssetBundle(array[i]); } catch (Exception ex) { APILogger.Warn("AssetAPI", $"Failed to load asset bundle '{array[i]}' ({ex.Message})"); } } return true; } } [API("Event")] public static class EventAPI { public static ApiStatusInfo Status => APIStatus.Event; public static event Action OnManagersSetup; public static event Action OnExpeditionStarted; public static event Action OnAssetsLoaded; internal static void Setup() { Global.OnAllManagersSetup += Action.op_Implicit((Action)ManagersSetup); AssetShardManager.OnStartupAssetsLoaded += Action.op_Implicit((Action)AssetsLoaded); RundownManager.OnExpeditionGameplayStarted += Action.op_Implicit((Action)ExpeditionStarted); } private static void ManagersSetup() { EventAPI.OnManagersSetup?.Invoke(); } private static void ExpeditionStarted() { EventAPI.OnExpeditionStarted?.Invoke(); } private static void AssetsLoaded() { EventAPI.OnAssetsLoaded?.Invoke(); } } [API("GameData")] public class GameDataAPI { public static ApiStatusInfo Status => APIStatus.GameData; public static event Action OnGameDataInitialized; static GameDataAPI() { Status.Created = true; Status.Ready = true; } internal static void InvokeGameDataInit() { GameDataAPI.OnGameDataInitialized?.Invoke(); } } [API("Il2Cpp")] public static class Il2CppAPI { public static ApiStatusInfo Status => APIStatus.Il2Cpp; static Il2CppAPI() { Status.Created = true; Status.Ready = true; } public unsafe static void InjectWithInterface<T>() where T : Il2CppObjectBase { //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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_00a0: Expected O, but got Unknown List<INativeClassStruct> list = new List<INativeClassStruct>(); foreach (Il2CppInterfaceAttribute item in GetCustomAttributesInType<T, Il2CppInterfaceAttribute>()) { Il2CppClass* ptr = (Il2CppClass*)(void*)(IntPtr)typeof(Il2CppClassPointerStore<>).MakeGenericType(item.Type).GetField("NativeClassPtr").GetValue(null); IL2CPP.il2cpp_runtime_class_init((IntPtr)ptr); list.Add(UnityVersionHandler.Wrap(ptr)); } RegisterTypeOptions val = new RegisterTypeOptions(); val.set_LogSuccess(true); val.set_Interfaces(Il2CppInterfaceCollection.op_Implicit(list.ToArray())); ClassInjector.RegisterTypeInIl2Cpp<T>(val); } public unsafe static void* GetIl2CppMethod<T>(string methodName, string returnTypeName, bool isGeneric, params string[] argTypes) where T : Il2CppObjectBase { void** ptr = (void**)IL2CPP.GetIl2CppMethod(Il2CppClassPointerStore<T>.NativeClassPtr, isGeneric, methodName, returnTypeName, argTypes).ToPointer(); if (ptr == null) { return ptr; } return *ptr; } public unsafe static TDelegate GetIl2CppMethod<T, TDelegate>(string methodName, string returnTypeName, bool isGeneric, params string[] argTypes) where T : Il2CppObjectBase where TDelegate : Delegate { void* il2CppMethod = GetIl2CppMethod<T>(methodName, returnTypeName, isGeneric, argTypes); if (il2CppMethod == null) { return null; } return Marshal.GetDelegateForFunctionPointer<TDelegate>((IntPtr)il2CppMethod); } public unsafe static INativeDetour CreateGenericDetour<TClass, TDelegate>(string methodName, string returnType, string[] paramTypes, Type[] genericArguments, TDelegate to, out TDelegate original) where TClass : Object where TDelegate : Delegate { //IL_0042: Unknown result type (might be due to invalid IL or missing references) IntPtr nativeClassPtr = Il2CppClassPointerStore<TClass>.NativeClassPtr; if (nativeClassPtr == IntPtr.Zero) { throw new ArgumentException(typeof(TClass).Name + " does not exist in il2cpp domain"); } return INativeDetour.CreateAndApply<TDelegate>(UnityVersionHandler.Wrap((Il2CppMethodInfo*)(void*)IL2CPP.il2cpp_method_get_from_reflection(((Il2CppObjectBase)new MethodInfo(IL2CPP.il2cpp_method_get_object(IL2CPP.GetIl2CppMethod(nativeClassPtr, true, methodName, returnType, paramTypes), nativeClassPtr)).MakeGenericMethod(((IEnumerable<Type>)genericArguments).Select((Func<Type, Type>)Il2CppType.From).ToArray())).Pointer)).MethodPointer, to, ref original); } private static IEnumerable<TAttribute> GetCustomAttributesInType<T, TAttribute>() where TAttribute : Attribute { Type attributeType = typeof(TAttribute); return typeof(T).GetCustomAttributes(attributeType, inherit: true).Union(typeof(T).GetInterfaces().SelectMany((Type interfaceType) => interfaceType.GetCustomAttributes(attributeType, inherit: true))).Distinct() .Cast<TAttribute>(); } } public delegate void LevelDataUpdateEvent(ActiveExpedition activeExp, ExpeditionInTierData expData); public delegate void LevelSelectedEvent(eRundownTier expTier, int expIndexInTier, ExpeditionInTierData expData); [API("Level")] public static class LevelAPI { private static eRundownTier s_LatestExpTier = (eRundownTier)99; private static int s_LatestExpIndex = -1; public static ApiStatusInfo Status => APIStatus.Level; public static event LevelDataUpdateEvent OnLevelDataUpdated; public static event LevelSelectedEvent OnLevelSelected; public static event Action OnBuildStart; public static event Action OnBuildDone; public static event Action OnEnterLevel; public static event Action OnLevelCleanup; internal static void Setup() { Status.Created = true; Status.Ready = true; EventAPI.OnExpeditionStarted += EnterLevel; } internal static void ExpeditionUpdated(pActiveExpedition activeExp, ExpeditionInTierData expData) { //IL_0018: 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_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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_0049: Unknown result type (might be due to invalid IL or missing references) LevelAPI.OnLevelDataUpdated?.Invoke(ActiveExpedition.CreateFrom(activeExp), expData); eRundownTier tier = activeExp.tier; int expeditionIndex = activeExp.expeditionIndex; if (tier != s_LatestExpTier || expeditionIndex != s_LatestExpIndex) { LevelAPI.OnLevelSelected?.Invoke(tier, expeditionIndex, expData); s_LatestExpTier = tier; s_LatestExpIndex = expeditionIndex; } } internal static void BuildStart() { LevelAPI.OnBuildStart?.Invoke(); } internal static void BuildDone() { LevelAPI.OnBuildDone?.Invoke(); } internal static void EnterLevel() { LevelAPI.OnEnterLevel?.Invoke(); } internal static void LevelCleanup() { LevelAPI.OnLevelCleanup?.Invoke(); } } public struct ActiveExpedition { public pPlayer player; public eRundownKey rundownType; public string rundownKey; public eRundownTier tier; public int expeditionIndex; public int hostIDSeed; public int sessionSeed; public static ActiveExpedition CreateFrom(pActiveExpedition pActiveExp) { ActiveExpedition result = default(ActiveExpedition); result.CopyFrom(pActiveExp); return result; } public void CopyFrom(pActiveExpedition pActiveExp) { //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_0013: 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) //IL_0030: Unknown result type (might be due to invalid IL or missing references) player = pActiveExp.player; rundownType = pActiveExp.rundownType; rundownKey = pActiveExp.rundownKey.data; tier = pActiveExp.tier; expeditionIndex = pActiveExp.expeditionIndex; hostIDSeed = pActiveExp.hostIDSeed; sessionSeed = pActiveExp.sessionSeed; } } [API("Localization")] public static class LocalizationAPI { private sealed class Entry { private readonly string?[] m_ValuesByLanguage = new string[12]; private TextDBOptions m_Options; public uint? TextBlockId { get; private set; } private bool TryGetStringInAnyLanguage([NotNullWhen(true)] out string? value) { for (int i = 0; i < m_ValuesByLanguage.Length; i++) { value = m_ValuesByLanguage[i]; if (value != null) { return true; } } value = null; return false; } private bool TryGetStringInLanguage(Language language, [NotNullWhen(true)] out string? value) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Expected I4, but got Unknown int num = language - 1; value = m_ValuesByLanguage[num]; return value != null; } public bool TryGetString(Language language, FallbackValueOptions options, [NotNullWhen(true)] out string? value) { //IL_0001: 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) if (TryGetStringInLanguage(language, out value)) { return true; } if (options.UseFallbackLanguage && TryGetStringInLanguage(options.FallbackLanguage.Value, out value)) { return true; } if (options.UseAnyLanguage && TryGetStringInAnyLanguage(out value)) { return true; } value = null; return false; } private string GetStringForTextDB(Language language, string key, FallbackValueOptions options) { //IL_0001: 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) if (TryGetString(language, options, out string value)) { return value; } ValidateUseKey(key, language, options, "GenerateTextDB"); return key; } [MemberNotNull("TextBlockId")] public void GenerateTextDataBlock(string key, TextDBOptions options, bool force = false) { m_Options = options; GenerateTextDataBlock(key, force); } [MemberNotNull("TextBlockId")] public void GenerateTextDataBlock(string key, bool force = false) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //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_0077: 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_0091: 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_00b9: 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_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0132: 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_015c: 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_0178: Expected O, but got Unknown //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Expected O, but got Unknown //IL_018e: Expected O, but got Unknown if (!TextBlockId.HasValue || force) { FallbackValueOptions options = m_Options.FallbackOptions ?? FallbackValueOptions.AnyLangOrKey; TextDataBlock val = new TextDataBlock { CharacterMetaData = (m_Options.CharacterMetadataId ?? 1) }; ((GameDataBlockBase<TextDataBlock>)val).internalEnabled = true; val.ExportVersion = 1; val.ImportVersion = 1; val.Description = string.Empty; val.English = GetStringForTextDB((Language)1, key, options); val.French = LanguageData.op_Implicit(GetStringForTextDB((Language)2, key, options)); val.Italian = LanguageData.op_Implicit(GetStringForTextDB((Language)3, key, options)); val.German = LanguageData.op_Implicit(GetStringForTextDB((Language)4, key, options)); val.Spanish = LanguageData.op_Implicit(GetStringForTextDB((Language)5, key, options)); val.Russian = LanguageData.op_Implicit(GetStringForTextDB((Language)6, key, options)); val.Portuguese_Brazil = LanguageData.op_Implicit(GetStringForTextDB((Language)7, key, options)); val.Polish = LanguageData.op_Implicit(GetStringForTextDB((Language)8, key, options)); val.Japanese = LanguageData.op_Implicit(GetStringForTextDB((Language)9, key, options)); val.Korean = LanguageData.op_Implicit(GetStringForTextDB((Language)10, key, options)); val.Chinese_Traditional = LanguageData.op_Implicit(GetStringForTextDB((Language)11, key, options)); val.Chinese_Simplified = LanguageData.op_Implicit(GetStringForTextDB((Language)12, key, options)); ((GameDataBlockBase<TextDataBlock>)val).name = key; val.MachineTranslation = false; val.SkipLocalization = false; ((GameDataBlockBase<TextDataBlock>)val).persistentID = 0u; TextDataBlock val2 = val; GameDataBlockBase<TextDataBlock>.AddBlock(val2, -1); TextBlockId = ((GameDataBlockBase<TextDataBlock>)(object)val2).persistentID; } } public bool TryGetString(Language language, string key, FallbackValueOptions options, out string? value) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if (TryGetString(language, options, out value)) { return true; } if (options.UseKey) { value = key; return true; } value = null; return false; } public string GetString(Language language, string key, FallbackValueOptions options) { //IL_0001: 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) if (TryGetString(language, options, out string value)) { return value; } ValidateUseKey(key, language, options, "GetString"); return key; } public string FormatString(Language language, string key, FallbackValueOptions options, object?[] args) { //IL_0001: 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) if (TryGetString(language, options, out string value)) { return string.Format(value, args); } ValidateUseKey(key, language, options, "FormatString"); return key; } public bool HasValueInLanguage(Language language) { //IL_0000: 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) ValidateLanguage(language, "language"); return m_ValuesByLanguage[language - 1] != null; } public void AddValue(Language language, string value, bool force = false) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected I4, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) ArgumentNullException.ThrowIfNull(value, "value"); int num = language - 1; if (num < 0 || num >= m_ValuesByLanguage.Length) { throw new ArgumentOutOfRangeException("language"); } ref string reference = ref m_ValuesByLanguage[num]; if (reference != null && !force) { return; } reference = value; if (TextBlockId.HasValue) { TextDataBlock block = GameDataBlockBase<TextDataBlock>.GetBlock(TextBlockId.Value); if (block != null) { UpdateTextDataBlock(block, language, reference); } } } } [Flags] public enum FallbackValueFlags { None = 0, FallbackLanguage = 1, AnyLanguage = 2, Key = 4, FallbackOrAnyLanguage = 3, FallbackLanguageOrKey = 5, AnyLanguageOrKey = 6, FallbackOrAnyLanguageOrKey = 7 } public readonly struct FallbackValueOptions : IEquatable<FallbackValueOptions> { public static readonly FallbackValueOptions None = default(FallbackValueOptions); public static readonly FallbackValueOptions Key = new FallbackValueOptions(FallbackValueFlags.Key); public static readonly FallbackValueOptions AnyLang = new FallbackValueOptions(FallbackValueFlags.AnyLanguage); public static readonly FallbackValueOptions AnyLangOrKey = new FallbackValueOptions(FallbackValueFlags.AnyLanguageOrKey); public FallbackValueFlags Flags { get; } public Language? FallbackLanguage { get; } public bool UseKey => Flags.HasFlag(FallbackValueFlags.Key); [MemberNotNullWhen(true, "FallbackLanguage")] public bool UseFallbackLanguage { [MemberNotNullWhen(true, "FallbackLanguage")] get { return Flags.HasFlag(FallbackValueFlags.FallbackLanguage); } } public bool UseAnyLanguage => Flags.HasFlag(FallbackValueFlags.AnyLanguage); public FallbackValueOptions(FallbackValueFlags flags, Language? fallbackLanguage = null) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) if (flags.HasFlag(FallbackValueFlags.FallbackLanguage)) { if (!fallbackLanguage.HasValue) { throw new ArgumentNullException("fallbackLanguage", "A fallback language is required if specifying the flag FallbackLanguage"); } ValidateLanguage(fallbackLanguage.Value, "fallbackLanguage"); } Flags = flags; FallbackLanguage = fallbackLanguage; } public override int GetHashCode() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) return HashCode.Combine<FallbackValueFlags, Language>(Flags, FallbackLanguage.GetValueOrDefault()); } public override bool Equals([NotNullWhen(true)] object? obj) { if (obj is FallbackValueOptions other) { return Equals(other); } return false; } public bool Equals(FallbackValueOptions other) { //IL_0020: 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) if (Flags == other.Flags) { return FallbackLanguage == other.FallbackLanguage; } return false; } public FallbackValueOptions IncludeKey() { return new FallbackValueOptions(Flags | FallbackValueFlags.Key, FallbackLanguage); } public FallbackValueOptions ExcludeKey() { return new FallbackValueOptions(Flags & ~FallbackValueFlags.Key, FallbackLanguage); } public FallbackValueOptions IncludeFallbackLanguage(Language language) { //IL_0000: 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) ValidateLanguage(language, "language"); return new FallbackValueOptions(Flags | FallbackValueFlags.FallbackLanguage, language); } public FallbackValueOptions ExcludeFallbackLanguage() { return new FallbackValueOptions(Flags & ~FallbackValueFlags.FallbackLanguage); } public FallbackValueOptions IncludeAnyLanguage() { return new FallbackValueOptions(Flags | FallbackValueFlags.AnyLanguage, FallbackLanguage); } public FallbackValueOptions ExcludeAnyLanguage() { return new FallbackValueOptions(Flags & ~FallbackValueFlags.AnyLanguage, FallbackLanguage); } public FallbackValueOptions Combine(FallbackValueOptions other) { return new FallbackValueOptions(Flags | other.Flags, FallbackLanguage ?? other.FallbackLanguage); } public static bool operator ==(FallbackValueOptions left, FallbackValueOptions right) { return left.Equals(right); } public static bool operator !=(FallbackValueOptions left, FallbackValueOptions right) { return !(left == right); } public static FallbackValueOptions FallbackLang(Language fallbackLanguage) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return new FallbackValueOptions(FallbackValueFlags.FallbackLanguage, fallbackLanguage); } public static FallbackValueOptions FallbackOrAnyLang(Language fallbackLanguage) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return new FallbackValueOptions(FallbackValueFlags.FallbackOrAnyLanguage, fallbackLanguage); } public static FallbackValueOptions FallbackLangOrKey(Language fallbackLanguage) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return new FallbackValueOptions(FallbackValueFlags.FallbackLanguageOrKey, fallbackLanguage); } public static FallbackValueOptions FallbackOrAnyLangOrKey(Language fallbackLanguage) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return new FallbackValueOptions(FallbackValueFlags.FallbackOrAnyLanguageOrKey, fallbackLanguage); } } public struct TextDBOptions { private FallbackValueOptions? m_FallbackOptions; private uint? m_CharacterMetadataId; public uint? CharacterMetadataId { readonly get { return m_CharacterMetadataId; } set { m_CharacterMetadataId = value; } } public FallbackValueOptions? FallbackOptions { readonly get { return m_FallbackOptions; } set { m_FallbackOptions = value; } } } private static readonly Dictionary<string, Entry> s_Entries = new Dictionary<string, Entry>(); private static readonly List<string> s_EntriesToGenerateTextDBs = new List<string>(); private static bool s_GameDataInitialized = false; private static readonly string STR_NoValueFoundExceptionMsg = "No localization value exists for key '{1}' in language '{0}'."; private static readonly string STR_UseKeyGeneric = "{2}: No localization value exists for key '{1}' in language '{0}', defaulting to key."; public static ApiStatusInfo Status => APIStatus.Localization; public static Language CurrentLanguage => Text.TextLocalizationService.CurrentLanguage; public static event Action? OnLanguageChange; internal static void Setup() { GameDataAPI.OnGameDataInitialized += OnGameDataInitialized; EventAPI.OnAssetsLoaded += OnGameAssetsLoaded; Status.Created = true; } internal static void OnGameDataInitialized() { s_GameDataInitialized = true; foreach (string s_EntriesToGenerateTextDB in s_EntriesToGenerateTextDBs) { if (s_Entries.TryGetValue(s_EntriesToGenerateTextDB, out Entry value)) { value.GenerateTextDataBlock(s_EntriesToGenerateTextDB, force: true); } } } internal static void OnGameAssetsLoaded() { Status.Ready = true; } internal static void LanguageChanged() { LocalizationAPI.OnLanguageChange?.Invoke(); } public static string FormatString(string key, params object?[] args) { return FormatString(key, FallbackValueOptions.None, args); } public static string FormatString(string key, Language fallbackLanguage, params object?[] args) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return FormatString(key, FallbackValueOptions.FallbackLang(fallbackLanguage), args); } public static string FormatString(string key, FallbackValueOptions options, params object?[] args) { //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_0030: 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) ValidateLocalizationKey(key, "key"); Language currentLanguage = CurrentLanguage; if (!s_Entries.TryGetValue(key, out Entry value)) { ValidateUseKey(key, currentLanguage, options, "FormatString"); return key; } return value.FormatString(currentLanguage, key, options, args); } public static string GetString(string key) { return GetString(key, FallbackValueOptions.None); } public static string GetString(string key, Language fallbackLanguage) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return GetString(key, FallbackValueOptions.FallbackLang(fallbackLanguage)); } public static string GetString(string key, FallbackValueOptions options) { //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_0030: 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) ValidateLocalizationKey(key, "key"); Language currentLanguage = CurrentLanguage; if (!s_Entries.TryGetValue(key, out Entry value)) { ValidateUseKey(key, currentLanguage, options, "GetString"); return key; } return value.GetString(currentLanguage, key, options); } public static bool TryGetString(string key, [NotNullWhen(true)] out string? value) { return TryGetString(key, FallbackValueOptions.None, out value); } public static bool TryGetString(string key, Language fallbackLanguage, [NotNullWhen(true)] out string? value) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return TryGetString(key, FallbackValueOptions.FallbackLang(fallbackLanguage), out value); } public static bool TryGetString(string key, FallbackValueOptions options, [NotNullWhen(true)] out string? value) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) ValidateLocalizationKey(key, "key"); if (!s_Entries.TryGetValue(key, out Entry value2)) { if (options.UseKey) { value = key; return false; } value = null; return false; } return value2.TryGetString(CurrentLanguage, key, options, out value); } public static bool HasKey([NotNullWhen(true)] string? key) { if (!string.IsNullOrWhiteSpace(key)) { return s_Entries.ContainsKey(key); } return false; } public static bool HasLocalizedValue([NotNullWhen(true)] string? key, Language language) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) if (!string.IsNullOrWhiteSpace(key) && s_Entries.TryGetValue(key, out Entry value)) { return value.HasValueInLanguage(language); } return false; } public static uint GenerateTextBlock(string key, TextDBOptions? textDataBlockOptions = null) { ValidateLocalizationKey(key, "key"); Entry entry = s_Entries[key]; if (entry.TextBlockId.HasValue) { return entry.TextBlockId.Value; } if (textDataBlockOptions.HasValue) { entry.GenerateTextDataBlock(key, textDataBlockOptions.Value); } else { entry.GenerateTextDataBlock(key); } s_EntriesToGenerateTextDBs.Add(key); return entry.TextBlockId.Value; } public static bool TryGetTextBlockId(string key, out uint blockId) { ValidateLocalizationKey(key, "key"); if (!s_Entries.TryGetValue(key, out Entry value) || !value.TextBlockId.HasValue) { blockId = 0u; return false; } blockId = value.TextBlockId.Value; return true; } public static void AddEntry(string key, Language language, string value, TextDBOptions? textDataBlockOptions = null) { //IL_000b: 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) ValidateLocalizationKey(key, "key"); ValidateLanguage(language, "language"); if (value == null) { value = string.Empty; } bool exists; ref Entry valueRefOrAddDefault = ref CollectionsMarshal.GetValueRefOrAddDefault(s_Entries, key, out exists); if (valueRefOrAddDefault == null) { valueRefOrAddDefault = new Entry(); } valueRefOrAddDefault.AddValue(language, value); if (textDataBlockOptions.HasValue && !exists) { s_EntriesToGenerateTextDBs.Add(key); if (s_GameDataInitialized) { valueRefOrAddDefault.GenerateTextDataBlock(key, textDataBlockOptions.Value); } } } public static void LoadFromResources(string baseName, TextDBOptions? textDataBlockOptions = null) { LoadFromResources(baseName, Assembly.GetCallingAssembly(), textDataBlockOptions); } public static void LoadFromResources(string baseName, Assembly assembly, TextDBOptions? textDataBlockOptions = null) { //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_0033: 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) ResourceManager resourceManager = new ResourceManager(baseName, assembly); List<Exception> list = new List<Exception>(); CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); foreach (CultureInfo cultureInfo in cultures) { bool isNeutralCulture = cultureInfo.IsNeutralCulture; Language language = GetLanguage(cultureInfo); if ((int)language == 0) { continue; } ResourceSet resourceSet; try { resourceSet = resourceManager.GetResourceSet(cultureInfo, createIfNotExists: true, tryParents: true); } catch (MissingManifestResourceException) { continue; } catch (Exception item) { list.Add(item); continue; } if (resourceSet == null) { continue; } foreach (DictionaryEntry item2 in resourceSet) { if (!(item2.Key is string text) || !(item2.Value is string value)) { continue; } bool exists; ref Entry valueRefOrAddDefault = ref CollectionsMarshal.GetValueRefOrAddDefault(s_Entries, text, out exists); if (valueRefOrAddDefault == null) { valueRefOrAddDefault = new Entry(); } valueRefOrAddDefault.AddValue(language, value, isNeutralCulture); if (textDataBlockOptions.HasValue && !exists) { s_EntriesToGenerateTextDBs.Add(text); if (s_GameDataInitialized) { valueRefOrAddDefault.GenerateTextDataBlock(text, textDataBlockOptions.Value); } } } } resourceManager.ReleaseAllResources(); if (list.Count > 0) { throw new AggregateException(list); } } private static void ValidateLocalizationKey([NotNull] string key, [CallerArgumentExpression("key")] string? paramName = null) { ArgumentNullException.ThrowIfNull(key, paramName); if (string.IsNullOrWhiteSpace(paramName)) { throw new ArgumentException("Localization key cannot be empty/whitespace", paramName ?? "key"); } } private static void ValidateLanguage(Language language, [CallerArgumentExpression("language")] string? paramName = null) { //IL_0000: 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) if (!Enum.IsDefined<Language>(language)) { throw new ArgumentException($"'{language}' is not a valid language", paramName ?? "language"); } } private static void ValidateUseKey(string key, Language language, FallbackValueOptions options, string useCategory) { //IL_002a: 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) if (!options.UseKey) { throw new KeyNotFoundException(string.Format(STR_NoValueFoundExceptionMsg, language, key)); } APILogger.Warn("LocalizationAPI", string.Format(STR_UseKeyGeneric, language, key, useCategory)); } private static Language GetLanguage(CultureInfo info) { //IL_01af: 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_019c: 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_01a6: 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_017b: 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_017f: Unknown result type (might be due to invalid IL or missing references) //IL_018b: 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_018f: 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_0193: Unknown result type (might be due to invalid IL or missing references) while (!info.IsNeutralCulture) { info = info.Parent; if (string.IsNullOrEmpty(info.Name)) { return (Language)0; } } return (Language)(info.Name switch { "en" => 1, "fr" => 2, "it" => 3, "de" => 4, "es" => 5, "ru" => 6, "pt" => 7, "pl" => 8, "ja" => 9, "ko" => 10, "zh-Hans" => 12, "zh-Hant" => 11, _ => 0, }); } private static void UpdateTextDataBlock(TextDataBlock block, Language language, string text) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected I4, but got Unknown switch (language - 1) { case 0: block.English = text; break; case 1: block.French = LanguageData.op_Implicit(text); break; case 2: block.Italian = LanguageData.op_Implicit(text); break; case 3: block.German = LanguageData.op_Implicit(text); break; case 4: block.Spanish = LanguageData.op_Implicit(text); break; case 5: block.Russian = LanguageData.op_Implicit(text); break; case 6: block.Portuguese_Brazil = LanguageData.op_Implicit(text); break; case 7: block.Polish = LanguageData.op_Implicit(text); break; case 8: block.Japanese = LanguageData.op_Implicit(text); break; case 9: block.Korean = LanguageData.op_Implicit(text); break; case 10: block.Chinese_Traditional = LanguageData.op_Implicit(text); break; case 11: block.Chinese_Simplified = LanguageData.op_Implicit(text); break; } } } [API("Network")] public static class NetworkAPI { internal class CachedEvent { public string EventName { get; set; } public Type PayloadType { get; set; } public object OnReceive { get; set; } public bool IsFreeSize { get; set; } } internal static ConcurrentDictionary<string, CachedEvent> s_EventCache = new ConcurrentDictionary<string, CachedEvent>(); public static ApiStatusInfo Status => APIStatus.Network; public static bool IsEventRegistered(string eventName) { return NetworkAPI_Impl.Instance.EventExists(eventName); } public static void RegisterEvent<T>(string eventName, Action<ulong, T> onReceive) where T : struct { if (!APIStatus.Network.Ready) { if (s_EventCache.ContainsKey(eventName)) { throw new ArgumentException("An event with the name " + eventName + " has already been registered.", "eventName"); } s_EventCache.TryAdd(eventName, new CachedEvent { EventName = eventName, PayloadType = typeof(T), OnReceive = onReceive, IsFreeSize = false }); } else { NetworkAPI_Impl.Instance.RegisterEvent(eventName, onReceive); } } public static void InvokeEvent<T>(string eventName, T payload, SNet_ChannelType channelType = 2) where T : struct { //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) SNet_SendGroup val = default(SNet_SendGroup); SNet_SendQuality val2 = default(SNet_SendQuality); int num = default(int); SNet.GetSendSettings(ref channelType, ref val, ref val2, ref num); SNet.Core.SendBytes(MakeBytes(eventName, payload), val, val2, num); } public static void InvokeEvent<T>(string eventName, T payload, SNet_Player target, SNet_ChannelType channelType = 2) where T : struct { //IL_0019: Unknown result type (might be due to invalid IL or missing references) SNet_SendGroup val = default(SNet_SendGroup); SNet_SendQuality val2 = default(SNet_SendQuality); int num = default(int); SNet.GetSendSettings(ref channelType, ref val, ref val2, ref num); SNet.Core.SendBytes(MakeBytes(eventName, payload), val2, num, target); } public static void InvokeEvent<T>(string eventName, T payload, List<SNet_Player> targets, SNet_ChannelType channelType = 2) where T : struct { //IL_0019: Unknown result type (might be due to invalid IL or missing references) SNet_SendGroup val = default(SNet_SendGroup); SNet_SendQuality val2 = default(SNet_SendQuality); int num = default(int); SNet.GetSendSettings(ref channelType, ref val, ref val2, ref num); SNet.Core.SendBytes(MakeBytes(eventName, payload), val2, num, targets.ToIl2Cpp()); } public static void RegisterFreeSizedEvent(string eventName, Action<ulong, byte[]> onReceiveBytes) { if (!APIStatus.Network.Ready) { if (s_EventCache.ContainsKey(eventName)) { throw new ArgumentException("An event with the name " + eventName + " has already been registered.", "eventName"); } s_EventCache.TryAdd(eventName, new CachedEvent { EventName = eventName, PayloadType = null, OnReceive = onReceiveBytes, IsFreeSize = true }); } else { NetworkAPI_Impl.Instance.RegisterFreeSizedEvent(eventName, onReceiveBytes); } } public static void InvokeFreeSizedEvent(string eventName, byte[] payload, SNet_ChannelType channelType = 2) { //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) SNet_SendGroup val = default(SNet_SendGroup); SNet_SendQuality val2 = default(SNet_SendQuality); int num = default(int); SNet.GetSendSettings(ref channelType, ref val, ref val2, ref num); SNet.Core.SendBytes(MakeBytes(eventName, payload), val, val2, num); } public static void InvokeFreeSizedEvent(string eventName, byte[] payload, SNet_Player target, SNet_ChannelType channelType = 2) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) SNet_SendGroup val = default(SNet_SendGroup); SNet_SendQuality val2 = default(SNet_SendQuality); int num = default(int); SNet.GetSendSettings(ref channelType, ref val, ref val2, ref num); SNet.Core.SendBytes(MakeBytes(eventName, payload), val2, num, target); } public static void InvokeFreeSizedEvent(string eventName, byte[] payload, IEnumerable<SNet_Player> targets, SNet_ChannelType channelType = 2) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) SNet_SendGroup val = default(SNet_SendGroup); SNet_SendQuality val2 = default(SNet_SendQuality); int num = default(int); SNet.GetSendSettings(ref channelType, ref val, ref val2, ref num); SNet.Core.SendBytes(MakeBytes(eventName, payload), val2, num, targets.ToList().ToIl2Cpp()); } private static Il2CppStructArray<byte> MakeBytes<T>(string eventName, T payload) where T : struct { return Il2CppStructArray<byte>.op_Implicit(NetworkAPI_Impl.Instance.MakePacketBytes(eventName, payload)); } private static Il2CppStructArray<byte> MakeBytes(string eventName, byte[] payload) { return Il2CppStructArray<byte>.op_Implicit(NetworkAPI_Impl.Instance.MakeFreeSizedPacketBytes(eventName, payload)); } } [API("Prefab")] public static class PrefabAPI { private static Shader s_CustomGearShader; private static readonly Dictionary<uint, Action<SyringeFirstPerson>> s_SyringeActions = new Dictionary<uint, Action<SyringeFirstPerson>>(); public static ApiStatusInfo Status => APIStatus.Prefab; private static Shader CustomGearShader { get { if ((Object)(object)s_CustomGearShader == (Object)null) { s_CustomGearShader = Shader.Find("Cell/Player/CustomGearShader"); } return s_CustomGearShader; } } public static void CreateConsumable(string assetName, bool enableEmissive = false) { Object loadedAsset = AssetAPI.GetLoadedAsset(assetName); GameObject val = ((loadedAsset != null) ? ((Il2CppObjectBase)loadedAsset).TryCast<GameObject>() : null) ?? null; if ((Object)(object)val == (Object)null) { throw new ArgumentException("Couldn't find a game object asset with the name " + assetName, "assetName"); } ItemEquippable obj = val.AddComponent<ItemEquippable>(); obj.m_isFirstPerson = false; ((Item)obj).m_itemModelHolder = val.transform; ReplaceShaderInAssetMaterials(val, CustomGearShader, enableEmissive ? "ENABLE_EMISSIVE" : null); } public static void CreateConsumablePickup(string assetName, bool enableEmissive = false) { Object loadedAsset = AssetAPI.GetLoadedAsset(assetName); GameObject val = ((loadedAsset != null) ? ((Il2CppObjectBase)loadedAsset).TryCast<GameObject>() : null) ?? null; if ((Object)(object)val == (Object)null) { throw new ArgumentException("Couldn't find a game object asset with the name " + assetName, "assetName"); } BoxCollider componentInChildren = val.GetComponentInChildren<BoxCollider>(); if ((Object)(object)componentInChildren == (Object)null) { throw new Exception("The Consumable Pickup prefab doesn't contain a BoxCollider for interaction"); } GameObject gameObject = ((Component)componentInChildren).gameObject; gameObject.layer = LayerMask.NameToLayer("Interaction"); Interact_Pickup_PickupItem val2 = gameObject.AddComponent<Interact_Pickup_PickupItem>(); ((Interact_Base)val2).m_colliderToOwn = (Collider)(object)componentInChildren; ConsumablePickup_Core obj = val.AddComponent<ConsumablePickup_Core>(); obj.m_syncComp = (Component)(object)val.AddComponent<LG_PickupItem_Sync>(); obj.m_interactComp = (Component)(object)val2; ReplaceShaderInAssetMaterials(val, CustomGearShader, enableEmissive ? "ENABLE_EMISSIVE" : null); } public static void CreateConsumableInstance<T>(string assetName) where T : ConsumableInstance { Object loadedAsset = AssetAPI.GetLoadedAsset(assetName); GameObject obj = ((loadedAsset != null) ? ((Il2CppObjectBase)loadedAsset).TryCast<GameObject>() : null) ?? null; if ((Object)(object)obj == (Object)null) { throw new ArgumentException("Couldn't find a game object asset with the name " + assetName, "assetName"); } if (!ClassInjector.IsTypeRegisteredInIl2Cpp<T>()) { ClassInjector.RegisterTypeInIl2Cpp<T>(); } obj.layer = LayerMask.NameToLayer("Debris"); Rigidbody component = obj.GetComponent<Rigidbody>(); obj.AddComponent<ColliderMaterial>().PhysicsBody = component ?? throw new Exception("The Consumable Instance prefab doesn't contain a Rigidbody"); obj.AddComponent<T>(); } public static void CreateGearComponent(string assetName, bool enableEmissive = false) { Object loadedAsset = AssetAPI.GetLoadedAsset(assetName); GameObject obj = ((loadedAsset != null) ? ((Il2CppObjectBase)loadedAsset).TryCast<GameObject>() : null) ?? null; if ((Object)(object)obj == (Object)null) { throw new ArgumentException("Couldnt find a game object asset with the name " + assetName, "assetName"); } obj.layer = LayerMask.NameToLayer("FirstPersonItem"); ReplaceShaderInAssetMaterials(obj, CustomGearShader, "ENABLE_FPS_RENDERING", enableEmissive ? "ENABLE_EMISSIVE" : null); } public static void CreateSyringe(uint itemPersistentId, Action<SyringeFirstPerson> onUse) { if (s_SyringeActions.ContainsKey(itemPersistentId)) { throw new ArgumentException($"{itemPersistentId} is already registered with a syringe action."); } s_SyringeActions.Add(itemPersistentId, onUse); } internal static bool OnSyringeUsed(SyringeFirstPerson syringe) { if (s_SyringeActions.TryGetValue(((GameDataBlockBase<ItemDataBlock>)(object)((Item)syringe).ItemDataBlock).persistentID, out var value)) { value(syringe); return true; } return false; } private static void ReplaceShaderInAssetMaterials(GameObject asset, Shader newShader, params string[] addedKeywords) { addedKeywords = addedKeywords.Where((string x) => !string.IsNullOrEmpty(x)).ToArray(); foreach (MeshRenderer componentsInChild in asset.GetComponentsInChildren<MeshRenderer>(true)) { foreach (Material item in (Il2CppArrayBase<Material>)(object)((Renderer)componentsInChild).materials) { item.shader = newShader; if (addedKeywords.Length != 0) { string[] array = Il2CppArrayBase<string>.op_Implicit((Il2CppArrayBase<string>)(object)item.shaderKeywords); int num = array.Length; Array.Resize(ref array, array.Length + addedKeywords.Length); for (int i = 0; i < addedKeywords.Length; i++) { array[num + i] = addedKeywords[i]; } item.shaderKeywords = Il2CppStringArray.op_Implicit(array); } } } } } [API("SoundBank")] public static class SoundBankAPI { public static ApiStatusInfo Status => APIStatus.SoundBank; public static event Action OnSoundBanksLoaded; internal static void Setup() { EventAPI.OnManagersSetup += OnLoadSoundBanks; } private static void OnLoadSoundBanks() { FileInfo[] array = (from file in Directory.CreateDirectory(Path.Combine(Paths.BepInExRootPath, "Assets", "SoundBank")).EnumerateFiles() where file.Extension.Contains(".bnk") select file).ToArray(); CollectionExtensions.Do<FileInfo>((IEnumerable<FileInfo>)array, (Action<FileInfo>)LoadBank); if (array.Any()) { SoundBankAPI.OnSoundBanksLoaded?.Invoke(); } } private unsafe static void LoadBank(FileInfo file) { //IL_0046: 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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Invalid comparison between Unknown and I4 //IL_00e2: Unknown result type (might be due to invalid IL or missing references) using FileStream fileStream = file.OpenRead(); uint num = (uint)fileStream.Length; byte[] array = new byte[num]; if (fileStream.Read(array, 0, (int)num) != 0) { void* intPtr = NativeMemory.AlignedAlloc(num, 16u); Unsafe.CopyBlock(ref Unsafe.AsRef<byte>(intPtr), ref array[0], num); uint value = default(uint); AKRESULT val = AkSoundEngine.LoadBank((IntPtr)(nint)intPtr, num, ref value); if ((int)val == 1) { APILogger.Info("SoundBankAPI", $"Loaded sound bank '{file.Name}' (bankId: {value:X2})"); } else { APILogger.Error("SoundBankAPI", $"Error while loading sound bank '{file.Name}' ({val})"); } } } } [BepInPlugin("dev.gtfomodding.gtfo-api", "GTFO-API", "0.4.1")] internal class EntryPoint : BasePlugin { private Harmony m_Harmony; public override void Load() { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown APILogger.Verbose("Core", "Registering API Implementations"); ClassInjector.RegisterTypeInIl2Cpp<NetworkAPI_Impl>(); ClassInjector.RegisterTypeInIl2Cpp<AssetAPI_Impl>(); APILogger.Verbose("Core", "Registering Wrappers"); ClassInjector.RegisterTypeInIl2Cpp<ItemWrapped>(); APILogger.Verbose("Core", "Registering Utilities Implementations"); ClassInjector.RegisterTypeInIl2Cpp<ThreadDispatcher_Impl>(); ClassInjector.RegisterTypeInIl2Cpp<CoroutineDispatcher_Impl>(); APILogger.Verbose("Core", "Applying Patches"); m_Harmony = new Harmony("dev.gtfomodding.gtfo-api"); m_Harmony.PatchAll(); EventAPI.Setup(); AssetAPI.Setup(); SoundBankAPI.Setup(); LevelAPI.Setup(); LocalizationAPI.Setup(); APILogger.Verbose("Core", "Plugin Load Complete"); APILogger.Warn("GTFO-API", "Syringes are currently disabled in this version"); } } [GeneratedCode("VersionInfoGenerator", "2.0.0+git50a4b1a-master")] [CompilerGenerated] internal static class VersionInfo { public const string RootNamespace = "GTFO.API"; public const string Version = "0.4.1"; public const string VersionPrerelease = null; public const string VersionMetadata = "git1e8fe81-main"; public const string SemVer = "0.4.1+git1e8fe81-main"; public const string GitRevShort = "1e8fe81"; public const string GitRevLong = "1e8fe816dac645ea837fe046d35f0b1ec044f6db"; public const string GitBranch = "main"; public const string GitTag = "0.4.0"; public const bool GitIsDirty = false; } } namespace GTFO.API.Wrappers { public class ItemWrapped : Item { private static readonly Item__Get_pItemData Get_pItemDataBase = Il2CppAPI.GetIl2CppMethod<Item, Item__Get_pItemData>("Get_pItemData", "Player.pItemData", isGeneric: false, Array.Empty<string>()); private static readonly Item__Set_pItemData Set_pItemDataBase = Il2CppAPI.GetIl2CppMethod<Item, Item__Set_pItemData>("Set_pItemData", "System.Void", isGeneric: false, new string[1] { "Player.pItemData" }); private static readonly Item__GetCustomData GetCustomDataBase = Il2CppAPI.GetIl2CppMethod<Item, Item__GetCustomData>("GetCustomData", "Player.pItemData_Custom", isGeneric: false, Array.Empty<string>()); private static readonly Item__SetCustomData SetCustomDataBase = Il2CppAPI.GetIl2CppMethod<Item, Item__SetCustomData>("SetCustomData", "System.Void", isGeneric: false, new string[2] { "Player.pItemData_Custom", "System.Boolean" }); private static readonly Item__OnCustomDataUpdated OnCustomDataUpdatedBase = Il2CppAPI.GetIl2CppMethod<Item, Item__OnCustomDataUpdated>("OnCustomDataUpdated", "System.Void", isGeneric: false, new string[1] { "Player.pItemData_Custom" }); private static readonly Item__Awake AwakeBase = Il2CppAPI.GetIl2CppMethod<Item, Item__Awake>("Awake", "System.Void", isGeneric: false, Array.Empty<string>()); private static readonly Item__OnDespawn OnDespawnBase = Il2CppAPI.GetIl2CppMethod<Item, Item__OnDespawn>("OnDespawn", "System.Void", isGeneric: false, Array.Empty<string>()); private static readonly Item__Setup SetupBase = Il2CppAPI.GetIl2CppMethod<Item, Item__Setup>("Setup", "System.Void", isGeneric: false, new string[1] { "GameData.ItemDataBlock" }); private static readonly Item__OnGearSpawnComplete OnGearSpawnCompleteBase = Il2CppAPI.GetIl2CppMethod<Item, Item__OnGearSpawnComplete>("OnGearSpawnComplete", "System.Void", isGeneric: false, Array.Empty<string>()); private static readonly Item__OnPickUp OnPickUpBase = Il2CppAPI.GetIl2CppMethod<Item, Item__OnPickUp>("OnPickUp", "System.Void", isGeneric: false, new string[1] { "Player.PlayerAgent" }); private static readonly Item__SetupBaseModel SetupBaseModelBase = Il2CppAPI.GetIl2CppMethod<Item, Item__SetupBaseModel>("SetupBaseModel", "System.Void", isGeneric: false, new string[1] { "ItemSetup.ItemModelSetup" }); private static readonly Item__SyncedTurnOn SyncedTurnOnBase = Il2CppAPI.GetIl2CppMethod<Item, Item__SyncedTurnOn>("SyncedTurnOn", "System.Void", isGeneric: false, new string[2] { "Player.PlayerAgent", "AIGraph.AIG_CourseNode" }); private static readonly Item__SyncedTurnOff SyncedTurnOffBase = Il2CppAPI.GetIl2CppMethod<Item, Item__SyncedTurnOff>("SyncedTurnOff", "System.Void", isGeneric: false, new string[1] { "Player.PlayerAgent" }); private static readonly Item__SyncedTrigger SyncedTriggerBase = Il2CppAPI.GetIl2CppMethod<Item, Item__SyncedTrigger>("SyncedTrigger", "System.Void", isGeneric: false, new string[1] { "Player.PlayerAgent" }); private static readonly Item__SyncedTriggerSecondary SyncedTriggerSecondaryBase = Il2CppAPI.GetIl2CppMethod<Item, Item__SyncedTriggerSecondary>("SyncedTriggerSecondary", "System.Void", isGeneric: false, new string[1] { "Player.PlayerAgent" }); private static readonly Item__SyncedThrow SyncedThrowBase = Il2CppAPI.GetIl2CppMethod<Item, Item__SyncedThrow>("SyncedThrow", "System.Void", isGeneric: false, new string[1] { "Player.PlayerAgent" }); private static readonly Item__SyncedPickup SyncedPickupBase = Il2CppAPI.GetIl2CppMethod<Item, Item__SyncedPickup>("SyncedPickup", "System.Void", isGeneric: false, new string[1] { "Player.PlayerAgent" }); private static readonly Item__SyncedSetKeyValue SyncedSetKeyValueBase = Il2CppAPI.GetIl2CppMethod<Item, Item__SyncedSetKeyValue>("SyncedSetKeyValue", "System.Void", isGeneric: false, new string[2] { "System.Int32", "System.Single" }); private static readonly Item__GetPickupInteraction GetPickupInteractionBase = Il2CppAPI.GetIl2CppMethod<Item, Item__GetPickupInteraction>("GetPickupInteraction", "Interact_Base", isGeneric: false, Array.Empty<string>()); private static readonly Item__GetItem GetItemBase = Il2CppAPI.GetIl2CppMethod<Item, Item__GetItem>("GetItem", "Item", isGeneric: false, Array.Empty<string>()); public ItemWrapped(IntPtr hdl) : base(hdl) { } public unsafe override pItemData Get_pItemData() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) pItemData* retstr = (pItemData*)stackalloc pItemData[1]; return *Get_pItemDataBase(retstr, ((Il2CppObjectBase)this).Pointer.ToPointer()); } public unsafe override void Set_pItemData(pItemData data) { Set_pItemDataBase(((Il2CppObjectBase)this).Pointer.ToPointer(), &data); } public unsafe override pItemData_Custom GetCustomData() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) return *GetCustomDataBase(((Il2CppObjectBase)this).Pointer.ToPointer()); } public unsafe override void SetCustomData(pItemData_Custom custom, bool sync) { SetCustomDataBase(((Il2CppObjectBase)this).Pointer.ToPointer(), &custom, sync); } public unsafe override void OnCustomDataUpdated(pItemData_Custom customDataCopy) { OnCustomDataUpdatedBase(((Il2CppObjectBase)this).Pointer.ToPointer(), &customDataCopy); } public unsafe override void Awake() { AwakeBase(((Il2CppObjectBase)this).Pointer.ToPointer()); } public unsafe override void OnDespawn() { OnDespawnBase(((Il2CppObjectBase)this).Pointer.ToPointer()); } public unsafe override void Setup(ItemDataBlock data) { SetupBase(((Il2CppObjectBase)this).Pointer.ToPointer(), ((Il2CppObjectBase)data).Pointer.ToPointer()); } public unsafe override void OnGearSpawnComplete() { OnGearSpawnCompleteBase(((Il2CppObjectBase)this).Pointer.ToPointer()); } public unsafe override void OnPickUp(PlayerAgent player) { OnPickUpBase(((Il2CppObjectBase)this).Pointer.ToPointer(), ((Il2CppObjectBase)player).Pointer.ToPointer()); } public unsafe override void SetupBaseModel(ItemModelSetup setup) { SetupBaseModelBase(((Il2CppObjectBase)this).Pointer.ToPointer(), ((Il2CppObjectBase)setup).Pointer.ToPointer()); } public unsafe override void SyncedTurnOn(PlayerAgent agent, AIG_CourseNode courseNode) { SyncedTurnOnBase(((Il2CppObjectBase)this).Pointer.ToPointer(), ((Il2CppObjectBase)agent).Pointer.ToPointer(), ((Il2CppObjectBase)courseNode).Pointer.ToPointer()); } public unsafe override void SyncedTurnOff(PlayerAgent agent) { SyncedTurnOffBase(((Il2CppObjectBase)this).Pointer.ToPointer(), ((Il2CppObjectBase)agent).Pointer.ToPointer()); } public unsafe override void SyncedTrigger(PlayerAgent agent) { SyncedTriggerBase(((Il2CppObjectBase)this).Pointer.ToPointer(), ((Il2CppObjectBase)agent).Pointer.ToPointer()); } public unsafe override void SyncedTriggerSecondary(PlayerAgent agent) { SyncedTriggerSecondaryBase(((Il2CppObjectBase)this).Pointer.ToPointer(), ((Il2CppObjectBase)agent).Pointer.ToPointer()); } public unsafe override void SyncedThrow(PlayerAgent agent) { SyncedThrowBase(((Il2CppObjectBase)this).Pointer.ToPointer(), ((Il2CppObjectBase)agent).Pointer.ToPointer()); } public unsafe override void SyncedPickup(PlayerAgent agent) { SyncedPickupBase(((Il2CppObjectBase)this).Pointer.ToPointer(), ((Il2CppObjectBase)agent).Pointer.ToPointer()); } public unsafe override void SyncedSetKeyValue(int key, float value) { SyncedSetKeyValueBase(((Il2CppObjectBase)this).Pointer.ToPointer(), key, value); } public unsafe override Interact_Base GetPickupInteraction() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown return new Interact_Base((IntPtr)GetPickupInteractionBase(((Il2CppObjectBase)this).Pointer.ToPointer())); } public unsafe override Item GetItem() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown return new Item((IntPtr)GetItemBase(((Il2CppObjectBase)this).Pointer.ToPointer())); } } public unsafe delegate pItemData* Item__Get_pItemData(pItemData* retstr, void* _this); public unsafe delegate void Item__Set_pItemData(void* _this, void* data); public unsafe delegate pItemData_Custom* Item__GetCustomData(void* _this); public unsafe delegate void Item__SetCustomData(void* _this, pItemData_Custom* custom, bool sync); public unsafe delegate void Item__OnCustomDataUpdated(void* _this, pItemData_Custom* customDataCopy); public unsafe delegate void Item__Awake(void* _this); public unsafe delegate void Item__OnDespawn(void* _this); public unsafe delegate void Item__Setup(void* _this, void* data); public unsafe delegate void Item__OnGearSpawnComplete(void* _this); public unsafe delegate void Item__OnPickUp(void* _this, void* player); public unsafe delegate void Item__SetupBaseModel(void* _this, void* setup); public unsafe delegate void Item__SyncedTurnOn(void* _this, void* agent, void* courseNode); public unsafe delegate void Item__SyncedTurnOff(void* _this, void* agent); public unsafe delegate void Item__SyncedTrigger(void* _this, void* agent); public unsafe delegate void Item__SyncedTriggerSecondary(void* _this, void* agent); public unsafe delegate void Item__SyncedThrow(void* _this, void* agent); public unsafe delegate void Item__SyncedPickup(void* _this, void* agent); public unsafe delegate void Item__SyncedSetKeyValue(void* _this, int key, float value); public unsafe delegate void* Item__GetPickupInteraction(void* _this); public unsafe delegate void* Item__GetItem(void* _this); [Il2CppInterface(typeof(iTerminalItem))] public interface iTerminalItemWrapper { uint TerminalItemId { get; set; } string TerminalItemKey { get; set; } string OverrideCode { get; set; } Vector3 LocatorBeaconPosition { get; set; } AIG_CourseNode SpawnNode { get; set; } bool ShowInFloorInventory { get; set; } string FloorItemLocation { get; set; } eFloorInventoryObjectType FloorItemType { get; set; } eFloorInventoryObjectStatus FloorItemStatus { get; set; } Func<List<string>, List<string>> OnWantDetailedInfo { get; set; } void Setup(string key); List<string> GetDetailedInfo(List<string> defaultDetails); void PlayPing(); } [Il2CppInterface(typeof(iResourcePackReceiver))] public interface iResourcePackReceiverWrapper { bool IsLocallyOwned { get; } string InteractionName { get; } bool NeedHealth(); bool NeedDisinfection(); bool NeedWeaponAmmo(); bool NeedToolAmmo(); void GiveAmmoRel(float ammoStandardRel, float ammoSpecialRel, float ammoClassRel); void GiveHealth(float health); void GiveDisinfection(float disinfection); } [Il2CppInterface(typeof(iPlayerPingTarget))] public interface iPlayerPingTargetWrapper { eNavMarkerStyle PingTargetStyle { get; set; } } [Il2CppInterface(typeof(iWardenObjectiveItem))] public interface iWardenObjectiveItemWrapper { LG_LayerType OriginLayer { get; } AIG_CourseNode SpawnNode { get; } string PublicName { get; } Transform transform { get; } bool ObjectiveItemSolved { get; } ePickupItemStatus PickupItemStatus { get; } PlayerAgent PickedUpByPlayer { get; } void ActivateWardenObjectiveItem(); void DeactivateWardenObjectiveItem(); } } namespace GTFO.API.Utilities { public static class CoroutineDispatcher { public static Coroutine StartCoroutine(IEnumerator routine) { return CoroutineDispatcher_Impl.Instance.RunCoroutine(routine); } public static Coroutine StartInLevelCoroutine(IEnumerator routine) { return CoroutineDispatcher_Impl.Instance.RunInLevelCoroutine(routine); } } public delegate void LiveEditEventHandler(LiveEditEventArgs e); public class LiveEditEventArgs { public LiveEditEventType Type { get; set; } public string FullPath { get; set; } public string FileName { get; set; } } public enum LiveEditEventType { Created, Deleted, Renamed, Changed } public static class LiveEdit { internal const int RETRY_COUNT = 5; internal const float RETRY_INTERVAL = 0.1f; internal static readonly List<LiveEditListener> s_Listeners = new List<LiveEditListener>(); public static LiveEditListener CreateListener(string path, string filter, bool includeSubDir) { LiveEditListener liveEditListener = new LiveEditListener(path, filter, includeSubDir); s_Listeners.Add(liveEditListener); return liveEditListener; } public static void TryReadFileContent(string filepath, Action<string> onReaded) { CoroutineDispatcher.StartCoroutine(GetFileStream(filepath, 5, 0.1f, delegate(FileStream stream) { try { using StreamReader streamReader = new StreamReader(stream, Encoding.UTF8); onReaded?.Invoke(streamReader.ReadToEnd()); } catch { } })); } private static IEnumerator GetFileStream(string filepath, int retryCount, float retryInterval, Action<FileStream> onFileStreamOpened) { retryCount = Math.Max(retryCount, 1); retryInterval = Math.Max(retryInterval, 0f); WaitForSecondsRealtime wait = new WaitForSecondsRealtime(retryInterval); for (int i = 0; i < retryCount; i++) { try { FileStream fileStream = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); onFileStreamOpened?.Invoke(fileStream); fileStream.Close(); break; } catch { } yield return wait; } } } public sealed class LiveEditListener : IDisposable { private FileSystemWatcher m_Watcher; private bool m_Allocated = true; private float m_ChangedCooldownTimer; public float FileChangedEventCooldown { get; set; } = 0.05f; public event LiveEditEventHandler FileChanged; public event LiveEditEventHandler FileDeleted; public event LiveEditEventHandler FileCreated; public event LiveEditEventHandler FileRenamed; private LiveEditListener() { } internal LiveEditListener(string path, string filter, bool includeSubDir) { LiveEditListener liveEditListener = this; m_Watcher = new FileSystemWatcher { Path = path, Filter = filter, IncludeSubdirectories = includeSubDir, NotifyFilter = (NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.CreationTime) }; m_Watcher.Deleted += delegate(object sender, FileSystemEventArgs e) { FileSystemEventArgs e5 = e; ThreadDispatcher.Dispatch(delegate { liveEditListener.FileDeleted?.Invoke(CreateArgs(e5, LiveEditEventType.Deleted)); }); }; m_Watcher.Created += delegate(object sender, FileSystemEventArgs e) { FileSystemEventArgs e4 = e; ThreadDispatcher.Dispatch(delegate { liveEditListener.FileCreated?.Invoke(CreateArgs(e4, LiveEditEventType.Created)); }); }; m_Watcher.Renamed += delegate(object sender, RenamedEventArgs e) { RenamedEventArgs e3 = e; ThreadDispatcher.Dispatch(delegate { liveEditListener.FileRenamed?.Invoke(CreateArgs(e3, LiveEditEventType.Renamed)); }); }; m_Watcher.Changed += delegate(object sender, FileSystemEventArgs e) { FileSystemEventArgs e2 = e; ThreadDispatcher.Dispatch(delegate { float time = Time.time; if (!(liveEditListener.m_ChangedCooldownTimer > time)) { liveEditListener.m_ChangedCooldownTimer = time + liveEditListener.FileChangedEventCooldown; liveEditListener.FileChanged?.Invoke(CreateArgs(e2, LiveEditEventType.Changed)); } }); }; m_Watcher.Error += delegate(object sender, ErrorEventArgs e) { APILogger.Error("LiveEdit", $"Path: {path} error reported! - {e.GetException()}"); }; StartListen(); } private static LiveEditEventArgs CreateArgs(FileSystemEventArgs args, LiveEditEventType type) { return new LiveEditEventArgs { FullPath = args.FullPath, FileName = Path.GetFileName(args.FullPath), Type = type }; } public void Dispose() { if (m_Allocated) { LiveEdit.s_Listeners.Remove(this); m_Allocated = false; } if (m_Watcher != null) { StopListen(); this.FileChanged = null; this.FileDeleted = null; this.FileCreated = null; this.FileRenamed = null; m_Watcher.Dispose(); } m_Watcher = null; } public void StopListen() { if (m_Watcher != null) { m_Watcher.EnableRaisingEvents = false; } } public void StartListen() { if (m_Watcher != null) { m_Watcher.EnableRaisingEvents = true; } } } internal static class MemoryUtils { private static byte[] _trampolineShellcode = new byte[12] { 72, 184, 0, 0, 0, 0, 0, 0, 0, 0, 255, 208 }; public unsafe static void* FindSignatureInBlock(void* block, ulong blockSize, string pattern, string mask, ulong sigOffset = 0uL) { return FindSignatureInBlock(block, blockSize, pattern.ToCharArray(), mask.ToCharArray(), sigOffset); } public unsafe static void* FindSignatureInBlock(void* block, ulong blockSize, char[] pattern, char[] mask, ulong sigOffset = 0uL) { for (ulong num = 0uL; num < blockSize; num++) { bool flag = true; for (uint num2 = 0u; num2 < mask.Length; num2++) { if (*(byte*)((long)num + (long)block + num2) != (byte)pattern[num2] && mask[num2] != '?') { flag = false; break; } } if (flag) { return (void*)((ulong)((long)num + (long)block) + sigOffset); } } return null; } public unsafe static byte[] MakeTrampoline(void* destination) { byte[] array = new byte[_trampolineShellcode.Length]; Array.Copy(_trampolineShellcode, 0, array, 0, _trampolineShellcode.Length); fixed (byte* ptr = array) { *(long*)(ptr + 2) = (long)destination; } return array; } public unsafe static void CreateTrampolineBetween(void* start, void* end, void* destination) { ulong num = (ulong)end - (ulong)start; if (num < (ulong)_trampolineShellcode.Length) { throw new Exception("Trampoline block size is not enough to create."); } uint flNewProtect = default(uint); if (!Kernel32.VirtualProtect(start, num, 64u, &flNewProtect)) { throw new Exception("Failed to change protection of trampoline block."); } APILogger.Verbose("MemoryUtils", "NOPing trampoline block"); for (ulong num2 = 0uL; num2 < num; num2++) { *(sbyte*)((ulong)start + num2) = -112; } APILogger.Verbose("MemoryUtils", "Creating trampoline shellcode"); byte[] array = MakeTrampoline(destination); APILogger.Verbose("MemoryUtils", "Writing trampoline shellcode"); for (ulong num3 = 0uL; num3 < (ulong)array.Length; num3++) { *(byte*)((ulong)start + num3) = array[num3]; } if (!Kernel32.VirtualProtect(start, num, flNewProtect, &flNewProtect)) { throw new Exception("Failed to revert trampoline block protection."); } } } public class PersistentData<T> where T : PersistentData<T>, new() { private const string VERSION_REGEX = "\"PersistentDataVersion\": \"(.+?)\""; private static T s_CurrentData; public static T CurrentData { get { if (s_CurrentData != null) { return s_CurrentData; } s_CurrentData = Load(); return s_CurrentData; } set { s_CurrentData = value; } } protected static string persistentPath => Path.Combine(Paths.BepInExRootPath, "GameData", "PersistentData", typeof(T).Assembly.GetName().Name, typeof(T).Name + ".json"); public virtual string PersistentDataVersion { get; set; } = "1.0.0"; public static T Load() { return Load(persistentPath); } public static T Load(string path) { T val = new T(); if (File.Exists(path)) { string text = File.ReadAllText(path); T val2; try { val2 = GTFO.API.JSON.JsonSerializer.Deserialize<T>(text); } catch (JsonException) { APILogger.Warn("JSON", "Failed to deserialize " + typeof(T).Name + ", replacing with default"); string text2 = "FAILED"; Match match = Regex.Match(text, "\"PersistentDataVersion\": \"(.+?)\""); if (match.Success) { text2 = match.Groups[1].Value + "-FAILED"; } File.WriteAllText(Path.ChangeExtension(path, null) + "-" + text2 + ".json", text); val2 = new T(); val2.Save(path); } if (val2.PersistentDataVersion != val.PersistentDataVersion) { val2.Save(Path.ChangeExtension(path, null) + "-" + val2.PersistentDataVersion + ".json"); val.Save(path); } else { val = val2; } } else { val.Save(path); } return val; } public void Save() { Save(persistentPath); } public void Save(string path) { string contents = GTFO.API.JSON.JsonSerializer.Serialize((T)this); string directoryName = Path.GetDirectoryName(path); if (!Directory.Exists(directoryName)) { Directory.CreateDirectory(directoryName); } File.WriteAllText(path, contents); } } public static class RegexUtils { private static readonly Regex s_VectorRegex = new Regex("-?[0-9.]+"); public static bool TryParseVectorString(string input, out float[] vectorArray) { try { MatchCollection matchCollection = s_VectorRegex.Matches(input); int count = matchCollection.Count; if (count < 1) { throw new Exception(); } vectorArray = new float[count]; for (int i = 0; i < count; i++) { Match match = matchCollection[i]; vectorArray[i] = float.Parse(match.Value, CultureInfo.InvariantCulture); } return true; } catch { vectorArray = null; return false; } } } public static class StringUtils { private static readonly uint[] _lookup32 = ((Func<uint[]>)delegate { uint[] array = new uint[256]; for (int i = 0; i < 256; i++) { string text = i.ToString("X2"); if (BitConverter.IsLittleEndian) { array[i] = text[0] + ((uint)text[1] << 16); } else { array[i] = text[1] + ((uint)text[0] << 16); } } return array; })(); private unsafe static readonly uint* _lookup32Ptr = (uint*)(void*)GCHandle.Alloc(_lookup32, GCHandleType.Pinned).AddrOfPinnedObject(); public unsafe static string FromByteArrayAsHex(byte[] bytes) { char[] array = new char[bytes.Length * 2]; fixed (byte* ptr3 = bytes) { fixed (char* ptr = array) { uint* ptr2 = (uint*)ptr; for (int i = 0; i < bytes.Length; i++) { ptr2[i] = _lookup32Ptr[(int)ptr3[i]]; } } } return new string(array); } } public static class ThreadDispatcher { public static void Dispatch(Action action) { ThreadDispatcher_Impl.Instance.EnqueueAction(action); } } } namespace GTFO.API.Utilities.Impl { internal class CoroutineDispatcher_Impl : MonoBehaviour { private bool m_HasInLevelCoroutines; private readonly List<Coroutine> m_InLevelCoroutines; private static CoroutineDispatcher_Impl s_Instance; public static CoroutineDispatcher_Impl Instance { get { if ((Object)(object)s_Instance == (Object)null) { CoroutineDispatcher_Impl coroutineDispatcher_Impl = Object.FindObjectOfType<CoroutineDispatcher_Impl>(); if ((Object)(object)coroutineDispatcher_Impl != (Object)null) { s_Instance = coroutineDispatcher_Impl; } } return s_Instance; } } static CoroutineDispatcher_Impl() { AssetAPI.OnStartupAssetsLoaded += OnAssetsLoaded; } private static void OnAssetsLoaded() { //IL_000e: 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_001a: 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_0032: Expected O, but got Unknown if (!((Object)(object)s_Instance != (Object)null)) { GameObject val = new GameObject(); CoroutineDispatcher_Impl coroutineDispatcher_Impl = val.AddComponent<CoroutineDispatcher_Impl>(); ((Object)val).name = "GTFO-API Coroutine Dispatcher"; ((Object)val).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)val); s_Instance = coroutineDispatcher_Impl; } } private void Update() { if (m_HasInLevelCoroutines && !GameStateManager.IsInExpedition) { m_InLevelCoroutines.ForEach(delegate(Coroutine coroutine) { ((MonoBehaviour)this).StopCoroutine(coroutine); }); m_HasInLevelCoroutines = false; } } [HideFromIl2Cpp] internal Coroutine RunCoroutine(IEnumerator routine) { return MonoBehaviourExtensions.StartCoroutine((MonoBehaviour)(object)this, routine); } [HideFromIl2Cpp] internal Coroutine RunInLevelCoroutine(IEnumerator routine) { if (!GameStateManager.IsInExpedition) { APILogger.Error("CoroutineDispatcher", "Cannot run InLevelCoroutine while you're not in level!"); return null; } Coroutine val = MonoBehaviourExtensions.StartCoroutine((MonoBehaviour)(object)this, routine); m_InLevelCoroutines.Add(val); m_HasInLevelCoroutines = true; return val; } } internal class ThreadDispatcher_Impl : MonoBehaviour { private readonly Queue<Action> s_ActionQueue = new Queue<Action>(); private static ThreadDispatcher_Impl s_Instance; public static ThreadDispatcher_Impl Instance { get { if ((Object)(object)s_Instance == (Object)null) { ThreadDispatcher_Impl threadDispatcher_Impl = Object.FindObjectOfType<ThreadDispatcher_Impl>(); if ((Object)(object)threadDispatcher_Impl != (Object)null) { s_Instance = threadDispatcher_Impl; } } return s_Instance; } } public ThreadDispatcher_Impl(IntPtr intPtr) : base(intPtr) { } static ThreadDispatcher_Impl() { AssetAPI.OnStartupAssetsLoaded += OnAssetsLoaded; } private static void OnAssetsLoaded() { //IL_000e: 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_001a: 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_0032: Expected O, but got Unknown if (!((Object)(object)s_Instance != (Object)null)) { GameObject val = new GameObject(); ThreadDispatcher_Impl threadDispatcher_Impl = val.AddComponent<ThreadDispatcher_Impl>(); ((Object)val).name = "GTFO-API Thread Dispatcher"; ((Object)val).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)val); s_Instance = threadDispatcher_Impl; } } [HideFromIl2Cpp] internal void EnqueueAction(Action action) { lock (s_ActionQueue) { s_ActionQueue.Enqueue(action); } } internal void Update() { lock (s_ActionQueue) { while (s_ActionQueue.Count > 0) { s_ActionQueue.Dequeue()?.Invoke(); } } } } } namespace GTFO.API.Resources { public class ApiStatusInfo { public bool Created { get; internal set; } public bool Ready { get; internal set; } } public static class APIStatus { private static GameObject s_ScriptHolder; public static ApiStatusInfo Asset { get; internal set; } = new ApiStatusInfo(); public static ApiStatusInfo Event { get; internal set; } = new ApiStatusInfo(); public static ApiStatusInfo GameData { get; internal set; } = new ApiStatusInfo(); public static ApiStatusInfo Localization { get; internal set; } = new ApiStatusInfo(); public static ApiStatusInfo Il2Cpp { get; internal set; } = new ApiStatusInfo(); public static ApiStatusInfo Level { get; internal set; } = new ApiStatusInfo(); public static ApiStatusInfo Network { get; internal set; } = new ApiStatusInfo(); public static ApiStatusInfo Prefab { get; internal set; } = new ApiStatusInfo(); public static ApiStatusInfo SoundBank { get; internal set; } = new ApiStatusInfo(); internal static GameObject ScriptHolder { get { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown if ((Object)(object)s_ScriptHolder == (Object)null) { s_ScriptHolder = new GameObject(); ((Object)s_ScriptHolder).name = "GTFO-API Script Holder"; ((Object)s_ScriptHolder).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)s_ScriptHolder); } return s_ScriptHolder; } } internal static void CreateApi<T>(string apiName) where T : Component { ApiStatusInfo apiStatusInfo = (ApiStatusInfo)(typeof(APIStatus).GetProperty(apiName)?.GetValue(null)); if (apiStatusInfo == null) { throw new ArgumentException("Couldn't find API status for " + apiName, "apiName"); } if (!apiStatusInfo.Created && !((Object)(object)ScriptHolder.GetComponent<T>() != (Object)null)) { APILogger.Verbose("Core", "Creating API " + apiName); ScriptHolder.AddComponent<T>(); apiStatusInfo.Created = true; } } } internal static class RuntimeData { public static Dictionary<InventorySlot, string[]> BotFavorites; } public static class ShaderConstants { public const string CUSTOM_GEAR_SHADER = "Cell/Player/CustomGearShader"; } public static class NetworkConstants { public const string Magic = "GAPI_KSQK"; public const byte MagicSize = 9; public const ulong VersionSignature = 18374688171108015565uL; } } namespace GTFO.API.Patches { [HarmonyPatch(typeof(CellSettingsApply), "ApplyLanguage")] internal static class ApplyLanguage_Patches { private static bool s_LanguageChanged; [HarmonyWrapSafe] public static void Prefix(int value) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 s_LanguageChanged = (int)Text.TextLocalizationService.CurrentLanguage != value; } [HarmonyWrapSafe] public static void Postfix() { if (s_LanguageChanged) { LocalizationAPI.LanguageChanged(); } } } [HarmonyPatch(typeof(AssetShardManager))] internal class AssetShardManager_Patches { [HarmonyPatch("Setup")] [HarmonyWrapSafe] [HarmonyPostfix] public static void Setup_Postfix() { if (!APIStatus.Asset.Created) { APIStatus.CreateApi<AssetAPI_Impl>("Asset"); } } } [HarmonyPatch(typeof(Builder))] internal class Builder_Patches { [HarmonyPatch("Build")] [HarmonyWrapSafe] [HarmonyPostfix] private static void BuildStart_Postfix() { LevelAPI.BuildStart(); } [HarmonyPatch("BuildDone")] [HarmonyWrapSafe] [HarmonyPostfix] private static void BuildDone_Postfix() { LevelAPI.BuildDone(); } } [HarmonyPatch(typeof(GameDataInit))] internal class GameDataInit_Patches { private struct PluginWhitelistInfo { public string GUID; public string Name; public string Version; public string Checksum; } private static PluginWhitelistInfo[] FetchPluginWhitelist() { using HttpClient httpClient = new HttpClient(); using Stream stream = httpClient.GetStreamAsync("https://raw.githubusercontent.com/GTFO-Modding/GTFO-API-PluginWhitelist/main/whitelist.txt").GetAwaiter().GetResult(); using StreamReader streamReader = new StreamReader(stream); string[] array = streamReader.ReadToEnd().Split('\n', StringSplitOptions.RemoveEmptyEntries); PluginWhitelistInfo[] array2 = new PluginWhitelistInfo[array.Length]; for (int i = 0; i < array2.Length; i++) { string[] array3 = array[i].Split(":"); array2[i] = new PluginWhitelistInfo { GUID = array3[0], Name = array3[1], Version = array3[2], Checksum = array3[3].TrimEnd('\r') }; } return array2; } [HarmonyPatch("Initialize")] [HarmonyWrapSafe] [HarmonyPostfix] public static void Initialize_Postfix() { Analytics.enabled = false; GameDataAPI.InvokeGameDataInit(); if (!APIStatus.Network.Created) { APIStatus.CreateApi<NetworkAPI_Impl>("Network"); } } private static void RemoveRequirementFromList(List<ExpeditionInTierData> list) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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) //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_0026: Invalid comparison between Unknown and I4 Enumerator<ExpeditionInTierData> enumerator = list.GetEnumerator(); while (enumerator.MoveNext()) { ExpeditionInTierData current = enumerator.Current; if (current.Enabled) { eExpeditionAccessibility accessibility = current.Accessibility; if ((int)accessibility == 0 || accessibility - 4 <= 1) { current.Accessibility = (eExpeditionAccessibility)2; } } } } } [HarmonyPatch(typeof(GearManager))] internal static class GearManager_Patches { private unsafe delegate IntPtr ReadFromDiskDelegate(IntPtr path, byte* createNew, Il2CppMethodInfo* methodInfo); private unsafe delegate void SaveToDiskDelegate(IntPtr path, IntPtr obj, Il2CppMethodInfo* methodInfo); private static bool m_PatchApplied; private static INativeDetour s_ReadFromDiskDetour; private static ReadFromDiskDelegate s_ReadFromDiskOriginal; private static INativeDetour s_SaveToDiskDetour; private static SaveToDiskDelegate s_SaveToDiskOriginal; private static string FavoritesDirectory => Path.Combine(Paths.BepInExRootPath, "GameData", "Favorites"); private static string FavoritePath => Path.Combine(FavoritesDirectory, "Gear.json"); private static string BotFavoritePath => Path.Combine(FavoritesDirectory, "BotGear.json"); [HarmonyPatch("Setup")] [HarmonyWrapSafe] [HarmonyPrefix] private unsafe static void Setup_Prefix() { if (!m_PatchApplied) { if (!Directory.Exists(FavoritesDirectory)) { Directory.CreateDirectory(FavoritesDirectory); } string methodName = "SaveToDisk"; APILogger.Verbose("GearManager_Patches", "Applying ReadFromDisk Patch"); s_ReadFromDiskDetour = Il2CppAPI.CreateGenericDetour<CellJSON, ReadFromDiskDelegate>("ReadFromDisk", "T", new string[2] { typeof(string).FullName, typeof(bool).MakeByRefType().FullName }, new Type[1] { typeof(GearFavoritesData) }, (ReadFromDiskDelegate)Patch_ReadFromDisk, out s_ReadFromDiskOriginal); APILogger.Verbose("GearManager_Patches", "Applying SaveToDisk Patch"); s_SaveToDiskDetour = Il2CppAPI.CreateGenericDetour<CellJSON, SaveToDiskDelegate>(methodName, typeof(void).FullName, new string[2] { typeof(string).FullName, "T" }, new Type[1] { typeof(GearFavoritesData) }, (SaveToDiskDelegate)Patch_SaveToDisk, out s_SaveToDiskOriginal); m_PatchApplied = true; } } private unsafe static IntPtr Patch_ReadFromDisk(IntPtr path, byte* createNew, Il2CppMethodInfo* methodInfo) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown string text = String.op_Implicit(new String(path)); if (text.EndsWith("GTFO_Favorites.txt", StringComparison.OrdinalIgnoreCase)) { return s_ReadFromDiskOriginal(IL2CPP.ManagedStringToIl2Cpp(FavoritePath), createNew, methodInfo); } if (text.EndsWith("GTFO_BotFavorites.txt", StringComparison.OrdinalIgnoreCase)) { return s_ReadFromDiskOriginal(IL2CPP.ManagedStringToIl2Cpp(BotFavoritePath), createNew, methodInfo); } return s_ReadFromDiskOriginal(path, createNew, methodInfo); } private unsafe static void Patch_SaveToDisk(IntPtr path, IntPtr favData, Il2CppMethodInfo* methodInfo) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown string text = String.op_Implicit(new String(path)); if (text.EndsWith("GTFO_Favorites.txt", StringComparison.OrdinalIgnoreCase)) { s_SaveToDiskOriginal(IL2CPP.ManagedStringToIl2Cpp(FavoritePath), favData, methodInfo); } else if (text.EndsWith("GTFO_BotFavorites.txt", StringComparison.OrdinalIgnoreCase)) { s_SaveToDiskOriginal(IL2CPP.ManagedStringToIl2Cpp(BotFavoritePath), favData, methodInfo); if (File.Exists(text)) { File.Delete(text); } } else { s_SaveToDiskOriginal(path, favData, methodInfo); } } } [HarmonyPatch(typeof(Global))] internal class Global_Patches { [HarmonyPatch("OnLevelCleanup")] [HarmonyWrapSafe] [HarmonyPostfix] private static void LevelCleanup_Postfix() { LevelAPI.LevelCleanup(); } } [HarmonyPatch(typeof(RundownManager))] internal class RundownManager_Patches { [HarmonyPatch("SetActiveExpedition")] [HarmonyWrapSafe] [HarmonyPostfix] private static void SetActiveExpedition_Postfix(pActiveExpedition expPackage, ExpeditionInTierData expTierData) { LevelAPI.ExpeditionUpdated(expPackage, expTierData); } } [HarmonyPatch(typeof(SNet_Replication))] internal class SNet_Replication_Patches { [HarmonyPatch("RecieveBytes")] [HarmonyWrapSafe] [HarmonyPrefix] public static bool RecieveBytes_Prefix(Il2CppStructArray<byte> bytes, uint size, ulong messagerID) { if (size < 12) { return true; } byte[] array = Il2CppArrayBase<byte>.op_Implicit((Il2CppArrayBase<byte>)(object)bytes); ushort num = BitConverter.ToUInt16(array, 0); if (NetworkAPI_Impl.Instance.m_ReplicatorKey == num) { string @string = Encoding.ASCII.GetString(array, 2, 9); if (@string != "GAPI_KSQK") { APILogger.Verbose("NetworkApi", $"Received invalid magic from {messagerID} ({@string} != {9})."); return true; } ulong num2 = BitConverter.ToUInt64(array, 11); if ((num2 & 0xFF00000000000000uL) != 18374686479671623680uL) { APILogger.Verbose("NetworkApi", $"Received invalid version signature from {messagerID}."); return true; } if (num2 != NetworkAPI_Impl.Instance.m_Signature) { APILogger.Error("NetworkApi", $"Received incompatible version signature, cannot unmask packet. Is {messagerID} on the same version?. ({num2} != {NetworkAPI_Impl.Instance.m_Signature})"); return false; } ushort num3 = BitConverter.ToUInt16(array, 19); string string2 = Encoding.UTF8.GetString(array, 21, num3); if (!NetworkAPI.IsEventRegistered(string2)) { APILogger.Error("NetworkApi", $"{messagerID} invoked an event {string2} which isn't registered."); return false; } NetworkAPI_Impl.Instance.HandlePacket(string2, messagerID, array, 21 + num3); return false; } return true; } } } namespace GTFO.API.Patches.Native { internal class SyringeFirstPerson_Patch : NativePatch<SyringeFirstPerson_Patch.SyringeUsedDelegate> { [UnmanagedFunctionPointer(CallingConvention.FastCall)] public unsafe delegate eSyringeType SyringeUsedDelegate(void* pSyringe); public unsafe override void* MethodPtr => Il2CppAPI.GetIl2CppMethod<_ApplySyringe_d__18>("MoveNext", "System.Boolean", isGeneric: false, Array.Empty<string>()); public override string JmpStartSig => "Æ\u0081\u00b4\0\0\0\u0001\u008b\u0087Ð\u0001\0\0\u0085À"; public override string JmpStartMask => "xxxxxxxxxxxxxxx"; public override byte[] CodeCave => new byte[10] { 198, 129, 180, 0, 0, 0, 1, 72, 137, 249 }; public override uint TrampolineSize => 13u; public unsafe override SyringeUsedDelegate To => OnSyringeApplyEffect; public unsafe static eSyringeType OnSyringeApplyEffect(void* pSyringe) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) SyringeFirstPerson val = new SyringeFirstPerson(new IntPtr(pSyringe)); if (PrefabAPI.OnSyringeUsed(val)) { return (eSyringeType)(-1); } return val.m_type; } } } namespace GTFO.API.Native { internal static class Kernel32 { [DllImport("kernel32.dll")] public unsafe static extern void* VirtualAlloc(void* lpAddress, ulong dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll")] public unsafe static extern bool VirtualProtect(void* lpAddress, ulong dwSize, uint flNewProtect, uint* lpflOldProtect); } internal static class MSVCRT { [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern void* memcpy(void* destination, void* source, long num); } public abstract class NativePatch<T> where T : Delegate { private static readonly byte[] s_CodeCaveHeader = new byte[4] { 72, 131, 236, 40 }; private static readonly byte[] s_CodeCaveFooter = new byte[17] { 72, 184, 0, 0, 0, 0, 0, 0, 0, 0, 255, 208, 72, 131,
YamlDotNet.dll
Decompiled 13 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.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.Runtime.Versioning; using System.Text; using System.Text.RegularExpressions; using System.Threading; using Microsoft.CodeAnalysis; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.ObjectPool; 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("16.3.0.0")] [assembly: AssemblyInformationalVersion("16.3.0")] [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: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyVersion("16.0.0.0")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace YamlDotNet { internal sealed class CultureInfoAdapter : CultureInfo { private readonly IFormatProvider provider; public CultureInfoAdapter(CultureInfo baseCulture, IFormatProvider provider) : base(baseCulture.Name) { this.provider = provider; } public override object GetFormat(Type? formatType) { return provider.GetFormat(formatType); } } internal static class Polyfills { } internal static class PropertyInfoExtensions { public static object? ReadValue(this PropertyInfo property, object target) { return property.GetValue(target, null); } } internal static class ReflectionExtensions { private static readonly Func<PropertyInfo, bool> IsInstance = (PropertyInfo property) => !(property.GetMethod ?? property.SetMethod).IsStatic; private static readonly Func<PropertyInfo, bool> IsInstancePublic = (PropertyInfo property) => IsInstance(property) && (property.GetMethod ?? property.SetMethod).IsPublic; public static Type? BaseType(this Type type) { return type.GetTypeInfo().BaseType; } public static bool IsValueType(this Type type) { return type.GetTypeInfo().IsValueType; } public static bool IsGenericType(this Type type) { return type.GetTypeInfo().IsGenericType; } public static bool IsGenericTypeDefinition(this Type type) { return type.GetTypeInfo().IsGenericTypeDefinition; } public static Type? GetImplementationOfOpenGenericInterface(this Type type, Type openGenericType) { if (!openGenericType.IsGenericType || !openGenericType.IsInterface) { throw new ArgumentException("The type must be a generic type definition and an interface", "openGenericType"); } if (IsGenericDefinitionOfType(type, openGenericType)) { return type; } return type.FindInterfaces((Type t, object? context) => IsGenericDefinitionOfType(t, context), openGenericType).FirstOrDefault(); static bool IsGenericDefinitionOfType(Type t, object? context) { if (t.IsGenericType) { return t.GetGenericTypeDefinition() == (Type)context; } return false; } } public static bool IsInterface(this Type type) { return type.GetTypeInfo().IsInterface; } public static bool IsEnum(this Type type) { return type.GetTypeInfo().IsEnum; } public static bool IsRequired(this MemberInfo member) { return member.GetCustomAttributes(inherit: true).Any((object x) => x.GetType().FullName == "System.Runtime.CompilerServices.RequiredMemberAttribute"); } public static bool HasDefaultConstructor(this Type type, bool allowPrivateConstructors) { BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public; if (allowPrivateConstructors) { bindingFlags |= BindingFlags.NonPublic; } if (!type.IsValueType) { return type.GetConstructor(bindingFlags, null, Type.EmptyTypes, null) != null; } return true; } public static bool IsAssignableFrom(this Type type, Type source) { return type.IsAssignableFrom(source.GetTypeInfo()); } public static bool IsAssignableFrom(this Type type, TypeInfo source) { return type.GetTypeInfo().IsAssignableFrom(source); } public static TypeCode GetTypeCode(this Type type) { if (type.IsEnum()) { type = Enum.GetUnderlyingType(type); } if (type == typeof(bool)) { return TypeCode.Boolean; } if (type == typeof(char)) { return TypeCode.Char; } if (type == typeof(sbyte)) { return TypeCode.SByte; } if (type == typeof(byte)) { return TypeCode.Byte; } if (type == typeof(short)) { return TypeCode.Int16; } if (type == typeof(ushort)) { return TypeCode.UInt16; } if (type == typeof(int)) { return TypeCode.Int32; } if (type == typeof(uint)) { return TypeCode.UInt32; } if (type == typeof(long)) { return TypeCode.Int64; } if (type == typeof(ulong)) { return TypeCode.UInt64; } if (type == typeof(float)) { return TypeCode.Single; } if (type == typeof(double)) { return TypeCode.Double; } if (type == typeof(decimal)) { return TypeCode.Decimal; } if (type == typeof(DateTime)) { return TypeCode.DateTime; } if (type == typeof(string)) { return TypeCode.String; } return TypeCode.Object; } public static bool IsDbNull(this object value) { return value?.GetType()?.FullName == "System.DBNull"; } public static Type[] GetGenericArguments(this Type type) { return type.GetTypeInfo().GenericTypeArguments; } public static PropertyInfo? GetPublicProperty(this Type type, string name) { string name2 = name; return type.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public).FirstOrDefault((PropertyInfo p) => p.Name == name2); } public static FieldInfo? GetPublicStaticField(this Type type, string name) { return type.GetRuntimeField(name); } public static IEnumerable<PropertyInfo> GetProperties(this Type type, bool includeNonPublic) { Func<PropertyInfo, bool> predicate = (includeNonPublic ? IsInstance : IsInstancePublic); if (!type.IsInterface()) { return type.GetRuntimeProperties().Where(predicate); } return new Type[1] { type }.Concat(type.GetInterfaces()).SelectMany((Type i) => i.GetRuntimeProperties().Where(predicate)); } public static IEnumerable<PropertyInfo> GetPublicProperties(this Type type) { return type.GetProperties(includeNonPublic: false); } public static IEnumerable<FieldInfo> GetPublicFields(this Type type) { return from f in type.GetRuntimeFields() where !f.IsStatic && f.IsPublic select f; } public static IEnumerable<MethodInfo> GetPublicStaticMethods(this Type type) { return from m in type.GetRuntimeMethods() where m.IsPublic && m.IsStatic select m; } public static MethodInfo GetPrivateStaticMethod(this Type type, string name) { string name2 = name; return type.GetRuntimeMethods().FirstOrDefault((MethodInfo m) => !m.IsPublic && m.IsStatic && m.Name.Equals(name2)) ?? throw new MissingMethodException($"Expected to find a method named '{name2}' in '{type.FullName}'."); } public static MethodInfo? GetPublicStaticMethod(this Type type, string name, params Type[] parameterTypes) { string name2 = name; Type[] parameterTypes2 = parameterTypes; return type.GetRuntimeMethods().FirstOrDefault(delegate(MethodInfo m) { if (m.IsPublic && m.IsStatic && m.Name.Equals(name2)) { ParameterInfo[] parameters = m.GetParameters(); if (parameters.Length == parameterTypes2.Length) { return parameters.Zip(parameterTypes2, (ParameterInfo pi, Type pt) => pi.ParameterType == pt).All((bool r) => r); } return false; } return false; }); } public static MethodInfo? GetPublicInstanceMethod(this Type type, string name) { string name2 = name; return type.GetRuntimeMethods().FirstOrDefault((MethodInfo m) => m.IsPublic && !m.IsStatic && m.Name.Equals(name2)); } public static MethodInfo? GetGetMethod(this PropertyInfo property, bool nonPublic) { MethodInfo methodInfo = property.GetMethod; if (!nonPublic && !methodInfo.IsPublic) { methodInfo = null; } return methodInfo; } public static MethodInfo? GetSetMethod(this PropertyInfo property) { return property.SetMethod; } public static IEnumerable<Type> GetInterfaces(this Type type) { return type.GetTypeInfo().ImplementedInterfaces; } public static bool IsInstanceOf(this Type type, object o) { if (!(o.GetType() == type)) { return o.GetType().GetTypeInfo().IsSubclassOf(type); } return true; } public static Attribute[] GetAllCustomAttributes<TAttribute>(this PropertyInfo member) { return Attribute.GetCustomAttributes(member, typeof(TAttribute), inherit: true); } public static bool AcceptsNull(this MemberInfo member) { object[] customAttributes = member.DeclaringType.GetCustomAttributes(inherit: true); object obj = customAttributes.FirstOrDefault((object x) => x.GetType().FullName == "System.Runtime.CompilerServices.NullableContextAttribute"); int num = 0; if (obj != null) { Type type = obj.GetType(); PropertyInfo property = type.GetProperty("Flag"); num = (byte)property.GetValue(obj); } object[] customAttributes2 = member.GetCustomAttributes(inherit: true); object obj2 = customAttributes2.FirstOrDefault((object x) => x.GetType().FullName == "System.Runtime.CompilerServices.NullableAttribute"); PropertyInfo propertyInfo = (obj2?.GetType())?.GetProperty("NullableFlags"); byte[] source = (byte[])propertyInfo.GetValue(obj2); return source.Any((byte x) => x == 2) || num == 2; } } 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 INamingConvention enumNamingConvention = 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 WithEnumNamingConvention(INamingConvention enumNamingConvention) { this.enumNamingConvention = enumNamingConvention; 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 (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 (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<object>(input); } public object? Deserialize(TextReader input) { return Deserialize<object>(input); } public object? Deserialize(IParser parser) { return Deserialize<object>(parser); } 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 (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; private bool enforceNullability; private bool caseInsensitivePropertyMatching; private bool enforceRequiredProperties; 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, BuildTypeInspector(), yamlFormatter, enumNamingConvention) }, { typeof(ArrayNodeDeserializer), (Nothing _) => new ArrayNodeDeserializer(enumNamingConvention, BuildTypeInspector()) }, { typeof(DictionaryNodeDeserializer), (Nothing _) => new DictionaryNodeDeserializer(objectFactory.Value, duplicateKeyChecking) }, { typeof(CollectionNodeDeserializer), (Nothing _) => new CollectionNodeDeserializer(objectFactory.Value, enumNamingConvention, BuildTypeInspector()) }, { typeof(EnumerableNodeDeserializer), (Nothing _) => new EnumerableNodeDeserializer() }, { typeof(ObjectNodeDeserializer), (Nothing _) => new ObjectNodeDeserializer(objectFactory.Value, BuildTypeInspector(), ignoreUnmatched, duplicateKeyChecking, typeConverter, enumNamingConvention, enforceNullability, caseInsensitivePropertyMatching, enforceRequiredProperties, BuildTypeConverters()) }, { typeof(FsharpListNodeDeserializer), (Nothing _) => new FsharpListNodeDeserializer(BuildTypeInspector(), enumNamingConvention) } }; 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(); } public 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 (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 WithCaseInsensitivePropertyMatching() { caseInsensitivePropertyMatching = true; return this; } public DeserializerBuilder WithEnforceNullability() { enforceNullability = true; return this; } public DeserializerBuilder WithEnforceRequiredMembers() { enforceRequiredProperties = true; return this; } public DeserializerBuilder WithoutNodeTypeResolver<TNodeTypeResolver>() where TNodeTypeResolver : INodeTypeResolver { return WithoutNodeTypeResolver(typeof(TNodeTypeResolver)); } public DeserializerBuilder WithoutNodeTypeResolver(Type nodeTypeResolverType) { if (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 (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.TryAdd(typeFromHandle, typeFromHandle2)) { typeMappings[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() { if (FsharpHelper.Instance == null) { FsharpHelper.Instance = new DefaultFsharpHelper(); } return Deserializer.FromValueDeserializer(BuildValueDeserializer()); } public IValueDeserializer BuildValueDeserializer() { return new AliasValueDeserializer(new NodeValueDeserializer(nodeDeserializerFactories.BuildComponentList(), nodeTypeResolverFactories.BuildComponentList(), typeConverter, enumNamingConvention, BuildTypeInspector())); } } 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); string Reverse(string value); } public interface INodeDeserializer { bool Deserialize(IParser reader, Type expectedType, Func<IParser, Type, object?> nestedObjectDeserializer, out object? value, ObjectDeserializer rootDeserializer); } 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, ObjectSerializer serializer); } public interface IObjectGraphVisitor<TContext> { bool Enter(IPropertyDescriptor? propertyDescriptor, IObjectDescriptor value, TContext context, ObjectSerializer serializer); bool EnterMapping(IObjectDescriptor key, IObjectDescriptor value, TContext context, ObjectSerializer serializer); bool EnterMapping(IPropertyDescriptor key, IObjectDescriptor value, TContext context, ObjectSerializer serializer); void VisitScalar(IObjectDescriptor scalar, TContext context, ObjectSerializer serializer); void VisitMappingStart(IObjectDescriptor mapping, Type keyType, Type valueType, TContext context, ObjectSerializer serializer); void VisitMappingEnd(IObjectDescriptor mapping, TContext context, ObjectSerializer serializer); void VisitSequenceStart(IObjectDescriptor sequence, Type elementType, TContext context, ObjectSerializer serializer); void VisitSequenceEnd(IObjectDescriptor sequence, TContext context, ObjectSerializer serializer); } public interface IPropertyDescriptor { string Name { get; } bool AllowNulls { get; } bool CanWrite { get; } Type Type { get; } Type? TypeOverride { get; set; } int Order { get; set; } ScalarStyle ScalarStyle { get; set; } bool Required { get; } Type? ConverterType { get; } 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, bool caseInsensitivePropertyMatching); string GetEnumName(Type enumType, string name); string GetEnumValue(object enumValue); } 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, ObjectDeserializer rootDeserializer); void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer); } 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 (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 (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 (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 (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 bool AllowNulls => baseDescriptor.AllowNulls; public string Name { get; set; } public bool Required => baseDescriptor.Required; public Type Type => baseDescriptor.Type; public Type? TypeOverride { get { return baseDescriptor.TypeOverride; } set { baseDescriptor.TypeOverride = value; } } public Type? ConverterType => baseDescriptor.ConverterType; 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 (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); IObjectGraphVisitor<IEmitter> visitor = emissionPhaseObjectGraphVisitorFactories.BuildComponentChain<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>>(new EmittingObjectGraphVisitor(eventEmitter), (IObjectGraphVisitor<IEmitter> inner) => new EmissionPhaseObjectGraphVisitorArgs(inner, eventEmitter, preProcessingPhaseObjectGraphVisitors, typeConverters, NestedObjectSerializer)); foreach (IObjectGraphVisitor<Nothing> item in preProcessingPhaseObjectGraphVisitors) { traversalStrategy.Traverse(graph, item, default(Nothing), NestedObjectSerializer); } traversalStrategy.Traverse(graph, visitor, emitter2, NestedObjectSerializer); 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 Dictionary<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, tagMappings, quoteNecessaryStrings, quoteYaml1_1Strings, defaultScalarStyle, yamlFormatter, enumNamingConvention, BuildTypeInspector()) } }; 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, ITypeInspector, 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; return WithEventEmitter((IEventEmitter e, ITypeInspector _) => eventEmitterFactory2(e), where); } public SerializerBuilder WithEventEmitter<TEventEmitter>(Func<IEventEmitter, ITypeInspector, TEventEmitter> eventEmitterFactory, Action<IRegistrationLocationSelectionSyntax<IEventEmitter>> where) where TEventEmitter : IEventEmitter { Func<IEventEmitter, ITypeInspector, 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, BuildTypeInspector()))); 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 (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 (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 (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, tagMappings, quoteNecessaryStrings, quoteYaml1_1Strings, defaultScalarStyle, yamlFormatter, enumNamingConvention, BuildTypeInspector()), 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().WithUtf16SurrogatePairs(); return WithTypeConverter(new YamlDotNet.Serialization.Converters.GuidConverter(jsonCompatible: true), delegate(IRegistrationLocationSelectionSyntax<IYamlTypeConverter> w) { w.InsteadOf<YamlDotNet.Serialization.Converters.GuidConverter>(); }).WithTypeConverter(new DateTime8601Converter(ScalarStyle.DoubleQuoted)).WithTypeConverter(new DateOnlyConverter(null, true)).WithTypeConverter(new TimeOnlyConverter(null, true)) .WithEventEmitter((IEventEmitter inner) => new JsonEventEmitter(inner, yamlFormatter, enumNamingConvention, BuildTypeInspector()), 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>(Func<IEnumerable<IYamlTypeConverter>, TObjectGraphVisitor> objectGraphVisitorFactory) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { return WithPreProcessingPhaseObjectGraphVisitor(objectGraphVisitorFactory, 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>(Func<IEnumerable<IYamlTypeConverter>, TObjectGraphVisitor> objectGraphVisitorFactory, Action<IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { Func<IEnumerable<IYamlTypeConverter>, TObjectGraphVisitor> objectGraphVisitorFactory2 = objectGraphVisitorFactory; if (objectGraphVisitorFactory2 == null) { throw new ArgumentNullException("objectGraphVisitorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(preProcessingPhaseObjectGraphVisitorFactories.CreateRegistrationLocationSelector(typeof(TObjectGraphVisitor), (IEnumerable<IYamlTypeConverter> typeConverters) => objectGraphVisitorFactory2(typeConverters))); 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 WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(WrapperFactory<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>, TObjectGraphVisitor> objectGraphVisitorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { WrapperFactory<IEnumerable<IYamlTypeConverter>, 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> typeConverters) => objectGraphVisitorFactory2(wrapped, typeConverters))); return this; } public SerializerBuilder WithoutPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>() where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { return WithoutPreProcessingPhaseObjectGraphVisitor(typeof(TObjectGraphVisitor)); } public SerializerBuilder WithoutPreProcessingPhaseObjectGraphVisitor(Type objectGraphVisitorType) { if (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 (objectGraphVisitorType == null) { throw new ArgumentNullException("objectGraphVisitorType"); } emissionPhaseObjectGraphVisitorFactories.Remove(objectGraphVisitorType); return this; } public SerializerBuilder WithIndentedSequences() { emitterSettings = emitterSettings.WithIndentedSequences(); return this; } public ISerializer Build() { if (FsharpHelper.Instance == null) { FsharpHelper.Instance = new DefaultFsharpHelper(); } 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()); } public 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 INamingConvention enumNamingConvention = 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 WithEnumNamingConvention(INamingConvention enumNamingConvention) { this.enumNamingConvention = enumNamingConvention ?? throw new ArgumentNullException("enumNamingConvention"); 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 (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 (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; private bool enforceNullability; private bool caseInsensitivePropertyMatching; 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, BuildTypeInspector(), yamlFormatter, enumNamingConvention) }, { 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, enumNamingConvention, enforceNullability, caseInsensitivePropertyMatching, enforceRequiredProperties: false, BuildTypeConverters()) } }; 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(); } public 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 WithCaseInsensitivePropertyMatching() { caseInsensitivePropertyMatching = true; return this; } public StaticDeserializerBuilder WithEnforceNullability() { enforceNullability = true; return this; } public StaticDeserializerBuilder WithoutNodeDeserializer<TNodeDeserializer>() where TNodeDeserializer : INodeDeserializer { return WithoutNodeDeserializer(typeof(TNodeDeserializer)); } public StaticDeserializerBuilder WithoutNodeDeserializer(Type nodeDeserializerType) { if (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 (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 (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}'."); } typeMappings[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, enumNamingConvention, BuildTypeInspector())); } } 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), NestedObjectSerializer); } IObjectGraphVisitor<IEmitter> visitor = emissionPhaseObjectGraphVisitorFactories.B
Newtonsoft.Json.dll
Decompiled 13 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Data.SqlTypes; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Dynamic; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Numerics; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Runtime.Versioning; using System.Security; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Xml; using System.Xml.Linq; using Microsoft.CodeAnalysis; using Newtonsoft.Json.Bson; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq.JsonPath; using Newtonsoft.Json.Schema; using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AllowPartiallyTrustedCallers] [assembly: InternalsVisibleTo("Newtonsoft.Json.Schema, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("9ca358aa-317b-4925-8ada-4a29e943a363")] [assembly: CLSCompliant(true)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("Newtonsoft")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © James Newton-King 2008")] [assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")] [assembly: AssemblyFileVersion("13.0.3.27908")] [assembly: AssemblyInformationalVersion("13.0.3+0a2e291c0d9c0c7675d445703e51750363a549ef")] [assembly: AssemblyProduct("Json.NET")] [assembly: AssemblyTitle("Json.NET .NET 6.0")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/JamesNK/Newtonsoft.Json")] [assembly: NeutralResourcesLanguage("en-US")] [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] [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 Newtonsoft.Json { public enum ConstructorHandling { Default, AllowNonPublicDefaultConstructor } public enum DateFormatHandling { IsoDateFormat, MicrosoftDateFormat } public enum DateParseHandling { None, DateTime, DateTimeOffset } public enum DateTimeZoneHandling { Local, Utc, Unspecified, RoundtripKind } public class DefaultJsonNameTable : JsonNameTable { private class Entry { internal readonly string Value; internal readonly int HashCode; internal Entry Next; internal Entry(string value, int hashCode, Entry next) { Value = value; HashCode = hashCode; Next = next; } } private static readonly int HashCodeRandomizer; private int _count; private Entry[] _entries; private int _mask = 31; static DefaultJsonNameTable() { HashCodeRandomizer = Environment.TickCount; } public DefaultJsonNameTable() { _entries = new Entry[_mask + 1]; } public override string? Get(char[] key, int start, int length) { if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; num += (num << 7) ^ key[start]; int num2 = start + length; for (int i = start + 1; i < num2; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; int num3 = Volatile.Read(ref _mask); int num4 = num & num3; for (Entry entry = _entries[num4]; entry != null; entry = entry.Next) { if (entry.HashCode == num && TextEquals(entry.Value, key, start, length)) { return entry.Value; } } return null; } public string Add(string key) { if (key == null) { throw new ArgumentNullException("key"); } int length = key.Length; if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; for (int i = 0; i < key.Length; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.Next) { if (entry.HashCode == num && entry.Value.Equals(key, StringComparison.Ordinal)) { return entry.Value; } } return AddEntry(key, num); } private string AddEntry(string str, int hashCode) { int num = hashCode & _mask; Entry entry = new Entry(str, hashCode, _entries[num]); _entries[num] = entry; if (_count++ == _mask) { Grow(); } return entry.Value; } private void Grow() { Entry[] entries = _entries; int num = _mask * 2 + 1; Entry[] array = new Entry[num + 1]; for (int i = 0; i < entries.Length; i++) { Entry entry = entries[i]; while (entry != null) { int num2 = entry.HashCode & num; Entry next = entry.Next; entry.Next = array[num2]; array[num2] = entry; entry = next; } } _entries = array; Volatile.Write(ref _mask, num); } private static bool TextEquals(string str1, char[] str2, int str2Start, int str2Length) { if (str1.Length != str2Length) { return false; } for (int i = 0; i < str1.Length; i++) { if (str1[i] != str2[str2Start + i]) { return false; } } return true; } } [Flags] public enum DefaultValueHandling { Include = 0, Ignore = 1, Populate = 2, IgnoreAndPopulate = 3 } public enum FloatFormatHandling { String, Symbol, DefaultValue } public enum FloatParseHandling { Double, Decimal } public enum Formatting { None, Indented } public interface IArrayPool<T> { T[] Rent(int minimumLength); void Return(T[]? array); } public interface IJsonLineInfo { int LineNumber { get; } int LinePosition { get; } bool HasLineInfo(); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonArrayAttribute : JsonContainerAttribute { private bool _allowNullItems; public bool AllowNullItems { get { return _allowNullItems; } set { _allowNullItems = value; } } public JsonArrayAttribute() { } public JsonArrayAttribute(bool allowNullItems) { _allowNullItems = allowNullItems; } public JsonArrayAttribute(string id) : base(id) { } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)] public sealed class JsonConstructorAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public abstract class JsonContainerAttribute : Attribute { internal bool? _isReference; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; private Type? _namingStrategyType; private object[]? _namingStrategyParameters; public string? Id { get; set; } public string? Title { get; set; } public string? Description { get; set; } public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get { return _namingStrategyType; } set { _namingStrategyType = value; NamingStrategyInstance = null; } } public object[]? NamingStrategyParameters { get { return _namingStrategyParameters; } set { _namingStrategyParameters = value; NamingStrategyInstance = null; } } internal NamingStrategy? NamingStrategyInstance { get; set; } public bool IsReference { get { return _isReference.GetValueOrDefault(); } set { _isReference = value; } } public bool ItemIsReference { get { return _itemIsReference.GetValueOrDefault(); } set { _itemIsReference = value; } } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } protected JsonContainerAttribute() { } protected JsonContainerAttribute(string id) { Id = id; } } public static class JsonConvert { public static readonly string True = "true"; public static readonly string False = "false"; public static readonly string Null = "null"; public static readonly string Undefined = "undefined"; public static readonly string PositiveInfinity = "Infinity"; public static readonly string NegativeInfinity = "-Infinity"; public static readonly string NaN = "NaN"; public static Func<JsonSerializerSettings>? DefaultSettings { get; set; } public static string ToString(DateTime value) { return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind); } public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling) { DateTime value2 = DateTimeUtils.EnsureDateTime(value, timeZoneHandling); using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeString(stringWriter, value2, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(DateTimeOffset value) { return ToString(value, DateFormatHandling.IsoDateFormat); } public static string ToString(DateTimeOffset value, DateFormatHandling format) { using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeOffsetString(stringWriter, value, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(bool value) { if (!value) { return False; } return True; } public static string ToString(char value) { return ToString(char.ToString(value)); } public static string ToString(Enum value) { return value.ToString("D"); } public static string ToString(int value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(short value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ushort value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(uint value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(long value) { return value.ToString(null, CultureInfo.InvariantCulture); } private static string ToStringInternal(BigInteger value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ulong value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(float value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(float value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureFloatFormat(double value, string text, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { if (floatFormatHandling == FloatFormatHandling.Symbol || (!double.IsInfinity(value) && !double.IsNaN(value))) { return text; } if (floatFormatHandling == FloatFormatHandling.DefaultValue) { if (nullable) { return Null; } return "0.0"; } return quoteChar + text + quoteChar; } public static string ToString(double value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(double value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureDecimalPlace(double value, string text) { if (double.IsNaN(value) || double.IsInfinity(value) || StringUtils.IndexOf(text, '.') != -1 || StringUtils.IndexOf(text, 'E') != -1 || StringUtils.IndexOf(text, 'e') != -1) { return text; } return text + ".0"; } private static string EnsureDecimalPlace(string text) { if (StringUtils.IndexOf(text, '.') != -1) { return text; } return text + ".0"; } public static string ToString(byte value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(sbyte value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(decimal value) { return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture)); } public static string ToString(Guid value) { return ToString(value, '"'); } internal static string ToString(Guid value, char quoteChar) { string text = value.ToString("D", CultureInfo.InvariantCulture); string text2 = quoteChar.ToString(CultureInfo.InvariantCulture); return text2 + text + text2; } public static string ToString(TimeSpan value) { return ToString(value, '"'); } internal static string ToString(TimeSpan value, char quoteChar) { return ToString(value.ToString(), quoteChar); } public static string ToString(Uri? value) { if (value == null) { return Null; } return ToString(value, '"'); } internal static string ToString(Uri value, char quoteChar) { return ToString(value.OriginalString, quoteChar); } public static string ToString(string? value) { return ToString(value, '"'); } public static string ToString(string? value, char delimiter) { return ToString(value, delimiter, StringEscapeHandling.Default); } public static string ToString(string? value, char delimiter, StringEscapeHandling stringEscapeHandling) { if (delimiter != '"' && delimiter != '\'') { throw new ArgumentException("Delimiter must be a single or double quote.", "delimiter"); } return JavaScriptUtils.ToEscapedJavaScriptString(value, delimiter, appendDelimiters: true, stringEscapeHandling); } public static string ToString(object? value) { if (value == null) { return Null; } return ConvertUtils.GetTypeCode(value.GetType()) switch { PrimitiveTypeCode.String => ToString((string)value), PrimitiveTypeCode.Char => ToString((char)value), PrimitiveTypeCode.Boolean => ToString((bool)value), PrimitiveTypeCode.SByte => ToString((sbyte)value), PrimitiveTypeCode.Int16 => ToString((short)value), PrimitiveTypeCode.UInt16 => ToString((ushort)value), PrimitiveTypeCode.Int32 => ToString((int)value), PrimitiveTypeCode.Byte => ToString((byte)value), PrimitiveTypeCode.UInt32 => ToString((uint)value), PrimitiveTypeCode.Int64 => ToString((long)value), PrimitiveTypeCode.UInt64 => ToString((ulong)value), PrimitiveTypeCode.Single => ToString((float)value), PrimitiveTypeCode.Double => ToString((double)value), PrimitiveTypeCode.DateTime => ToString((DateTime)value), PrimitiveTypeCode.Decimal => ToString((decimal)value), PrimitiveTypeCode.DBNull => Null, PrimitiveTypeCode.DateTimeOffset => ToString((DateTimeOffset)value), PrimitiveTypeCode.Guid => ToString((Guid)value), PrimitiveTypeCode.Uri => ToString((Uri)value), PrimitiveTypeCode.TimeSpan => ToString((TimeSpan)value), PrimitiveTypeCode.BigInteger => ToStringInternal((BigInteger)value), _ => throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())), }; } [DebuggerStepThrough] public static string SerializeObject(object? value) { return SerializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting) { return SerializeObject(value, formatting, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static string SerializeObject(object? value, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, JsonSerializerSettings? settings) { return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Type? type, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); return SerializeObjectInternal(value, type, jsonSerializer); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting, JsonSerializerSettings? settings) { return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Type? type, Formatting formatting, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); jsonSerializer.Formatting = formatting; return SerializeObjectInternal(value, type, jsonSerializer); } private static string SerializeObjectInternal(object? value, Type? type, JsonSerializer jsonSerializer) { StringWriter stringWriter = new StringWriter(new StringBuilder(256), CultureInfo.InvariantCulture); using (JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter)) { jsonTextWriter.Formatting = jsonSerializer.Formatting; jsonSerializer.Serialize(jsonTextWriter, value, type); } return stringWriter.ToString(); } [DebuggerStepThrough] public static object? DeserializeObject(string value) { return DeserializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static object? DeserializeObject(string value, JsonSerializerSettings settings) { return DeserializeObject(value, null, settings); } [DebuggerStepThrough] public static object? DeserializeObject(string value, Type type) { return DeserializeObject(value, type, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value) { return JsonConvert.DeserializeObject<T>(value, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject) { return DeserializeObject<T>(value); } [DebuggerStepThrough] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject, JsonSerializerSettings settings) { return DeserializeObject<T>(value, settings); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value, params JsonConverter[] converters) { return (T)DeserializeObject(value, typeof(T), converters); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value, JsonSerializerSettings? settings) { return (T)DeserializeObject(value, typeof(T), settings); } [DebuggerStepThrough] public static object? DeserializeObject(string value, Type type, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return DeserializeObject(value, type, settings); } public static object? DeserializeObject(string value, Type? type, JsonSerializerSettings? settings) { ValidationUtils.ArgumentNotNull(value, "value"); JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); if (!jsonSerializer.IsCheckAdditionalContentSet()) { jsonSerializer.CheckAdditionalContent = true; } using JsonTextReader reader = new JsonTextReader(new StringReader(value)); return jsonSerializer.Deserialize(reader, type); } [DebuggerStepThrough] public static void PopulateObject(string value, object target) { PopulateObject(value, target, null); } public static void PopulateObject(string value, object target, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); using JsonReader jsonReader = new JsonTextReader(new StringReader(value)); jsonSerializer.Populate(jsonReader, target); if (settings == null || !settings.CheckAdditionalContent) { return; } while (jsonReader.Read()) { if (jsonReader.TokenType != JsonToken.Comment) { throw JsonSerializationException.Create(jsonReader, "Additional text found in JSON string after finishing deserializing object."); } } } public static string SerializeXmlNode(XmlNode? node) { return SerializeXmlNode(node, Formatting.None); } public static string SerializeXmlNode(XmlNode? node, Formatting formatting) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); return SerializeObject(node, formatting, xmlNodeConverter); } public static string SerializeXmlNode(XmlNode? node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XmlDocument? DeserializeXmlNode(string value) { return DeserializeXmlNode(value, null); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), xmlNodeConverter); } public static string SerializeXNode(XObject? node) { return SerializeXNode(node, Formatting.None); } public static string SerializeXNode(XObject? node, Formatting formatting) { return SerializeXNode(node, formatting, omitRootObject: false); } public static string SerializeXNode(XObject? node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XDocument? DeserializeXNode(string value) { return DeserializeXNode(value, null); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XDocument)DeserializeObject(value, typeof(XDocument), xmlNodeConverter); } } public abstract class JsonConverter { public virtual bool CanRead => true; public virtual bool CanWrite => true; public abstract void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer); public abstract object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer); public abstract bool CanConvert(Type objectType); } public abstract class JsonConverter<T> : JsonConverter { public sealed override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { if (!((value != null) ? (value is T) : ReflectionUtils.IsNullable(typeof(T)))) { throw new JsonSerializationException("Converter cannot write specified value to JSON. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } WriteJson(writer, (T)value, serializer); } public abstract void WriteJson(JsonWriter writer, T? value, JsonSerializer serializer); public sealed override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { bool flag = existingValue == null; if (!flag && !(existingValue is T)) { throw new JsonSerializationException("Converter cannot read JSON with the specified existing value. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } return ReadJson(reader, objectType, flag ? default(T) : ((T)existingValue), !flag, serializer); } public abstract T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer); public sealed override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonConverterAttribute : Attribute { private readonly Type _converterType; public Type ConverterType => _converterType; public object[]? ConverterParameters { get; } public JsonConverterAttribute(Type converterType) { if (converterType == null) { throw new ArgumentNullException("converterType"); } _converterType = converterType; } public JsonConverterAttribute(Type converterType, params object[] converterParameters) : this(converterType) { ConverterParameters = converterParameters; } } public class JsonConverterCollection : Collection<JsonConverter> { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonDictionaryAttribute : JsonContainerAttribute { public JsonDictionaryAttribute() { } public JsonDictionaryAttribute(string id) : base(id) { } } [Serializable] public class JsonException : Exception { public JsonException() { } public JsonException(string message) : base(message) { } public JsonException(string message, Exception? innerException) : base(message, innerException) { } public JsonException(SerializationInfo info, StreamingContext context) : base(info, context) { } internal static JsonException Create(IJsonLineInfo lineInfo, string path, string message) { message = JsonPosition.FormatMessage(lineInfo, path, message); return new JsonException(message); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class JsonExtensionDataAttribute : Attribute { public bool WriteData { get; set; } public bool ReadData { get; set; } public JsonExtensionDataAttribute() { WriteData = true; ReadData = true; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonIgnoreAttribute : Attribute { } public abstract class JsonNameTable { public abstract string? Get(char[] key, int start, int length); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonObjectAttribute : JsonContainerAttribute { private MemberSerialization _memberSerialization; internal MissingMemberHandling? _missingMemberHandling; internal Required? _itemRequired; internal NullValueHandling? _itemNullValueHandling; public MemberSerialization MemberSerialization { get { return _memberSerialization; } set { _memberSerialization = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling.GetValueOrDefault(); } set { _missingMemberHandling = value; } } public NullValueHandling ItemNullValueHandling { get { return _itemNullValueHandling.GetValueOrDefault(); } set { _itemNullValueHandling = value; } } public Required ItemRequired { get { return _itemRequired.GetValueOrDefault(); } set { _itemRequired = value; } } public JsonObjectAttribute() { } public JsonObjectAttribute(MemberSerialization memberSerialization) { MemberSerialization = memberSerialization; } public JsonObjectAttribute(string id) : base(id) { } } internal enum JsonContainerType { None, Object, Array, Constructor } internal struct JsonPosition { private static readonly char[] SpecialCharacters = new char[18] { '.', ' ', '\'', '/', '"', '[', ']', '(', ')', '\t', '\n', '\r', '\f', '\b', '\\', '\u0085', '\u2028', '\u2029' }; internal JsonContainerType Type; internal int Position; internal string? PropertyName; internal bool HasIndex; public JsonPosition(JsonContainerType type) { Type = type; HasIndex = TypeHasIndex(type); Position = -1; PropertyName = null; } internal int CalculateLength() { switch (Type) { case JsonContainerType.Object: return PropertyName.Length + 5; case JsonContainerType.Array: case JsonContainerType.Constructor: return MathUtils.IntLength((ulong)Position) + 2; default: throw new ArgumentOutOfRangeException("Type"); } } internal void WriteTo(StringBuilder sb, ref StringWriter? writer, ref char[]? buffer) { switch (Type) { case JsonContainerType.Object: { string propertyName = PropertyName; if (propertyName.IndexOfAny(SpecialCharacters) != -1) { sb.Append("['"); if (writer == null) { writer = new StringWriter(sb); } JavaScriptUtils.WriteEscapedJavaScriptString(writer, propertyName, '\'', appendDelimiters: false, JavaScriptUtils.SingleQuoteCharEscapeFlags, StringEscapeHandling.Default, null, ref buffer); sb.Append("']"); } else { if (sb.Length > 0) { sb.Append('.'); } sb.Append(propertyName); } break; } case JsonContainerType.Array: case JsonContainerType.Constructor: sb.Append('['); sb.Append(Position); sb.Append(']'); break; } } internal static bool TypeHasIndex(JsonContainerType type) { if (type != JsonContainerType.Array) { return type == JsonContainerType.Constructor; } return true; } internal static string BuildPath(List<JsonPosition> positions, JsonPosition? currentPosition) { int num = 0; if (positions != null) { for (int i = 0; i < positions.Count; i++) { num += positions[i].CalculateLength(); } } if (currentPosition.HasValue) { num += currentPosition.GetValueOrDefault().CalculateLength(); } StringBuilder stringBuilder = new StringBuilder(num); StringWriter writer = null; char[] buffer = null; if (positions != null) { foreach (JsonPosition position in positions) { position.WriteTo(stringBuilder, ref writer, ref buffer); } } currentPosition?.WriteTo(stringBuilder, ref writer, ref buffer); return stringBuilder.ToString(); } internal static string FormatMessage(IJsonLineInfo? lineInfo, string path, string message) { if (!message.EndsWith(Environment.NewLine, StringComparison.Ordinal)) { message = message.Trim(); if (!message.EndsWith('.')) { message += "."; } message += " "; } message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path); if (lineInfo != null && lineInfo.HasLineInfo()) { message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition); } message += "."; return message; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonPropertyAttribute : Attribute { internal NullValueHandling? _nullValueHandling; internal DefaultValueHandling? _defaultValueHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal ObjectCreationHandling? _objectCreationHandling; internal TypeNameHandling? _typeNameHandling; internal bool? _isReference; internal int? _order; internal Required? _required; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get; set; } public object[]? NamingStrategyParameters { get; set; } public NullValueHandling NullValueHandling { get { return _nullValueHandling.GetValueOrDefault(); } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling.GetValueOrDefault(); } set { _defaultValueHandling = value; } } public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling.GetValueOrDefault(); } set { _referenceLoopHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling.GetValueOrDefault(); } set { _objectCreationHandling = value; } } public TypeNameHandling TypeNameHandling { get { return _typeNameHandling.GetValueOrDefault(); } set { _typeNameHandling = value; } } public bool IsReference { get { return _isReference.GetValueOrDefault(); } set { _isReference = value; } } public int Order { get { return _order.GetValueOrDefault(); } set { _order = value; } } public Required Required { get { return _required.GetValueOrDefault(); } set { _required = value; } } public string? PropertyName { get; set; } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } public bool ItemIsReference { get { return _itemIsReference.GetValueOrDefault(); } set { _itemIsReference = value; } } public JsonPropertyAttribute() { } public JsonPropertyAttribute(string propertyName) { PropertyName = propertyName; } } public abstract class JsonReader : IAsyncDisposable, IDisposable { protected internal enum State { Start, Complete, Property, ObjectStart, Object, ArrayStart, Array, Closed, PostValue, ConstructorStart, Constructor, Error, Finished } private JsonToken _tokenType; private object? _value; internal char _quoteChar; internal State _currentState; private JsonPosition _currentPosition; private CultureInfo? _culture; private DateTimeZoneHandling _dateTimeZoneHandling; private int? _maxDepth; private bool _hasExceededMaxDepth; internal DateParseHandling _dateParseHandling; internal FloatParseHandling _floatParseHandling; private string? _dateFormatString; private List<JsonPosition>? _stack; protected State CurrentState => _currentState; public bool CloseInput { get; set; } public bool SupportMultipleContent { get; set; } public virtual char QuoteChar { get { return _quoteChar; } protected internal set { _quoteChar = value; } } public DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling; } set { if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind) { throw new ArgumentOutOfRangeException("value"); } _dateTimeZoneHandling = value; } } public DateParseHandling DateParseHandling { get { return _dateParseHandling; } set { if (value < DateParseHandling.None || value > DateParseHandling.DateTimeOffset) { throw new ArgumentOutOfRangeException("value"); } _dateParseHandling = value; } } public FloatParseHandling FloatParseHandling { get { return _floatParseHandling; } set { if (value < FloatParseHandling.Double || value > FloatParseHandling.Decimal) { throw new ArgumentOutOfRangeException("value"); } _floatParseHandling = value; } } public string? DateFormatString { get { return _dateFormatString; } set { _dateFormatString = value; } } public int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; } } public virtual JsonToken TokenType => _tokenType; public virtual object? Value => _value; public virtual Type? ValueType => _value?.GetType(); public virtual int Depth { get { int num = _stack?.Count ?? 0; if (JsonTokenUtils.IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None) { return num; } return num + 1; } } public virtual string Path { get { if (_currentPosition.Type == JsonContainerType.None) { return string.Empty; } JsonPosition? currentPosition = ((_currentState != State.ArrayStart && _currentState != State.ConstructorStart && _currentState != State.ObjectStart) ? new JsonPosition?(_currentPosition) : null); return JsonPosition.BuildPath(_stack, currentPosition); } } public CultureInfo Culture { get { return _culture ?? CultureInfo.InvariantCulture; } set { _culture = value; } } ValueTask IAsyncDisposable.DisposeAsync() { try { Dispose(disposing: true); return default(ValueTask); } catch (Exception exception) { return ValueTask.FromException(exception); } } public virtual Task<bool> ReadAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool>() ?? Read().ToAsync(); } public async Task SkipAsync(CancellationToken cancellationToken = default(CancellationToken)) { if (TokenType == JsonToken.PropertyName) { await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false) && depth < Depth) { } } } internal async Task ReaderReadAndAssertAsync(CancellationToken cancellationToken) { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { throw CreateUnexpectedEndException(); } } public virtual Task<bool?> ReadAsBooleanAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool?>() ?? Task.FromResult(ReadAsBoolean()); } public virtual Task<byte[]?> ReadAsBytesAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<byte[]>() ?? Task.FromResult(ReadAsBytes()); } internal async Task<byte[]?> ReadArrayIntoByteArrayAsync(CancellationToken cancellationToken) { List<byte> buffer = new List<byte>(); do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(buffer)); byte[] array = buffer.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } public virtual Task<DateTime?> ReadAsDateTimeAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTime?>() ?? Task.FromResult(ReadAsDateTime()); } public virtual Task<DateTimeOffset?> ReadAsDateTimeOffsetAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTimeOffset?>() ?? Task.FromResult(ReadAsDateTimeOffset()); } public virtual Task<decimal?> ReadAsDecimalAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<decimal?>() ?? Task.FromResult(ReadAsDecimal()); } public virtual Task<double?> ReadAsDoubleAsync(CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(ReadAsDouble()); } public virtual Task<int?> ReadAsInt32Async(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<int?>() ?? Task.FromResult(ReadAsInt32()); } public virtual Task<string?> ReadAsStringAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<string>() ?? Task.FromResult(ReadAsString()); } internal async Task<bool> ReadAndMoveToContentAsync(CancellationToken cancellationToken) { bool flag = await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); if (flag) { flag = await MoveToContentAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } return flag; } internal Task<bool> MoveToContentAsync(CancellationToken cancellationToken) { JsonToken tokenType = TokenType; if (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { return MoveToContentFromNonContentAsync(cancellationToken); } return AsyncUtils.True; } private async Task<bool> MoveToContentFromNonContentAsync(CancellationToken cancellationToken) { JsonToken tokenType; do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { return false; } tokenType = TokenType; } while (tokenType == JsonToken.None || tokenType == JsonToken.Comment); return true; } internal JsonPosition GetPosition(int depth) { if (_stack != null && depth < _stack.Count) { return _stack[depth]; } return _currentPosition; } protected JsonReader() { _currentState = State.Start; _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; _dateParseHandling = DateParseHandling.DateTime; _floatParseHandling = FloatParseHandling.Double; _maxDepth = 64; CloseInput = true; } private void Push(JsonContainerType value) { UpdateScopeWithFinishedValue(); if (_currentPosition.Type == JsonContainerType.None) { _currentPosition = new JsonPosition(value); return; } if (_stack == null) { _stack = new List<JsonPosition>(); } _stack.Add(_currentPosition); _currentPosition = new JsonPosition(value); if (!_maxDepth.HasValue || !(Depth + 1 > _maxDepth) || _hasExceededMaxDepth) { return; } _hasExceededMaxDepth = true; throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth)); } private JsonContainerType Pop() { JsonPosition currentPosition; if (_stack != null && _stack.Count > 0) { currentPosition = _currentPosition; _currentPosition = _stack[_stack.Count - 1]; _stack.RemoveAt(_stack.Count - 1); } else { currentPosition = _currentPosition; _currentPosition = default(JsonPosition); } if (_maxDepth.HasValue && Depth <= _maxDepth) { _hasExceededMaxDepth = false; } return currentPosition.Type; } private JsonContainerType Peek() { return _currentPosition.Type; } public abstract bool Read(); public virtual int? ReadAsInt32() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is int) { return (int)value; } int num; if (value is BigInteger bigInteger) { num = (int)bigInteger; } else { try { num = Convert.ToInt32(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Integer, num, updateIndex: false); return num; } case JsonToken.String: { string s = (string)Value; return ReadInt32String(s); } default: throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal int? ReadInt32String(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (int.TryParse(s, NumberStyles.Integer, Culture, out var result)) { SetToken(JsonToken.Integer, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual string? ReadAsString() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.String: return (string)Value; default: if (JsonTokenUtils.IsPrimitiveToken(contentToken)) { object value = Value; if (value != null) { string text = ((!(value is IFormattable formattable)) ? ((value is Uri uri) ? uri.OriginalString : value.ToString()) : formattable.ToString(null, Culture)); SetToken(JsonToken.String, text, updateIndex: false); return text; } } throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } public virtual byte[]? ReadAsBytes() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.StartObject: { ReadIntoWrappedTypeObject(); byte[] array2 = ReadAsBytes(); ReaderReadAndAssert(); if (TokenType != JsonToken.EndObject) { throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } SetToken(JsonToken.Bytes, array2, updateIndex: false); return array2; } case JsonToken.String: { string text = (string)Value; Guid g; byte[] array3 = ((text.Length == 0) ? CollectionUtils.ArrayEmpty<byte>() : ((!ConvertUtils.TryConvertGuid(text, out g)) ? Convert.FromBase64String(text) : g.ToByteArray())); SetToken(JsonToken.Bytes, array3, updateIndex: false); return array3; } case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Bytes: if (Value is Guid guid) { byte[] array = guid.ToByteArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } return (byte[])Value; case JsonToken.StartArray: return ReadArrayIntoByteArray(); default: throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal byte[] ReadArrayIntoByteArray() { List<byte> list = new List<byte>(); do { if (!Read()) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(list)); byte[] array = list.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } private bool ReadArrayElementIntoByteArrayReportDone(List<byte> buffer) { switch (TokenType) { case JsonToken.None: throw JsonReaderException.Create(this, "Unexpected end when reading bytes."); case JsonToken.Integer: buffer.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture)); return false; case JsonToken.EndArray: return true; case JsonToken.Comment: return false; default: throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } public virtual double? ReadAsDouble() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is double) { return (double)value; } double num = ((!(value is BigInteger bigInteger)) ? Convert.ToDouble(value, CultureInfo.InvariantCulture) : ((double)bigInteger)); SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDoubleString((string)Value); default: throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal double? ReadDoubleString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to double: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual bool? ReadAsBoolean() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { bool flag = ((!(Value is BigInteger bigInteger)) ? Convert.ToBoolean(Value, CultureInfo.InvariantCulture) : (bigInteger != 0L)); SetToken(JsonToken.Boolean, flag, updateIndex: false); return flag; } case JsonToken.String: return ReadBooleanString((string)Value); case JsonToken.Boolean: return (bool)Value; default: throw JsonReaderException.Create(this, "Error reading boolean. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal bool? ReadBooleanString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (bool.TryParse(s, out var result)) { SetToken(JsonToken.Boolean, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to boolean: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual decimal? ReadAsDecimal() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is decimal) { return (decimal)value; } decimal num; if (value is BigInteger bigInteger) { num = (decimal)bigInteger; } else { try { num = Convert.ToDecimal(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDecimalString((string)Value); default: throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal decimal? ReadDecimalString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (decimal.TryParse(s, NumberStyles.Number, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } if (ConvertUtils.DecimalTryParse(s.ToCharArray(), 0, s.Length, out result) == ParseResult.Success) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTime? ReadAsDateTime() { switch (GetContentToken()) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTimeOffset dateTimeOffset) { SetToken(JsonToken.Date, dateTimeOffset.DateTime, updateIndex: false); } return (DateTime)Value; case JsonToken.String: return ReadDateTimeString((string)Value); default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } internal DateTime? ReadDateTimeString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTime(s, DateTimeZoneHandling, _dateFormatString, Culture, out var dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTimeOffset? ReadAsDateTimeOffset() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTime dateTime) { SetToken(JsonToken.Date, new DateTimeOffset(dateTime), updateIndex: false); } return (DateTimeOffset)Value; case JsonToken.String: { string s = (string)Value; return ReadDateTimeOffsetString(s); } default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal DateTimeOffset? ReadDateTimeOffsetString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTimeOffset(s, _dateFormatString, Culture, out var dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTimeOffset.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } internal void ReaderReadAndAssert() { if (!Read()) { throw CreateUnexpectedEndException(); } } internal JsonReaderException CreateUnexpectedEndException() { return JsonReaderException.Create(this, "Unexpected end when reading JSON."); } internal void ReadIntoWrappedTypeObject() { ReaderReadAndAssert(); if (Value != null && Value.ToString() == "$type") { ReaderReadAndAssert(); if (Value != null && Value.ToString().StartsWith("System.Byte[]", StringComparison.Ordinal)) { ReaderReadAndAssert(); if (Value.ToString() == "$value") { return; } } } throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject)); } public void Skip() { if (TokenType == JsonToken.PropertyName) { Read(); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (Read() && depth < Depth) { } } } protected void SetToken(JsonToken newToken) { SetToken(newToken, null, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value) { SetToken(newToken, value, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value, bool updateIndex) { _tokenType = newToken; _value = value; switch (newToken) { case JsonToken.StartObject: _currentState = State.ObjectStart; Push(JsonContainerType.Object); break; case JsonToken.StartArray: _currentState = State.ArrayStart; Push(JsonContainerType.Array); break; case JsonToken.StartConstructor: _currentState = State.ConstructorStart; Push(JsonContainerType.Constructor); break; case JsonToken.EndObject: ValidateEnd(JsonToken.EndObject); break; case JsonToken.EndArray: ValidateEnd(JsonToken.EndArray); break; case JsonToken.EndConstructor: ValidateEnd(JsonToken.EndConstructor); break; case JsonToken.PropertyName: _currentState = State.Property; _currentPosition.PropertyName = (string)value; break; case JsonToken.Raw: case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Undefined: case JsonToken.Date: case JsonToken.Bytes: SetPostValueState(updateIndex); break; case JsonToken.Comment: break; } } internal void SetPostValueState(bool updateIndex) { if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } if (updateIndex) { UpdateScopeWithFinishedValue(); } } private void UpdateScopeWithFinishedValue() { if (_currentPosition.HasIndex) { _currentPosition.Position++; } } private void ValidateEnd(JsonToken endToken) { JsonContainerType jsonContainerType = Pop(); if (GetTypeForCloseToken(endToken) != jsonContainerType) { throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, jsonContainerType)); } if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } } protected void SetStateBasedOnCurrent() { JsonContainerType jsonContainerType = Peek(); switch (jsonContainerType) { case JsonContainerType.Object: _currentState = State.Object; break; case JsonContainerType.Array: _currentState = State.Array; break; case JsonContainerType.Constructor: _currentState = State.Constructor; break; case JsonContainerType.None: SetFinished(); break; default: throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, jsonContainerType)); } } private void SetFinished() { _currentState = ((!SupportMultipleContent) ? State.Finished : State.Start); } private JsonContainerType GetTypeForCloseToken(JsonToken token) { return token switch { JsonToken.EndObject => JsonContainerType.Object, JsonToken.EndArray => JsonContainerType.Array, JsonToken.EndConstructor => JsonContainerType.Constructor, _ => throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)), }; } void IDisposable.Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_currentState != State.Closed && disposing) { Close(); } } public virtual void Close() { _currentState = State.Closed; _tokenType = JsonToken.None; _value = null; } internal void ReadAndAssert() { if (!Read()) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal void ReadForTypeAndAssert(JsonContract? contract, bool hasConverter) { if (!ReadForType(contract, hasConverter)) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal bool ReadForType(JsonContract? contract, bool hasConverter) { if (hasConverter) { return Read(); } switch (contract?.InternalReadType ?? ReadType.Read) { case ReadType.Read: return ReadAndMoveToContent(); case ReadType.ReadAsInt32: ReadAsInt32(); break; case ReadType.ReadAsInt64: { bool result = ReadAndMoveToContent(); if (TokenType == JsonToken.Undefined) { throw JsonReaderException.Create(this, "An undefined token is not a valid {0}.".FormatWith(CultureInfo.InvariantCulture, contract?.UnderlyingType ?? typeof(long))); } return result; } case ReadType.ReadAsDecimal: ReadAsDecimal(); break; case ReadType.ReadAsDouble: ReadAsDouble(); break; case ReadType.ReadAsBytes: ReadAsBytes(); break; case ReadType.ReadAsBoolean: ReadAsBoolean(); break; case ReadType.ReadAsString: ReadAsString(); break; case ReadType.ReadAsDateTime: ReadAsDateTime(); break; case ReadType.ReadAsDateTimeOffset: ReadAsDateTimeOffset(); break; default: throw new ArgumentOutOfRangeException(); } return TokenType != JsonToken.None; } internal bool ReadAndMoveToContent() { if (Read()) { return MoveToContent(); } return false; } internal bool MoveToContent() { JsonToken tokenType = TokenType; while (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { if (!Read()) { return false; } tokenType = TokenType; } return true; } private JsonToken GetContentToken() { JsonToken tokenType; do { if (!Read()) { SetToken(JsonToken.None); return JsonToken.None; } tokenType = TokenType; } while (tokenType == JsonToken.Comment); return tokenType; } } [Serializable] public class JsonReaderException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonReaderException() { } public JsonReaderException(string message) : base(message) { } public JsonReaderException(string message, Exception innerException) : base(message, innerException) { } public JsonReaderException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonReaderException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonReaderException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonReaderException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonReaderException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonReaderException(message, path, lineNumber, linePosition, ex); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonRequiredAttribute : Attribute { } [Serializable] public class JsonSerializationException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonSerializationException() { } public JsonSerializationException(string message) : base(message) { } public JsonSerializationException(string message, Exception innerException) : base(message, innerException) { } public JsonSerializationException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonSerializationException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonSerializationException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonSerializationException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonSerializationException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonSerializationException(message, path, lineNumber, linePosition, ex); } } public class JsonSerializer { internal TypeNameHandling _typeNameHandling; internal TypeNameAssemblyFormatHandling _typeNameAssemblyFormatHandling; internal PreserveReferencesHandling _preserveReferencesHandling; internal ReferenceLoopHandling _referenceLoopHandling; internal MissingMemberHandling _missingMemberHandling; internal ObjectCreationHandling _objectCreationHandling; internal NullValueHandling _nullValueHandling; internal DefaultValueHandling _defaultValueHandling; internal ConstructorHandling _constructorHandling; internal MetadataPropertyHandling _metadataPropertyHandling; internal JsonConverterCollection? _converters; internal IContractResolver _contractResolver; internal ITraceWriter? _traceWriter; internal IEqualityComparer? _equalityComparer; internal ISerializationBinder _serializationBinder; internal StreamingContext _context; private IReferenceResolver? _referenceResolver; private Formatting? _formatting; private DateFormatHandling? _dateFormatHandling; private DateTimeZoneHandling? _dateTimeZoneHandling; private DateParseHandling? _dateParseHandling; private FloatFormatHandling? _floatFormatHandling; private FloatParseHandling? _floatParseHandling; private StringEscapeHandling? _stringEscapeHandling; private CultureInfo _culture; private int? _maxDepth; private bool _maxDepthSet; private bool? _checkAdditionalContent; private string? _dateFormatString; private bool _dateFormatStringSet; public virtual IReferenceResolver? ReferenceResolver { get { return GetReferenceResolver(); } set { if (value == null) { throw new ArgumentNullException("value", "Reference resolver cannot be null."); } _referenceResolver = value; } } [Obsolete("Binder is obsolete. Use SerializationBinder instead.")] public virtual SerializationBinder Binder { get { if (_serializationBinder is SerializationBinder result) { return result; } if (_serializationBinder is SerializationBinderAdapter serializationBinderAdapter) { return serializationBinderAdapter.SerializationBinder; } throw new InvalidOperationException("Cannot get SerializationBinder because an ISerializationBinder was previously set."); } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = (value as ISerializationBinder) ?? new SerializationBinderAdapter(value); } } public virtual ISerializationBinder SerializationBinder { get { return _serializationBinder; } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = value; } } public virtual ITraceWriter? TraceWriter { get { return _traceWriter; } set { _traceWriter = value; } } public virtual IEqualityComparer? EqualityComparer { get { return _equalityComparer; } set { _equalityComparer = value; } } public virtual TypeNameHandling TypeNameHandling { get { return _typeNameHandling; } set { if (value < TypeNameHandling.None || value > TypeNameHandling.Auto) { throw new ArgumentOutOfRangeException("value"); } _typeNameHandling = value; } } [Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")] public virtual FormatterAssemblyStyle TypeNameAssemblyFormat { get { return (FormatterAssemblyStyle)_typeNameAssemblyFormatHandling; } set { if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value; } } public virtual TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get { return _typeNameAssemblyFormatHandling; } set { if (value < TypeNameAssemblyFormatHandling.Simple || value > TypeNameAssemblyFormatHandling.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = value; } } public virtual PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling; } set { if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All) { throw new ArgumentOutOfRangeException("value"); } _preserveReferencesHandling = value; } } public virtual ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling; } set { if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize) { throw new ArgumentOutOfRangeException("value"); } _referenceLoopHandling = value; } } public virtual MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling; } set { if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error) { throw new ArgumentOutOfRangeException("value"); } _missingMemberHandling = value; } } public virtual NullValueHandling NullValueHandling { get { return _nullValueHandling; } set { if (value < NullValueHandling.Include || value > NullValueHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _nullValueHandling = value; } } public virtual DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling; } set { if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate) { throw new ArgumentOutOfRangeException("value"); } _defaultValueHandling = value; } } public virtual ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling; } set { if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace) { throw new ArgumentOutOfRangeException("value"); } _objectCreationHandling = value; } } public virtual ConstructorHandling ConstructorHandling { get { return _constructorHandling; } set { if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor) { throw new ArgumentOutOfRangeException("value"); } _constructorHandling = value; } } public virtual MetadataPropertyHandling MetadataPropertyHandling { get { return _metadataPropertyHandling; } set { if (value < MetadataPropertyHandling.Default || value > MetadataPropertyHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _metadataPropertyHandling = value; } } public virtual JsonConverterCollection Converters { get { if (_converters == null) { _converters = new JsonConverterCollection(); } return _converters; } } public virtual IContractResolver ContractResolver { get { return _contractResolver; } set { _contractResolver = value ?? DefaultContractResolver.Instance; } } public virtual StreamingContext Context { get { return _context; } set { _context = value; } } public virtual Formatting Formatting { get { return _formatting.GetValueOrDefault(); } set { _formatting = value; } } public virtual DateFormatHandling DateFormatHandling { get { return _dateFormatHandling.GetValueOrDefault(); } set { _dateFormatHandling = value; } } public virtual DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling ?? DateTimeZoneHandling.RoundtripKind; } set { _dateTimeZoneHandling = value; } } public virtual DateParseHandling DateParseHandling { get { return _dateParseHandling ?? DateParseHandling.DateTime; } set { _dateParseHandling = value; } } public virtual FloatParseHandling FloatParseHandling { get { return _floatParseHandling.GetValueOrDefault(); } set { _floatParseHandling = value; } } public virtual FloatFormatHandling FloatFormatHandling { get { return _floatFormatHandling.GetValueOrDefault(); } set { _floatFormatHandling = value; } } public virtual StringEscapeHandling StringEscapeHandling { get { return _stringEscapeHandling.GetValueOrDefault(); } set { _stringEscapeHandling = value; } } public virtual string DateFormatString { get { return _dateFormatString ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; } set { _dateFormatString = value; _dateFormatStringSet = true; } } public virtual CultureInfo Culture { get { return _culture ?? JsonSerializerSettings.DefaultCulture; } set { _culture = value; } } public virtual int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; _maxDepthSet = true; } } public virtual bool CheckAdditionalContent { get { return _checkAdditionalContent.GetValueOrDefault(); } set { _checkAdditionalContent = value; } } public virtual event EventHandler<ErrorEventArgs>? Error; internal bool IsCheckAdditionalContentSet() { return _checkAdditionalContent.HasValue; } public JsonSerializer() { _referenceLoopHandling = ReferenceLoopHandling.Error; _missingMemberHandling = MissingMemberHandling.Ignore; _nullValueHandling = NullValueHandling.Include; _defaultValueHandling = DefaultValueHandling.Include; _objectCreationHandling = ObjectCreationHandling.Auto; _preserveReferencesHandling = PreserveReferencesHandling.None; _constructorHandling = ConstructorHandling.Default; _typeNameHandling = TypeNameHandling.None; _metadataPropertyHandling = MetadataPropertyHandling.Default; _context = JsonSerializerSettings.DefaultContext; _serializationBinder = DefaultSerializationBinder.Instance; _culture = JsonSerializerSettings.DefaultCulture; _contractResolver = DefaultContractResolver.Instance; } public static JsonSerializer Create() { return new JsonSerializer(); } public static JsonSerializer Create(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = Create(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } public static JsonSerializer CreateDefault() { return Create(JsonConvert.DefaultSettings?.Invoke()); } public static JsonSerializer CreateDefault(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = CreateDefault(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } private static void ApplySerializerSettings(JsonSerializer serializer, JsonSerializerSettings settings) { if (!CollectionUtils.IsNullOrEmpty(settings.Converters)) { for (int i = 0; i < settings.Converters.Count; i++) { serializer.Converters.Insert(i, settings.Converters[i]); } } if (settings._typeNameHandling.HasValue) { serializer.TypeNameHandling = settings.TypeNameHandling; } if (settings._metadataPropertyHandling.HasValue) { serializer.MetadataPropertyHandling = settings.MetadataPropertyHandling; } if (settings._typeNameAssemblyFormatHandling.HasValue) { serializer.TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling; } if (settings._preserveReferencesHandling.HasValue) { serializer.PreserveReferencesHandling = settings.PreserveReferencesHandling; } if (settings._referenceLoopHandling.HasValue) { serializer.ReferenceLoopHandling = settings.ReferenceLoopHandling; } if (settings._missingMemberHandling.HasValue) { serializer.MissingMemberHandling = settings.MissingMemberHandling; } if (settings._objectCreationHandling.HasValue) { serializer.ObjectCreationHandling = settings.ObjectCreationHandling; } if (settings._nullValueHandling.HasValue) { serializer.NullValueHandling = settings.NullValueHandling; } if (settings._defaultValueHandling.HasValue) { serializer.DefaultValueHandling = settings.DefaultValueHandling; } if (settings._constructorHandling.HasValue) { serializer.ConstructorHandling = settings.ConstructorHandling; } if (settings._context.HasValue) { serializer.Context = settings.Context; } if (settings._checkAdditionalContent.HasValue) { serializer._checkAdditionalContent = settings._checkAdditionalContent; } if (settings.Error != null) { serializer.Error += settings.Error; } if (settings.ContractResolver != null) { serializer.ContractResolver = settings.ContractResolver; } if (settings.ReferenceResolverProvider != null) { serializer.ReferenceResolver = settings.ReferenceResolverProvider(); } if (settings.TraceWriter != null) { serializer.TraceWriter = settings.TraceWriter; } if (settings.EqualityComparer != null) { serializer.EqualityComparer = settings.EqualityComparer; } if (settings.SerializationBinder != null) { serializer.SerializationBinder = settings.SerializationBinder; } if (settings._formatting.HasValue) { serializer._formatting = settings._formatting; } if (settings._dateFormatHandling.HasValue) { serializer._dateFormatHandling = settings._dateFormatHandling; } if (settings._dateTimeZoneHandling.HasValue) { serializer._dateTimeZoneHandling = settings._dateTimeZoneHandling; } if (settings._dateParseHandling.HasValue) { serializer._dateParseHandling = settings._dateParseHandling; } if (settings._dateFormatStringSet) { serializer._dateFormatString = settings._dateFormatString; serializer._dateFormatStringSet = settings._dateFormatStringSet; } if (settings._floatFormatHandling.HasValue) { serializer._floatFormatHandling = settings._floatFormatHandling; } if (settings._floatParseHandling.HasValue) { serializer._floatParseHandling = settings._floatParseHandling; } if (settings._stringEscapeHandling.HasValue) { serializer._stringEscapeHandling = settings._stringEscapeHandling; } if (settings._culture != null) { serializer._culture = settings._culture; } if (settings._maxDepthSet) { serializer._maxDepth = settings._maxDepth; serializer._maxDepthSet = settings._maxDepthSet; } } [DebuggerStepThrough] public void Populate(TextReader reader, object target) { Populate(new JsonTextReader(reader), target); } [DebuggerStepThrough] public void Populate(JsonReader reader, object target) { PopulateInternal(reader, target); } internal virtual void PopulateInternal(JsonReader reader, object target) { ValidationUtils.ArgumentNotNull(reader, "reader"); ValidationUtils.ArgumentNotNull(target, "target"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); new JsonSerializerInternalReader(this).Populate(traceJsonReader ?? reader, target); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader) { return Deserialize(reader, null); } [DebuggerStepThrough] public object? Deserialize(TextReader reader, Type objectType) { return Deserialize(new JsonTextReader(reader), objectType); } [DebuggerStepThrough] public T? Deserialize<T>(JsonReader reader) { return (T)Deserialize(reader, typeof(T)); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader, Type? objectType) { return DeserializeInternal(reader, objectType); } internal virtual object? DeserializeInternal(JsonReader reader, Type? objectType) { ValidationUtils.ArgumentNotNull(reader, "reader"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); object? result = new JsonSerializerInternalReader(this).Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); return result; } internal void SetupReader(JsonReader reader, out CultureInfo? previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string? previousDateFormatString) { if (_culture != null && !_culture.Equals(reader.Culture)) { previousCulture = reader.Culture; reader.Culture = _culture; } else { previousCulture = null; } if (_dateTimeZoneHandling.HasValue && reader.DateTimeZoneHandling != _dateTimeZoneHandling) { previousDateTimeZoneHandling = reader.DateTimeZoneHandling; reader.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } else { previousDateTimeZoneHandling = null; } if (_dateParseHandling.HasValue && reader.DateParseHandling != _dateParseHandling) { previousDateParseHandling = reader.DateParseHandling; reader.DateParseHandling = _dateParseHandling.GetValueOrDefault(); } else { previousDateParseHandling = null; } if (_floatParseHandling.HasValue && reader.FloatParseHandling != _floatParseHandling) { previousFloatParseHandling = reader.FloatParseHandling; reader.FloatParseHandling = _floatParseHandling.GetValueOrDefault(); } else { previousFloatParseHandling = null; } if (_maxDepthSet && reader.MaxDepth != _maxDepth) { previousMaxDepth = reader.MaxDepth; reader.MaxDepth = _maxDepth; } else { previousMaxDepth = null; } if (_dateFormatStringSet && reader.DateFormatString != _dateFormatString) { previousDateFormatString = reader.DateFormatString; reader.DateFormatString = _dateFormatString; } else { previousDateFormatString = null; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable == null && _contractResolver is DefaultContractResolver defaultContractResolver) { jsonTextReader.PropertyNameTable = defaultContractResolver.GetNameTable(); } } private void ResetReader(JsonReader reader, CultureInfo? previousCulture, DateTimeZoneHandling? previousDateTimeZoneHandling, DateParseHandling? previousDateParseHandling, FloatParseHandling? previousFloatParseHandling, int? previousMaxDepth, string? previousDateFormatString) { if (previousCulture != null) { reader.Culture = previousCulture; } if (previousDateTimeZoneHandling.HasValue) { reader.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault(); } if (previousDateParseHandling.HasValue) { reader.DateParseHandling = previousDateParseHandling.GetValueOrDefault(); } if (previousFloatParseHandling.HasValue) { reader.FloatParseHandling = previousFloatParseHandling.GetValueOrDefault(); } if (_maxDepthSet) { reader.MaxDepth = previousMaxDepth; } if (_dateFormatStringSet) { reader.DateFormatString = previousDateFormatString; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable != null && _contractResolver is DefaultContractResolver defaultContractResolver && jsonTextReader.PropertyNameTable == defaultContractResolver.GetNameTable()) { jsonTextReader.PropertyNameTable = null; } } public void Serialize(TextWriter textWriter, object? value) { Serialize(new JsonTextWriter(textWriter), value); } public void Serialize(JsonWriter jsonWriter, object? value, Type? objectType) { SerializeInternal(jsonWriter, value, objectType); } public void Serialize(TextWriter textWriter, object? value, Type objectType) { Serialize(new JsonTextWriter(textWriter), value, objectType); } public void Serialize(JsonWriter jsonWriter, object? value) { SerializeInternal(jsonWriter, value, null); } private TraceJsonReader CreateTraceJsonReader(JsonReader reader) { TraceJsonReader traceJsonReader = new TraceJsonReader(reader); if (reader.TokenType != 0) { traceJsonReader.WriteCurrentToken(); } return traceJsonReader; } internal virtual void SerializeInternal(JsonWriter jsonWriter, object? value, Type? objectType) { ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter"); Formatting? formatting = null; if (_formatting.HasValue && jsonWriter.Formatting != _formatting) { formatting = jsonWriter.Formatting; jsonWriter.Formatting = _formatting.GetValueOrDefault(); } DateFormatHandling? dateFormatHandling = null; if (_dateFormatHandling.HasValue && jsonWriter.DateFormatHandling != _dateFormatHandling) { dateFormatHandling = jsonWriter.DateFormatHandling; jsonWriter.DateFormatHandling = _dateFormatHandling.GetValueOrDefault(); } DateTimeZoneHandling? dateTimeZoneHandling = null; if (_dateTimeZoneHandling.HasValue && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling) { dateTimeZoneHandling = jsonWriter.DateTimeZoneHandling; jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } FloatFormatHandling? floatFormatHandling = null; if (_floatFormatHandling.HasValue && jsonWriter.FloatFormatHandling != _floatFormatHandling) { floatFormatHandling = jsonWriter.FloatFormatHandling; jsonWriter.FloatFormatHandling = _floatFormatHandling.GetValueOrDefault(); } StringEscapeHandling? stringEscapeHandling = null; if (_stringEscapeHandling.HasValue && jsonWriter.StringEscapeHandling != _stringEscapeHandling) { stringEscapeHandling = jsonWriter.StringEscapeHandling; jsonWriter.StringEscapeHandling = _stringEscapeHandling.GetValueOrDefault(); } CultureInfo cultureInfo = null; if (_culture != null && !_culture.Equals(jsonWriter.Culture)) { cultureInfo = jsonWriter.Culture; jsonWriter.Culture = _culture; } string dateFormatString = null; if (_dateFormatStringSet && jsonWriter.DateFormatString != _dateFormatString) { dateFormatString = jsonWriter.DateFormatString; jsonWriter.DateFormatString = _dateFormatString; } TraceJsonWriter traceJsonWriter = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? new TraceJsonWriter(jsonWriter) : null); new JsonSerializerInternalWriter(this).Serialize(traceJsonWriter ?? jsonWriter, value, objectType); if (traceJsonWriter != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonWriter.GetSerializedJsonMessage(), null); } if (formatting.HasValue) { jsonWriter.Formatting = formatting.GetValueOrDefault(); } if (dateFormatHandling.HasValue) { jsonWriter.DateFormatHandling = dateFormatHandling.GetValueOrDefault(); } if (dateTimeZoneHandling.HasValue) { jsonWriter.DateTimeZoneHandling = dateTimeZoneHandling.GetValueOrDefault(); } if (floatFormatHandling.HasValue) { jsonWriter.FloatFormatHandling = floatFormatHandling.GetValueOrDefault(); } if (stringEscapeHandling.HasValue) { jsonWriter.StringEscapeHandling = stringEscapeHandling.GetValueOrDefault(); } if (_dateFormatStringSet) { jsonWriter.DateFormatString = dateFormatString; } if (cultureInfo != null) { jsonWriter.Culture = cultureInfo; } } internal IReferenceResolver GetReferenceResolver() { if (_referenceResolver == null) { _referenceResolver = new DefaultReferenceResolver(); } return _referenceResolver; } internal JsonConverter? GetMatchingConverter(Type type) { return GetMatchingConverter(_converters, type); } internal static JsonConverter? GetMatchingConverter(IList<JsonConverter>? converters, Type objectType) { if (converters != null) { for (int i = 0; i < converters.Count; i++) { JsonConverter jsonConverter = converters[i]; if (jsonConverter.CanConvert(objectType)) { return jsonConverter; } } } return null; } internal void OnError(ErrorEventArgs e) { this.Error?.Invoke(this, e); } } public class JsonSerializerSettings { internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error; internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore; internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include; internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include; internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto; internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None; internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default; internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None; internal const MetadataPropertyHandling DefaultMetadataPropertyHandling = MetadataPropertyHandling.Default; internal static readonly StreamingContext DefaultContext; internal const Formatting DefaultFormatting = Formatting.None; internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat; internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime; internal const FloatParseHandling DefaultFloatParseHandling = FloatParseHandling.Double; internal const FloatFormatHandling DefaultFloatFormatHandling = FloatFormatHandling.String; internal const StringEscapeHandling DefaultStringEscapeHandling = StringEscapeHandling.Default; internal const TypeNameAssemblyFormatHandling DefaultTypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; internal static readonly CultureInfo DefaultCulture; internal const bool DefaultCheckAdditionalContent = false; internal const string DefaultDateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; internal const int DefaultMaxDepth = 64; internal Formatting? _formatting; internal DateFormatHandling? _dateFormatHandling; internal DateTimeZoneHandling? _dateTimeZoneHandling; internal DateParseHandling? _dateParseHandling; internal FloatFormatHandling? _floatFormatHandling; internal FloatParseHandling? _floatParseHandling; internal StringEscapeHandling? _stringEscapeHandling; internal CultureInfo? _culture; internal bool? _checkAdditionalContent; internal int? _maxDepth; internal bool _maxDepthSet; internal string? _dateFormatString; internal bool _dateFormatStringSet; internal TypeNameAssemblyFormatHandling? _typeNameAssemblyFormatHandling; internal DefaultValueHandling? _defaultValueHandling; internal PreserveReferencesHandling? _preserveReferencesHandling; internal NullValueHandling? _nullValueHandling; internal ObjectCreationHandling? _objectCreationHandling; internal MissingMemberHandling? _missingMemberHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal StreamingContext? _context; internal ConstructorHandling? _constructorHandling; internal TypeNameHandling? _typeNameHandling; internal MetadataPropertyHandling? _metadataPropertyHandling; public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling.GetValueOrDefault(); } set { _referenceLoopHandling = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling.GetValueOrDefault(); } set { _missingMemberHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling.GetValueOrDefault(); } set { _objectCreationHandling = value; } } public NullValueHandling NullValueHandling { get { return _nullValueHandling.GetValueOrDefault(); } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling.GetValueOrDefault(); } set { _defaultValueHandling = value; } } public IList<JsonConverter> Converters { get; set; } public PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling.GetValueOrDefault(); } set { _preserveReferencesHandling = value; } } public TypeNameHandling TypeNameHandling { get { return _typeNameHandling.GetValueOrDefault(); } set { _typeNameHandling = value; } } public MetadataPropertyHandling MetadataPropertyHandling { get { return _metadataPropertyHandling.GetValueOrDefault(); } set { _metadataPropertyHandling = value; } } [Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")] public FormatterAssemblyStyle TypeNameAssemblyFormat { get { return (FormatterAssemblyStyle)TypeNameAssemblyFormatHandling; } set { TypeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value; } } public TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get { return _typeNameAssemblyFormatHandling.GetValueOrDefault(); } set { _typeNameAssemblyFormatHandling = value; } } public ConstructorHandling ConstructorHandling { get { return _constructorHandling.GetValueOrDefault(); } set { _constructorHandling = value; } } public IContractResolver? ContractResolver { get; set; } public IEqualityComparer? EqualityComparer { get; set; } [Obsolete("Refer