mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Add initial Decoration support, many misc. improvements & modifications
This commit is contained in:
parent
eccd1fdbed
commit
0a8519a26f
14 changed files with 658 additions and 86 deletions
|
@ -43,6 +43,14 @@ struct EnumString ModApiBasic::es_OreType[] =
|
|||
{0, NULL},
|
||||
};
|
||||
|
||||
struct EnumString ModApiBasic::es_DecorationType[] =
|
||||
{
|
||||
{DECO_SIMPLE, "simple"},
|
||||
{DECO_SCHEMATIC, "schematic"},
|
||||
{DECO_LSYSTEM, "lsystem"},
|
||||
{0, NULL},
|
||||
};
|
||||
|
||||
|
||||
ModApiBasic::ModApiBasic() : ModApiBase() {
|
||||
}
|
||||
|
@ -92,6 +100,7 @@ bool ModApiBasic::Initialize(lua_State* L,int top) {
|
|||
retval &= API_FCT(rollback_revert_actions_by);
|
||||
|
||||
retval &= API_FCT(register_ore);
|
||||
retval &= API_FCT(register_decoration);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -162,21 +171,21 @@ int ModApiBasic::l_register_biome(lua_State *L)
|
|||
}
|
||||
|
||||
enum BiomeTerrainType terrain = (BiomeTerrainType)getenumfield(L, index,
|
||||
"terrain_type", es_BiomeTerrainType, BIOME_TERRAIN_NORMAL);
|
||||
"terrain_type", es_BiomeTerrainType, BIOME_TERRAIN_NORMAL);
|
||||
Biome *b = bmgr->createBiome(terrain);
|
||||
|
||||
b->name = getstringfield_default(L, index, "name", "");
|
||||
b->top_nodename = getstringfield_default(L, index, "top_node", "");
|
||||
b->top_depth = getintfield_default(L, index, "top_depth", 0);
|
||||
b->name = getstringfield_default(L, index, "name", "");
|
||||
b->top_nodename = getstringfield_default(L, index, "top_node", "");
|
||||
b->top_depth = getintfield_default(L, index, "top_depth", 0);
|
||||
b->filler_nodename = getstringfield_default(L, index, "filler_node", "");
|
||||
b->filler_height = getintfield_default(L, index, "filler_height", 0);
|
||||
b->height_min = getintfield_default(L, index, "height_min", 0);
|
||||
b->height_max = getintfield_default(L, index, "height_max", 0);
|
||||
b->heat_point = getfloatfield_default(L, index, "heat_point", 0.);
|
||||
b->humidity_point = getfloatfield_default(L, index, "humidity_point", 0.);
|
||||
b->filler_height = getintfield_default(L, index, "filler_height", 0);
|
||||
b->height_min = getintfield_default(L, index, "height_min", 0);
|
||||
b->height_max = getintfield_default(L, index, "height_max", 0);
|
||||
b->heat_point = getfloatfield_default(L, index, "heat_point", 0.);
|
||||
b->humidity_point = getfloatfield_default(L, index, "humidity_point", 0.);
|
||||
|
||||
b->flags = 0; //reserved
|
||||
b->c_top = CONTENT_IGNORE;
|
||||
b->flags = 0; //reserved
|
||||
b->c_top = CONTENT_IGNORE;
|
||||
b->c_filler = CONTENT_IGNORE;
|
||||
verbosestream << "register_biome: " << b->name << std::endl;
|
||||
bmgr->addBiome(b);
|
||||
|
@ -184,8 +193,6 @@ int ModApiBasic::l_register_biome(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// setting_set(name, value)
|
||||
int ModApiBasic::l_setting_set(lua_State *L)
|
||||
{
|
||||
|
@ -650,4 +657,111 @@ int ModApiBasic::l_register_ore(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
// register_decoration({lots of stuff})
|
||||
int ModApiBasic::l_register_decoration(lua_State *L)
|
||||
{
|
||||
int index = 1;
|
||||
luaL_checktype(L, index, LUA_TTABLE);
|
||||
|
||||
EmergeManager *emerge = getServer(L)->getEmergeManager();
|
||||
BiomeDefManager *bdef = emerge->biomedef;
|
||||
|
||||
enum DecorationType decotype = (DecorationType)getenumfield(L, index,
|
||||
"deco_type", es_DecorationType, -1);
|
||||
if (decotype == -1) {
|
||||
errorstream << "register_decoration: unrecognized "
|
||||
"decoration placement type";
|
||||
return 0;
|
||||
}
|
||||
|
||||
Decoration *deco = createDecoration(decotype);
|
||||
if (!deco) {
|
||||
errorstream << "register_decoration: decoration placement type "
|
||||
<< decotype << " not implemented";
|
||||
return 0;
|
||||
}
|
||||
|
||||
deco->c_place_on = CONTENT_IGNORE;
|
||||
deco->place_on_name = getstringfield_default(L, index, "place_on", "ignore");
|
||||
deco->divlen = getintfield_default(L, index, "divlen", 8);
|
||||
deco->fill_ratio = getfloatfield_default(L, index, "fill_ratio", 0.02);
|
||||
|
||||
lua_getfield(L, index, "noise_params");
|
||||
deco->np = read_noiseparams(L, -1);
|
||||
lua_pop(L, 1);
|
||||
|
||||
lua_getfield(L, index, "biomes");
|
||||
if (lua_istable(L, -1)) {
|
||||
lua_pushnil(L);
|
||||
while (lua_next(L, -2)) {
|
||||
const char *s = lua_tostring(L, -1);
|
||||
u8 biomeid = bdef->getBiomeIdByName(s);
|
||||
if (biomeid)
|
||||
deco->biomes.insert(biomeid);
|
||||
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
switch (decotype) {
|
||||
case DECO_SIMPLE: {
|
||||
DecoSimple *dsimple = (DecoSimple *)deco;
|
||||
dsimple->c_deco = CONTENT_IGNORE;
|
||||
dsimple->c_spawnby = CONTENT_IGNORE;
|
||||
dsimple->spawnby_name = getstringfield_default(L, index, "spawn_by", "air");
|
||||
dsimple->deco_height = getintfield_default(L, index, "height", 1);
|
||||
dsimple->deco_height_max = getintfield_default(L, index, "height_max", 0);
|
||||
dsimple->nspawnby = getintfield_default(L, index, "num_spawn_by", -1);
|
||||
|
||||
lua_getfield(L, index, "decoration");
|
||||
if (lua_istable(L, -1)) {
|
||||
lua_pushnil(L);
|
||||
while (lua_next(L, -2)) {
|
||||
const char *s = lua_tostring(L, -1);
|
||||
std::string str(s);
|
||||
dsimple->decolist_names.push_back(str);
|
||||
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
} else if (lua_isstring(L, -1)) {
|
||||
dsimple->deco_name = std::string(lua_tostring(L, -1));
|
||||
} else {
|
||||
dsimple->deco_name = std::string("air");
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
|
||||
if (dsimple->deco_height <= 0) {
|
||||
errorstream << "register_decoration: simple decoration height"
|
||||
" must be greater than 0" << std::endl;
|
||||
delete dsimple;
|
||||
return 0;
|
||||
}
|
||||
|
||||
break; }
|
||||
case DECO_SCHEMATIC: {
|
||||
//DecoSchematic *decoschematic = (DecoSchematic *)deco;
|
||||
|
||||
break; }
|
||||
case DECO_LSYSTEM: {
|
||||
//DecoLSystem *decolsystem = (DecoLSystem *)deco;
|
||||
|
||||
break; }
|
||||
}
|
||||
|
||||
if (deco->divlen <= 0) {
|
||||
errorstream << "register_decoration: divlen must be "
|
||||
"greater than 0" << std::endl;
|
||||
delete deco;
|
||||
return 0;
|
||||
}
|
||||
|
||||
emerge->decorations.push_back(deco);
|
||||
|
||||
verbosestream << "register_decoration: decoration '" << deco->getName()
|
||||
<< "' registered" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
ModApiBasic modapibasic_prototype;
|
||||
|
|
|
@ -45,9 +45,6 @@ private:
|
|||
// get_server_status()
|
||||
static int l_get_server_status(lua_State *L);
|
||||
|
||||
// register_biome_groups({frequencies})
|
||||
static int l_register_biome_groups(lua_State *L);
|
||||
|
||||
// register_biome({lots of stuff})
|
||||
static int l_register_biome(lua_State *L);
|
||||
|
||||
|
@ -130,9 +127,15 @@ private:
|
|||
// rollback_revert_actions_by(actor, seconds) -> bool, log messages
|
||||
static int l_rollback_revert_actions_by(lua_State *L);
|
||||
|
||||
// register_ore(oredesc)
|
||||
static int l_register_ore(lua_State *L);
|
||||
|
||||
// register_decoration(deco)
|
||||
static int l_register_decoration(lua_State *L);
|
||||
|
||||
static struct EnumString es_OreType[];
|
||||
static struct EnumString es_DecorationType[];
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue