示例#1
0
        private static MetaStructure MakeStructureWithSimpleData()
        {
            var structureWithSimpleTypesInfo = new StructureInfo_GTA5_pc();
            var structureWithSimpleTypes     = new MetaStructure(null, structureWithSimpleTypesInfo);

            structureWithSimpleTypes.Values = new Dictionary <int, IMetaValue>();
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x36C55540), new MetaBoolean(false));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x707975FF), new MetaBoolean(true));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x96142337), new MetaByte_A(-128));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xD4D9059D), new MetaByte_A(-127));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x710D0955), new MetaByte_A(126));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x860ACDD8), new MetaByte_A(127));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xCDFD7789), new MetaByte_B(0));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x7DCCF225), new MetaByte_B(1));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xA0AB9B78), new MetaByte_B(254));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x3A223898), new MetaByte_B(255));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x2F07F270), new MetaInt16_A(-32768));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x83E5053E), new MetaInt16_A(-32767));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x86F3BC1E), new MetaInt16_A(32766));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x2C916F02), new MetaInt16_A(32767));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x1972DD39), new MetaInt16_B(0));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x1433E9A2), new MetaInt16_B(1));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xABF22E97), new MetaInt16_B(65534));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xCAD920FA), new MetaInt16_B(65535));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x96AA9C22), new MetaInt32_A(-2147483648));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xBE498F77), new MetaInt32_A(-2147483647));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xDEA66123), new MetaInt32_A(2147483646));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xA7A347FE), new MetaInt32_A(2147483647));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x5940A2C4), new MetaInt32_B(0));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x7AE8E34B), new MetaInt32_B(1));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x48758F24), new MetaInt32_B(4294967294));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x2DCCF53B), new MetaInt32_B(4294967295));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x7C6BAA24), new MetaFloat(1.2f));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xC81C39E6), new MetaFloat(12.0f));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xC599B2B0), new MetaFloat4_XYZ(1.2f, 3.4f, 5.6f));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xA2B4F045), new MetaFloat4_XYZ(12.0f, 34.0f, 56.0f));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xE0B18333), new MetaFloat4_XYZW(1.2f, 3.4f, 5.6f, 7.8f));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0xA7E3D660), new MetaFloat4_XYZW(12.0f, 34.0f, 56.0f, 78.0f));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x3B8AF0C2), new MetaArrayOfBytes(new byte[] { 0, 1, 254, 255 }));
            var charinfo = new StructureEntryInfo_GTA5_pc();

            charinfo.ReferenceKey = 64;
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x8FF34AB5), new MetaArrayOfChars(charinfo, "A String"));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x17525AB1), new MetaInt32_Hash(unchecked ((int)0xF63A8BC0)));
            structureWithSimpleTypes.Values.Add(unchecked ((int)0x10D59C62), new MetaInt32_Hash(0));
            return(structureWithSimpleTypes);
        }
