示例#1
0
 public DatDirectory(uint rootSectorOffset, int sectorSize, FileStream stream, DatDatabaseType type)
 {
     this.rootSectorOffset = rootSectorOffset;
     this.sectorSize       = sectorSize;
     DatType = type;
     Read(stream);
 }
示例#2
0
        internal DatDatabase(string filePath, DatDatabaseType type)
        {
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException(filePath);
            }

            this.FilePath = filePath;
            DatType       = type;

            using (FileStream stream = new FileStream(filePath, FileMode.Open))
            {
                byte[] sectorSizeBuffer = new byte[4];
                stream.Seek(0x144u, SeekOrigin.Begin);
                stream.Read(sectorSizeBuffer, 0, sizeof(uint));
                this.SectorSize = BitConverter.ToUInt32(sectorSizeBuffer, 0);

                stream.Seek(0x160u, SeekOrigin.Begin);
                byte[] firstDirBuffer = new byte[4];
                stream.Read(firstDirBuffer, 0, sizeof(uint));
                uint firstDirectoryOffset = BitConverter.ToUInt32(firstDirBuffer, 0);

                RootDirectory = new DatDirectory(firstDirectoryOffset, Convert.ToInt32(this.SectorSize), stream, DatType);
            }

            AllFiles = new Dictionary <uint, DatFile>();
            RootDirectory.AddFilesToList(AllFiles);
        }
示例#3
0
文件: DatFile.cs 项目: zarlant/ACE
        public DatFileType?GetFileType(DatDatabaseType datDatabaseType)
        {
            if (fileType != null)
            {
                return(fileType.Value);
            }

            var type      = typeof(DatFileType);
            var enumTypes = Enum.GetValues(typeof(DatFileType)).Cast <DatFileType>().ToList();

            foreach (var enumType in enumTypes)
            {
                var memInfo = type.GetMember(enumType.ToString());
                var datType = memInfo[0].GetCustomAttributes(typeof(DatDatabaseTypeAttribute), false).Cast <DatDatabaseTypeAttribute>().ToList();

                if (datType?.Count > 0 && datType[0].Type == datDatabaseType)
                {
                    // file type matches, now check id range
                    var idRange = memInfo[0].GetCustomAttributes(typeof(DatFileTypeIdRangeAttribute), false).Cast <DatFileTypeIdRangeAttribute>().ToList();
                    if (idRange?.Count > 0 && idRange[0].BeginRange <= ObjectId && idRange[0].EndRange >= ObjectId)
                    {
                        // id range matches
                        fileType = enumType;
                        break;
                    }
                }
            }

            return(fileType);
        }
示例#4
0
文件: DatFile.cs 项目: maxc0c0s/ACE
        /// <summary>
        /// populates a new CellFile from the specified buffer.
        /// </summary>
        public static DatFile FromBuffer(byte[] buffer, int offset, DatDatabaseType type)
        {
            DatFile cf = new DatFile()
            {
                BitFlags   = BitConverter.ToUInt32(buffer, offset),
                ObjectId   = BitConverter.ToUInt32(buffer, offset + 4),
                FileOffset = BitConverter.ToUInt32(buffer, offset + 8) + 4,
                FileSize   = BitConverter.ToUInt32(buffer, offset + 12),
                Date       = BitConverter.ToUInt32(buffer, offset + 16),
                Iteration  = BitConverter.ToUInt32(buffer, offset + 20),
                DatType    = type
            };

            return(cf);
        }
 public DatDatabaseTypeAttribute(DatDatabaseType type)
 {
     Type = type;
 }
