public DatDirectory(uint rootSectorOffset, int sectorSize, FileStream stream, DatDatabaseType type) { this.rootSectorOffset = rootSectorOffset; this.sectorSize = sectorSize; DatType = type; Read(stream); }
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); }
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); }
/// <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; }
/*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); }
/*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); }