void CGrayStaticsBlock::LoadStatics( DWORD ulBlockIndex, int map ) { ADDTOCALLSTACK("CGrayStaticsBlock::LoadStatics"); // long ulBlockIndex = (bx*(UO_SIZE_Y/UO_BLOCK_SIZE) + by); // NOTE: What is index.m_wVal3 and index.m_wVal4 in VERFILE_STAIDX ? ASSERT( m_iStatics <= 0 ); CUOIndexRec index; if ( g_Install.ReadMulIndex(g_Install.m_Staidx[g_MapList.m_mapnum[map]], ulBlockIndex, index) ) { // make sure that the statics block length is valid if ((index.GetBlockLength() % sizeof(CUOStaticItemRec)) != 0) { TCHAR *pszTemp = Str_GetTemp(); sprintf(pszTemp, "CGrapMapBlock: Read Statics - Block Length of %lu", index.GetBlockLength()); throw CGrayError(LOGL_CRIT, CGFile::GetLastError(), pszTemp); } m_iStatics = index.GetBlockLength()/sizeof(CUOStaticItemRec); ASSERT(m_iStatics); m_pStatics = new CUOStaticItemRec[m_iStatics]; ASSERT(m_pStatics); if ( ! g_Install.ReadMulData(g_Install.m_Statics[g_MapList.m_mapnum[map]], index, m_pStatics) ) { throw CGrayError(LOGL_CRIT, CGFile::GetLastError(), "CGrayMapBlock: Read Statics"); } } }
CSphereTerrainInfo::CSphereTerrainInfo( TERRAIN_TYPE id ) { ASSERT( id < TERRAIN_QTY ); VERFILE_TYPE filedata; size_t offset; CUOIndexRec Index; VERFILE_FORMAT format; if ( g_VerData.FindVerDataBlock( VERFILE_TILEDATA, id/UOTILE_BLOCK_QTY, Index )) { filedata = VERFILE_VERDATA; format = VERFORMAT_ORIGINAL; offset = Index.GetFileOffset() + 4 + (sizeof(CUOTerrainTypeRec)*(id%UOTILE_BLOCK_QTY)); ASSERT( Index.GetBlockLength() >= sizeof( CUOTerrainTypeRec )); } else { filedata = VERFILE_TILEDATA; format = g_Install.GetMulFormat(filedata); switch (format) { case VERFORMAT_HIGHSEAS: // high seas format (CUOTerrainTypeRec_HS) offset = (id == 0? 0 : 4) + (( id / UOTILE_BLOCK_QTY ) * 4 ) + ( id * sizeof( CUOTerrainTypeRec_HS )); break; case VERFORMAT_ORIGINAL: // original format (CUOTerrainTypeRec) default: offset = 4 + (( id / UOTILE_BLOCK_QTY ) * 4 ) + ( id * sizeof( CUOTerrainTypeRec )); break; } } if ( g_Install.m_File[filedata].Seek( offset, SEEK_SET ) != offset ) { throw CSError(LOGL_CRIT, CSFile::GetLastError(), "CTileTerrainType.ReadInfo: TileData Seek"); } switch (format) { case VERFORMAT_HIGHSEAS: // high seas format (CUOTerrainTypeRec_HS) if ( g_Install.m_File[filedata].Read(static_cast <CUOTerrainTypeRec_HS *>(this), sizeof(CUOTerrainTypeRec_HS)) <= 0 ) throw CSError(LOGL_CRIT, CSFile::GetLastError(), "CTileTerrainType.ReadInfo: TileData Read"); break; case VERFORMAT_ORIGINAL: // old format (CUOTerrainTypeRec) default: { CUOTerrainTypeRec record; if ( g_Install.m_File[filedata].Read(static_cast <CUOTerrainTypeRec *>(&record), sizeof(CUOTerrainTypeRec)) <= 0 ) throw CSError(LOGL_CRIT, CSFile::GetLastError(), "CTileTerrainType.ReadInfo: TileData Read"); m_flags = record.m_flags; m_unknown = 0; m_index = record.m_index; strcpylen(m_name, record.m_name, CountOf(m_name)); break; } } }
bool CGrayInstall::ReadMulData(CGFile &file, const CUOIndexRec &Index, void * pData) { if ( file.Seek(Index.GetFileOffset(), SEEK_SET) != Index.GetFileOffset() ) return false; DWORD dwLength = Index.GetBlockLength(); if ( file.Read(pData, dwLength) != dwLength ) return false; return true; }
void CMapDiffCollection::LoadMapDiffs() { // Load mapdif* and stadif* Files ADDTOCALLSTACK("CMapDiffCollection::LoadMapDiffs"); if ( m_bLoaded ) // already loaded return; DWORD dwLength = 0, dwBlockId = 0; DWORD dwOffset = 0, dwRead = 0; CMapDiffBlock * pMapDiffBlock = NULL; for ( int m = 0; m < 256; ++m ) { if ( !g_MapList.IsMapSupported( m ) ) continue; int map = g_MapList.m_mapid[m]; // Load Mapdif Files { CGFile * pFileMapdif = &(g_Install.m_Mapdif[map]); CGFile * pFileMapdifl = &(g_Install.m_Mapdifl[map]); // Check that the relevant dif files are available if ( pFileMapdif->IsFileOpen() && pFileMapdifl->IsFileOpen() ) { // Make sure that we're at the beginning of the files pFileMapdif->SeekToBegin(); pFileMapdifl->SeekToBegin(); dwLength = pFileMapdifl->GetLength(); dwRead = dwOffset = 0; for ( ; dwRead < dwLength; dwOffset += sizeof(CUOMapBlock) ) { dwRead += pFileMapdifl->Read( &dwBlockId, sizeof(dwBlockId) ); pMapDiffBlock = GetNewBlock( dwBlockId, map ); if ( pMapDiffBlock->m_pTerrainBlock ) delete pMapDiffBlock->m_pTerrainBlock; CUOMapBlock * pTerrain = new CUOMapBlock(); if ( pFileMapdif->Seek( dwOffset ) != dwOffset ) { g_Log.EventError("Reading mapdif%d.mul FAILED.\n", map); delete pTerrain; break; } else if ( pFileMapdif->Read( pTerrain, sizeof(CUOMapBlock) ) != sizeof(CUOMapBlock) ) { g_Log.EventError("Reading mapdif%d.mul FAILED. [index=%lu offset=%lu]\n", map, dwBlockId, dwOffset); delete pTerrain; break; } pMapDiffBlock->m_pTerrainBlock = pTerrain; } } } // Mapdif // Load Stadif Files { CGFile * pFileStadif = &(g_Install.m_Stadif[map]); CGFile * pFileStadifl = &(g_Install.m_Stadifl[map]); CGFile * pFileStadifi = &(g_Install.m_Stadifi[map]); // Check that the relevant dif files are available if ( !pFileStadif->IsFileOpen() || !pFileStadifl->IsFileOpen() || !pFileStadifi->IsFileOpen() ) continue; // Make sure that we're at the beginning of the files pFileStadif->SeekToBegin(); pFileStadifl->SeekToBegin(); pFileStadifi->SeekToBegin(); dwLength = pFileStadifl->GetLength(); dwRead = dwOffset = 0; for ( ; dwRead < dwLength; dwOffset += sizeof(CUOIndexRec) ) { dwRead += pFileStadifl->Read( &dwBlockId, sizeof(dwBlockId) ); pMapDiffBlock = GetNewBlock( dwBlockId, map ); if ( pMapDiffBlock->m_pStaticsBlock ) delete[] pMapDiffBlock->m_pStaticsBlock; pMapDiffBlock->m_iStaticsCount = 0; pMapDiffBlock->m_pStaticsBlock = NULL; if ( pFileStadifi->Seek( dwOffset ) != dwOffset ) { g_Log.EventError("Reading stadifi%d.mul FAILED.\n", map); break; } CUOIndexRec index; if ( pFileStadifi->Read( &index, sizeof(CUOIndexRec)) != sizeof(CUOIndexRec) ) { g_Log.EventError("Reading stadifi%d.mul FAILED. [index=%lu offset=%lu]\n", map, dwBlockId, dwOffset); break; } else if ( !index.HasData() ) // This happens if the block has been intentionally patched to remove statics { continue; } else if ((index.GetBlockLength() % sizeof(CUOStaticItemRec)) != 0) // Make sure that the statics block length is valid { g_Log.EventError("Reading stadifi%d.mul FAILED. [index=%lu offset=%lu length=%lu]\n", map, dwBlockId, dwOffset, index.GetBlockLength()); break; } pMapDiffBlock->m_iStaticsCount = index.GetBlockLength()/sizeof(CUOStaticItemRec); pMapDiffBlock->m_pStaticsBlock = new CUOStaticItemRec[pMapDiffBlock->m_iStaticsCount]; if ( !g_Install.ReadMulData(*pFileStadif, index, pMapDiffBlock->m_pStaticsBlock) ) { // This shouldn't happen, if this fails then the block will // be left with no statics pMapDiffBlock->m_iStaticsCount = 0; delete[] pMapDiffBlock->m_pStaticsBlock; pMapDiffBlock->m_pStaticsBlock = NULL; g_Log.EventError("Reading stadif%d.mul FAILED. [index=%lu offset=%lu]\n", map, dwBlockId, dwOffset); break; } } } // Stadif } m_bLoaded = true; }