public byte[] Import(FieldDefinition def, FieldType arrayFieldType, XPathNavigator nav)
 {
     using (var temp = new MemoryStream())
     {
         var items = nav.Select("item");
         temp.WriteValueS32(items.Count);
         while (items.MoveNext() == true)
         {
             temp.WriteBytes(FieldHandling.Import(null, arrayFieldType, FieldType.Invalid, items.Current));
         }
         return(temp.ToArray());
     }
 }
        public FieldDefinition GetFieldDefinition(uint hash, IEnumerable <FileFormats.BinaryObject> chain)
        {
            if (this._FieldLookup.ContainsKey(hash) == true)
            {
                return(this._FieldLookup[hash]);
            }

            var chainArray = chain != null?chain.ToArray() : null;

            foreach (var friend in this.Friends)
            {
                if (string.IsNullOrEmpty(friend.ConditionField) == false)
                {
                    if (chain == null)
                    {
                        throw new NotSupportedException();
                    }

                    byte[] fieldData;
                    var    hasFieldData = GetFieldData(friend.ConditionField, chainArray, out fieldData);
                    if (hasFieldData == false)
                    {
                        continue;
                    }

                    var conditionData = FieldHandling.Import(null, friend.ConditionType, friend.ConditionValue);
                    if (fieldData.SequenceEqual(conditionData) == false)
                    {
                        continue;
                    }
                }

                var def = friend.Class.GetFieldDefinition(hash, chainArray);
                if (def != null)
                {
                    return(def);
                }
            }

            return(null);
        }
Exemple #3
0
        private static void ResolveField(XmlWriter writer, KeyValuePair <uint, byte[]> kv)
        {
            string fieldType  = FieldHandling.GetTypeName(FieldType.BinHex);
            string fieldValue = BitConverter.ToString(kv.Value).Replace("-", "");

            string r_fieldTypeString  = fieldType;
            string r_fieldValueString = fieldValue;

            if (kv.Key == TextHidNameHash)
            {
                FieldType fileNameFieldType  = FieldType.String;
                string    fileNameFieldValue = FieldHandling.Deserialize <string>(fileNameFieldType, kv.Value);

                writer.WriteAttributeString("type", FieldHandling.GetTypeName(fileNameFieldType));
                writer.WriteString(fileNameFieldValue);

                Console.WriteLine($"Resolved name field in file \"{fileNameFieldValue}\"");
            }
            else
            {
                if (TypeGuesser.FieldHandler(kv.Value, out r_fieldTypeString, out r_fieldValueString) == true)
                {
                    if (r_fieldTypeString != FieldHandling.GetTypeName(FieldType.BinHex))
                    {
                        fieldType  = r_fieldTypeString;
                        fieldValue = r_fieldValueString;
                    }

                    writer.WriteAttributeString($"value-{r_fieldTypeString}", fieldValue);
                }

                //writer.WriteAttributeString("type", r_fieldTypeString);
                //writer.WriteString(fieldValue);

                writer.WriteAttributeString("type", FieldHandling.GetTypeName(FieldType.BinHex));
                writer.WriteBinHex(kv.Value, 0, kv.Value.Length);
            }

            //Utility.Log($"Field Value\n\tfrom: {BitConverter.ToString(kv.Value).Replace(" ", "")}\n\tto: {fieldValue}");
        }
        public void Export(FieldDefinition def,
                           FieldType arrayFieldType,
                           byte[] buffer,
                           int offset,
                           int count,
                           XmlWriter writer,
                           out int read)
        {
            if (Helpers.HasLeft(buffer, offset, buffer.Length, 4) == false)
            {
                throw new FormatException("Array32 requires at least 4 bytes");
            }

            var itemCount = BitConverter.ToUInt32(buffer, offset);

            read    = 4;
            offset += 4;
            int remaining = buffer.Length - offset;

            for (uint i = 0; i < itemCount; i++)
            {
                writer.WriteStartElement("item");
                int itemRead;
                FieldHandling.Export(null,
                                     arrayFieldType,
                                     FieldType.Invalid,
                                     buffer,
                                     offset,
                                     remaining,
                                     writer,
                                     out itemRead,
                                     def,
                                     i);
                offset    += itemRead;
                remaining -= itemRead;
                writer.WriteEndElement();
                read += itemRead;
            }
        }
