From 83ba8d8384907103db6ea1e2752e77b792d32112 Mon Sep 17 00:00:00 2001 From: notmatthewbeshay <92357869+NotMachow@users.noreply.github.com> Date: Tue, 10 Mar 2026 10:32:58 +1100 Subject: [PATCH] Use a portable seek origin for save files --- Minecraft.Client/MinecraftServer.cpp | 4 +-- .../Platform/Common/XUI/XUI_DebugOverlay.cpp | 2 +- Minecraft.World/IO/Files/ConsoleSaveFile.h | 9 ++++++- .../IO/Files/ConsoleSaveFileInputStream.cpp | 4 +-- .../IO/Files/ConsoleSaveFileOriginal.cpp | 17 +++++++++---- .../IO/Files/ConsoleSaveFileOriginal.h | 2 +- .../IO/Files/ConsoleSaveFileOutputStream.cpp | 4 +-- .../IO/Files/ConsoleSaveFileSplit.cpp | 25 ++++++++++++------- .../IO/Files/ConsoleSaveFileSplit.h | 2 +- .../Level/Storage/DirectoryLevelStorage.cpp | 4 +-- Minecraft.World/Level/Storage/RegionFile.cpp | 22 ++++++++-------- 11 files changed, 58 insertions(+), 37 deletions(-) diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp index a936358be..373bab6c4 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/MinecraftServer.cpp @@ -543,7 +543,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const std::ws ba_gameRules.length = fe->getFileSize(); ba_gameRules.data = new BYTE[ ba_gameRules.length ]; - csf->setFilePointer(fe,0,NULL,FILE_BEGIN); + csf->setFilePointer(fe, 0, SaveFileSeekOrigin::Begin); csf->readFile(fe, ba_gameRules.data, ba_gameRules.length, &numberOfBytesRead); assert(numberOfBytesRead == ba_gameRules.length); @@ -809,7 +809,7 @@ void MinecraftServer::saveGameRules() { ConsoleSaveFile *csf = getLevel(0)->getLevelStorage()->getSaveFile(); FileEntry *fe = csf->createFile(ConsoleSavePath(GAME_RULE_SAVENAME)); - csf->setFilePointer(fe, 0, NULL, FILE_BEGIN); + csf->setFilePointer(fe, 0, SaveFileSeekOrigin::Begin); unsigned int length; csf->writeFile(fe, ba.data, ba.length, &length ); diff --git a/Minecraft.Client/Platform/Common/XUI/XUI_DebugOverlay.cpp b/Minecraft.Client/Platform/Common/XUI/XUI_DebugOverlay.cpp index 68d349529..6764fb23f 100644 --- a/Minecraft.Client/Platform/Common/XUI/XUI_DebugOverlay.cpp +++ b/Minecraft.Client/Platform/Common/XUI/XUI_DebugOverlay.cpp @@ -308,7 +308,7 @@ void CScene_DebugOverlay::SaveLimitedFile(int chunkRadius) FileEntry *origFileEntry = currentSave->createFile( std::wstring( L"level.dat" ) ); byteArray levelData( origFileEntry->getFileSize() ); unsigned int bytesRead; - currentSave->setFilePointer(origFileEntry,0,NULL,FILE_BEGIN); + currentSave->setFilePointer(origFileEntry, 0, SaveFileSeekOrigin::Begin); currentSave->readFile( origFileEntry, levelData.data, // data buffer diff --git a/Minecraft.World/IO/Files/ConsoleSaveFile.h b/Minecraft.World/IO/Files/ConsoleSaveFile.h index f24386aa4..63679bfac 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFile.h +++ b/Minecraft.World/IO/Files/ConsoleSaveFile.h @@ -3,6 +3,13 @@ #include "FileHeader.h" #include "ConsoleSavePath.h" +enum class SaveFileSeekOrigin +{ + Begin, + Current, + End +}; + class ConsoleSaveFile { public: @@ -10,7 +17,7 @@ public: virtual FileEntry *createFile( const ConsoleSavePath &fileName ) = 0; virtual void deleteFile( FileEntry *file ) = 0; - virtual void setFilePointer( FileEntry *file,LONG lDistanceToMove, PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod) = 0; + virtual void setFilePointer( FileEntry *file, unsigned int distanceToMove, SaveFileSeekOrigin seekOrigin ) = 0; virtual bool writeFile( FileEntry *file, const void *lpBuffer, unsigned int nNumberOfBytesToWrite, unsigned int *lpNumberOfBytesWritten) = 0; virtual bool zeroFile(FileEntry *file, unsigned int nNumberOfBytesToWrite, unsigned int *lpNumberOfBytesWritten) = 0; virtual bool readFile( FileEntry *file, void *lpBuffer, unsigned int nNumberOfBytesToRead, unsigned int *lpNumberOfBytesRead ) = 0; diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileInputStream.cpp b/Minecraft.World/IO/Files/ConsoleSaveFileInputStream.cpp index b97622d80..36d34e9a9 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileInputStream.cpp +++ b/Minecraft.World/IO/Files/ConsoleSaveFileInputStream.cpp @@ -9,7 +9,7 @@ ConsoleSaveFileInputStream::ConsoleSaveFileInputStream(ConsoleSaveFile *saveFile m_saveFile = saveFile; m_file = m_saveFile->createFile( file ); - m_saveFile->setFilePointer( m_file, 0, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( m_file, 0, SaveFileSeekOrigin::Begin ); } ConsoleSaveFileInputStream::ConsoleSaveFileInputStream(ConsoleSaveFile *saveFile, FileEntry *file) @@ -17,7 +17,7 @@ ConsoleSaveFileInputStream::ConsoleSaveFileInputStream(ConsoleSaveFile *saveFile m_saveFile = saveFile; m_file = file; - m_saveFile->setFilePointer( m_file, 0, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( m_file, 0, SaveFileSeekOrigin::Begin ); } //Reads a byte of data from this input stream. This method blocks if no input is yet available. diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp b/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp index f0fe0c0df..0f8bcd41f 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp +++ b/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp @@ -299,15 +299,22 @@ void ConsoleSaveFileOriginal::deleteFile( FileEntry *file ) ReleaseSaveAccess(); } -void ConsoleSaveFileOriginal::setFilePointer(FileEntry *file,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod) +void ConsoleSaveFileOriginal::setFilePointer(FileEntry *file, unsigned int distanceToMove, SaveFileSeekOrigin seekOrigin) { LockSaveAccess(); - file->currentFilePointer = file->data.startOffset + lDistanceToMove; - - if( dwMoveMethod == FILE_END) + switch( seekOrigin ) { - file->currentFilePointer += file->getFileSize(); + case SaveFileSeekOrigin::Current: + file->currentFilePointer += distanceToMove; + break; + case SaveFileSeekOrigin::End: + file->currentFilePointer = file->data.startOffset + file->getFileSize() + distanceToMove; + break; + case SaveFileSeekOrigin::Begin: + default: + file->currentFilePointer = file->data.startOffset + distanceToMove; + break; } ReleaseSaveAccess(); diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.h b/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.h index ce2944415..d5af2e124 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.h +++ b/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.h @@ -43,7 +43,7 @@ public: virtual FileEntry *createFile( const ConsoleSavePath &fileName ); virtual void deleteFile( FileEntry *file ); - virtual void setFilePointer(FileEntry *file,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod); + virtual void setFilePointer(FileEntry *file, unsigned int distanceToMove, SaveFileSeekOrigin seekOrigin); virtual bool writeFile( FileEntry *file, const void *lpBuffer, unsigned int nNumberOfBytesToWrite, unsigned int *lpNumberOfBytesWritten ); virtual bool zeroFile(FileEntry *file, unsigned int nNumberOfBytesToWrite, unsigned int *lpNumberOfBytesWritten); virtual bool readFile( FileEntry *file, void *lpBuffer, unsigned int nNumberOfBytesToRead, unsigned int *lpNumberOfBytesRead ); diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.cpp b/Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.cpp index bef7948af..e2e8b68c9 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.cpp +++ b/Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.cpp @@ -19,7 +19,7 @@ ConsoleSaveFileOutputStream::ConsoleSaveFileOutputStream(ConsoleSaveFile *saveFi m_file = m_saveFile->createFile(file); - m_saveFile->setFilePointer( m_file, 0, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( m_file, 0, SaveFileSeekOrigin::Begin ); } ConsoleSaveFileOutputStream::ConsoleSaveFileOutputStream(ConsoleSaveFile *saveFile, FileEntry *file) @@ -28,7 +28,7 @@ ConsoleSaveFileOutputStream::ConsoleSaveFileOutputStream(ConsoleSaveFile *saveFi m_file = file; - m_saveFile->setFilePointer( m_file, 0, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( m_file, 0, SaveFileSeekOrigin::Begin ); } //Writes the specified byte to this file output stream. Implements the write method of OutputStream. diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp b/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp index 375063e1a..762231d6e 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp +++ b/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp @@ -423,7 +423,7 @@ ConsoleSaveFileSplit::ConsoleSaveFileSplit(ConsoleSaveFile *sourceSave, bool alr for(AUTO_VAR(it, sourceFiles->begin()); it != sourceFiles->end(); ++it) { FileEntry *sourceEntry = *it; - sourceSave->setFilePointer(sourceEntry,0,NULL,FILE_BEGIN); + sourceSave->setFilePointer(sourceEntry, 0, SaveFileSeekOrigin::Begin); FileEntry *targetEntry = createFile(ConsoleSavePath(sourceEntry->data.filename)); @@ -687,22 +687,29 @@ void ConsoleSaveFileSplit::deleteFile( FileEntry *file ) ReleaseSaveAccess(); } -void ConsoleSaveFileSplit::setFilePointer(FileEntry *file,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod) +void ConsoleSaveFileSplit::setFilePointer(FileEntry *file, unsigned int distanceToMove, SaveFileSeekOrigin seekOrigin) { LockSaveAccess(); - if( file->isRegionFile() ) + if( seekOrigin == SaveFileSeekOrigin::Current ) { - file->currentFilePointer = lDistanceToMove; + file->currentFilePointer += distanceToMove; } else { - file->currentFilePointer = file->data.startOffset + lDistanceToMove; - } + if( file->isRegionFile() ) + { + file->currentFilePointer = distanceToMove; + } + else + { + file->currentFilePointer = file->data.startOffset + distanceToMove; + } - if( dwMoveMethod == FILE_END) - { - file->currentFilePointer += file->getFileSize(); + if( seekOrigin == SaveFileSeekOrigin::End ) + { + file->currentFilePointer += file->getFileSize(); + } } ReleaseSaveAccess(); diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileSplit.h b/Minecraft.World/IO/Files/ConsoleSaveFileSplit.h index 21149c76f..769678e94 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileSplit.h +++ b/Minecraft.World/IO/Files/ConsoleSaveFileSplit.h @@ -95,7 +95,7 @@ public: virtual FileEntry *createFile( const ConsoleSavePath &fileName ); virtual void deleteFile( FileEntry *file ); - virtual void setFilePointer(FileEntry *file,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod); + virtual void setFilePointer(FileEntry *file, unsigned int distanceToMove, SaveFileSeekOrigin seekOrigin); virtual bool writeFile( FileEntry *file, const void *lpBuffer, unsigned int nNumberOfBytesToWrite, unsigned int *lpNumberOfBytesWritten ); virtual bool zeroFile(FileEntry *file, unsigned int nNumberOfBytesToWrite, unsigned int *lpNumberOfBytesWritten); virtual bool readFile( FileEntry *file, void *lpBuffer, unsigned int nNumberOfBytesToRead, unsigned int *lpNumberOfBytesRead ); diff --git a/Minecraft.World/Level/Storage/DirectoryLevelStorage.cpp b/Minecraft.World/Level/Storage/DirectoryLevelStorage.cpp index 2146216c3..e70c2d49c 100644 --- a/Minecraft.World/Level/Storage/DirectoryLevelStorage.cpp +++ b/Minecraft.World/Level/Storage/DirectoryLevelStorage.cpp @@ -270,7 +270,7 @@ LevelData *DirectoryLevelStorage::prepareLevel() else #endif { - getSaveFile()->setFilePointer(fileEntry,0,NULL, FILE_BEGIN); + getSaveFile()->setFilePointer(fileEntry, 0, SaveFileSeekOrigin::Begin); #ifdef _LARGE_WORLDS byteArray data(fileEntry->getFileSize()); @@ -683,7 +683,7 @@ void DirectoryLevelStorage::saveMapIdLookup() { unsigned int NumberOfBytesWritten; FileEntry *fileEntry = m_saveFile->createFile(file); - m_saveFile->setFilePointer(fileEntry,0,NULL, FILE_BEGIN); + m_saveFile->setFilePointer(fileEntry, 0, SaveFileSeekOrigin::Begin); #ifdef _LARGE_WORLDS ByteArrayOutputStream baos; diff --git a/Minecraft.World/Level/Storage/RegionFile.cpp b/Minecraft.World/Level/Storage/RegionFile.cpp index 10fc067fb..03e59f4bd 100644 --- a/Minecraft.World/Level/Storage/RegionFile.cpp +++ b/Minecraft.World/Level/Storage/RegionFile.cpp @@ -39,7 +39,7 @@ RegionFile::RegionFile(ConsoleSaveFile *saveFile, File *path) */ fileEntry = m_saveFile->createFile( fileName->getName() ); - m_saveFile->setFilePointer( fileEntry, 0, NULL, FILE_END ); + m_saveFile->setFilePointer( fileEntry, 0, SaveFileSeekOrigin::End ); if ( fileEntry->getFileSize() < SECTOR_BYTES) { @@ -91,7 +91,7 @@ RegionFile::RegionFile(ConsoleSaveFile *saveFile, File *path) sectorFree->at(0) = false; // chunk offset table sectorFree->at(1) = false; // for the last modified info - m_saveFile->setFilePointer( fileEntry, 0, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( fileEntry, 0, SaveFileSeekOrigin::Begin ); for (int i = 0; i < SECTOR_INTS; ++i) { unsigned int offset = 0; @@ -139,11 +139,11 @@ void RegionFile::writeAllOffsets() // used for the file ConsoleSaveFile conversi m_saveFile->LockSaveAccess(); unsigned int numberOfBytesWritten = 0; - m_saveFile->setFilePointer( fileEntry, 0, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( fileEntry, 0, SaveFileSeekOrigin::Begin ); m_saveFile->writeFile(fileEntry,offsets, SECTOR_BYTES ,&numberOfBytesWritten); numberOfBytesWritten = 0; - m_saveFile->setFilePointer( fileEntry, SECTOR_BYTES, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( fileEntry, SECTOR_BYTES, SaveFileSeekOrigin::Begin ); m_saveFile->writeFile(fileEntry, chunkTimestamps, SECTOR_BYTES, &numberOfBytesWritten); m_saveFile->ReleaseSaveAccess(); @@ -199,7 +199,7 @@ DataInputStream *RegionFile::getChunkDataInputStream(int x, int z) // TODO - was m_saveFile->LockSaveAccess(); //SetFilePointer(file,sectorNumber * SECTOR_BYTES,0,FILE_BEGIN); - m_saveFile->setFilePointer( fileEntry, sectorNumber * SECTOR_BYTES, NULL, FILE_BEGIN); + m_saveFile->setFilePointer( fileEntry, sectorNumber * SECTOR_BYTES, SaveFileSeekOrigin::Begin); unsigned int length; unsigned int decompLength; @@ -373,7 +373,7 @@ void RegionFile::write(int x, int z, uint8_t *data, int length) // TODO - was s */ // debug("SAVE", x, z, length, "grow"); //SetFilePointer(file,0,0,FILE_END); - m_saveFile->setFilePointer( fileEntry, 0, NULL, FILE_END ); + m_saveFile->setFilePointer( fileEntry, 0, SaveFileSeekOrigin::End ); sectorNumber = (int)sectorFree->size(); #ifndef _CONTENT_PACAKGE @@ -407,7 +407,7 @@ void RegionFile::write(int sectorNumber, uint8_t *data, int length, unsigned int { unsigned int numberOfBytesWritten = 0; //SetFilePointer(file,sectorNumber * SECTOR_BYTES,0,FILE_BEGIN); - m_saveFile->setFilePointer( fileEntry, sectorNumber * SECTOR_BYTES, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( fileEntry, sectorNumber * SECTOR_BYTES, SaveFileSeekOrigin::Begin ); // 4J - this differs a bit from the java file format. Java has length stored as an int, then a type as a byte, then length-1 bytes of data // We store length and decompression length as ints, then length bytes of xbox LZX compressed data @@ -426,7 +426,7 @@ void RegionFile::zero(int sectorNumber, int length) { unsigned int numberOfBytesWritten = 0; //SetFilePointer(file,sectorNumber * SECTOR_BYTES,0,FILE_BEGIN); - m_saveFile->setFilePointer( fileEntry, sectorNumber * SECTOR_BYTES, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( fileEntry, sectorNumber * SECTOR_BYTES, SaveFileSeekOrigin::Begin ); m_saveFile->zeroFile( fileEntry, length, &numberOfBytesWritten ); } @@ -449,7 +449,7 @@ bool RegionFile::hasChunk(int x, int z) // 4J added - write the initial two sectors that used to be written in the ctor when the file was empty void RegionFile::insertInitialSectors() { - m_saveFile->setFilePointer( fileEntry, 0, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( fileEntry, 0, SaveFileSeekOrigin::Begin ); unsigned int numberOfBytesWritten = 0; uint8_t zeroBytes[ SECTOR_BYTES ]; ZeroMemory(zeroBytes, SECTOR_BYTES); @@ -472,7 +472,7 @@ void RegionFile::setOffset(int x, int z, int offset) unsigned int numberOfBytesWritten = 0; offsets[x + z * 32] = offset; - m_saveFile->setFilePointer( fileEntry, (x + z * 32) * 4, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( fileEntry, (x + z * 32) * 4, SaveFileSeekOrigin::Begin ); m_saveFile->writeFile(fileEntry,&offset,4,&numberOfBytesWritten); } @@ -486,7 +486,7 @@ void RegionFile::setTimestamp(int x, int z, int value) unsigned int numberOfBytesWritten = 0; chunkTimestamps[x + z * 32] = value; - m_saveFile->setFilePointer( fileEntry, SECTOR_BYTES + (x + z * 32) * 4, NULL, FILE_BEGIN ); + m_saveFile->setFilePointer( fileEntry, SECTOR_BYTES + (x + z * 32) * 4, SaveFileSeekOrigin::Begin ); m_saveFile->writeFile(fileEntry,&value,4,&numberOfBytesWritten); }