Reset R/W mode during map file operations in server ChunkManager

This commit is contained in:
mrkubax10 2024-05-17 11:33:11 +02:00
parent d347b1b74f
commit 756c2e98fe
2 changed files with 13 additions and 5 deletions

View File

@ -84,7 +84,6 @@ void ChunkManager::load_map_from_file(const std::string& name) {
m_map_read_only = false;
LOG_INFO("Created new map '%s'", name.c_str());
write_empty_map_header();
get_chunk(math::Vector3i(0)).add_node(1, math::Vector3i(0));
return;
}
}
@ -133,14 +132,13 @@ polygun::world::Chunk& ChunkManager::get_chunk(const math::Vector3i& pos) {
uint32_t dummy;
if(find_chunk_header_offset(pos, dummy)) {
char temp[2];
char temp2[8];
char temp[8];
uint8_t compression_mode;
fread(reinterpret_cast<char*>(&compression_mode), 1, 1, m_map_file);
fread(temp, 2, 1, m_map_file);
const uint16_t data_size = utils::bytes_to_uint16(temp);
fread(temp2, 8, 1, m_map_file);
const uint64_t data_offset = utils::bytes_to_uint64(temp2);
fread(temp, 8, 1, m_map_file);
const uint64_t data_offset = utils::bytes_to_uint64(temp);
load_chunk(pos[0], pos[1], pos[2], compression_mode, data_size, data_offset);
LOG_VERBOSE("Loaded chunk at position %d %d %d (offset in map file: %lu)", pos[0], pos[1], pos[2], data_offset);
return *m_loaded_chunks.back();
@ -241,9 +239,13 @@ void ChunkManager::write_chunk(const world::Chunk& chunk) {
char temp2[8];
uint32_t chunk_index;
if(find_chunk_header_offset(chunk.get_pos(), chunk_index)) {
reset_rw_mode();
uint64_t chunk_header_offset = ftell(m_map_file);
fwrite(reinterpret_cast<const char*>(&compression_mode), 1, 1, m_map_file);
reset_rw_mode();
fread(temp, 2, 1, m_map_file);
const uint16_t prev_data_size = utils::bytes_to_uint16(temp);
@ -344,4 +346,9 @@ void ChunkManager::close_map() {
write_chunk(*chunk);
}
fclose(m_map_file);
}
void ChunkManager::reset_rw_mode() {
// Use dummy fseek to reset file R/W mode
fseek(m_map_file, 0, SEEK_CUR);
}

View File

@ -61,6 +61,7 @@ namespace polygun::server {
void write_empty_map_header();
void write_chunk(const world::Chunk& chunk);
void close_map();
void reset_rw_mode();
};
}