Fixes around emerge handling

This commit is contained in:
sfan5 2021-10-23 17:23:30 +02:00
parent 1e26e45530
commit 4ee643f472

@ -633,13 +633,15 @@ MapBlock *EmergeThread::finishGen(v3s16 pos, BlockMakeData *bmdata,
m_server->setAsyncFatalError(e); m_server->setAsyncFatalError(e);
} }
/*
Clear generate notifier events
*/
m_mapgen->gennotify.clearEvents();
EMERGE_DBG_OUT("ended up with: " << analyze_block(block)); EMERGE_DBG_OUT("ended up with: " << analyze_block(block));
/*
Clear mapgen state
*/
assert(!m_mapgen->generating);
m_mapgen->gennotify.clearEvents();
m_mapgen->vm = nullptr;
/* /*
Activate the block Activate the block
*/ */
@ -654,19 +656,19 @@ void *EmergeThread::run()
BEGIN_DEBUG_EXCEPTION_HANDLER BEGIN_DEBUG_EXCEPTION_HANDLER
v3s16 pos; v3s16 pos;
std::map<v3s16, MapBlock *> modified_blocks;
m_map = (ServerMap *)&(m_server->m_env->getMap()); m_map = &m_server->m_env->getServerMap();
m_emerge = m_server->m_emerge; m_emerge = m_server->m_emerge;
m_mapgen = m_emerge->m_mapgens[id]; m_mapgen = m_emerge->m_mapgens[id];
enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info; enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info;
try { try {
while (!stopRequested()) { while (!stopRequested()) {
std::map<v3s16, MapBlock *> modified_blocks;
BlockEmergeData bedata; BlockEmergeData bedata;
BlockMakeData bmdata; BlockMakeData bmdata;
EmergeAction action; EmergeAction action;
MapBlock *block; MapBlock *block = nullptr;
if (!popBlockEmerge(&pos, &bedata)) { if (!popBlockEmerge(&pos, &bedata)) {
m_queue_event.wait(); m_queue_event.wait();
@ -689,6 +691,8 @@ void *EmergeThread::run()
} }
block = finishGen(pos, &bmdata, &modified_blocks); block = finishGen(pos, &bmdata, &modified_blocks);
if (!block)
action = EMERGE_ERRORED;
} }
runCompletionCallbacks(pos, action, bedata.callbacks); runCompletionCallbacks(pos, action, bedata.callbacks);
@ -698,6 +702,7 @@ void *EmergeThread::run()
if (!modified_blocks.empty()) if (!modified_blocks.empty())
m_server->SetBlocksNotSent(modified_blocks); m_server->SetBlocksNotSent(modified_blocks);
modified_blocks.clear();
} }
} catch (VersionMismatchException &e) { } catch (VersionMismatchException &e) {
std::ostringstream err; std::ostringstream err;