@@ -81,45 +81,45 @@ struct EnumString ModApiMapgen::es_Rotation[] =
81
81
int ModApiMapgen::l_get_mapgen_object (lua_State *L)
82
82
{
83
83
const char *mgobjstr = lua_tostring (L, 1 );
84
-
84
+
85
85
int mgobjint;
86
86
if (!string_to_enum (es_MapgenObject, mgobjint, mgobjstr ? mgobjstr : " " ))
87
87
return 0 ;
88
-
88
+
89
89
enum MapgenObject mgobj = (MapgenObject)mgobjint;
90
90
91
91
EmergeManager *emerge = getServer (L)->getEmergeManager ();
92
92
Mapgen *mg = emerge->getCurrentMapgen ();
93
93
if (!mg)
94
94
return 0 ;
95
-
95
+
96
96
size_t maplen = mg->csize .X * mg->csize .Z ;
97
-
97
+
98
98
int nargs = 1 ;
99
-
99
+
100
100
switch (mgobj) {
101
101
case MGOBJ_VMANIP: {
102
102
ManualMapVoxelManipulator *vm = mg->vm ;
103
-
103
+
104
104
// VoxelManip object
105
105
LuaVoxelManip *o = new LuaVoxelManip (vm, true );
106
106
*(void **)(lua_newuserdata (L, sizeof (void *))) = o;
107
107
luaL_getmetatable (L, " VoxelManip" );
108
108
lua_setmetatable (L, -2 );
109
-
109
+
110
110
// emerged min pos
111
111
push_v3s16 (L, vm->m_area .MinEdge );
112
112
113
113
// emerged max pos
114
114
push_v3s16 (L, vm->m_area .MaxEdge );
115
-
115
+
116
116
nargs = 3 ;
117
-
117
+
118
118
break ; }
119
119
case MGOBJ_HEIGHTMAP: {
120
120
if (!mg->heightmap )
121
121
return 0 ;
122
-
122
+
123
123
lua_newtable (L);
124
124
for (size_t i = 0 ; i != maplen; i++) {
125
125
lua_pushinteger (L, mg->heightmap [i]);
@@ -129,7 +129,7 @@ int ModApiMapgen::l_get_mapgen_object(lua_State *L)
129
129
case MGOBJ_BIOMEMAP: {
130
130
if (!mg->biomemap )
131
131
return 0 ;
132
-
132
+
133
133
lua_newtable (L);
134
134
for (size_t i = 0 ; i != maplen; i++) {
135
135
lua_pushinteger (L, mg->biomemap [i]);
@@ -140,22 +140,22 @@ int ModApiMapgen::l_get_mapgen_object(lua_State *L)
140
140
case MGOBJ_HUMIDMAP:
141
141
if (strcmp (emerge->params ->mg_name .c_str (), " v7" ))
142
142
return 0 ;
143
-
143
+
144
144
MapgenV7 *mgv7 = (MapgenV7 *)mg;
145
145
146
- float *arr = (mgobj == MGOBJ_HEATMAP) ?
146
+ float *arr = (mgobj == MGOBJ_HEATMAP) ?
147
147
mgv7->noise_heat ->result : mgv7->noise_humidity ->result ;
148
148
if (!arr)
149
149
return 0 ;
150
-
150
+
151
151
lua_newtable (L);
152
152
for (size_t i = 0 ; i != maplen; i++) {
153
153
lua_pushnumber (L, arr[i]);
154
154
lua_rawseti (L, -2 , i + 1 );
155
155
}
156
156
break ; }
157
157
}
158
-
158
+
159
159
return nargs;
160
160
}
161
161
@@ -167,25 +167,25 @@ int ModApiMapgen::l_set_mapgen_params(lua_State *L)
167
167
return 0 ;
168
168
169
169
EmergeManager *emerge = getServer (L)->getEmergeManager ();
170
- if (emerge->mapgen .size ())
170
+ if (!emerge || emerge->mapgen .size ())
171
171
return 0 ;
172
-
172
+
173
173
MapgenParams *oparams = new MapgenParams;
174
174
u32 paramsmodified = 0 ;
175
175
u32 flagmask = 0 ;
176
-
176
+
177
177
lua_getfield (L, 1 , " mgname" );
178
178
if (lua_isstring (L, -1 )) {
179
179
oparams->mg_name = std::string (lua_tostring (L, -1 ));
180
180
paramsmodified |= MGPARAMS_SET_MGNAME;
181
181
}
182
-
182
+
183
183
lua_getfield (L, 1 , " seed" );
184
184
if (lua_isnumber (L, -1 )) {
185
185
oparams->seed = lua_tointeger (L, -1 );
186
186
paramsmodified |= MGPARAMS_SET_SEED;
187
187
}
188
-
188
+
189
189
lua_getfield (L, 1 , " water_level" );
190
190
if (lua_isnumber (L, -1 )) {
191
191
oparams->water_level = lua_tointeger (L, -1 );
@@ -197,18 +197,20 @@ int ModApiMapgen::l_set_mapgen_params(lua_State *L)
197
197
std::string flagstr = std::string (lua_tostring (L, -1 ));
198
198
oparams->flags = readFlagString (flagstr, flagdesc_mapgen);
199
199
paramsmodified |= MGPARAMS_SET_FLAGS;
200
-
200
+
201
201
lua_getfield (L, 1 , " flagmask" );
202
202
if (lua_isstring (L, -1 )) {
203
203
flagstr = std::string (lua_tostring (L, -1 ));
204
204
flagmask = readFlagString (flagstr, flagdesc_mapgen);
205
205
}
206
206
}
207
-
207
+
208
+ delete emerge->luaoverride_params ;
209
+
208
210
emerge->luaoverride_params = oparams;
209
211
emerge->luaoverride_params_modified = paramsmodified;
210
212
emerge->luaoverride_flagmask = flagmask;
211
-
213
+
212
214
return 0 ;
213
215
}
214
216
@@ -240,7 +242,7 @@ int ModApiMapgen::l_register_biome(lua_State *L)
240
242
" air" );
241
243
b->nname_dust_water = getstringfield_default (L, index , " node_dust_water" ,
242
244
" mapgen_water_source" );
243
-
245
+
244
246
b->depth_top = getintfield_default (L, index , " depth_top" , 1 );
245
247
b->depth_filler = getintfield_default (L, index , " depth_filler" , 3 );
246
248
b->height_min = getintfield_default (L, index , " height_min" , 0 );
@@ -254,7 +256,7 @@ int ModApiMapgen::l_register_biome(lua_State *L)
254
256
b->c_water = CONTENT_IGNORE;
255
257
b->c_dust = CONTENT_IGNORE;
256
258
b->c_dust_water = CONTENT_IGNORE;
257
-
259
+
258
260
verbosestream << " register_biome: " << b->name << std::endl;
259
261
bmgr->addBiome (b);
260
262
@@ -277,7 +279,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
277
279
" decoration placement type" ;
278
280
return 0 ;
279
281
}
280
-
282
+
281
283
Decoration *deco = createDecoration (decotype);
282
284
if (!deco) {
283
285
errorstream << " register_decoration: decoration placement type "
@@ -295,11 +297,11 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
295
297
delete deco;
296
298
return 0 ;
297
299
}
298
-
300
+
299
301
lua_getfield (L, index , " noise_params" );
300
302
deco->np = read_noiseparams (L, -1 );
301
303
lua_pop (L, 1 );
302
-
304
+
303
305
lua_getfield (L, index , " biomes" );
304
306
if (lua_istable (L, -1 )) {
305
307
lua_pushnil (L);
@@ -313,7 +315,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
313
315
}
314
316
lua_pop (L, 1 );
315
317
}
316
-
318
+
317
319
switch (decotype) {
318
320
case DECO_SIMPLE: {
319
321
DecoSimple *dsimple = (DecoSimple *)deco;
@@ -323,7 +325,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
323
325
dsimple->deco_height = getintfield_default (L, index , " height" , 1 );
324
326
dsimple->deco_height_max = getintfield_default (L, index , " height_max" , 0 );
325
327
dsimple->nspawnby = getintfield_default (L, index , " num_spawn_by" , -1 );
326
-
328
+
327
329
lua_getfield (L, index , " decoration" );
328
330
if (lua_istable (L, -1 )) {
329
331
lua_pushnil (L);
@@ -340,7 +342,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
340
342
dsimple->deco_name = std::string (" air" );
341
343
}
342
344
lua_pop (L, 1 );
343
-
345
+
344
346
if (dsimple->deco_height <= 0 ) {
345
347
errorstream << " register_decoration: simple decoration height"
346
348
" must be greater than 0" << std::endl;
@@ -380,7 +382,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
380
382
return 0 ;
381
383
}
382
384
lua_pop (L, -1 );
383
-
385
+
384
386
if (!dschem->filename .empty () && !dschem->loadSchematicFile ()) {
385
387
errorstream << " register_decoration: failed to load schematic file '"
386
388
<< dschem->filename << " '" << std::endl;
@@ -390,7 +392,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
390
392
break ; }
391
393
case DECO_LSYSTEM: {
392
394
// DecoLSystem *decolsystem = (DecoLSystem *)deco;
393
-
395
+
394
396
break ; }
395
397
}
396
398
@@ -474,7 +476,7 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
474
476
v3s16 p1 = read_v3s16 (L, 1 );
475
477
v3s16 p2 = read_v3s16 (L, 2 );
476
478
sortBoxVerticies (p1, p2);
477
-
479
+
478
480
std::vector<std::pair<v3s16, u8> > prob_list;
479
481
if (lua_istable (L, 3 )) {
480
482
lua_pushnil (L);
@@ -483,15 +485,15 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
483
485
lua_getfield (L, -1 , " pos" );
484
486
v3s16 pos = read_v3s16 (L, -1 );
485
487
lua_pop (L, 1 );
486
-
488
+
487
489
u8 prob = getintfield_default (L, -1 , " prob" , MTSCHEM_PROB_ALWAYS);
488
490
prob_list.push_back (std::make_pair (pos, prob));
489
491
}
490
492
491
493
lua_pop (L, 1 );
492
494
}
493
495
}
494
-
496
+
495
497
std::vector<std::pair<s16, u8> > slice_prob_list;
496
498
if (lua_istable (L, 5 )) {
497
499
lua_pushnil (L);
@@ -516,7 +518,7 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
516
518
}
517
519
518
520
dschem.applyProbabilities (p1, &prob_list, &slice_prob_list);
519
-
521
+
520
522
dschem.saveSchematicFile (ndef);
521
523
actionstream << " create_schematic: saved schematic file '"
522
524
<< dschem.filename << " '." << std::endl;
@@ -536,11 +538,11 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
536
538
v3s16 p = read_v3s16 (L, 1 );
537
539
if (!read_schematic (L, 2 , &dschem, getServer (L)))
538
540
return 0 ;
539
-
541
+
540
542
int rot = ROTATE_0;
541
543
if (lua_isstring (L, 3 ))
542
544
string_to_enum (es_Rotation, rot, std::string (lua_tostring (L, 3 )));
543
-
545
+
544
546
dschem.rotation = (Rotation)rot;
545
547
546
548
if (lua_istable (L, 4 )) {
@@ -568,7 +570,7 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
568
570
}
569
571
dschem.resolveNodeNames (ndef);
570
572
}
571
-
573
+
572
574
dschem.placeStructure (map, p);
573
575
574
576
return 1 ;
0 commit comments