示例#6
0
        /*private DatFileType? fileType;
         *
         * private static List<DatFileType> EnumTypes = Enum.GetValues(typeof(DatFileType)).Cast<DatFileType>().ToList();
         *
         * public DatFileType? GetFileType(DatDatabaseType datDatabaseType)
         * {
         *  if (fileType != null)
         *      return fileType.Value;
         *
         *  var type = typeof(DatFileType);
         *
         *  foreach (var enumType in EnumTypes)
         *  {
         *      var memInfo = type.GetMember(enumType.ToString());
         *      var datType = memInfo[0].GetCustomAttributes(typeof(DatDatabaseTypeAttribute), false).Cast<DatDatabaseTypeAttribute>().ToList();
         *
         *      if (datType?.Count > 0 && datType[0].Type == datDatabaseType)
         *      {
         *          // file type matches, now check id range
         *          var idRange = memInfo[0].GetCustomAttributes(typeof(DatFileTypeIdRangeAttribute), false).Cast<DatFileTypeIdRangeAttribute>().ToList();
         *          if (idRange?.Count > 0 && idRange[0].BeginRange <= ObjectId && idRange[0].EndRange >= ObjectId)
         *          {
         *              // id range matches
         *              fileType = enumType;
         *              break;
         *          }
         *      }
         *  }
         *
         *  return fileType;
         * }*/

        public DatFileType?GetFileType(DatDatabaseType datDatabaseType)
        {
            if (datDatabaseType == DatDatabaseType.Cell)
            {
                if ((ObjectId & 0xFFFF) == 0xFFFF)
                {
                    return(DatFileType.LandBlock);
                }
                else if ((ObjectId & 0xFFFF) == 0xFFFE)
                {
                    return(DatFileType.LandBlockInfo);
                }
                else
                {
                    return(DatFileType.EnvCell);
                }
            }
            switch (ObjectId >> 24)
            {
            case 0x01:
                return(DatFileType.GraphicsObject);

            case 0x02:
                return(DatFileType.Setup);

            case 0x03:
                return(DatFileType.Animation);

            case 0x04:
                return(DatFileType.Palette);

            case 0x05:
                return(DatFileType.SurfaceTexture);

            case 0x06:
                return(DatFileType.Texture);

            case 0x08:
                return(DatFileType.Surface);

            case 0x09:
                return(DatFileType.MotionTable);

            case 0x0A:
                return(DatFileType.Wave);

            case 0x0D:
                return(DatFileType.Environment);

            case 0x0F:
                return(DatFileType.PaletteSet);

            case 0x10:
                return(DatFileType.Clothing);

            case 0x11:
                return(DatFileType.DegradeInfo);

            case 0x12:
                return(DatFileType.Scene);

            case 0x13:
                return(DatFileType.Region);

            case 0x20:
                return(DatFileType.SoundTable);

            case 0x22:
                return(DatFileType.EnumMapper);

            case 0x23:
                return(DatFileType.StringTable);

            case 0x25:
                return(DatFileType.DidMapper);

            case 0x27:
                return(DatFileType.DualDidMapper);

            case 0x30:
                return(DatFileType.CombatTable);

            case 0x32:
                return(DatFileType.ParticleEmitter);

            case 0x33:
                return(DatFileType.PhysicsScript);

            case 0x34:
                return(DatFileType.PhysicsScriptTable);

            case 0x40:
                return(DatFileType.Font);
            }

            if (ObjectId == 0x0E000002)
            {
                return(DatFileType.CharacterGenerator);
            }
            else if (ObjectId == 0x0E000007)
            {
                return(DatFileType.ChatPoseTable);
            }
            else if (ObjectId == 0x0E00000D)
            {
                return(DatFileType.ObjectHierarchy);
            }
            else if (ObjectId == 0xE00001A)
            {
                return(DatFileType.BadData);
            }
            else if (ObjectId == 0x0E00001E)
            {
                return(DatFileType.TabooTable);
            }
            else if (ObjectId == 0x0E00001F)
            {
                return(DatFileType.FileToId);
            }
            else if (ObjectId == 0x0E000020)
            {
                return(DatFileType.NameFilterTable);
            }
            else if (ObjectId == 0x0E020000)
            {
                return(DatFileType.MonitoredProperties);
            }

            Console.WriteLine($"Unknown file type: {ObjectId:X8}");
            return(null);
        }
