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 QuickOrganization v1.0.0
BepInEx/plugins/LitJSON.dll
Decompiled 17 hours agousing System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: CLSCompliant(true)] [assembly: AssemblyTitle("LitJson")] [assembly: AssemblyDescription("LitJSON library")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LitJSON")] [assembly: AssemblyCopyright("The authors disclaim copyright to this source code")] [assembly: AssemblyTrademark("")] [assembly: AssemblyFileVersion("0.19.0.0")] [assembly: AssemblyInformationalVersion("0.19.0+Branch.develop.Sha.d0afd60354c01246bf747821439d7a176a376ae3")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("0.19.0.0")] namespace LitJson; public enum JsonType { None, Object, Array, String, Int, Long, Double, Boolean } public interface IJsonWrapper : IList, ICollection, IEnumerable, IOrderedDictionary, IDictionary { bool IsArray { get; } bool IsBoolean { get; } bool IsDouble { get; } bool IsInt { get; } bool IsLong { get; } bool IsObject { get; } bool IsString { get; } bool GetBoolean(); double GetDouble(); int GetInt(); JsonType GetJsonType(); long GetLong(); string GetString(); void SetBoolean(bool val); void SetDouble(double val); void SetInt(int val); void SetJsonType(JsonType type); void SetLong(long val); void SetString(string val); string ToJson(); void ToJson(JsonWriter writer); } public class JsonData : IJsonWrapper, IList, ICollection, IEnumerable, IOrderedDictionary, IDictionary, IEquatable<JsonData> { private IList<JsonData> inst_array; private bool inst_boolean; private double inst_double; private int inst_int; private long inst_long; private IDictionary<string, JsonData> inst_object; private string inst_string; private string json; private JsonType type; private IList<KeyValuePair<string, JsonData>> object_list; public int Count => EnsureCollection().Count; public bool IsArray => type == JsonType.Array; public bool IsBoolean => type == JsonType.Boolean; public bool IsDouble => type == JsonType.Double; public bool IsInt => type == JsonType.Int; public bool IsLong => type == JsonType.Long; public bool IsObject => type == JsonType.Object; public bool IsString => type == JsonType.String; public ICollection<string> Keys { get { EnsureDictionary(); return inst_object.Keys; } } int ICollection.Count => Count; bool ICollection.IsSynchronized => EnsureCollection().IsSynchronized; object ICollection.SyncRoot => EnsureCollection().SyncRoot; bool IDictionary.IsFixedSize => EnsureDictionary().IsFixedSize; bool IDictionary.IsReadOnly => EnsureDictionary().IsReadOnly; ICollection IDictionary.Keys { get { EnsureDictionary(); IList<string> list = new List<string>(); foreach (KeyValuePair<string, JsonData> item in object_list) { list.Add(item.Key); } return (ICollection)list; } } ICollection IDictionary.Values { get { EnsureDictionary(); IList<JsonData> list = new List<JsonData>(); foreach (KeyValuePair<string, JsonData> item in object_list) { list.Add(item.Value); } return (ICollection)list; } } bool IJsonWrapper.IsArray => IsArray; bool IJsonWrapper.IsBoolean => IsBoolean; bool IJsonWrapper.IsDouble => IsDouble; bool IJsonWrapper.IsInt => IsInt; bool IJsonWrapper.IsLong => IsLong; bool IJsonWrapper.IsObject => IsObject; bool IJsonWrapper.IsString => IsString; bool IList.IsFixedSize => EnsureList().IsFixedSize; bool IList.IsReadOnly => EnsureList().IsReadOnly; object IDictionary.this[object key] { get { return EnsureDictionary()[key]; } set { if (!(key is string)) { throw new ArgumentException("The key has to be a string"); } JsonData value2 = ToJsonData(value); this[(string)key] = value2; } } object IOrderedDictionary.this[int idx] { get { EnsureDictionary(); return object_list[idx].Value; } set { EnsureDictionary(); JsonData value2 = ToJsonData(value); KeyValuePair<string, JsonData> keyValuePair = object_list[idx]; inst_object[keyValuePair.Key] = value2; KeyValuePair<string, JsonData> value3 = new KeyValuePair<string, JsonData>(keyValuePair.Key, value2); object_list[idx] = value3; } } object IList.this[int index] { get { return EnsureList()[index]; } set { EnsureList(); JsonData value2 = ToJsonData(value); this[index] = value2; } } public JsonData this[string prop_name] { get { EnsureDictionary(); return inst_object[prop_name]; } set { EnsureDictionary(); KeyValuePair<string, JsonData> keyValuePair = new KeyValuePair<string, JsonData>(prop_name, value); if (inst_object.ContainsKey(prop_name)) { for (int i = 0; i < object_list.Count; i++) { if (object_list[i].Key == prop_name) { object_list[i] = keyValuePair; break; } } } else { object_list.Add(keyValuePair); } inst_object[prop_name] = value; json = null; } } public JsonData this[int index] { get { EnsureCollection(); if (type == JsonType.Array) { return inst_array[index]; } return object_list[index].Value; } set { EnsureCollection(); if (type == JsonType.Array) { inst_array[index] = value; } else { KeyValuePair<string, JsonData> keyValuePair = object_list[index]; KeyValuePair<string, JsonData> value2 = new KeyValuePair<string, JsonData>(keyValuePair.Key, value); object_list[index] = value2; inst_object[keyValuePair.Key] = value; } json = null; } } public bool ContainsKey(string key) { EnsureDictionary(); return inst_object.Keys.Contains(key); } public JsonData() { } public JsonData(bool boolean) { type = JsonType.Boolean; inst_boolean = boolean; } public JsonData(double number) { type = JsonType.Double; inst_double = number; } public JsonData(int number) { type = JsonType.Int; inst_int = number; } public JsonData(long number) { type = JsonType.Long; inst_long = number; } public JsonData(object obj) { if (obj is bool) { type = JsonType.Boolean; inst_boolean = (bool)obj; return; } if (obj is double) { type = JsonType.Double; inst_double = (double)obj; return; } if (obj is int) { type = JsonType.Int; inst_int = (int)obj; return; } if (obj is long) { type = JsonType.Long; inst_long = (long)obj; return; } if (obj is string) { type = JsonType.String; inst_string = (string)obj; return; } throw new ArgumentException("Unable to wrap the given object with JsonData"); } public JsonData(string str) { type = JsonType.String; inst_string = str; } public static implicit operator JsonData(bool data) { return new JsonData(data); } public static implicit operator JsonData(double data) { return new JsonData(data); } public static implicit operator JsonData(int data) { return new JsonData(data); } public static implicit operator JsonData(long data) { return new JsonData(data); } public static implicit operator JsonData(string data) { return new JsonData(data); } public static explicit operator bool(JsonData data) { if (data.type != JsonType.Boolean) { throw new InvalidCastException("Instance of JsonData doesn't hold a double"); } return data.inst_boolean; } public static explicit operator double(JsonData data) { if (data.type != JsonType.Double) { throw new InvalidCastException("Instance of JsonData doesn't hold a double"); } return data.inst_double; } public static explicit operator int(JsonData data) { if (data.type != JsonType.Int && data.type != JsonType.Long) { throw new InvalidCastException("Instance of JsonData doesn't hold an int"); } if (data.type != JsonType.Int) { return (int)data.inst_long; } return data.inst_int; } public static explicit operator long(JsonData data) { if (data.type != JsonType.Long && data.type != JsonType.Int) { throw new InvalidCastException("Instance of JsonData doesn't hold a long"); } if (data.type != JsonType.Long) { return data.inst_int; } return data.inst_long; } public static explicit operator string(JsonData data) { if (data.type != JsonType.String) { throw new InvalidCastException("Instance of JsonData doesn't hold a string"); } return data.inst_string; } void ICollection.CopyTo(Array array, int index) { EnsureCollection().CopyTo(array, index); } void IDictionary.Add(object key, object value) { JsonData value2 = ToJsonData(value); EnsureDictionary().Add(key, value2); KeyValuePair<string, JsonData> item = new KeyValuePair<string, JsonData>((string)key, value2); object_list.Add(item); json = null; } void IDictionary.Clear() { EnsureDictionary().Clear(); object_list.Clear(); json = null; } bool IDictionary.Contains(object key) { return EnsureDictionary().Contains(key); } IDictionaryEnumerator IDictionary.GetEnumerator() { return ((IOrderedDictionary)this).GetEnumerator(); } void IDictionary.Remove(object key) { EnsureDictionary().Remove(key); for (int i = 0; i < object_list.Count; i++) { if (object_list[i].Key == (string)key) { object_list.RemoveAt(i); break; } } json = null; } IEnumerator IEnumerable.GetEnumerator() { return EnsureCollection().GetEnumerator(); } bool IJsonWrapper.GetBoolean() { if (type != JsonType.Boolean) { throw new InvalidOperationException("JsonData instance doesn't hold a boolean"); } return inst_boolean; } double IJsonWrapper.GetDouble() { if (type != JsonType.Double) { throw new InvalidOperationException("JsonData instance doesn't hold a double"); } return inst_double; } int IJsonWrapper.GetInt() { if (type != JsonType.Int) { throw new InvalidOperationException("JsonData instance doesn't hold an int"); } return inst_int; } long IJsonWrapper.GetLong() { if (type != JsonType.Long) { throw new InvalidOperationException("JsonData instance doesn't hold a long"); } return inst_long; } string IJsonWrapper.GetString() { if (type != JsonType.String) { throw new InvalidOperationException("JsonData instance doesn't hold a string"); } return inst_string; } void IJsonWrapper.SetBoolean(bool val) { type = JsonType.Boolean; inst_boolean = val; json = null; } void IJsonWrapper.SetDouble(double val) { type = JsonType.Double; inst_double = val; json = null; } void IJsonWrapper.SetInt(int val) { type = JsonType.Int; inst_int = val; json = null; } void IJsonWrapper.SetLong(long val) { type = JsonType.Long; inst_long = val; json = null; } void IJsonWrapper.SetString(string val) { type = JsonType.String; inst_string = val; json = null; } string IJsonWrapper.ToJson() { return ToJson(); } void IJsonWrapper.ToJson(JsonWriter writer) { ToJson(writer); } int IList.Add(object value) { return Add(value); } void IList.Clear() { EnsureList().Clear(); json = null; } bool IList.Contains(object value) { return EnsureList().Contains(value); } int IList.IndexOf(object value) { return EnsureList().IndexOf(value); } void IList.Insert(int index, object value) { EnsureList().Insert(index, value); json = null; } void IList.Remove(object value) { EnsureList().Remove(value); json = null; } void IList.RemoveAt(int index) { EnsureList().RemoveAt(index); json = null; } IDictionaryEnumerator IOrderedDictionary.GetEnumerator() { EnsureDictionary(); return new OrderedDictionaryEnumerator(object_list.GetEnumerator()); } void IOrderedDictionary.Insert(int idx, object key, object value) { string text = (string)key; JsonData value2 = (this[text] = ToJsonData(value)); KeyValuePair<string, JsonData> item = new KeyValuePair<string, JsonData>(text, value2); object_list.Insert(idx, item); } void IOrderedDictionary.RemoveAt(int idx) { EnsureDictionary(); inst_object.Remove(object_list[idx].Key); object_list.RemoveAt(idx); } private ICollection EnsureCollection() { if (type == JsonType.Array) { return (ICollection)inst_array; } if (type == JsonType.Object) { return (ICollection)inst_object; } throw new InvalidOperationException("The JsonData instance has to be initialized first"); } private IDictionary EnsureDictionary() { if (type == JsonType.Object) { return (IDictionary)inst_object; } if (type != 0) { throw new InvalidOperationException("Instance of JsonData is not a dictionary"); } type = JsonType.Object; inst_object = new Dictionary<string, JsonData>(); object_list = new List<KeyValuePair<string, JsonData>>(); return (IDictionary)inst_object; } private IList EnsureList() { if (type == JsonType.Array) { return (IList)inst_array; } if (type != 0) { throw new InvalidOperationException("Instance of JsonData is not a list"); } type = JsonType.Array; inst_array = new List<JsonData>(); return (IList)inst_array; } private JsonData ToJsonData(object obj) { if (obj == null) { return null; } if (obj is JsonData) { return (JsonData)obj; } return new JsonData(obj); } private static void WriteJson(IJsonWrapper obj, JsonWriter writer) { if (obj == null) { writer.Write(null); } else if (obj.IsString) { writer.Write(obj.GetString()); } else if (obj.IsBoolean) { writer.Write(obj.GetBoolean()); } else if (obj.IsDouble) { writer.Write(obj.GetDouble()); } else if (obj.IsInt) { writer.Write(obj.GetInt()); } else if (obj.IsLong) { writer.Write(obj.GetLong()); } else if (obj.IsArray) { writer.WriteArrayStart(); foreach (JsonData item in (IEnumerable)obj) { WriteJson(item, writer); } writer.WriteArrayEnd(); } else { if (!obj.IsObject) { return; } writer.WriteObjectStart(); foreach (DictionaryEntry item2 in (IDictionary)obj) { writer.WritePropertyName((string)item2.Key); WriteJson((JsonData)item2.Value, writer); } writer.WriteObjectEnd(); } } public int Add(object value) { JsonData value2 = ToJsonData(value); json = null; return EnsureList().Add(value2); } public bool Remove(object obj) { json = null; if (IsObject) { JsonData value = null; if (inst_object.TryGetValue((string)obj, out value)) { if (inst_object.Remove((string)obj)) { return object_list.Remove(new KeyValuePair<string, JsonData>((string)obj, value)); } return false; } throw new KeyNotFoundException("The specified key was not found in the JsonData object."); } if (IsArray) { return inst_array.Remove(ToJsonData(obj)); } throw new InvalidOperationException("Instance of JsonData is not an object or a list."); } public void Clear() { if (IsObject) { ((IDictionary)this).Clear(); } else if (IsArray) { ((IList)this).Clear(); } } public bool Equals(JsonData x) { if (x == null) { return false; } if (x.type != type && ((x.type != JsonType.Int && x.type != JsonType.Long) || (type != JsonType.Int && type != JsonType.Long))) { return false; } switch (type) { case JsonType.None: return true; case JsonType.Object: return inst_object.Equals(x.inst_object); case JsonType.Array: return inst_array.Equals(x.inst_array); case JsonType.String: return inst_string.Equals(x.inst_string); case JsonType.Int: if (x.IsLong) { if (x.inst_long < int.MinValue || x.inst_long > int.MaxValue) { return false; } return inst_int.Equals((int)x.inst_long); } return inst_int.Equals(x.inst_int); case JsonType.Long: if (x.IsInt) { if (inst_long < int.MinValue || inst_long > int.MaxValue) { return false; } return x.inst_int.Equals((int)inst_long); } return inst_long.Equals(x.inst_long); case JsonType.Double: return inst_double.Equals(x.inst_double); case JsonType.Boolean: return inst_boolean.Equals(x.inst_boolean); default: return false; } } public JsonType GetJsonType() { return type; } public void SetJsonType(JsonType type) { if (this.type != type) { switch (type) { case JsonType.Object: inst_object = new Dictionary<string, JsonData>(); object_list = new List<KeyValuePair<string, JsonData>>(); break; case JsonType.Array: inst_array = new List<JsonData>(); break; case JsonType.String: inst_string = null; break; case JsonType.Int: inst_int = 0; break; case JsonType.Long: inst_long = 0L; break; case JsonType.Double: inst_double = 0.0; break; case JsonType.Boolean: inst_boolean = false; break; } this.type = type; } } public string ToJson() { if (json != null) { return json; } StringWriter stringWriter = new StringWriter(); JsonWriter jsonWriter = new JsonWriter(stringWriter); jsonWriter.Validate = false; WriteJson(this, jsonWriter); json = stringWriter.ToString(); return json; } public void ToJson(JsonWriter writer) { bool validate = writer.Validate; writer.Validate = false; WriteJson(this, writer); writer.Validate = validate; } public override string ToString() { return type switch { JsonType.Array => "JsonData array", JsonType.Boolean => inst_boolean.ToString(), JsonType.Double => inst_double.ToString(), JsonType.Int => inst_int.ToString(), JsonType.Long => inst_long.ToString(), JsonType.Object => "JsonData object", JsonType.String => inst_string, _ => "Uninitialized JsonData", }; } } internal class OrderedDictionaryEnumerator : IDictionaryEnumerator, IEnumerator { private IEnumerator<KeyValuePair<string, JsonData>> list_enumerator; public object Current => Entry; public DictionaryEntry Entry { get { KeyValuePair<string, JsonData> current = list_enumerator.Current; return new DictionaryEntry(current.Key, current.Value); } } public object Key => list_enumerator.Current.Key; public object Value => list_enumerator.Current.Value; public OrderedDictionaryEnumerator(IEnumerator<KeyValuePair<string, JsonData>> enumerator) { list_enumerator = enumerator; } public bool MoveNext() { return list_enumerator.MoveNext(); } public void Reset() { list_enumerator.Reset(); } } public class JsonException : ApplicationException { public JsonException() { } internal JsonException(ParserToken token) : base($"Invalid token '{token}' in input string") { } internal JsonException(ParserToken token, Exception inner_exception) : base($"Invalid token '{token}' in input string", inner_exception) { } internal JsonException(int c) : base($"Invalid character '{(char)c}' in input string") { } internal JsonException(int c, Exception inner_exception) : base($"Invalid character '{(char)c}' in input string", inner_exception) { } public JsonException(string message) : base(message) { } public JsonException(string message, Exception inner_exception) : base(message, inner_exception) { } } internal struct PropertyMetadata { public MemberInfo Info; public bool IsField; public Type Type; } internal struct ArrayMetadata { private Type element_type; private bool is_array; private bool is_list; public Type ElementType { get { if (element_type == null) { return typeof(JsonData); } return element_type; } set { element_type = value; } } public bool IsArray { get { return is_array; } set { is_array = value; } } public bool IsList { get { return is_list; } set { is_list = value; } } } internal struct ObjectMetadata { private Type element_type; private bool is_dictionary; private IDictionary<string, PropertyMetadata> properties; public Type ElementType { get { if (element_type == null) { return typeof(JsonData); } return element_type; } set { element_type = value; } } public bool IsDictionary { get { return is_dictionary; } set { is_dictionary = value; } } public IDictionary<string, PropertyMetadata> Properties { get { return properties; } set { properties = value; } } } internal delegate void ExporterFunc(object obj, JsonWriter writer); public delegate void ExporterFunc<T>(T obj, JsonWriter writer); internal delegate object ImporterFunc(object input); public delegate TValue ImporterFunc<TJson, TValue>(TJson input); public delegate IJsonWrapper WrapperFactory(); public class JsonMapper { private static readonly int max_nesting_depth; private static readonly IFormatProvider datetime_format; private static readonly IDictionary<Type, ExporterFunc> base_exporters_table; private static readonly IDictionary<Type, ExporterFunc> custom_exporters_table; private static readonly object custom_exporters_table_lock; private static readonly IDictionary<Type, IDictionary<Type, ImporterFunc>> base_importers_table; private static readonly IDictionary<Type, IDictionary<Type, ImporterFunc>> custom_importers_table; private static readonly object custom_importers_table_lock; private static readonly IDictionary<Type, ArrayMetadata> array_metadata; private static readonly object array_metadata_lock; private static readonly IDictionary<Type, IDictionary<Type, MethodInfo>> conv_ops; private static readonly object conv_ops_lock; private static readonly IDictionary<Type, ObjectMetadata> object_metadata; private static readonly object object_metadata_lock; private static readonly IDictionary<Type, IList<PropertyMetadata>> type_properties; private static readonly object type_properties_lock; private static readonly JsonWriter static_writer; private static readonly object static_writer_lock; static JsonMapper() { custom_exporters_table_lock = new object(); custom_importers_table_lock = new object(); array_metadata_lock = new object(); conv_ops_lock = new object(); object_metadata_lock = new object(); type_properties_lock = new object(); static_writer_lock = new object(); max_nesting_depth = 100; array_metadata = new Dictionary<Type, ArrayMetadata>(); conv_ops = new Dictionary<Type, IDictionary<Type, MethodInfo>>(); object_metadata = new Dictionary<Type, ObjectMetadata>(); type_properties = new Dictionary<Type, IList<PropertyMetadata>>(); static_writer = new JsonWriter(); datetime_format = DateTimeFormatInfo.InvariantInfo; base_exporters_table = new Dictionary<Type, ExporterFunc>(); custom_exporters_table = new Dictionary<Type, ExporterFunc>(); base_importers_table = new Dictionary<Type, IDictionary<Type, ImporterFunc>>(); custom_importers_table = new Dictionary<Type, IDictionary<Type, ImporterFunc>>(); RegisterBaseExporters(); RegisterBaseImporters(); } private static void AddArrayMetadata(Type type) { if (array_metadata.ContainsKey(type)) { return; } ArrayMetadata value = default(ArrayMetadata); value.IsArray = type.IsArray; if (type.GetInterface("System.Collections.IList") != null) { value.IsList = true; } PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo propertyInfo in properties) { if (!(propertyInfo.Name != "Item")) { ParameterInfo[] indexParameters = propertyInfo.GetIndexParameters(); if (indexParameters.Length == 1 && indexParameters[0].ParameterType == typeof(int)) { value.ElementType = propertyInfo.PropertyType; } } } lock (array_metadata_lock) { try { array_metadata.Add(type, value); } catch (ArgumentException) { } } } private static void AddObjectMetadata(Type type) { if (object_metadata.ContainsKey(type)) { return; } ObjectMetadata value = default(ObjectMetadata); if (type.GetInterface("System.Collections.IDictionary") != null) { value.IsDictionary = true; } value.Properties = new Dictionary<string, PropertyMetadata>(); PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.Name == "Item") { ParameterInfo[] indexParameters = propertyInfo.GetIndexParameters(); if (indexParameters.Length == 1 && indexParameters[0].ParameterType == typeof(string)) { value.ElementType = propertyInfo.PropertyType; } } else { PropertyMetadata value2 = default(PropertyMetadata); value2.Info = propertyInfo; value2.Type = propertyInfo.PropertyType; value.Properties.Add(propertyInfo.Name, value2); } } FieldInfo[] fields = type.GetFields(); foreach (FieldInfo fieldInfo in fields) { PropertyMetadata value3 = default(PropertyMetadata); value3.Info = fieldInfo; value3.IsField = true; value3.Type = fieldInfo.FieldType; value.Properties.Add(fieldInfo.Name, value3); } lock (object_metadata_lock) { try { object_metadata.Add(type, value); } catch (ArgumentException) { } } } private static void AddTypeProperties(Type type) { if (type_properties.ContainsKey(type)) { return; } IList<PropertyMetadata> list = new List<PropertyMetadata>(); PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo propertyInfo in properties) { if (!(propertyInfo.Name == "Item")) { PropertyMetadata item = default(PropertyMetadata); item.Info = propertyInfo; item.IsField = false; list.Add(item); } } FieldInfo[] fields = type.GetFields(); foreach (FieldInfo info in fields) { PropertyMetadata item2 = default(PropertyMetadata); item2.Info = info; item2.IsField = true; list.Add(item2); } lock (type_properties_lock) { try { type_properties.Add(type, list); } catch (ArgumentException) { } } } private static MethodInfo GetConvOp(Type t1, Type t2) { lock (conv_ops_lock) { if (!conv_ops.ContainsKey(t1)) { conv_ops.Add(t1, new Dictionary<Type, MethodInfo>()); } } if (conv_ops[t1].ContainsKey(t2)) { return conv_ops[t1][t2]; } MethodInfo method = t1.GetMethod("op_Implicit", new Type[1] { t2 }); lock (conv_ops_lock) { try { conv_ops[t1].Add(t2, method); return method; } catch (ArgumentException) { return conv_ops[t1][t2]; } } } private static object ReadValue(Type inst_type, JsonReader reader) { reader.Read(); if (reader.Token == JsonToken.ArrayEnd) { return null; } Type underlyingType = Nullable.GetUnderlyingType(inst_type); Type type = underlyingType ?? inst_type; if (reader.Token == JsonToken.Null) { if (inst_type.IsClass || underlyingType != null) { return null; } throw new JsonException($"Can't assign null to an instance of type {inst_type}"); } if (reader.Token == JsonToken.Double || reader.Token == JsonToken.Int || reader.Token == JsonToken.Long || reader.Token == JsonToken.String || reader.Token == JsonToken.Boolean) { Type type2 = reader.Value.GetType(); if (type.IsAssignableFrom(type2)) { return reader.Value; } lock (custom_importers_table_lock) { if (custom_importers_table.TryGetValue(type2, out var value) && value.TryGetValue(type, out var value2)) { return value2(reader.Value); } } if (base_importers_table.TryGetValue(type2, out var value3) && value3.TryGetValue(type, out var value4)) { return value4(reader.Value); } if (type.IsEnum) { return Enum.ToObject(type, reader.Value); } MethodInfo convOp = GetConvOp(type, type2); if (convOp != null) { return convOp.Invoke(null, new object[1] { reader.Value }); } throw new JsonException($"Can't assign value '{reader.Value}' (type {type2}) to type {inst_type}"); } object obj = null; if (reader.Token == JsonToken.ArrayStart) { AddArrayMetadata(inst_type); ArrayMetadata arrayMetadata = array_metadata[inst_type]; if (!arrayMetadata.IsArray && !arrayMetadata.IsList) { throw new JsonException($"Type {inst_type} can't act as an array"); } IList list; Type elementType; if (!arrayMetadata.IsArray) { list = (IList)Activator.CreateInstance(inst_type); elementType = arrayMetadata.ElementType; } else { list = new ArrayList(); elementType = inst_type.GetElementType(); } list.Clear(); while (true) { object obj2 = ReadValue(elementType, reader); if (obj2 == null && reader.Token == JsonToken.ArrayEnd) { break; } list.Add(obj2); } if (arrayMetadata.IsArray) { int count = list.Count; obj = Array.CreateInstance(elementType, count); for (int i = 0; i < count; i++) { ((Array)obj).SetValue(list[i], i); } } else { obj = list; } } else if (reader.Token == JsonToken.ObjectStart) { AddObjectMetadata(type); ObjectMetadata objectMetadata = object_metadata[type]; obj = Activator.CreateInstance(type); while (true) { reader.Read(); if (reader.Token == JsonToken.ObjectEnd) { break; } string text = (string)reader.Value; if (objectMetadata.Properties.ContainsKey(text)) { PropertyMetadata propertyMetadata = objectMetadata.Properties[text]; if (propertyMetadata.IsField) { ((FieldInfo)propertyMetadata.Info).SetValue(obj, ReadValue(propertyMetadata.Type, reader)); continue; } PropertyInfo propertyInfo = (PropertyInfo)propertyMetadata.Info; if (propertyInfo.CanWrite) { propertyInfo.SetValue(obj, ReadValue(propertyMetadata.Type, reader), null); } else { ReadValue(propertyMetadata.Type, reader); } } else if (!objectMetadata.IsDictionary) { if (!reader.SkipNonMembers) { throw new JsonException($"The type {inst_type} doesn't have the property '{text}'"); } ReadSkip(reader); } else { ((IDictionary)obj).Add(text, ReadValue(objectMetadata.ElementType, reader)); } } } return obj; } private static IJsonWrapper ReadValue(WrapperFactory factory, JsonReader reader) { reader.Read(); if (reader.Token == JsonToken.ArrayEnd || reader.Token == JsonToken.Null) { return null; } IJsonWrapper jsonWrapper = factory(); if (reader.Token == JsonToken.String) { jsonWrapper.SetString((string)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.Double) { jsonWrapper.SetDouble((double)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.Int) { jsonWrapper.SetInt((int)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.Long) { jsonWrapper.SetLong((long)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.Boolean) { jsonWrapper.SetBoolean((bool)reader.Value); return jsonWrapper; } if (reader.Token == JsonToken.ArrayStart) { jsonWrapper.SetJsonType(JsonType.Array); while (true) { IJsonWrapper jsonWrapper2 = ReadValue(factory, reader); if (jsonWrapper2 == null && reader.Token == JsonToken.ArrayEnd) { break; } jsonWrapper.Add(jsonWrapper2); } } else if (reader.Token == JsonToken.ObjectStart) { jsonWrapper.SetJsonType(JsonType.Object); while (true) { reader.Read(); if (reader.Token == JsonToken.ObjectEnd) { break; } string key = (string)reader.Value; jsonWrapper[key] = ReadValue(factory, reader); } } return jsonWrapper; } private static void ReadSkip(JsonReader reader) { ToWrapper(() => new JsonMockWrapper(), reader); } private static void RegisterBaseExporters() { base_exporters_table[typeof(byte)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToInt32((byte)obj)); }; base_exporters_table[typeof(char)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToString((char)obj)); }; base_exporters_table[typeof(DateTime)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToString((DateTime)obj, datetime_format)); }; base_exporters_table[typeof(decimal)] = delegate(object obj, JsonWriter writer) { writer.Write((decimal)obj); }; base_exporters_table[typeof(sbyte)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToInt32((sbyte)obj)); }; base_exporters_table[typeof(short)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToInt32((short)obj)); }; base_exporters_table[typeof(ushort)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToInt32((ushort)obj)); }; base_exporters_table[typeof(uint)] = delegate(object obj, JsonWriter writer) { writer.Write(Convert.ToUInt64((uint)obj)); }; base_exporters_table[typeof(ulong)] = delegate(object obj, JsonWriter writer) { writer.Write((ulong)obj); }; base_exporters_table[typeof(DateTimeOffset)] = delegate(object obj, JsonWriter writer) { writer.Write(((DateTimeOffset)obj).ToString("yyyy-MM-ddTHH:mm:ss.fffffffzzz", datetime_format)); }; } private static void RegisterBaseImporters() { ImporterFunc importer = (object input) => Convert.ToByte((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(byte), importer); importer = (object input) => Convert.ToUInt64((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(ulong), importer); importer = (object input) => Convert.ToInt64((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(long), importer); importer = (object input) => Convert.ToSByte((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(sbyte), importer); importer = (object input) => Convert.ToInt16((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(short), importer); importer = (object input) => Convert.ToUInt16((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(ushort), importer); importer = (object input) => Convert.ToUInt32((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(uint), importer); importer = (object input) => Convert.ToSingle((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(float), importer); importer = (object input) => Convert.ToDouble((int)input); RegisterImporter(base_importers_table, typeof(int), typeof(double), importer); importer = (object input) => Convert.ToDecimal((double)input); RegisterImporter(base_importers_table, typeof(double), typeof(decimal), importer); importer = (object input) => Convert.ToSingle((double)input); RegisterImporter(base_importers_table, typeof(double), typeof(float), importer); importer = (object input) => Convert.ToUInt32((long)input); RegisterImporter(base_importers_table, typeof(long), typeof(uint), importer); importer = (object input) => Convert.ToChar((string)input); RegisterImporter(base_importers_table, typeof(string), typeof(char), importer); importer = (object input) => Convert.ToDateTime((string)input, datetime_format); RegisterImporter(base_importers_table, typeof(string), typeof(DateTime), importer); importer = (object input) => DateTimeOffset.Parse((string)input, datetime_format); RegisterImporter(base_importers_table, typeof(string), typeof(DateTimeOffset), importer); } private static void RegisterImporter(IDictionary<Type, IDictionary<Type, ImporterFunc>> table, Type json_type, Type value_type, ImporterFunc importer) { if (!table.ContainsKey(json_type)) { table.Add(json_type, new Dictionary<Type, ImporterFunc>()); } table[json_type][value_type] = importer; } private static void WriteValue(object obj, JsonWriter writer, bool writer_is_private, int depth) { if (depth > max_nesting_depth) { throw new JsonException($"Max allowed object depth reached while trying to export from type {obj.GetType()}"); } if (obj == null) { writer.Write(null); return; } if (obj is IJsonWrapper) { if (writer_is_private) { writer.TextWriter.Write(((IJsonWrapper)obj).ToJson()); } else { ((IJsonWrapper)obj).ToJson(writer); } return; } if (obj is string) { writer.Write((string)obj); return; } if (obj is double) { writer.Write((double)obj); return; } if (obj is float) { writer.Write((float)obj); return; } if (obj is int) { writer.Write((int)obj); return; } if (obj is bool) { writer.Write((bool)obj); return; } if (obj is long) { writer.Write((long)obj); return; } if (obj is Array) { writer.WriteArrayStart(); foreach (object item in (Array)obj) { WriteValue(item, writer, writer_is_private, depth + 1); } writer.WriteArrayEnd(); return; } if (obj is IList) { writer.WriteArrayStart(); foreach (object item2 in (IList)obj) { WriteValue(item2, writer, writer_is_private, depth + 1); } writer.WriteArrayEnd(); return; } if (obj is IDictionary dictionary) { writer.WriteObjectStart(); foreach (DictionaryEntry item3 in dictionary) { string property_name = ((item3.Key is string text) ? text : Convert.ToString(item3.Key, CultureInfo.InvariantCulture)); writer.WritePropertyName(property_name); WriteValue(item3.Value, writer, writer_is_private, depth + 1); } writer.WriteObjectEnd(); return; } Type type = obj.GetType(); lock (custom_exporters_table_lock) { if (custom_exporters_table.TryGetValue(type, out var value)) { value(obj, writer); return; } } if (base_exporters_table.TryGetValue(type, out var value2)) { value2(obj, writer); return; } if (obj is Enum) { Type underlyingType = Enum.GetUnderlyingType(type); if (underlyingType == typeof(long)) { writer.Write((long)obj); } else if (underlyingType == typeof(uint)) { writer.Write((uint)obj); } else if (underlyingType == typeof(ulong)) { writer.Write((ulong)obj); } else if (underlyingType == typeof(ushort)) { writer.Write((ushort)obj); } else if (underlyingType == typeof(short)) { writer.Write((short)obj); } else if (underlyingType == typeof(byte)) { writer.Write((byte)obj); } else if (underlyingType == typeof(sbyte)) { writer.Write((sbyte)obj); } else { writer.Write((int)obj); } return; } AddTypeProperties(type); IList<PropertyMetadata> list = type_properties[type]; writer.WriteObjectStart(); foreach (PropertyMetadata item4 in list) { if (item4.IsField) { writer.WritePropertyName(item4.Info.Name); WriteValue(((FieldInfo)item4.Info).GetValue(obj), writer, writer_is_private, depth + 1); continue; } PropertyInfo propertyInfo = (PropertyInfo)item4.Info; if (propertyInfo.CanRead) { writer.WritePropertyName(item4.Info.Name); WriteValue(propertyInfo.GetValue(obj, null), writer, writer_is_private, depth + 1); } } writer.WriteObjectEnd(); } public static string ToJson(object obj) { lock (static_writer_lock) { static_writer.Reset(); WriteValue(obj, static_writer, writer_is_private: true, 0); return static_writer.ToString(); } } public static void ToJson(object obj, JsonWriter writer) { WriteValue(obj, writer, writer_is_private: false, 0); } public static JsonData ToObject(JsonReader reader) { return (JsonData)ToWrapper(() => new JsonData(), reader); } public static JsonData ToObject(TextReader reader) { JsonReader reader2 = new JsonReader(reader); return (JsonData)ToWrapper(() => new JsonData(), reader2); } public static JsonData ToObject(string json) { return (JsonData)ToWrapper(() => new JsonData(), json); } public static T ToObject<T>(JsonReader reader) { return (T)ReadValue(typeof(T), reader); } public static T ToObject<T>(TextReader reader) { JsonReader reader2 = new JsonReader(reader); return (T)ReadValue(typeof(T), reader2); } public static T ToObject<T>(string json) { JsonReader reader = new JsonReader(json); return (T)ReadValue(typeof(T), reader); } public static object ToObject(string json, Type ConvertType) { JsonReader reader = new JsonReader(json); return ReadValue(ConvertType, reader); } public static IJsonWrapper ToWrapper(WrapperFactory factory, JsonReader reader) { return ReadValue(factory, reader); } public static IJsonWrapper ToWrapper(WrapperFactory factory, string json) { JsonReader reader = new JsonReader(json); return ReadValue(factory, reader); } public static void RegisterExporter<T>(ExporterFunc<T> exporter) { ExporterFunc value = delegate(object obj, JsonWriter writer) { exporter((T)obj, writer); }; lock (custom_exporters_table_lock) { custom_exporters_table[typeof(T)] = value; } } public static void RegisterImporter<TJson, TValue>(ImporterFunc<TJson, TValue> importer) { ImporterFunc importer2 = (object input) => importer((TJson)input); lock (custom_importers_table_lock) { RegisterImporter(custom_importers_table, typeof(TJson), typeof(TValue), importer2); } } public static void UnregisterExporters() { lock (custom_exporters_table_lock) { custom_exporters_table.Clear(); } } public static void UnregisterImporters() { lock (custom_importers_table_lock) { custom_importers_table.Clear(); } } } public class JsonMockWrapper : IJsonWrapper, IList, ICollection, IEnumerable, IOrderedDictionary, IDictionary { public bool IsArray => false; public bool IsBoolean => false; public bool IsDouble => false; public bool IsInt => false; public bool IsLong => false; public bool IsObject => false; public bool IsString => false; bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; object IList.this[int index] { get { return null; } set { } } int ICollection.Count => 0; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => null; bool IDictionary.IsFixedSize => true; bool IDictionary.IsReadOnly => true; ICollection IDictionary.Keys => null; ICollection IDictionary.Values => null; object IDictionary.this[object key] { get { return null; } set { } } object IOrderedDictionary.this[int idx] { get { return null; } set { } } public bool GetBoolean() { return false; } public double GetDouble() { return 0.0; } public int GetInt() { return 0; } public JsonType GetJsonType() { return JsonType.None; } public long GetLong() { return 0L; } public string GetString() { return ""; } public void SetBoolean(bool val) { } public void SetDouble(double val) { } public void SetInt(int val) { } public void SetJsonType(JsonType type) { } public void SetLong(long val) { } public void SetString(string val) { } public string ToJson() { return ""; } public void ToJson(JsonWriter writer) { } int IList.Add(object value) { return 0; } void IList.Clear() { } bool IList.Contains(object value) { return false; } int IList.IndexOf(object value) { return -1; } void IList.Insert(int i, object v) { } void IList.Remove(object value) { } void IList.RemoveAt(int index) { } void ICollection.CopyTo(Array array, int index) { } IEnumerator IEnumerable.GetEnumerator() { return null; } void IDictionary.Add(object k, object v) { } void IDictionary.Clear() { } bool IDictionary.Contains(object key) { return false; } void IDictionary.Remove(object key) { } IDictionaryEnumerator IDictionary.GetEnumerator() { return null; } IDictionaryEnumerator IOrderedDictionary.GetEnumerator() { return null; } void IOrderedDictionary.Insert(int i, object k, object v) { } void IOrderedDictionary.RemoveAt(int i) { } } public enum JsonToken { None, ObjectStart, PropertyName, ObjectEnd, ArrayStart, ArrayEnd, Int, Long, Double, String, Boolean, Null } public class JsonReader { private static readonly IDictionary<int, IDictionary<int, int[]>> parse_table; private Stack<int> automaton_stack; private int current_input; private int current_symbol; private bool end_of_json; private bool end_of_input; private Lexer lexer; private bool parser_in_string; private bool parser_return; private bool read_started; private TextReader reader; private bool reader_is_owned; private bool skip_non_members; private object token_value; private JsonToken token; public bool AllowComments { get { return lexer.AllowComments; } set { lexer.AllowComments = value; } } public bool AllowSingleQuotedStrings { get { return lexer.AllowSingleQuotedStrings; } set { lexer.AllowSingleQuotedStrings = value; } } public bool SkipNonMembers { get { return skip_non_members; } set { skip_non_members = value; } } public bool EndOfInput => end_of_input; public bool EndOfJson => end_of_json; public JsonToken Token => token; public object Value => token_value; static JsonReader() { parse_table = PopulateParseTable(); } public JsonReader(string json_text) : this(new StringReader(json_text), owned: true) { } public JsonReader(TextReader reader) : this(reader, owned: false) { } private JsonReader(TextReader reader, bool owned) { if (reader == null) { throw new ArgumentNullException("reader"); } parser_in_string = false; parser_return = false; read_started = false; automaton_stack = new Stack<int>(); automaton_stack.Push(65553); automaton_stack.Push(65543); lexer = new Lexer(reader); end_of_input = false; end_of_json = false; skip_non_members = true; this.reader = reader; reader_is_owned = owned; } private static IDictionary<int, IDictionary<int, int[]>> PopulateParseTable() { IDictionary<int, IDictionary<int, int[]>> result = new Dictionary<int, IDictionary<int, int[]>>(); TableAddRow(result, ParserToken.Array); TableAddCol(result, ParserToken.Array, 91, 91, 65549); TableAddRow(result, ParserToken.ArrayPrime); TableAddCol(result, ParserToken.ArrayPrime, 34, 65550, 65551, 93); TableAddCol(result, ParserToken.ArrayPrime, 91, 65550, 65551, 93); TableAddCol(result, ParserToken.ArrayPrime, 93, 93); TableAddCol(result, ParserToken.ArrayPrime, 123, 65550, 65551, 93); TableAddCol(result, ParserToken.ArrayPrime, 65537, 65550, 65551, 93); TableAddCol(result, ParserToken.ArrayPrime, 65538, 65550, 65551, 93); TableAddCol(result, ParserToken.ArrayPrime, 65539, 65550, 65551, 93); TableAddCol(result, ParserToken.ArrayPrime, 65540, 65550, 65551, 93); TableAddRow(result, ParserToken.Object); TableAddCol(result, ParserToken.Object, 123, 123, 65545); TableAddRow(result, ParserToken.ObjectPrime); TableAddCol(result, ParserToken.ObjectPrime, 34, 65546, 65547, 125); TableAddCol(result, ParserToken.ObjectPrime, 125, 125); TableAddRow(result, ParserToken.Pair); TableAddCol(result, ParserToken.Pair, 34, 65552, 58, 65550); TableAddRow(result, ParserToken.PairRest); TableAddCol(result, ParserToken.PairRest, 44, 44, 65546, 65547); TableAddCol(result, ParserToken.PairRest, 125, 65554); TableAddRow(result, ParserToken.String); TableAddCol(result, ParserToken.String, 34, 34, 65541, 34); TableAddRow(result, ParserToken.Text); TableAddCol(result, ParserToken.Text, 91, 65548); TableAddCol(result, ParserToken.Text, 123, 65544); TableAddRow(result, ParserToken.Value); TableAddCol(result, ParserToken.Value, 34, 65552); TableAddCol(result, ParserToken.Value, 91, 65548); TableAddCol(result, ParserToken.Value, 123, 65544); TableAddCol(result, ParserToken.Value, 65537, 65537); TableAddCol(result, ParserToken.Value, 65538, 65538); TableAddCol(result, ParserToken.Value, 65539, 65539); TableAddCol(result, ParserToken.Value, 65540, 65540); TableAddRow(result, ParserToken.ValueRest); TableAddCol(result, ParserToken.ValueRest, 44, 44, 65550, 65551); TableAddCol(result, ParserToken.ValueRest, 93, 65554); return result; } private static void TableAddCol(IDictionary<int, IDictionary<int, int[]>> parse_table, ParserToken row, int col, params int[] symbols) { parse_table[(int)row].Add(col, symbols); } private static void TableAddRow(IDictionary<int, IDictionary<int, int[]>> parse_table, ParserToken rule) { parse_table.Add((int)rule, new Dictionary<int, int[]>()); } private void ProcessNumber(string number) { int result2; long result3; ulong result4; if ((number.IndexOf('.') != -1 || number.IndexOf('e') != -1 || number.IndexOf('E') != -1) && double.TryParse(number, NumberStyles.Any, CultureInfo.InvariantCulture, out var result)) { token = JsonToken.Double; token_value = result; } else if (int.TryParse(number, NumberStyles.Integer, CultureInfo.InvariantCulture, out result2)) { token = JsonToken.Int; token_value = result2; } else if (long.TryParse(number, NumberStyles.Integer, CultureInfo.InvariantCulture, out result3)) { token = JsonToken.Long; token_value = result3; } else if (ulong.TryParse(number, NumberStyles.Integer, CultureInfo.InvariantCulture, out result4)) { token = JsonToken.Long; token_value = result4; } else { token = JsonToken.Int; token_value = 0; } } private void ProcessSymbol() { if (current_symbol == 91) { token = JsonToken.ArrayStart; parser_return = true; } else if (current_symbol == 93) { token = JsonToken.ArrayEnd; parser_return = true; } else if (current_symbol == 123) { token = JsonToken.ObjectStart; parser_return = true; } else if (current_symbol == 125) { token = JsonToken.ObjectEnd; parser_return = true; } else if (current_symbol == 34) { if (parser_in_string) { parser_in_string = false; parser_return = true; return; } if (token == JsonToken.None) { token = JsonToken.String; } parser_in_string = true; } else if (current_symbol == 65541) { token_value = lexer.StringValue; } else if (current_symbol == 65539) { token = JsonToken.Boolean; token_value = false; parser_return = true; } else if (current_symbol == 65540) { token = JsonToken.Null; parser_return = true; } else if (current_symbol == 65537) { ProcessNumber(lexer.StringValue); parser_return = true; } else if (current_symbol == 65546) { token = JsonToken.PropertyName; } else if (current_symbol == 65538) { token = JsonToken.Boolean; token_value = true; parser_return = true; } } private bool ReadToken() { if (end_of_input) { return false; } lexer.NextToken(); if (lexer.EndOfInput) { Close(); return false; } current_input = lexer.Token; return true; } public void Close() { if (end_of_input) { return; } end_of_input = true; end_of_json = true; if (reader_is_owned) { using (reader) { } } reader = null; } public bool Read() { if (end_of_input) { return false; } if (end_of_json) { end_of_json = false; automaton_stack.Clear(); automaton_stack.Push(65553); automaton_stack.Push(65543); } parser_in_string = false; parser_return = false; token = JsonToken.None; token_value = null; if (!read_started) { read_started = true; if (!ReadToken()) { return false; } } while (true) { if (parser_return) { if (automaton_stack.Peek() == 65553) { end_of_json = true; } return true; } current_symbol = automaton_stack.Pop(); ProcessSymbol(); if (current_symbol == current_input) { if (!ReadToken()) { break; } continue; } int[] array; try { array = parse_table[current_symbol][current_input]; } catch (KeyNotFoundException inner_exception) { throw new JsonException((ParserToken)current_input, inner_exception); } if (array[0] != 65554) { for (int num = array.Length - 1; num >= 0; num--) { automaton_stack.Push(array[num]); } } } if (automaton_stack.Peek() != 65553) { throw new JsonException("Input doesn't evaluate to proper JSON text"); } if (parser_return) { return true; } return false; } } internal enum Condition { InArray, InObject, NotAProperty, Property, Value } internal class WriterContext { public int Count; public bool InArray; public bool InObject; public bool ExpectingValue; public int Padding; } public class JsonWriter { private static readonly NumberFormatInfo number_format; private WriterContext context; private Stack<WriterContext> ctx_stack; private bool has_reached_end; private char[] hex_seq; private int indentation; private int indent_value; private StringBuilder inst_string_builder; private bool pretty_print; private bool validate; private bool lower_case_properties; private TextWriter writer; public int IndentValue { get { return indent_value; } set { indentation = indentation / indent_value * value; indent_value = value; } } public bool PrettyPrint { get { return pretty_print; } set { pretty_print = value; } } public TextWriter TextWriter => writer; public bool Validate { get { return validate; } set { validate = value; } } public bool LowerCaseProperties { get { return lower_case_properties; } set { lower_case_properties = value; } } static JsonWriter() { number_format = NumberFormatInfo.InvariantInfo; } public JsonWriter() { inst_string_builder = new StringBuilder(); writer = new StringWriter(inst_string_builder); Init(); } public JsonWriter(StringBuilder sb) : this(new StringWriter(sb)) { } public JsonWriter(TextWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } this.writer = writer; Init(); } private void DoValidation(Condition cond) { if (!context.ExpectingValue) { context.Count++; } if (!validate) { return; } if (has_reached_end) { throw new JsonException("A complete JSON symbol has already been written"); } switch (cond) { case Condition.InArray: if (!context.InArray) { throw new JsonException("Can't close an array here"); } break; case Condition.InObject: if (!context.InObject || context.ExpectingValue) { throw new JsonException("Can't close an object here"); } break; case Condition.NotAProperty: if (context.InObject && !context.ExpectingValue) { throw new JsonException("Expected a property"); } break; case Condition.Property: if (!context.InObject || context.ExpectingValue) { throw new JsonException("Can't add a property here"); } break; case Condition.Value: if (!context.InArray && (!context.InObject || !context.ExpectingValue)) { throw new JsonException("Can't add a value here"); } break; } } private void Init() { has_reached_end = false; hex_seq = new char[4]; indentation = 0; indent_value = 4; pretty_print = false; validate = true; lower_case_properties = false; ctx_stack = new Stack<WriterContext>(); context = new WriterContext(); ctx_stack.Push(context); } private static void IntToHex(int n, char[] hex) { for (int i = 0; i < 4; i++) { int num = n % 16; if (num < 10) { hex[3 - i] = (char)(48 + num); } else { hex[3 - i] = (char)(65 + (num - 10)); } n >>= 4; } } private void Indent() { if (pretty_print) { indentation += indent_value; } } private void Put(string str) { if (pretty_print && !context.ExpectingValue) { for (int i = 0; i < indentation; i++) { writer.Write(' '); } } writer.Write(str); } private void PutNewline() { PutNewline(add_comma: true); } private void PutNewline(bool add_comma) { if (add_comma && !context.ExpectingValue && context.Count > 1) { writer.Write(','); } if (pretty_print && !context.ExpectingValue) { writer.Write(Environment.NewLine); } } private void PutString(string str) { Put(string.Empty); writer.Write('"'); int length = str.Length; for (int i = 0; i < length; i++) { switch (str[i]) { case '\n': writer.Write("\\n"); continue; case '\r': writer.Write("\\r"); continue; case '\t': writer.Write("\\t"); continue; case '"': case '\\': writer.Write('\\'); writer.Write(str[i]); continue; case '\f': writer.Write("\\f"); continue; case '\b': writer.Write("\\b"); continue; } if (str[i] >= ' ' && str[i] <= '~') { writer.Write(str[i]); continue; } IntToHex(str[i], hex_seq); writer.Write("\\u"); writer.Write(hex_seq); } writer.Write('"'); } private void Unindent() { if (pretty_print) { indentation -= indent_value; } } public override string ToString() { if (inst_string_builder == null) { return string.Empty; } return inst_string_builder.ToString(); } public void Reset() { has_reached_end = false; ctx_stack.Clear(); context = new WriterContext(); ctx_stack.Push(context); if (inst_string_builder != null) { inst_string_builder.Remove(0, inst_string_builder.Length); } } public void Write(bool boolean) { DoValidation(Condition.Value); PutNewline(); Put(boolean ? "true" : "false"); context.ExpectingValue = false; } public void Write(decimal number) { DoValidation(Condition.Value); PutNewline(); Put(Convert.ToString(number, number_format)); context.ExpectingValue = false; } public void Write(double number) { DoValidation(Condition.Value); PutNewline(); string text = Convert.ToString(number, number_format); Put(text); if (text.IndexOf('.') == -1 && text.IndexOf('E') == -1) { writer.Write(".0"); } context.ExpectingValue = false; } public void Write(float number) { DoValidation(Condition.Value); PutNewline(); string str = Convert.ToString(number, number_format); Put(str); context.ExpectingValue = false; } public void Write(int number) { DoValidation(Condition.Value); PutNewline(); Put(Convert.ToString(number, number_format)); context.ExpectingValue = false; } public void Write(long number) { DoValidation(Condition.Value); PutNewline(); Put(Convert.ToString(number, number_format)); context.ExpectingValue = false; } public void Write(string str) { DoValidation(Condition.Value); PutNewline(); if (str == null) { Put("null"); } else { PutString(str); } context.ExpectingValue = false; } [CLSCompliant(false)] public void Write(ulong number) { DoValidation(Condition.Value); PutNewline(); Put(Convert.ToString(number, number_format)); context.ExpectingValue = false; } public void WriteArrayEnd() { DoValidation(Condition.InArray); PutNewline(add_comma: false); ctx_stack.Pop(); if (ctx_stack.Count == 1) { has_reached_end = true; } else { context = ctx_stack.Peek(); context.ExpectingValue = false; } Unindent(); Put("]"); } public void WriteArrayStart() { DoValidation(Condition.NotAProperty); PutNewline(); Put("["); context = new WriterContext(); context.InArray = true; ctx_stack.Push(context); Indent(); } public void WriteObjectEnd() { DoValidation(Condition.InObject); PutNewline(add_comma: false); ctx_stack.Pop(); if (ctx_stack.Count == 1) { has_reached_end = true; } else { context = ctx_stack.Peek(); context.ExpectingValue = false; } Unindent(); Put("}"); } public void WriteObjectStart() { DoValidation(Condition.NotAProperty); PutNewline(); Put("{"); context = new WriterContext(); context.InObject = true; ctx_stack.Push(context); Indent(); } public void WritePropertyName(string property_name) { DoValidation(Condition.Property); PutNewline(); string text = ((property_name == null || !lower_case_properties) ? property_name : property_name.ToLowerInvariant()); PutString(text); if (pretty_print) { if (text.Length > context.Padding) { context.Padding = text.Length; } for (int num = context.Padding - text.Length; num >= 0; num--) { writer.Write(' '); } writer.Write(": "); } else { writer.Write(':'); } context.ExpectingValue = true; } } internal class FsmContext { public bool Return; public int NextState; public Lexer L; public int StateStack; } internal class Lexer { private delegate bool StateHandler(FsmContext ctx); private static readonly int[] fsm_return_table; private static readonly StateHandler[] fsm_handler_table; private bool allow_comments; private bool allow_single_quoted_strings; private bool end_of_input; private FsmContext fsm_context; private int input_buffer; private int input_char; private TextReader reader; private int state; private StringBuilder string_buffer; private string string_value; private int token; private int unichar; public bool AllowComments { get { return allow_comments; } set { allow_comments = value; } } public bool AllowSingleQuotedStrings { get { return allow_single_quoted_strings; } set { allow_single_quoted_strings = value; } } public bool EndOfInput => end_of_input; public int Token => token; public string StringValue => string_value; static Lexer() { PopulateFsmTables(out fsm_handler_table, out fsm_return_table); } public Lexer(TextReader reader) { allow_comments = true; allow_single_quoted_strings = true; input_buffer = 0; string_buffer = new StringBuilder(128); state = 1; end_of_input = false; this.reader = reader; fsm_context = new FsmContext(); fsm_context.L = this; } private static int HexValue(int digit) { switch (digit) { case 65: case 97: return 10; case 66: case 98: return 11; case 67: case 99: return 12; case 68: case 100: return 13; case 69: case 101: return 14; case 70: case 102: return 15; default: return digit - 48; } } private static void PopulateFsmTables(out StateHandler[] fsm_handler_table, out int[] fsm_return_table) { fsm_handler_table = new StateHandler[28] { State1, State2, State3, State4, State5, State6, State7, State8, State9, State10, State11, State12, State13, State14, State15, State16, State17, State18, State19, State20, State21, State22, State23, State24, State25, State26, State27, State28 }; fsm_return_table = new int[28] { 65542, 0, 65537, 65537, 0, 65537, 0, 65537, 0, 0, 65538, 0, 0, 0, 65539, 0, 0, 65540, 65541, 65542, 0, 0, 65541, 65542, 0, 0, 0, 0 }; } private static char ProcessEscChar(int esc_char) { switch (esc_char) { case 34: case 39: case 47: case 92: return Convert.ToChar(esc_char); case 110: return '\n'; case 116: return '\t'; case 114: return '\r'; case 98: return '\b'; case 102: return '\f'; default: return '?'; } } private static bool State1(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { continue; } if (ctx.L.input_char >= 49 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 3; return true; } switch (ctx.L.input_char) { case 34: ctx.NextState = 19; ctx.Return = true; return true; case 44: case 58: case 91: case 93: case 123: case 125: ctx.NextState = 1; ctx.Return = true; return true; case 45: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 2; return true; case 48: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 4; return true; case 102: ctx.NextState = 12; return true; case 110: ctx.NextState = 16; return true; case 116: ctx.NextState = 9; return true; case 39: if (!ctx.L.allow_single_quoted_strings) { return false; } ctx.L.input_char = 34; ctx.NextState = 23; ctx.Return = true; return true; case 47: if (!ctx.L.allow_comments) { return false; } ctx.NextState = 25; return true; default: return false; } } return true; } private static bool State2(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char >= 49 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 3; return true; } if (ctx.L.input_char == 48) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 4; return true; } return false; } private static bool State3(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); continue; } if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { ctx.Return = true; ctx.NextState = 1; return true; } switch (ctx.L.input_char) { case 44: case 93: case 125: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 1; return true; case 46: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 5; return true; case 69: case 101: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 7; return true; default: return false; } } return true; } private static bool State4(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { ctx.Return = true; ctx.NextState = 1; return true; } switch (ctx.L.input_char) { case 44: case 93: case 125: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 1; return true; case 46: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 5; return true; case 69: case 101: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 7; return true; default: return false; } } private static bool State5(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 6; return true; } return false; } private static bool State6(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); continue; } if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { ctx.Return = true; ctx.NextState = 1; return true; } switch (ctx.L.input_char) { case 44: case 93: case 125: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 1; return true; case 69: case 101: ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 7; return true; default: return false; } } return true; } private static bool State7(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 8; return true; } int num = ctx.L.input_char; if (num == 43 || num == 45) { ctx.L.string_buffer.Append((char)ctx.L.input_char); ctx.NextState = 8; return true; } return false; } private static bool State8(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char >= 48 && ctx.L.input_char <= 57) { ctx.L.string_buffer.Append((char)ctx.L.input_char); continue; } if (ctx.L.input_char == 32 || (ctx.L.input_char >= 9 && ctx.L.input_char <= 13)) { ctx.Return = true; ctx.NextState = 1; return true; } int num = ctx.L.input_char; if (num == 44 || num == 93 || num == 125) { ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 1; return true; } return false; } return true; } private static bool State9(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 114) { ctx.NextState = 10; return true; } return false; } private static bool State10(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 117) { ctx.NextState = 11; return true; } return false; } private static bool State11(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 101) { ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State12(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 97) { ctx.NextState = 13; return true; } return false; } private static bool State13(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 108) { ctx.NextState = 14; return true; } return false; } private static bool State14(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 115) { ctx.NextState = 15; return true; } return false; } private static bool State15(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 101) { ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State16(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 117) { ctx.NextState = 17; return true; } return false; } private static bool State17(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 108) { ctx.NextState = 18; return true; } return false; } private static bool State18(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 108) { ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State19(FsmContext ctx) { while (ctx.L.GetChar()) { switch (ctx.L.input_char) { case 34: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 20; return true; case 92: ctx.StateStack = 19; ctx.NextState = 21; return true; } ctx.L.string_buffer.Append((char)ctx.L.input_char); } return true; } private static bool State20(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 34) { ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State21(FsmContext ctx) { ctx.L.GetChar(); switch (ctx.L.input_char) { case 117: ctx.NextState = 22; return true; case 34: case 39: case 47: case 92: case 98: case 102: case 110: case 114: case 116: ctx.L.string_buffer.Append(ProcessEscChar(ctx.L.input_char)); ctx.NextState = ctx.StateStack; return true; default: return false; } } private static bool State22(FsmContext ctx) { int num = 0; int num2 = 4096; ctx.L.unichar = 0; while (ctx.L.GetChar()) { if ((ctx.L.input_char >= 48 && ctx.L.input_char <= 57) || (ctx.L.input_char >= 65 && ctx.L.input_char <= 70) || (ctx.L.input_char >= 97 && ctx.L.input_char <= 102)) { ctx.L.unichar += HexValue(ctx.L.input_char) * num2; num++; num2 /= 16; if (num == 4) { ctx.L.string_buffer.Append(Convert.ToChar(ctx.L.unichar)); ctx.NextState = ctx.StateStack; return true; } continue; } return false; } return true; } private static bool State23(FsmContext ctx) { while (ctx.L.GetChar()) { switch (ctx.L.input_char) { case 39: ctx.L.UngetChar(); ctx.Return = true; ctx.NextState = 24; return true; case 92: ctx.StateStack = 23; ctx.NextState = 21; return true; } ctx.L.string_buffer.Append((char)ctx.L.input_char); } return true; } private static bool State24(FsmContext ctx) { ctx.L.GetChar(); if (ctx.L.input_char == 39) { ctx.L.input_char = 34; ctx.Return = true; ctx.NextState = 1; return true; } return false; } private static bool State25(FsmContext ctx) { ctx.L.GetChar(); switch (ctx.L.input_char) { case 42: ctx.NextState = 27; return true; case 47: ctx.NextState = 26; return true; default: return false; } } private static bool State26(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char == 10) { ctx.NextState = 1; return true; } } return true; } private static bool State27(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char == 42) { ctx.NextState = 28; return true; } } return true; } private static bool State28(FsmContext ctx) { while (ctx.L.GetChar()) { if (ctx.L.input_char != 42) { if (ctx.L.input_char == 47) { ctx.NextState = 1; return true; } ctx.NextState = 27; return true; } } return true; } private bool GetChar() { if ((input_char = NextChar()) != -1) { return true; } end_of_input = true; return false; } private int NextChar() { if (input_buffer != 0) { int result = input_buffer; input_buffer = 0; return result; } return reader.Read(); } public bool NextToken() { fsm_context.Return = false; while (true) { if (!fsm_handler_table[state - 1](fsm_context)) { throw new JsonException(input_char); } if (end_of_input) { return false; } if (fsm_context.Return) { break; } state = fsm_context.NextState; } string_value = string_buffer.ToString(); string_buffer.Remove(0, string_buffer.Length); token = fsm_return_table[state - 1]; if (token == 65542) { token = input_char; } state = fsm_context.NextState; return true; } private void UngetChar() { input_buffer = input_char; } } internal enum ParserToken { None = 65536, Number, True, False, Null, CharSeq, Char, Text, Object, ObjectPrime, Pair, PairRest, Array, ArrayPrime, Value, ValueRest, String, End, Epsilon }
BepInEx/plugins/QuickOrganization.dll
Decompiled 17 hours agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TAIGU")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("QuickOrganization")] [assembly: AssemblyTitle("QuickOrganization")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace QuickOrganization { public static class CustomLog { private static ManualLogSource _logger; public static void Init(ManualLogSource logger) { _logger = logger; } public static void Info(string msg) { if (_logger != null) { _logger.LogInfo((object)("[TAIGU] " + msg)); } } public static void Warn(string msg) { if (_logger != null) { _logger.LogWarning((object)("[TAIGU] " + msg)); } } public static void Error(string msg) { if (_logger != null) { _logger.LogError((object)("[TAIGU] " + msg)); } } } [HarmonyPatch(typeof(Transform), "SetParent", new Type[] { typeof(Transform), typeof(bool) })] public static class SetParentPatch { public static bool Prefix(Transform __instance, Transform parent) { if ((Object)(object)QuickOrganizationManager.Instance != (Object)null && (Object)(object)parent != (Object)null && ((Object)parent).name == "ElevatorTransform") { CustomLog.Warn("Blocked SetParent to ElevatorTransform for: " + ((Object)__instance).name); return false; } return true; } } [HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")] public static class ConnectClientPatch { public static void Postfix() { try { QuickOrganizationManager.CreateInstance(); CustomLog.Info("Manager initialized via ConnectClientToPlayerObject"); } catch (Exception ex) { CustomLog.Error("Failed to create manager: " + ex.Message); } } } [BepInPlugin("TAIGU.QuickOrganization", "TAIGU.QuickOrganization", "1.1.0")] public class Plugin : BaseUnityPlugin { public const string PluginGUID = "TAIGU.QuickOrganization"; public const string PluginName = "TAIGU.QuickOrganization"; public const string PluginVersion = "1.1.0"; private void Awake() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown CustomLog.Init(((BaseUnityPlugin)this).Logger); CustomLog.Info("Loading TAIGU QuickOrganization Mod V1.1.0"); QuickOrganizationConfig.LoadConfig(((BaseUnityPlugin)this).Config); Harmony val = new Harmony("TAIGU.QuickOrganization"); try { val.PatchAll(); CustomLog.Info("All Harmony patches applied successfully"); } catch (Exception ex) { CustomLog.Error("Failed to apply patches: " + ex); } CustomLog.Info("TAIGU QuickOrganization loaded successfully!"); } } public static class QuickOrganizationConfig { private static ConfigEntry<string> _menuKey; public static string MenuKeyName { get { if (_menuKey == null) { return "Equals"; } return _menuKey.Value; } } public static void LoadConfig(ConfigFile configFile) { _menuKey = configFile.Bind<string>("General", "MenuKey", "Equals", "Key to toggle the organization menu. Use Unity Key enum names: Equals, Minus, F1, F2, etc."); CustomLog.Info("Config loaded. MenuKey = " + _menuKey.Value); } public static Key GetKeyEnum() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) string menuKeyName = MenuKeyName; if (Enum.TryParse<Key>(menuKeyName, ignoreCase: true, out Key result)) { return result; } CustomLog.Warn("Invalid key name: " + menuKeyName + ", falling back to Equals"); return (Key)14; } } public class QuickOrganizationManager : MonoBehaviour { public class CustomItemEntry { public string name = ""; public float x; public float z; } public static QuickOrganizationManager Instance; private bool _isOpen; private Rect _windowRect = new Rect(150f, 80f, 520f, 600f); private Vector2 _scrollPos; private List<GrabbableObject> _shipItems = new List<GrabbableObject>(); private bool _isOrganizing; private string _statusMsg = "就绪"; private Font _chineseFont; private float _bigItemX = -3.3f; private float _bigItemZ = -15.8f; private float _smallItemX = -3.3f; private float _smallItemZ = -12.7f; private float _shovelX = 5f; private float _shovelZ = -16f; private float _lightX = 2.9f; private float _lightZ = -15.6f; private float _stunX = -4.3f; private float _stunZ = -14f; private float _sprX = 2.9f; private float _sprZ = -12.7f; private float _keyX = 9.5f; private float _keyZ = -16f; private float _bagX = 5f; private float _bagZ = -11.7f; private float _radarX = -0.8f; private float _radarZ = -12.7f; private float _gunX = 10f; private float _gunZ = -11.9f; private float _ammoX = 9f; private float _ammoZ = -11.9f; private float _otherX = 6.8f; private float _otherZ = -11.9f; private List<CustomItemEntry> _customItems = new List<CustomItemEntry>(); private string _newCustomName = ""; private float _newCustomX; private float _newCustomZ; private bool _showCustomSection; private string ConfigPath { get { string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "AppData", "Roaming", "com.coze.coding", "configs"); Directory.CreateDirectory(text); return Path.Combine(text, "QuickOrganization_positions.cfg"); } } public static void CreateInstance() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown if (!((Object)(object)Instance != (Object)null)) { GameObject val = new GameObject("QuickOrganizationManager"); Instance = val.AddComponent<QuickOrganizationManager>(); Object.DontDestroyOnLoad((Object)val); CustomLog.Info("QuickOrganizationManager 已创建"); } } private void Start() { try { _chineseFont = Font.CreateDynamicFontFromOSFont("Microsoft YaHei", 14); if ((Object)(object)_chineseFont == (Object)null) { _chineseFont = Font.CreateDynamicFontFromOSFont("SimHei", 14); } CustomLog.Info("中文字体加载: " + (((Object)(object)_chineseFont != (Object)null) ? "成功" : "失败")); } catch (Exception ex) { CustomLog.Warn("中文字体加载异常: " + ex.Message); } LoadPositions(); } private void Update() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) if (Keyboard.current == null) { return; } Key keyEnum = QuickOrganizationConfig.GetKeyEnum(); KeyControl val = Keyboard.current[keyEnum]; if (val != null && ((ButtonControl)val).wasPressedThisFrame) { _isOpen = !_isOpen; CustomLog.Info("菜单切换: " + _isOpen); if (_isOpen) { RefreshShipItems(); } } } private void OnGUI() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) if (_isOpen) { if ((Object)(object)_chineseFont != (Object)null) { GUI.skin.font = _chineseFont; } _windowRect = GUILayout.Window(952371, _windowRect, new WindowFunction(DrawWindow), "TAIGU 快速整理", Array.Empty<GUILayoutOption>()); } } private void DrawWindow(int id) { //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginVertical(Array.Empty<GUILayoutOption>()); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label("状态: " + _statusMsg, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(300f) }); if (GUILayout.Button("保存配置", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(100f) })) { SavePositions(); } GUILayout.EndHorizontal(); GUILayout.Space(5f); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); if (GUILayout.Button("刷新物品列表", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(30f) })) { RefreshShipItems(); } if (GUILayout.Button(_isOrganizing ? "整理中..." : "整理飞船", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(30f) }) && !_isOrganizing) { RefreshShipItems(); ((MonoBehaviour)this).StartCoroutine(OrganizeCoroutine()); } if (GUILayout.Button("关闭", (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width(80f), GUILayout.Height(30f) })) { _isOpen = false; } GUILayout.EndHorizontal(); GUILayout.Space(5f); GUILayout.Label("飞船内物品: " + _shipItems.Count + " 件", Array.Empty<GUILayoutOption>()); _scrollPos = GUILayout.BeginScrollView(_scrollPos, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(420f) }); GUILayout.Label("--- 物品位置配置 ---", Array.Empty<GUILayoutOption>()); GUILayout.Space(3f); DrawPositionRow("大件废料位置", ref _bigItemX, ref _bigItemZ); DrawPositionRow("小件废料位置", ref _smallItemX, ref _smallItemZ); DrawPositionRow("铲子位置", ref _shovelX, ref _shovelZ); DrawPositionRow("手电筒位置", ref _lightX, ref _lightZ); DrawPositionRow("震撼闪光弹位置", ref _stunX, ref _stunZ); DrawPositionRow("喷漆罐位置", ref _sprX, ref _sprZ); DrawPositionRow("钥匙位置", ref _keyX, ref _keyZ); DrawPositionRow("喷气背包位置", ref _bagX, ref _bagZ); DrawPositionRow("雷达位置", ref _radarX, ref _radarZ); DrawPositionRow("霰弹枪位置", ref _gunX, ref _gunZ); DrawPositionRow("霰弹枪子弹位置", ref _ammoX, ref _ammoZ); DrawPositionRow("其他物品位置", ref _otherX, ref _otherZ); GUILayout.Space(8f); _showCustomSection = GUILayout.Toggle(_showCustomSection, "▼ 自定义物品列表", Array.Empty<GUILayoutOption>()); if (_showCustomSection) { for (int num = _customItems.Count - 1; num >= 0; num--) { CustomItemEntry customItemEntry = _customItems[num]; GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label("名称", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(30f) }); customItemEntry.name = GUILayout.TextField(customItemEntry.name, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(100f) }); GUILayout.Label("x:", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(18f) }); customItemEntry.x = ParseFloat(GUILayout.TextField(customItemEntry.x.ToString("F2"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(60f) })); GUILayout.Label("z:", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(18f) }); customItemEntry.z = ParseFloat(GUILayout.TextField(customItemEntry.z.ToString("F2"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(60f) })); if (GUILayout.Button("应用玩家位置", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(100f) })) { ApplyPlayerPosition(ref customItemEntry.x, ref customItemEntry.z); } if (GUILayout.Button("删除", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) })) { _customItems.RemoveAt(num); } GUILayout.EndHorizontal(); } GUILayout.Space(5f); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label("名称", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(30f) }); _newCustomName = GUILayout.TextField(_newCustomName, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(100f) }); GUILayout.Label("x:", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(18f) }); _newCustomX = ParseFloat(GUILayout.TextField(_newCustomX.ToString("F2"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(60f) })); GUILayout.Label("z:", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(18f) }); _newCustomZ = ParseFloat(GUILayout.TextField(_newCustomZ.ToString("F2"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(60f) })); if (GUILayout.Button("应用玩家位置", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(100f) })) { ApplyPlayerPosition(ref _newCustomX, ref _newCustomZ); } GUILayout.EndHorizontal(); if (GUILayout.Button("添加自定义物品", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(200f) }) && !string.IsNullOrEmpty(_newCustomName)) { _customItems.Add(new CustomItemEntry { name = _newCustomName, x = _newCustomX, z = _newCustomZ }); _newCustomName = ""; _newCustomX = 0f; _newCustomZ = 0f; } } GUILayout.Space(8f); GUILayout.Label("--- 物品清单 ---", Array.Empty<GUILayoutOption>()); foreach (GrabbableObject shipItem in _shipItems) { if (!((Object)(object)shipItem == (Object)null) && !((Object)(object)shipItem.itemProperties == (Object)null)) { GUILayout.Label(" · " + shipItem.itemProperties.itemName, Array.Empty<GUILayoutOption>()); } } GUILayout.EndScrollView(); GUILayout.EndVertical(); GUI.DragWindow(); } private void DrawPositionRow(string label, ref float x, ref float z) { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(label, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(130f) }); GUILayout.Label("x:", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(18f) }); x = ParseFloat(GUILayout.TextField(x.ToString("F2"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(60f) })); GUILayout.Label("z:", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(18f) }); z = ParseFloat(GUILayout.TextField(z.ToString("F2"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(60f) })); if (GUILayout.Button("应用玩家当前位置", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(130f) })) { ApplyPlayerPosition(ref x, ref z); } GUILayout.EndHorizontal(); } private float ParseFloat(string text) { if (float.TryParse(text, out var result)) { return result; } return 0f; } private void ApplyPlayerPosition(ref float x, ref float z) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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) PlayerControllerB val = (((Object)(object)GameNetworkManager.Instance != (Object)null) ? GameNetworkManager.Instance.localPlayerController : null); if ((Object)(object)val != (Object)null) { Vector3 position = ((Component)val).transform.position; x = position.x; z = position.z; CustomLog.Info($"应用玩家位置: x={x:F2}, z={z:F2}"); } else { CustomLog.Warn("无法获取玩家位置"); } } private void RefreshShipItems() { _shipItems.Clear(); GameObject val = GameObject.Find("/Environment/HangarShip"); if ((Object)(object)val == (Object)null) { CustomLog.Warn("未找到飞船 (HangarShip)"); _statusMsg = "错误: 未找到飞船"; return; } GrabbableObject[] componentsInChildren = val.GetComponentsInChildren<GrabbableObject>(); foreach (GrabbableObject val2 in componentsInChildren) { if ((Object)(object)val2 != (Object)null && (Object)(object)val2.itemProperties != (Object)null) { _shipItems.Add(val2); } } _statusMsg = "已找到 " + _shipItems.Count + " 件物品"; CustomLog.Info("刷新物品列表: " + _shipItems.Count + " 件"); } private Vector3 GetTargetPosition(GrabbableObject obj) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: 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) //IL_00d7: 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_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)obj == (Object)null || (Object)(object)obj.itemProperties == (Object)null) { return new Vector3(_otherX, 0.5f, _otherZ); } foreach (CustomItemEntry customItem in _customItems) { if (!string.IsNullOrEmpty(customItem.name) && customItem.name.Equals(obj.itemProperties.itemName, StringComparison.OrdinalIgnoreCase)) { return new Vector3(customItem.x, 0.5f, customItem.z); } } if (obj is Shovel) { return new Vector3(_shovelX, 0.5f, _shovelZ); } if (obj is FlashlightItem) { return new Vector3(_lightX, 0.5f, _lightZ); } if (obj is StunGrenadeItem) { return new Vector3(_stunX, 0.5f, _stunZ); } if (obj is SprayPaintItem) { return new Vector3(_sprX, 0.5f, _sprZ); } if (obj is KeyItem) { return new Vector3(_keyX, 0.5f, _keyZ); } if (obj is JetpackItem) { return new Vector3(_bagX, 0.5f, _bagZ); } if (obj is RadarBoosterItem) { return new Vector3(_radarX, 0.5f, _radarZ); } if (obj is ShotgunItem) { return new Vector3(_gunX, 0.5f, _gunZ); } if (obj is GunAmmo) { return new Vector3(_ammoX, 0.5f, _ammoZ); } if (obj.itemProperties.twoHanded && obj.itemProperties.isScrap) { return new Vector3(_bigItemX, 0.5f, _bigItemZ); } if (!obj.itemProperties.twoHanded && obj.itemProperties.isScrap) { return new Vector3(_smallItemX, 0.5f, _smallItemZ); } return new Vector3(_otherX, 0.5f, _otherZ); } private Vector3 AddRandomOffset(Vector3 pos, float offset) { //IL_0000: 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_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_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) Vector2 val = Random.insideUnitCircle * offset; return new Vector3(pos.x + val.x, pos.y, pos.z + val.y); } private unsafe IEnumerator OrganizeCoroutine() { _isOrganizing = true; _statusMsg = "正在整理..."; PlayerControllerB player = (((Object)(object)GameNetworkManager.Instance != (Object)null) ? GameNetworkManager.Instance.localPlayerController : null); if ((Object)(object)player == (Object)null) { _statusMsg = "错误: 未找到本地玩家"; _isOrganizing = false; yield break; } GameObject val = GameObject.Find("/Environment/HangarShip"); if ((Object)(object)val == (Object)null) { _statusMsg = "错误: 未找到飞船"; _isOrganizing = false; yield break; } if (!player.isInHangarShipRoom) { _statusMsg = "错误: 玩家不在飞船内"; _isOrganizing = false; yield break; } List<GrabbableObject> allItems = (from i in val.GetComponentsInChildren<GrabbableObject>() where (Object)(object)i != (Object)null && (Object)(object)i.itemProperties != (Object)null && !i.isHeld && !i.heldByPlayerOnServer select i).ToList(); CustomLog.Info("开始整理: " + allItems.Count + " 件物品"); int processed = 0; NetworkObjectReference val2 = default(NetworkObjectReference); foreach (GrabbableObject item in allItems) { if ((Object)(object)item == (Object)null || (Object)(object)item.itemProperties == (Object)null) { continue; } if (!player.isInHangarShipRoom) { _statusMsg = "整理中断: 玩家离开飞船"; break; } processed++; _statusMsg = $"整理中 [{processed}/{allItems.Count}]: {item.itemProperties.itemName}"; Vector3 targetPosition = GetTargetPosition(item); Vector3 itemFloorPosition = item.GetItemFloorPosition(targetPosition); Vector3 offsetPos = AddRandomOffset(itemFloorPosition, 0.5f); if (Vector3.Distance(((Component)item).transform.position, targetPosition) <= 0.5f) { CustomLog.Info("物品已在目标位置附近: " + item.itemProperties.itemName); continue; } yield return (object)new WaitUntil((Func<bool>)delegate { FieldInfo field3 = typeof(PlayerControllerB).GetField("throwingObject", BindingFlags.Instance | BindingFlags.NonPublic); return !(field3 != null) || !(bool)field3.GetValue(player); }); CustomLog.Info("抓取物品: " + item.itemProperties.itemName); bool flag = false; try { FieldInfo field = typeof(PlayerControllerB).GetField("currentlyGrabbingObject", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(player, item); } item.InteractItem(); player.twoHanded = item.itemProperties.twoHanded; FieldInfo field2 = typeof(PlayerControllerB).GetField("carryWeight", BindingFlags.Instance | BindingFlags.NonPublic); if (field2 != null) { float num = (float)field2.GetValue(player); field2.SetValue(player, num + Mathf.Clamp(item.itemProperties.weight - 1f, 0f, 10f)); } item.parentObject = player.localItemHolder; MethodInfo method = typeof(PlayerControllerB).GetMethod("GrabObjectServerRpc", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { ((NetworkObjectReference)(ref val2))..ctor(((NetworkBehaviour)item).NetworkObject); method.Invoke(player, new object[1] { val2 }); } flag = true; } catch (Exception ex) { CustomLog.Error("抓取物品失败 [" + item.itemProperties.itemName + "]: " + ex.Message); } if (flag) { yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)player.currentlyHeldObjectServer == (Object)(object)item)); string itemName = item.itemProperties.itemName; Vector3 val3 = offsetPos; CustomLog.Info("放置物品: " + itemName + " 到 " + ((object)(*(Vector3*)(&val3))/*cast due to .constrained prefix*/).ToString()); player.isHoldingObject = true; player.DiscardHeldObject(true, (NetworkObject)null, offsetPos, false); yield return (object)new WaitForSeconds(0.3f); } } _statusMsg = $"整理完成! 共处理 {processed} 件物品"; _isOrganizing = false; CustomLog.Info("整理完成: " + processed + " 件物品"); } private void SavePositions() { try { using (StreamWriter streamWriter = new StreamWriter(ConfigPath, append: false)) { streamWriter.WriteLine("bigItem=" + _bigItemX + "," + _bigItemZ); streamWriter.WriteLine("smallItem=" + _smallItemX + "," + _smallItemZ); streamWriter.WriteLine("shovel=" + _shovelX + "," + _shovelZ); streamWriter.WriteLine("light=" + _lightX + "," + _lightZ); streamWriter.WriteLine("stun=" + _stunX + "," + _stunZ); streamWriter.WriteLine("spray=" + _sprX + "," + _sprZ); streamWriter.WriteLine("key=" + _keyX + "," + _keyZ); streamWriter.WriteLine("bag=" + _bagX + "," + _bagZ); streamWriter.WriteLine("radar=" + _radarX + "," + _radarZ); streamWriter.WriteLine("gun=" + _gunX + "," + _gunZ); streamWriter.WriteLine("ammo=" + _ammoX + "," + _ammoZ); streamWriter.WriteLine("other=" + _otherX + "," + _otherZ); streamWriter.WriteLine("customCount=" + _customItems.Count); for (int i = 0; i < _customItems.Count; i++) { streamWriter.WriteLine("custom" + i + "=" + _customItems[i].name + "," + _customItems[i].x + "," + _customItems[i].z); } } _statusMsg = "配置已保存!"; CustomLog.Info("位置配置已保存到: " + ConfigPath); } catch (Exception ex) { _statusMsg = "保存失败: " + ex.Message; CustomLog.Error("保存配置失败: " + ex.Message); } } private void LoadPositions() { try { if (!File.Exists(ConfigPath)) { CustomLog.Info("未找到配置文件,使用默认位置"); return; } using (StreamReader streamReader = new StreamReader(ConfigPath)) { string text; while ((text = streamReader.ReadLine()) != null) { string[] array = text.Split('='); if (array.Length != 2) { continue; } string text2 = array[0].Trim(); string text3 = array[1].Trim(); switch (text2) { case "bigItem": ParseVec2(text3, out _bigItemX, out _bigItemZ); continue; case "smallItem": ParseVec2(text3, out _smallItemX, out _smallItemZ); continue; case "shovel": ParseVec2(text3, out _shovelX, out _shovelZ); continue; case "light": ParseVec2(text3, out _lightX, out _lightZ); continue; case "stun": ParseVec2(text3, out _stunX, out _stunZ); continue; case "spray": ParseVec2(text3, out _sprX, out _sprZ); continue; case "key": ParseVec2(text3, out _keyX, out _keyZ); continue; case "bag": ParseVec2(text3, out _bagX, out _bagZ); continue; case "radar": ParseVec2(text3, out _radarX, out _radarZ); continue; case "gun": ParseVec2(text3, out _gunX, out _gunZ); continue; case "ammo": ParseVec2(text3, out _ammoX, out _ammoZ); continue; case "other": ParseVec2(text3, out _otherX, out _otherZ); continue; } if (text2.StartsWith("custom") && text2 != "customCount") { string[] array2 = text3.Split(','); if (array2.Length >= 3 && float.TryParse(array2[1], out var result) && float.TryParse(array2[2], out var result2)) { _customItems.Add(new CustomItemEntry { name = array2[0], x = result, z = result2 }); } } } } CustomLog.Info("位置配置已加载,自定义物品: " + _customItems.Count + " 个"); } catch (Exception ex) { CustomLog.Error("加载配置失败: " + ex.Message); } } private void ParseVec2(string val, out float x, out float z) { x = 0f; z = 0f; string[] array = val.Split(','); if (array.Length >= 2) { float.TryParse(array[0], out x); float.TryParse(array[1], out z); } } } }