Skip to content

Commit 732d7b9

Browse files
committedMar 24, 2015
Add core.register_schematic() and cache schematics on use
1 parent 9fc2b93 commit 732d7b9

File tree

3 files changed

+146
-91
lines changed

3 files changed

+146
-91
lines changed
 

Diff for: ‎src/mapgen.h

+2
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ class GenElementManager {
204204

205205
virtual GenElement *getByName(const std::string &name);
206206

207+
INodeDefManager *getNodeDef() { return m_ndef; }
208+
207209
protected:
208210
INodeDefManager *m_ndef;
209211
std::vector<GenElement *> m_elements;

Diff for: ‎src/script/lua_api/l_mapgen.cpp

+136-90
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ struct EnumString ModApiMapgen::es_Rotation[] =
8989
///////////////////////////////////////////////////////////////////////////////
9090

9191

92-
bool read_schematic(lua_State *L, int index, Schematic *schem,
92+
bool read_schematic_def(lua_State *L, int index, Schematic *schem,
9393
INodeDefManager *ndef, std::map<std::string, std::string> &replace_names)
9494
{
9595
//// Get schematic size
@@ -175,20 +175,45 @@ bool read_schematic(lua_State *L, int index, Schematic *schem,
175175
}
176176

177177

178-
bool get_schematic(lua_State *L, int index, Schematic *schem,
179-
INodeDefManager *ndef, std::map<std::string, std::string> &replace_names)
178+
Schematic *get_schematic(lua_State *L, int index, SchematicManager *schemmgr,
179+
std::map<std::string, std::string> &replace_names)
180180
{
181181
if (index < 0)
182182
index = lua_gettop(L) + 1 + index;
183183

184-
if (lua_istable(L, index)) {
185-
return read_schematic(L, index, schem, ndef, replace_names);
186-
} else if (lua_isstring(L, index)) {
184+
Schematic *schem;
185+
186+
if (lua_isnumber(L, index)) {
187+
return (Schematic *)schemmgr->get(lua_tointeger(L, index));
188+
} else if (lua_istable(L, index)) {
189+
schem = new Schematic;
190+
if (!read_schematic_def(L, index, schem,
191+
schemmgr->getNodeDef(), replace_names)) {
192+
delete schem;
193+
return NULL;
194+
}
195+
} else if (lua_isstring(L, index)) {
187196
const char *filename = lua_tostring(L, index);
188-
return schem->loadSchematicFromFile(filename, ndef, replace_names);
197+
schem = (Schematic *)schemmgr->getByName(filename);
198+
if (schem)
199+
return schem;
200+
201+
schem = new Schematic;
202+
if (!schem->loadSchematicFromFile(filename,
203+
schemmgr->getNodeDef(), replace_names)) {
204+
delete schem;
205+
return NULL;
206+
}
189207
} else {
190-
return false;
208+
return NULL;
191209
}
210+
211+
if (schemmgr->add(schem) == (u32)-1) {
212+
delete schem;
213+
return 0;
214+
}
215+
216+
return schem;
192217
}
193218

194219

@@ -469,32 +494,10 @@ int ModApiMapgen::l_register_biome(lua_State *L)
469494
ndef->pendNodeResolve(nri);
470495

471496
verbosestream << "register_biome: " << b->name << std::endl;
472-
473497
lua_pushinteger(L, id);
474498
return 1;
475499
}
476500

477-
int ModApiMapgen::l_clear_registered_biomes(lua_State *L)
478-
{
479-
BiomeManager *bmgr = getServer(L)->getEmergeManager()->biomemgr;
480-
bmgr->clear();
481-
return 0;
482-
}
483-
484-
int ModApiMapgen::l_clear_registered_decorations(lua_State *L)
485-
{
486-
DecorationManager *dmgr = getServer(L)->getEmergeManager()->decomgr;
487-
dmgr->clear();
488-
return 0;
489-
}
490-
491-
int ModApiMapgen::l_clear_registered_ores(lua_State *L)
492-
{
493-
OreManager *omgr = getServer(L)->getEmergeManager()->oremgr;
494-
omgr->clear();
495-
return 0;
496-
}
497-
498501
// register_decoration({lots of stuff})
499502
int ModApiMapgen::l_register_decoration(lua_State *L)
500503
{
@@ -504,6 +507,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
504507
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
505508
DecorationManager *decomgr = getServer(L)->getEmergeManager()->decomgr;
506509
BiomeManager *biomemgr = getServer(L)->getEmergeManager()->biomemgr;
510+
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
507511

508512
enum DecorationType decotype = (DecorationType)getenumfield(L, index,
509513
"deco_type", es_DecorationType, -1);
@@ -562,7 +566,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
562566
success = regDecoSimple(L, nri, (DecoSimple *)deco);
563567
break;
564568
case DECO_SCHEMATIC:
565-
success = regDecoSchematic(L, ndef, (DecoSchematic *)deco);
569+
success = regDecoSchematic(L, schemmgr, (DecoSchematic *)deco);
566570
break;
567571
case DECO_LSYSTEM:
568572
break;
@@ -582,7 +586,6 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
582586
}
583587

584588
verbosestream << "register_decoration: " << deco->name << std::endl;
585-
586589
lua_pushinteger(L, id);
587590
return 1;
588591
}
@@ -627,8 +630,8 @@ bool ModApiMapgen::regDecoSimple(lua_State *L,
627630
return true;
628631
}
629632

630-
bool ModApiMapgen::regDecoSchematic(lua_State *L, INodeDefManager *ndef,
631-
DecoSchematic *deco)
633+
bool ModApiMapgen::regDecoSchematic(lua_State *L,
634+
SchematicManager *schemmgr, DecoSchematic *deco)
632635
{
633636
int index = 1;
634637

@@ -641,19 +644,12 @@ bool ModApiMapgen::regDecoSchematic(lua_State *L, INodeDefManager *ndef,
641644
read_schematic_replacements(L, replace_names, lua_gettop(L));
642645
lua_pop(L, 1);
643646

644-
// TODO(hmmmm): get a ref from registered schematics
645-
Schematic *schem = new Schematic;
646647
lua_getfield(L, index, "schematic");
647-
if (!get_schematic(L, -1, schem, ndef, replace_names)) {
648-
lua_pop(L, 1);
649-
delete schem;
650-
return false;
651-
}
648+
Schematic *schem = get_schematic(L, -1, schemmgr, replace_names);
652649
lua_pop(L, 1);
653650

654651
deco->schematic = schem;
655-
656-
return true;
652+
return schem != NULL;
657653
}
658654

659655
// register_ore({lots of stuff})
@@ -741,11 +737,100 @@ int ModApiMapgen::l_register_ore(lua_State *L)
741737
ndef->pendNodeResolve(nri);
742738

743739
verbosestream << "register_ore: " << ore->name << std::endl;
744-
745740
lua_pushinteger(L, id);
746741
return 1;
747742
}
748743

744+
// register_schematic({schematic}, replacements={})
745+
int ModApiMapgen::l_register_schematic(lua_State *L)
746+
{
747+
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
748+
749+
std::map<std::string, std::string> replace_names;
750+
if (lua_istable(L, 2))
751+
read_schematic_replacements(L, replace_names, 2);
752+
753+
Schematic *schem = get_schematic(L, 1, schemmgr, replace_names);
754+
if (!schem)
755+
return 0;
756+
printf("register_schematic!\n");
757+
verbosestream << "register_schematic: " << schem->name << std::endl;
758+
lua_pushinteger(L, schem->id);
759+
return 1;
760+
}
761+
762+
// clear_registered_biomes()
763+
int ModApiMapgen::l_clear_registered_biomes(lua_State *L)
764+
{
765+
BiomeManager *bmgr = getServer(L)->getEmergeManager()->biomemgr;
766+
bmgr->clear();
767+
return 0;
768+
}
769+
770+
// clear_registered_decorations()
771+
int ModApiMapgen::l_clear_registered_decorations(lua_State *L)
772+
{
773+
DecorationManager *dmgr = getServer(L)->getEmergeManager()->decomgr;
774+
dmgr->clear();
775+
return 0;
776+
}
777+
778+
// clear_registered_ores()
779+
int ModApiMapgen::l_clear_registered_ores(lua_State *L)
780+
{
781+
OreManager *omgr = getServer(L)->getEmergeManager()->oremgr;
782+
omgr->clear();
783+
return 0;
784+
}
785+
786+
// clear_registered_schematics()
787+
int ModApiMapgen::l_clear_registered_schematics(lua_State *L)
788+
{
789+
SchematicManager *smgr = getServer(L)->getEmergeManager()->schemmgr;
790+
smgr->clear();
791+
return 0;
792+
}
793+
794+
// generate_ores(vm, p1, p2, [ore_id])
795+
int ModApiMapgen::l_generate_ores(lua_State *L)
796+
{
797+
EmergeManager *emerge = getServer(L)->getEmergeManager();
798+
799+
Mapgen mg;
800+
mg.seed = emerge->params.seed;
801+
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
802+
mg.ndef = getServer(L)->getNodeDefManager();
803+
804+
u32 blockseed = Mapgen::getBlockSeed(mg.vm->m_area.MinEdge, mg.seed);
805+
806+
v3s16 pmin = read_v3s16(L, 2);
807+
v3s16 pmax = read_v3s16(L, 3);
808+
809+
emerge->oremgr->placeAllOres(&mg, blockseed, pmin, pmax);
810+
811+
return 0;
812+
}
813+
814+
// generate_decorations(vm, p1, p2, [deco_id])
815+
int ModApiMapgen::l_generate_decorations(lua_State *L)
816+
{
817+
EmergeManager *emerge = getServer(L)->getEmergeManager();
818+
819+
Mapgen mg;
820+
mg.seed = emerge->params.seed;
821+
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
822+
mg.ndef = getServer(L)->getNodeDefManager();
823+
824+
u32 blockseed = Mapgen::getBlockSeed(mg.vm->m_area.MinEdge, mg.seed);
825+
826+
v3s16 pmin = read_v3s16(L, 2);
827+
v3s16 pmax = read_v3s16(L, 3);
828+
829+
emerge->decomgr->placeAllDecos(&mg, blockseed, pmin, pmax);
830+
831+
return 0;
832+
}
833+
749834
// create_schematic(p1, p2, probability_list, filename)
750835
int ModApiMapgen::l_create_schematic(lua_State *L)
751836
{
@@ -806,53 +891,11 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
806891
return 1;
807892
}
808893

809-
// generate_ores(vm, p1, p2, [ore_id])
810-
int ModApiMapgen::l_generate_ores(lua_State *L)
811-
{
812-
EmergeManager *emerge = getServer(L)->getEmergeManager();
813-
814-
Mapgen mg;
815-
mg.seed = emerge->params.seed;
816-
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
817-
mg.ndef = getServer(L)->getNodeDefManager();
818-
819-
u32 blockseed = Mapgen::getBlockSeed(mg.vm->m_area.MinEdge, mg.seed);
820-
821-
v3s16 pmin = read_v3s16(L, 2);
822-
v3s16 pmax = read_v3s16(L, 3);
823-
824-
emerge->oremgr->placeAllOres(&mg, blockseed, pmin, pmax);
825-
826-
return 0;
827-
}
828-
829-
// generate_decorations(vm, p1, p2, [deco_id])
830-
int ModApiMapgen::l_generate_decorations(lua_State *L)
831-
{
832-
EmergeManager *emerge = getServer(L)->getEmergeManager();
833-
834-
Mapgen mg;
835-
mg.seed = emerge->params.seed;
836-
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
837-
mg.ndef = getServer(L)->getNodeDefManager();
838-
839-
u32 blockseed = Mapgen::getBlockSeed(mg.vm->m_area.MinEdge, mg.seed);
840-
841-
v3s16 pmin = read_v3s16(L, 2);
842-
v3s16 pmax = read_v3s16(L, 3);
843-
844-
emerge->decomgr->placeAllDecos(&mg, blockseed, pmin, pmax);
845-
846-
return 0;
847-
}
848-
849894
// place_schematic(p, schematic, rotation, replacement)
850895
int ModApiMapgen::l_place_schematic(lua_State *L)
851896
{
852-
Schematic schem;
853-
854897
Map *map = &(getEnv(L)->getMap());
855-
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
898+
SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
856899

857900
//// Read position
858901
v3s16 p = read_v3s16(L, 1);
@@ -873,12 +916,14 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
873916
read_schematic_replacements(L, replace_names, 4);
874917

875918
//// Read schematic
876-
if (!get_schematic(L, 2, &schem, ndef, replace_names)) {
919+
Schematic *schem = get_schematic(L, 2, schemmgr, replace_names);
920+
if (!schem) {
877921
errorstream << "place_schematic: failed to get schematic" << std::endl;
878922
return 0;
879923
}
880924

881-
schem.placeStructure(map, p, 0, (Rotation)rot, force_placement, ndef);
925+
schem->placeStructure(map, p, 0, (Rotation)rot, force_placement,
926+
schemmgr->getNodeDef());
882927

883928
return 1;
884929
}
@@ -895,14 +940,15 @@ void ModApiMapgen::Initialize(lua_State *L, int top)
895940
API_FCT(register_biome);
896941
API_FCT(register_decoration);
897942
API_FCT(register_ore);
943+
API_FCT(register_schematic);
898944

899945
API_FCT(clear_registered_biomes);
900946
API_FCT(clear_registered_decorations);
901947
API_FCT(clear_registered_ores);
948+
API_FCT(clear_registered_schematics);
902949

903950
API_FCT(generate_ores);
904951
API_FCT(generate_decorations);
905-
906952
API_FCT(create_schematic);
907953
API_FCT(place_schematic);
908954
}

Diff for: ‎src/script/lua_api/l_mapgen.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class INodeDefManager;
2626
struct NodeResolveInfo;
2727
class DecoSimple;
2828
class DecoSchematic;
29+
class SchematicManager;
2930

3031
class ModApiMapgen : public ModApiBase {
3132
private:
@@ -56,12 +57,18 @@ class ModApiMapgen : public ModApiBase {
5657
// register_ore({lots of stuff})
5758
static int l_register_ore(lua_State *L);
5859

60+
// register_schematic({schematic}, replacements={})
61+
static int l_register_schematic(lua_State *L);
62+
5963
// clear_registered_biomes()
6064
static int l_clear_registered_biomes(lua_State *L);
6165

6266
// clear_registered_decorations()
6367
static int l_clear_registered_decorations(lua_State *L);
6468

69+
// clear_registered_schematics()
70+
static int l_clear_registered_schematics(lua_State *L);
71+
6572
// generate_ores(vm, p1, p2)
6673
static int l_generate_ores(lua_State *L);
6774

@@ -80,7 +87,7 @@ class ModApiMapgen : public ModApiBase {
8087
static bool regDecoSimple(lua_State *L,
8188
NodeResolveInfo *nri, DecoSimple *deco);
8289
static bool regDecoSchematic(lua_State *L,
83-
INodeDefManager *ndef, DecoSchematic *deco);
90+
SchematicManager *schemmgr, DecoSchematic *deco);
8491

8592
static struct EnumString es_BiomeTerrainType[];
8693
static struct EnumString es_DecorationType[];

0 commit comments

Comments
 (0)
Please sign in to comment.