示例#7
0
文件: DatFile.cs 项目: ziang4891/ACE
        /*private DatFileType? fileType;
         *
         * private static List<DatFileType> EnumTypes = Enum.GetValues(typeof(DatFileType)).Cast<DatFileType>().ToList();
         *
         * public DatFileType? GetFileType(DatDatabaseType datDatabaseType)
         * {
         *  if (fileType != null)
         *      return fileType.Value;
         *
         *  var type = typeof(DatFileType);
         *
         *  foreach (var enumType in EnumTypes)
         *  {
         *      var memInfo = type.GetMember(enumType.ToString());
         *      var datType = memInfo[0].GetCustomAttributes(typeof(DatDatabaseTypeAttribute), false).Cast<DatDatabaseTypeAttribute>().ToList();
         *
         *      if (datType?.Count > 0 && datType[0].Type == datDatabaseType)
         *      {
         *          // file type matches, now check id range
         *          var idRange = memInfo[0].GetCustomAttributes(typeof(DatFileTypeIdRangeAttribute), false).Cast<DatFileTypeIdRangeAttribute>().ToList();
         *          if (idRange?.Count > 0 && idRange[0].BeginRange <= ObjectId && idRange[0].EndRange >= ObjectId)
         *          {
         *              // id range matches
         *              fileType = enumType;
         *              break;
         *          }
         *      }
         *  }
         *
         *  return fileType;
         * }*/

        public DatFileType?GetFileType(DatDatabaseType datDatabaseType)
        {
            if (datDatabaseType == DatDatabaseType.Cell)
            {
                if ((ObjectId & 0xFFFF) == 0xFFFF)
                {
                    return(DatFileType.LandBlock);
                }

                if ((ObjectId & 0xFFFF) == 0xFFFE)
                {
                    return(DatFileType.LandBlockInfo);
                }

                return(DatFileType.EnvCell);
            }

            if (datDatabaseType == DatDatabaseType.Portal)
            {
                switch (ObjectId >> 24)
                {
                case 0x01:
                    return(DatFileType.GraphicsObject);

                case 0x02:
                    return(DatFileType.Setup);

                case 0x03:
                    return(DatFileType.Animation);

                case 0x04:
                    return(DatFileType.Palette);

                case 0x05:
                    return(DatFileType.SurfaceTexture);

                case 0x06:
                    return(DatFileType.Texture);

                case 0x08:
                    return(DatFileType.Surface);

                case 0x09:
                    return(DatFileType.MotionTable);

                case 0x0A:
                    return(DatFileType.Wave);

                case 0x0D:
                    return(DatFileType.Environment);

                case 0x0F:
                    return(DatFileType.PaletteSet);

                case 0x10:
                    return(DatFileType.Clothing);

                case 0x11:
                    return(DatFileType.DegradeInfo);

                case 0x12:
                    return(DatFileType.Scene);

                case 0x13:
                    return(DatFileType.Region);

                case 0x14:
                    return(DatFileType.KeyMap);

                case 0x15:
                    return(DatFileType.RenderTexture);

                case 0x16:
                    return(DatFileType.RenderMaterial);

                case 0x17:
                    return(DatFileType.MaterialModifier);

                case 0x18:
                    return(DatFileType.MaterialInstance);

                case 0x20:
                    return(DatFileType.SoundTable);

                case 0x22:
                    return(DatFileType.EnumMapper);

                case 0x25:
                    return(DatFileType.DidMapper);

                case 0x26:
                    return(DatFileType.ActionMap);

                case 0x27:
                    return(DatFileType.DualDidMapper);

                case 0x30:
                    return(DatFileType.CombatTable);

                case 0x31:
                    return(DatFileType.String);

                case 0x32:
                    return(DatFileType.ParticleEmitter);

                case 0x33:
                    return(DatFileType.PhysicsScript);

                case 0x34:
                    return(DatFileType.PhysicsScriptTable);

                case 0x39:
                    return(DatFileType.MasterProperty);

                case 0x40:
                    return(DatFileType.Font);

                case 0x78:
                    return(DatFileType.DbProperties);
                }

                switch (ObjectId >> 16)
                {
                case 0x0E01:
                    return(DatFileType.QualityFilter);

                case 0x0E02:
                    return(DatFileType.MonitoredProperties);
                }

                if (ObjectId == 0x0E000002)
                {
                    return(DatFileType.CharacterGenerator);
                }
                if (ObjectId == 0x0E000003)
                {
                    return(DatFileType.SecondaryAttributeTable);
                }
                if (ObjectId == 0x0E000004)
                {
                    return(DatFileType.SkillTable);
                }
                if (ObjectId == 0x0E000007)
                {
                    return(DatFileType.ChatPoseTable);
                }
                if (ObjectId == 0x0E00000D)
                {
                    return(DatFileType.ObjectHierarchy);
                }
                if (ObjectId == 0x0E00000E)
                {
                    return(DatFileType.SpellTable);
                }
                if (ObjectId == 0x0E00000F)
                {
                    return(DatFileType.SpellComponentTable);
                }
                if (ObjectId == 0x0E000018)
                {
                    return(DatFileType.XpTable);
                }
                if (ObjectId == 0xE00001A)
                {
                    return(DatFileType.BadData);
                }
                if (ObjectId == 0x0E00001D)
                {
                    return(DatFileType.ContractTable);
                }
                if (ObjectId == 0x0E00001E)
                {
                    return(DatFileType.TabooTable);
                }
                if (ObjectId == 0x0E00001F)
                {
                    return(DatFileType.FileToId);
                }
                if (ObjectId == 0x0E000020)
                {
                    return(DatFileType.NameFilterTable);
                }
            }

            if (datDatabaseType == DatDatabaseType.Language)
            {
                switch (ObjectId >> 24)
                {
                case 0x21:
                    return(DatFileType.UiLayout);

                case 0x23:
                    return(DatFileType.StringTable);

                case 0x41:
                    return(DatFileType.StringState);
                }
            }

            Console.WriteLine($"Unknown file type: {ObjectId:X8}");
            return(null);
        }