Merge remote-tracking branch 'planetx/master'
This commit is contained in:
commit
1b1f971752
35
src/WorldStorage/WSSAnvil.cpp
Normal file → Executable file
35
src/WorldStorage/WSSAnvil.cpp
Normal file → Executable file
@ -2923,6 +2923,8 @@ cWSSAnvil::cMCAFile::cMCAFile(const AString & a_FileName, int a_RegionX, int a_R
|
|||||||
|
|
||||||
bool cWSSAnvil::cMCAFile::OpenFile(bool a_IsForReading)
|
bool cWSSAnvil::cMCAFile::OpenFile(bool a_IsForReading)
|
||||||
{
|
{
|
||||||
|
bool writeOutNeeded = false;
|
||||||
|
|
||||||
if (m_File.IsOpen())
|
if (m_File.IsOpen())
|
||||||
{
|
{
|
||||||
// Already open
|
// Already open
|
||||||
@ -2948,12 +2950,26 @@ bool cWSSAnvil::cMCAFile::OpenFile(bool a_IsForReading)
|
|||||||
if (m_File.Read(m_Header, sizeof(m_Header)) != sizeof(m_Header))
|
if (m_File.Read(m_Header, sizeof(m_Header)) != sizeof(m_Header))
|
||||||
{
|
{
|
||||||
// Cannot read the header - perhaps the file has just been created?
|
// Cannot read the header - perhaps the file has just been created?
|
||||||
// Try writing a nullptr header (both chunk offsets and timestamps):
|
// Try writing a nullptr header for chunk offsets:
|
||||||
memset(m_Header, 0, sizeof(m_Header));
|
memset(m_Header, 0, sizeof(m_Header));
|
||||||
|
writeOutNeeded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the TimeStamps:
|
||||||
|
if (m_File.Read(m_TimeStamps, sizeof(m_TimeStamps)) != sizeof(m_TimeStamps))
|
||||||
|
{
|
||||||
|
// Cannot read the time stamps - perhaps the file has just been created?
|
||||||
|
// Try writing a nullptr header for timestamps:
|
||||||
|
memset(m_TimeStamps, 0, sizeof(m_TimeStamps));
|
||||||
|
writeOutNeeded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (writeOutNeeded)
|
||||||
|
{
|
||||||
if (
|
if (
|
||||||
(m_File.Write(m_Header, sizeof(m_Header)) != sizeof(m_Header)) || // Real header - chunk offsets
|
(m_File.Write(m_Header, sizeof(m_Header)) != sizeof(m_Header)) || // Write chunk offsets
|
||||||
(m_File.Write(m_Header, sizeof(m_Header)) != sizeof(m_Header)) // Bogus data for the chunk timestamps
|
(m_File.Write(m_TimeStamps, sizeof(m_TimeStamps)) != sizeof(m_TimeStamps)) // Write chunk timestamps
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LOGWARNING("Cannot process MCA header in file \"%s\", chunks in that file will be lost", m_FileName.c_str());
|
LOGWARNING("Cannot process MCA header in file \"%s\", chunks in that file will be lost", m_FileName.c_str());
|
||||||
m_File.Close();
|
m_File.Close();
|
||||||
@ -3083,7 +3099,13 @@ bool cWSSAnvil::cMCAFile::SetChunkData(const cChunkCoords & a_Chunk, const AStri
|
|||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Store the header info in the table
|
||||||
m_Header[LocalX + 32 * LocalZ] = htonl((ChunkSector << 8) | ChunkSize);
|
m_Header[LocalX + 32 * LocalZ] = htonl((ChunkSector << 8) | ChunkSize);
|
||||||
|
|
||||||
|
// Set the modification time
|
||||||
|
m_TimeStamps[LocalX + 32 * LocalZ] = htonl(time(nullptr));
|
||||||
|
|
||||||
if (m_File.Seek(0) < 0)
|
if (m_File.Seek(0) < 0)
|
||||||
{
|
{
|
||||||
LOGWARNING("Cannot save chunk [%d, %d], seeking in file \"%s\" failed", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());
|
LOGWARNING("Cannot save chunk [%d, %d], seeking in file \"%s\" failed", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());
|
||||||
@ -3094,6 +3116,11 @@ bool cWSSAnvil::cMCAFile::SetChunkData(const cChunkCoords & a_Chunk, const AStri
|
|||||||
LOGWARNING("Cannot save chunk [%d, %d], writing header to file \"%s\" failed", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());
|
LOGWARNING("Cannot save chunk [%d, %d], writing header to file \"%s\" failed", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (m_File.Write(m_TimeStamps, sizeof(m_TimeStamps)) != sizeof(m_TimeStamps))
|
||||||
|
{
|
||||||
|
LOGWARNING("Cannot save chunk [%d, %d], writing timestamps to file \"%s\" failed", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, GetFileName().c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
3
src/WorldStorage/WSSAnvil.h
Normal file → Executable file
3
src/WorldStorage/WSSAnvil.h
Normal file → Executable file
@ -80,7 +80,8 @@ protected:
|
|||||||
// First 1024 entries are chunk locations - the 3 + 1 byte sector-offset and sector-count
|
// First 1024 entries are chunk locations - the 3 + 1 byte sector-offset and sector-count
|
||||||
unsigned m_Header[MCA_MAX_CHUNKS];
|
unsigned m_Header[MCA_MAX_CHUNKS];
|
||||||
|
|
||||||
// Chunk timestamps, following the chunk headers, are unused by MCS
|
// Chunk timestamps, following the chunk headers
|
||||||
|
unsigned m_TimeStamps[MCA_MAX_CHUNKS];
|
||||||
|
|
||||||
/// Finds a free location large enough to hold a_Data. Gets a hint of the chunk coords, places the data there if it fits. Returns the sector number.
|
/// Finds a free location large enough to hold a_Data. Gets a hint of the chunk coords, places the data there if it fits. Returns the sector number.
|
||||||
unsigned FindFreeLocation(int a_LocalX, int a_LocalZ, const AString & a_Data);
|
unsigned FindFreeLocation(int a_LocalX, int a_LocalZ, const AString & a_Data);
|
||||||
|
Loading…
Reference in New Issue
Block a user