@@ -149,9 +149,10 @@ void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
149
149
continue ;
150
150
151
151
u32 i = vm->m_area .index (x0 + x1, y0 + y1, z0 + z1);
152
- for (size_t ii = 0 ; ii < c_wherein.size (); ii++)
153
- if (vm->m_data [i].getContent () == c_wherein[ii])
154
- vm->m_data [i] = n_ore;
152
+ if (!CONTAINS (c_wherein, vm->m_data [i].getContent ()))
153
+ continue ;
154
+
155
+ vm->m_data [i] = n_ore;
155
156
}
156
157
}
157
158
}
@@ -187,13 +188,10 @@ void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
187
188
u32 i = vm->m_area .index (x, y, z);
188
189
if (!vm->m_area .contains (i))
189
190
continue ;
191
+ if (!CONTAINS (c_wherein, vm->m_data [i].getContent ()))
192
+ continue ;
190
193
191
- for (size_t ii = 0 ; ii < c_wherein.size (); ii++) {
192
- if (vm->m_data [i].getContent () == c_wherein[ii]) {
193
- vm->m_data [i] = n_ore;
194
- break ;
195
- }
196
- }
194
+ vm->m_data [i] = n_ore;
197
195
}
198
196
}
199
197
}
@@ -360,53 +358,56 @@ void Decoration::placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
360
358
361
359
// /////////////////////////////////////////////////////////////////////////////
362
360
363
-
364
- void DecoSimple::generate (Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) {
365
- ManualMapVoxelManipulator *vm = mg->vm ;
361
+ bool DecoSimple::canPlaceDecoration (ManualMapVoxelManipulator *vm, v3s16 p) {
362
+ // Don't bother if there aren't any decorations to place
363
+ if (c_decos.size () == 0 )
364
+ return false ;
366
365
367
366
u32 vi = vm->m_area .index (p);
368
- content_t c = vm->m_data [vi].getContent ();
369
- size_t idx;
370
- for (idx = 0 ; idx != c_place_on.size (); idx++) {
371
- if (c == c_place_on[idx])
372
- break ;
373
- }
374
- if ((idx != 0 ) && (idx == c_place_on.size ()))
375
- return ;
376
367
377
- if (nspawnby != -1 ) {
378
- int nneighs = 0 ;
379
- v3s16 dirs[8 ] = { // a Moore neighborhood
380
- v3s16 ( 0 , 0 , 1 ),
381
- v3s16 ( 0 , 0 , -1 ),
382
- v3s16 ( 1 , 0 , 0 ),
383
- v3s16 (-1 , 0 , 0 ),
384
- v3s16 ( 1 , 0 , 1 ),
385
- v3s16 (-1 , 0 , 1 ),
386
- v3s16 (-1 , 0 , -1 ),
387
- v3s16 ( 1 , 0 , -1 )
388
- };
389
-
390
- for (int i = 0 ; i != 8 ; i++) {
391
- u32 index = vm->m_area .index (p + dirs[i]);
392
- if (!vm->m_area .contains (index))
393
- continue ;
368
+ // Check if the decoration can be placed on this node
369
+ if (!CONTAINS (c_place_on, vm->m_data [vi].getContent ()))
370
+ return false ;
394
371
395
- content_t c = vm->m_data [index].getContent ();
396
- for (size_t j = 0 ; j != c_spawnby.size (); j++) {
397
- if (c == c_spawnby[j]) {
398
- nneighs++;
399
- break ;
400
- }
401
- }
402
- }
372
+ // Don't continue if there are no spawnby constraints
373
+ if (nspawnby == -1 )
374
+ return true ;
375
+
376
+ int nneighs = 0 ;
377
+ v3s16 dirs[8 ] = {
378
+ v3s16 ( 0 , 0 , 1 ),
379
+ v3s16 ( 0 , 0 , -1 ),
380
+ v3s16 ( 1 , 0 , 0 ),
381
+ v3s16 (-1 , 0 , 0 ),
382
+ v3s16 ( 1 , 0 , 1 ),
383
+ v3s16 (-1 , 0 , 1 ),
384
+ v3s16 (-1 , 0 , -1 ),
385
+ v3s16 ( 1 , 0 , -1 )
386
+ };
387
+
388
+ // Check a Moore neighborhood if there are enough spawnby nodes
389
+ for (size_t i = 0 ; i != ARRLEN (dirs); i++) {
390
+ u32 index = vm->m_area .index (p + dirs[i]);
391
+ if (!vm->m_area .contains (index))
392
+ continue ;
403
393
404
- if (nneighs < nspawnby )
405
- return ;
394
+ if (CONTAINS (c_spawnby, vm-> m_data [index]. getContent ()) )
395
+ nneighs++ ;
406
396
}
407
397
408
- if (c_decos.size () == 0 )
398
+ if (nneighs < nspawnby)
399
+ return false ;
400
+
401
+ return true ;
402
+ }
403
+
404
+
405
+ void DecoSimple::generate (Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) {
406
+ ManualMapVoxelManipulator *vm = mg->vm ;
407
+
408
+ if (!canPlaceDecoration (vm, p))
409
409
return ;
410
+
410
411
content_t c_place = c_decos[pr->range (0 , c_decos.size () - 1 )];
411
412
412
413
s16 height = (deco_height_max > 0 ) ?
@@ -415,6 +416,7 @@ void DecoSimple::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) {
415
416
height = MYMIN (height, max_y - p.Y );
416
417
417
418
v3s16 em = vm->m_area .getExtent ();
419
+ u32 vi = vm->m_area .index (p);
418
420
for (int i = 0 ; i < height; i++) {
419
421
vm->m_area .add_y (em, vi, 1 );
420
422
@@ -477,12 +479,7 @@ void DecoSchematic::generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) {
477
479
478
480
u32 vi = vm->m_area .index (p);
479
481
content_t c = vm->m_data [vi].getContent ();
480
- size_t idx;
481
- for (idx = 0 ; idx != c_place_on.size (); idx++) {
482
- if (c == c_place_on[idx])
483
- break ;
484
- }
485
- if ((idx != 0 ) && (idx == c_place_on.size ()))
482
+ if (!CONTAINS (c_place_on, c))
486
483
return ;
487
484
488
485
Rotation rot = (rotation == ROTATE_RAND) ?
0 commit comments