Exemple #5
0
        private static FieldInfo ResolveField(uint key, byte[] value)
        {
            FieldInfo field = new FieldInfo();

            // key
            string keyTypeString = "hash";
            string keyNameString = $"{key:X8}";

            if (StringHasher.CanResolveHash((int)key))
            {
                keyTypeString = "name";
                keyNameString = StringHasher.ResolveHash((int)key);
            }

            // value
            string valueTypeString  = FieldHandling.GetTypeName(FieldType.BinHex);
            string valueValueString = BitConverter.ToString(value).Replace("-", "");

            string r_valueTypeString  = valueTypeString;
            string r_valueValueString = valueValueString;

            if (TypeGuesser.FieldHandler(value, out r_valueTypeString, out r_valueValueString) == true)
            {
                valueTypeString  = r_valueTypeString;
                valueValueString = r_valueValueString;
            }

            // fill structure
            field.key.type = keyTypeString;
            field.key.name = keyNameString;

            field.value.type  = valueTypeString;
            field.value.value = valueValueString;

            return(field);
        }
        private void ReadNode(BinaryObject node,
                              IEnumerable <BinaryObject> parentChain,
                              ClassDefinition objectDef,
                              string basePath,
                              XPathNavigator nav,
                              string currentFileName)
        {
            var chain = parentChain.Concat(new[] { node });

            string className;
            uint   classNameHash;

            LoadNameAndHash(nav, out className, out classNameHash);

            if (objectDef != null &&
                objectDef.ClassFieldHash.HasValue == true)
            {
                var hash = GetClassDefinitionByField(objectDef.ClassFieldName, objectDef.ClassFieldHash, nav);
                if (hash.HasValue == false)
                {
                    throw new InvalidOperationException();
                }

                objectDef = this._InfoManager.GetClassDefinition(hash.Value);
            }

            node.NameHash = classNameHash;

            var fields = nav.Select("field");

            while (fields.MoveNext() == true)
            {
                if (fields.Current == null)
                {
                    throw new InvalidOperationException();
                }

                LoadNameAndHash(fields.Current, out string fieldName, out uint fieldNameHash);

                if (fieldName != null && fieldNameHash == 0x9D8873F8 && currentFileName != null) // crc32(text_hidName)
                {
                    var specifiedName = fields.Current.Value;
                    specifiedName = specifiedName.Replace('"', '_').Replace(':', '_').Replace('*', '_').Replace('?', '_').Replace('<', '_').Replace('>', '_').Replace('|', '_');
                    if (!currentFileName.Equals(specifiedName))
                    {
                        throw new ArgumentException(string.Format("Specified file name \"{0}\" does not match actual file name \"{1}\"", specifiedName, currentFileName), "text_hidName");
                    }
                }

                FieldType fieldType;
                var       fieldTypeName = fields.Current.GetAttribute("type", "");
                if (Enum.TryParse(fieldTypeName, true, out fieldType) == false)
                {
                    throw new InvalidOperationException();
                }

                var arrayFieldType     = FieldType.Invalid;
                var arrayFieldTypeName = fields.Current.GetAttribute("array_type", "");
                if (string.IsNullOrEmpty(arrayFieldTypeName) == false)
                {
                    if (Enum.TryParse(arrayFieldTypeName, true, out arrayFieldType) == false)
                    {
                        throw new InvalidOperationException();
                    }
                }

                var fieldDef = objectDef != null?objectDef.GetFieldDefinition(fieldNameHash, chain) : null;

                var data = FieldHandling.Import(fieldDef, fieldType, arrayFieldType, fields.Current);
                node.Fields.Add(fieldNameHash, data);
            }

            var children = nav.Select("object");

            while (children.MoveNext() == true)
            {
                var child = new BinaryObject();
                LoadChildNode(child, chain, objectDef, basePath, children.Current);
                node.Children.Add(child);
            }
        }
