@@ -501,7 +501,7 @@ void MapgenV5::generateCaves(int max_stone_y)
501501 index2d = index2d + ystride;
502502 }
503503
504- if (node_max.Y > - 256 )
504+ if (node_max.Y > LARGE_CAVE_DEPTH )
505505 return ;
506506
507507 PseudoRandom ps (blockseed + 21343 );
@@ -528,21 +528,36 @@ void MapgenV5::dustTopNodes()
528528 if (biome->c_dust == CONTENT_IGNORE)
529529 continue ;
530530
531- s16 y = node_max.Y + 1 ;
532- u32 vi = vm->m_area .index (x, y, z);
533- for (; y >= node_min.Y ; y--) {
531+ s16 y_full_max = full_node_max.Y ;
532+ u32 vi_full_max = vm->m_area .index (x, y_full_max, z);
533+ content_t c_full_max = vm->m_data [vi_full_max].getContent ();
534+ s16 y_start;
535+
536+ if (c_full_max == CONTENT_AIR) {
537+ y_start = y_full_max - 1 ;
538+ } else if (c_full_max == CONTENT_IGNORE) {
539+ s16 y_max = node_max.Y ;
540+ u32 vi_max = vm->m_area .index (x, y_max, z);
541+ content_t c_max = vm->m_data [vi_max].getContent ();
542+
543+ if (c_max == CONTENT_AIR)
544+ y_start = y_max - 1 ;
545+ else
546+ continue ;
547+ } else {
548+ continue ;
549+ }
550+
551+ u32 vi = vm->m_area .index (x, y_start, z);
552+ for (s16 y = y_start; y >= node_min.Y - 1 ; y--) {
534553 if (vm->m_data [vi].getContent () != CONTENT_AIR)
535554 break ;
536555
537556 vm->m_area .add_y (em, vi, -1 );
538557 }
539558
540559 content_t c = vm->m_data [vi].getContent ();
541- if (!ndef->get (c).buildable_to && c != CONTENT_IGNORE
542- && c != biome->c_dust ) {
543- if (y == node_max.Y + 1 )
544- continue ;
545-
560+ if (!ndef->get (c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust ) {
546561 vm->m_area .add_y (em, vi, 1 );
547562 vm->m_data [vi] = MapNode (biome->c_dust );
548563 }
0 commit comments