public EffectDataResource() { // From http://wpdev.sourceforge.net/docs/guide/node167.html: // There are 2048 blocks, 8 entries per block, 68 bytes per entry. // Thanks to Krrios for figuring out the blocksizes. // Each block has an 4 byte header which is currently unknown. The // entries correspond with the Static ID. You can lookup an entry // for a given static with this formula: // Offset = (id>>3)*548+(id&15)*68+4; // Here is the record format for each entry: // byte[64] Frames // byte Unknown // byte Number of Frames Used // byte Frame Interval // byte Start Interval _animData = new EffectData[Count][]; using (var s = UltimaFileManager.GetFile("animdata.mul")) { var r = new BinaryReader(s); for (var i = 0; i < Count; i++) { var data = new EffectData[8]; var header = r.ReadInt32(); // unknown value. for (var j = 0; j < 8; j++) { data[j] = new EffectData(r); } _animData[i] = data; } } }
static uint[] getTextureData() { var r = new BinaryReader(UltimaFileManager.GetFile("hues.mul")); var currentHue = 0; var currentIndex = 0; var data = new uint[_hueTextureWidth * _hueTextureHeight * 2]; Metrics.ReportDataRead((int)r.BaseStream.Length); currentIndex += 32; while (r.BaseStream.Position < r.BaseStream.Length) { r.ReadInt32(); //Header for (var entry = 0; entry < 8; entry++) { for (var i = 0; i < 32; i++) { const float multiplier = 0xff / 0x1f; var color = r.ReadUInt16(); if (i == 31) { _hues[currentHue] = (ushort)color; } data[currentIndex++] = 0xFF000000 + ( ((uint)(((color >> 10) & 0x1F) * multiplier)) | ((uint)(((color >> 5) & 0x1F) * multiplier) << 8) | ((uint)((color & 0x1F) * multiplier) << 16) ); } r.ReadInt16(); //table start r.ReadInt16(); //table end r.ReadBytes(20); //name currentHue++; } } r.Close(); var webSafeHuesBegin = _hueTextureHeight * 2 - 216; for (var b = 0; b < 6; b++) { for (var g = 0; g < 6; g++) { for (var r_ = 0; r_ < 6; r_++) { data[(webSafeHuesBegin + r_ + g * 6 + b * 36) * 32 + 31] = (uint)( 0xff000000 + b * 0x00330000 + g * 0x00003300 + r_ * 0x00000033); } } } return(data); }
unsafe int LoadLandPatches(TileMatrixData tileMatrix, string landPath, string indexPath) { _landPatchPtrs = new Dictionary <uint, LandPatchData>(); if (ClientVersion.InstallationIsUopFormat) { return(0); } _landPatchStream = UltimaFileManager.GetFile(landPath); if (_landPatchStream == null) { return(0); } using (var fsIndex = UltimaFileManager.GetFile(indexPath)) { var indexReader = new BinaryReader(fsIndex); var count = (int)(indexReader.BaseStream.Length / 4); var ptr = 0U; for (var i = 0U; i < count; ++i) { var blockId = indexReader.ReadUInt32(); var x = blockId / tileMatrix.ChunkHeight; var y = blockId % tileMatrix.ChunkHeight; var key = MakeChunkKey(x, y); ptr += 4; if (_landPatchPtrs.ContainsKey(key)) { var current = _landPatchPtrs[key]; while (current.Next != null) { current = current.Next; } current.Next = new LandPatchData(i, ptr); } else { _landPatchPtrs.Add(key, new LandPatchData(i, ptr)); } ptr += 192; } indexReader.Close(); return(count); } }
unsafe int LoadStaticPatches(TileMatrixData tileMatrix, string dataPath, string indexPath, string lookupPath) { _staticPatchPtrs = new Dictionary <uint, StaticPatchData>(); _staticPatchStream = UltimaFileManager.GetFile(dataPath); if (_staticPatchStream == null) { return(0); } using (var fsIndex = UltimaFileManager.GetFile(indexPath)) using (var fsLookup = UltimaFileManager.GetFile(lookupPath)) { var indexReader = new BinaryReader(fsIndex); var lookupReader = new BinaryReader(fsLookup); var count = (int)(indexReader.BaseStream.Length / 4); for (var i = 0U; i < count; ++i) { var blockID = indexReader.ReadUInt32(); var blockX = blockID / tileMatrix.ChunkHeight; var blockY = blockID % tileMatrix.ChunkHeight; var key = MakeChunkKey(blockX, blockY); var offset = lookupReader.ReadUInt32(); var length = lookupReader.ReadInt32(); lookupReader.ReadInt32(); if (_staticPatchPtrs.ContainsKey(key)) { var current = _staticPatchPtrs[key]; while (current.Next != null) { current = current.Next; } current.Next = new StaticPatchData(i, offset, length); } else { _staticPatchPtrs.Add(key, new StaticPatchData(i, offset, length)); } } indexReader.Close(); lookupReader.Close(); return(count); } }
// Issue 5 - End static TileData() { using (var s = UltimaFileManager.GetFile("tiledata.mul")) { var r = new BinaryReader(s); LandData landData; ItemData itemData; if (s.Length == 3188736) // 7.0.9.0 { LandData = new LandData[0x4000]; for (var i = 0; i < 0x4000; ++i) { landData = new LandData(); if (i == 1 || (i > 0 && (i & 0x1F) == 0)) { r.ReadInt32(); } var flags = (TileFlag)r.ReadInt64(); var textureID = r.ReadInt16(); landData.Name = Encoding.ASCII.GetString(r.ReadBytes(20)); landData.Name = landData.Name.Trim('\0'); //r.BaseStream.Seek(20, SeekOrigin.Current); landData.Flags = flags; landData.TextureID = textureID; LandData[i] = landData; } ItemData = new ItemData[0x10000]; for (var i = 0; i < 0x10000; ++i) { itemData = new ItemData { ItemId = i }; if ((i & 0x1F) == 0) { r.ReadInt32(); } itemData.Flags = (TileFlag)r.ReadInt64(); itemData.Weight = r.ReadByte(); itemData.Quality = r.ReadByte(); itemData.Unknown1 = r.ReadByte(); itemData.Unknown2 = r.ReadByte(); itemData.Unknown3 = r.ReadByte(); itemData.Quantity = r.ReadByte(); itemData.AnimId = r.ReadInt16(); r.BaseStream.Seek(2, SeekOrigin.Current); // hue? itemData.Unknown4 = r.ReadByte(); itemData.Value = r.ReadByte(); itemData.Height = r.ReadByte(); itemData.Name = Encoding.ASCII.GetString(r.ReadBytes(20)); itemData.Name = itemData.Name.Trim('\0'); // r.BaseStream.Seek(20, SeekOrigin.Current); if (i > 1005 && i < 7640) { itemData.IsStairs = !(Array.BinarySearch(_stairsID, i) < 0); } // Issue 5 - End ItemData[i] = itemData; } } else { LandData = new LandData[0x4000]; for (var i = 0; i < 0x4000; ++i) { landData = new LandData(); if ((i & 0x1F) == 0) { r.ReadInt32(); } var flags = (TileFlag)r.ReadInt32(); var textureID = r.ReadInt16(); landData.Name = Encoding.ASCII.GetString(r.ReadBytes(20)); landData.Name = landData.Name.Trim('\0'); //r.BaseStream.Seek(20, SeekOrigin.Current); landData.Flags = flags; landData.TextureID = textureID; LandData[i] = landData; } if (s.Length == 1644544) // 7.0.0.0 { ItemData = new ItemData[0x8000]; for (var i = 0; i < 0x8000; ++i) { itemData = new ItemData { ItemId = i }; if ((i & 0x1F) == 0) { r.ReadInt32(); } itemData.Flags = (TileFlag)r.ReadInt32(); itemData.Weight = r.ReadByte(); itemData.Quality = r.ReadByte(); itemData.Unknown1 = r.ReadByte(); itemData.Unknown2 = r.ReadByte(); itemData.Unknown3 = r.ReadByte(); itemData.Quantity = r.ReadByte(); itemData.AnimId = r.ReadInt16(); r.BaseStream.Seek(2, SeekOrigin.Current); // hue? itemData.Unknown4 = r.ReadByte(); itemData.Value = r.ReadByte(); itemData.Height = r.ReadByte(); itemData.Name = Encoding.ASCII.GetString(r.ReadBytes(20)); itemData.Name = itemData.Name.Trim('\0'); // r.BaseStream.Seek(20, SeekOrigin.Current); if (i > 1005 && i < 7640) { itemData.IsStairs = !(Array.BinarySearch(_stairsID, i) < 0); } // Issue 5 - End ItemData[i] = itemData; } } else { ItemData = new ItemData[0x4000]; for (var i = 0; i < 0x4000; ++i) { itemData = new ItemData { ItemId = i }; if ((i & 0x1F) == 0) { r.ReadInt32(); } itemData.Flags = (TileFlag)r.ReadInt32(); itemData.Weight = r.ReadByte(); itemData.Quality = r.ReadByte(); itemData.Unknown1 = r.ReadByte(); itemData.Unknown2 = r.ReadByte(); itemData.Unknown3 = r.ReadByte(); itemData.Quantity = r.ReadByte(); itemData.AnimId = r.ReadInt16(); r.BaseStream.Seek(2, SeekOrigin.Current); // hue? itemData.Unknown4 = r.ReadByte(); itemData.Value = r.ReadByte(); itemData.Height = r.ReadByte(); itemData.Name = Encoding.ASCII.GetString(r.ReadBytes(20)); itemData.Name = itemData.Name.Trim('\0'); // r.BaseStream.Seek(20, SeekOrigin.Current); if (i > 1005 && i < 7640) { itemData.IsStairs = !(Array.BinarySearch(_stairsID, i) < 0); } // Issue 5 - End ItemData[i] = itemData; } } } Metrics.ReportDataRead((int)r.BaseStream.Position); } }