@@ -89,7 +89,7 @@ struct EnumString ModApiMapgen::es_Rotation[] =
89
89
// /////////////////////////////////////////////////////////////////////////////
90
90
91
91
92
- bool read_schematic (lua_State *L, int index, Schematic *schem,
92
+ bool read_schematic_def (lua_State *L, int index, Schematic *schem,
93
93
INodeDefManager *ndef, std::map<std::string, std::string> &replace_names)
94
94
{
95
95
// // Get schematic size
@@ -175,20 +175,45 @@ bool read_schematic(lua_State *L, int index, Schematic *schem,
175
175
}
176
176
177
177
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)
180
180
{
181
181
if (index < 0 )
182
182
index = lua_gettop (L) + 1 + index ;
183
183
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 )) {
187
196
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
+ }
189
207
} else {
190
- return false ;
208
+ return NULL ;
191
209
}
210
+
211
+ if (schemmgr->add (schem) == (u32)-1 ) {
212
+ delete schem;
213
+ return 0 ;
214
+ }
215
+
216
+ return schem;
192
217
}
193
218
194
219
@@ -469,32 +494,10 @@ int ModApiMapgen::l_register_biome(lua_State *L)
469
494
ndef->pendNodeResolve (nri);
470
495
471
496
verbosestream << " register_biome: " << b->name << std::endl;
472
-
473
497
lua_pushinteger (L, id);
474
498
return 1 ;
475
499
}
476
500
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
-
498
501
// register_decoration({lots of stuff})
499
502
int ModApiMapgen::l_register_decoration (lua_State *L)
500
503
{
@@ -504,6 +507,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
504
507
INodeDefManager *ndef = getServer (L)->getNodeDefManager ();
505
508
DecorationManager *decomgr = getServer (L)->getEmergeManager ()->decomgr ;
506
509
BiomeManager *biomemgr = getServer (L)->getEmergeManager ()->biomemgr ;
510
+ SchematicManager *schemmgr = getServer (L)->getEmergeManager ()->schemmgr ;
507
511
508
512
enum DecorationType decotype = (DecorationType)getenumfield (L, index ,
509
513
" deco_type" , es_DecorationType, -1 );
@@ -562,7 +566,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
562
566
success = regDecoSimple (L, nri, (DecoSimple *)deco);
563
567
break ;
564
568
case DECO_SCHEMATIC:
565
- success = regDecoSchematic (L, ndef , (DecoSchematic *)deco);
569
+ success = regDecoSchematic (L, schemmgr , (DecoSchematic *)deco);
566
570
break ;
567
571
case DECO_LSYSTEM:
568
572
break ;
@@ -582,7 +586,6 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
582
586
}
583
587
584
588
verbosestream << " register_decoration: " << deco->name << std::endl;
585
-
586
589
lua_pushinteger (L, id);
587
590
return 1 ;
588
591
}
@@ -627,8 +630,8 @@ bool ModApiMapgen::regDecoSimple(lua_State *L,
627
630
return true ;
628
631
}
629
632
630
- bool ModApiMapgen::regDecoSchematic (lua_State *L, INodeDefManager *ndef,
631
- DecoSchematic *deco)
633
+ bool ModApiMapgen::regDecoSchematic (lua_State *L,
634
+ SchematicManager *schemmgr, DecoSchematic *deco)
632
635
{
633
636
int index = 1 ;
634
637
@@ -641,19 +644,12 @@ bool ModApiMapgen::regDecoSchematic(lua_State *L, INodeDefManager *ndef,
641
644
read_schematic_replacements (L, replace_names, lua_gettop (L));
642
645
lua_pop (L, 1 );
643
646
644
- // TODO(hmmmm): get a ref from registered schematics
645
- Schematic *schem = new Schematic;
646
647
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);
652
649
lua_pop (L, 1 );
653
650
654
651
deco->schematic = schem;
655
-
656
- return true ;
652
+ return schem != NULL ;
657
653
}
658
654
659
655
// register_ore({lots of stuff})
@@ -741,11 +737,100 @@ int ModApiMapgen::l_register_ore(lua_State *L)
741
737
ndef->pendNodeResolve (nri);
742
738
743
739
verbosestream << " register_ore: " << ore->name << std::endl;
744
-
745
740
lua_pushinteger (L, id);
746
741
return 1 ;
747
742
}
748
743
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
+
749
834
// create_schematic(p1, p2, probability_list, filename)
750
835
int ModApiMapgen::l_create_schematic (lua_State *L)
751
836
{
@@ -806,53 +891,11 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
806
891
return 1 ;
807
892
}
808
893
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
-
849
894
// place_schematic(p, schematic, rotation, replacement)
850
895
int ModApiMapgen::l_place_schematic (lua_State *L)
851
896
{
852
- Schematic schem;
853
-
854
897
Map *map = &(getEnv (L)->getMap ());
855
- INodeDefManager *ndef = getServer (L)->getNodeDefManager () ;
898
+ SchematicManager *schemmgr = getServer (L)->getEmergeManager ()-> schemmgr ;
856
899
857
900
// // Read position
858
901
v3s16 p = read_v3s16 (L, 1 );
@@ -873,12 +916,14 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
873
916
read_schematic_replacements (L, replace_names, 4 );
874
917
875
918
// // 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) {
877
921
errorstream << " place_schematic: failed to get schematic" << std::endl;
878
922
return 0 ;
879
923
}
880
924
881
- schem.placeStructure (map, p, 0 , (Rotation)rot, force_placement, ndef);
925
+ schem->placeStructure (map, p, 0 , (Rotation)rot, force_placement,
926
+ schemmgr->getNodeDef ());
882
927
883
928
return 1 ;
884
929
}
@@ -895,14 +940,15 @@ void ModApiMapgen::Initialize(lua_State *L, int top)
895
940
API_FCT (register_biome);
896
941
API_FCT (register_decoration);
897
942
API_FCT (register_ore);
943
+ API_FCT (register_schematic);
898
944
899
945
API_FCT (clear_registered_biomes);
900
946
API_FCT (clear_registered_decorations);
901
947
API_FCT (clear_registered_ores);
948
+ API_FCT (clear_registered_schematics);
902
949
903
950
API_FCT (generate_ores);
904
951
API_FCT (generate_decorations);
905
-
906
952
API_FCT (create_schematic);
907
953
API_FCT (place_schematic);
908
954
}
0 commit comments