mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
Add core.register_schematic() and cache schematics on use
This commit is contained in:
parent
9fc2b93d9f
commit
732d7b9a7c
@ -204,6 +204,8 @@ public:
|
|||||||
|
|
||||||
virtual GenElement *getByName(const std::string &name);
|
virtual GenElement *getByName(const std::string &name);
|
||||||
|
|
||||||
|
INodeDefManager *getNodeDef() { return m_ndef; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
INodeDefManager *m_ndef;
|
INodeDefManager *m_ndef;
|
||||||
std::vector<GenElement *> m_elements;
|
std::vector<GenElement *> m_elements;
|
||||||
|
@ -89,7 +89,7 @@ struct EnumString ModApiMapgen::es_Rotation[] =
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
bool read_schematic(lua_State *L, int index, Schematic *schem,
|
bool read_schematic_def(lua_State *L, int index, Schematic *schem,
|
||||||
INodeDefManager *ndef, std::map<std::string, std::string> &replace_names)
|
INodeDefManager *ndef, std::map<std::string, std::string> &replace_names)
|
||||||
{
|
{
|
||||||
//// Get schematic size
|
//// Get schematic size
|
||||||
@ -175,20 +175,45 @@ bool read_schematic(lua_State *L, int index, Schematic *schem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool get_schematic(lua_State *L, int index, Schematic *schem,
|
Schematic *get_schematic(lua_State *L, int index, SchematicManager *schemmgr,
|
||||||
INodeDefManager *ndef, std::map<std::string, std::string> &replace_names)
|
std::map<std::string, std::string> &replace_names)
|
||||||
{
|
{
|
||||||
if (index < 0)
|
if (index < 0)
|
||||||
index = lua_gettop(L) + 1 + index;
|
index = lua_gettop(L) + 1 + index;
|
||||||
|
|
||||||
if (lua_istable(L, index)) {
|
Schematic *schem;
|
||||||
return read_schematic(L, index, schem, ndef, replace_names);
|
|
||||||
} else if (lua_isstring(L, index)) {
|
if (lua_isnumber(L, index)) {
|
||||||
|
return (Schematic *)schemmgr->get(lua_tointeger(L, index));
|
||||||
|
} else if (lua_istable(L, index)) {
|
||||||
|
schem = new Schematic;
|
||||||
|
if (!read_schematic_def(L, index, schem,
|
||||||
|
schemmgr->getNodeDef(), replace_names)) {
|
||||||
|
delete schem;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else if (lua_isstring(L, index)) {
|
||||||
const char *filename = lua_tostring(L, index);
|
const char *filename = lua_tostring(L, index);
|
||||||
return schem->loadSchematicFromFile(filename, ndef, replace_names);
|
schem = (Schematic *)schemmgr->getByName(filename);
|
||||||
|
if (schem)
|
||||||
|
return schem;
|
||||||
|
|
||||||
|
schem = new Schematic;
|
||||||
|
if (!schem->loadSchematicFromFile(filename,
|
||||||
|
schemmgr->getNodeDef(), replace_names)) {
|
||||||
|
delete schem;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (schemmgr->add(schem) == (u32)-1) {
|
||||||
|
delete schem;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return schem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -469,32 +494,10 @@ int ModApiMapgen::l_register_biome(lua_State *L)
|
|||||||
ndef->pendNodeResolve(nri);
|
ndef->pendNodeResolve(nri);
|
||||||
|
|
||||||
verbosestream << "register_biome: " << b->name << std::endl;
|
verbosestream << "register_biome: " << b->name << std::endl;
|
||||||
|
|
||||||
lua_pushinteger(L, id);
|
lua_pushinteger(L, id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ModApiMapgen::l_clear_registered_biomes(lua_State *L)
|
|
||||||
{
|
|
||||||
BiomeManager *bmgr = getServer(L)->getEmergeManager()->biomemgr;
|
|
||||||
bmgr->clear();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ModApiMapgen::l_clear_registered_decorations(lua_State *L)
|
|
||||||
{
|
|
||||||
DecorationManager *dmgr = getServer(L)->getEmergeManager()->decomgr;
|
|
||||||
dmgr->clear();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ModApiMapgen::l_clear_registered_ores(lua_State *L)
|
|
||||||
{
|
|
||||||
OreManager *omgr = getServer(L)->getEmergeManager()->oremgr;
|
|
||||||
omgr->clear();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// register_decoration({lots of stuff})
|
// register_decoration({lots of stuff})
|
||||||
int ModApiMapgen::l_register_decoration(lua_State *L)
|
int ModApiMapgen::l_register_decoration(lua_State *L)
|
||||||
{
|
{
|
||||||
@ -504,6 +507,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
|
|||||||
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
|
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
|
||||||
DecorationManager *decomgr = getServer(L)->getEmergeManager()->decomgr;
|
DecorationManager *decomgr = getServer(L)->getEmergeManager()->decomgr;
|
||||||
BiomeManager *biomemgr = getServer(L)->getEmergeManager()->biomemgr;
|
BiomeManager *biomemgr = getServer(L)->getEmergeManager()->biomemgr;
|
||||||
|
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
|
||||||
|
|
||||||
enum DecorationType decotype = (DecorationType)getenumfield(L, index,
|
enum DecorationType decotype = (DecorationType)getenumfield(L, index,
|
||||||
"deco_type", es_DecorationType, -1);
|
"deco_type", es_DecorationType, -1);
|
||||||
@ -562,7 +566,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
|
|||||||
success = regDecoSimple(L, nri, (DecoSimple *)deco);
|
success = regDecoSimple(L, nri, (DecoSimple *)deco);
|
||||||
break;
|
break;
|
||||||
case DECO_SCHEMATIC:
|
case DECO_SCHEMATIC:
|
||||||
success = regDecoSchematic(L, ndef, (DecoSchematic *)deco);
|
success = regDecoSchematic(L, schemmgr, (DecoSchematic *)deco);
|
||||||
break;
|
break;
|
||||||
case DECO_LSYSTEM:
|
case DECO_LSYSTEM:
|
||||||
break;
|
break;
|
||||||
@ -582,7 +586,6 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
|
|||||||
}
|
}
|
||||||
|
|
||||||
verbosestream << "register_decoration: " << deco->name << std::endl;
|
verbosestream << "register_decoration: " << deco->name << std::endl;
|
||||||
|
|
||||||
lua_pushinteger(L, id);
|
lua_pushinteger(L, id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -627,8 +630,8 @@ bool ModApiMapgen::regDecoSimple(lua_State *L,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ModApiMapgen::regDecoSchematic(lua_State *L, INodeDefManager *ndef,
|
bool ModApiMapgen::regDecoSchematic(lua_State *L,
|
||||||
DecoSchematic *deco)
|
SchematicManager *schemmgr, DecoSchematic *deco)
|
||||||
{
|
{
|
||||||
int index = 1;
|
int index = 1;
|
||||||
|
|
||||||
@ -641,19 +644,12 @@ bool ModApiMapgen::regDecoSchematic(lua_State *L, INodeDefManager *ndef,
|
|||||||
read_schematic_replacements(L, replace_names, lua_gettop(L));
|
read_schematic_replacements(L, replace_names, lua_gettop(L));
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
// TODO(hmmmm): get a ref from registered schematics
|
|
||||||
Schematic *schem = new Schematic;
|
|
||||||
lua_getfield(L, index, "schematic");
|
lua_getfield(L, index, "schematic");
|
||||||
if (!get_schematic(L, -1, schem, ndef, replace_names)) {
|
Schematic *schem = get_schematic(L, -1, schemmgr, replace_names);
|
||||||
lua_pop(L, 1);
|
|
||||||
delete schem;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
deco->schematic = schem;
|
deco->schematic = schem;
|
||||||
|
return schem != NULL;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// register_ore({lots of stuff})
|
// register_ore({lots of stuff})
|
||||||
@ -741,11 +737,100 @@ int ModApiMapgen::l_register_ore(lua_State *L)
|
|||||||
ndef->pendNodeResolve(nri);
|
ndef->pendNodeResolve(nri);
|
||||||
|
|
||||||
verbosestream << "register_ore: " << ore->name << std::endl;
|
verbosestream << "register_ore: " << ore->name << std::endl;
|
||||||
|
|
||||||
lua_pushinteger(L, id);
|
lua_pushinteger(L, id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// register_schematic({schematic}, replacements={})
|
||||||
|
int ModApiMapgen::l_register_schematic(lua_State *L)
|
||||||
|
{
|
||||||
|
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
|
||||||
|
|
||||||
|
std::map<std::string, std::string> replace_names;
|
||||||
|
if (lua_istable(L, 2))
|
||||||
|
read_schematic_replacements(L, replace_names, 2);
|
||||||
|
|
||||||
|
Schematic *schem = get_schematic(L, 1, schemmgr, replace_names);
|
||||||
|
if (!schem)
|
||||||
|
return 0;
|
||||||
|
printf("register_schematic!\n");
|
||||||
|
verbosestream << "register_schematic: " << schem->name << std::endl;
|
||||||
|
lua_pushinteger(L, schem->id);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear_registered_biomes()
|
||||||
|
int ModApiMapgen::l_clear_registered_biomes(lua_State *L)
|
||||||
|
{
|
||||||
|
BiomeManager *bmgr = getServer(L)->getEmergeManager()->biomemgr;
|
||||||
|
bmgr->clear();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear_registered_decorations()
|
||||||
|
int ModApiMapgen::l_clear_registered_decorations(lua_State *L)
|
||||||
|
{
|
||||||
|
DecorationManager *dmgr = getServer(L)->getEmergeManager()->decomgr;
|
||||||
|
dmgr->clear();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear_registered_ores()
|
||||||
|
int ModApiMapgen::l_clear_registered_ores(lua_State *L)
|
||||||
|
{
|
||||||
|
OreManager *omgr = getServer(L)->getEmergeManager()->oremgr;
|
||||||
|
omgr->clear();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear_registered_schematics()
|
||||||
|
int ModApiMapgen::l_clear_registered_schematics(lua_State *L)
|
||||||
|
{
|
||||||
|
SchematicManager *smgr = getServer(L)->getEmergeManager()->schemmgr;
|
||||||
|
smgr->clear();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate_ores(vm, p1, p2, [ore_id])
|
||||||
|
int ModApiMapgen::l_generate_ores(lua_State *L)
|
||||||
|
{
|
||||||
|
EmergeManager *emerge = getServer(L)->getEmergeManager();
|
||||||
|
|
||||||
|
Mapgen mg;
|
||||||
|
mg.seed = emerge->params.seed;
|
||||||
|
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
|
||||||
|
mg.ndef = getServer(L)->getNodeDefManager();
|
||||||
|
|
||||||
|
u32 blockseed = Mapgen::getBlockSeed(mg.vm->m_area.MinEdge, mg.seed);
|
||||||
|
|
||||||
|
v3s16 pmin = read_v3s16(L, 2);
|
||||||
|
v3s16 pmax = read_v3s16(L, 3);
|
||||||
|
|
||||||
|
emerge->oremgr->placeAllOres(&mg, blockseed, pmin, pmax);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate_decorations(vm, p1, p2, [deco_id])
|
||||||
|
int ModApiMapgen::l_generate_decorations(lua_State *L)
|
||||||
|
{
|
||||||
|
EmergeManager *emerge = getServer(L)->getEmergeManager();
|
||||||
|
|
||||||
|
Mapgen mg;
|
||||||
|
mg.seed = emerge->params.seed;
|
||||||
|
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
|
||||||
|
mg.ndef = getServer(L)->getNodeDefManager();
|
||||||
|
|
||||||
|
u32 blockseed = Mapgen::getBlockSeed(mg.vm->m_area.MinEdge, mg.seed);
|
||||||
|
|
||||||
|
v3s16 pmin = read_v3s16(L, 2);
|
||||||
|
v3s16 pmax = read_v3s16(L, 3);
|
||||||
|
|
||||||
|
emerge->decomgr->placeAllDecos(&mg, blockseed, pmin, pmax);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// create_schematic(p1, p2, probability_list, filename)
|
// create_schematic(p1, p2, probability_list, filename)
|
||||||
int ModApiMapgen::l_create_schematic(lua_State *L)
|
int ModApiMapgen::l_create_schematic(lua_State *L)
|
||||||
{
|
{
|
||||||
@ -806,53 +891,11 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate_ores(vm, p1, p2, [ore_id])
|
|
||||||
int ModApiMapgen::l_generate_ores(lua_State *L)
|
|
||||||
{
|
|
||||||
EmergeManager *emerge = getServer(L)->getEmergeManager();
|
|
||||||
|
|
||||||
Mapgen mg;
|
|
||||||
mg.seed = emerge->params.seed;
|
|
||||||
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
|
|
||||||
mg.ndef = getServer(L)->getNodeDefManager();
|
|
||||||
|
|
||||||
u32 blockseed = Mapgen::getBlockSeed(mg.vm->m_area.MinEdge, mg.seed);
|
|
||||||
|
|
||||||
v3s16 pmin = read_v3s16(L, 2);
|
|
||||||
v3s16 pmax = read_v3s16(L, 3);
|
|
||||||
|
|
||||||
emerge->oremgr->placeAllOres(&mg, blockseed, pmin, pmax);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate_decorations(vm, p1, p2, [deco_id])
|
|
||||||
int ModApiMapgen::l_generate_decorations(lua_State *L)
|
|
||||||
{
|
|
||||||
EmergeManager *emerge = getServer(L)->getEmergeManager();
|
|
||||||
|
|
||||||
Mapgen mg;
|
|
||||||
mg.seed = emerge->params.seed;
|
|
||||||
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
|
|
||||||
mg.ndef = getServer(L)->getNodeDefManager();
|
|
||||||
|
|
||||||
u32 blockseed = Mapgen::getBlockSeed(mg.vm->m_area.MinEdge, mg.seed);
|
|
||||||
|
|
||||||
v3s16 pmin = read_v3s16(L, 2);
|
|
||||||
v3s16 pmax = read_v3s16(L, 3);
|
|
||||||
|
|
||||||
emerge->decomgr->placeAllDecos(&mg, blockseed, pmin, pmax);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// place_schematic(p, schematic, rotation, replacement)
|
// place_schematic(p, schematic, rotation, replacement)
|
||||||
int ModApiMapgen::l_place_schematic(lua_State *L)
|
int ModApiMapgen::l_place_schematic(lua_State *L)
|
||||||
{
|
{
|
||||||
Schematic schem;
|
|
||||||
|
|
||||||
Map *map = &(getEnv(L)->getMap());
|
Map *map = &(getEnv(L)->getMap());
|
||||||
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
|
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
|
||||||
|
|
||||||
//// Read position
|
//// Read position
|
||||||
v3s16 p = read_v3s16(L, 1);
|
v3s16 p = read_v3s16(L, 1);
|
||||||
@ -873,12 +916,14 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
|
|||||||
read_schematic_replacements(L, replace_names, 4);
|
read_schematic_replacements(L, replace_names, 4);
|
||||||
|
|
||||||
//// Read schematic
|
//// Read schematic
|
||||||
if (!get_schematic(L, 2, &schem, ndef, replace_names)) {
|
Schematic *schem = get_schematic(L, 2, schemmgr, replace_names);
|
||||||
|
if (!schem) {
|
||||||
errorstream << "place_schematic: failed to get schematic" << std::endl;
|
errorstream << "place_schematic: failed to get schematic" << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
schem.placeStructure(map, p, 0, (Rotation)rot, force_placement, ndef);
|
schem->placeStructure(map, p, 0, (Rotation)rot, force_placement,
|
||||||
|
schemmgr->getNodeDef());
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -895,14 +940,15 @@ void ModApiMapgen::Initialize(lua_State *L, int top)
|
|||||||
API_FCT(register_biome);
|
API_FCT(register_biome);
|
||||||
API_FCT(register_decoration);
|
API_FCT(register_decoration);
|
||||||
API_FCT(register_ore);
|
API_FCT(register_ore);
|
||||||
|
API_FCT(register_schematic);
|
||||||
|
|
||||||
API_FCT(clear_registered_biomes);
|
API_FCT(clear_registered_biomes);
|
||||||
API_FCT(clear_registered_decorations);
|
API_FCT(clear_registered_decorations);
|
||||||
API_FCT(clear_registered_ores);
|
API_FCT(clear_registered_ores);
|
||||||
|
API_FCT(clear_registered_schematics);
|
||||||
|
|
||||||
API_FCT(generate_ores);
|
API_FCT(generate_ores);
|
||||||
API_FCT(generate_decorations);
|
API_FCT(generate_decorations);
|
||||||
|
|
||||||
API_FCT(create_schematic);
|
API_FCT(create_schematic);
|
||||||
API_FCT(place_schematic);
|
API_FCT(place_schematic);
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ class INodeDefManager;
|
|||||||
struct NodeResolveInfo;
|
struct NodeResolveInfo;
|
||||||
class DecoSimple;
|
class DecoSimple;
|
||||||
class DecoSchematic;
|
class DecoSchematic;
|
||||||
|
class SchematicManager;
|
||||||
|
|
||||||
class ModApiMapgen : public ModApiBase {
|
class ModApiMapgen : public ModApiBase {
|
||||||
private:
|
private:
|
||||||
@ -56,12 +57,18 @@ private:
|
|||||||
// register_ore({lots of stuff})
|
// register_ore({lots of stuff})
|
||||||
static int l_register_ore(lua_State *L);
|
static int l_register_ore(lua_State *L);
|
||||||
|
|
||||||
|
// register_schematic({schematic}, replacements={})
|
||||||
|
static int l_register_schematic(lua_State *L);
|
||||||
|
|
||||||
// clear_registered_biomes()
|
// clear_registered_biomes()
|
||||||
static int l_clear_registered_biomes(lua_State *L);
|
static int l_clear_registered_biomes(lua_State *L);
|
||||||
|
|
||||||
// clear_registered_decorations()
|
// clear_registered_decorations()
|
||||||
static int l_clear_registered_decorations(lua_State *L);
|
static int l_clear_registered_decorations(lua_State *L);
|
||||||
|
|
||||||
|
// clear_registered_schematics()
|
||||||
|
static int l_clear_registered_schematics(lua_State *L);
|
||||||
|
|
||||||
// generate_ores(vm, p1, p2)
|
// generate_ores(vm, p1, p2)
|
||||||
static int l_generate_ores(lua_State *L);
|
static int l_generate_ores(lua_State *L);
|
||||||
|
|
||||||
@ -80,7 +87,7 @@ private:
|
|||||||
static bool regDecoSimple(lua_State *L,
|
static bool regDecoSimple(lua_State *L,
|
||||||
NodeResolveInfo *nri, DecoSimple *deco);
|
NodeResolveInfo *nri, DecoSimple *deco);
|
||||||
static bool regDecoSchematic(lua_State *L,
|
static bool regDecoSchematic(lua_State *L,
|
||||||
INodeDefManager *ndef, DecoSchematic *deco);
|
SchematicManager *schemmgr, DecoSchematic *deco);
|
||||||
|
|
||||||
static struct EnumString es_BiomeTerrainType[];
|
static struct EnumString es_BiomeTerrainType[];
|
||||||
static struct EnumString es_DecorationType[];
|
static struct EnumString es_DecorationType[];
|
||||||
|
Loading…
Reference in New Issue
Block a user