Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of CrowdControl RoR2 v1.0.7
BepInEx/plugins/ConnectorLib.JSON.dll
Decompiled 4 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Threading; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("Warp World, Inc.")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyCopyright("© 2024 Warp World, Inc.")] [assembly: AssemblyFileVersion("5.0.8924.25521")] [assembly: AssemblyInformationalVersion("5.0.8924.25521+1ef6cca7b48ffec6f735086f83465220347f78d1")] [assembly: AssemblyProduct("ConnectorLib.JSON")] [assembly: AssemblyTitle("ConnectorLib.JSON")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("5.0.8924.25521")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ConnectorLib.JSON { internal class AnnotatedEnumConverter<T> : JsonConverter<T> where T : struct, Enum { [AttributeUsage(AttributeTargets.Field)] public class JsonValueAttribute : Attribute { public readonly string Value; public JsonValueAttribute(string value) { Value = value; base..ctor(); } } private static readonly Dictionary<T, JsonValueAttribute?> _attributes; static AnnotatedEnumConverter() { T[] source = (T[])Enum.GetValues(typeof(T)); _attributes = source.Select((T m) => new KeyValuePair<T, JsonValueAttribute>(m, GetAttributeOfType<JsonValueAttribute>(m))).ToDictionary(); } private static T? GetAttributeOfType<T>(Enum enumVal) where T : Attribute { Enum enumVal2 = enumVal; Type type = enumVal2.GetType(); MemberInfo memberInfo = type.GetTypeInfo().DeclaredMembers.First((MemberInfo m) => string.Equals(m.Name, enumVal2.ToString(), StringComparison.Ordinal)); object[] array = memberInfo.GetCustomAttributes(typeof(T), inherit: false).ToArray(); return (array.Length != 0) ? ((T)array[0]) : null; } public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer) { JsonValueAttribute jsonValueAttribute = _attributes[value]; if (jsonValueAttribute != null) { serializer.Serialize(writer, (object)jsonValueAttribute.Value); } else { serializer.Serialize(writer, (object)Enum.GetName(typeof(T), value)); } } public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer) { string value = serializer.Deserialize<string>(reader); if (value == null) { return default(T); } KeyValuePair<T, JsonValueAttribute>? keyValuePair = _attributes.Cast<KeyValuePair<T, JsonValueAttribute>?>().FirstOrDefault((KeyValuePair<T, JsonValueAttribute>? a) => (a?.Value?.Value?.Equals(value, StringComparison.OrdinalIgnoreCase)).GetValueOrDefault()); if (keyValuePair.HasValue) { return keyValuePair.Value.Key; } if (Enum.TryParse<T>(value, ignoreCase: true, out var result)) { return result; } return default(T); } } public class CamelCaseStringEnumConverter : JsonConverter<Enum> { public override void WriteJson(JsonWriter writer, Enum? value, JsonSerializer serializer) { if (value == null) { serializer.Serialize(writer, (object)null); } else { serializer.Serialize(writer, (object)value.ToCamelCase()); } } public override Enum ReadJson(JsonReader reader, Type objectType, Enum? existingValue, bool hasExistingValue, JsonSerializer serializer) { return ReadJToken(JToken.ReadFrom(reader), objectType); } public static Enum ReadJToken(JToken reader, Type objectType) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 JTokenType type = reader.Type; JTokenType val = type; if ((int)val != 6) { if ((int)val == 8) { string text = Extensions.Value<string>((IEnumerable<JToken>)reader); if (text == null) { throw new SerializationException("The value was null."); } try { object obj = Enum.Parse(objectType, text, ignoreCase: true); return (Enum)obj; } catch (Exception) { throw new SerializationException("The value was not recognized."); } } throw new SerializationException("The value was not a string or number."); } int? num = Extensions.Value<int>((IEnumerable<JToken>)reader); if (!num.HasValue) { throw new SerializationException("The value was null."); } return (Enum)Enum.ToObject(objectType, num.Value); } } [Serializable] public class EffectRequest : SimpleJSONRequest { [Serializable] public class Target { public string? service; public string? id; public string? name; public string? avatar; } public string? code; public string? message; public JToken? parameters; public uint? quantity; public JArray? targets; public long? duration; public string? viewer; public JArray? viewers; public int? cost; public EffectRequest() { type = RequestType.Start; } } [Serializable] public class EffectResponse : SimpleJSONResponse { private class MetadataConverter : JsonConverter<Dictionary<string, EffectResponseMetadata>?> { public override void WriteJson(JsonWriter writer, Dictionary<string, EffectResponseMetadata>? value, JsonSerializer serializer) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown if (value == null) { serializer.Serialize(writer, (object)null); return; } JObject val = new JObject(); foreach (KeyValuePair<string, EffectResponseMetadata> item in value) { JObject val2 = JObject.FromObject((object)item.Value); val2.Remove("key"); val[item.Key] = (JToken)(object)val2; } serializer.Serialize(writer, (object)val); } public override Dictionary<string, EffectResponseMetadata>? ReadJson(JsonReader reader, Type objectType, Dictionary<string, EffectResponseMetadata>? existingValue, bool hasExistingValue, JsonSerializer serializer) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown JObject val = (JObject)serializer.Deserialize(reader); if (val == null) { return null; } Dictionary<string, EffectResponseMetadata> dictionary = new Dictionary<string, EffectResponseMetadata>(); foreach (JProperty item in val.Properties()) { JObject val2 = (JObject)item.Value; val2["key"] = JToken.op_Implicit(item.Name); dictionary.Add(item.Name, ((JToken)val2).ToObject<EffectResponseMetadata>()); } return dictionary; } } public EffectStatus status; public string? message; public long timeRemaining; [JsonConverter(typeof(MetadataConverter))] public Dictionary<string, EffectResponseMetadata>? metadata; public EffectResponse() { } public EffectResponse(uint id, EffectStatus status, string? message = null) : this(id, status, 0L, message) { } [JsonConstructor] public EffectResponse(uint id, EffectStatus status, long timeRemaining, string? message = null) { base.id = id; this.status = status; this.timeRemaining = timeRemaining; this.message = message; type = ResponseType.EffectRequest; } } public class EffectResponseMetadata { public string key; public JToken? value; public EffectStatus status; public long? timeRemaining; public string? message; [JsonConstructor] public EffectResponseMetadata(string key, EffectStatus status, object? value = null, long timeRemaining = 0L, string? message = null) { this.key = key; this.value = value.IfNotNull((Func<object, JToken?>)JToken.FromObject); this.status = status; this.timeRemaining = timeRemaining; this.message = message; base..ctor(); } public static EffectResponseMetadata Success(string key, object? value, string? message = null) { return new EffectResponseMetadata(key, EffectStatus.Success, value, 0L, message); } public static EffectResponseMetadata Failure(string key) { return new EffectResponseMetadata(key, EffectStatus.Failure, null, 0L); } public static EffectResponseMetadata Failure(string key, string? message) { return new EffectResponseMetadata(key, EffectStatus.Failure, null, 0L, message); } public static EffectResponseMetadata Failure(string key, object? value, string? message = null) { return new EffectResponseMetadata(key, EffectStatus.Failure, null, 0L, message); } public static EffectResponseMetadata Retry(string key, long delay = 0L, string? message = null) { return new EffectResponseMetadata(key, EffectStatus.Retry, null, delay, message); } } [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum EffectStatus { Success = 0, Failure = 1, Unavailable = 2, Retry = 3, Queue = 4, Running = 5, Paused = 6, Resumed = 7, Finished = 8, Visible = 128, NotVisible = 129, Selectable = 130, NotSelectable = 131, NotReady = 255 } [Serializable] public class EffectUpdate : SimpleJSONResponse { [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum IdentifierType { Effect, Group, Category } [Obsolete] [JsonProperty(/*Could not decode attribute arguments.*/)] public string? code; [JsonProperty(/*Could not decode attribute arguments.*/)] public string[]? ids; public IdentifierType idType; public EffectStatus status; public string? message; public EffectUpdate() { } public EffectUpdate(string code, EffectStatus status, string? message = null) { ids = new string[1] { code }; idType = IdentifierType.Effect; this.status = status; this.message = message; type = ResponseType.EffectStatus; } } [Serializable] public class EmptyRequest : SimpleJSONRequest { } [Serializable] public class EmptyResponse : SimpleJSONResponse { } internal static class EnumEx { public static string ToCamelCase(this Enum value) { return value.ToString("G").ToCamelCase(); } } [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum GameState { Unknown = 0, Ready = 1, Error = -1, Unmodded = -2, NotFocused = -3, Loading = -4, Paused = -5, WrongMode = -6, SafeArea = -7, Cutscene = -8, BadPlayerState = -9, Menu = -10, Map = -11 } [Serializable] public class GameUpdate : SimpleJSONResponse { public GameState state; public string? message; public GameUpdate(GameState state, string? message = null) { this.state = state; this.message = message; type = ResponseType.GameUpdate; } } [Serializable] public class GenericEvent : SimpleJSONResponse { [JsonProperty(PropertyName = "internal")] public bool @internal; public string eventType; public Dictionary<string, string> data; public GenericEvent() { type = ResponseType.GenericEvent; } } internal class HexColorConverter : JsonConverter<ParameterColorValue> { private static readonly Dictionary<char, byte> CHAR_LOOKUP = new Dictionary<char, byte> { { '0', 0 }, { '1', 1 }, { '2', 2 }, { '3', 3 }, { '4', 4 }, { '5', 5 }, { '6', 6 }, { '7', 7 }, { '8', 8 }, { '9', 9 }, { 'A', 10 }, { 'B', 11 }, { 'C', 12 }, { 'D', 13 }, { 'E', 14 }, { 'F', 15 } }; public override void WriteJson(JsonWriter writer, ParameterColorValue value, JsonSerializer serializer) { serializer.Serialize(writer, (object)string.Format("#{0}{1:X2}{2:X2}{3:X2}", (value.A != byte.MaxValue) ? value.A.ToString("X2") : string.Empty, value.R, value.G, value.B)); } public override ParameterColorValue ReadJson(JsonReader reader, Type objectType, ParameterColorValue existingValue, bool hasExistingValue, JsonSerializer serializer) { string value = serializer.Deserialize<string>(reader); if (TryParse(value, out var color)) { return color; } throw new SerializationException("Unrecognized color code."); } public static bool TryParse(string value, out ParameterColorValue color) { if (value == null) { color = default(ParameterColorValue); return false; } value = value.TrimStart(new char[1] { '#' }); switch (value.Length) { case 6: { string[] array2 = Chop(value, 2); byte result2; byte red3 = (byte)(byte.TryParse(array2[0], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result2) ? result2 : 0); byte green3 = (byte)(byte.TryParse(array2[1], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result2) ? result2 : 0); byte blue3 = (byte)(byte.TryParse(array2[2], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result2) ? result2 : 0); color = ParameterColorValue.FromArgb(red3, green3, blue3); return true; } case 8: { string[] array = Chop(value, 2); byte result; byte alpha2 = (byte)(byte.TryParse(array[0], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result) ? result : 0); byte red2 = (byte)(byte.TryParse(array[1], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result) ? result : 0); byte green2 = (byte)(byte.TryParse(array[2], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result) ? result : 0); byte blue2 = (byte)(byte.TryParse(array[3], NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out result) ? result : 0); color = ParameterColorValue.FromArgb(alpha2, red2, green2, blue2); return true; } case 3: { byte value3; byte red4 = (byte)(CHAR_LOOKUP.TryGetValue(value[0], out value3) ? checked((byte)(value3 * 16)) : 0); byte green4 = (byte)(CHAR_LOOKUP.TryGetValue(value[1], out value3) ? checked((byte)(value3 * 16)) : 0); byte blue4 = (byte)(CHAR_LOOKUP.TryGetValue(value[2], out value3) ? checked((byte)(value3 * 16)) : 0); color = ParameterColorValue.FromArgb(red4, green4, blue4); return true; } case 4: { byte value2; byte alpha = (byte)(CHAR_LOOKUP.TryGetValue(value[0], out value2) ? checked((byte)(value2 * 16)) : 0); byte red = (byte)(CHAR_LOOKUP.TryGetValue(value[1], out value2) ? checked((byte)(value2 * 16)) : 0); byte green = (byte)(CHAR_LOOKUP.TryGetValue(value[2], out value2) ? checked((byte)(value2 * 16)) : 0); byte blue = (byte)(CHAR_LOOKUP.TryGetValue(value[3], out value2) ? checked((byte)(value2 * 16)) : 0); color = ParameterColorValue.FromArgb(alpha, red, green, blue); return true; } default: color = default(ParameterColorValue); return false; } } private unsafe static string[] Chop(string value, int chopLength) { int length = value.Length; char* ptr = stackalloc char[chopLength]; string[] array = new string[length]; for (int i = 0; i < length; i = checked(i + chopLength)) { int j; for (j = 0; j < chopLength; j = checked(j + 1)) { int num = checked(i + j); if (num >= length) { break; } *(char*)((byte*)ptr + checked(unchecked((nint)j) * (nint)2)) = value[num]; } array[i / chopLength] = new string(ptr, 0, j); } return array; } } internal static class IEnumerableEx { public static Dictionary<K, V> ToDictionary<K, V>(this IEnumerable<KeyValuePair<K, V>> values) where K : notnull { Dictionary<K, V> dictionary = new Dictionary<K, V>(); foreach (KeyValuePair<K, V> value in values) { dictionary.Add(value.Key, value.Value); } return dictionary; } } [Serializable] public class LoginRequest : SimpleJSONRequest { public string? login; public string? password; } [Serializable] public class MessageRequest : SimpleJSONRequest { public string? message; } [Serializable] public class MessageResponse : SimpleJSONResponse { public string? message; } internal static class ObjectEx { public static T2? IfNotNull<T1, T2>(this T1? value, Func<T1, T2?> selector) where T2 : class { return (value != null) ? selector(value) : null; } } public class ParameterColor : ParameterBase, IParameterValue { [JsonProperty(PropertyName = "value")] [JsonConverter(typeof(HexColorConverter))] public ParameterColorValue Value; [JsonIgnore] string IParameterValue.ID => ID; [JsonIgnore] string IParameterValue.Name => Name; [JsonIgnore] ParameterType IParameterValue.Type => Type; [JsonIgnore] object? IParameterValue.Value => Value; [JsonConstructor] public ParameterColor(string name, string id, ParameterColorValue value) : base(name, id, ParameterType.HexColor) { Value = value; } [JsonConstructor] public ParameterColor(string name, string id, string value) : base(name, id, ParameterType.HexColor) { if (!HexColorConverter.TryParse(value, out Value)) { throw new ArgumentException("Unknown color code.", "value"); } } } [Serializable] [DebuggerDisplay("{NameAndARGBValue}")] [TypeForwardedFrom("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public readonly struct ParameterColorValue : IEquatable<ParameterColorValue> { public static readonly ParameterColorValue Empty = default(ParameterColorValue); private const short StateARGBValueValid = 2; private const short StateValueMask = 2; private const short StateNameValid = 8; private const long NotDefinedValue = 0L; internal const int ARGBAlphaShift = 24; internal const int ARGBRedShift = 16; internal const int ARGBGreenShift = 8; internal const int ARGBBlueShift = 0; internal const uint ARGBAlphaMask = 4278190080u; internal const uint ARGBRedMask = 16711680u; internal const uint ARGBGreenMask = 65280u; internal const uint ARGBBlueMask = 255u; private readonly long value; private readonly short state; public byte R => (byte)(Value >> 16); public byte G => (byte)(Value >> 8); public byte B => (byte)Value; public byte A => (byte)(Value >> 24); public bool IsEmpty => state == 0; private long Value { get { if (((uint)state & 2u) != 0) { return value; } return 0L; } } private ParameterColorValue(long value, short state) { this.value = value; this.state = state; } private static ParameterColorValue FromArgb(uint argb) { return new ParameterColorValue(argb, 2); } public static ParameterColorValue FromArgb(int argb) { return FromArgb((uint)argb); } public static ParameterColorValue FromArgb(byte alpha, byte red, byte green, byte blue) { return FromArgb((uint)((alpha << 24) | (red << 16) | (green << 8) | blue)); } public static ParameterColorValue FromArgb(int alpha, ParameterColorValue baseColor) { return FromArgb(checked(((uint)alpha << 24) | ((uint)baseColor.Value & 0xFFFFFFu))); } public static ParameterColorValue FromArgb(byte red, byte green, byte blue) { return FromArgb(byte.MaxValue, red, green, blue); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void GetRgbValues(out byte r, out byte g, out byte b) { checked { uint num = (uint)Value; r = (byte)((num & 0xFF0000) >> 16); g = (byte)((num & 0xFF00) >> 8); b = (byte)(num & 0xFFu); } } public float GetBrightness() { GetRgbValues(out var r, out var g, out var b); int num = Math.Min(Math.Min(r, g), b); int num2 = Math.Max(Math.Max(r, g), b); return (float)checked(num2 + num) / 510f; } public float GetHue() { GetRgbValues(out var r, out var g, out var b); if (r == g && g == b) { return 0f; } int num = Math.Min(Math.Min(r, g), b); int num2 = Math.Max(Math.Max(r, g), b); checked { float num3 = num2 - num; float num4 = ((r == num2) ? ((float)(g - b) / num3) : ((g != num2) ? ((float)(r - g) / num3 + 4f) : ((float)(b - r) / num3 + 2f))); num4 *= 60f; if (num4 < 0f) { num4 += 360f; } return num4; } } public float GetSaturation() { GetRgbValues(out var r, out var g, out var b); if (r == g && g == b) { return 0f; } int num = Math.Min(Math.Min(r, g), b); int num2 = Math.Max(Math.Max(r, g), b); checked { int num3 = num2 + num; if (num3 > 255) { num3 = 510 - num2 - num; } return (float)(num2 - num) / (float)num3; } } public int ToArgb() { return (int)Value; } public override string ToString() { if (((uint)state & 2u) != 0) { return "ParameterColorValue [A=" + A + ", R=" + R + ", G=" + G + ", B=" + B + "]"; } return "ParameterColorValue [Empty]"; } public static bool operator ==(ParameterColorValue left, ParameterColorValue right) { return left.value == right.value && left.state == right.state; } public static bool operator !=(ParameterColorValue left, ParameterColorValue right) { return !(left == right); } public override bool Equals(object? obj) { return obj is ParameterColorValue other && Equals(other); } public bool Equals(ParameterColorValue other) { return this == other; } public override int GetHashCode() { long num = value; int num2 = num.GetHashCode() * 397; short num3 = state; return num2 ^ num3.GetHashCode(); } } public class ParameterValue<T> : ParameterBase, IParameterValue { [JsonProperty(PropertyName = "value")] public T? Value; [JsonIgnore] string IParameterValue.ID => ID; [JsonIgnore] string IParameterValue.Name => Name; [JsonIgnore] ParameterType IParameterValue.Type => Type; [JsonIgnore] object? IParameterValue.Value => Value; [JsonConstructor] public ParameterValue(string name, string id, T? value) : base(name, id, ParameterType.Options) { Value = value; } public override string ToString() { return Name; } } [Serializable] public class PlayerInfo : SimpleJSONRequest { public JObject? player; public PlayerInfo() { type = RequestType.Start; } } [Serializable] [JsonConverter(typeof(Converter))] public class RequestParameters : IReadOnlyList<string>, IEnumerable<string>, IEnumerable, IReadOnlyCollection<string>, IReadOnlyDictionary<string, IParameterValue>, IEnumerable<KeyValuePair<string, IParameterValue>>, IReadOnlyCollection<KeyValuePair<string, IParameterValue>> { private class Converter : JsonConverter<RequestParameters> { public override void WriteJson(JsonWriter writer, RequestParameters? value, JsonSerializer serializer) { serializer.Serialize(writer, (object)value?._parameters); } public override RequestParameters? ReadJson(JsonReader reader, Type objectType, RequestParameters? existingValue, bool hasExistingValue, JsonSerializer serializer) { JObject val = JObject.Load(reader); List<IParameterValue> list = new List<IParameterValue>(); foreach (KeyValuePair<string, JToken> item in val) { string key = item.Key; string name = Extensions.Value<string>((IEnumerable<JToken>)item.Value[(object)"name"]); switch (Extensions.Value<ParameterBase.ParameterType>((IEnumerable<JToken>)item.Value[(object)"type"])) { case ParameterBase.ParameterType.Options: { string value2 = Extensions.Value<string>((IEnumerable<JToken>)item.Value[(object)"value"]); list.Add(new ParameterValue<string>(name, key, value2)); break; } case ParameterBase.ParameterType.HexColor: { string value = Extensions.Value<string>((IEnumerable<JToken>)item.Value[(object)"value"]); if (HexColorConverter.TryParse(value, out var color)) { list.Add(new ParameterColor(name, key, color)); } break; } default: throw new SerializationException(); } } return new RequestParameters(list); } } private readonly Dictionary<string, IParameterValue> _parameters; private readonly List<string> _parameter_list; int IReadOnlyCollection<string>.Count => _parameters.Count; int IReadOnlyCollection<KeyValuePair<string, IParameterValue>>.Count => _parameters.Count; public string this[int index] => _parameter_list[index]; public IParameterValue this[string key] => _parameters[key]; public IEnumerable<string> Keys => _parameters.Keys; public IEnumerable<IParameterValue> Values => _parameters.Values; public int Count => _parameters.Count; private RequestParameters() { _parameters = new Dictionary<string, IParameterValue>(); _parameter_list = new List<string>(); } public RequestParameters(IEnumerable<IParameterValue> list) { list = list.ToArray(); _parameters = list.ToDictionary((IParameterValue d) => d.ID); _parameter_list = list.Select((IParameterValue v) => v.Value.ToString()).ToList(); } public RequestParameters(IEnumerable<KeyValuePair<string, IParameterValue>> parameters) { _parameters = parameters.ToDictionary(); _parameter_list = _parameters.Values.Select((IParameterValue p) => p.Value.ToString()).ToList(); } IEnumerator<KeyValuePair<string, IParameterValue>> IEnumerable<KeyValuePair<string, IParameterValue>>.GetEnumerator() { return _parameters.GetEnumerator(); } IEnumerator<string> IEnumerable<string>.GetEnumerator() { return _parameters.Values.Select((IParameterValue v) => v.Value?.ToString()).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<string>)this).GetEnumerator(); } public bool ContainsKey(string key) { return _parameters.ContainsKey(key); } public bool TryGetValue(string key, out IParameterValue value) { return _parameters.TryGetValue(key, out value); } public IEnumerable<string> Where(Func<string, bool> predicate) { return Enumerable.Where(this, predicate); } public IEnumerable<TResult> Select<TResult>(Func<string, TResult> selector) { return Enumerable.Select(this, selector); } public IEnumerable<TResult> SelectMany<TResult>(Func<string, IEnumerable<TResult>> selector) { return Enumerable.SelectMany(this, selector); } public IEnumerable<TResult> SelectMany<TResult>(Func<string, int, IEnumerable<TResult>> selector) { return Enumerable.SelectMany(this, selector); } public string First() { return this.First<string>(); } public string First(Func<string, bool> predicate) { return Enumerable.First(this, predicate); } public string? FirstOrDefault() { return this.FirstOrDefault<string>(); } public string FirstOrDefault(string defaultValue) { return this.FirstOrDefault<string>() ?? defaultValue; } public string? FirstOrDefault(Func<string, bool> predicate) { return Enumerable.FirstOrDefault(this, predicate); } public string FirstOrDefault(Func<string, bool> predicate, string defaultValue) { return Enumerable.FirstOrDefault(this, predicate) ?? defaultValue; } public bool Any() { return this.Any<string>(); } public bool Any(Func<string, bool> predicate) { return Enumerable.Any(this, predicate); } } public interface IParameterValue { string ID { get; } string Name { get; } ParameterBase.ParameterType Type { get; } object? Value { get; } } public abstract class ParameterBase { [JsonConverter(typeof(AnnotatedEnumConverter<ParameterType>))] public enum ParameterType { [AnnotatedEnumConverter<ParameterType>.JsonValue("options")] Options, [AnnotatedEnumConverter<ParameterType>.JsonValue("hex-color")] HexColor } [JsonIgnore] public readonly string ID; [JsonProperty(PropertyName = "title")] public readonly string Name; [JsonProperty(PropertyName = "type")] public readonly ParameterType Type; protected ParameterBase(string name, string id, ParameterType type) { ID = id; Name = name; Type = type; } } [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum RequestType : byte { Test = 0, Start = 1, Stop = 2, GenericEvent = 16, RpcResponse = 208, PlayerInfo = 224, Login = 240, GameUpdate = 253, KeepAlive = byte.MaxValue } [JsonConverter(typeof(CamelCaseStringEnumConverter))] public enum ResponseType : byte { EffectRequest = 0, EffectStatus = 1, GenericEvent = 16, LoadEvent = 24, SaveEvent = 25, RpcRequest = 208, Login = 240, LoginSuccess = 241, GameUpdate = 253, Disconnect = 254, KeepAlive = byte.MaxValue } [Serializable] public class RpcRequest : SimpleJSONResponse { public string? method; public object?[]? args; } [Serializable] public class RpcResponse : SimpleJSONRequest { public object? value; public RpcResponse() { type = RequestType.RpcResponse; } } public abstract class SimpleJSONMessage { public static readonly JsonSerializerSettings JSON_SERIALIZER_SETTINGS = new JsonSerializerSettings { NullValueHandling = (NullValueHandling)1, MissingMemberHandling = (MissingMemberHandling)0, Formatting = (Formatting)0 }; public static readonly JsonSerializer JSON_SERIALIZER = new JsonSerializer { NullValueHandling = JSON_SERIALIZER_SETTINGS.NullValueHandling, MissingMemberHandling = JSON_SERIALIZER_SETTINGS.MissingMemberHandling, Formatting = JSON_SERIALIZER_SETTINGS.Formatting }; private static int _next_id = 0; public static uint NextID { get { uint result; while ((result = (uint)Interlocked.Increment(ref _next_id)) == 0) { } return result; } } public abstract uint ID { get; } public abstract bool IsKeepAlive { get; } } [Serializable] public class SimpleJSONRequest : SimpleJSONMessage { public uint id = SimpleJSONMessage.NextID; public RequestType type; [JsonIgnore] public override uint ID => id; [JsonIgnore] public override bool IsKeepAlive => type == RequestType.KeepAlive; public static SimpleJSONRequest Parse(string json) { return Parse(JObject.Parse(json)); } public static SimpleJSONRequest Parse(JObject j) { switch ((RequestType)(object)CamelCaseStringEnumConverter.ReadJToken(j.GetValue("type"), typeof(RequestType))) { case RequestType.Test: case RequestType.Start: return ((JToken)j).ToObject<EffectRequest>(SimpleJSONMessage.JSON_SERIALIZER); case RequestType.Stop: return ((JToken)j).ToObject<EffectRequest>(SimpleJSONMessage.JSON_SERIALIZER); case RequestType.RpcResponse: return ((JToken)j).ToObject<RpcResponse>(SimpleJSONMessage.JSON_SERIALIZER); case RequestType.PlayerInfo: return ((JToken)j).ToObject<PlayerInfo>(SimpleJSONMessage.JSON_SERIALIZER); case RequestType.Login: return ((JToken)j).ToObject<MessageRequest>(SimpleJSONMessage.JSON_SERIALIZER); case RequestType.GameUpdate: return ((JToken)j).ToObject<EmptyRequest>(SimpleJSONMessage.JSON_SERIALIZER); case RequestType.KeepAlive: return ((JToken)j).ToObject<EmptyRequest>(SimpleJSONMessage.JSON_SERIALIZER); default: throw new SerializationException("Message type was missing or unknown."); } } } [Serializable] public class SimpleJSONResponse : SimpleJSONMessage { public uint id; public ResponseType type; [JsonIgnore] public override uint ID => id; [JsonIgnore] public override bool IsKeepAlive => type == ResponseType.KeepAlive; [JsonIgnore] public static SimpleJSONResponse KeepAlive { get; } = new EmptyResponse { type = ResponseType.KeepAlive }; public static SimpleJSONResponse Parse(string json) { return Parse(JObject.Parse(json)); } public static SimpleJSONResponse Parse(JObject j) { return (ResponseType)(object)CamelCaseStringEnumConverter.ReadJToken(j.GetValue("type"), typeof(ResponseType)) switch { ResponseType.EffectRequest => ((JToken)j).ToObject<EffectResponse>(SimpleJSONMessage.JSON_SERIALIZER), ResponseType.EffectStatus => ((JToken)j).ToObject<EffectUpdate>(SimpleJSONMessage.JSON_SERIALIZER), ResponseType.RpcRequest => ((JToken)j).ToObject<RpcRequest>(SimpleJSONMessage.JSON_SERIALIZER), ResponseType.GenericEvent => ((JToken)j).ToObject<GenericEvent>(SimpleJSONMessage.JSON_SERIALIZER), ResponseType.Login => ((JToken)j).ToObject<EmptyResponse>(SimpleJSONMessage.JSON_SERIALIZER), ResponseType.LoginSuccess => ((JToken)j).ToObject<EmptyResponse>(SimpleJSONMessage.JSON_SERIALIZER), ResponseType.GameUpdate => ((JToken)j).ToObject<GameUpdate>(SimpleJSONMessage.JSON_SERIALIZER), ResponseType.Disconnect => ((JToken)j).ToObject<MessageResponse>(SimpleJSONMessage.JSON_SERIALIZER), ResponseType.KeepAlive => ((JToken)j).ToObject<EmptyResponse>(SimpleJSONMessage.JSON_SERIALIZER), _ => throw new SerializationException("Message type was missing or unknown."), }; } } internal static class StringEx { public static string ToCamelCase(this string input) { bool flag = false; string text = ""; checked { for (int i = 0; i < input.Length; i++) { if (char.IsUpper(input[i])) { if (flag) { text += input.Substring(i); break; } text += char.ToLower(input[i]); } else { flag = true; text = ((i <= 1 || !char.IsUpper(input[i - 1]) || !char.IsUpper(input[i - 2])) ? (text + input[i]) : (text.Substring(0, text.Length - 1) + char.ToUpper(input[i - 1]) + input[i])); } } return text; } } } }
BepInEx/plugins/CrowdControl.dll
Decompiled 4 months 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.Diagnostics; using System.Globalization; using System.Linq; using System.Net; using System.Net.Sockets; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using System.Threading; using BepInEx; using BepInEx.Logging; using BepinControl.Events; using ConnectorLib.JSON; using EntityStates; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using RoR2; using RoR2.Artifacts; using RoR2.CharacterAI; using RoR2.Navigation; using RoR2.UI; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("LethalCompanyTestMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LethalCompanyTestMod")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("d4f6b961-e8ae-4e4b-950c-37644e42d4ca")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.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 BepinControl { public class ControlClient { public static readonly string CV_HOST = "127.0.0.1"; public static readonly int CV_PORT = 51337; private static readonly string[] CommonMetadata = new string[1] { "health" }; private static readonly Dictionary<string, EffectDelegate> Delegate = new Dictionary<string, EffectDelegate> { { "spawnmonster_archwisp_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_beetle_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_bell_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_bison_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_golem_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_hermitcrab_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_imp_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_jellyfish_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_lemurian_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_lesserwisp_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_minimushroom_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_vulture_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_beetleguard_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_claybruiser_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_greaterwisp_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_lemurianbruiser_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_lunargolem_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_lunarwisp_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_nullifier_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_parent_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_scav_normal", EffectDelegates.SpawnMonster }, { "spawnmonster_archwisp_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_beetle_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_bell_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_bison_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_golem_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_hermitcrab_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_imp_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_jellyfish_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_lemurian_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_lesserwisp_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_minimushroom_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_vulture_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_beetleguard_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_claybruiser_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_greaterwisp_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_lemurianbruiser_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_lunargolem_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_lunarwisp_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_nullifier_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_parent_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_scav_elite", EffectDelegates.SpawnMonster }, { "spawnmonster_beetlequeen_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_clayboss_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_electricworm_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_gravekeeper_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_impboss_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_magmaworm_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_scavlunar_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_titangold_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_grandparent_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_brother_boss", EffectDelegates.SpawnMonster }, { "spawnmonster_vagrant_boss", EffectDelegates.SpawnMonster }, { "spawnally_archwisp_elite", EffectDelegates.SpawnAlly }, { "spawnally_beetle_elite", EffectDelegates.SpawnAlly }, { "spawnally_bell_elite", EffectDelegates.SpawnAlly }, { "spawnally_bison_elite", EffectDelegates.SpawnAlly }, { "spawnally_brother_elite", EffectDelegates.SpawnAlly }, { "spawnally_golem_elite", EffectDelegates.SpawnAlly }, { "spawnally_hermitcrab_elite", EffectDelegates.SpawnAlly }, { "spawnally_imp_elite", EffectDelegates.SpawnAlly }, { "spawnally_jellyfish_elite", EffectDelegates.SpawnAlly }, { "spawnally_lemurian_elite", EffectDelegates.SpawnAlly }, { "spawnally_lesserwisp_elite", EffectDelegates.SpawnAlly }, { "spawnally_minimushroom_elite", EffectDelegates.SpawnAlly }, { "spawnally_vulture_elite", EffectDelegates.SpawnAlly }, { "spawnally_beetleguard_elite", EffectDelegates.SpawnAlly }, { "spawnally_claybruiser_elite", EffectDelegates.SpawnAlly }, { "spawnally_greaterwisp_elite", EffectDelegates.SpawnAlly }, { "spawnally_lemurianbruiser_elite", EffectDelegates.SpawnAlly }, { "spawnally_lunargolem_elite", EffectDelegates.SpawnAlly }, { "spawnally_lunarwisp_elite", EffectDelegates.SpawnAlly }, { "spawnally_nullifier_elite", EffectDelegates.SpawnAlly }, { "spawnally_parent_elite", EffectDelegates.SpawnAlly }, { "spawnally_scav_elite", EffectDelegates.SpawnAlly }, { "levelup", EffectDelegates.LevelUp }, { "leveldown", EffectDelegates.LevelDown }, { "healplayer", EffectDelegates.HealPlayer }, { "damageplayer", EffectDelegates.DamagePlayer }, { "barrierplayer", EffectDelegates.BarrierPlayer }, { "killplayer", EffectDelegates.KillPlayer }, { "reviveplayers", EffectDelegates.RevivePlayers }, { "invincibility", EffectDelegates.Invincibility }, { "ohko", EffectDelegates.OHKO }, { "extralife", EffectDelegates.ExtraLife }, { "givemoney_small", EffectDelegates.GiveMoney }, { "givemoney_medium", EffectDelegates.GiveMoney }, { "givemoney_large", EffectDelegates.GiveMoney }, { "takemoney_half", EffectDelegates.TakeMoney }, { "takemoney_all", EffectDelegates.TakeMoney }, { "freeunlock", EffectDelegates.FreeUnlock }, { "addbuff_crocoregen", EffectDelegates.AddBuff }, { "addbuff_nocooldowns", EffectDelegates.AddBuff }, { "addbuff_energized", EffectDelegates.AddBuff }, { "addbuff_fullcrit", EffectDelegates.AddBuff }, { "addbuff_lifesteal", EffectDelegates.AddBuff }, { "addbuff_powerbuff", EffectDelegates.AddBuff }, { "addbuff_boostallstats", EffectDelegates.AddBuff }, { "addbuff_delayeddamage", EffectDelegates.AddBuff }, { "addbuff_disableskills", EffectDelegates.AddBuff }, { "addbuff_blinded", EffectDelegates.AddBuff }, { "addbuff_blazingtrail", EffectDelegates.AddBuff }, { "addbuff_spectral", EffectDelegates.AddBuff }, { "addbuff_glacial", EffectDelegates.AddBuff }, { "addbuff_malachite", EffectDelegates.AddBuff }, { "addbuff_cloak", EffectDelegates.AddBuff }, { "addbuff_beetlejuice", EffectDelegates.AddBuff }, { "widefov", EffectDelegates.WideFOV }, { "narrowfov", EffectDelegates.NarrowFOV }, { "flipcamera", EffectDelegates.FlipCamera }, { "spincamera", EffectDelegates.SpinCamera }, { "launch", EffectDelegates.Launch }, { "slowmovement", EffectDelegates.SlowMovement }, { "fastmovement", EffectDelegates.FastMovement }, { "freezemovement", EffectDelegates.FreezeMovement }, { "forcedjumps", EffectDelegates.ForcedJumps }, { "disablejump", EffectDelegates.DisableJump }, { "mountainshrine", EffectDelegates.MountainShrine }, { "ordershrine", EffectDelegates.OrderShrine }, { "spawnitem_all_common", EffectDelegates.SpawnItem }, { "spawnitem_all_uncommon", EffectDelegates.SpawnItem }, { "spawnitem_all_rare", EffectDelegates.SpawnItem }, { "spawnitem_all_boss", EffectDelegates.SpawnItem }, { "spawnitem_all_lunar", EffectDelegates.SpawnItem }, { "spawnitem_all_equipment", EffectDelegates.SpawnItem }, { "spawnitem_all_vcommon", EffectDelegates.SpawnItem }, { "spawnitem_all_vuncommon", EffectDelegates.SpawnItem }, { "spawnitem_all_vrare", EffectDelegates.SpawnItem }, { "spawnitem_all_vboss", EffectDelegates.SpawnItem }, { "event_bountyhunters", EffectDelegates.BountyHunters }, { "event_meteors", EffectDelegates.MeteorStorm } }; private bool paused; public bool inGame = true; public static readonly ControlClient Instance = new ControlClient(); public static readonly int RECV_BUF = 4096; public static readonly int RECV_TIME = 5000000; private static readonly EmptyResponse KEEPALIVE = new EmptyResponse { type = (ResponseType)255 }; private GameState? _last_game_state; private const float GAME_STATUS_UPDATE_INTERVAL = 1f; private float _game_status_update_timer = 0f; private IPEndPoint Endpoint { get; } private Queue<SimpleJSONRequest> Requests { get; } private bool Running { get; set; } public static Socket? Socket { get; set; } private ControlClient() { Endpoint = new IPEndPoint(IPAddress.Parse(CV_HOST), CV_PORT); Requests = new Queue<SimpleJSONRequest>(); Running = true; Socket = null; } public bool isReady() { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) bool result = true; try { if (!NetworkServer.active) { result = false; } if (!Object.op_Implicit((Object)(object)Run.instance) || Run.instance.isGameOverServer) { result = false; } if (!Object.op_Implicit((Object)(object)Stage.instance) || Stage.instance.completed) { result = false; } if (Object.op_Implicit((Object)(object)GameOverController.instance)) { result = false; } FixedTimeStamp entryTime = Stage.instance.entryTime; if (((FixedTimeStamp)(ref entryTime)).timeSince < 6f) { result = false; } if (SceneExitController.isRunning) { result = false; } if (Object.op_Implicit((Object)(object)TeleporterInteraction.instance) && TeleporterInteraction.instance.isInFinalSequence) { result = false; } if (PauseManager.PauseScreenIsOpen()) { result = false; } } catch { return false; } return result; } public bool HideEffect(string code) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse)new EffectUpdate(code, (EffectStatus)129, (string)null)); } public bool ShowEffect(string code) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse)new EffectUpdate(code, (EffectStatus)128, (string)null)); } public bool DisableEffect(string code) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse)new EffectUpdate(code, (EffectStatus)131, (string)null)); } public bool EnableEffect(string code) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown return Send((SimpleJSONResponse)new EffectUpdate(code, (EffectStatus)130, (string)null)); } private void ClientLoop() { Mod.mls.LogInfo((object)"Connected to Crowd Control"); Timer timer = new Timer(timeUpdate, null, 0, 200); try { while (Running) { SimpleJSONRequest val = Recieve(this, Socket); if (val == null || ((SimpleJSONMessage)val).IsKeepAlive) { Thread.Sleep(0); continue; } lock (Requests) { Requests.Enqueue(val); } } } catch (Exception) { Mod.mls.LogInfo((object)"Disconnected from Crowd Control"); Socket?.Close(); } } public SimpleJSONRequest? Recieve(ControlClient client, Socket socket) { byte[] array = new byte[RECV_BUF]; string text = ""; int num = 0; do { if (!client.IsRunning()) { return null; } if (socket.Poll(RECV_TIME, SelectMode.SelectRead)) { num = socket.Receive(array); if (num < 0) { return null; } text += Encoding.ASCII.GetString(array); } else { KeepAlive(); } } while (num == 0 || (num == RECV_BUF && array[RECV_BUF - 1] != 0)); return SimpleJSONRequest.Parse(text); } public bool KeepAlive() { return Send((SimpleJSONResponse)(object)KEEPALIVE); } public bool Send(SimpleJSONResponse message) { byte[] bytes = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject((object)message)); byte[] array = new byte[bytes.Length + 1]; Buffer.BlockCopy(bytes, 0, array, 0, bytes.Length); array[bytes.Length] = 0; int num = Socket?.Send(array) ?? (-1); return num == array.Length; } public void timeUpdate(object state) { inGame = true; if (!isReady()) { inGame = false; } if (!inGame) { TimedThread.addTime(200); paused = true; } else if (paused) { paused = false; TimedThread.unPause(); TimedThread.tickTime(200); } else { TimedThread.tickTime(200); } } public bool IsRunning() { return Running; } public void NetworkLoop() { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; while (Running) { Mod.mls.LogInfo((object)"Attempting to connect to Crowd Control"); try { Socket = new Socket(Endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, optionValue: true); if (Socket.BeginConnect(Endpoint, null, null).AsyncWaitHandle.WaitOne(10000, exitContext: true) && Socket.Connected) { ClientLoop(); } else { Mod.mls.LogInfo((object)"Failed to connect to Crowd Control"); } Socket.Close(); } catch (Exception ex) { Mod.mls.LogInfo((object)ex.GetType().Name); Mod.mls.LogInfo((object)"Failed to connect to Crowd Control"); } Thread.Sleep(10000); } } public void FixedUpdate() { _game_status_update_timer += Time.fixedDeltaTime; if (_game_status_update_timer >= 1f) { UpdateGameState(); _game_status_update_timer = 0f; } } public void RequestLoop() { //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Expected O, but got Unknown //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Invalid comparison between Unknown and I4 //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Expected O, but got Unknown //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected O, but got Unknown //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; while (Running) { try { SimpleJSONRequest val; lock (Requests) { if (Requests.Count == 0) { continue; } val = Requests.Dequeue(); goto IL_005e; } IL_005e: EffectRequest val2 = (EffectRequest)(object)((val is EffectRequest) ? val : null); if (val2 != null) { string code = val2.code; try { EffectDelegate value; EffectResponse message = (EffectResponse)((code == null) ? ((object)new EffectResponse(((SimpleJSONMessage)val2).ID, (EffectStatus)2, "No effect code was sent.")) : ((!isReady()) ? ((object)new EffectResponse(((SimpleJSONMessage)val2).ID, (EffectStatus)3, (string)null)) : ((!Delegate.TryGetValue(code, out value)) ? ((object)new EffectResponse(((SimpleJSONMessage)val2).ID, (EffectStatus)2, "Unknown effect code: " + code)) : ((object)value(this, val2))))); Send((SimpleJSONResponse)(object)message); } catch (KeyNotFoundException) { Send((SimpleJSONResponse)new EffectResponse(((SimpleJSONMessage)val2).ID, (EffectStatus)2, "Request error for '" + code + "'")); } } else if ((int)val.type == 253) { UpdateGameState(force: true); } } catch (Exception) { Mod.mls.LogInfo((object)"Disconnected from Crowd Control"); Socket?.Close(); } } } public void Stop() { Running = false; } private bool UpdateGameState(bool force = false) { return UpdateGameState((GameState)1, force); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool UpdateGameState(GameState newState, bool force) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return UpdateGameState(newState, null, force); } private bool UpdateGameState(GameState newState, string? message = null, bool force = false) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_0043: Expected O, but got Unknown if (force || _last_game_state != (GameState?)newState) { _last_game_state = newState; return Send((SimpleJSONResponse)new GameUpdate(newState, message)); } return true; } } public delegate EffectResponse EffectDelegate(ControlClient client, EffectRequest req); public static class EffectDelegates { public const string CC_COLOR_MAIN = "ffec3b"; public const string CC_COLOR_MAIN_ACCENT = "2b2a34"; public static EffectResponse SpawnMonster(ControlClient client, EffectRequest req) { //IL_000f: 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_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string code = req2.code; string spawnCode = code.Split(new char[1] { '_' })[1]; string text = code.Split(new char[1] { '_' })[2]; string monsterName = Mod.monsters[spawnCode].name; string text2 = ""; try { Mod.ActionQueue.Enqueue(delegate { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: 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_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Invalid comparison between Unknown and I4 //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_027b: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_03b6: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) char value = char.ToLower(monsterName[0]); string text3 = "a"; if (Enumerable.Contains("aeiou", value)) { text3 = "an"; } SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " spawned " + text3 + " " + monsterName + ".</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); CharacterMaster val3 = null; SpawnCard val4 = LegacyResourcesAPI.Load<SpawnCard>(Mod.monsters[spawnCode].card); GameObject prefab = val4.prefab; NodeGraph nodeGraph = SceneInfo.instance.GetNodeGraph(val4.nodeGraphType); CharacterBody localBody = Mod.getLocalBody(); Vector3 position = ((Component)localBody).transform.position; float num = Mod.rnd.Next(0, 30) - 15; float num2 = Mod.rnd.Next(0, 30) - 15; Vector3 val5 = default(Vector3); ((Vector3)(ref val5))..ctor(position.x + num, position.y, position.z + num2); Quaternion identity = Quaternion.identity; if ((int)val4.nodeGraphType == 0) { NodeIndex val6 = nodeGraph.FindClosestNodeWithFlagConditions(val5, val4.hullSize, (NodeFlags)0, (NodeFlags)0, false); if (!nodeGraph.GetNodePosition(val6, ref val5)) { Mod.mls.LogInfo((object)$"direct spawn position = {val5}"); } else { RaycastHit val7 = default(RaycastHit); Ray val8 = default(Ray); ((Ray)(ref val8))..ctor(val5 + Vector3.up * 2.5f, Vector3.down); float num3 = 4f; float num4 = 1f; CapsuleCollider component = prefab.GetComponent<CapsuleCollider>(); if (Object.op_Implicit((Object)(object)component)) { num4 = component.radius; } else { SphereCollider component2 = prefab.GetComponent<SphereCollider>(); if (Object.op_Implicit((Object)(object)component2)) { num4 = component2.radius; } } Ray val9 = val8; float num5 = num4; LayerIndex world = LayerIndex.world; if (Physics.SphereCast(val9, num5, ref val7, num3, LayerMask.op_Implicit(((LayerIndex)(ref world)).mask))) { val5.y = ((Ray)(ref val8)).origin.y - ((RaycastHit)(ref val7)).distance; } val5.y += Util.GetBodyPrefabFootOffset(prefab); } } GameObject val10 = Object.Instantiate<GameObject>(prefab, val5, identity); CharacterMaster component3 = val10.GetComponent<CharacterMaster>(); NetworkServer.Spawn(val10); component3.SpawnBody(val5, identity); component3.inventory.GiveItem(Items.UseAmbientLevel, 1); if (Mod.rnd.Next(0, 5) == 1) { int num6 = Mod.rnd.Next(0, 4); EliteDef val11 = Elites.Lightning; switch (num6) { case 0: val11 = ((Mod.rnd.Next(0, 5) != 1) ? Elites.Lightning : Elites.LightningHonor); break; case 1: val11 = ((Mod.rnd.Next(0, 5) != 1) ? Elites.Ice : Elites.IceHonor); break; case 2: val11 = ((Mod.rnd.Next(0, 5) != 1) ? Elites.Fire : Elites.FireHonor); break; case 3: val11 = ((Mod.rnd.Next(0, 5) != 1) ? Elites.Earth : Elites.EarthHonor); break; } if ((Object)(object)val11 != (Object)null) { component3.inventory.SetEquipmentIndex(val11.eliteEquipmentDef.equipmentIndex); component3.inventory.GiveItem(Items.BoostHp, Mathf.RoundToInt((val11.healthBoostCoefficient - 1f) * 10f)); component3.inventory.GiveItem(Items.BoostDamage, Mathf.RoundToInt(val11.damageBoostCoefficient - 1f) * 10); } } component3.teamIndex = (TeamIndex)2; component3.GetBody().teamComponent.teamIndex = (TeamIndex)2; DeathRewards component4 = component3.GetBodyObject().GetComponent<DeathRewards>(); if ((Object)(object)component4 != (Object)null) { component4.expReward = (uint)Mathf.Max(1f, (float)val4.directorCreditCost * 2f * 0.3f * Run.instance.compensatedDifficultyCoefficient); component4.goldReward = (uint)Mathf.Max(1f, (float)val4.directorCreditCost * 2f * 0.7f * Run.instance.compensatedDifficultyCoefficient); } val3 = component3; }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text2); } public static EffectResponse SpawnAlly(ControlClient client, EffectRequest req) { //IL_000f: 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_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string code = req2.code; string spawnCode = code.Split(new char[1] { '_' })[1]; string text = code.Split(new char[1] { '_' })[2]; string monsterName = Mod.monsters[spawnCode].name; string text2 = ""; try { Mod.ActionQueue.Enqueue(delegate { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: 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_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Invalid comparison between Unknown and I4 //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_027b: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_03b6: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) char value = char.ToLower(monsterName[0]); string text3 = "a"; if (Enumerable.Contains("aeiou", value)) { text3 = "an"; } SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " spawned " + text3 + " ally " + monsterName + ".</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); CharacterMaster val3 = null; SpawnCard val4 = LegacyResourcesAPI.Load<SpawnCard>(Mod.monsters[spawnCode].card); GameObject prefab = val4.prefab; NodeGraph nodeGraph = SceneInfo.instance.GetNodeGraph(val4.nodeGraphType); CharacterBody localBody = Mod.getLocalBody(); Vector3 position = ((Component)localBody).transform.position; float num = Mod.rnd.Next(0, 20) - 10; float num2 = Mod.rnd.Next(0, 20) - 10; Vector3 val5 = default(Vector3); ((Vector3)(ref val5))..ctor(position.x + num, position.y, position.z + num2); Quaternion identity = Quaternion.identity; if ((int)val4.nodeGraphType == 0) { NodeIndex val6 = nodeGraph.FindClosestNodeWithFlagConditions(val5, val4.hullSize, (NodeFlags)0, (NodeFlags)0, false); if (!nodeGraph.GetNodePosition(val6, ref val5)) { Mod.mls.LogInfo((object)$"direct spawn position = {val5}"); } else { RaycastHit val7 = default(RaycastHit); Ray val8 = default(Ray); ((Ray)(ref val8))..ctor(val5 + Vector3.up * 2.5f, Vector3.down); float num3 = 4f; float num4 = 1f; CapsuleCollider component = prefab.GetComponent<CapsuleCollider>(); if (Object.op_Implicit((Object)(object)component)) { num4 = component.radius; } else { SphereCollider component2 = prefab.GetComponent<SphereCollider>(); if (Object.op_Implicit((Object)(object)component2)) { num4 = component2.radius; } } Ray val9 = val8; float num5 = num4; LayerIndex world = LayerIndex.world; if (Physics.SphereCast(val9, num5, ref val7, num3, LayerMask.op_Implicit(((LayerIndex)(ref world)).mask))) { val5.y = ((Ray)(ref val8)).origin.y - ((RaycastHit)(ref val7)).distance; } val5.y += Util.GetBodyPrefabFootOffset(prefab); } } GameObject val10 = Object.Instantiate<GameObject>(prefab, val5, identity); CharacterMaster component3 = val10.GetComponent<CharacterMaster>(); NetworkServer.Spawn(val10); component3.SpawnBody(val5, identity); component3.inventory.GiveItem(Items.UseAmbientLevel, 1); if (Mod.rnd.Next(0, 3) == 1) { int num6 = Mod.rnd.Next(0, 4); EliteDef val11 = Elites.Lightning; switch (num6) { case 0: val11 = ((Mod.rnd.Next(0, 5) != 1) ? Elites.Lightning : Elites.LightningHonor); break; case 1: val11 = ((Mod.rnd.Next(0, 5) != 1) ? Elites.Ice : Elites.IceHonor); break; case 2: val11 = ((Mod.rnd.Next(0, 5) != 1) ? Elites.Fire : Elites.FireHonor); break; case 3: val11 = ((Mod.rnd.Next(0, 5) != 1) ? Elites.Earth : Elites.EarthHonor); break; } if ((Object)(object)val11 != (Object)null) { component3.inventory.SetEquipmentIndex(val11.eliteEquipmentDef.equipmentIndex); component3.inventory.GiveItem(Items.BoostHp, Mathf.RoundToInt((val11.healthBoostCoefficient - 1f) * 10f)); component3.inventory.GiveItem(Items.BoostDamage, Mathf.RoundToInt(val11.damageBoostCoefficient - 1f) * 10); } } component3.teamIndex = (TeamIndex)1; component3.GetBody().teamComponent.teamIndex = (TeamIndex)1; DeathRewards component4 = component3.GetBodyObject().GetComponent<DeathRewards>(); if ((Object)(object)component4 != (Object)null) { component4.expReward = (uint)Mathf.Max(1f, (float)val4.directorCreditCost * 2f * 0.3f * Run.instance.compensatedDifficultyCoefficient); component4.goldReward = (uint)Mathf.Max(1f, (float)val4.directorCreditCost * 2f * 0.7f * Run.instance.compensatedDifficultyCoefficient); } val3 = component3; }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text2); } public static EffectResponse MountainShrine(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { if (!Object.op_Implicit((Object)(object)TeleporterInteraction.instance)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (!TeleporterInteraction.instance.isIdle) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TeleporterInteraction.instance.shrineBonusStacks >= 3) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: 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_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = "<color=#ffec3b>" + req2.viewer + " used shrine of the mountain.</color>" }); foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { CharacterBody body = instance.master.GetBody(); if (Object.op_Implicit((Object)(object)body)) { Chat.SendBroadcastChat((ChatMessageBase)new SubjectFormatChatMessage { subjectAsCharacterBody = body, baseToken = "SHRINE_BOSS_USE_MESSAGE" }); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ShrineUseEffect"), new EffectData { origin = body.corePosition, rotation = Quaternion.identity, scale = body.bestFitRadius * 2f, color = Color32.op_Implicit(new Color(0.7372549f, 77f / 85f, 0.94509804f)) }, true); } } if (SceneCatalog.GetSceneDefForCurrentScene().isFinalStage) { foreach (TeamComponent teamMember in TeamComponent.GetTeamMembers((TeamIndex)2)) { CharacterBody body2 = teamMember.body; if (Object.op_Implicit((Object)(object)body2) && body2.inventory.GetItemCount(Items.ExtraLife) == 0 && body2.inventory.GetItemCount(Items.ExtraLifeConsumed) == 0) { body2.inventory.GiveItem(Items.ExtraLife, 1); body2.inventory.GiveRandomItems(Run.instance.livingPlayerCount, false, true); } } } TeleporterInteraction.instance.AddShrineStack(); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse OrderShrine(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0057: 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_0060: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_00a0: 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_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: 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_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: 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_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Expected O, but got Unknown Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = "<color=#ffec3b>" + req2.viewer + " used shrine of order.</color>" }); foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { if (!instance.master.IsDeadAndOutOfLivesServer()) { Inventory inventory = instance.master.inventory; if (Object.op_Implicit((Object)(object)inventory)) { inventory.ShrineRestackInventory(RoR2Application.rng); CharacterBody body = instance.master.GetBody(); if (Object.op_Implicit((Object)(object)body)) { Chat.SendBroadcastChat((ChatMessageBase)new SubjectFormatChatMessage { subjectAsCharacterBody = body, baseToken = "SHRINE_RESTACK_USE_MESSAGE" }); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ShrineUseEffect"), new EffectData { origin = body.corePosition, rotation = Quaternion.identity, scale = body.bestFitRadius * 2f, color = Color32.op_Implicit(new Color(1f, 0.23f, 0.6337214f)) }, true); } } } } }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse LevelUp(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { if (TeamManager.instance.GetTeamLevel((TeamIndex)1) >= 94) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = "<color=ffec3b>" + req2.viewer + " leveled you up.</color>" }); TeamManager.instance.SetTeamLevel((TeamIndex)1, TeamManager.instance.GetTeamLevel((TeamIndex)1) + 1); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse LevelDown(ControlClient client, EffectRequest req) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown EffectStatus val = (EffectStatus)0; string text = ""; try { Mod.ActionQueue.Enqueue(delegate { //IL_001b: 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_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0074: 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_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Invalid comparison between Unknown and I4 //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: 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_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: 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_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) CharacterMaster val2 = null; SpawnCard val3 = LegacyResourcesAPI.Load<SpawnCard>("SpawnCards/CharacterSpawnCards/cscBeetleQueen"); GameObject prefab = val3.prefab; NodeGraph nodeGraph = SceneInfo.instance.GetNodeGraph(val3.nodeGraphType); CharacterBody localBody = Mod.getLocalBody(); Vector3 position = ((Component)localBody).transform.position; float num = Mod.rnd.Next(0, 40) - 20; float num2 = Mod.rnd.Next(0, 40) - 20; Vector3 val4 = default(Vector3); ((Vector3)(ref val4))..ctor(position.x + num, position.y, position.z + num2); Quaternion identity = Quaternion.identity; if ((int)val3.nodeGraphType == 0) { NodeIndex val5 = nodeGraph.FindClosestNodeWithFlagConditions(val4, val3.hullSize, (NodeFlags)0, (NodeFlags)0, false); if (!nodeGraph.GetNodePosition(val5, ref val4)) { Mod.mls.LogInfo((object)$"direct spawn position = {val4}"); } else { RaycastHit val6 = default(RaycastHit); Ray val7 = default(Ray); ((Ray)(ref val7))..ctor(val4 + Vector3.up * 2.5f, Vector3.down); float num3 = 4f; float num4 = 1f; CapsuleCollider component = prefab.GetComponent<CapsuleCollider>(); if (Object.op_Implicit((Object)(object)component)) { num4 = component.radius; } else { SphereCollider component2 = prefab.GetComponent<SphereCollider>(); if (Object.op_Implicit((Object)(object)component2)) { num4 = component2.radius; } } Ray val8 = val7; float num5 = num4; LayerIndex world = LayerIndex.world; if (Physics.SphereCast(val8, num5, ref val6, num3, LayerMask.op_Implicit(((LayerIndex)(ref world)).mask))) { val4.y = ((Ray)(ref val7)).origin.y - ((RaycastHit)(ref val6)).distance; } val4.y += Util.GetBodyPrefabFootOffset(prefab); } } GameObject val9 = Object.Instantiate<GameObject>(prefab, val4, identity); CharacterMaster component3 = val9.GetComponent<CharacterMaster>(); NetworkServer.Spawn(val9); component3.SpawnBody(val4, identity); component3.inventory.GiveItem(Items.UseAmbientLevel, 1); component3.teamIndex = (TeamIndex)2; component3.GetBody().teamComponent.teamIndex = (TeamIndex)2; DeathRewards component4 = component3.GetBodyObject().GetComponent<DeathRewards>(); if ((Object)(object)component4 != (Object)null) { component4.expReward = (uint)Mathf.Max(1f, (float)val3.directorCreditCost * 2f * 0.3f * Run.instance.compensatedDifficultyCoefficient); component4.goldReward = (uint)Mathf.Max(1f, (float)val3.directorCreditCost * 2f * 0.7f * Run.instance.compensatedDifficultyCoefficient); } val2 = component3; }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req).ID, val, text); } public static EffectResponse GiveMoney(ControlClient client, EffectRequest req) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown EffectRequest req2 = req; string code = req2.code; code = code.Split(new char[1] { '_' })[1]; EffectStatus val = (EffectStatus)0; string text = ""; try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Expected O, but got Unknown int num = 0; if (code == "small") { num = Run.instance.GetDifficultyScaledCost(10); } if (code == "medium") { num = Run.instance.GetDifficultyScaledCost(20); } if (code == "large") { num = Run.instance.GetDifficultyScaledCost(500); } CharacterMaster master = body.master; master.GiveMoney((uint)num); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/CoinEmitter"), new EffectData { origin = ((Component)body).transform.position }, true); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ImpactEffects/CoinImpact"), new EffectData { origin = ((Component)body).transform.position }, true); SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = string.Format("<color=#{0}>{1} gave {2} {3} gold.</color>", "ffec3b", req2.viewer, characterName, num); Chat.SendBroadcastChat((ChatMessageBase)(object)val2); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse TakeMoney(ControlClient client, EffectRequest req) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown EffectRequest req2 = req; string code = req2.code; code = code.Split(new char[1] { '_' })[1]; EffectStatus val = (EffectStatus)0; string text = ""; try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //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_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Expected O, but got Unknown //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Expected O, but got Unknown //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Expected O, but got Unknown uint num = 0u; if (code == "half") { num = (uint)Math.Floor((double)(body.master.money / 2)); } if (code == "all") { num = body.master.money; } CharacterMaster master = body.master; master.money -= num; body.master.GiveMoney(0u); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/GoldOnStageStartCoinGain"), new EffectData { origin = ((Component)body).transform.position }, true); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ImpactEffects/CoinImpact"), new EffectData { origin = ((Component)body).transform.position }, true); SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = string.Format("<color=#{0}>{1} took {2} gold from {3}.</color>", "ffec3b", req2.viewer, num, characterName); Chat.SendBroadcastChat((ChatMessageBase)(object)val2); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse Launch(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body) || Mod.jumpDisabled) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " launched " + characterName + ".</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); body.AddTimedBuff(Buffs.IgnoreFallDamage, 10f); GenericCharacterMain.ApplyJumpVelocity(body.characterMotor, body, 2f, 3f, false); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse HealPlayer(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Expected O, but got Unknown //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; if (TimedThread.isRunning(TimedType.DISABLEHEALING)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " healed " + characterName + ".</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); body.healthComponent.CmdHealFull(); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/SproutOfLifeBurst"), new EffectData { origin = ((Component)body).transform.position }, true); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse BarrierPlayer(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " gave " + characterName + " a barrier.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); body.healthComponent.Networkbarrier = body.healthComponent.body.maxBarrier; EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/LunarGolemShieldCharge"), new EffectData { origin = ((Component)body).transform.position }, true); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse DamagePlayer(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); if (body.healthComponent.health == 1f) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Expected O, but got Unknown DamageInfo val2 = new DamageInfo(); val2.damage = body.healthComponent.fullCombinedHealth / 2f; if (val2.damage >= body.healthComponent.health) { val2.damage = body.healthComponent.health - 1f; } body.healthComponent.TakeDamage(val2); SimpleChatMessage val3 = new SimpleChatMessage(); val3.baseToken = "<color=#ffec3b>" + req2.viewer + " hit " + characterName + ".</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val3); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse KillPlayer(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); if (body.healthComponent.health == 1f) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } Mod.ActionQueue.Enqueue(delegate { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown body.healthComponent.Die(false); SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " killed " + characterName + ".</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse RevivePlayers(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0057: 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_0060: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = "<color=ffec3b>" + req2.viewer + " revived all players.</color>" }); Mod.eventDirector.AddEvent(Mod.eventFactory.RespawnPlayer()); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse Invincibility(ControlClient client, EffectRequest req) { //IL_0038: 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_0032: Expected O, but got Unknown //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.INVINCIBILITY)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " made " + characterName + " invincible.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/DamageRejected"), new EffectData { origin = ((Component)body).transform.position }, true); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, TimedType.INVINCIBILITY, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse OHKO(ControlClient client, EffectRequest req) { //IL_0038: 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_0032: Expected O, but got Unknown //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.OHKO)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody localBody = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)localBody)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(localBody); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " activated OHKO on " + characterName + ".</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, TimedType.OHKO, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse DisableJump(ControlClient client, EffectRequest req) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Expected O, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.DISABLEJUMP)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TimedThread.isRunning(TimedType.FORCEDJUMPS)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody localBody = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)localBody)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(localBody); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " disabled " + characterName + "'s jump.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, TimedType.DISABLEJUMP, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse AddBuff(ControlClient client, EffectRequest req) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown //IL_05f2: Unknown result type (might be due to invalid IL or missing references) //IL_05f9: Expected O, but got Unknown //IL_0522: Unknown result type (might be due to invalid IL or missing references) //IL_0515: Unknown result type (might be due to invalid IL or missing references) //IL_051c: Expected O, but got Unknown EffectRequest req2 = req; string code = req2.code; code = code.Split(new char[1] { '_' })[1]; TimedType timedType = TimedType.OHKO; string chatMessage = ""; CharacterBody localBody = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)localBody)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(localBody); switch (code) { case "disablehealing": timedType = TimedType.DISABLEHEALING; chatMessage = "disabled " + characterName + "'s healing"; break; case "crocoregen": timedType = TimedType.CROCOREGEN; chatMessage = "gave " + characterName + " regen"; break; case "nocooldowns": timedType = TimedType.NOCOOLDOWNS; chatMessage = "reduced " + characterName + "'s cooldowns"; break; case "energized": timedType = TimedType.ENERGIZED; chatMessage = "increased " + characterName + "'s attack speed"; break; case "fullcrit": timedType = TimedType.FULLCRIT; chatMessage = "give " + characterName + " 100% crit rate"; break; case "lifesteal": timedType = TimedType.LIFESTEAL; chatMessage = "gave " + characterName + " lifesteal"; break; case "powerbuff": timedType = TimedType.POWERBUFF; chatMessage = "gave " + characterName + " a power buff"; break; case "boostallstats": timedType = TimedType.BOOSTALLSTATS; chatMessage = "boosted all " + characterName + "'s stats"; break; case "delayeddamage": timedType = TimedType.DELAYEDDAMAGE; chatMessage = "delayed " + characterName + " damage"; break; case "disableskills": timedType = TimedType.DISABLESKILLS; chatMessage = "disabled all " + characterName + "'s skills"; break; case "blinded": timedType = TimedType.BLINDED; chatMessage = "blinded " + characterName; break; case "blazingtrail": timedType = TimedType.BLAZINGTRAIL; chatMessage = "gave " + characterName + " a blazing trail"; break; case "spectral": timedType = TimedType.SPECTRAL; chatMessage = "gave " + characterName + " a spectral buff"; break; case "glacial": timedType = TimedType.GLACIAL; chatMessage = "gave " + characterName + " a glacial buff"; break; case "malachite": timedType = TimedType.MALACHITE; chatMessage = "gave " + characterName + " a poison malachite buff"; break; case "cloak": timedType = TimedType.CLOAK; chatMessage = "cloaked " + characterName; break; case "beetlejuice": timedType = TimedType.BEETLEJUICE; chatMessage = "beetlejuiced " + characterName; break; } if (TimedThread.isRunning(timedType)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " " + chatMessage + ".</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, timedType, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse ExtraLife(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " gave " + characterName + " an extra life.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); body.AddBuff(Buffs.ExtraLifeBuff); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/WoodSpriteHeal"), new EffectData { origin = ((Component)body).transform.position }, true); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse FreeUnlock(ControlClient client, EffectRequest req) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown EffectRequest req2 = req; EffectStatus val = (EffectStatus)0; string text = ""; try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " gave " + characterName + " a free unlock.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); body.AddBuff(Buffs.FreeUnlocks); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/ImpactEffects/CoinImpact"), new EffectData { origin = ((Component)body).transform.position }, true); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } return new EffectResponse(((SimpleJSONMessage)req2).ID, val, text); } public static EffectResponse WideFOV(ControlClient client, EffectRequest req) { //IL_0038: 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_0032: Expected O, but got Unknown //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.WIDEFOV)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody localBody = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)localBody)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(localBody); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " made " + characterName + "'s FOV wide.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, TimedType.WIDEFOV, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse NarrowFOV(ControlClient client, EffectRequest req) { //IL_0038: 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_0032: Expected O, but got Unknown //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.NARROWFOV)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody localBody = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)localBody)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(localBody); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " made " + characterName + "'s FOV narrow.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, TimedType.NARROWFOV, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse FlipCamera(ControlClient client, EffectRequest req) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.FLIPCAMERA)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TimedThread.isRunning(TimedType.SPINCAMERA)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (Mod.cameraFlipped) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody localBody = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)localBody)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(localBody); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " flipped " + characterName + "'s camera.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, TimedType.FLIPCAMERA, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse SpinCamera(ControlClient client, EffectRequest req) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.SPINCAMERA)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TimedThread.isRunning(TimedType.FLIPCAMERA)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (Mod.cameraFlipped) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody localBody = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)localBody)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(localBody); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " is spinning " + characterName + "'s camera.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, TimedType.SPINCAMERA, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse SlowMovement(ControlClient client, EffectRequest req) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.SLOWMOVEMENT)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TimedThread.isRunning(TimedType.FASTMOVEMENT)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TimedThread.isRunning(TimedType.FREEZEMOVEMENT)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (Mod.moveSpeedChanged) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " slowed " + characterName + " down.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/MuzzleFlashes/MuzzleflashMageIceLarge"), new EffectData { origin = ((Component)body).transform.position }, true); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, TimedType.SLOWMOVEMENT, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse FastMovement(ControlClient client, EffectRequest req) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.FASTMOVEMENT)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TimedThread.isRunning(TimedType.SLOWMOVEMENT)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TimedThread.isRunning(TimedType.FREEZEMOVEMENT)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (Mod.moveSpeedChanged) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Object)(object)body)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } string characterName = Mod.getCharacterName(body); Mod.ActionQueue.Enqueue(delegate { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown SimpleChatMessage val2 = new SimpleChatMessage(); val2.baseToken = "<color=#ffec3b>" + req2.viewer + " sped " + characterName + " up.</color>"; Chat.SendBroadcastChat((ChatMessageBase)(object)val2); Mod.chatBox.SubmitChat(); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/HuntressBlinkEffect"), new EffectData { origin = ((Component)body).transform.position }, true); }); } catch (Exception arg) { Mod.mls.LogInfo((object)$"Crowd Control Error: {arg}"); } new Thread(new TimedThread(((SimpleJSONMessage)req2).ID, TimedType.FASTMOVEMENT, num * 1000).Run).Start(); return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)0, num * 1000, (string)null); } public static EffectResponse FreezeMovement(ControlClient client, EffectRequest req) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Expected O, but got Unknown //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Expected O, but got Unknown EffectRequest req2 = req; if (TimedThread.isRunning(TimedType.FASTMOVEMENT)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TimedThread.isRunning(TimedType.SLOWMOVEMENT)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (TimedThread.isRunning(TimedType.FREEZEMOVEMENT)) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } if (Mod.moveSpeedChanged) { return new EffectResponse(((SimpleJSONMessage)req2).ID, (EffectStatus)3, ""); } EffectStatus val = (EffectStatus)0; string text = ""; long num = 30L; if (req2.duration > 0) { num = req2.duration.Value / 1000; } try { CharacterBody body = Mod.getLocalBody(); if (!Object.op_Implicit((Objec
BepInEx/plugins/Newtonsoft.Json.dll
Decompiled 4 months 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.Security.Permissions; 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(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")] [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 4.5")] [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] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true)] internal sealed class NotNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] internal sealed class NotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class MaybeNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] internal sealed class AllowNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal class DoesNotReturnIfAttribute : Attribute { public bool ParameterValue { get; } public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } } 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) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown 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 (!StringUtils.EndsWith(message, '.')) { 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 : 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; } } 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<Newtonsoft.Json.Serialization.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(Newtonsoft.Json.Serialization.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.GetValueOrDef