Exemple #7
0
        private void ReadNode(BinaryObject node,
                              IEnumerable <BinaryObject> parentChain,
                              string basePath,
                              XPathNavigator nav,
                              string currentFileName)
        {
            var chain = parentChain.Concat(new[] { node });

            string className;
            uint   classNameHash;

            LoadNameAndHash(nav, out className, out classNameHash);

            //Console.WriteLine($"currentFileName = {currentFileName}");
            //Console.WriteLine($"{classNameHash:X8} = {className}");

            node.NameHash = classNameHash;

            var fields = nav.Select("field");

            while (fields.MoveNext() == true)
            {
                if (fields.Current == null)
                {
                    throw new InvalidOperationException();
                }

                LoadNameAndHash(fields.Current, out string fieldName, out uint fieldNameHash);

                //if (fieldName != null && fieldNameHash == 0x9D8873F8 && currentFileName != null) // crc32(text_hidName)
                if (fieldName != null && fieldNameHash == 0xB9295CC7 && currentFileName != null) // crc32(hidName)
                {
                    //var specifiedName = Utility.HexToString(fields.Current.Value);
                    var specifiedName = fields.Current.Value;
                    specifiedName = specifiedName.Replace('"', '_').Replace(':', '_').Replace('*', '_').Replace('?', '_').Replace('<', '_').Replace('>', '_').Replace('|', '_');

                    if (!currentFileName.Equals(specifiedName))
                    {
                        throw new ArgumentException(string.Format("Specified file name \"{0}\" does not match actual file name \"{1}\"", specifiedName, currentFileName), "text_hidName");
                    }
                }

                FieldType fieldType = new FieldType();

                var fieldTypeName = fields.Current.GetAttribute("type", "");

                //Utility.Log($"Reading field of type {fieldTypeName}");

                if (Enum.TryParse(fieldTypeName, true, out fieldType) == false)
                {
                    throw new InvalidOperationException();
                }

                var arrayFieldType     = FieldType.Invalid;
                var arrayFieldTypeName = fields.Current.GetAttribute("array_type", "");
                if (string.IsNullOrEmpty(arrayFieldTypeName) == false)
                {
                    if (Enum.TryParse(arrayFieldTypeName, true, out arrayFieldType) == false)
                    {
                        throw new InvalidOperationException();
                    }
                }

                var data = FieldHandling.Import(fieldType, arrayFieldType, fields.Current);
                node.Fields.Add(fieldNameHash, data);
            }

            var children = nav.Select("object");

            while (children.MoveNext() == true)
            {
                var child = new BinaryObject();
                LoadChildNode(child, chain, basePath, children.Current);
                node.Children.Add(child);
            }
        }
        private void ReadNode(BinaryObject node,
                              IEnumerable <BinaryObject> parentChain,
                              ClassDefinition objectDef,
                              string basePath,
                              XPathNavigator nav)
        {
            var chain = parentChain.Concat(new[] { node });

            string className;
            uint   classNameHash;

            LoadNameAndHash(nav, out className, out classNameHash);

            if (objectDef != null &&
                objectDef.ClassFieldHash.HasValue == true)
            {
                var hash = GetClassDefinitionByField(objectDef.ClassFieldName, objectDef.ClassFieldHash, nav);
                if (hash.HasValue == false)
                {
                    throw new InvalidOperationException();
                }

                objectDef = this._InfoManager.GetClassDefinition(hash.Value);
            }

            node.NameHash = classNameHash;

            var fields = nav.Select("field");

            while (fields.MoveNext() == true)
            {
                if (fields.Current == null)
                {
                    throw new InvalidOperationException();
                }

                string fieldName;
                uint   fieldNameHash;

                LoadNameAndHash(fields.Current, out fieldName, out fieldNameHash);

                FieldType fieldType;
                var       fieldTypeName = fields.Current.GetAttribute("type", "");
                if (Enum.TryParse(fieldTypeName, true, out fieldType) == false)
                {
                    throw new InvalidOperationException();
                }

                var arrayFieldType     = FieldType.Invalid;
                var arrayFieldTypeName = fields.Current.GetAttribute("array_type", "");
                if (string.IsNullOrEmpty(arrayFieldTypeName) == false)
                {
                    if (Enum.TryParse(arrayFieldTypeName, true, out arrayFieldType) == false)
                    {
                        throw new InvalidOperationException();
                    }
                }

                var fieldDef = objectDef != null?objectDef.GetFieldDefinition(fieldNameHash, chain) : null;

                var data = FieldHandling.Import(fieldDef, fieldType, arrayFieldType, fields.Current);
                node.Fields.Add(fieldNameHash, data);
            }

            var children = nav.Select("object");

            while (children.MoveNext() == true)
            {
                var child = new BinaryObject();
                LoadChildNode(child, chain, objectDef, basePath, children.Current);
                node.Children.Add(child);
            }
        }
        internal const uint TemplateHash             = 0x6E167DD5; // crc32(Template)

        public static void MultiExportEntityLibrary(ObjectFileDefinition objectFileDef,
                                                    string basePath,
                                                    string outputPath,
                                                    InfoManager infoManager,
                                                    BinaryObjectFile bof)
        {
            var settings = new XmlWriterSettings
            {
                Encoding           = Encoding.UTF8,
                Indent             = true,
                CheckCharacters    = false,
                OmitXmlDeclaration = false
            };

            var objectDef = objectFileDef != null ? objectFileDef.Object : null;

            using (var writer = XmlWriter.Create(outputPath, settings))
            {
                writer.WriteStartDocument();

                var root = bof.Root;
                {
                    writer.WriteStartElement("object");
                    writer.WriteAttributeString("name", "EntityLibraries");

                    if (objectFileDef != null &&
                        string.IsNullOrEmpty(objectFileDef.Name) == false)
                    {
                        writer.WriteAttributeString("def", objectFileDef.Name);
                    }

                    var libraryNames = new Dictionary <string, int>();

                    Directory.CreateDirectory(basePath);

                    foreach (var library in root.Children)
                    {
                        var chain = new[] { bof.Root, library };

                        var libraryDef = objectDef != null
                                             ? objectDef.GetObjectDefinition(library.NameHash, null)
                                             : null;

                        var libraryName = FieldHandling.Deserialize <string>(null,
                                                                             FieldType.String,
                                                                             library.Fields[NameHash]);
                        var unsanitizedLibraryName = libraryName;

                        libraryName = libraryName.Replace('/', Path.DirectorySeparatorChar);
                        libraryName = libraryName.Replace('\\', Path.DirectorySeparatorChar);

                        if (libraryNames.ContainsKey(libraryName) == false)
                        {
                            libraryNames.Add(libraryName, 1);
                        }
                        else
                        {
                            libraryName = string.Format("{0} ({1})", libraryName, ++libraryNames[libraryName]);
                        }

                        var libraryPath = Path.Combine(libraryName, "@library.xml");

                        writer.WriteStartElement("object");
                        writer.WriteAttributeString("external", libraryPath);
                        writer.WriteEndElement();

                        libraryPath = Path.Combine(basePath, libraryPath);

                        var itemNames = new Dictionary <string, int>();

                        var libraryParentPath = Path.GetDirectoryName(libraryPath);
                        if (string.IsNullOrEmpty(libraryParentPath) == false)
                        {
                            Directory.CreateDirectory(libraryParentPath);
                        }

                        using (var libraryWriter = XmlWriter.Create(libraryPath, settings))
                        {
                            libraryWriter.WriteStartDocument();
                            libraryWriter.WriteStartElement("object");
                            libraryWriter.WriteAttributeString("name", "EntityLibrary");

                            libraryWriter.WriteStartElement("field");
                            libraryWriter.WriteAttributeString("name", "Name");
                            libraryWriter.WriteAttributeString("type", "String");
                            libraryWriter.WriteString(unsanitizedLibraryName);
                            libraryWriter.WriteEndElement();

                            foreach (var item in library.Children)
                            {
                                var itemDef = libraryDef != null
                                                  ? libraryDef.GetObjectDefinition(item.NameHash, null)
                                                  : null;

                                var itemName = FieldHandling.Deserialize <string>(null,
                                                                                  FieldType.String,
                                                                                  item.Fields[NameHash]);
                                itemName = itemName.Replace('/', Path.DirectorySeparatorChar);
                                itemName = itemName.Replace('\\', Path.DirectorySeparatorChar);

                                if (itemNames.ContainsKey(itemName) == false)
                                {
                                    itemNames.Add(itemName, 1);
                                }
                                else
                                {
                                    itemName = string.Format("{0} ({1})", itemName, ++itemNames[itemName]);
                                }

                                var itemPath = itemName + ".xml";

                                libraryWriter.WriteStartElement("object");
                                libraryWriter.WriteAttributeString("external", itemPath);
                                libraryWriter.WriteEndElement();

                                itemPath = Path.Combine(basePath, libraryName, itemPath);

                                var itemParentPath = Path.GetDirectoryName(itemPath);
                                if (string.IsNullOrEmpty(itemParentPath) == false)
                                {
                                    Directory.CreateDirectory(itemParentPath);
                                }

                                using (var itemWriter = XmlWriter.Create(itemPath, settings))
                                {
                                    itemWriter.WriteStartDocument();
                                    WriteNode(infoManager,
                                              itemWriter,
                                              chain,
                                              item,
                                              itemDef,
                                              null);
                                    itemWriter.WriteEndDocument();
                                }
                            }

                            libraryWriter.WriteEndDocument();
                        }
                    }

                    writer.WriteEndElement();
                }

                writer.WriteEndDocument();
            }
        }
        private static void WriteNode(InfoManager infoManager,
                                      XmlWriter writer,
                                      IEnumerable <BinaryObject> parentChain,
                                      BinaryObject node,
                                      ClassDefinition def,
                                      ObjectFileDefinition objectFileDef)
        {
            var chain = parentChain.Concat(new[] { node });

            var originalDef = def;

            if (def != null &&
                def.ClassFieldHash.HasValue == true)
            {
                if (node.Fields.ContainsKey(def.ClassFieldHash.Value) == true)
                {
                    var hash = FieldHandling.Deserialize <uint>(null,
                                                                FieldType.UInt32,
                                                                node.Fields[def.ClassFieldHash.Value]);
                    def = infoManager.GetClassDefinition(hash);
                }
            }

            writer.WriteStartElement("object");

            if (originalDef != null && originalDef.Name != null && originalDef.Hash == node.NameHash)
            {
                writer.WriteAttributeString("name", originalDef.Name);
            }
            else if (def != null && def.Name != null && def.Hash == node.NameHash)
            {
                writer.WriteAttributeString("name", def.Name);
            }
            else
            {
                writer.WriteAttributeString("hash", node.NameHash.ToString("X8"));
            }

            if (objectFileDef != null &&
                string.IsNullOrEmpty(objectFileDef.Name) == false)
            {
                writer.WriteAttributeString("def", objectFileDef.Name);
            }

            if (node.Fields != null)
            {
                foreach (var kv in node.Fields)
                {
                    writer.WriteStartElement("field");

                    var fieldDef = def != null?def.GetFieldDefinition(kv.Key, chain) : null;

                    if (fieldDef != null && fieldDef.Name != null && fieldDef.Hash == kv.Key)
                    {
                        writer.WriteAttributeString("name", fieldDef.Name);
                    }
                    else
                    {
                        writer.WriteAttributeString("hash", kv.Key.ToString("X8"));
                    }

                    if (fieldDef == null)
                    {
                        writer.WriteAttributeString("type", FieldHandling.GetTypeName(FieldType.BinHex));
                        writer.WriteBinHex(kv.Value, 0, kv.Value.Length);
                    }
                    else
                    {
                        writer.WriteAttributeString("type", FieldHandling.GetTypeName(fieldDef.Type));

                        if (fieldDef.ArrayType != FieldType.Invalid)
                        {
                            writer.WriteAttributeString("array_type", FieldHandling.GetTypeName(fieldDef.ArrayType));
                        }

                        int read;
                        FieldHandling.Export(fieldDef,
                                             fieldDef.Type,
                                             fieldDef.ArrayType,
                                             kv.Value,
                                             0,
                                             kv.Value.Length,
                                             writer,
                                             out read);
                    }

                    writer.WriteEndElement();
                }
            }

            if (def == null || def.DynamicNestedClasses == false)
            {
                foreach (var childNode in node.Children)
                {
                    var childDef = def != null?def.GetObjectDefinition(childNode.NameHash, chain) : null;

                    WriteNode(infoManager, writer, chain, childNode, childDef, null);
                }
            }
            else if (def.DynamicNestedClasses == true)
            {
                foreach (var childNode in node.Children)
                {
                    var childDef = infoManager.GetClassDefinition(childNode.NameHash);
                    WriteNode(infoManager, writer, chain, childNode, childDef, null);
                }
            }

            writer.WriteEndElement();
        }
