aboutsummaryrefslogtreecommitdiff
path: root/src/mapgen
Commit message (Expand)AuthorAge
* Valleys mapgen code rewrite (#8101)Paramat2019-03-14
* blitToVManip: Check out-of-bounds using node position not index (#8127)Paramat2019-01-25
* Fix warnings about dungeongen.cpp memcpy() and unused variable in MapBlock::d...Paramat2019-01-22
* Fix Mapgen Valleys getSpawnLevelAtPoint() (#7756)Treer2018-10-03
* Fix various code issues found by cppcheck (#7741)Paramat2018-09-23
* Change mapgen order to ores > dungeons > decorations (#7656)Paramat2018-08-20
* Mgv5: Change tunnel parameters to those of other mapgens (#7641)Paramat2018-08-16
* Fix build on gcc 5.0 (#7586)zeuner2018-07-26
* Mgvalleys: Make river depth variation and humidity drop optional (#7532)Paramat2018-07-18
* Cavegen: Fix errors when getting biome outside mapchunk (#7480)Paramat2018-06-26
* Decoration API: Add lightweight ability to have complete coverage (#7456)Paramat2018-06-24
* Biome API: Fix absent water decorations and dust, in deep water (#7470)Paramat2018-06-21
* Biome dust: Revert fix that added dust to mod structures (#7464)Paramat2018-06-19
* Mapgen flags: Add 'biomes' global mapgen flag (#7355)Paramat2018-06-08
* Biome dust placement: Improve comments, re-order some linesParamat2018-06-04
* Biomemap: Simplify code of recent commit (#7398)Paramat2018-06-02
* Biomemap: Avoid empty biomemap entry to fix failing biome dust (#7393)Paramat2018-06-02
* Mgv7: Avoid rivergen removing mod-placed nodes when overgenerating (#7388)Paramat2018-05-31
* Vein ore: Fix bug caused by changing perlinmap Y size (#7371)Paramat2018-05-24
* Schematic decorations: Fix placement bug when centred and rotated (#7365)Paramat2018-05-24
* Dungeons: Fix duplication of y limit parameters (#7359)Paramat2018-05-20
* Vertical biome blend: Tune PRNG seed for finer detail (#7329)Paramat2018-05-14
* Mgv7: Code cleanup (#7299)Paramat2018-05-07
* Cavegen: Allow small RandomWalk caves to generate beyond mapchunk borderParamat2018-05-04
* Mapgen caves: Re-order generation to fix cavern bugParamat2018-04-29
* Biome-defined cave liquids: Use faster biome calculationparamat2018-04-26
* Biome-defined dungeon nodes: Use faster biome calculationparamat2018-04-26
* Dungeons: Mostly fix missing stair nodesParamat2018-04-25
* Mgvalleys: Code cleanupParamat2018-04-24
* Mgvalleys: Use shared tunnel / cavern code instead of internalParamat2018-04-21
* Cave liquids: Use a more precise point for calculating biomeParamat2018-04-21
* Node resolver: Make error on fallback optional, disable for mapgen aliasesParamat2018-04-20
* Cavegen: Fix variable typo that broke mgvalleys large cave distribution (#7249)Paramat2018-04-17
* Biome API / dungeons: Add biome-defined dungeon nodesParamat2018-04-07
* Mgcarpathian: Fix spawn level calculation (#7212)Paramat2018-04-06
* Mgcarpathian: Remove insignificant 'base' noise variation (#7209)Paramat2018-04-05
* Biome API / cavegen: Add definable cave liquid for a biome (#7192)Paramat2018-04-05
* Fix various clang-tidy reported performance-type-promotion-in-math-fnLoïc Blot2018-04-03
* Fix many issues reported by clang-tidy (#7189)Loïc Blot2018-04-02
* Mgcarpathian: Mapgen loop optimisations. fabs() -> std::fabs()Paramat2018-03-29
* Mapgen: Remove unused mgv7 code and some unused biometypesParamat2018-03-26
* Biomes: Fix vertical biome blendparamat2018-03-16
* Biome API: Add 'get_biome_name(biome_id)' APIparamat2018-03-11
* VoxelArea: add_{x,y,z,p} must be staticLoic Blot2018-03-09
* Biomes: Add 'min_pos'/'max_pos' xyz biome limitsparamat2018-03-09
* Generate Notifier: Clear events once after all 'on generated' functionsparamat2018-03-03
* MapgenValleys: Fixed submarine valleys shapeGael-de-Sailly2018-03-03
* Place schematic (on vmanip): Enable use of 'place center' flagsparamat2018-02-27
* SAO limits: Allow SAOs to exist outside the set 'mapgen limit'paramat2018-02-26
* Vertical biome blend: Tune blend patternsparamat2018-02-20
kwc">AsyncEngine::initialize(unsigned int numEngines) { initDone = true; for (unsigned int i = 0; i < numEngines; i++) { AsyncWorkerThread *toAdd = new AsyncWorkerThread(this, std::string("AsyncWorker-") + itos(i)); workerThreads.push_back(toAdd); toAdd->start(); } } /******************************************************************************/ u32 AsyncEngine::queueAsyncJob(std::string &&func, std::string &&params, const std::string &mod_origin) { jobQueueMutex.lock(); u32 jobId = jobIdCounter++; jobQueue.emplace_back(); auto &to_add = jobQueue.back(); to_add.id = jobId; to_add.function = std::move(func); to_add.params = std::move(params); to_add.mod_origin = mod_origin; jobQueueCounter.post(); jobQueueMutex.unlock(); return jobId; } /******************************************************************************/ bool AsyncEngine::getJob(LuaJobInfo *job) { jobQueueCounter.wait(); jobQueueMutex.lock(); bool retval = false; if (!jobQueue.empty()) { *job = std::move(jobQueue.front()); jobQueue.pop_front(); retval = true; } jobQueueMutex.unlock(); return retval; } /******************************************************************************/ void AsyncEngine::putJobResult(LuaJobInfo &&result) { resultQueueMutex.lock(); resultQueue.emplace_back(std::move(result)); resultQueueMutex.unlock(); } /******************************************************************************/ void AsyncEngine::step(lua_State *L) { int error_handler = PUSH_ERROR_HANDLER(L); lua_getglobal(L, "core"); ScriptApiBase *script = ModApiBase::getScriptApiBase(L); MutexAutoLock autolock(resultQueueMutex); while (!resultQueue.empty()) { LuaJobInfo j = std::move(resultQueue.front()); resultQueue.pop_front(); lua_getfield(L, -1, "async_event_handler"); if (lua_isnil(L, -1)) FATAL_ERROR("Async event handler does not exist!"); luaL_checktype(L, -1, LUA_TFUNCTION); lua_pushinteger(L, j.id); lua_pushlstring(L, j.result.data(), j.result.size()); // Call handler const char *origin = j.mod_origin.empty() ? nullptr : j.mod_origin.c_str(); script->setOriginDirect(origin); int result = lua_pcall(L, 2, 0, error_handler); if (result) script_error(L, result, origin, "<async>"); } lua_pop(L, 2); // Pop core and error handler } /******************************************************************************/ void AsyncEngine::prepareEnvironment(lua_State* L, int top) { for (StateInitializer &stateInitializer : stateInitializers) { stateInitializer(L, top); } } /******************************************************************************/ AsyncWorkerThread::AsyncWorkerThread(AsyncEngine* jobDispatcher, const std::string &name) : ScriptApiBase(ScriptingType::Async), Thread(name), jobDispatcher(jobDispatcher) { lua_State *L = getStack(); // Prepare job lua environment lua_getglobal(L, "core"); int top = lua_gettop(L); // Push builtin initialization type lua_pushstring(L, "async"); lua_setglobal(L, "INIT"); jobDispatcher->prepareEnvironment(L, top); } /******************************************************************************/ AsyncWorkerThread::~AsyncWorkerThread() { sanity_check(!isRunning()); } /******************************************************************************/ void* AsyncWorkerThread::run() { lua_State *L = getStack(); try { loadMod(getServer()->getBuiltinLuaPath() + DIR_DELIM + "init.lua", BUILTIN_MOD_NAME); } catch (const ModError &e) { errorstream << "Execution of async base environment failed: " << e.what() << std::endl; FATAL_ERROR("Execution of async base environment failed"); } int error_handler = PUSH_ERROR_HANDLER(L); lua_getglobal(L, "core"); if (lua_isnil(L, -1)) { FATAL_ERROR("Unable to find core within async environment!"); } // Main loop LuaJobInfo j; while (!stopRequested()) { // Wait for job if (!jobDispatcher->getJob(&j) || stopRequested()) continue; lua_getfield(L, -1, "job_processor"); if (lua_isnil(L, -1)) FATAL_ERROR("Unable to get async job processor!"); luaL_checktype(L, -1, LUA_TFUNCTION); if (luaL_loadbuffer(L, j.function.data(), j.function.size(), "=(async)")) { errorstream << "ASYNC WORKER: Unable to deserialize function" << std::endl; lua_pushnil(L); } lua_pushlstring(L, j.params.data(), j.params.size()); // Call it setOriginDirect(j.mod_origin.empty() ? nullptr : j.mod_origin.c_str()); int result = lua_pcall(L, 2, 1, error_handler); if (result) { try { scriptError(result, "<async>"); } catch (const ModError &e) { errorstream << e.what() << std::endl; } } else { // Fetch result size_t length; const char *retval = lua_tolstring(L, -1, &length); j.result.assign(retval, length); } lua_pop(L, 1); // Pop retval // Put job result if (!j.result.empty()) jobDispatcher->putJobResult(std::move(j)); } lua_pop(L, 2); // Pop core and error handler return 0; }