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 Expand World Data v1.72.0
ExpandWorldData.dll
Decompiled 2 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Data; using ExpandWorldData; using ExpandWorldData.Dungeon; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using ServerSync; using Service; using SoftReferenceableAssets; using TMPro; using UnityEngine; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("ExpandWorldData")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+775fc71065cb37369fe565345042fb2178b62b26")] [assembly: AssemblyProduct("ExpandWorldData")] [assembly: AssemblyTitle("ExpandWorldData")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [CompilerGenerated] internal delegate TResult <>f__AnonymousDelegate0<T1, T2, T3, T4, T5, T6, TResult>(T1 arg1, T2 arg2, T3 arg3, out T4 arg4, T5 arg5 = false, T6 arg6 = true); namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [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 Data { public class Calculator { public static Vector3 EvaluateVector3(string expression) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) Vector3 zero = Vector3.zero; string[] array = Parse.Split(expression); zero.x = EvaluateFloat(array[0]).GetValueOrDefault(); if (array.Length > 1) { zero.z = EvaluateFloat(array[1]).GetValueOrDefault(); } if (array.Length > 2) { zero.y = EvaluateFloat(array[2]).GetValueOrDefault(); } return zero; } public static Vector3 EvaluateVector3(string[] s, int index) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) Vector3 zero = Vector3.zero; if (s.Length > index) { zero.x = EvaluateFloat(s[index]).GetValueOrDefault(); } if (s.Length > index + 1) { zero.z = EvaluateFloat(s[index + 1]).GetValueOrDefault(); } if (s.Length > index + 2) { zero.y = EvaluateFloat(s[index + 2]).GetValueOrDefault(); } return zero; } public static Quaternion EvaluateQuaternion(string expression) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) Vector3 zero = Vector3.zero; string[] array = Parse.Split(expression); zero.y = EvaluateFloat(array[0]).GetValueOrDefault(); if (array.Length > 1) { zero.x = EvaluateFloat(array[1]).GetValueOrDefault(); } if (array.Length > 2) { zero.z = EvaluateFloat(array[2]).GetValueOrDefault(); } return Quaternion.Euler(zero); } public static Quaternion EvaluateQuaternion(string[] s, int index) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) Vector3 zero = Vector3.zero; if (s.Length > index) { zero.y = EvaluateFloat(s[index]).GetValueOrDefault(); } if (s.Length > index + 1) { zero.x = EvaluateFloat(s[index + 1]).GetValueOrDefault(); } if (s.Length > index + 2) { zero.z = EvaluateFloat(s[index + 2]).GetValueOrDefault(); } return Quaternion.Euler(zero); } public static int? EvaluateInt(string expression) { try { return (int?)EvaluateLong(expression); } catch { return null; } } public static float? EvaluateFloat(string expression) { try { return (float)EvaluateDouble(expression); } catch { return null; } } private static double EvaluateDouble(string expression) { string[] array = expression.Split(new char[1] { '+' }); if (array.Length > 1) { double num = 0.0; string[] array2 = array; foreach (string expression2 in array2) { num += EvaluateDouble(expression2); } return num; } string[] array3 = expression.Split(new char[1] { '-' }); if (array3.Where((string s) => s != "").Count() > 1) { double? num2 = null; for (int num3 = 0; num3 < array3.Length; num3++) { if (!(array3[num3] == "") || num3 + 1 >= array3.Length) { num2 = (num2.HasValue ? (num2 - EvaluateDouble(array3[num3])) : new double?(EvaluateDouble(array3[num3]))); } else { array3[num3 + 1] = "-" + array3[num3 + 1]; } } return num2.GetValueOrDefault(); } string[] array4 = expression.Split(new char[1] { '*' }); if (array4.Length > 1) { double num4 = 1.0; string[] array2 = array4; foreach (string expression3 in array2) { num4 *= EvaluateDouble(expression3); } return num4; } string[] array5 = expression.Split(new char[1] { '/' }); if (array5.Length > 1) { double num5 = EvaluateDouble(array5[0]); for (int num6 = 1; num6 < array5.Length; num6++) { num5 /= EvaluateDouble(array5[num6]); } return num5; } try { return double.Parse(expression.Trim(), NumberFormatInfo.InvariantInfo); } catch { throw new InvalidOperationException("Failed to parse expression: " + expression); } } public static long? EvaluateLong(string expression) { try { return EvalLong(expression); } catch { return null; } } private static long EvalLong(string expression) { string[] array = expression.Split(new char[1] { '+' }); if (array.Length > 1) { long num = 0L; string[] array2 = array; foreach (string expression2 in array2) { num += EvalLong(expression2); } return num; } string[] array3 = expression.Split(new char[1] { '-' }); if (array3.Where((string s) => s != "").Count() > 1) { long? num2 = null; for (int num3 = 0; num3 < array3.Length; num3++) { if (!(array3[num3] == "") || num3 + 1 >= array3.Length) { num2 = (num2.HasValue ? (num2 - EvalLong(array3[num3])) : new long?(EvalLong(array3[num3]))); } else { array3[num3 + 1] = "-" + array3[num3 + 1]; } } return num2.GetValueOrDefault(); } string[] array4 = expression.Split(new char[1] { '*' }); if (array4.Length > 1) { long num4 = 1L; string[] array2 = array4; foreach (string expression3 in array2) { num4 *= EvalLong(expression3); } return num4; } string[] array5 = expression.Split(new char[1] { '/' }); if (array5.Length > 1) { long num5 = EvalLong(array5[0]); for (int num6 = 1; num6 < array5.Length; num6++) { num5 /= EvalLong(array5[num6]); } return num5; } try { return long.Parse(expression.Trim()); } catch { throw new InvalidOperationException("Failed to parse expression: " + expression); } } } public class DataData { [DefaultValue(null)] public string? name; [DefaultValue(null)] public string? position; [DefaultValue(null)] public string? rotation; [DefaultValue(null)] public string? connection; [DefaultValue(null)] public string[]? bools; [DefaultValue(null)] public string[]? ints; [DefaultValue(null)] public string[]? hashes; [DefaultValue(null)] public string[]? floats; [DefaultValue(null)] public string[]? strings; [DefaultValue(null)] public string[]? longs; [DefaultValue(null)] public string[]? vecs; [DefaultValue(null)] public string[]? quats; [DefaultValue(null)] public string[]? bytes; [DefaultValue(null)] public ItemData[]? items; [DefaultValue(null)] public string? containerSize; [DefaultValue(null)] public string? itemAmount; [DefaultValue(null)] public string? valueGroup; [DefaultValue(null)] public string? value; [DefaultValue(null)] public string[]? values; [DefaultValue(null)] public string? persistent; [DefaultValue(null)] public string? distant; [DefaultValue(null)] public string? priority; } public class ItemData { public string pos = ""; [DefaultValue(1f)] public float chance = 1f; [DefaultValue("")] public string prefab = ""; public string? stack; public string? quality; public string? variant; public string? durability; public string? crafterID; public string? crafterName; public string? worldLevel; public string? equipped; public string? pickedUp; public Dictionary<string, string>? customData; } public class DataEntry { public Dictionary<int, IStringValue>? Strings; public Dictionary<int, IFloatValue>? Floats; public Dictionary<int, IIntValue>? Ints; public Dictionary<int, IBoolValue>? Bools; public Dictionary<int, IHashValue>? Hashes; public Dictionary<int, ILongValue>? Longs; public Dictionary<int, IVector3Value>? Vecs; public Dictionary<int, IQuaternionValue>? Quats; public Dictionary<int, byte[]>? ByteArrays; public List<ItemValue>? Items; public Vector2i? ContainerSize; public IIntValue? ItemAmount; public ConnectionType? ConnectionType; public int ConnectionHash; public IZdoIdValue? OriginalId; public IZdoIdValue? TargetConnectionId; public IBoolValue? Persistent; public IBoolValue? Distant; public ObjectType? Priority; public IVector3Value? Position; public IQuaternionValue? Rotation; public DataEntry() { } public DataEntry(string base64) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Load(new ZPackage(base64)); } public DataEntry(DataData data) { Load(data); } private Vector2i GetContainerSize() { //IL_001a: 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) return (Vector2i)(((??)ContainerSize) ?? new Vector2i(4, 2)); } public void Load(DataEntry data) { if (data.Floats != null) { if (Floats == null) { Floats = new Dictionary<int, IFloatValue>(); } foreach (KeyValuePair<int, IFloatValue> @float in data.Floats) { Floats[@float.Key] = @float.Value; } } if (data.Vecs != null) { if (Vecs == null) { Vecs = new Dictionary<int, IVector3Value>(); } foreach (KeyValuePair<int, IVector3Value> vec in data.Vecs) { Vecs[vec.Key] = vec.Value; } } if (data.Quats != null) { if (Quats == null) { Quats = new Dictionary<int, IQuaternionValue>(); } foreach (KeyValuePair<int, IQuaternionValue> quat in data.Quats) { Quats[quat.Key] = quat.Value; } } if (data.Ints != null) { if (Ints == null) { Ints = new Dictionary<int, IIntValue>(); } foreach (KeyValuePair<int, IIntValue> @int in data.Ints) { Ints[@int.Key] = @int.Value; } } if (data.Strings != null) { if (Strings == null) { Strings = new Dictionary<int, IStringValue>(); } foreach (KeyValuePair<int, IStringValue> @string in data.Strings) { Strings[@string.Key] = @string.Value; } } if (data.ByteArrays != null) { if (ByteArrays == null) { ByteArrays = new Dictionary<int, byte[]>(); } foreach (KeyValuePair<int, byte[]> byteArray in data.ByteArrays) { ByteArrays[byteArray.Key] = byteArray.Value; } } if (data.Longs != null) { if (Longs == null) { Longs = new Dictionary<int, ILongValue>(); } foreach (KeyValuePair<int, ILongValue> @long in data.Longs) { Longs[@long.Key] = @long.Value; } } if (data.Bools != null) { if (Bools == null) { Bools = new Dictionary<int, IBoolValue>(); } foreach (KeyValuePair<int, IBoolValue> @bool in data.Bools) { Bools[@bool.Key] = @bool.Value; } } if (data.Hashes != null) { if (Hashes == null) { Hashes = new Dictionary<int, IHashValue>(); } foreach (KeyValuePair<int, IHashValue> hash in data.Hashes) { Hashes[hash.Key] = hash.Value; } } if (data.Items != null) { if (Items == null) { Items = new List<ItemValue>(); } foreach (ItemValue item in data.Items) { Items.Add(item); } } if (data.ContainerSize.HasValue) { ContainerSize = data.ContainerSize; } if (data.ItemAmount != null) { ItemAmount = data.ItemAmount; } ConnectionType = data.ConnectionType; ConnectionHash = data.ConnectionHash; OriginalId = data.OriginalId; TargetConnectionId = data.TargetConnectionId; if (data.Persistent != null) { Persistent = data.Persistent; } if (data.Distant != null) { Distant = data.Distant; } if (data.Priority.HasValue) { Priority = data.Priority; } if (data.Position != null) { Position = data.Position; } if (data.Rotation != null) { Rotation = data.Rotation; } } public DataEntry Reset(DataData data) { Floats = null; Vecs = null; Quats = null; Ints = null; Strings = null; ByteArrays = null; Longs = null; Bools = null; Hashes = null; Items = null; ContainerSize = null; ItemAmount = null; ConnectionType = null; ConnectionHash = 0; OriginalId = null; TargetConnectionId = null; Position = null; Rotation = null; Distant = null; Persistent = null; Priority = null; Load(data); return this; } public void Load(DataData data) { //IL_0a29: Unknown result type (might be due to invalid IL or missing references) //IL_0b6e: Unknown result type (might be due to invalid IL or missing references) //IL_0be5: Unknown result type (might be due to invalid IL or missing references) //IL_0bb3: Unknown result type (might be due to invalid IL or missing references) HashSet<string> hashSet = new HashSet<string>(); if (data.floats != null) { if (Floats == null) { Floats = new Dictionary<int, IFloatValue>(); } string[] floats = data.floats; foreach (string text in floats) { KeyValuePair<string, string> keyValuePair = Parse.Kvp(text); if (keyValuePair.Key == "") { throw new InvalidOperationException("Failed to parse float " + text + "."); } if (keyValuePair.Key.Contains(".")) { hashSet.Add(keyValuePair.Key.Split(new char[1] { '.' })[0]); } int key = Hash(keyValuePair.Key); if (Floats.ContainsKey(key)) { Log.Warning("Data " + data.name + ": Duplicate float key " + keyValuePair.Key + "."); } Floats[key] = DataValue.Float(keyValuePair.Value); } } if (data.ints != null) { if (Ints == null) { Ints = new Dictionary<int, IIntValue>(); } string[] floats = data.ints; foreach (string text2 in floats) { KeyValuePair<string, string> keyValuePair2 = Parse.Kvp(text2); if (keyValuePair2.Key == "") { throw new InvalidOperationException("Failed to parse int " + text2 + "."); } if (keyValuePair2.Key.Contains(".")) { hashSet.Add(keyValuePair2.Key.Split(new char[1] { '.' })[0]); } int key2 = Hash(keyValuePair2.Key); if (Ints.ContainsKey(key2)) { Log.Warning("Data " + data.name + ": Duplicate int key " + keyValuePair2.Key + "."); } Ints[key2] = DataValue.Int(keyValuePair2.Value); } } if (data.bools != null) { if (Bools == null) { Bools = new Dictionary<int, IBoolValue>(); } string[] floats = data.bools; foreach (string text3 in floats) { KeyValuePair<string, string> keyValuePair3 = Parse.Kvp(text3); if (keyValuePair3.Key == "") { throw new InvalidOperationException("Failed to parse bool " + text3 + "."); } if (keyValuePair3.Key.Contains(".")) { hashSet.Add(keyValuePair3.Key.Split(new char[1] { '.' })[0]); } int key3 = Hash(keyValuePair3.Key); if (Bools.ContainsKey(key3)) { Log.Warning("Data " + data.name + ": Duplicate bool key " + keyValuePair3.Key + "."); } Bools[key3] = DataValue.Bool(keyValuePair3.Value); } } if (data.hashes != null) { if (Hashes == null) { Hashes = new Dictionary<int, IHashValue>(); } string[] floats = data.hashes; foreach (string text4 in floats) { KeyValuePair<string, string> keyValuePair4 = Parse.Kvp(text4); if (keyValuePair4.Key == "") { throw new InvalidOperationException("Failed to parse hash " + text4 + "."); } if (keyValuePair4.Key.Contains(".")) { hashSet.Add(keyValuePair4.Key.Split(new char[1] { '.' })[0]); } int key4 = Hash(keyValuePair4.Key); if (Hashes.ContainsKey(key4)) { Log.Warning("Data " + data.name + ": Duplicate hash key " + keyValuePair4.Key + "."); } Hashes[key4] = DataValue.Hash(keyValuePair4.Value); } } if (data.longs != null) { if (Longs == null) { Longs = new Dictionary<int, ILongValue>(); } string[] floats = data.longs; foreach (string text5 in floats) { KeyValuePair<string, string> keyValuePair5 = Parse.Kvp(text5); if (keyValuePair5.Key == "") { throw new InvalidOperationException("Failed to parse long " + text5 + "."); } if (keyValuePair5.Key.Contains(".")) { hashSet.Add(keyValuePair5.Key.Split(new char[1] { '.' })[0]); } int key5 = Hash(keyValuePair5.Key); if (Longs.ContainsKey(key5)) { Log.Warning("Data " + data.name + ": Duplicate long key " + keyValuePair5.Key + "."); } Longs[key5] = DataValue.Long(keyValuePair5.Value); } } if (data.strings != null) { if (Strings == null) { Strings = new Dictionary<int, IStringValue>(); } string[] floats = data.strings; foreach (string text6 in floats) { KeyValuePair<string, string> keyValuePair6 = Parse.Kvp(text6); if (keyValuePair6.Key == "") { throw new InvalidOperationException("Failed to parse string " + text6 + "."); } if (keyValuePair6.Key.Contains(".")) { hashSet.Add(keyValuePair6.Key.Split(new char[1] { '.' })[0]); } int key6 = Hash(keyValuePair6.Key); if (Strings.ContainsKey(key6)) { Log.Warning("Data " + data.name + ": Duplicate string key " + keyValuePair6.Key + "."); } Strings[key6] = DataValue.String(keyValuePair6.Value); } } if (data.vecs != null) { if (Vecs == null) { Vecs = new Dictionary<int, IVector3Value>(); } string[] floats = data.vecs; foreach (string text7 in floats) { KeyValuePair<string, string> keyValuePair7 = Parse.Kvp(text7); if (keyValuePair7.Key == "") { throw new InvalidOperationException("Failed to parse vector " + text7 + "."); } if (keyValuePair7.Key.Contains(".")) { hashSet.Add(keyValuePair7.Key.Split(new char[1] { '.' })[0]); } int key7 = Hash(keyValuePair7.Key); if (Vecs.ContainsKey(key7)) { Log.Warning("Data " + data.name + ": Duplicate vector key " + keyValuePair7.Key + "."); } Vecs[key7] = DataValue.Vector3(keyValuePair7.Value); } } if (data.quats != null) { if (Quats == null) { Quats = new Dictionary<int, IQuaternionValue>(); } string[] floats = data.quats; foreach (string text8 in floats) { KeyValuePair<string, string> keyValuePair8 = Parse.Kvp(text8); if (keyValuePair8.Key == "") { throw new InvalidOperationException("Failed to parse quaternion " + text8 + "."); } if (keyValuePair8.Key.Contains(".")) { hashSet.Add(keyValuePair8.Key.Split(new char[1] { '.' })[0]); } int key8 = Hash(keyValuePair8.Key); if (Quats.ContainsKey(key8)) { Log.Warning("Data " + data.name + ": Duplicate quaternion key " + keyValuePair8.Key + "."); } Quats[key8] = DataValue.Quaternion(keyValuePair8.Value); } } if (data.bytes != null) { if (ByteArrays == null) { ByteArrays = new Dictionary<int, byte[]>(); } string[] floats = data.bytes; foreach (string text9 in floats) { KeyValuePair<string, string> keyValuePair9 = Parse.Kvp(text9); if (keyValuePair9.Key == "") { throw new InvalidOperationException("Failed to parse byte array " + text9 + "."); } if (keyValuePair9.Key.Contains(".")) { hashSet.Add(keyValuePair9.Key.Split(new char[1] { '.' })[0]); } int key9 = Hash(keyValuePair9.Key); if (ByteArrays.ContainsKey(key9)) { Log.Warning("Data " + data.name + ": Duplicate byte array key " + keyValuePair9.Key + "."); } ByteArrays[key9] = Convert.FromBase64String(keyValuePair9.Value); } } if (data.items != null) { List<ItemValue> list = new List<ItemValue>(); list.AddRange(data.items.Select((ItemData item) => new ItemValue(item))); Items = list; } if (!string.IsNullOrWhiteSpace(data.containerSize)) { ContainerSize = Parse.Vector2Int(data.containerSize); } if (!string.IsNullOrWhiteSpace(data.itemAmount)) { ItemAmount = DataValue.Int(data.itemAmount); } if (hashSet.Count > 0) { if (Ints == null) { Ints = new Dictionary<int, IIntValue>(); } Ints[StringExtensionMethods.GetStableHashCode("HasFields")] = DataValue.Simple(1); foreach (string item in hashSet) { Ints[StringExtensionMethods.GetStableHashCode("HasFields" + item)] = DataValue.Simple(1); } } if (!string.IsNullOrWhiteSpace(data.position)) { Position = DataValue.Vector3(data.position); } if (!string.IsNullOrWhiteSpace(data.rotation)) { Rotation = DataValue.Quaternion(data.rotation); } if (data.persistent != null) { Persistent = DataValue.Bool(data.persistent); } if (data.distant != null) { Distant = DataValue.Bool(data.distant); } if (data.priority != null) { Priority = (Enum.TryParse<ObjectType>(data.priority, ignoreCase: true, out ObjectType result) ? new ObjectType?(result) : ((ObjectType?)null)); } if (string.IsNullOrWhiteSpace(data.connection)) { return; } string[] array = Parse.SplitWithEmpty(data.connection); if (array.Length == 1) { string[] floats = array; List<string> list2 = new List<string>(floats.Length); list2.AddRange(floats); ConnectionType = ToByteEnum<ConnectionType>(list2); return; } List<string> list3 = array.Take(array.Length - 1).ToList(); string text10 = array[^1]; ConnectionType = ToByteEnum<ConnectionType>(list3); if (text10.Contains(":") || text10.Contains("<")) { TargetConnectionId = DataValue.ZdoId(text10); OriginalId = TargetConnectionId; return; } ConnectionHash = Parse.Int(text10); if (ConnectionHash == 0) { ConnectionHash = StringExtensionMethods.GetStableHashCode(text10); } } public void Load(ZPackage pkg) { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) pkg.SetPos(0); int num = pkg.ReadInt(); if ((num & 1) != 0) { if (Floats == null) { Floats = new Dictionary<int, IFloatValue>(); } byte b = pkg.ReadByte(); for (int i = 0; i < b; i++) { Floats[pkg.ReadInt()] = new SimpleFloatValue(pkg.ReadSingle()); } } if ((num & 2) != 0) { if (Vecs == null) { Vecs = new Dictionary<int, IVector3Value>(); } byte b2 = pkg.ReadByte(); for (int j = 0; j < b2; j++) { Vecs[pkg.ReadInt()] = new SimpleVector3Value(pkg.ReadVector3()); } } if ((num & 4) != 0) { if (Quats == null) { Quats = new Dictionary<int, IQuaternionValue>(); } byte b3 = pkg.ReadByte(); for (int k = 0; k < b3; k++) { Quats[pkg.ReadInt()] = new SimpleQuaternionValue(pkg.ReadQuaternion()); } } if ((num & 8) != 0) { if (Ints == null) { Ints = new Dictionary<int, IIntValue>(); } byte b4 = pkg.ReadByte(); for (int l = 0; l < b4; l++) { Ints[pkg.ReadInt()] = new SimpleIntValue(pkg.ReadInt()); } } if ((num & 0x40) != 0) { if (Longs == null) { Longs = new Dictionary<int, ILongValue>(); } byte b5 = pkg.ReadByte(); for (int m = 0; m < b5; m++) { Longs[pkg.ReadInt()] = new SimpleLongValue(pkg.ReadLong()); } } if ((num & 0x10) != 0) { if (Strings == null) { Strings = new Dictionary<int, IStringValue>(); } byte b6 = pkg.ReadByte(); for (int n = 0; n < b6; n++) { Strings[pkg.ReadInt()] = new SimpleStringValue(pkg.ReadString()); } } if ((num & 0x80) != 0) { if (ByteArrays == null) { ByteArrays = new Dictionary<int, byte[]>(); } byte b7 = pkg.ReadByte(); for (int num2 = 0; num2 < b7; num2++) { ByteArrays[pkg.ReadInt()] = pkg.ReadByteArray(); } } if ((num & 0x100) != 0) { ConnectionType = (ConnectionType)pkg.ReadByte(); ConnectionHash = pkg.ReadInt(); } if ((num & 0x200) != 0) { Persistent = new SimpleBoolValue(pkg.ReadBool()); } if ((num & 0x400) != 0) { Distant = new SimpleBoolValue(pkg.ReadBool()); } if ((num & 0x800) != 0) { Priority = (ObjectType)pkg.ReadByte(); } } public bool Match(Parameters pars, ZDO zdo) { //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_026b: Unknown result type (might be due to invalid IL or missing references) //IL_02c5: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Unknown result type (might be due to invalid IL or missing references) //IL_02d9: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) if (Strings != null && Strings.Any<KeyValuePair<int, IStringValue>>((KeyValuePair<int, IStringValue> pair) => pair.Value.Match(pars, zdo.GetString(pair.Key, "")) == false)) { return false; } if (Floats != null && Floats.Any<KeyValuePair<int, IFloatValue>>((KeyValuePair<int, IFloatValue> pair) => pair.Value.Match(pars, zdo.GetFloat(pair.Key, 0f)) == false)) { return false; } if (Ints != null && Ints.Any<KeyValuePair<int, IIntValue>>((KeyValuePair<int, IIntValue> pair) => pair.Value.Match(pars, zdo.GetInt(pair.Key, 0)) == false)) { return false; } if (Longs != null && Longs.Any<KeyValuePair<int, ILongValue>>((KeyValuePair<int, ILongValue> pair) => pair.Value.Match(pars, zdo.GetLong(pair.Key, 0L)) == false)) { return false; } if (Bools != null && Bools.Any<KeyValuePair<int, IBoolValue>>((KeyValuePair<int, IBoolValue> pair) => pair.Value.Match(pars, zdo.GetBool(pair.Key, false)) == false)) { return false; } if (Hashes != null && Hashes.Any<KeyValuePair<int, IHashValue>>((KeyValuePair<int, IHashValue> pair) => pair.Value.Match(pars, zdo.GetInt(pair.Key, 0)) == false)) { return false; } if (Vecs != null && Vecs.Any<KeyValuePair<int, IVector3Value>>((KeyValuePair<int, IVector3Value> pair) => pair.Value.Match(pars, zdo.GetVec3(pair.Key, Vector3.zero)) == false)) { return false; } if (Quats != null && Quats.Any<KeyValuePair<int, IQuaternionValue>>((KeyValuePair<int, IQuaternionValue> pair) => pair.Value.Match(pars, zdo.GetQuaternion(pair.Key, Quaternion.identity)) == false)) { return false; } if (ByteArrays != null && ByteArrays.Any<KeyValuePair<int, byte[]>>((KeyValuePair<int, byte[]> pair) => !pair.Value.SequenceEqual(zdo.GetByteArray(pair.Key, (byte[])null)))) { return false; } if (Persistent != null && Persistent.Match(pars, zdo.Persistent) == false) { return false; } if (Distant != null && Distant.Match(pars, zdo.Distant) == false) { return false; } if (Priority.HasValue && Priority.Value != zdo.Type) { return false; } if (Items != null) { return ItemValue.Match(pars, Items, zdo, ItemAmount); } if (ItemAmount != null) { return ItemValue.Match(pars, zdo, ItemAmount); } if (ConnectionType.HasValue) { if ((int)ConnectionType.Value == 0) { ZDOConnection connection = zdo.GetConnection(); if (connection != null && connection.m_target != ZDOID.None) { return false; } } else { ZDOID connectionZDOID = zdo.GetConnectionZDOID(ConnectionType.Value); if (TargetConnectionId == null) { if (connectionZDOID == ZDOID.None) { return false; } } else { ZDOID? val = TargetConnectionId.Get(pars); if (val.HasValue) { ZDOID val2 = connectionZDOID; ZDOID? val3 = val; if (!val3.HasValue || val2 != val3.GetValueOrDefault()) { return false; } } } } } return true; } public bool Unmatch(Parameters pars, ZDO zdo) { //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_0238: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: Unknown result type (might be due to invalid IL or missing references) //IL_02ad: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) if (Strings != null && Strings.Any<KeyValuePair<int, IStringValue>>((KeyValuePair<int, IStringValue> pair) => pair.Value.Match(pars, zdo.GetString(pair.Key, "")) == true)) { return false; } if (Floats != null && Floats.Any<KeyValuePair<int, IFloatValue>>((KeyValuePair<int, IFloatValue> pair) => pair.Value.Match(pars, zdo.GetFloat(pair.Key, 0f)) == true)) { return false; } if (Ints != null && Ints.Any<KeyValuePair<int, IIntValue>>((KeyValuePair<int, IIntValue> pair) => pair.Value.Match(pars, zdo.GetInt(pair.Key, 0)) == true)) { return false; } if (Longs != null && Longs.Any<KeyValuePair<int, ILongValue>>((KeyValuePair<int, ILongValue> pair) => pair.Value.Match(pars, zdo.GetLong(pair.Key, 0L)) == true)) { return false; } if (Bools != null && Bools.Any<KeyValuePair<int, IBoolValue>>((KeyValuePair<int, IBoolValue> pair) => pair.Value.Match(pars, zdo.GetBool(pair.Key, false)) == true)) { return false; } if (Hashes != null && Hashes.Any<KeyValuePair<int, IHashValue>>((KeyValuePair<int, IHashValue> pair) => pair.Value.Match(pars, zdo.GetInt(pair.Key, 0)) == true)) { return false; } if (Vecs != null && Vecs.Any<KeyValuePair<int, IVector3Value>>((KeyValuePair<int, IVector3Value> pair) => pair.Value.Match(pars, zdo.GetVec3(pair.Key, Vector3.zero)) == true)) { return false; } if (Quats != null && Quats.Any<KeyValuePair<int, IQuaternionValue>>((KeyValuePair<int, IQuaternionValue> pair) => pair.Value.Match(pars, zdo.GetQuaternion(pair.Key, Quaternion.identity)) == true)) { return false; } if (ByteArrays != null && ByteArrays.Any<KeyValuePair<int, byte[]>>((KeyValuePair<int, byte[]> pair) => pair.Value.SequenceEqual(zdo.GetByteArray(pair.Key, (byte[])null)))) { return false; } if (Persistent != null && Persistent.Match(pars, zdo.Persistent) == true) { return false; } if (Distant != null && Distant.Match(pars, zdo.Distant) == true) { return false; } if (Priority.HasValue && Priority.Value == zdo.Type) { return false; } if (Items != null) { return !ItemValue.Match(pars, Items, zdo, ItemAmount); } if (ItemAmount != null) { return !ItemValue.Match(pars, zdo, ItemAmount); } if (ConnectionType.HasValue) { if ((int)ConnectionType.Value == 0) { ZDOConnection connection = zdo.GetConnection(); if (connection == null || connection.m_target == ZDOID.None) { return false; } } else { ZDOID connectionZDOID = zdo.GetConnectionZDOID(ConnectionType.Value); if (TargetConnectionId == null) { if (connectionZDOID != ZDOID.None) { return false; } } else { ZDOID? val = TargetConnectionId.Get(pars); if (val.HasValue) { ZDOID val2 = connectionZDOID; ZDOID? val3 = val; if (val3.HasValue && val2 == val3.GetValueOrDefault()) { return false; } } } } } return true; } public static string PrintVectorXZY(Vector3 vector) { return vector.x.ToString("0.##", CultureInfo.InvariantCulture) + " " + vector.z.ToString("0.##", CultureInfo.InvariantCulture) + " " + vector.y.ToString("0.##", CultureInfo.InvariantCulture); } public static string PrintAngleYXZ(Quaternion quaternion) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return PrintVectorYXZ(((Quaternion)(ref quaternion)).eulerAngles); } private static string PrintVectorYXZ(Vector3 vector) { return vector.y.ToString("0.##", CultureInfo.InvariantCulture) + " " + vector.x.ToString("0.##", CultureInfo.InvariantCulture) + " " + vector.z.ToString("0.##", CultureInfo.InvariantCulture); } private static T ToByteEnum<T>(List<string> list) where T : struct, Enum { byte b = 0; foreach (string item in list) { string text = item.Trim(); if (Enum.TryParse<T>(text, ignoreCase: true, out var result)) { b += (byte)(object)result; } else { Log.Warning("Failed to parse value " + text + " as T."); } } return (T)(object)b; } public ResolvedDataEntry Resolve(Parameters pars) { //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0441: Unknown result type (might be due to invalid IL or missing references) //IL_04e4: Unknown result type (might be due to invalid IL or missing references) //IL_0547: Unknown result type (might be due to invalid IL or missing references) //IL_054c: Unknown result type (might be due to invalid IL or missing references) //IL_0573: Unknown result type (might be due to invalid IL or missing references) //IL_0578: Unknown result type (might be due to invalid IL or missing references) //IL_059f: Unknown result type (might be due to invalid IL or missing references) //IL_05a4: Unknown result type (might be due to invalid IL or missing references) ResolvedDataEntry resolvedDataEntry = new ResolvedDataEntry(); if (Floats != null) { foreach (KeyValuePair<int, IFloatValue> @float in Floats) { float? num = @float.Value.Get(pars); if (num.HasValue) { ResolvedDataEntry resolvedDataEntry2 = resolvedDataEntry; if (resolvedDataEntry2.Floats == null) { resolvedDataEntry2.Floats = new Dictionary<int, float>(); } resolvedDataEntry.Floats[@float.Key] = num.Value; } } } if (Vecs != null) { foreach (KeyValuePair<int, IVector3Value> vec in Vecs) { Vector3? val = vec.Value.Get(pars); if (val.HasValue) { ResolvedDataEntry resolvedDataEntry2 = resolvedDataEntry; if (resolvedDataEntry2.Vecs == null) { resolvedDataEntry2.Vecs = new Dictionary<int, Vector3>(); } resolvedDataEntry.Vecs[vec.Key] = val.Value; } } } if (Quats != null) { foreach (KeyValuePair<int, IQuaternionValue> quat in Quats) { Quaternion? val2 = quat.Value.Get(pars); if (val2.HasValue) { ResolvedDataEntry resolvedDataEntry2 = resolvedDataEntry; if (resolvedDataEntry2.Quats == null) { resolvedDataEntry2.Quats = new Dictionary<int, Quaternion>(); } resolvedDataEntry.Quats[quat.Key] = val2.Value; } } } if (Ints != null) { foreach (KeyValuePair<int, IIntValue> @int in Ints) { int? num2 = @int.Value.Get(pars); if (num2.HasValue) { ResolvedDataEntry resolvedDataEntry2 = resolvedDataEntry; if (resolvedDataEntry2.Ints == null) { resolvedDataEntry2.Ints = new Dictionary<int, int>(); } resolvedDataEntry.Ints[@int.Key] = num2.Value; } } } if (Hashes != null) { foreach (KeyValuePair<int, IHashValue> hash in Hashes) { int? num3 = hash.Value.Get(pars); if (num3.HasValue) { ResolvedDataEntry resolvedDataEntry2 = resolvedDataEntry; if (resolvedDataEntry2.Ints == null) { resolvedDataEntry2.Ints = new Dictionary<int, int>(); } resolvedDataEntry.Ints[hash.Key] = num3.Value; } } } if (Bools != null) { foreach (KeyValuePair<int, IBoolValue> @bool in Bools) { int? num4 = @bool.Value.GetInt(pars); if (num4.HasValue) { ResolvedDataEntry resolvedDataEntry2 = resolvedDataEntry; if (resolvedDataEntry2.Ints == null) { resolvedDataEntry2.Ints = new Dictionary<int, int>(); } resolvedDataEntry.Ints[@bool.Key] = num4.Value; } } } if (Longs != null) { foreach (KeyValuePair<int, ILongValue> @long in Longs) { long? num5 = @long.Value.Get(pars); if (num5.HasValue) { ResolvedDataEntry resolvedDataEntry2 = resolvedDataEntry; if (resolvedDataEntry2.Longs == null) { resolvedDataEntry2.Longs = new Dictionary<int, long>(); } resolvedDataEntry.Longs[@long.Key] = num5.Value; } } } if (Strings != null) { foreach (KeyValuePair<int, IStringValue> @string in Strings) { string text = @string.Value.Get(pars); if (text != null) { ResolvedDataEntry resolvedDataEntry2 = resolvedDataEntry; if (resolvedDataEntry2.Strings == null) { resolvedDataEntry2.Strings = new Dictionary<int, string>(); } resolvedDataEntry.Strings[@string.Key] = text; } } } if (ByteArrays != null) { resolvedDataEntry.ByteArrays = new Dictionary<int, byte[]>(ByteArrays); } List<ItemValue>? items = Items; if (items != null && items.Count > 0) { string value = ItemValue.LoadItems(pars, Items, GetContainerSize(), (ItemAmount?.Get(pars)).GetValueOrDefault()); ResolvedDataEntry resolvedDataEntry2 = resolvedDataEntry; if (resolvedDataEntry2.Strings == null) { resolvedDataEntry2.Strings = new Dictionary<int, string>(); } resolvedDataEntry.Strings[ZDOVars.s_items] = value; } if (Persistent != null) { resolvedDataEntry.Persistent = Persistent.GetBool(pars); } if (Distant != null) { resolvedDataEntry.Distant = Distant.GetBool(pars); } if (Priority.HasValue) { resolvedDataEntry.Priority = Priority.Value; } if (Position != null) { resolvedDataEntry.Position = Position.Get(pars); } if (Rotation != null) { resolvedDataEntry.Rotation = Rotation.Get(pars); } resolvedDataEntry.ConnectionHash = ConnectionHash; if (ConnectionType.HasValue) { resolvedDataEntry.ConnectionType = ConnectionType.Value; } if (OriginalId != null) { ZDOID? val3 = OriginalId.Get(pars); if (val3.HasValue) { resolvedDataEntry.OriginalId = val3.Value; } } if (TargetConnectionId != null) { ZDOID? val4 = TargetConnectionId.Get(pars); if (val4.HasValue) { resolvedDataEntry.TargetConnectionId = val4.Value; } } ItemDataHelper.ConvertAll(resolvedDataEntry); return resolvedDataEntry; } public void AddItems(Parameters parameters, ZDO zdo) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown if (Items == null || Items.Count == 0) { return; } Vector2i containerSize = GetContainerSize(); Inventory val = ItemValue.CreateInventory(zdo, containerSize.x, containerSize.y); foreach (ItemValue item in GenerateItems(parameters, containerSize)) { item.AddTo(parameters, val); } ZPackage val2 = new ZPackage(); val.Save(val2); zdo.Set(ZDOVars.s_items, val2.GetBase64()); } public void RemoveItems(Parameters parameters, ZDO zdo) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Expected O, but got Unknown if (Items == null || Items.Count == 0) { return; } Inventory val = ItemValue.CreateInventory(zdo); if (val.m_inventory.Count == 0) { return; } foreach (ItemValue item in GenerateItems(parameters, new Vector2i(10000, 10000))) { item.RemoveFrom(parameters, val); } ZPackage val2 = new ZPackage(); val.Save(val2); zdo.Set(ZDOVars.s_items, val2.GetBase64()); } public List<ItemValue> GenerateItems(Parameters pars, Vector2i size) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) if (Items == null) { throw new ArgumentNullException("Items"); } return ItemValue.Generate(pars, Items, size, (ItemAmount?.Get(pars)).GetValueOrDefault()); } public static int Hash(string key) { if (Parse.TryInt(key, out var result)) { return result; } if (key.StartsWith("$", StringComparison.InvariantCultureIgnoreCase)) { int hash = ZSyncAnimation.GetHash(key.Substring(1)); if (key == "$anim_speed") { return hash; } return 438569 + hash; } return StringExtensionMethods.GetStableHashCode(key); } } public class DataHelper { public static ZDO? Init(GameObject obj, Vector3 pos, Quaternion rot, Vector3? scale, DataEntry? data) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) if (data == null && !scale.HasValue) { return null; } ZNetView val = default(ZNetView); if (!obj.TryGetComponent<ZNetView>(ref val)) { return null; } string prefabName = Utils.GetPrefabName(obj); int stableHashCode = StringExtensionMethods.GetStableHashCode(prefabName); ZNetView.m_initZDO = ZDOMan.instance.CreateNewZDO(pos, stableHashCode); ObjectParameters pars = new ObjectParameters(prefabName, "", ZNetView.m_initZDO); ZNetView.m_initZDO.m_rotation = ((Quaternion)(ref rot)).eulerAngles; ZNetView.m_initZDO.Type = val.m_type; ZNetView.m_initZDO.Distant = val.m_distant; ZNetView.m_initZDO.Persistent = val.m_persistent; data?.Resolve(pars).Write(ZNetView.m_initZDO); ZNetView.m_initZDO.m_prefab = stableHashCode; if (val.m_syncInitialScale && scale.HasValue) { ZNetView.m_initZDO.Set(ZDOVars.s_scaleHash, scale.Value); } ZNetView.m_initZDO.DataRevision = 0u; ZNetView.m_initZDO.IncreaseDataRevision(); return ZNetView.m_initZDO; } public static void CleanUp() { ZNetView.m_initZDO = null; } public static DataEntry? Merge(DataEntry? first, DataEntry? second) { if (first == null) { return second; } if (second == null) { return first; } DataEntry dataEntry = new DataEntry(); dataEntry.Load(first); dataEntry.Load(second); return dataEntry; } public static DataEntry? Merge(params DataEntry?[] datas) { DataEntry[] array = datas.Where((DataEntry d) => d != null).ToArray(); if (array.Length == 0) { return null; } if (array.Length == 1) { return array[0]; } DataEntry dataEntry = new DataEntry(); DataEntry[] array2 = array; foreach (DataEntry data in array2) { dataEntry.Load(data); } return dataEntry; } public static bool Exists(int hash) { return DataLoading.Data.ContainsKey(hash); } public static bool Match(int hash, ZDO zdo, Parameters pars) { if (DataLoading.Data.TryGetValue(hash, out DataEntry value)) { return value.Match(pars, zdo); } return false; } public static DataEntry? Get(string name, string fileName) { if (!(name == "")) { return DataLoading.Get(name, fileName); } return null; } public static List<string>? GetValuesFromGroup(string group) { int stableHashCode = StringExtensionMethods.GetStableHashCode(group.ToLowerInvariant()); if (DataLoading.ValueGroups.TryGetValue(stableHashCode, out List<string> value)) { return value; } return null; } public static List<string> ResolvePrefabs(string values) { HashSet<string> hashSet = new HashSet<string>(); ResolvePrefabsSub(hashSet, values); HashSet<string> hashSet2 = hashSet; List<string> list = new List<string>(hashSet2.Count); list.AddRange(hashSet2); return list; } private static void ResolvePrefabsSub(HashSet<string> prefabs, string value) { if (value == "all" || DataLoading.IsComponentGroup(value)) { prefabs.Add(value.ToLowerInvariant()); return; } if (ZNetScene.instance.m_namedPrefabs.ContainsKey(StringExtensionMethods.GetStableHashCode(value))) { prefabs.Add(value); return; } List<string> valuesFromGroup = GetValuesFromGroup(value); if (valuesFromGroup != null) { foreach (string item in valuesFromGroup) { ResolvePrefabsSub(prefabs, item); } return; } Log.Warning("Failed to resolve prefab: " + value); } public static string GetGlobalKey(string key) { string lower = key.ToLowerInvariant(); return ZoneSystem.instance.m_globalKeysValues.FirstOrDefault((KeyValuePair<string, string> kvp) => kvp.Key.ToLowerInvariant() == lower).Value ?? "0"; } } public class DataLoading { private static readonly string GamePath = Path.GetFullPath(Path.Combine("BepInEx", "config", "data")); private static readonly string ProfilePath = Path.GetFullPath(Path.Combine(Paths.ConfigPath, "data")); public static Dictionary<int, DataEntry> Data = new Dictionary<int, DataEntry>(); public static readonly Dictionary<int, List<string>> ValueGroups = new Dictionary<int, List<string>>(); private static readonly Dictionary<int, List<string>> DefaultValueGroups = new Dictionary<int, List<string>>(); private static readonly Dictionary<string, List<string>> DefaultPrefabComponents = new Dictionary<string, List<string>>(); private static readonly int WearNTearHash = StringExtensionMethods.GetStableHashCode("wearntear"); private static readonly int HumanoidHash = StringExtensionMethods.GetStableHashCode("humanoid"); private static readonly int CreatureHash = StringExtensionMethods.GetStableHashCode("creature"); private static readonly int StructureHash = StringExtensionMethods.GetStableHashCode("structure"); public static string Pattern = "expand_data*.yaml"; public static DataEntry? Get(string name, string fileName) { int stableHashCode = StringExtensionMethods.GetStableHashCode(name); if (!Data.ContainsKey(stableHashCode)) { try { Data[stableHashCode] = new DataEntry(name); } catch { if (name.Contains("=") || name.Length > 32) { Log.Warning(fileName + ": Can't load data value: " + name); } else { Log.Warning(fileName + ": Can't find data entry: " + name); } return null; } } return Data[stableHashCode]; } public static DataEntry? Get(int hash) { if (!Data.ContainsKey(hash)) { return null; } return Data[hash]; } public static void LoadEntries() { Dictionary<int, DataEntry> data = Data; Data = new Dictionary<int, DataEntry>(); ValueGroups.Clear(); List<DataData> list = Yaml.Read<DataData>(Directory.GetFiles(GamePath, "*.yaml", SearchOption.AllDirectories).Concat(Directory.GetFiles(ProfilePath, "*.yaml", SearchOption.AllDirectories)).Concat(Directory.GetFiles(Yaml.BaseDirectory, Pattern, SearchOption.AllDirectories)) .Select(Path.GetFullPath) .Distinct() .ToList()); foreach (DataData item in list) { LoadValues(item); } if (ValueGroups.Count > 0) { Log.Info($"Loaded {ValueGroups.Count} value groups."); } LoadDefaultValueGroups(); foreach (KeyValuePair<int, List<string>> valueGroup in ValueGroups) { ResolveValues(valueGroup.Value); } foreach (KeyValuePair<int, List<string>> defaultValueGroup in DefaultValueGroups) { if (!ValueGroups.ContainsKey(defaultValueGroup.Key)) { ValueGroups[defaultValueGroup.Key] = defaultValueGroup.Value; } } foreach (DataData item2 in list) { LoadEntry(item2, data); } PrefabHelper.ClearCache(); Log.Info($"Loaded {Data.Count} data entries."); } private static void LoadValues(DataData data) { if (data.value != null) { KeyValuePair<string, string> keyValuePair = Parse.Kvp(data.value); int stableHashCode = StringExtensionMethods.GetStableHashCode(keyValuePair.Key.ToLowerInvariant()); if (ValueGroups.ContainsKey(stableHashCode)) { Log.Warning("Duplicate value group entry: " + keyValuePair.Key); } if (!ValueGroups.ContainsKey(stableHashCode)) { ValueGroups[stableHashCode] = new List<string>(); } ValueGroups[stableHashCode].Add(keyValuePair.Value); } if (data.valueGroup != null && data.values != null) { int stableHashCode2 = StringExtensionMethods.GetStableHashCode(data.valueGroup.ToLowerInvariant()); if (ValueGroups.ContainsKey(stableHashCode2)) { Log.Warning("Duplicate value group entry: " + data.valueGroup); } if (!ValueGroups.ContainsKey(stableHashCode2)) { ValueGroups[stableHashCode2] = new List<string>(); } string[] values = data.values; foreach (string item in values) { ValueGroups[stableHashCode2].Add(item); } } } private static void LoadEntry(DataData data, Dictionary<int, DataEntry> oldData) { if (data.name != null) { int stableHashCode = StringExtensionMethods.GetStableHashCode(data.name); if (Data.ContainsKey(stableHashCode)) { Log.Warning("Duplicate data entry: " + data.name); } Data[stableHashCode] = (oldData.TryGetValue(stableHashCode, out DataEntry value) ? value.Reset(data) : new DataEntry(data)); } } public static bool IsComponentGroup(string group) { return DefaultValueGroups.ContainsKey(StringExtensionMethods.GetStableHashCode(group.ToLowerInvariant())); } public static List<string> GetDefaultComponents(string prefabName) { if (DefaultPrefabComponents.TryGetValue(prefabName, out List<string> value)) { return value; } return new List<string>(); } private static void LoadDefaultValueGroups() { if (DefaultValueGroups.Count != 0 || !Object.op_Implicit((Object)(object)ZNetScene.instance)) { return; } foreach (GameObject value3 in ZNetScene.instance.m_namedPrefabs.Values) { if (!Object.op_Implicit((Object)(object)value3)) { continue; } string name = ((Object)value3).name; if (!DefaultPrefabComponents.ContainsKey(name)) { DefaultPrefabComponents[name] = new List<string>(); } value3.GetComponentsInChildren<MonoBehaviour>(ZNetView.m_tempComponents); foreach (MonoBehaviour tempComponent in ZNetView.m_tempComponents) { if (Object.op_Implicit((Object)(object)tempComponent)) { string text = ((object)tempComponent).GetType().Name.ToLowerInvariant(); int stableHashCode = StringExtensionMethods.GetStableHashCode(text); if (!DefaultValueGroups.ContainsKey(stableHashCode)) { DefaultValueGroups[stableHashCode] = new List<string>(); } DefaultValueGroups[stableHashCode].Add(((Object)value3).name); DefaultPrefabComponents[name].Add(text); if (text == "humanoid") { DefaultPrefabComponents[name].Add("character"); } if (text == "wearntear") { DefaultPrefabComponents[name].Add("structure"); } } } } DefaultValueGroups[CreatureHash] = (DefaultValueGroups.TryGetValue(HumanoidHash, out List<string> value) ? value : new List<string>()); DefaultValueGroups[StructureHash] = (DefaultValueGroups.TryGetValue(WearNTearHash, out List<string> value2) ? value2 : new List<string>()); } private static void ResolveValues(List<string> values) { for (int i = 0; i < values.Count; i++) { string text = values[i]; if (text.StartsWith("<", StringComparison.OrdinalIgnoreCase) && text.EndsWith(">", StringComparison.OrdinalIgnoreCase)) { string text2 = text.Substring(1, text.Length - 2); List<string> value2; if (ValueGroups.TryGetValue(StringExtensionMethods.GetStableHashCode(text2.ToLowerInvariant()), out List<string> value)) { values.RemoveAt(i); values.InsertRange(i, value); i--; } else if (DefaultValueGroups.TryGetValue(StringExtensionMethods.GetStableHashCode(text2.ToLowerInvariant()), out value2)) { values.RemoveAt(i); values.InsertRange(i, value2); i += value2.Count - 1; } } } } public static void SetupWatcher() { if (!Directory.Exists(GamePath)) { Directory.CreateDirectory(GamePath); } if (!Directory.Exists(ProfilePath)) { Directory.CreateDirectory(ProfilePath); } if (!Directory.Exists(Yaml.BaseDirectory)) { Directory.CreateDirectory(Yaml.BaseDirectory); } Yaml.SetupWatcher(GamePath, "*", LoadEntries); if (GamePath != ProfilePath) { Yaml.SetupWatcher(ProfilePath, "*", LoadEntries); } Yaml.SetupWatcher(Pattern, LoadEntries); } } public class DataValue { public static IZdoIdValue ZdoId(string values) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) string[] array = SplitWithValues(values); ZDOID val = Parse.ZdoId(array[0]); if (array.Length == 1 && val != ZDOID.None) { return new SimpleZdoIdValue(val); } return new ZdoIdValue(array); } public static IIntValue Simple(int value) { return new SimpleIntValue(value); } public static IStringValue Simple(string value) { return new SimpleStringValue(value); } public static IFloatValue Simple(float value) { return new SimpleFloatValue(value); } public static ILongValue Simple(long value) { return new SimpleLongValue(value); } public static IVector3Value Simple(Vector3 value) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return new SimpleVector3Value(value); } public static IQuaternionValue Simple(Quaternion value) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return new SimpleQuaternionValue(value); } public static IIntValue Int(string values) { string[] array = SplitWithValues(values); if (array.Length == 1 && int.TryParse(array[0], out var result)) { return new SimpleIntValue(result); } return new IntValue(array); } public static IFloatValue Float(string values) { string[] array = SplitWithValues(values); if (array.Length == 1 && Parse.TryFloat(array[0], out var result)) { return new SimpleFloatValue(result); } return new FloatValue(array); } public static ILongValue Long(string values) { string[] array = SplitWithValues(values); if (array.Length == 1 && long.TryParse(array[0], out var result)) { return new SimpleLongValue(result); } return new LongValue(array); } public static IStringValue String(string values) { string[] array = SplitWithValues(values); if (array.Length == 1 && !HasParameters(array[0])) { return new SimpleStringValue(array[0]); } return new StringValue(array); } public static IBoolValue Bool(string values) { string[] array = SplitWithValues(values); if (array.Length == 1 && bool.TryParse(array[0], out var result)) { return new SimpleBoolValue(result); } return new BoolValue(array); } public static IHashValue Hash(string values) { string[] array = SplitWithValues(values); if (array.Length == 1 && !HasParameters(array[0])) { return new SimpleHashValue(array[0]); } return new HashValue(array); } public static IPrefabValue Prefab(string values) { if (HasParameters(values)) { return new PrefabValue(SplitWithValues(values)); } List<int> prefabs = PrefabHelper.GetPrefabs(values); if (prefabs.Count == 0) { return new SimplePrefabValue(null); } if (prefabs.Count == 1) { return new SimplePrefabValue(prefabs[0]); } return new SimplePrefabsValue(prefabs); } public static IVector3Value Vector3(string values) { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) string[] array = SplitWithValues(values); if (HasParameters(values) || array.Length > 3) { List<string> list = new List<string>(); for (int i = 0; i < array.Length; i += 3) { string[] value = ((i + 3 < array.Length) ? array.Skip(i).Take(3).ToArray() : array.Skip(i).ToArray()); list.Add(string.Join(",", value)); } return new Vector3Value(list.ToArray()); } Vector3? val = Parse.VectorXZYNull(array); return new SimpleVector3Value(val.HasValue ? val.Value : Vector3.zero); } public static IQuaternionValue Quaternion(string values) { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) string[] array = SplitWithValues(values); if (HasParameters(values) || array.Length > 3) { List<string> list = new List<string>(); for (int i = 0; i < array.Length; i += 3) { string[] value = ((i + 3 < array.Length) ? array.Skip(i).Take(3).ToArray() : array.Skip(i).ToArray()); list.Add(string.Join(",", value)); } return new QuaternionValue(list.ToArray()); } Quaternion? val = Parse.AngleYXZNull(array); return new SimpleQuaternionValue(val.HasValue ? val.Value : Quaternion.identity); } private static bool HasParameters(string value) { if (value.Contains("<")) { return value.Contains(">"); } return false; } private static string[] SplitWithValues(string str) { List<string> list = new List<string>(); string[] array = Parse.SplitWithEmpty(str); foreach (string text in array) { if (!text.Contains("<") || !text.Contains(">")) { list.Add(text); continue; } string[] array2 = text.Split('<', '>'); List<string> list2 = new List<string>(); List<int> list3 = new List<int>(); for (int j = 1; j < array2.Length; j += 2) { int stableHashCode = StringExtensionMethods.GetStableHashCode(array2[j].ToLowerInvariant()); if (DataLoading.ValueGroups.ContainsKey(stableHashCode)) { list2.Add("<" + array2[j] + ">"); list3.Add(stableHashCode); } } if (list2.Count == 0) { list.Add(text); } else { SubstitueValues(list, text, list2, list3, 0); } } return list.ToArray(); } private static void SubstitueValues(List<string> result, string format, List<string> parameters, List<int> hashes, int index) { foreach (string item in DataLoading.ValueGroups[hashes[index]]) { string text = format.Replace(parameters[index], item); if (index == parameters.Count - 1) { result.Add(text); } else { SubstitueValues(result, text, parameters, hashes, index + 1); } } } } public class AnyValue(string[] values) { protected readonly string[] Values = values; private string? RollValue() { if (values.Length == 1) { return values[0]; } return values[Random.Range(0, values.Length)]; } protected string? GetValue(Parameters pars) { string text = RollValue(); if (text == null || text == "<none>") { return null; } return pars.Replace(text); } protected string? GetValue() { string text = RollValue(); if (text != null && !(text == "<none>")) { return text; } return null; } protected List<string> GetAllValues(Parameters pars) { return (from v in values.Select(pars.Replace) where v != null && v != "<none" select v).ToList(); } } public class ItemValue { public IPrefabValue Prefab = DataValue.Prefab(data.prefab); public float Chance = data.chance; public IIntValue? Stack = ((data.stack == null) ? null : DataValue.Int(data.stack)); public IFloatValue? Durability = ((data.durability == null) ? null : DataValue.Float(data.durability)); public string Position = data.pos; private Vector2i RolledPosition = Parse.Vector2Int(data.pos); public IBoolValue? Equipped = ((data.equipped == null) ? null : DataValue.Bool(data.equipped)); public IIntValue? Quality = ((data.quality == null) ? null : DataValue.Int(data.quality)); public IIntValue? Variant = ((data.variant == null) ? null : DataValue.Int(data.variant)); public ILongValue? CrafterID = ((data.crafterID == null) ? null : DataValue.Long(data.crafterID)); public IStringValue? CrafterName = ((data.crafterName == null) ? null : DataValue.String(data.crafterName)); public Dictionary<string, IStringValue>? CustomData = data.customData?.ToDictionary((KeyValuePair<string, string> kvp) => kvp.Key, (KeyValuePair<string, string> kvp) => DataValue.String(kvp.Value)); public IIntValue? WorldLevel = ((data.worldLevel == null) ? null : DataValue.Int(data.worldLevel)); public IBoolValue? PickedUp = ((data.pickedUp == null) ? null : DataValue.Bool(data.pickedUp)); private int RolledPrefab; private int RolledStack; public ItemValue(ItemData data) { }//IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) public static bool Match(Parameters pars, List<ItemValue> data, ZDO zdo, IIntValue? amount) { Inventory inv = CreateInventory(zdo); int num = data.Where((ItemValue item) => item.Match(pars, inv)).Count(); if (amount == null) { if (num == data.Count) { return inv.m_inventory.Count == 0; } return false; } return amount.Match(pars, num) == true; } public static bool Match(Parameters pars, ZDO zdo, IIntValue amount) { Inventory val = CreateInventory(zdo); return amount.Match(pars, val.m_inventory.Count) == true; } public static Inventory CreateInventory(ZDO zdo, int width = 100000, int height = 10000) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown Inventory val = new Inventory("", (Sprite)null, width, height); string text = zdo.GetString(ZDOVars.s_items, ""); if (text != "") { ZPackage val2 = new ZPackage(text); val.Load(val2); } return val; } public static string LoadItems(Parameters pars, List<ItemValue> items, Vector2i size, int amount) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0010: Unknown result type (might be due to invalid IL or missing references) ZPackage val = new ZPackage(); val.Write(106); items = Generate(pars, items, size, amount); val.Write(items.Count); foreach (ItemValue item in items) { item.Write(pars, val); } return val.GetBase64(); } public static List<ItemValue> Generate(Parameters pars, List<ItemValue> data, Vector2i size, int amount) { //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) List<ItemValue> list = data.Where((ItemValue item) => item.Position != "").ToList(); List<ItemValue> items = data.Where((ItemValue item) => item.Position == "").ToList(); Dictionary<Vector2i, ItemValue> dictionary = new Dictionary<Vector2i, ItemValue>(); foreach (ItemValue item in list) { if (item.Roll(pars)) { dictionary[item.RolledPosition] = item; } } if (amount == 0) { GenerateEach(pars, dictionary, size, items); } else { GenerateAmount(pars, dictionary, size, items, amount); } Dictionary<Vector2i, ItemValue>.ValueCollection values = dictionary.Values; List<ItemValue> list2 = new List<ItemValue>(values.Count); list2.AddRange(values); return list2; } private static void GenerateEach(Parameters pars, Dictionary<Vector2i, ItemValue> inventory, Vector2i size, List<ItemValue> items) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) foreach (ItemValue item in items) { if (item.Roll(pars)) { Vector2i? val = FindNextFreeSlot(inventory, size); if (!val.HasValue) { break; } item.RolledPosition = val.Value; inventory[val.Value] = item; } } } private static void GenerateAmount(Parameters pars, Dictionary<Vector2i, ItemValue> inventory, Vector2i size, List<ItemValue> items, int amount) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) float num = items.Sum((ItemValue item) => item.Chance); for (int num2 = 0; num2 < amount; num2++) { if (items.Count <= 0) { break; } Vector2i? val = FindNextFreeSlot(inventory, size); if (val.HasValue) { ItemValue itemValue = RollItem(items, num); itemValue.RolledPosition = val.Value; if (itemValue.RollPrefab(pars)) { inventory[val.Value] = itemValue; } num -= itemValue.Chance; items.Remove(itemValue); continue; } break; } } private static ItemValue RollItem(List<ItemValue> items, float maxWeight) { float num = Random.Range(0f, maxWeight); foreach (ItemValue item in items) { if (num < item.Chance) { return item; } num -= item.Chance; } return items.Last(); } private static Vector2i? FindNextFreeSlot(Dictionary<Vector2i, ItemValue> inventory, Vector2i size) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) int x = size.x; int y = size.y; Vector2i val = default(Vector2i); for (int i = 0; i < y; i++) { for (int j = 0; j < x; j++) { ((Vector2i)(ref val))..ctor(j, i); if (!inventory.ContainsKey(val)) { return val; } } } return null; } public bool RollPrefab(Parameters pars) { RolledPrefab = Prefab.Get(pars).GetValueOrDefault(); RolledStack = Stack?.Get(pars) ?? 1; if (RolledPrefab != 0) { return RolledStack != 0; } return false; } public bool RollChance() { if (!(Chance >= 1f)) { return Random.value <= Chance; } return true; } public bool Roll(Parameters pars) { if (RollChance()) { return RollPrefab(pars); } return false; } public void Write(Parameters pars, ZPackage pkg) { //IL_00c7: Unknown result type (might be due to invalid IL or missing references) GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(RolledPrefab); pkg.Write(((itemPrefab != null) ? ((Object)itemPrefab).name : null) ?? ""); int num = Quality?.Get(pars) ?? 1; float? num2 = Durability?.Get(pars); if (!num2.HasValue) { ItemDrop val = default(ItemDrop); num2 = ((!((Object)(object)itemPrefab != (Object)null) || !itemPrefab.TryGetComponent<ItemDrop>(ref val)) ? new float?(100f) : new float?(val.m_itemData.GetMaxDurability(num))); } pkg.Write(RolledStack); pkg.Write(num2.Value); pkg.Write(RolledPosition); pkg.Write(Equipped?.GetBool(pars) == true); pkg.Write(num); pkg.Write((Variant?.Get(pars)).GetValueOrDefault()); pkg.Write((CrafterID?.Get(pars)).GetValueOrDefault()); pkg.Write(CrafterName?.Get(pars) ?? ""); pkg.Write(CustomData?.Count ?? 0); if (CustomData != null) { foreach (KeyValuePair<string, IStringValue> customDatum in CustomData) { pkg.Write(customDatum.Key); pkg.Write(customDatum.Value.Get(pars)); } } pkg.Write((WorldLevel?.Get(pars)).GetValueOrDefault()); pkg.Write(PickedUp?.GetBool(pars) == true); } public void AddTo(Parameters pars, Inventory inv) { int stack = Stack?.Get(pars) ?? 1; stack = StackTo(pars, stack, inv); InsertTo(pars, stack, inv); } private int StackTo(Parameters pars, int stack, Inventory inv) { foreach (ItemData item in inv.m_inventory) { if (MatchItem(pars, item)) { int num = Mathf.Min(item.m_shared.m_maxStackSize - item.m_stack, stack); item.m_stack += num; stack -= num; if (stack <= 0) { break; } } } return stack; } private int InsertTo(Parameters pars, int stack, Inventory inv) { //IL_02ba: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_0293: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) ItemDrop val = default(ItemDrop); while (stack > 0) { int valueOrDefault = Prefab.Get(pars).GetValueOrDefault(); GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(valueOrDefault); if ((Object)(object)itemPrefab == (Object)null || !itemPrefab.TryGetComponent<ItemDrop>(ref val)) { return stack; } ItemData val2 = val.m_itemData.Clone(); val2.m_dropPrefab = itemPrefab; val2.m_quality = Quality?.Get(pars) ?? 1; val2.m_variant = (Variant?.Get(pars)).GetValueOrDefault(); val2.m_crafterID = (CrafterID?.Get(pars)).GetValueOrDefault(); val2.m_crafterName = CrafterName?.Get(pars) ?? ""; val2.m_worldLevel = (WorldLevel?.Get(pars)).GetValueOrDefault(); val2.m_durability = Durability?.Get(pars) ?? val2.GetMaxDurability(val2.m_quality); val2.m_equipped = Equipped?.GetBool(pars) == true; val2.m_pickedUp = PickedUp?.GetBool(pars) == true; val2.m_customData = CustomData.ToDictionary<KeyValuePair<string, IStringValue>, string, string>((KeyValuePair<string, IStringValue> x) => x.Key, (KeyValuePair<string, IStringValue> x) => x.Value.Get(pars) ?? ""); int num = Mathf.Min(val2.m_shared.m_maxStackSize, stack); stack -= num; val2.m_stack = num; if (Position == "") { Vector2i val3 = inv.FindEmptySlot(true); if (val3.x < 0) { return stack; } val2.m_gridPos = val3; inv.m_inventory.Add(val2); } else { val2.m_gridPos = RolledPosition; inv.m_inventory.RemoveAll((ItemData x) => x.m_gridPos == RolledPosition); inv.m_inventory.Add(val2); } } return stack; } public void RemoveFrom(Parameters pars, Inventory inv) { int num = Stack?.Get(pars) ?? 1; for (int num2 = inv.m_inventory.Count - 1; num2 >= 0; num2--) { ItemData val = inv.m_inventory[num2]; if (MatchItem(pars, val)) { int num3 = Mathf.Min(val.m_stack, num); val.m_stack -= num3; num -= num3; if (num <= 0) { break; } } } inv.m_inventory.RemoveAll((ItemData x) => x.m_stack <= 0); } public bool Match(Parameters pars, Inventory inv) { ItemData val = FindMatch(pars, inv); if (val == null) { return false; } inv.RemoveItem(val); return true; } private ItemData? FindMatch(Parameters pars, Inventory inv) { if (Position != "") { ItemData itemAt = inv.GetItemAt(RolledPosition.x, RolledPosition.y); if (itemAt == null) { return null; } IIntValue? stack = Stack; if (stack != null && stack.Match(pars, itemAt.m_stack) == false) { return null; } if (MatchItem(pars, itemAt)) { return itemAt; } } foreach (ItemData item in inv.m_inventory) { IIntValue? stack2 = Stack; if ((stack2 == null || stack2.Match(pars, item.m_stack) != false) && MatchItem(pars, item)) { return item; } } return null; } private bool MatchItem(Parameters pars, ItemData item) { GameObject dropPrefab = item.m_dropPrefab; string text = ((dropPrefab != null) ? ((Object)dropPrefab).name : null) ?? item.m_shared.m_name; bool? flag = Prefab.Match(pars, StringExtensionMethods.GetStableHashCode(text)); bool flag2 = false; if (flag == flag2) { return false; } IFloatValue? durability = Durability; if (durability != null) { flag = durability.Match(pars, item.m_durability); flag2 = false; if (flag == flag2) { return false; } } IBoolValue? equipped = Equipped; if (equipped != null) { flag = equipped.Match(pars, item.m_equipped); flag2 = false; if (flag == flag2) { return false; } } IIntValue? quality = Quality; if (quality != null) { flag = quality.Match(pars, item.m_quality); flag2 = false; if (flag == flag2) { return false; } } IIntValue? variant = Variant; if (variant != null) { flag = variant.Match(pars, item.m_variant); flag2 = false; if (flag == flag2) { return false; } } ILongValue? crafterID = CrafterID; if (crafterID != null) { flag = crafterID.Match(pars, item.m_crafterID); flag2 = false; if (flag == flag2) { return false; } } IStringValue? crafterName = CrafterName; if (crafterName != null) { flag = crafterName.Match(pars, item.m_crafterName); flag2 = false; if (flag == flag2) { return false; } } IIntValue? worldLevel = WorldLevel; if (worldLevel != null) { flag = worldLevel.Match(pars, item.m_worldLevel); flag2 = false; if (flag == flag2) { return false; } } IBoolValue? pickedUp = PickedUp; if (pickedUp != null) { flag = pickedUp.Match(pars, item.m_pickedUp); flag2 = false; if (flag == flag2) { return false; } } if (CustomData == null) { return true; } foreach (KeyValuePair<string, IStringValue> customDatum in CustomData) { if (!item.m_customData.TryGetValue(customDatum.Key, out var value)) { flag2 = false; } else { if (customDatum.Value.Match(pars, value) != false) { continue; } flag2 = false; } goto IL_025f; } return true; IL_025f: return flag2; } } public class Parameters(string prefab, string arg, Vector3 pos) { protected string[]? args; private readonly double time = ZNet.instance.GetTimeSeconds(); public string Replace(string str) { StringBuilder stringBuilder = new StringBuilder(); int num = 0; int num2 = 0; for (int i = 0; i < str.Length; i++) { if (str[i] == '<') { if (num == 0) { stringBuilder.Append(str.Substring(num2, i - num2)); num2 = i; } num++; } if (str[i] == '>') { if (num == 1) { string str2 = str.Substring(num2, i - num2 + 1); stringBuilder.Append(ResolveParameters(str2)); num2 = i + 1; } if (num > 0) { num--; } } } if (num2 < str.Length) { stringBuilder.Append(str.Substring(num2)); } return stringBuilder.ToString(); } private string ResolveParameters(string str) { int num; for (num = 0; num < str.Length; num++) { int num2 = str.IndexOf(">", num); if (num2 == -1) { break; } num = num2; int num3 = str.LastIndexOf("<", num2); if (num3 != -1) { int num4 = num2 - num3 + 1; if (TryReplaceParameter(str.Substring(num3, num4), out string resolved)) { str = str.Remove(num3, num4); str = str.Insert(num3, resolved); num = num3 - 1; } else { num = num2; } } } return str; } private bool TryReplaceParameter(string key, out string? resolved) { resolved = GetParameter(key); if (resolved == null) { resolved = ResolveValue(key); } return resolved != key; } protected virtual string? GetParameter(string key) { return key switch { "<prefab>" => prefab, "<par>" => arg, "<par0>" => GetArg(0), "<par1>" => GetArg(1), "<par2>" => GetArg(2), "<par3>" => GetArg(3), "<par4>" => GetArg(4), "<par5>" => GetArg(5), "<par6>" => GetArg(6), "<par7>" => GetArg(7), "<par8>" => GetArg(8), "<par9>" => GetArg(9), "<time>" => Format(time), "<day>" => EnvMan.instance.GetDay(time).ToString(), "<ticks>" => ((long)(time * 10000000.0)).ToString(), "<x>" => Format(pos.x), "<y>" => Format(pos.y), "<z>" => Format(pos.z), "<snap>" => Format(WorldGenerator.instance.GetHeight(pos.x, pos.z)), _ => null, }; } private string GetArg(int index) { if (args == null) { args = arg.Split(new char[1] { ' ' }); } if (args.Length > index) { return args[index]; } return ""; } protected static string Format(float value) { return value.ToString("0.#####", NumberFormatInfo.InvariantInfo); } protected static string Format(double value) { return value.ToString("0.#####", NumberFormatInfo.InvariantInfo); } private static string ResolveValue(string value) { if (!value.StartsWith("<", StringComparison.OrdinalIgnoreCase)) { return value; } if (!value.EndsWith(">", StringComparison.OrdinalIgnoreCase)) { return value; } if (TryGetValueFromGroup(value.Substring(1, value.Length - 2), out string value2)) { return value2; } return value; } private static bool TryGetValueFromGroup(string group, out string value) { int stableHashCode = StringExtensionMethods.GetStableHashCode(group.ToLowerInvariant()); if (!DataLoading.ValueGroups.ContainsKey(stableHashCode)) { value = group; return false; } int index = Random.Range(0, DataLoading.ValueGroups[stableHashCode].Count); value = ResolveValue(DataLoading.ValueGroups[stableHashCode][index]); return true; } } public class ObjectParameters : Parameters { public ObjectParameters(string prefab, string arg, ZDO zdo) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) <zdo>P = zdo; base..ctor(prefab, arg, <zdo>P.m_position); } protected override string? GetParameter(string key) { string parameter = base.GetParameter(key); if (parameter != null) { return parameter; } parameter = GetGeneralParameter(key); if (parameter != null) { return parameter; } KeyValuePair<string, string> keyValuePair = Parse.Kvp(key, '_'); if (keyValuePair.Value != "") { string key2 = keyValuePair.Key.Substring(1); string value = keyValuePair.Value.Substring(0, keyValuePair.Value.Length - 1); return GetZdoValue(key2, value); } return null; } private string? GetGeneralParameter(string key) { //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) return key switch { "<zdo>" => ((object)Unsafe.As<ZDOID, ZDOID>(ref <zdo>P.m_uid)/*cast due to .constrained prefix*/).ToString(), "<pos>" => Parameters.Format(<zdo>P.m_position.x) + "," + Parameters.Format(<zdo>P.m_position.z) + "," + Parameters.Format(<zdo>P.m_position.y), "<i>" => ZoneSystem.GetZone(<zdo>P.m_position).x.ToString(), "<j>" => ZoneSystem.GetZone(<zdo>P.m_position).y.ToString(), "<a>" => Parameters.Format(<zdo>P.m_rotation.y), "<rot>" => Parameters.Format(<zdo>P.m_rotation.y) + "," + Parameters.Format(<zdo>P.m_rotation.x) + "," + Parameters.Format(<zdo>P.m_rotation.z), "<pid>" => GetPid(<zdo>P), "<pname>" => GetPname(<zdo>P), "<pchar>" => GetPchar(<zdo>P), "<owner>" => <zdo>P.GetOwner().ToString(), _ => null, }; } private static string GetPid(ZDO zdo) { ZNetPeer peer = GetPeer(zdo); if (peer != null) { return peer.m_rpc.GetSocket().GetHostName(); } if (Object.op_Implicit((Object)(object)Player.m_localPlayer)) { return "Server"; } return ""; } private static string GetPname(ZDO zdo) { ZNetPeer peer = GetPeer(zdo); if (peer != null) { return peer.m_playerName; } if (Object.op_Implicit((Object)(object)Player.m_localPlayer)) { return Player.m_localPlayer.GetPlayerName(); } return ""; } private static string GetPchar(ZDO zdo) { ZNetPeer peer = GetPeer(zdo); if (peer != null) { return ((object)Unsafe.As<ZDOID, ZDOID>(ref peer.m_characterID)/*cast due to .constrained prefix*/).ToString(); } if (Object.op_Implicit((Object)(object)Player.m_localPlayer)) { return Player.m_localPlayer.GetPlayerID().ToString(); } return ""; } private static ZNetPeer? GetPeer(ZDO zdo) { if (zdo.GetOwner() == 0L) { return null; } return ZNet.instance.GetPeer(zdo.GetOwner()); } private string GetZdoValue(string key, string value) { //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_02ca: Unknown result type (might be due to invalid IL or missing references) //IL_0267: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Unknown result type (might be due to invalid IL or missing references) //IL_02a4: Unknown result type (might be due to invalid IL or missing references) switch (key) { case "key": return DataHelper.GetGlobalKey(value); case "string": return GetString(value); case "float": return GetFloat(value).ToString(CultureInfo.InvariantCulture); case "int": return GetInt(value).ToString(CultureInfo.InvariantCulture); case "long": return GetLong(value).ToString(CultureInfo.InvariantCulture); case "bool": return GetBool(value) ? "true" : "false"; case "hash": { GameObject prefab = ZNetScene.instance.GetPrefab(<zdo>P.GetInt(value, 0)); return ((prefab != null) ? ((Object)prefab).name : null) ?? ""; } case "vec": return DataEntry.PrintVectorXZY(GetVec3(value)); case "quat": return DataEntry.PrintAngleYXZ(GetQuaternion(value)); case "byte": return Convert.ToBase64String(<zdo>P.GetByteArray(value, (byte[])null)); case "zdo": return ((object)<zdo>P.GetZDOID(value)/*cast due to .constrained prefix*/).ToString(); case "item": return GetAmountOfItems(value).ToString(); case "pos": return DataEntry.PrintVectorXZY(GetPos(value)); default: return ""; } } private string GetString(string value) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) string result = default(string); if (!ZDOExtraData.s_strings.TryGetValue(<zdo>P.m_uid, out var value2) || !value2.TryGetValue(StringExtensionMethods.GetStableHashCode(value), ref result)) { return GetStringField(value); } return result; } private float GetFloat(string value) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) float result = default(float); if (!ZDOExtraData.s_floats.TryGetValue(<zdo>P.m_uid, out var value2) || !value2.TryGetValue(StringExtensionMethods.GetStableHashCode(value), ref result)) { return GetFloatField(value); } return result; } private int GetInt(string value) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) int result = default(int); if (!ZDOExtraData.s_ints.TryGetValue(<zdo>P.m_uid, out var value2) || !value2.TryGetValue(StringExtensionMethods.GetStableHashCode(value), ref result)) { return GetIntField(value); } return result; } private long GetLong(string value) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) long result = default(long); if (!ZDOExtraData.s_longs.TryGetValue(<zdo>P.m_uid, out var value2) || !value2.TryGetValue(StringExtensionMethods.GetStableHashCode(value), ref result)) { return GetLongField(value); } return result; } private bool GetBool(string value) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) int num = default(int); if (!ZDOExtraData.s_ints.TryGetValue(<zdo>P.m_uid, out var value2) || !value2.TryGetValue(StringExtensionMethods.GetStableHashCode(value), ref num)) { return GetBoolField(value); } return num > 0; } private Vector3 GetVec3(string value) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) Vector3 result = default(Vector3); if (!ZDOExtraData.s_vec3.TryGetValue(<zdo>P.m_uid, out var value2) || !value2.TryGetValue(StringExtensionMethods.GetStableHashCode(value), ref result)) { return GetVecField(value); } return result; } private Quaternion GetQuaternion(string value) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) Quaternion result = default(Quaternion); if (!ZDOExtraData.s_quats.TryGetValue(<zdo>P.m_uid, out var value2) || !value2.TryGetValue(StringExtensionMethods.GetStableHashCode(value), ref result)) { return GetQuatField(value); } return result; } private string GetStringField(string value) { if (!(GetField(value) is string result)) { return ""; } return result; } private float GetFloatField(string value) { object field = GetField(value); if (field is float) { return (float)field; } return 0f; } private int GetIntField(string value) { object field = GetField(value); if (field is int) { return (int)field; } return 0; } private bool GetBoolField(string value) { object field = GetField(value); if (field is bool) { return (bool)field; } return false; } private long GetLongField(string value) { object field = GetField(value); if (field is long) { return (long)field; } return 0L; } private Vector3 GetVecField(string value) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) object field = GetField(value); if (field is Vector3) { return (Vector3)field; } return Vector3.zero; } private Quaternion GetQuatField(string value) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) object field = GetField(value); if (field is Quaternion) { return (Quaternion)field; } return Quaternion.identity; } private object? GetField(string value) { KeyValuePair<string, string> keyValuePair = Parse.Kvp(value, '.'); if (keyValuePair.Value == "") { return null; } GameObject prefab = ZNetScene.instance.GetPrefab(<zdo>P.m_prefab); if ((Object)(object)prefab == (Object)null) { return null; } Component component = prefab.GetComponent(keyValuePair.Key); if ((Object)(object)component == (Object)null) { return null; } string[] array = keyValuePair.Value.Split(new char[1] { '.' }); object obj = component; string[] array2 = array; foreach (string name in array2) { FieldInfo field = obj.GetType().GetField(name); if (field == null) { return null; } obj = field.GetValue(obj); if (obj == null) { return null; } } return obj; } private int GetAmountOfItems(string prefab) { int num = 0; foreach (ItemRecord item in ItemDataHelper.Load(<zdo>P)) { if (item.PrefabName == prefab) { num += item.Stack; } } return num; } private Vector3 GetPos(string value) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: 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_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) Vector3 val = Parse.VectorXZY(value); return <zdo>P.GetPosition() + <zdo>P.GetRotation() * val; } } public class PrefabHelper { private static readonly Dictionary<string, List<int>> ResultCache = new Dictionary<string, List<int>>(); private static Dictionary<string, int> PrefabCache = new Dictionary<string, int>(); public static int? GetPrefab(string value) { List<int> prefabs = GetPrefabs(value); if (prefabs.Count == 0) { return null; } if (prefabs.Count == 1) { return prefabs[0]; } return prefabs[Random.Range(0, prefabs.Count)]; } public static void ClearCache() { ResultCache.Clear(); PrefabCache.Clear(); } public static List<int> GetPrefabs(string value) { if (ResultCache.ContainsKey(value)) { return ResultCache[value]; } List<int> prefabs = GetPrefabs(Parse.ToList(value)); if (prefabs == null) { return new List<int>(); } ResultCache[value] = prefabs; return prefabs; } public static List<int>? GetPrefabs(List<string> values) { if (values.Count == 0) { return null; } if (values.Count == 1) { return ParsePrefabs(values[0]); } List<List<int>> list = (from s in values.Select(ParsePrefabs) where s != null select s).ToList(); HashSet<int> hashSet = new HashSet<int>(); foreach (List<int> item in list) { if (item == null) { continue; } foreach (int item2 in item) { hashSet.Add(item2); } } if (hashSet.Count != 0) { HashSet<int> hashSet2 = hashSet; List<int> list2 = new List<int>(hashSet2.Count); list2.AddRange(hashSet2); return list2; } return null; } private static List<int>? ParsePrefabs(string prefab) { string p = prefab.ToLowerInvariant(); if (PrefabCache.Count == 0) { PrefabCache = ZNetScene.instance.m_namedPrefabs.ToDictionary((KeyValuePair<int, GameObject> pair) => ((Object)pair.Value).name, (KeyValuePair<int, GameObject> pair) => pair.Key); } if (p == "*") { Dictionary<string, int>.ValueCollection values = PrefabCache.Values; List<int> list = new List<int>(values.Count); list.AddRange(values); return list; } if (p[0] == '*' && p[p.Length - 1] == '*') { p = p.Substring(1, p.Length - 2); return (from pair in PrefabCache where pair.Key.ToLowerInvariant().Contains(p) select pair.Value).ToList(); } if (p[0] == '*') { p = p.Substring(1); return (from pair in PrefabCache where pair.Key.EndsWith(p, StringComparison.OrdinalIgnoreCase) select pair.Value).ToList(); } if (p[p.Length - 1] == '*') { p = p.Substring(0, p.Length - 1); return (from pair in PrefabCache where pair.Key.StartsWith(p, StringComparison.OrdinalIgnoreCase) select pair.Value).ToList(); } if (PrefabCache.ContainsKey(prefab)) { return new List<int>(1) { PrefabCache[prefab] }; } List<string> valuesFromGroup = DataHelper.GetValuesFromGroup(prefab); if (valuesFromGroup != null) { return valuesFromGroup.Select((string s) => StringExtensionMethods.GetStableHashCode(s)).ToList(); } Log.Warning("Failed to resolve prefab: " + prefab); return null; } } public class ResolvedDataEntry { public Dictionary<int, string>? Strings; public Dictionary<int, float>? Floats; public Dictionary<int, int>? Ints; public Dictionary<int, long>? Longs; public Dictionary<int, Vector3>? Vecs; public Dictionary<int, Quaternion>? Quats; public Dictionary<int, byte[]>? ByteArrays; public ConnectionType ConnectionType; public int ConnectionHash; public ZDOID OriginalId = ZDOID.None; public ZDOID TargetConnectionId = ZDOID.None; public bool? Distant; public bool? Persistent; public ObjectType? Priority; public Vector3? Position; public Quaternion? Rotation; public void Write(ZDO zdo) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0380: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_039e: Unknown result type (might be due to invalid IL or missing references) //IL_03bc: Unknown result type (might be due to invalid IL or missing references) //IL_03c1: Unknown result type (might be due to invalid IL or missing references) //IL_03c5: Unknown result type (might be due to invalid IL or missing references) //IL_03ca: Unknown result type (might be due to invalid IL or missing references) ZDOID uid = zdo.m_uid; Dictionary<int, float>? floats = Floats; if (floats != n