From 165498cecfc11f3471d84855f4d019be9b353621 Mon Sep 17 00:00:00 2001 From: proller Date: Wed, 13 Mar 2013 00:41:14 +0400 Subject: initial mapgen indev version with farscale feature and huge caves --- src/mapgen_indev.h | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/mapgen_indev.h (limited to 'src/mapgen_indev.h') diff --git a/src/mapgen_indev.h b/src/mapgen_indev.h new file mode 100644 index 000000000..ef6193c12 --- /dev/null +++ b/src/mapgen_indev.h @@ -0,0 +1,135 @@ +/* +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola + +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 +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MAPGENINDEV_HEADER +#define MAPGENINDEV_HEADER + +#include "mapgen.h" +#include "mapgen_v6.h" + +float farscale(float scale, float x, float y, float z); + +struct NoiseIndevParams : public NoiseParams { + float farscale; + + NoiseIndevParams(){} + NoiseIndevParams(float offset_, float scale_, v3f spread_, int seed_, int octaves_, float persist_, float farscale_) + //:NoiseParams(offset_, scale_, spread_, seed_, octaves_, persist_) + { + //NoiseParams(float offset_, float scale_, v3f spread_, int seed_, int octaves_, float persist_) { + offset = offset_; + scale = scale_; + spread = spread_; + seed = seed_; + octaves = octaves_; + persist = persist_; + //} + farscale = farscale_; + } + +}; + +#define getNoiseIndevParams(x) getStruct((x), "f,f,v3,s32,s32,f,f") +#define setNoiseIndevParams(x, y) setStruct((x), "f,f,v3,s32,s32,f,f", (y)) + +class NoiseIndev : public Noise { + public: + NoiseIndevParams *npindev; + + //NoiseIndev() {}; + NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy); + NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy, int sz); + void init(NoiseIndevParams *np, int seed, int sx, int sy, int sz); + void transformNoiseMapFarScale(float xx = 0, float yy = 0, float zz = 0); +}; + +extern NoiseIndevParams nparams_indev_def_terrain_base; +extern NoiseIndevParams nparams_indev_def_terrain_higher; +extern NoiseIndevParams nparams_indev_def_steepness; +//extern NoiseIndevParams nparams_indev_def_height_select; +//extern NoiseIndevParams nparams_indev_def_trees; +extern NoiseIndevParams nparams_indev_def_mud; +//extern NoiseIndevParams nparams_indev_def_beach; +//extern NoiseIndevParams nparams_indev_def_biome; +//extern NoiseIndevParams nparams_indev_def_cave; + + +struct MapgenIndevParams : public MapgenV6Params { + NoiseIndevParams *npindev_terrain_base; + NoiseIndevParams *npindev_terrain_higher; + NoiseIndevParams *npindev_steepness; + //NoiseParams *np_height_select; + //NoiseParams *np_trees; + NoiseIndevParams *npindev_mud; + //NoiseParams *np_beach; + //NoiseParams *np_biome; + //NoiseParams *np_cave; + + MapgenIndevParams() { + //freq_desert = 0.45; + //freq_beach = 0.15; + npindev_terrain_base = &nparams_indev_def_terrain_base; + npindev_terrain_higher = &nparams_indev_def_terrain_higher; + npindev_steepness = &nparams_indev_def_steepness; + //np_height_select = &nparams_v6_def_height_select; + //np_trees = &nparams_v6_def_trees; + npindev_mud = &nparams_indev_def_mud; + //np_beach = &nparams_v6_def_beach; + //np_biome = &nparams_v6_def_biome; + //np_cave = &nparams_v6_def_cave; + } + + bool readParams(Settings *settings); + void writeParams(Settings *settings); +}; + +class MapgenIndev : public MapgenV6 { + public: + NoiseIndev *noiseindev_terrain_base; + NoiseIndev *noiseindev_terrain_higher; + NoiseIndev *noiseindev_steepness; + //NoiseIndev *noise_height_select; + //NoiseIndev *noise_trees; + NoiseIndev *noiseindev_mud; + //NoiseIndev *noise_beach; + //NoiseIndev *noise_biome; + //NoiseIndevParams *np_cave; + + MapgenIndev(int mapgenid, MapgenIndevParams *params); + ~MapgenIndev(); + void calculateNoise(); + + float baseTerrainLevelFromNoise(v2s16 p); + float baseTerrainLevelFromMap(int index); + float getMudAmount(int index); + void defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave); +}; + +struct MapgenFactoryIndev : public MapgenFactoryV6 { + Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) { + return new MapgenIndev(mgid, (MapgenIndevParams *)params); + }; + + MapgenParams *createMapgenParams() { + return new MapgenIndevParams(); + }; +}; + + +#endif -- cgit v1.2.3 From f70378f7f57f293a2a0afcf35aec8ee67180a6c0 Mon Sep 17 00:00:00 2001 From: proller Date: Sun, 24 Mar 2013 03:40:15 +0400 Subject: Mapgen indev: float islands, larger far biomes --- games/minimal/mods/default/mapgen.lua | 3 + minetest.conf.example | 17 ++- src/defaultsettings.cpp | 13 +- src/mapgen_indev.cpp | 226 ++++++++++++++++++++++++++-------- src/mapgen_indev.h | 49 +++++--- src/mapgen_v6.cpp | 2 + src/mapgen_v6.h | 1 + 7 files changed, 233 insertions(+), 78 deletions(-) (limited to 'src/mapgen_indev.h') diff --git a/games/minimal/mods/default/mapgen.lua b/games/minimal/mods/default/mapgen.lua index 74fc398b2..de6632d13 100644 --- a/games/minimal/mods/default/mapgen.lua +++ b/games/minimal/mods/default/mapgen.lua @@ -74,6 +74,9 @@ minetest.register_on_generated(function(minp, maxp, seed) generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+2, 1/12/12/12, 5, -16, -5 ) generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+3, 1/9/9/9, 5, -31000, -17 ) + generate_ore("default:stone_with_coal", "default:stone", minp, maxp, seed+4, 1/8/8/8, 5, 200, 31000 ) -- for float islands and far scaled mountains + generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+5, 1/9/9/9, 5, 200, 31000 ) + if minetest.setting_getbool("underground_springs") then generate_ore("default:water_source", "default:stone", minp, maxp, seed+4, 1/24/24/24, 12, -100, -11, 128) generate_ore("default:water_source", "default:stone", minp, maxp, seed+5, 1/28/28/28, 8, -10000, -101, 128) diff --git a/minetest.conf.example b/minetest.conf.example index 5401f6aad..838987c33 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -341,8 +341,15 @@ #mgv7_np_heat = 25, 50, (500, 500, 500), 35293, 1, 0 #mgv7_np_humidity = 50, 31.25, (750, 750, 750), 12094, 2, 0.6 -# Offset, scale, spread factor, seed offset, number of octaves, persistence, farscale -#mgindev_np_terrain_base = -4, 20, (250.0, 250, 250), 82341, 5, 0.6, 10 -#mgindev_np_terrain_higher = 20, 16, (500, 500, 500), 85039, 5, 0.6, 10 -#mgindev_np_steepness = 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 10 -#mgindev_np_mud = 4, 2, (200, 200, 200), 91013, 3, 0.55, 1 +# Offset, scale, spread factor, seed offset, number of octaves, persistence, farscale, farspread +#mgindev_np_terrain_base = -4, 20, (250, 250, 250), 82341, 5, 0.6, 10, 10 +#mgindev_np_terrain_higher = 20, 16, (500, 500, 500), 85039, 5, 0.6, 10, 10 +#mgindev_np_steepness = 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2, 10 +#mgindev_np_mud = 4, 2, (200, 200, 200), 91013, 3, 0.55, 1, 1 +#mgindev_np_float_islands1 = 0, 1, (64, 64, 64 ), 3683, 5, 0.5, 1, 1.5 +#mgindev_np_float_islands2 = 0, 1, (8, 8, 8 ), 9292, 2, 0.5, 1, 1.5 +#mgindev_np_float_islands3 = 0, 1, (256, 256, 256), 6412, 2, 0.5, 1, 0.5 +#mgindev_np_biome = 0, 1, (250, 250, 250), 9130, 3, 0.50, 1, 10 + +# Float islands starts from height, 0 to disable +#mgindev_float_islands = 500 diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 25edffe32..592c6bcca 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -236,10 +236,15 @@ void set_default_settings(Settings *settings) settings->setDefault("mgv7_np_heat", "25, 50, (500, 500, 500), 35293, 1, 0"); settings->setDefault("mgv7_np_humidity", "50, 31.25, (750, 750, 750), 12094, 2, 0.6"); - settings->setDefault("mgindev_np_terrain_base", "-4, 20, (250.0, 250, 250), 82341, 5, 0.6, 10"); - settings->setDefault("mgindev_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6, 10"); - settings->setDefault("mgindev_np_steepness", "0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 10"); - settings->setDefault("mgindev_np_mud", "4, 2, (200, 200, 200), 91013, 3, 0.55, 1"); + settings->setDefault("mgindev_np_terrain_base", "-4, 20, (250, 250, 250), 82341, 5, 0.6, 10, 10"); + settings->setDefault("mgindev_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6, 10, 10"); + settings->setDefault("mgindev_np_steepness", "0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2, 10"); + settings->setDefault("mgindev_np_mud", "4, 2, (200, 200, 200), 91013, 3, 0.55, 1, 1"); + settings->setDefault("mgindev_np_float_islands1", "0, 1, (64, 64, 64 ), 3683, 5, 0.5, 1, 1.5"); + settings->setDefault("mgindev_np_float_islands2", "0, 1, (8, 8, 8 ), 9292, 2, 0.5, 1, 1.5"); + settings->setDefault("mgindev_np_float_islands3", "0, 1, (256, 256, 256), 6412, 2, 0.5, 1, 0.5"); + settings->setDefault("mgindev_np_biome", "0, 1, (250, 250, 250), 9130, 3, 0.50, 1, 10"); + settings->setDefault("mgindev_float_islands", "500"); } diff --git a/src/mapgen_indev.cpp b/src/mapgen_indev.cpp index 4de4fd55f..6956fc63f 100644 --- a/src/mapgen_indev.cpp +++ b/src/mapgen_indev.cpp @@ -19,18 +19,27 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen_indev.h" #include "constants.h" +#include "map.h" +#include "main.h" #include "log.h" -/////////////////// Mapgen Indev perlin noise default values +/////////////////// Mapgen Indev perlin noise (default values - not used, from config or defaultsettings) -NoiseIndevParams nparams_indev_def_terrain_base - (-AVERAGE_MUD_AMOUNT, 20.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6, 1); -NoiseIndevParams nparams_indev_def_terrain_higher - (20.0, 16.0, v3f(500.0, 500.0, 500.0), 85039, 5, 0.6, 1); -NoiseIndevParams nparams_indev_def_steepness - (0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7, 1); -NoiseIndevParams nparams_indev_def_mud - (AVERAGE_MUD_AMOUNT, 2.0, v3f(200.0, 200.0, 200.0), 91013, 3, 0.55, 1); +NoiseIndevParams nparams_indev_def; + +/* +NoiseIndevParams nparams_indev_def_terrain_base; +// (-AVERAGE_MUD_AMOUNT, 20.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_terrain_higher; +// (20.0, 16.0, v3f(500.0, 500.0, 500.0), 85039, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_steepness; +// (0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7, 1); +NoiseIndevParams nparams_indev_def_mud; +// (AVERAGE_MUD_AMOUNT, 2.0, v3f(200.0, 200.0, 200.0), 91013, 3, 0.55, 1); +NoiseIndevParams nparams_indev_def_float_islands; +// (1, 10.0, v3f(500.0, 500.0, 500.0), 32451, 5, 0.6, 1); +NoiseIndevParams nparams_indev_def_biome; +*/ /////////////////////////////////////////////////////////////////////////////// @@ -39,31 +48,32 @@ void NoiseIndev::init(NoiseIndevParams *np, int seed, int sx, int sy, int sz) { this->npindev = np; } - NoiseIndev::NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy) : Noise(np, seed, sx, sy) { init(np, seed, sx, sy, 1); } - NoiseIndev::NoiseIndev(NoiseIndevParams *np, int seed, int sx, int sy, int sz) : Noise(np, seed, sx, sy, sz) { init(np, seed, sx, sy, sz); } +float farscale(float scale, float z) { + return ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 1 - (fabs(z)) ) / (MAP_GENERATION_LIMIT * 1) ) * (scale - 1) ); +} + +float farscale(float scale, float x, float z) { + return ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 2 - (fabs(x) + fabs(z)) ) / (MAP_GENERATION_LIMIT * 2) ) * (scale - 1) ); +} float farscale(float scale, float x, float y, float z) { return ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 3 - (fabs(x) + fabs(y) + fabs(z)) ) / (MAP_GENERATION_LIMIT * 3) ) * (scale - 1) ); } void NoiseIndev::transformNoiseMapFarScale(float xx, float yy, float zz) { - // more correct use distantion from 0,0,0 via pow, but + is faster - //float farscale = ( 1 + ( 1 - (MAP_GENERATION_LIMIT * 3 - (fabs(xx) + fabs(yy) + fabs(zz)) ) / (MAP_GENERATION_LIMIT * 3) ) * ((npindev)->farscale - 1) ); - // dstream << "TNM rs=" << farscale << " from=" << (npindev)->farscale << " x=" << xx << " y=" << yy <<" z=" << zz << std::endl; int i = 0; for (int z = 0; z != sz; z++) { for (int y = 0; y != sy; y++) { for (int x = 0; x != sx; x++) { - //result[i] = result[i] * npindev->scale * farscale + npindev->offset; - result[i] = result[i] * npindev->scale * farscale(npindev->farscale,xx,yy,zz) + npindev->offset; + result[i] = result[i] * npindev->scale * farscale(npindev->farscale, xx, yy, zz) + npindev->offset; i++; } } @@ -71,14 +81,17 @@ void NoiseIndev::transformNoiseMapFarScale(float xx, float yy, float zz) { } MapgenIndev::MapgenIndev(int mapgenid, MapgenIndevParams *params) : MapgenV6(mapgenid, params) { - noiseindev_terrain_base = new NoiseIndev(params->npindev_terrain_base, seed, csize.X, csize.Y); - noiseindev_terrain_higher = new NoiseIndev(params->npindev_terrain_higher, seed, csize.X, csize.Y); - noiseindev_steepness = new NoiseIndev(params->npindev_steepness, seed, csize.X, csize.Y); + noiseindev_terrain_base = new NoiseIndev(params->npindev_terrain_base, seed, csize.X, csize.Z); + noiseindev_terrain_higher = new NoiseIndev(params->npindev_terrain_higher, seed, csize.X, csize.Z); + noiseindev_steepness = new NoiseIndev(params->npindev_steepness, seed, csize.X, csize.Z); // noise_height_select = new Noise(params->np_height_select, seed, csize.X, csize.Y); // noise_trees = new Noise(params->np_trees, seed, csize.X, csize.Y); - noiseindev_mud = new NoiseIndev(params->npindev_mud, seed, csize.X, csize.Y); + noiseindev_mud = new NoiseIndev(params->npindev_mud, seed, csize.X, csize.Z); // noise_beach = new Noise(params->np_beach, seed, csize.X, csize.Y); -// noise_biome = new Noise(params->np_biome, seed, csize.X, csize.Y); + noiseindev_float_islands1 = new NoiseIndev(params->npindev_float_islands1, seed, csize.X, csize.Y, csize.Z); + noiseindev_float_islands2 = new NoiseIndev(params->npindev_float_islands2, seed, csize.X, csize.Y, csize.Z); + noiseindev_float_islands3 = new NoiseIndev(params->npindev_float_islands3, seed, csize.X, csize.Z); + noiseindev_biome = new NoiseIndev(params->npindev_biome, seed, csize.X, csize.Z); } MapgenIndev::~MapgenIndev() { @@ -89,10 +102,12 @@ MapgenIndev::~MapgenIndev() { //delete noise_trees; delete noiseindev_mud; //delete noise_beach; - //delete noise_biome; + delete noiseindev_float_islands1; + delete noiseindev_float_islands2; + delete noiseindev_float_islands3; + delete noiseindev_biome; } - void MapgenIndev::calculateNoise() { int x = node_min.X; int y = node_min.Y; @@ -100,31 +115,49 @@ void MapgenIndev::calculateNoise() { // Need to adjust for the original implementation's +.5 offset... if (!(flags & MG_FLAT)) { noiseindev_terrain_base->perlinMap2D( - x + 0.5 * noiseindev_terrain_base->npindev->spread.X, - z + 0.5 * noiseindev_terrain_base->npindev->spread.Z); + x + 0.5 * noiseindev_terrain_base->npindev->spread.X * farscale(noiseindev_terrain_base->npindev->farspread, x, z), + z + 0.5 * noiseindev_terrain_base->npindev->spread.Z * farscale(noiseindev_terrain_base->npindev->farspread, x, z)); noiseindev_terrain_base->transformNoiseMapFarScale(x, y, z); - //noise_terrain_base->transformNoiseMap(); noiseindev_terrain_higher->perlinMap2D( - x + 0.5 * noiseindev_terrain_higher->npindev->spread.X, - z + 0.5 * noiseindev_terrain_higher->npindev->spread.Z); + x + 0.5 * noiseindev_terrain_higher->npindev->spread.X * farscale(noiseindev_terrain_higher->npindev->farspread, x, z), + z + 0.5 * noiseindev_terrain_higher->npindev->spread.Z * farscale(noiseindev_terrain_higher->npindev->farspread, x, z)); noiseindev_terrain_higher->transformNoiseMapFarScale(x, y, z); - //noise_terrain_higher->transformNoiseMap(); noiseindev_steepness->perlinMap2D( - x + 0.5 * noiseindev_steepness->npindev->spread.X, - z + 0.5 * noiseindev_steepness->npindev->spread.Z); + x + 0.5 * noiseindev_steepness->npindev->spread.X * farscale(noiseindev_steepness->npindev->farspread, x, z), + z + 0.5 * noiseindev_steepness->npindev->spread.Z * farscale(noiseindev_steepness->npindev->farspread, x, z)); noiseindev_steepness->transformNoiseMapFarScale(x, y, z); noise_height_select->perlinMap2D( x + 0.5 * noise_height_select->np->spread.X, z + 0.5 * noise_height_select->np->spread.Z); + + noiseindev_float_islands1->perlinMap3D( + x + 0.33 * noiseindev_float_islands1->npindev->spread.X * farscale(noiseindev_float_islands1->npindev->farspread, x, y, z), + y + 0.33 * noiseindev_float_islands1->npindev->spread.Y * farscale(noiseindev_float_islands1->npindev->farspread, x, y, z), + z + 0.33 * noiseindev_float_islands1->npindev->spread.Z * farscale(noiseindev_float_islands1->npindev->farspread, x, y, z) + ); + noiseindev_float_islands1->transformNoiseMapFarScale(x, y, z); + + noiseindev_float_islands2->perlinMap3D( + x + 0.33 * noiseindev_float_islands2->npindev->spread.X * farscale(noiseindev_float_islands2->npindev->farspread, x, y, z), + y + 0.33 * noiseindev_float_islands2->npindev->spread.Y * farscale(noiseindev_float_islands2->npindev->farspread, x, y, z), + z + 0.33 * noiseindev_float_islands2->npindev->spread.Z * farscale(noiseindev_float_islands2->npindev->farspread, x, y, z) + ); + noiseindev_float_islands2->transformNoiseMapFarScale(x, y, z); + + noiseindev_float_islands3->perlinMap2D( + x + 0.5 * noiseindev_float_islands3->npindev->spread.X * farscale(noiseindev_float_islands3->npindev->farspread, x, z), + z + 0.5 * noiseindev_float_islands3->npindev->spread.Z * farscale(noiseindev_float_islands3->npindev->farspread, x, z)); + noiseindev_float_islands3->transformNoiseMapFarScale(x, y, z); + } if (!(flags & MG_FLAT)) { noiseindev_mud->perlinMap2D( - x + 0.5 * noiseindev_mud->npindev->spread.X, - z + 0.5 * noiseindev_mud->npindev->spread.Z); + x + 0.5 * noiseindev_mud->npindev->spread.X * farscale(noiseindev_mud->npindev->farspread, x, y, z), + z + 0.5 * noiseindev_mud->npindev->spread.Z * farscale(noiseindev_mud->npindev->farspread, x, y, z)); noiseindev_mud->transformNoiseMapFarScale(x, y, z); } noise_beach->perlinMap2D( @@ -132,8 +165,8 @@ void MapgenIndev::calculateNoise() { z + 0.7 * noise_beach->np->spread.Z); noise_biome->perlinMap2D( - x + 0.6 * noise_biome->np->spread.X, - z + 0.2 * noise_biome->np->spread.Z); + x + 0.6 * noiseindev_biome->npindev->spread.X * farscale(noiseindev_biome->npindev->farspread, x, z), + z + 0.2 * noiseindev_biome->npindev->spread.Z * farscale(noiseindev_biome->npindev->farspread, x, z)); } bool MapgenIndevParams::readParams(Settings *settings) { @@ -147,17 +180,20 @@ bool MapgenIndevParams::readParams(Settings *settings) { np_trees = settings->getNoiseParams("mgv6_np_trees"); npindev_mud = settings->getNoiseIndevParams("mgindev_np_mud"); np_beach = settings->getNoiseParams("mgv6_np_beach"); - np_biome = settings->getNoiseParams("mgv6_np_biome"); + npindev_biome = settings->getNoiseIndevParams("mgindev_np_biome"); np_cave = settings->getNoiseParams("mgv6_np_cave"); + npindev_float_islands1 = settings->getNoiseIndevParams("mgindev_np_float_islands1"); + npindev_float_islands2 = settings->getNoiseIndevParams("mgindev_np_float_islands2"); + npindev_float_islands3 = settings->getNoiseIndevParams("mgindev_np_float_islands3"); bool success = npindev_terrain_base && npindev_terrain_higher && npindev_steepness && np_height_select && np_trees && npindev_mud && - np_beach && np_biome && np_cave; + np_beach && np_biome && np_cave && + npindev_float_islands1 && npindev_float_islands2 && npindev_float_islands3; return success; } - void MapgenIndevParams::writeParams(Settings *settings) { settings->setFloat("mgv6_freq_desert", freq_desert); settings->setFloat("mgv6_freq_beach", freq_beach); @@ -169,8 +205,11 @@ void MapgenIndevParams::writeParams(Settings *settings) { settings->setNoiseParams("mgv6_np_trees", np_trees); settings->setNoiseIndevParams("mgindev_np_mud", npindev_mud); settings->setNoiseParams("mgv6_np_beach", np_beach); - settings->setNoiseParams("mgv6_np_biome", np_biome); + settings->setNoiseIndevParams("mgindev_np_biome", npindev_biome); settings->setNoiseParams("mgv6_np_cave", np_cave); + settings->setNoiseIndevParams("mgindev_np_float_islands1", npindev_float_islands1); + settings->setNoiseIndevParams("mgindev_np_float_islands2", npindev_float_islands2); + settings->setNoiseIndevParams("mgindev_np_float_islands3", npindev_float_islands3); } @@ -191,7 +230,6 @@ float MapgenIndev::baseTerrainLevelFromNoise(v2s16 p) { steepness, height_select); } - float MapgenIndev::baseTerrainLevelFromMap(int index) { if (flags & MG_FLAT) return water_level; @@ -205,9 +243,7 @@ float MapgenIndev::baseTerrainLevelFromMap(int index) { steepness, height_select); } - -float MapgenIndev::getMudAmount(int index) -{ +float MapgenIndev::getMudAmount(int index) { if (flags & MG_FLAT) return AVERAGE_MUD_AMOUNT; @@ -218,25 +254,19 @@ float MapgenIndev::getMudAmount(int index) return noiseindev_mud->result[index]; } - void MapgenIndev::defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave) { cave.min_tunnel_diameter = 2; cave.max_tunnel_diameter = ps.range(2,6); cave.dswitchint = ps.range(1,14); - //cave.tunnel_routepoints = 0; - //cave.part_max_length_rs = 0; cave.flooded = large_cave && ps.range(0,4); if(large_cave){ cave.part_max_length_rs = ps.range(2,4); -//dstream<<"try:"<setDefault("mgindev_np_float_islands1", "-9.5, 10, (20, 50, 50 ), 45123, 5, 0.6, 1.5, 5"); +void MapgenIndev::generateFloatIslands(int min_y) { + if (node_min.Y < min_y) return; + v3s16 p0(node_min.X, node_min.Y, node_min.Z); + MapNode n1(c_stone), n2(c_desert_stone); + int xl = node_max.X - node_min.X; + int yl = node_max.Y - node_min.Y; + int zl = node_max.Z - node_min.Z; + u32 index = 0; + for (int x1 = 0; x1 <= xl; x1++) + { + //int x = x1 + node_min.Y; + for (int z1 = 0; z1 <= zl; z1++) + { + //int z = z1 + node_min.Z; + for (int y1 = 0; y1 <= yl; y1++, index++) + { + //int y = y1 + node_min.Y; + float noise = noiseindev_float_islands1->result[index]; + //dstream << " y1="<((x), "f,f,v3,s32,s32,f,f") -#define setNoiseIndevParams(x, y) setStruct((x), "f,f,v3,s32,s32,f,f", (y)) +#define getNoiseIndevParams(x) getStruct((x), "f,f,v3,s32,s32,f,f,f") +#define setNoiseIndevParams(x, y) setStruct((x), "f,f,v3,s32,s32,f,f,f", (y)) class NoiseIndev : public Noise { public: @@ -59,6 +61,8 @@ class NoiseIndev : public Noise { void transformNoiseMapFarScale(float xx = 0, float yy = 0, float zz = 0); }; +extern NoiseIndevParams nparams_indev_def; +/* extern NoiseIndevParams nparams_indev_def_terrain_base; extern NoiseIndevParams nparams_indev_def_terrain_higher; extern NoiseIndevParams nparams_indev_def_steepness; @@ -66,9 +70,10 @@ extern NoiseIndevParams nparams_indev_def_steepness; //extern NoiseIndevParams nparams_indev_def_trees; extern NoiseIndevParams nparams_indev_def_mud; //extern NoiseIndevParams nparams_indev_def_beach; -//extern NoiseIndevParams nparams_indev_def_biome; +extern NoiseIndevParams nparams_indev_def_biome; //extern NoiseIndevParams nparams_indev_def_cave; - +extern NoiseIndevParams nparams_indev_def_float_islands; +*/ struct MapgenIndevParams : public MapgenV6Params { NoiseIndevParams *npindev_terrain_base; @@ -78,21 +83,28 @@ struct MapgenIndevParams : public MapgenV6Params { //NoiseParams *np_trees; NoiseIndevParams *npindev_mud; //NoiseParams *np_beach; - //NoiseParams *np_biome; + NoiseIndevParams *npindev_biome; //NoiseParams *np_cave; + NoiseIndevParams *npindev_float_islands1; + NoiseIndevParams *npindev_float_islands2; + NoiseIndevParams *npindev_float_islands3; MapgenIndevParams() { //freq_desert = 0.45; //freq_beach = 0.15; - npindev_terrain_base = &nparams_indev_def_terrain_base; - npindev_terrain_higher = &nparams_indev_def_terrain_higher; - npindev_steepness = &nparams_indev_def_steepness; + npindev_terrain_base = &nparams_indev_def; //&nparams_indev_def_terrain_base; + npindev_terrain_higher = &nparams_indev_def; //&nparams_indev_def_terrain_higher; + npindev_steepness = &nparams_indev_def; //&nparams_indev_def_steepness; //np_height_select = &nparams_v6_def_height_select; //np_trees = &nparams_v6_def_trees; - npindev_mud = &nparams_indev_def_mud; + npindev_mud = &nparams_indev_def; //&nparams_indev_def_mud; //np_beach = &nparams_v6_def_beach; - //np_biome = &nparams_v6_def_biome; + npindev_biome = &nparams_indev_def; //&nparams_indev_def_biome; //np_cave = &nparams_v6_def_cave; + npindev_float_islands1 = &nparams_indev_def; //&nparams_indev_def_float_islands; + npindev_float_islands2 = &nparams_indev_def; //&nparams_indev_def_float_islands; + npindev_float_islands3 = &nparams_indev_def; //&nparams_indev_def_float_islands; + } bool readParams(Settings *settings); @@ -108,8 +120,11 @@ class MapgenIndev : public MapgenV6 { //NoiseIndev *noise_trees; NoiseIndev *noiseindev_mud; //NoiseIndev *noise_beach; - //NoiseIndev *noise_biome; + NoiseIndev *noiseindev_biome; //NoiseIndevParams *np_cave; + NoiseIndev *noiseindev_float_islands1; + NoiseIndev *noiseindev_float_islands2; + NoiseIndev *noiseindev_float_islands3; MapgenIndev(int mapgenid, MapgenIndevParams *params); ~MapgenIndev(); @@ -119,6 +134,9 @@ class MapgenIndev : public MapgenV6 { float baseTerrainLevelFromMap(int index); float getMudAmount(int index); void defineCave(Cave & cave, PseudoRandom ps, v3s16 node_min, bool large_cave); + void generateSomething(); + + void generateFloatIslands(int min_y); }; struct MapgenFactoryIndev : public MapgenFactoryV6 { @@ -131,5 +149,4 @@ struct MapgenFactoryIndev : public MapgenFactoryV6 { }; }; - #endif diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index 59a4d49fc..1efa3ad74 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -422,6 +422,8 @@ void MapgenV6::makeChunk(BlockMakeData *data) { // Generate general ground level to full area stone_surface_max_y = generateGround(); + generateSomething(); + const s16 max_spread_amount = MAP_BLOCKSIZE; // Limit dirt flow area by 1 because mud is flown into neighbors. s16 mudflow_minpos = -max_spread_amount + 1; diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index 5b3ea9d27..89a3324cd 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -167,6 +167,7 @@ public: virtual void defineCave(Cave &cave, PseudoRandom ps, v3s16 node_min, bool large_cave); void generateCaves(int max_stone_y); + virtual void generateSomething() {}; //for next mapgen }; struct MapgenFactoryV6 : public MapgenFactory { -- cgit v1.2.3 From 57cbb8bfd8daaa1b8b1aa876723ff6355d21f7fc Mon Sep 17 00:00:00 2001 From: kwolekr Date: Sun, 24 Mar 2013 01:43:38 -0400 Subject: Add Ore infrastructure and l_register_ore() --- src/emerge.h | 3 +- src/mapgen.cpp | 134 ++++++++++++++++++++++++++++++++++++++++++++++++ src/mapgen.h | 43 ++++++++++++++++ src/mapgen_indev.cpp | 4 +- src/mapgen_indev.h | 4 +- src/mapgen_v6.cpp | 14 +++-- src/mapgen_v6.h | 6 ++- src/scriptapi.cpp | 46 ++++++++++++++++- src/scriptapi_noise.cpp | 2 + src/server.cpp | 9 ++-- 10 files changed, 248 insertions(+), 17 deletions(-) (limited to 'src/mapgen_indev.h') diff --git a/src/emerge.h b/src/emerge.h index 70b67e731..3d717bce3 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -63,8 +63,9 @@ public: std::map blocks_enqueued; std::map peer_queue_count; - //biome manager + //Mapgen-related structures BiomeDefManager *biomedef; + std::vector ores; EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef); ~EmergeManager(); diff --git a/src/mapgen.cpp b/src/mapgen.cpp index dc6dab6bb..53b5d6867 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -49,6 +49,140 @@ FlagDesc flagdesc_mapgen[] = { /////////////////////////////////////////////////////////////////////////////// +Ore *createOre(OreType type) { + switch (type) { + case ORE_SCATTER: + return new OreScatter; + case ORE_SHEET: + return new OreSheet; + //case ORE_CLAYLIKE: //TODO: implement this! + // return new OreClaylike; + default: + return NULL; + } +} + + +void Ore::resolveNodeNames(INodeDefManager *ndef) { + if (ore == CONTENT_IGNORE) { + ore = ndef->getId(ore_name); + if (ore == CONTENT_IGNORE) { + errorstream << "Ore::resolveNodeNames: ore node '" + << ore_name << "' not defined"; + ore = CONTENT_AIR; + wherein = CONTENT_AIR; + } + } + + if (wherein == CONTENT_IGNORE) { + wherein = ndef->getId(wherein_name); + if (wherein == CONTENT_IGNORE) { + errorstream << "Ore::resolveNodeNames: wherein node '" + << wherein_name << "' not defined"; + ore = CONTENT_AIR; + wherein = CONTENT_AIR; + } + } +} + + +void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) { + if (nmin.Y > height_max || nmax.Y < height_min) + return; + + resolveNodeNames(mg->ndef); + + MapNode n_ore(ore); + ManualMapVoxelManipulator *vm = mg->vm; + PseudoRandom pr(blockseed); + + int ymin = MYMAX(nmin.Y, height_min); + int ymax = MYMIN(nmax.Y, height_max); + if (clust_size >= ymax - ymin + 1) + return; + + int volume = (nmax.X - nmin.X + 1) * + (nmax.Y - nmin.Y + 1) * + (nmax.Z - nmin.Z + 1); + int csize = clust_size; + int orechance = (csize * csize * csize) / clust_num_ores; + int nclusters = volume / clust_scarcity; + + for (int i = 0; i != nclusters; i++) { + int x0 = pr.range(nmin.X, nmax.X - csize + 1); + int y0 = pr.range(ymin, ymax - csize + 1); + int z0 = pr.range(nmin.Z, nmax.Z - csize + 1); + + if (np && (NoisePerlin3D(np, x0, y0, z0, mg->seed) < nthresh)) + continue; + + for (int z1 = 0; z1 != csize; z1++) + for (int y1 = 0; y1 != csize; y1++) + for (int x1 = 0; x1 != csize; x1++) { + if (pr.range(1, orechance) != 1) + continue; + + u32 i = vm->m_area.index(x0 + x1, y0 + y1, z0 + z1); + if (vm->m_data[i].getContent() == wherein) + vm->m_data[i] = n_ore; + } + } +} + + +void OreSheet::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) { + if (nmin.Y > height_max || nmax.Y < height_min) + return; + + resolveNodeNames(mg->ndef); + + MapNode n_ore(ore); + ManualMapVoxelManipulator *vm = mg->vm; + PseudoRandom pr(blockseed + 4234); + + int ymin = MYMAX(nmin.Y, height_min); + int ymax = MYMIN(nmax.Y, height_max); + + int x0 = nmin.X; + int z0 = nmin.Z; + + int x1 = nmax.X; + int z1 = nmax.Z; + + int max_height = clust_size; + + int y_start = pr.range(ymin, ymax - max_height); + + if (!noise) { + int sx = nmax.X - nmin.X + 1; + int sz = nmax.Z - nmin.Z + 1; + noise = new Noise(np, 0, sx, sz); + } + noise->seed = mg->seed + y_start; + noise->perlinMap2D(x0, z0); + + int index = 0; + for (int z = z0; z != z1; z++) + for (int x = x0; x != x1; x++) { + + if (noise->result[index++] < nthresh) + continue; + + int height = max_height * (1. / pr.range(1, 3)); + int y0 = y_start + pr.range(1, 3) - 1; + int y1 = y0 + height; + for (int y = y0; y != y1; y++) { + u32 i = vm->m_area.index(x, y, z); + if (!vm->m_area.contains(i)) + continue; + + if (vm->m_data[i].getContent() == wherein) + vm->m_data[i] = n_ore; + } + } +} + + void Mapgen::updateLiquid(UniqueQueue *trans_liquid, v3s16 nmin, v3s16 nmax) { bool isliquid, wasliquid; v3s16 em = vm->m_area.getExtent(); diff --git a/src/mapgen.h b/src/mapgen.h index 2e917a3aa..a900985da 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -97,5 +97,48 @@ struct MapgenFactory { virtual MapgenParams *createMapgenParams() = 0; }; +enum OreType { + ORE_SCATTER, + ORE_SHEET, + ORE_CLAYLIKE +}; + +class Ore { +public: + std::string ore_name; + std::string wherein_name; + + content_t ore; + content_t wherein; // the node to be replaced + s16 clust_scarcity; // + s16 clust_num_ores; // how many ore nodes are in a chunk + s16 clust_size; // how large (in nodes) a chunk of ore is + s16 height_min; + s16 height_max; + float nthresh; // threshhold for noise at which an ore is placed + NoiseParams *np; // noise for distribution of clusters (NULL for uniform scattering) + Noise *noise; + + Ore() { + ore = CONTENT_IGNORE; + wherein = CONTENT_IGNORE; + np = NULL; + noise = NULL; + } + + void resolveNodeNames(INodeDefManager *ndef); + virtual void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) = 0; +}; + +class OreScatter : public Ore { + void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); +}; + +class OreSheet : public Ore { + void generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax); +}; + +Ore *createOre(OreType type); + #endif diff --git a/src/mapgen_indev.cpp b/src/mapgen_indev.cpp index 6956fc63f..5d455827a 100644 --- a/src/mapgen_indev.cpp +++ b/src/mapgen_indev.cpp @@ -80,7 +80,9 @@ void NoiseIndev::transformNoiseMapFarScale(float xx, float yy, float zz) { } } -MapgenIndev::MapgenIndev(int mapgenid, MapgenIndevParams *params) : MapgenV6(mapgenid, params) { +MapgenIndev::MapgenIndev(int mapgenid, MapgenIndevParams *params, EmergeManager *emerge) + : MapgenV6(mapgenid, params, emerge) +{ noiseindev_terrain_base = new NoiseIndev(params->npindev_terrain_base, seed, csize.X, csize.Z); noiseindev_terrain_higher = new NoiseIndev(params->npindev_terrain_higher, seed, csize.X, csize.Z); noiseindev_steepness = new NoiseIndev(params->npindev_steepness, seed, csize.X, csize.Z); diff --git a/src/mapgen_indev.h b/src/mapgen_indev.h index 7ce65dfe3..fdac1ba20 100644 --- a/src/mapgen_indev.h +++ b/src/mapgen_indev.h @@ -126,7 +126,7 @@ class MapgenIndev : public MapgenV6 { NoiseIndev *noiseindev_float_islands2; NoiseIndev *noiseindev_float_islands3; - MapgenIndev(int mapgenid, MapgenIndevParams *params); + MapgenIndev(int mapgenid, MapgenIndevParams *params, EmergeManager *emerge); ~MapgenIndev(); void calculateNoise(); @@ -141,7 +141,7 @@ class MapgenIndev : public MapgenV6 { struct MapgenFactoryIndev : public MapgenFactoryV6 { Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) { - return new MapgenIndev(mgid, (MapgenIndevParams *)params); + return new MapgenIndev(mgid, (MapgenIndevParams *)params, emerge); }; MapgenParams *createMapgenParams() { diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp index 1efa3ad74..0b419617d 100644 --- a/src/mapgen_v6.cpp +++ b/src/mapgen_v6.cpp @@ -64,9 +64,10 @@ NoiseParams nparams_v6_def_apple_trees = /////////////////////////////////////////////////////////////////////////////// -MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params) { +MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge) { this->generating = false; this->id = mapgenid; + this->emerge = emerge; this->seed = (int)params->seed; this->water_level = params->water_level; @@ -463,6 +464,12 @@ void MapgenV6::makeChunk(BlockMakeData *data) { if (flags & MG_TREES) placeTreesAndJungleGrass(); + // Generate the registered ores + for (unsigned int i = 0; i != emerge->ores.size(); i++) { + Ore *ore = emerge->ores[i]; + ore->generate(this, blockseed + i, node_min, node_max); + } + // Calculate lighting calcLighting(node_min, node_max); @@ -494,14 +501,13 @@ void MapgenV6::calculateNoise() { noise_height_select->perlinMap2D( x + 0.5 * noise_height_select->np->spread.X, z + 0.5 * noise_height_select->np->spread.Z); - } - - if (!(flags & MG_FLAT)) { + noise_mud->perlinMap2D( x + 0.5 * noise_mud->np->spread.X, z + 0.5 * noise_mud->np->spread.Z); noise_mud->transformNoiseMap(); } + noise_beach->perlinMap2D( x + 0.2 * noise_beach->np->spread.X, z + 0.7 * noise_beach->np->spread.Z); diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h index 89a3324cd..d37e406cb 100644 --- a/src/mapgen_v6.h +++ b/src/mapgen_v6.h @@ -91,6 +91,8 @@ struct MapgenV6Params : public MapgenParams { class MapgenV6 : public Mapgen { public: + EmergeManager *emerge; + int ystride; v3s16 csize; u32 flags; @@ -128,7 +130,7 @@ public: content_t c_desert_sand; content_t c_desert_stone; - MapgenV6(int mapgenid, MapgenV6Params *params); + MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge); ~MapgenV6(); void makeChunk(BlockMakeData *data); @@ -172,7 +174,7 @@ public: struct MapgenFactoryV6 : public MapgenFactory { Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) { - return new MapgenV6(mgid, (MapgenV6Params *)params); + return new MapgenV6(mgid, (MapgenV6Params *)params, emerge); }; MapgenParams *createMapgenParams() { diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 29494ff69..ddffbb0b7 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -30,6 +30,7 @@ extern "C" { #include "settings.h" // For accessing g_settings #include "main.h" // For g_settings #include "biome.h" +#include "emerge.h" #include "script.h" #include "rollback.h" @@ -242,6 +243,14 @@ struct EnumString es_BiomeTerrainType[] = {0, NULL}, }; +struct EnumString es_OreType[] = +{ + {ORE_SCATTER, "scatter"}, + {ORE_SHEET, "sheet"}, + {ORE_CLAYLIKE, "claylike"}, + {0, NULL}, +}; + /*****************************************************************************/ /* Parameters */ /*****************************************************************************/ @@ -612,8 +621,6 @@ static int l_register_biome_groups(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); int index = 1; - if (!lua_istable(L, index)) - throw LuaError(L, "register_biome_groups: parameter is not a table"); BiomeDefManager *bmgr = get_server(L)->getBiomeDef(); if (!bmgr) { @@ -686,6 +693,40 @@ static int l_register_biome(lua_State *L) } +static int l_register_ore(lua_State *L) +{ + int index = 1; + luaL_checktype(L, index, LUA_TTABLE); + + IWritableNodeDefManager *ndef = get_server(L)->getWritableNodeDefManager(); + EmergeManager *emerge = get_server(L)->getEmergeManager(); + + enum OreType oretype = (OreType)getenumfield(L, index, + "ore_type", es_OreType, ORE_SCATTER); + Ore *ore = createOre(oretype); + + ore->ore_name = getstringfield_default(L, index, "ore", ""); + ore->wherein_name = getstringfield_default(L, index, "wherein", ""); + ore->clust_scarcity = getintfield_default(L, index, "clust_scarcity", 0); + ore->clust_num_ores = getintfield_default(L, index, "clust_num_ores", 0); + ore->clust_size = getintfield_default(L, index, "clust_size", 0); + ore->height_min = getintfield_default(L, index, "height_min", 0); + ore->height_max = getintfield_default(L, index, "height_max", 0); + ore->nthresh = getfloatfield_default(L, index, "noise_threshhold", 0.); + + lua_getfield(L, index, "noise_params"); + ore->np = read_noiseparams(L, -1); + lua_pop(L, 1); + + ore->noise = NULL; + + emerge->ores.push_back(ore); + + verbosestream << "register_ore: ore '" << ore->ore_name + << "' registered" << std::endl; + return 0; +} + // setting_set(name, value) static int l_setting_set(lua_State *L) @@ -1060,6 +1101,7 @@ static const struct luaL_Reg minetest_f [] = { {"register_craft", l_register_craft}, {"register_biome", l_register_biome}, {"register_biome_groups", l_register_biome_groups}, + {"register_ore", l_register_ore}, {"setting_set", l_setting_set}, {"setting_get", l_setting_get}, {"setting_getbool", l_setting_getbool}, diff --git a/src/scriptapi_noise.cpp b/src/scriptapi_noise.cpp index 1dd6ef8e0..2c1a83c4c 100644 --- a/src/scriptapi_noise.cpp +++ b/src/scriptapi_noise.cpp @@ -269,6 +269,7 @@ NoiseParams *read_noiseparams(lua_State *L, int index) np->scale = getfloatfield_default(L, index, "scale", 0.0); lua_getfield(L, index, "spread"); np->spread = read_v3f(L, -1); + lua_pop(L, 1); np->seed = getintfield_default(L, index, "seed", 0); np->octaves = getintfield_default(L, index, "octaves", 0); np->persist = getfloatfield_default(L, index, "persist", 0.0); @@ -276,6 +277,7 @@ NoiseParams *read_noiseparams(lua_State *L, int index) return np; } + /* LuaPseudoRandom */ diff --git a/src/server.cpp b/src/server.cpp index 644f89349..db05b95cc 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -653,7 +653,6 @@ Server::Server( m_craftdef(createCraftDefManager()), m_event(new EventManager()), m_thread(this), - //m_emergethread(this), m_time_of_day_send_timer(0), m_uptime(0), m_shutdown_requested(false), @@ -698,7 +697,10 @@ Server::Server( // Create biome definition manager m_biomedef = new BiomeDefManager(this); - + + // Create emerge manager + m_emerge = new EmergeManager(this, m_biomedef); + // Create rollback manager std::string rollback_path = m_path_world+DIR_DELIM+"rollback.txt"; m_rollback = createRollbackManager(rollback_path, this); @@ -814,9 +816,6 @@ Server::Server( // Add default biomes after nodedef had its aliases added m_biomedef->addDefaultBiomes(); - // Create emerge manager - m_emerge = new EmergeManager(this, m_biomedef); - // Initialize Environment ServerMap *servermap = new ServerMap(path_world, this, m_emerge); m_env = new ServerEnvironment(servermap, m_lua, this, this); -- cgit v1.2.3