Exemple #11
0
        internal const uint TemplateHash             = 0x6E167DD5; // crc32(Template)

        public static void MultiExportEntityLibrary(string basePath,
                                                    string outputPath,
                                                    BinaryObjectFile bof)
        {
            var settings = new XmlWriterSettings
            {
                Encoding           = Encoding.UTF8,
                Indent             = true,
                CheckCharacters    = false,
                OmitXmlDeclaration = false
            };

            using (var writer = XmlWriter.Create(outputPath, settings))
            {
                writer.WriteStartDocument();

                var root = bof.Root;
                {
                    writer.WriteStartElement("object");
                    writer.WriteAttributeString("name", "EntityLibraries");

                    // add version attribute to root object
                    string bofVersion = bof.Version.ToString();

                    if (bofVersion != null)
                    {
                        writer.WriteAttributeString("version", bofVersion);
                    }

                    // add header attribute to root object
                    string bofHeader = bof.Header;

                    if (bofHeader.Length > 0)
                    {
                        writer.WriteAttributeString("header", bofHeader);
                    }

                    var libraryNames = new Dictionary <string, int>();

                    Directory.CreateDirectory(basePath);

                    foreach (var library in root.Children)
                    {
                        var chain = new[] { bof.Root, library };

                        var libraryName            = FieldHandling.Deserialize <string>(FieldType.String, library.Fields[NameHash]);
                        var unsanitizedLibraryName = libraryName;

                        libraryName = libraryName.Replace('/', Path.DirectorySeparatorChar);
                        libraryName = libraryName.Replace('\\', Path.DirectorySeparatorChar);
                        libraryName = libraryName.Replace('"', '_').Replace(':', '_').Replace('*', '_').Replace('?', '_').Replace('<', '_').Replace('>', '_').Replace('|', '_');

                        if (libraryNames.ContainsKey(libraryName) == false)
                        {
                            libraryNames.Add(libraryName, 1);
                        }
                        else
                        {
                            libraryName = string.Format("{0} ({1})", libraryName, ++libraryNames[libraryName]);
                        }

                        var libraryPath = Path.Combine(libraryName, "@library.xml");

                        writer.WriteStartElement("object");
                        writer.WriteAttributeString("external", libraryPath);
                        writer.WriteEndElement();

                        libraryPath = Path.Combine(basePath, libraryPath);

                        var itemNames = new Dictionary <string, int>();

                        var libraryParentPath = Path.GetDirectoryName(libraryPath);
                        if (string.IsNullOrEmpty(libraryParentPath) == false)
                        {
                            Directory.CreateDirectory(libraryParentPath);
                        }

                        using (var libraryWriter = XmlWriter.Create(libraryPath, settings))
                        {
                            libraryWriter.WriteStartDocument();
                            libraryWriter.WriteStartElement("object");
                            libraryWriter.WriteAttributeString("name", "EntityLibrary");

                            libraryWriter.WriteStartElement("field");
                            libraryWriter.WriteAttributeString("name", "Name");
                            libraryWriter.WriteAttributeString("type", "String");
                            libraryWriter.WriteString(unsanitizedLibraryName);
                            libraryWriter.WriteEndElement();

                            foreach (var item in library.Children)
                            {
                                var itemName = FieldHandling.Deserialize <string>(FieldType.String, item.Fields[NameHash]);
                                itemName = itemName.Replace('/', Path.DirectorySeparatorChar);
                                itemName = itemName.Replace('\\', Path.DirectorySeparatorChar);
                                itemName = itemName.Replace('"', '_').Replace(':', '_').Replace('*', '_').Replace('?', '_').Replace('<', '_').Replace('>', '_').Replace('|', '_');

                                if (itemNames.ContainsKey(itemName) == false)
                                {
                                    itemNames.Add(itemName, 1);
                                }
                                else
                                {
                                    itemName = string.Format("{0} ({1})", itemName, ++itemNames[itemName]);
                                }

                                var itemPath = itemName + ".xml";

                                libraryWriter.WriteStartElement("object");
                                libraryWriter.WriteAttributeString("external", itemPath);
                                libraryWriter.WriteEndElement();

                                itemPath = Path.Combine(basePath, libraryName, itemPath);

                                var itemParentPath = Path.GetDirectoryName(itemPath);
                                if (string.IsNullOrEmpty(itemParentPath) == false)
                                {
                                    Directory.CreateDirectory(itemParentPath);
                                }

                                using (var itemWriter = XmlWriter.Create(itemPath, settings))
                                {
                                    itemWriter.WriteStartDocument();
                                    WriteNode(itemWriter,
                                              chain,
                                              item);
                                    itemWriter.WriteEndDocument();
                                }
                            }

                            libraryWriter.WriteEndDocument();
                        }
                    }

                    writer.WriteEndElement();
                }

                writer.WriteEndDocument();
            }
        }
