mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
Add flag string settings, flat map option
This commit is contained in:
parent
f148ae58c3
commit
97260d09a8
@ -177,7 +177,7 @@ void set_default_settings(Settings *settings)
|
|||||||
settings->setDefault("mg_name", "v6");
|
settings->setDefault("mg_name", "v6");
|
||||||
settings->setDefault("water_level", "1");
|
settings->setDefault("water_level", "1");
|
||||||
settings->setDefault("chunksize", "5");
|
settings->setDefault("chunksize", "5");
|
||||||
settings->setDefault("mg_flags", "19");
|
settings->setDefault("mg_flags", "trees, caves, v6_biome_blend");
|
||||||
settings->setDefault("mgv6_freq_desert", "0.45");
|
settings->setDefault("mgv6_freq_desert", "0.45");
|
||||||
settings->setDefault("mgv6_freq_beach", "0.15");
|
settings->setDefault("mgv6_freq_beach", "0.15");
|
||||||
|
|
||||||
|
@ -3078,14 +3078,7 @@ void ServerMap::saveMapMeta()
|
|||||||
|
|
||||||
Settings params;
|
Settings params;
|
||||||
|
|
||||||
params.set("mg_name", m_emerge->params->mg_name);
|
m_emerge->setParamsToSettings(¶ms);
|
||||||
params.setU64("seed", m_emerge->params->seed);
|
|
||||||
params.setS16("water_level", m_emerge->params->water_level);
|
|
||||||
params.setS16("chunksize", m_emerge->params->chunksize);
|
|
||||||
params.setS32("mg_flags", m_emerge->params->flags);
|
|
||||||
|
|
||||||
m_emerge->params->writeParams(¶ms);
|
|
||||||
|
|
||||||
params.writeLines(os);
|
params.writeLines(os);
|
||||||
|
|
||||||
os<<"[end_of_params]\n";
|
os<<"[end_of_params]\n";
|
||||||
|
@ -35,6 +35,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "treegen.h"
|
#include "treegen.h"
|
||||||
#include "mapgen_v6.h"
|
#include "mapgen_v6.h"
|
||||||
|
|
||||||
|
FlagDesc flagdesc_mapgen[] = {
|
||||||
|
{"trees", MG_TREES},
|
||||||
|
{"caves", MG_CAVES},
|
||||||
|
{"dungeons", MG_DUNGEONS},
|
||||||
|
{"v6_forests", MGV6_FORESTS},
|
||||||
|
{"v6_biome_blend", MGV6_BIOME_BLEND},
|
||||||
|
{"flat", MG_FLAT},
|
||||||
|
{NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
/////////////////////////////// Emerge Manager ////////////////////////////////
|
/////////////////////////////// Emerge Manager ////////////////////////////////
|
||||||
@ -149,7 +158,7 @@ MapgenParams *EmergeManager::getParamsFromSettings(Settings *settings) {
|
|||||||
mgparams->seed = settings->getU64(settings == g_settings ? "fixed_map_seed" : "seed");
|
mgparams->seed = settings->getU64(settings == g_settings ? "fixed_map_seed" : "seed");
|
||||||
mgparams->water_level = settings->getS16("water_level");
|
mgparams->water_level = settings->getS16("water_level");
|
||||||
mgparams->chunksize = settings->getS16("chunksize");
|
mgparams->chunksize = settings->getS16("chunksize");
|
||||||
mgparams->flags = settings->getS32("mg_flags");
|
mgparams->flags = settings->getFlagStr("mg_flags", flagdesc_mapgen);
|
||||||
|
|
||||||
if (!mgparams->readParams(settings)) {
|
if (!mgparams->readParams(settings)) {
|
||||||
delete mgparams;
|
delete mgparams;
|
||||||
@ -159,6 +168,17 @@ MapgenParams *EmergeManager::getParamsFromSettings(Settings *settings) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EmergeManager::setParamsToSettings(Settings *settings) {
|
||||||
|
settings->set("mg_name", params->mg_name);
|
||||||
|
settings->setU64("seed", params->seed);
|
||||||
|
settings->setS16("water_level", params->water_level);
|
||||||
|
settings->setS16("chunksize", params->chunksize);
|
||||||
|
settings->setFlagStr("mg_flags", params->flags, flagdesc_mapgen);
|
||||||
|
|
||||||
|
params->writeParams(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool EmergeManager::registerMapgen(std::string mgname, MapgenFactory *mgfactory) {
|
bool EmergeManager::registerMapgen(std::string mgname, MapgenFactory *mgfactory) {
|
||||||
mglist.insert(std::make_pair(mgname, mgfactory));
|
mglist.insert(std::make_pair(mgname, mgfactory));
|
||||||
infostream << "EmergeManager: registered mapgen " << mgname << std::endl;
|
infostream << "EmergeManager: registered mapgen " << mgname << std::endl;
|
||||||
|
@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#define MG_DUNGEONS 0x04
|
#define MG_DUNGEONS 0x04
|
||||||
#define MGV6_FORESTS 0x08
|
#define MGV6_FORESTS 0x08
|
||||||
#define MGV6_BIOME_BLEND 0x10
|
#define MGV6_BIOME_BLEND 0x10
|
||||||
|
#define MG_FLAT 0x20
|
||||||
|
|
||||||
class BiomeDefManager;
|
class BiomeDefManager;
|
||||||
class Biome;
|
class Biome;
|
||||||
@ -123,6 +124,7 @@ public:
|
|||||||
|
|
||||||
bool registerMapgen(std::string name, MapgenFactory *mgfactory);
|
bool registerMapgen(std::string name, MapgenFactory *mgfactory);
|
||||||
MapgenParams *getParamsFromSettings(Settings *settings);
|
MapgenParams *getParamsFromSettings(Settings *settings);
|
||||||
|
void setParamsToSettings(Settings *settings);
|
||||||
|
|
||||||
//mapgen helper methods
|
//mapgen helper methods
|
||||||
Biome *getBiomeAtPoint(v3s16 p);
|
Biome *getBiomeAtPoint(v3s16 p);
|
||||||
|
@ -278,6 +278,9 @@ bool MapgenV6::block_is_underground(u64 seed, v3s16 blockpos)
|
|||||||
|
|
||||||
double MapgenV6::base_rock_level_2d(u64 seed, v2s16 p)
|
double MapgenV6::base_rock_level_2d(u64 seed, v2s16 p)
|
||||||
{
|
{
|
||||||
|
if (flags & MG_FLAT)
|
||||||
|
return water_level;
|
||||||
|
|
||||||
int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X);
|
int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X);
|
||||||
|
|
||||||
// The base ground level
|
// The base ground level
|
||||||
@ -333,6 +336,9 @@ double MapgenV6::base_rock_level_2d(u64 seed, v2s16 p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
double MapgenV6::baseRockLevelFromNoise(v2s16 p) {
|
double MapgenV6::baseRockLevelFromNoise(v2s16 p) {
|
||||||
|
if (flags & MG_FLAT)
|
||||||
|
return water_level;
|
||||||
|
|
||||||
double base = water_level +
|
double base = water_level +
|
||||||
NoisePerlin2DPosOffset(noise_terrain_base->np, p.X, 0.5, p.Y, 0.5, seed);
|
NoisePerlin2DPosOffset(noise_terrain_base->np, p.X, 0.5, p.Y, 0.5, seed);
|
||||||
double higher = water_level +
|
double higher = water_level +
|
||||||
@ -370,6 +376,9 @@ s16 MapgenV6::find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision)
|
|||||||
|
|
||||||
double MapgenV6::get_mud_add_amount(u64 seed, v2s16 p)
|
double MapgenV6::get_mud_add_amount(u64 seed, v2s16 p)
|
||||||
{
|
{
|
||||||
|
if (flags & MG_FLAT)
|
||||||
|
return AVERAGE_MUD_AMOUNT;
|
||||||
|
|
||||||
/*return ((float)AVERAGE_MUD_AMOUNT + 2.0 * noise2d_perlin(
|
/*return ((float)AVERAGE_MUD_AMOUNT + 2.0 * noise2d_perlin(
|
||||||
0.5+(float)p.X/200, 0.5+(float)p.Y/200,
|
0.5+(float)p.X/200, 0.5+(float)p.Y/200,
|
||||||
seed+91013, 3, 0.55));*/
|
seed+91013, 3, 0.55));*/
|
||||||
@ -491,6 +500,7 @@ void MapgenV6::makeChunk(BlockMakeData *data)
|
|||||||
int z = node_min.Z;
|
int z = node_min.Z;
|
||||||
|
|
||||||
// Need to adjust for the original implementation's +.5 offset...
|
// Need to adjust for the original implementation's +.5 offset...
|
||||||
|
if (!(flags & MG_FLAT)) {
|
||||||
noise_terrain_base->perlinMap2D(
|
noise_terrain_base->perlinMap2D(
|
||||||
x + 0.5 * noise_terrain_base->np->spread.X,
|
x + 0.5 * noise_terrain_base->np->spread.X,
|
||||||
z + 0.5 * noise_terrain_base->np->spread.Z);
|
z + 0.5 * noise_terrain_base->np->spread.Z);
|
||||||
@ -509,16 +519,18 @@ void MapgenV6::makeChunk(BlockMakeData *data)
|
|||||||
noise_height_select->perlinMap2D(
|
noise_height_select->perlinMap2D(
|
||||||
x + 0.5 * noise_height_select->np->spread.X,
|
x + 0.5 * noise_height_select->np->spread.X,
|
||||||
z + 0.5 * noise_height_select->np->spread.Z);
|
z + 0.5 * noise_height_select->np->spread.Z);
|
||||||
|
}
|
||||||
|
|
||||||
noise_trees->perlinMap2D(
|
noise_trees->perlinMap2D(
|
||||||
x + 0.5 * noise_trees->np->spread.X,
|
x + 0.5 * noise_trees->np->spread.X,
|
||||||
z + 0.5 * noise_trees->np->spread.Z);
|
z + 0.5 * noise_trees->np->spread.Z);
|
||||||
|
|
||||||
|
if (!(flags & MG_FLAT)) {
|
||||||
noise_mud->perlinMap2D(
|
noise_mud->perlinMap2D(
|
||||||
x + 0.5 * noise_mud->np->spread.X,
|
x + 0.5 * noise_mud->np->spread.X,
|
||||||
z + 0.5 * noise_mud->np->spread.Z);
|
z + 0.5 * noise_mud->np->spread.Z);
|
||||||
noise_mud->transformNoiseMap();
|
noise_mud->transformNoiseMap();
|
||||||
|
}
|
||||||
noise_beach->perlinMap2D(
|
noise_beach->perlinMap2D(
|
||||||
x + 0.2 * noise_beach->np->spread.X,
|
x + 0.2 * noise_beach->np->spread.X,
|
||||||
z + 0.7 * noise_beach->np->spread.Z);
|
z + 0.7 * noise_beach->np->spread.Z);
|
||||||
|
@ -56,6 +56,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#define strtof(x, y) (float)strtod(x, y)
|
#define strtof(x, y) (float)strtod(x, y)
|
||||||
#define strtoll(x, y, z) _strtoi64(x, y, z)
|
#define strtoll(x, y, z) _strtoi64(x, y, z)
|
||||||
#define strtoull(x, y, z) _strtoui64(x, y, z)
|
#define strtoull(x, y, z) _strtoui64(x, y, z)
|
||||||
|
#define strcasecmp(x, y) stricmp(x, y)
|
||||||
#else
|
#else
|
||||||
#define ALIGNOF(x) __alignof__(x)
|
#define ALIGNOF(x) __alignof__(x)
|
||||||
#endif
|
#endif
|
||||||
|
@ -569,6 +569,12 @@ public:
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 getFlagStr(std::string name, FlagDesc *flagdesc)
|
||||||
|
{
|
||||||
|
std::string val = get(name);
|
||||||
|
return (isdigit(val[0])) ? stoi(val) : readFlagString(val, flagdesc);
|
||||||
|
}
|
||||||
|
|
||||||
template <class T> T *getStruct(std::string name, std::string format)
|
template <class T> T *getStruct(std::string name, std::string format)
|
||||||
{
|
{
|
||||||
size_t len = sizeof(T);
|
size_t len = sizeof(T);
|
||||||
@ -832,6 +838,11 @@ fail:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setFlagStr(std::string name, u32 flags, FlagDesc *flagdesc)
|
||||||
|
{
|
||||||
|
set(name, writeFlagString(flags, flagdesc));
|
||||||
|
}
|
||||||
|
|
||||||
void setBool(std::string name, bool value)
|
void setBool(std::string name, bool value)
|
||||||
{
|
{
|
||||||
if(value)
|
if(value)
|
||||||
|
@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
|
|
||||||
#include "../sha1.h"
|
#include "../sha1.h"
|
||||||
#include "../base64.h"
|
#include "../base64.h"
|
||||||
|
#include "../porting.h"
|
||||||
|
|
||||||
// Get an sha-1 hash of the player's name combined with
|
// Get an sha-1 hash of the player's name combined with
|
||||||
// the password entered. That's what the server uses as
|
// the password entered. That's what the server uses as
|
||||||
@ -48,6 +49,45 @@ size_t curl_write_data(char *ptr, size_t size, size_t nmemb, void *userdata) {
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 readFlagString(std::string str, FlagDesc *flagdesc) {
|
||||||
|
u32 result = 0;
|
||||||
|
char *s = &str[0];
|
||||||
|
char *flagstr, *strpos = NULL;
|
||||||
|
|
||||||
|
while ((flagstr = strtok_r(s, ",", &strpos))) {
|
||||||
|
s = NULL;
|
||||||
|
|
||||||
|
while (*flagstr == ' ' || *flagstr == '\t')
|
||||||
|
flagstr++;
|
||||||
|
|
||||||
|
for (int i = 0; flagdesc[i].name; i++) {
|
||||||
|
if (!strcasecmp(flagstr, flagdesc[i].name)) {
|
||||||
|
result |= flagdesc[i].flag;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string writeFlagString(u32 flags, FlagDesc *flagdesc) {
|
||||||
|
std::string result;
|
||||||
|
|
||||||
|
for (int i = 0; flagdesc[i].name; i++) {
|
||||||
|
if (flags & flagdesc[i].flag) {
|
||||||
|
result += flagdesc[i].name;
|
||||||
|
result += ", ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t len = result.length();
|
||||||
|
if (len >= 2)
|
||||||
|
result.erase(len - 2, 2);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
char *mystrtok_r(char *s, const char *sep, char **lasts) {
|
char *mystrtok_r(char *s, const char *sep, char **lasts) {
|
||||||
char *t;
|
char *t;
|
||||||
|
|
||||||
|
@ -28,6 +28,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
struct FlagDesc {
|
||||||
|
const char *name;
|
||||||
|
u32 flag;
|
||||||
|
};
|
||||||
|
|
||||||
static inline std::string padStringRight(std::string s, size_t len)
|
static inline std::string padStringRight(std::string s, size_t len)
|
||||||
{
|
{
|
||||||
if(len > s.size())
|
if(len > s.size())
|
||||||
@ -283,6 +288,8 @@ inline std::string wrap_rows(const std::string &from, u32 rowlen)
|
|||||||
|
|
||||||
std::string translatePassword(std::string playername, std::wstring password);
|
std::string translatePassword(std::string playername, std::wstring password);
|
||||||
size_t curl_write_data(char *ptr, size_t size, size_t nmemb, void *userdata);
|
size_t curl_write_data(char *ptr, size_t size, size_t nmemb, void *userdata);
|
||||||
|
u32 readFlagString(std::string str, FlagDesc *flagdesc);
|
||||||
|
std::string writeFlagString(u32 flags, FlagDesc *flagdesc);
|
||||||
char *mystrtok_r(char *s, const char *sep, char **lasts);
|
char *mystrtok_r(char *s, const char *sep, char **lasts);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user