forked from Mirrorlandia_minetest/minetest
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("water_level", "1");
|
||||
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_beach", "0.15");
|
||||
|
||||
|
@ -3078,14 +3078,7 @@ void ServerMap::saveMapMeta()
|
||||
|
||||
Settings params;
|
||||
|
||||
params.set("mg_name", m_emerge->params->mg_name);
|
||||
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);
|
||||
|
||||
m_emerge->setParamsToSettings(¶ms);
|
||||
params.writeLines(os);
|
||||
|
||||
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 "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 ////////////////////////////////
|
||||
@ -149,7 +158,7 @@ MapgenParams *EmergeManager::getParamsFromSettings(Settings *settings) {
|
||||
mgparams->seed = settings->getU64(settings == g_settings ? "fixed_map_seed" : "seed");
|
||||
mgparams->water_level = settings->getS16("water_level");
|
||||
mgparams->chunksize = settings->getS16("chunksize");
|
||||
mgparams->flags = settings->getS32("mg_flags");
|
||||
mgparams->flags = settings->getFlagStr("mg_flags", flagdesc_mapgen);
|
||||
|
||||
if (!mgparams->readParams(settings)) {
|
||||
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) {
|
||||
mglist.insert(std::make_pair(mgname, mgfactory));
|
||||
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 MGV6_FORESTS 0x08
|
||||
#define MGV6_BIOME_BLEND 0x10
|
||||
#define MG_FLAT 0x20
|
||||
|
||||
class BiomeDefManager;
|
||||
class Biome;
|
||||
@ -123,6 +124,7 @@ public:
|
||||
|
||||
bool registerMapgen(std::string name, MapgenFactory *mgfactory);
|
||||
MapgenParams *getParamsFromSettings(Settings *settings);
|
||||
void setParamsToSettings(Settings *settings);
|
||||
|
||||
//mapgen helper methods
|
||||
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)
|
||||
{
|
||||
if (flags & MG_FLAT)
|
||||
return water_level;
|
||||
|
||||
int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X);
|
||||
|
||||
// The base ground level
|
||||
@ -333,6 +336,9 @@ double MapgenV6::base_rock_level_2d(u64 seed, v2s16 p)
|
||||
}
|
||||
|
||||
double MapgenV6::baseRockLevelFromNoise(v2s16 p) {
|
||||
if (flags & MG_FLAT)
|
||||
return water_level;
|
||||
|
||||
double base = water_level +
|
||||
NoisePerlin2DPosOffset(noise_terrain_base->np, p.X, 0.5, p.Y, 0.5, seed);
|
||||
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)
|
||||
{
|
||||
if (flags & MG_FLAT)
|
||||
return AVERAGE_MUD_AMOUNT;
|
||||
|
||||
/*return ((float)AVERAGE_MUD_AMOUNT + 2.0 * noise2d_perlin(
|
||||
0.5+(float)p.X/200, 0.5+(float)p.Y/200,
|
||||
seed+91013, 3, 0.55));*/
|
||||
@ -491,6 +500,7 @@ void MapgenV6::makeChunk(BlockMakeData *data)
|
||||
int z = node_min.Z;
|
||||
|
||||
// Need to adjust for the original implementation's +.5 offset...
|
||||
if (!(flags & MG_FLAT)) {
|
||||
noise_terrain_base->perlinMap2D(
|
||||
x + 0.5 * noise_terrain_base->np->spread.X,
|
||||
z + 0.5 * noise_terrain_base->np->spread.Z);
|
||||
@ -509,16 +519,18 @@ void MapgenV6::makeChunk(BlockMakeData *data)
|
||||
noise_height_select->perlinMap2D(
|
||||
x + 0.5 * noise_height_select->np->spread.X,
|
||||
z + 0.5 * noise_height_select->np->spread.Z);
|
||||
}
|
||||
|
||||
noise_trees->perlinMap2D(
|
||||
x + 0.5 * noise_trees->np->spread.X,
|
||||
z + 0.5 * noise_trees->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);
|
||||
|
@ -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 strtoll(x, y, z) _strtoi64(x, y, z)
|
||||
#define strtoull(x, y, z) _strtoui64(x, y, z)
|
||||
#define strcasecmp(x, y) stricmp(x, y)
|
||||
#else
|
||||
#define ALIGNOF(x) __alignof__(x)
|
||||
#endif
|
||||
|
@ -569,6 +569,12 @@ public:
|
||||
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)
|
||||
{
|
||||
size_t len = sizeof(T);
|
||||
@ -832,6 +838,11 @@ fail:
|
||||
return true;
|
||||
}
|
||||
|
||||
void setFlagStr(std::string name, u32 flags, FlagDesc *flagdesc)
|
||||
{
|
||||
set(name, writeFlagString(flags, flagdesc));
|
||||
}
|
||||
|
||||
void setBool(std::string name, bool value)
|
||||
{
|
||||
if(value)
|
||||
|
@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
|
||||
#include "../sha1.h"
|
||||
#include "../base64.h"
|
||||
#include "../porting.h"
|
||||
|
||||
// Get an sha-1 hash of the player's name combined with
|
||||
// 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;
|
||||
}
|
||||
|
||||
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 *t;
|
||||
|
||||
|
@ -28,6 +28,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
|
||||
struct FlagDesc {
|
||||
const char *name;
|
||||
u32 flag;
|
||||
};
|
||||
|
||||
static inline std::string padStringRight(std::string s, size_t len)
|
||||
{
|
||||
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);
|
||||
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);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user