Exemple #12
0
        private static bool ValidateField(KeyValuePair <uint, byte[]> kvCurrent, KeyValuePair <uint, byte[]> kvNext, out FieldInfo overrideFieldInfo)
        {
            FieldInfo fieldInfo = new FieldInfo();

            overrideFieldInfo = fieldInfo;

            uint currentKey = kvCurrent.Key;

            byte[] currentValue = kvCurrent.Value;

            //string currentKeyName = StringHasher.ResolveHash((int)currentKey) ?? $"{currentKey:X8}";
            string currentKeyName     = "";
            string currentValueString = BitConverter.ToString(currentValue).Replace("-", "");

            string r_currentKeyName;

            if (StringHasher.TryResolveHash((int)currentKey, out r_currentKeyName))
            {
                currentKeyName = r_currentKeyName;
            }

            if (kvNext.Value != null && kvNext.Value.Length > 0)
            {
                uint   nextKey   = kvNext.Key;
                byte[] nextValue = kvNext.Value;

                //string nextKeyName = StringHasher.ResolveHash((int) nextKey);
                string nextKeyName     = "";
                string nextValueString = BitConverter.ToString(nextValue).Replace("-", "");

                string r_nextKeyName;

                if (StringHasher.TryResolveHash((int)nextKey, out r_nextKeyName))
                {
                    nextKeyName = r_nextKeyName;
                }

                /*
                 * var textPrefix = "text_";
                 * var currentKeyGuessName = $"{textPrefix}{nextKeyName}";
                 * uint currentKeyGuessHash = FileFormats.Hashing.CRC32.Compute(currentKeyGuessName);
                 *
                 * if (currentKeyGuessHash == currentKey)
                 * {
                 *  // current key is text of next key
                 *
                 *  //Console.WriteLine($"{currentKeyGuessHash:X8} == {currentKey:X8}");
                 *
                 *  currentValueString = FieldHandling.Deserialize<string>(FieldType.String, currentValue);
                 * }
                 */

                FieldType r_currentFieldType;
                string    r_currentValueString;

                if (currentKeyName == "text_hidName")
                {
                    currentValueString = FieldHandling.Deserialize <string>(FieldType.String, currentValue);

                    Utility.Log("Exporting " + currentValueString);
                }
                else if (TypeGuesser.TryParse(currentValue, out r_currentFieldType, out r_currentValueString))
                {
                    if (r_currentFieldType == FieldType.String)
                    {
                        currentValueString = r_currentValueString;
                    }
                }

                uint  r_nextValueHash32 = 0;
                ulong r_nextValueHash64 = 0;
                ulong nextValueHash     = 0;

                if (uint.TryParse(nextValueString, NumberStyles.HexNumber, null, out r_nextValueHash32))
                {
                    nextValueHash = r_nextValueHash32;

                    //Console.WriteLine($"Parsing uint: {nextValueHash:X8}");
                }
                else if (ulong.TryParse(nextValueString, NumberStyles.HexNumber, null, out r_nextValueHash64))
                {
                    nextValueHash = r_nextValueHash64;

                    //Console.WriteLine($"Parsing ulong: {nextValueHash:X16}");
                }

                ulong[] hashValues = HashHandler.CollectHashes(currentValueString);

                var hashTypeIterator = 0;

                for (int b = 0; b < hashValues.Length; b++)
                {
                    ulong hash = hashValues[b];

                    //Console.WriteLine($"Iterating hash: {hash:X}");

                    if (hash > 0 && hash == nextValueHash)
                    {
                        hashTypeIterator = b;

                        //Console.WriteLine($"{hash:X} == {nextValueHash:X}");

                        break;
                    }
                }

                ulong resolvedHash = hashValues[hashTypeIterator];

                if (hashTypeIterator > 0 && resolvedHash == nextValueHash)
                {
                    // current value is text of next value
                    //string fieldName = nextKeyName ?? $"{nextValueHash:X8}";

                    if (string.IsNullOrEmpty(nextKeyName))
                    {
                        fieldInfo.key.type = "hash";
                        fieldInfo.key.name = $"{nextKey:X8}";
                    }
                    else
                    {
                        fieldInfo.key.type = "name";
                        fieldInfo.key.name = nextKeyName;
                    }

                    fieldInfo.value.type  = Convert.ToString((HashType)hashTypeIterator);
                    fieldInfo.value.value = currentValueString;

                    Console.WriteLine($"{fieldInfo.key.name} = {currentValueString}");

                    overrideFieldInfo = fieldInfo;

                    //Utility.Log($"{fieldName} = \"{currentValueString}\"");
                    //Utility.Log($"Found text value of field \"{fieldName}\": \"{currentValueString}\"");
                    //Utility.Log($"Element:\n\tcurrent:\n\t\tname: {currentKey:X8} -> {currentKeyName}\n\t\tvalue: {currentValueString} -> {resolvedHash:X8}\n\tnext:\n\t\tname: {nextKeyName} -> {nextKey:X8}\n\t\tvalue: {nextValueString}");

                    return(false);
                }
            }

            return(true);
        }
