public TileMatrix(Map owner, int fileIndex, int mapID, int width, int height) { lock (m_Instances) { for (int i = 0; i < m_Instances.Count; ++i) { TileMatrix tm = m_Instances[i]; if (tm.m_FileIndex == fileIndex) { lock (m_FileShare) { lock (tm.m_FileShare) { tm.m_FileShare.Add(this); m_FileShare.Add(tm); } } } } m_Instances.Add(this); } m_FileIndex = fileIndex; m_Width = width; m_Height = height; m_BlockWidth = width >> 3; m_BlockHeight = height >> 3; m_Owner = owner; if (fileIndex != 0x7F) { string mapPath = Core.FindDataFile("map{0}.mul", fileIndex); if (File.Exists(mapPath)) { m_Map = new FileStream(mapPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } else { mapPath = Core.FindDataFile("map{0}LegacyMUL.uop", fileIndex); if (File.Exists(mapPath)) { m_Map = new FileStream(mapPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); m_MapIndex = new UOPIndex(m_Map); } } string indexPath = Core.FindDataFile("staidx{0}.mul", fileIndex); if (File.Exists(indexPath)) { m_Index = new FileStream(indexPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); m_IndexReader = new BinaryReader(m_Index); } string staticsPath = Core.FindDataFile("statics{0}.mul", fileIndex); if (File.Exists(staticsPath)) { m_Statics = new FileStream(staticsPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } } m_EmptyStaticBlock = new StaticTile[8][][]; for (int i = 0; i < 8; ++i) { m_EmptyStaticBlock[i] = new StaticTile[8][]; for (int j = 0; j < 8; ++j) { m_EmptyStaticBlock[i][j] = new StaticTile[0]; } } m_InvalidLandBlock = new LandTile[196]; m_LandTiles = new LandTile[m_BlockWidth][][]; m_StaticTiles = new StaticTile[m_BlockWidth][][][][]; m_StaticPatches = new int[m_BlockWidth][]; m_LandPatches = new int[m_BlockWidth][]; m_Patch = new TileMatrixPatch(this, mapID); }
public TileMatrix(Map owner, int fileIndex, int mapID, int width, int height) { lock (m_Instances) { for (var i = 0; i < m_Instances.Count; ++i) { var tm = m_Instances[i]; if (tm.m_FileIndex == fileIndex) { lock (m_FileShare) { lock (tm.m_FileShare) { tm.m_FileShare.Add(this); m_FileShare.Add(tm); } } } } m_Instances.Add(this); } m_FileIndex = fileIndex; BlockWidth = width >> 3; BlockHeight = height >> 3; m_Owner = owner; if (fileIndex != 0x7F) { var mapPath = Core.FindDataFile($"map{fileIndex}LegacyMUL.uop", false, true); if (mapPath != null) { m_MapStream = new FileStream(mapPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); m_MapIndex = new UOPIndex(m_MapStream); } else { mapPath = Core.FindDataFile($"map{fileIndex}.mul", false, true); if (mapPath != null) { m_MapStream = new FileStream(mapPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } } var indexPath = Core.FindDataFile($"staidx{fileIndex}.mul", false, true); if (indexPath != null) { IndexStream = new FileStream(indexPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); m_IndexReader = new BinaryReader(IndexStream); } var staticsPath = Core.FindDataFile($"statics{fileIndex}.mul", false, true); if (staticsPath != null) { DataStream = new FileStream(staticsPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } } EmptyStaticBlock = new StaticTile[8][][]; for (var i = 0; i < 8; ++i) { EmptyStaticBlock[i] = new StaticTile[8][]; for (var j = 0; j < 8; ++j) { EmptyStaticBlock[i][j] = Array.Empty <StaticTile>(); } } m_InvalidLandBlock = new LandTile[196]; m_LandTiles = new LandTile[BlockWidth][][]; m_StaticTiles = new StaticTile[BlockWidth][][][][]; m_StaticPatches = new int[BlockWidth][]; m_LandPatches = new int[BlockWidth][]; Patch = new TileMatrixPatch(this, mapID); }