Exemplo n.º 1
0
        public void AddFieldReader(Type type)
        {
            IStructuredDataFieldReader reader = (IStructuredDataFieldReader)Activator.CreateInstance(type);

            FieldReaders[type] = reader;
        }
Exemplo n.º 2
0
        /// <summary>Read a specified STU field</summary>
        protected void DeserializeField(teStructuredData assetFile, STUField_Info fieldInfo,
                                        Dictionary <uint, KeyValuePair <FieldInfo, STUFieldAttribute> > fields, STUAttribute stuAttribute)
        {
            if (!fields.TryGetValue(fieldInfo.Hash, out var field))
            {
            #if DEBUG
                string name = stuAttribute.Name ?? $"STU_{stuAttribute.Hash:X8}";
                Debugger.Log(0, "STUInstance", $"Unhandled field: {name}:{fieldInfo.Hash:X8} (size: {fieldInfo.Size})\r\n");
            #endif

                return;
            }

            if (assetFile.Format == teStructuredDataFormat.V1)
            {
                assetFile.DynData = assetFile.Data;
            }

            IStructuredDataFieldReader reader = teStructuredData.Manager.FieldReaders[field.Value.ReaderType];

            if (field.Key.FieldType.IsArray)
            {
                Type elementType = field.Key.FieldType.GetElementType();
                if (elementType == null)
                {
                    return;
                }
                Array array;

                BinaryReader data    = assetFile.Data;
                BinaryReader dynData = assetFile.DynData;

                if (assetFile.Format == teStructuredDataFormat.V2)
                {
                    if (fieldInfo.Size == 0 || reader is InlineInstanceFieldReader)    // inline
                    {
                        int size = data.ReadInt32();
                        if (size == 0)
                        {
                            return;
                        }
                        array = Array.CreateInstance(elementType, size);

                        for (int i = 0; i != size; ++i)
                        {
                            reader.Deserialize_Array(teStructuredData.Manager, assetFile, fieldInfo, array, i);
                        }
                    }
                    else
                    {
                        int offset = data.ReadInt32();
                        if (offset == -1)
                        {
                            return;
                        }
                        dynData.Seek(offset);
                        int size = dynData.ReadInt32();
                        if (size == 0)
                        {
                            return;
                        }
                        array = Array.CreateInstance(elementType, size);
                        uint unknown = dynData.ReadUInt32();
                        dynData.Seek(dynData.ReadInt64()); // Seek to dataoffset

                        for (int i = 0; i != size; ++i)
                        {
                            reader.Deserialize_Array(teStructuredData.Manager, assetFile, fieldInfo, array, i);
                        }
                    }
                }
                else
                {
                    long offset = data.ReadInt32();
                    data.ReadInt32(); // :kyaah:

                    long position = data.Position();
                    if (offset <= 0)
                    {
                        array = null;
                    }
                    else
                    {
                        data.BaseStream.Position = offset + assetFile.StartPos;

                        long count      = data.ReadInt64();
                        long dataOffset = data.ReadInt64();

                        if (count != -1 && dataOffset > 0)
                        {
                            array = Array.CreateInstance(elementType, count);

                            data.BaseStream.Position = dataOffset + assetFile.StartPos;

                            for (int i = 0; i != count; ++i)
                            {
                                reader.Deserialize_Array(teStructuredData.Manager, assetFile, fieldInfo, array, i);
                            }
                        }
                        else
                        {
                            array = null;
                        }
                    }
                    data.BaseStream.Position = position + 8;
                }
                field.Key.SetValue(this, array);
            }
            else
            {
                reader.Deserialize(teStructuredData.Manager, assetFile, fieldInfo, this, field.Key);
            }
        }