示例#2
0
 public MetaArrayOfBytes(StructureEntryInfo_GTA5_pc info)
 {
     this.info = info;
 }
 public MetaArrayOfChars(StructureEntryInfo_GTA5_pc inf, string value)
 {
     this.info  = inf;
     this.Value = value;
 }
        private void MetaBuildStructureInfos(MetaInformationXml xmlInfo)
        {
            strList = new ResourceSimpleArray <StructureInfo_GTA5_pc>();
            foreach (var xmlStructureInfo in xmlInfo.Structures)
            {
                var structureInfo = new StructureInfo_GTA5_pc();
                structureInfo.StructureNameHash = xmlStructureInfo.NameHash;
                structureInfo.StructureKey      = xmlStructureInfo.Key;
                structureInfo.Unknown_8h        = xmlStructureInfo.Unknown;
                structureInfo.StructureLength   = xmlStructureInfo.Length;
                structureInfo.Entries           = new ResourceSimpleArray <StructureEntryInfo_GTA5_pc>();
                foreach (var xmlStructureEntryInfo in xmlStructureInfo.Entries)
                {
                    var xmlArrayTypeStack = new Stack <MetaStructureArrayTypeXml>();
                    var xmlArrayType      = xmlStructureEntryInfo.ArrayType;
                    while (xmlArrayType != null)
                    {
                        xmlArrayTypeStack.Push(xmlArrayType);
                        xmlArrayType = xmlArrayType.ArrayType;
                    }

                    while (xmlArrayTypeStack.Count > 0)
                    {
                        xmlArrayType = xmlArrayTypeStack.Pop();
                        var arrayStructureEntryInfo = new StructureEntryInfo_GTA5_pc();
                        arrayStructureEntryInfo.EntryNameHash = 0x100;
                        arrayStructureEntryInfo.DataOffset    = 0;
                        arrayStructureEntryInfo.DataType      = (StructureEntryDataType)xmlArrayType.Type;
                        arrayStructureEntryInfo.Unknown_9h    = 0;
                        if (arrayStructureEntryInfo.DataType == StructureEntryDataType.Array)
                        {
                            arrayStructureEntryInfo.ReferenceTypeIndex = (short)(structureInfo.Entries.Count - 1);
                        }
                        else
                        {
                            arrayStructureEntryInfo.ReferenceTypeIndex = 0;
                        }
                        arrayStructureEntryInfo.ReferenceKey = xmlArrayType.TypeHash;
                        structureInfo.Entries.Add(arrayStructureEntryInfo);
                    }

                    var structureEntryInfo = new StructureEntryInfo_GTA5_pc();
                    structureEntryInfo.EntryNameHash = xmlStructureEntryInfo.NameHash;
                    structureEntryInfo.DataOffset    = xmlStructureEntryInfo.Offset;
                    structureEntryInfo.DataType      = (StructureEntryDataType)xmlStructureEntryInfo.Type;
                    structureEntryInfo.Unknown_9h    = (byte)xmlStructureEntryInfo.Unknown;
                    if (structureEntryInfo.DataType == StructureEntryDataType.Array)
                    {
                        structureEntryInfo.ReferenceTypeIndex = (short)(structureInfo.Entries.Count - 1);
                    }
                    else
                    {
                        structureEntryInfo.ReferenceTypeIndex = 0;
                    }
                    structureEntryInfo.ReferenceKey = xmlStructureEntryInfo.TypeHash;

                    structureInfo.Entries.Add(structureEntryInfo);
                }
                strList.Add(structureInfo);
            }
        }
        public MetaStructure ParseStructure(XmlNode node, MetaStructureXml info)
        {
            MetaStructure resultStructure = null;

            foreach (var x in strList)
            {
                if (x.StructureKey == info.Key)
                {
                    resultStructure = new MetaStructure(null, x);
                }
            }
            resultStructure.Values = new Dictionary <int, IMetaValue>();

            foreach (var xmlEntry in info.Entries)
            {
                XmlNode xmlNode = null;
                foreach (XmlNode x in node.ChildNodes)
                {
                    var hash = GetHashForName(x.Name);
                    if (hash == xmlEntry.NameHash)
                    {
                        xmlNode = x;
                    }
                }

                StructureEntryInfo_GTA5_pc entryInfo = null;
                foreach (var x in resultStructure.info.Entries)
                {
                    if (x.EntryNameHash == xmlEntry.NameHash)
                    {
                        entryInfo = x;
                    }
                }

                var type = (StructureEntryDataType)xmlEntry.Type;
                if (type == StructureEntryDataType.Array)
                {
                    var arrayType = (StructureEntryDataType)xmlEntry.ArrayType.Type;
                    if (arrayType == StructureEntryDataType.StructurePointer)
                    {
                        MetaArray arrayValue = ReadPointerArray(xmlNode);
                        arrayValue.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arrayValue);
                    }
                    if (arrayType == StructureEntryDataType.Structure)
                    {
                        MetaArray arryVal = ReadStructureArray(xmlNode, xmlEntry.ArrayType.TypeHash);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.UnsignedByte)
                    {
                        MetaArray arryVal = ReadByteArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.UnsignedShort)
                    {
                        MetaArray arryVal = ReadShortArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.UnsignedInt)
                    {
                        MetaArray arryVal = ReadIntArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.Float)
                    {
                        MetaArray arryVal = ReadFloatArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.Float_XYZ)
                    {
                        MetaArray arryVal = ReadFloatVectorArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                    if (arrayType == StructureEntryDataType.Hash)
                    {
                        MetaArray arryVal = ReadHashArray(xmlNode);
                        arryVal.info = resultStructure.info.Entries[entryInfo.ReferenceTypeIndex];
                        resultStructure.Values.Add(xmlEntry.NameHash, arryVal);
                    }
                }


                if (type == StructureEntryDataType.Boolean)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadBoolean(xmlNode));
                }
                if (type == StructureEntryDataType.SignedByte)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadSignedByte(xmlNode));
                }
                if (type == StructureEntryDataType.UnsignedByte)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadUnsignedByte(xmlNode));
                }
                if (type == StructureEntryDataType.SignedShort)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadSignedShort(xmlNode));
                }
                if (type == StructureEntryDataType.UnsignedShort)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadUnsignedShort(xmlNode));
                }
                if (type == StructureEntryDataType.SignedInt)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadSignedInt(xmlNode));
                }
                if (type == StructureEntryDataType.UnsignedInt)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadUnsignedInt(xmlNode));
                }
                if (type == StructureEntryDataType.Float)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadFloat(xmlNode));
                }
                if (type == StructureEntryDataType.Float_XYZ)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadFloatXYZ(xmlNode));
                }
                if (type == StructureEntryDataType.Float_XYZW)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadFloatXYZW(xmlNode));
                }
                if (type == StructureEntryDataType.ByteEnum)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadByteEnum(xmlNode, entryInfo.ReferenceKey));
                }
                if (type == StructureEntryDataType.IntEnum)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadIntEnum(xmlNode, entryInfo.ReferenceKey));
                }
                if (type == StructureEntryDataType.ShortFlags)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadShortFlags(xmlNode, entryInfo.ReferenceKey));
                }
                if (type == StructureEntryDataType.IntFlags1)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadIntFlags1(xmlNode, entryInfo.ReferenceKey));
                }
                if (type == StructureEntryDataType.IntFlags2)
                {
                    resultStructure.Values.Add(xmlEntry.NameHash, ReadIntFlags2(xmlNode, entryInfo.ReferenceKey));
                }



                if (type == StructureEntryDataType.ArrayOfBytes)
                {
                    var byteArrayValue = new MetaArrayOfBytes();
                    byteArrayValue.Value = ByteFromString(xmlNode.InnerText);
                    resultStructure.Values.Add(xmlEntry.NameHash, byteArrayValue);
                }
                if (type == StructureEntryDataType.ArrayOfChars)
                {
                    var charArrayValue = new MetaArrayOfChars(entryInfo);
                    charArrayValue.Value = xmlNode.InnerText;
                    resultStructure.Values.Add(xmlEntry.NameHash, charArrayValue);
                }
                if (type == StructureEntryDataType.Hash)
                {
                    var hashValue = new MetaInt32_Hash();
                    if (xmlNode.InnerText.Trim().Length > 0)
                    {
                        hashValue.Value = GetHashForName(xmlNode.InnerText);
                    }
                    resultStructure.Values.Add(xmlEntry.NameHash, hashValue);
                }
                if (type == StructureEntryDataType.CharPointer)
                {
                    var charPointerValue = new MetaCharPointer();
                    charPointerValue.Value = xmlNode.InnerText;
                    if (charPointerValue.Value.Equals(""))
                    {
                        charPointerValue.Value = null;
                    }
                    resultStructure.Values.Add(xmlEntry.NameHash, charPointerValue);
                }
                if (type == StructureEntryDataType.DataBlockPointer)
                {
                    var dataBlockValue = new MetaDataBlockPointer(entryInfo);
                    dataBlockValue.Data = ByteFromString(xmlNode.InnerText);
                    if (dataBlockValue.Data.Length == 0)
                    {
                        dataBlockValue.Data = null;
                    }
                    resultStructure.Values.Add(xmlEntry.NameHash, dataBlockValue);
                }
                if (type == StructureEntryDataType.Structure)
                {
                    var xmlInfo        = FindAndCheckStructure(xmlEntry.TypeHash, xmlNode);
                    var structureValue = ParseStructure(xmlNode, xmlInfo);
                    resultStructure.Values.Add(xmlEntry.NameHash, structureValue);
                }
            }

            return(resultStructure);
        }
 public MetaDataBlockPointer(StructureEntryInfo_GTA5_pc info, byte[] data)
 {
     this.info = info;
     this.Data = data;
 }
 public MetaDataBlockPointer(StructureEntryInfo_GTA5_pc info)
 {
     this.info = info;
 }