#include "mineral.h"
//#include "serverobject.h"
#include "content_sao.h"
+#include "mapnode_contentfeatures.h"
namespace mapgen
{
{
MapNode &n = vmanip.m_data[i];
if(content_walkable(n.d)
- && n.d != CONTENT_TREE
- && n.d != CONTENT_LEAVES)
+ && n.getContent() != CONTENT_TREE
+ && n.getContent() != CONTENT_LEAVES)
break;
vmanip.m_area.add_y(em, i, -1);
}
#endif
-static void make_tree(VoxelManipulator &vmanip, v3s16 p0)
+void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, bool is_apple_tree)
{
MapNode treenode(CONTENT_TREE);
MapNode leavesnode(CONTENT_LEAVES);
-
+ MapNode applenode(CONTENT_APPLE);
+
s16 trunk_h = myrand_range(4, 5);
v3s16 p1 = p0;
for(s16 ii=0; ii<trunk_h; ii++)
if(vmanip.m_area.contains(p) == false)
continue;
u32 vi = vmanip.m_area.index(p);
- if(vmanip.m_data[vi].d != CONTENT_AIR
- && vmanip.m_data[vi].d != CONTENT_IGNORE)
+ if(vmanip.m_data[vi].getContent() != CONTENT_AIR
+ && vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
continue;
u32 i = leaves_a.index(x,y,z);
- if(leaves_d[i] == 1)
- vmanip.m_data[vi] = leavesnode;
+ if(leaves_d[i] == 1) {
+ bool is_apple = myrand_range(0,99) < 10;
+ if(is_apple_tree && is_apple) {
+ vmanip.m_data[vi] = applenode;
+ } else {
+ vmanip.m_data[vi] = leavesnode;
+ }
+ }
}
}
if(vmanip.m_area.contains(p) == false)
continue;
u32 vi = vmanip.m_area.index(p);
- if(vmanip.m_data[vi].d != CONTENT_AIR
- && vmanip.m_data[vi].d != CONTENT_IGNORE)
+ if(vmanip.m_data[vi].getContent() != CONTENT_AIR
+ && vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
continue;
u32 i = leaves_a.index(x,y,z);
if(leaves_d[i] == 1)
if(vmanip.m_area.contains(p) == false)
continue;
u32 vi = vmanip.m_area.index(p);
- if(vmanip.m_data[vi].d != CONTENT_AIR
- && vmanip.m_data[vi].d != CONTENT_IGNORE)
+ if(vmanip.m_data[vi].getContent() != CONTENT_AIR
+ && vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
continue;
u32 i = stone_a.index(x,y,z);
if(stone_d[i] == 1)
if(vmanip.m_area.contains(p) == false)
continue;
u32 vi = vmanip.m_area.index(p);
- /*if(vmanip.m_data[vi].d != CONTENT_AIR
- && vmanip.m_data[vi].d != CONTENT_IGNORE)
+ /*if(vmanip.m_data[vi].getContent() != CONTENT_AIR
+ && vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
continue;*/
u32 i = stone_a.index(x,y,z);
if(stone_d[i] == 1)
p.Y += make_stairs;
/*// If already empty
- if(vmanip.getNodeNoExNoEmerge(p).d
+ if(vmanip.getNodeNoExNoEmerge(p).getContent()
== CONTENT_AIR
- && vmanip.getNodeNoExNoEmerge(p+v3s16(0,1,0)).d
+ && vmanip.getNodeNoExNoEmerge(p+v3s16(0,1,0)).getContent()
== CONTENT_AIR)
{
}*/
randomizeDir();
continue;
}
- if(vmanip.getNodeNoExNoEmerge(p).d
+ if(vmanip.getNodeNoExNoEmerge(p).getContent()
== CONTENT_COBBLE
- && vmanip.getNodeNoExNoEmerge(p1).d
+ && vmanip.getNodeNoExNoEmerge(p1).getContent()
== CONTENT_COBBLE)
{
// Found wall, this is a good place!
Determine where to move next
*/
// Jump one up if the actual space is there
- if(vmanip.getNodeNoExNoEmerge(p+v3s16(0,0,0)).d
+ if(vmanip.getNodeNoExNoEmerge(p+v3s16(0,0,0)).getContent()
== CONTENT_COBBLE
- && vmanip.getNodeNoExNoEmerge(p+v3s16(0,1,0)).d
+ && vmanip.getNodeNoExNoEmerge(p+v3s16(0,1,0)).getContent()
== CONTENT_AIR
- && vmanip.getNodeNoExNoEmerge(p+v3s16(0,2,0)).d
+ && vmanip.getNodeNoExNoEmerge(p+v3s16(0,2,0)).getContent()
== CONTENT_AIR)
p += v3s16(0,1,0);
// Jump one down if the actual space is there
- if(vmanip.getNodeNoExNoEmerge(p+v3s16(0,1,0)).d
+ if(vmanip.getNodeNoExNoEmerge(p+v3s16(0,1,0)).getContent()
== CONTENT_COBBLE
- && vmanip.getNodeNoExNoEmerge(p+v3s16(0,0,0)).d
+ && vmanip.getNodeNoExNoEmerge(p+v3s16(0,0,0)).getContent()
== CONTENT_AIR
- && vmanip.getNodeNoExNoEmerge(p+v3s16(0,-1,0)).d
+ && vmanip.getNodeNoExNoEmerge(p+v3s16(0,-1,0)).getContent()
== CONTENT_AIR)
p += v3s16(0,-1,0);
// Check if walking is now possible
- if(vmanip.getNodeNoExNoEmerge(p).d
+ if(vmanip.getNodeNoExNoEmerge(p).getContent()
!= CONTENT_AIR
- || vmanip.getNodeNoExNoEmerge(p+v3s16(0,1,0)).d
+ || vmanip.getNodeNoExNoEmerge(p+v3s16(0,1,0)).getContent()
!= CONTENT_AIR)
{
// Cannot continue walking here
fits = false;
break;
}
- if(vmanip.m_data[vi].d == CONTENT_IGNORE)
+ if(vmanip.m_data[vi].getContent() == CONTENT_IGNORE)
{
fits = false;
break;
}
}
+static void make_nc(VoxelManipulator &vmanip, PseudoRandom &random)
+{
+ v3s16 dir;
+ u8 facedir_i = 0;
+ s32 r = random.range(0, 3);
+ if(r == 0){
+ dir = v3s16( 1, 0, 0);
+ facedir_i = 3;
+ }
+ if(r == 1){
+ dir = v3s16(-1, 0, 0);
+ facedir_i = 1;
+ }
+ if(r == 2){
+ dir = v3s16( 0, 0, 1);
+ facedir_i = 2;
+ }
+ if(r == 3){
+ dir = v3s16( 0, 0,-1);
+ facedir_i = 0;
+ }
+ v3s16 p = vmanip.m_area.MinEdge + v3s16(
+ 16+random.range(0,15),
+ 16+random.range(0,15),
+ 16+random.range(0,15));
+ vmanip.m_data[vmanip.m_area.index(p)] = MapNode(CONTENT_NC, facedir_i);
+ u32 length = random.range(3,15);
+ for(u32 j=0; j<length; j++)
+ {
+ p -= dir;
+ vmanip.m_data[vmanip.m_area.index(p)] = MapNode(CONTENT_NC_RB);
+ }
+}
+
/*
Noise functions. Make sure seed is mangled differently in each one.
*/
*/
void add_random_objects(MapBlock *block)
{
+#if 0
for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++)
for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++)
{
{
v3s16 p(x0,y0,z0);
MapNode n = block->getNodeNoEx(p);
- if(n.d == CONTENT_IGNORE)
+ if(n.getContent() == CONTENT_IGNORE)
continue;
- if(content_features(n.d).liquid_type != LIQUID_NONE)
+ if(content_features(n).liquid_type != LIQUID_NONE)
continue;
- if(content_features(n.d).walkable)
+ if(content_features(n).walkable)
{
last_node_walkable = true;
continue;
if(last_node_walkable)
{
// If block contains light information
- if(content_features(n.d).param_type == CPT_LIGHT)
+ if(content_features(n).param_type == CPT_LIGHT)
{
if(n.getLight(LIGHTBANK_DAY) <= 3)
{
}
}
block->setChangedFlag();
+#endif
}
void make_block(BlockMakeData *data)
for(s16 y=node_min.Y; y<=node_max.Y; y++)
{
// Only modify places that have no content
- if(vmanip.m_data[i].d == CONTENT_IGNORE)
+ if(vmanip.m_data[i].getContent() == CONTENT_IGNORE)
{
if(y <= WATER_LEVEL)
vmanip.m_data[i] = MapNode(CONTENT_WATERSOURCE);
/*
Create a block-specific seed
*/
- u32 blockseed = (u32)(data->seed%0x100000000) + full_node_min.Z*38134234
+ u32 blockseed = (u32)(data->seed%0x100000000ULL) + full_node_min.Z*38134234
+ full_node_min.Y*42123 + full_node_min.X*23;
/*
for(s16 y=node_min.Y; y<=node_max.Y; y++)
{
// Only modify places that have no content
- if(vmanip.m_data[i].d == CONTENT_IGNORE)
+ if(vmanip.m_data[i].getContent() == CONTENT_IGNORE)
{
// First priority: make air and water.
// This avoids caves inside water.
{
v3s16 p = v3s16(x,y,z) + g_27dirs[i];
u32 vi = vmanip.m_area.index(p);
- if(vmanip.m_data[vi].d == CONTENT_STONE)
+ if(vmanip.m_data[vi].getContent() == CONTENT_STONE)
if(mineralrandom.next()%8 == 0)
vmanip.m_data[vi] = MapNode(CONTENT_MESE);
}
{
}*/
- if(new_content.d != CONTENT_IGNORE)
+ if(new_content.getContent() != CONTENT_IGNORE)
{
for(u16 i=0; i<27; i++)
{
v3s16 p = v3s16(x,y,z) + g_27dirs[i];
u32 vi = vmanip.m_area.index(p);
- if(vmanip.m_data[vi].d == base_content)
+ if(vmanip.m_data[vi].getContent() == base_content)
{
if(mineralrandom.next()%sparseness == 0)
vmanip.m_data[vi] = new_content;
{
v3s16 p = v3s16(x,y,z) + g_27dirs[i];
u32 vi = vmanip.m_area.index(p);
- if(vmanip.m_data[vi].d == CONTENT_STONE)
+ if(vmanip.m_data[vi].getContent() == CONTENT_STONE)
if(mineralrandom.next()%8 == 0)
vmanip.m_data[vi] = MapNode(CONTENT_STONE, MINERAL_COAL);
}
{
v3s16 p = v3s16(x,y,z) + g_27dirs[i];
u32 vi = vmanip.m_area.index(p);
- if(vmanip.m_data[vi].d == CONTENT_STONE)
+ if(vmanip.m_data[vi].getContent() == CONTENT_STONE)
if(mineralrandom.next()%8 == 0)
vmanip.m_data[vi] = MapNode(CONTENT_STONE, MINERAL_IRON);
}
u32 i = vmanip.m_area.index(v3s16(p2d.X, node_max.Y, p2d.Y));
for(s16 y=node_max.Y; y>=node_min.Y; y--)
{
- if(vmanip.m_data[i].d == CONTENT_STONE)
+ if(vmanip.m_data[i].getContent() == CONTENT_STONE)
{
if(noisebuf_ground_crumbleness.get(x,y,z) > 1.3)
{
if(noisebuf_ground_wetness.get(x,y,z) < -0.6)
vmanip.m_data[i] = MapNode(CONTENT_GRAVEL);
}
+ else if(noisebuf_ground_crumbleness.get(x,y,z) <
+ -3.0 + MYMIN(0.1 * sqrt((float)MYMAX(0, -y)), 1.5))
+ {
+ vmanip.m_data[i] = MapNode(CONTENT_LAVASOURCE);
+ for(s16 x1=-1; x1<=1; x1++)
+ for(s16 y1=-1; y1<=1; y1++)
+ for(s16 z1=-1; z1<=1; z1++)
+ data->transforming_liquid.push_back(
+ v3s16(p2d.X+x1, y+y1, p2d.Y+z1));
+ }
}
data->vmanip->m_area.add_y(em, i, -1);
u32 i = vmanip.m_area.index(v3s16(p2d.X, full_node_max.Y, p2d.Y));
for(s16 y=full_node_max.Y; y>=full_node_min.Y; y--)
{
- if(vmanip.m_data[i].d == CONTENT_AIR)
+ if(vmanip.m_data[i].getContent() == CONTENT_AIR)
vmanip.m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE;
- else if(vmanip.m_data[i].d == CONTENT_WATERSOURCE)
+ else if(vmanip.m_data[i].getContent() == CONTENT_WATERSOURCE)
vmanip.m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE;
data->vmanip->m_area.add_y(em, i, -1);
}
double d = noise3d_perlin((float)x/2.5,
(float)y/2.5,(float)z/2.5,
blockseed, 2, 1.4);
- if(vmanip.m_data[i].d == CONTENT_COBBLE)
+ if(vmanip.m_data[i].getContent() == CONTENT_COBBLE)
{
if(d < wetness/3.0)
{
- vmanip.m_data[i].d = CONTENT_MOSSYCOBBLE;
+ vmanip.m_data[i].setContent(CONTENT_MOSSYCOBBLE);
}
}
/*else if(vmanip.m_flags[i] & VMANIP_FLAG_DUNGEON_INSIDE)
{
if(wetness > 1.2)
- vmanip.m_data[i].d = CONTENT_MUD;
+ vmanip.m_data[i].setContent(CONTENT_MUD);
}*/
data->vmanip->m_area.add_y(em, i, -1);
}
}
}
}
+
+ /*
+ Add NC
+ */
+ {
+ PseudoRandom ncrandom(blockseed+9324342);
+ if(ncrandom.range(0, 1000) == 0 && blockpos.Y <= -3)
+ {
+ make_nc(vmanip, ncrandom);
+ }
+ }
/*
Add top and bottom side of water to transforming_liquid queue
{
if(water_found == false)
{
- if(vmanip.m_data[i].d == CONTENT_WATERSOURCE)
+ if(vmanip.m_data[i].getContent() == CONTENT_WATERSOURCE)
{
v3s16 p = v3s16(p2d.X, y, p2d.Y);
data->transforming_liquid.push_back(p);
// This can be done because water_found can only
// turn to true and end up here after going through
// a single block.
- if(vmanip.m_data[i+1].d != CONTENT_WATERSOURCE)
+ if(vmanip.m_data[i+1].getContent() != CONTENT_WATERSOURCE)
{
v3s16 p = v3s16(p2d.X, y+1, p2d.Y);
data->transforming_liquid.push_back(p);
u32 i = vmanip.m_area.index(v3s16(p2d.X, start_y, p2d.Y));
for(s16 y=start_y; y>=node_min.Y-3; y--)
{
- if(vmanip.m_data[i].d == CONTENT_WATERSOURCE)
+ if(vmanip.m_data[i].getContent() == CONTENT_WATERSOURCE)
water_detected = true;
- if(vmanip.m_data[i].d == CONTENT_AIR)
+ if(vmanip.m_data[i].getContent() == CONTENT_AIR)
air_detected = true;
- if((vmanip.m_data[i].d == CONTENT_STONE
- || vmanip.m_data[i].d == CONTENT_GRASS
- || vmanip.m_data[i].d == CONTENT_MUD
- || vmanip.m_data[i].d == CONTENT_SAND
- || vmanip.m_data[i].d == CONTENT_GRAVEL
+ if((vmanip.m_data[i].getContent() == CONTENT_STONE
+ || vmanip.m_data[i].getContent() == CONTENT_GRASS
+ || vmanip.m_data[i].getContent() == CONTENT_MUD
+ || vmanip.m_data[i].getContent() == CONTENT_SAND
+ || vmanip.m_data[i].getContent() == CONTENT_GRAVEL
) && (air_detected || water_detected))
{
if(current_depth == 0 && y <= WATER_LEVEL+2
}
else
{
- if(vmanip.m_data[i].d == CONTENT_MUD
- || vmanip.m_data[i].d == CONTENT_GRASS)
+ if(vmanip.m_data[i].getContent() == CONTENT_MUD
+ || vmanip.m_data[i].getContent() == CONTENT_GRASS)
vmanip.m_data[i] = MapNode(CONTENT_STONE);
}
{
u32 i = data->vmanip->m_area.index(p);
MapNode *n = &data->vmanip->m_data[i];
- //if(n->d != CONTENT_AIR && n->d != CONTENT_WATERSOURCE && n->d != CONTENT_IGNORE)
- if(content_features(n->d).is_ground_content)
+ if(n->getContent() != CONTENT_AIR && n->getContent() != CONTENT_WATERSOURCE && n->getContent() != CONTENT_IGNORE)
{
found = true;
break;
u32 i = data->vmanip->m_area.index(p);
MapNode *n = &data->vmanip->m_data[i];
- if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS && n->d != CONTENT_SAND)
+ if(n->getContent() != CONTENT_MUD && n->getContent() != CONTENT_GRASS && n->getContent() != CONTENT_SAND)
continue;
// Papyrus grows only on mud and in water
- if(n->d == CONTENT_MUD && y <= WATER_LEVEL)
+ if(n->getContent() == CONTENT_MUD && y <= WATER_LEVEL)
{
p.Y++;
make_papyrus(vmanip, p);
}
// Trees grow only on mud and grass, on land
- else if((n->d == CONTENT_MUD || n->d == CONTENT_GRASS) && y > WATER_LEVEL + 2)
+ else if((n->getContent() == CONTENT_MUD || n->getContent() == CONTENT_GRASS) && y > WATER_LEVEL + 2)
{
p.Y++;
//if(surface_humidity_2d(data->seed, v2s16(x, y)) < 0.5)
if(is_jungle == false)
- make_tree(vmanip, p);
+ {
+ bool is_apple_tree;
+ if(myrand_range(0,4) != 0)
+ is_apple_tree = false;
+ else
+ is_apple_tree = noise2d_perlin(
+ 0.5+(float)p.X/100, 0.5+(float)p.Z/100,
+ data->seed+342902, 3, 0.45) > 0.2;
+ make_tree(vmanip, p, is_apple_tree);
+ }
else
make_jungletree(vmanip, p);
}
// Cactii grow only on sand, on land
- else if(n->d == CONTENT_SAND && y > WATER_LEVEL + 2)
+ else if(n->getContent() == CONTENT_SAND && y > WATER_LEVEL + 2)
{
p.Y++;
make_cactus(vmanip, p);
{
u32 i = data->vmanip->m_area.index(p);
MapNode *n = &data->vmanip->m_data[i];
- if(content_features(n->d).is_ground_content
- || n->d == CONTENT_JUNGLETREE)
+ if(content_features(*n).is_ground_content
+ || n->getContent() == CONTENT_JUNGLETREE)
{
found = true;
break;
p.Y++;
if(vmanip.m_area.contains(p) == false)
continue;
- if(vmanip.m_data[vmanip.m_area.index(p)].d != CONTENT_AIR)
+ if(vmanip.m_data[vmanip.m_area.index(p)].getContent() != CONTENT_AIR)
continue;
/*p.Y--;
if(vmanip.m_area.contains(p))
/*{
u32 i = data->vmanip->m_area.index(v3s16(p));
MapNode *n = &data->vmanip->m_data[i];
- if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS)
+ if(n->getContent() != CONTENT_MUD && n->getContent() != CONTENT_GRASS)
continue;
}*/
// Will be placed one higher
/*{
u32 i = data->vmanip->m_area.index(v3s16(p));
MapNode *n = &data->vmanip->m_data[i];
- if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS)
+ if(n->getContent() != CONTENT_MUD && n->getContent() != CONTENT_GRASS)
continue;
}*/
// Will be placed one lower