X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Femerge.cpp;h=f97763718eacebb79d86f3653de7494c9b25a7a4;hb=45589fae58157c8a66c640a1db5795a42a86fc1c;hp=250c44fbb4b7bd81da880c24ecd012fc438e8083;hpb=979ca23f1eae1adeb8b0083dffe7203c54d87395;p=dragonfireclient.git diff --git a/src/emerge.cpp b/src/emerge.cpp index 250c44fbb..f97763718 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -1,6 +1,7 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola +Copyright (C) 2010-2013 kwolekr, Ryan Kwolek This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -31,25 +32,37 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapblock.h" #include "serverobject.h" #include "settings.h" -#include "script.h" -#include "scriptapi.h" +#include "cpp_api/scriptapi.h" #include "profiler.h" #include "log.h" #include "nodedef.h" #include "biome.h" #include "emerge.h" #include "mapgen_v6.h" +#include "mapgen_v7.h" +#include "mapgen_indev.h" +#include "mapgen_singlenode.h" +#include "mapgen_math.h" /////////////////////////////// Emerge Manager //////////////////////////////// -EmergeManager::EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef) { +EmergeManager::EmergeManager(IGameDef *gamedef) { //register built-in mapgens registerMapgen("v6", new MapgenFactoryV6()); + registerMapgen("v7", new MapgenFactoryV7()); + registerMapgen("indev", new MapgenFactoryIndev()); + registerMapgen("singlenode", new MapgenFactorySinglenode()); + registerMapgen("math", new MapgenFactoryMath()); - this->biomedef = bdef ? bdef : new BiomeDefManager(gamedef); + this->ndef = gamedef->getNodeDefManager(); + this->biomedef = new BiomeDefManager(); this->params = NULL; + this->luaoverride_params = NULL; + this->luaoverride_params_modified = 0; + this->luaoverride_flagmask = 0; + mapgen_debug_info = g_settings->getBool("enable_mapgen_debug_info"); queuemutex.Init(); @@ -58,7 +71,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef) { if (g_settings->get("num_emerge_threads").empty()) { int nprocs = porting::getNumberOfProcessors(); // leave a proc for the main thread and one for some other misc threads - nthreads = (nprocs > 2) ? nthreads = nprocs - 2 : 1; + nthreads = (nprocs > 2) ? nprocs - 2 : 1; } else { nthreads = g_settings->getU16("num_emerge_threads"); } @@ -81,16 +94,31 @@ EmergeManager::EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef) { EmergeManager::~EmergeManager() { - for (int i = 0; i != emergethread.size(); i++) { + for (unsigned int i = 0; i != emergethread.size(); i++) { emergethread[i]->setRun(false); emergethread[i]->qevent.signal(); emergethread[i]->stop(); delete emergethread[i]; delete mapgen[i]; } + emergethread.clear(); + mapgen.clear(); + + for (unsigned int i = 0; i < ores.size(); i++) + delete ores[i]; + ores.clear(); + + for (unsigned int i = 0; i < decorations.size(); i++) + delete decorations[i]; + decorations.clear(); + for (std::map::iterator iter = mglist.begin(); + iter != mglist.end(); iter ++) { + delete iter->second; + } + mglist.clear(); + delete biomedef; - delete params; } @@ -100,8 +128,39 @@ void EmergeManager::initMapgens(MapgenParams *mgparams) { if (mapgen.size()) return; + // Resolve names of nodes for things that were registered + // (at this point, the registration period is over) + biomedef->resolveNodeNames(ndef); + + for (size_t i = 0; i != ores.size(); i++) + ores[i]->resolveNodeNames(ndef); + + for (size_t i = 0; i != decorations.size(); i++) + decorations[i]->resolveNodeNames(ndef); + + // Apply mapgen parameter overrides from Lua + if (luaoverride_params) { + if (luaoverride_params_modified & MGPARAMS_SET_MGNAME) + mgparams->mg_name = luaoverride_params->mg_name; + + if (luaoverride_params_modified & MGPARAMS_SET_SEED) + mgparams->seed = luaoverride_params->seed; + + if (luaoverride_params_modified & MGPARAMS_SET_WATER_LEVEL) + mgparams->water_level = luaoverride_params->water_level; + + if (luaoverride_params_modified & MGPARAMS_SET_FLAGS) { + mgparams->flags &= ~luaoverride_flagmask; + mgparams->flags |= luaoverride_params->flags; + } + + delete luaoverride_params; + luaoverride_params = NULL; + } + + // Create the mapgens this->params = mgparams; - for (int i = 0; i != emergethread.size(); i++) { + for (size_t i = 0; i != emergethread.size(); i++) { mg = createMapgen(params->mg_name, 0, params); if (!mg) { infostream << "EmergeManager: falling back to mapgen v6" << std::endl; @@ -114,6 +173,16 @@ void EmergeManager::initMapgens(MapgenParams *mgparams) { } +Mapgen *EmergeManager::getCurrentMapgen() { + for (unsigned int i = 0; i != emergethread.size(); i++) { + if (emergethread[i]->IsSameThread()) + return emergethread[i]->mapgen; + } + + return NULL; +} + + bool EmergeManager::enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate) { std::map::const_iterator iter; BlockEmergeData *bedata; @@ -152,7 +221,7 @@ bool EmergeManager::enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate // insert into the EmergeThread queue with the least items int lowestitems = emergethread[0]->blockqueue.size(); - for (int i = 1; i != emergethread.size(); i++) { + for (unsigned int i = 1; i != emergethread.size(); i++) { int nitems = emergethread[i]->blockqueue.size(); if (nitems < lowestitems) { idx = i; @@ -233,6 +302,8 @@ MapgenParams *EmergeManager::createMapgenParams(std::string mgname) { MapgenParams *EmergeManager::getParamsFromSettings(Settings *settings) { std::string mg_name = settings->get("mg_name"); MapgenParams *mgparams = createMapgenParams(mg_name); + if (!mgparams) + return NULL; mgparams->mg_name = mg_name; mgparams->seed = settings->getU64(settings == g_settings ? "fixed_map_seed" : "seed"); @@ -259,7 +330,7 @@ void EmergeManager::setParamsToSettings(Settings *settings) { } -bool EmergeManager::registerMapgen(std::string mgname, MapgenFactory *mgfactory) { +void EmergeManager::registerMapgen(std::string mgname, MapgenFactory *mgfactory) { mglist.insert(std::make_pair(mgname, mgfactory)); infostream << "EmergeManager: registered mapgen " << mgname << std::endl; } @@ -326,7 +397,7 @@ bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b, void *EmergeThread::Thread() { ThreadStarted(); - log_register_thread("EmergeThread" + id); + log_register_thread("EmergeThread" + itos(id)); DSTACK(__FUNCTION_NAME); BEGIN_DEBUG_EXCEPTION_HANDLER @@ -359,7 +430,7 @@ void *EmergeThread::Thread() { */ BlockMakeData data; MapBlock *block = NULL; - core::map modified_blocks; + std::map modified_blocks; if (getBlockOrStartGen(p, &block, &data, allow_generate)) { { @@ -395,7 +466,7 @@ void *EmergeThread::Thread() { ign(&m_server->m_ignore_map_edit_events_area, VoxelArea(minp, maxp)); { // takes about 90ms with -O1 on an e3-1230v2 - scriptapi_environment_on_generated(m_server->m_lua, + SERVER_TO_SA(m_server)->environment_OnGenerated( minp, maxp, emerge->getBlockSeed(minp)); } @@ -415,13 +486,21 @@ void *EmergeThread::Thread() { JMutexAutoLock lock(m_server->m_con_mutex); // Add the originally fetched block to the modified list if (block) - modified_blocks.insert(p, block); + modified_blocks[p] = block; + + // Update weather data in mapblock + for(std::map::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { + map->getHeat(m_server->m_env, MAP_BLOCKSIZE*i->first ,i->second); + map->getHumidity(m_server->m_env, MAP_BLOCKSIZE*i->first, i->second); + } // Set the modified blocks unsent for all the clients - for (core::map::Iterator - i = m_server->m_clients.getIterator(); - i.atEnd() == false; i++) { - RemoteClient *client = i.getNode()->getValue(); + for (std::map::iterator + i = m_server->m_clients.begin(); + i != m_server->m_clients.end(); ++i) { + RemoteClient *client = i->second; if (modified_blocks.size() > 0) { // Remove block from sent history client->SetBlocksNotSent(modified_blocks);