Exemple #13
0
        public static void MultiExportNomadObjectTemplates(string basePath,
                                                           string outputPath,
                                                           BinaryObjectFile bof)
        {
            var settings = new XmlWriterSettings
            {
                Encoding           = Encoding.UTF8,
                Indent             = true,
                CheckCharacters    = false,
                OmitXmlDeclaration = false
            };

            using (var writer = XmlWriter.Create(outputPath, settings))
            {
                writer.WriteStartDocument();

                var root  = bof.Root;
                var chain = new[] { root };
                {
                    writer.WriteStartElement("object");
                    writer.WriteAttributeString("name", "NomadObjectTemplates");
                    Directory.CreateDirectory(basePath);

                    var itemNames = new Dictionary <string, int>();

                    foreach (var item in root.Children)
                    {
                        var itemName = FieldHandling.Deserialize <string>(FieldType.String, item.Fields[NameHash]);
                        itemName = itemName.Replace('/', Path.DirectorySeparatorChar);
                        itemName = itemName.Replace('\\', Path.DirectorySeparatorChar);
                        itemName = itemName.Replace('"', '_').Replace(':', '_').Replace('*', '_').Replace('?', '_').Replace('<', '_').Replace('>', '_').Replace('|', '_');

                        if (itemNames.ContainsKey(itemName) == false)
                        {
                            itemNames.Add(itemName, 1);
                        }
                        else
                        {
                            itemName = string.Format("{0} ({1})", itemName, ++itemNames[itemName]);
                        }

                        var itemPath = itemName + ".xml";

                        writer.WriteStartElement("object");
                        writer.WriteAttributeString("external", itemPath);
                        writer.WriteEndElement();

                        itemPath = Path.Combine(basePath, itemPath);

                        var itemParentPath = Path.GetDirectoryName(itemPath);
                        if (string.IsNullOrEmpty(itemParentPath) == false)
                        {
                            Directory.CreateDirectory(itemParentPath);
                        }

                        using (var itemWriter = XmlWriter.Create(itemPath, settings))
                        {
                            itemWriter.WriteStartDocument();
                            WriteNode(itemWriter,
                                      chain,
                                      item);
                            itemWriter.WriteEndDocument();
                        }
                    }
                }

                writer.WriteEndDocument();
            }
        }
Exemple #14
0
        public static void MultiExportLibrary(string basePath,
                                              string outputPath,
                                              BinaryObjectFile bof)
        {
            var settings = new XmlWriterSettings
            {
                Encoding           = Encoding.UTF8,
                Indent             = true,
                CheckCharacters    = false,
                OmitXmlDeclaration = false
            };

            using (var writer = XmlWriter.Create(outputPath, settings))
            {
                writer.WriteStartDocument();

                var root = bof.Root;

                var chain = new[] { root };
                {
                    writer.WriteStartElement("object");
                    writer.WriteAttributeString("name", "lib");

                    // add version attribute to root object
                    string bofVersion = bof.Version.ToString();

                    if (bofVersion != null)
                    {
                        writer.WriteAttributeString("version", bofVersion);
                    }

                    // add header attribute to root object
                    string bofHeader = bof.Header;

                    if (bofHeader.Length > 0)
                    {
                        writer.WriteAttributeString("header", bofHeader);

                        /*
                         * var headerBytes = Utility.HexToBytes(bofHeader);
                         * var headerBytesString = BitConverter.ToString(headerBytes).Replace("-", "");
                         *
                         * Console.WriteLine($"Test = {headerBytesString}");
                         */
                    }

                    Directory.CreateDirectory(basePath);

                    var itemNames = new Dictionary <string, int>();

                    foreach (var item in root.Children)
                    {
                        var itemName = FieldHandling.Deserialize <string>(FieldType.String, item.Fields[TextHidNameHash]);
                        itemName = itemName.Replace('/', Path.DirectorySeparatorChar);
                        itemName = itemName.Replace('\\', Path.DirectorySeparatorChar);
                        itemName = itemName.Replace('"', '_').Replace(':', '_').Replace('*', '_').Replace('?', '_').Replace('<', '_').Replace('>', '_').Replace('|', '_');

                        if (!itemNames.ContainsKey(itemName))
                        {
                            itemNames.Add(itemName, 1);
                        }
                        else
                        {
                            itemName = string.Format("{0} ({1})", itemName, ++itemNames[itemName]);
                        }

                        var itemPath = itemName + ".xml";

                        writer.WriteStartElement("object");
                        writer.WriteAttributeString("external", itemPath);
                        writer.WriteEndElement();

                        itemPath = Path.Combine(basePath, itemPath);

                        var itemParentPath = Path.GetDirectoryName(itemPath);
                        if (string.IsNullOrEmpty(itemParentPath) == false)
                        {
                            Directory.CreateDirectory(itemParentPath);
                        }

                        using (var itemWriter = XmlWriter.Create(itemPath, settings))
                        {
                            itemWriter.WriteStartDocument();
                            WriteNode(itemWriter,
                                      chain,
                                      item);
                            itemWriter.WriteEndDocument();
                        }
                    }
                }

                writer.WriteEndDocument();
            }
        }