aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map.cpp27
-rw-r--r--src/mapblock.cpp58
-rw-r--r--src/mapnode.cpp10
-rw-r--r--src/mapnode.h1
-rw-r--r--src/materials.cpp1
-rw-r--r--src/server.cpp1
-rw-r--r--src/tile.cpp1
7 files changed, 97 insertions, 2 deletions
diff --git a/src/map.cpp b/src/map.cpp
index ac5bd7d14..fc674d263 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -2045,6 +2045,20 @@ void make_tree(VoxelManipulator &vmanip, v3s16 p0)
}
}
+void make_papyrus(VoxelManipulator &vmanip, v3s16 p0)
+{
+ MapNode papyrusnode(CONTENT_PAPYRUS);
+
+ s16 trunk_h = myrand_range(2, 3);
+ v3s16 p1 = p0;
+ for(s16 ii=0; ii<trunk_h; ii++)
+ {
+ if(vmanip.m_area.contains(p1))
+ vmanip.m_data[vmanip.m_area.index(p1)] = papyrusnode;
+ p1.Y++;
+ }
+}
+
void make_cactus(VoxelManipulator &vmanip, v3s16 p0)
{
MapNode cactusnode(CONTENT_CACTUS);
@@ -3225,7 +3239,7 @@ void makeChunk(ChunkMakeData *data)
s16 z = myrand_range(p2d_min.Y, p2d_max.Y);
s16 y = find_ground_level(data->vmanip, v2s16(x,z));
// Don't make a tree under water level
- if(y < WATER_LEVEL)
+ if(y < WATER_LEVEL - 1)
continue;
// Don't make a tree so high that it doesn't fit
if(y > y_nodes_max - 6)
@@ -3236,6 +3250,15 @@ void makeChunk(ChunkMakeData *data)
MapNode *n = &data->vmanip.m_data[i];
if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS && n->d != CONTENT_SAND)
continue;
+ // Papyrus grows only on mud and in water
+ if(n->d == CONTENT_MUD && y == WATER_LEVEL - 1)
+ {
+ p.Y++;
+ make_papyrus(data->vmanip, p);
+ }
+ // Don't make a tree under water level
+ if(y < WATER_LEVEL)
+ continue;
// Trees grow only on mud and grass
if(n->d == CONTENT_MUD || n->d == CONTENT_GRASS)
{
@@ -3243,7 +3266,7 @@ void makeChunk(ChunkMakeData *data)
make_tree(data->vmanip, p);
}
// Cactii grow only on sand
- if(n->d == CONTENT_SAND)
+ else if(n->d == CONTENT_SAND)
{
p.Y++;
make_cactus(data->vmanip, p);
diff --git a/src/mapblock.cpp b/src/mapblock.cpp
index d98bfaf1e..c6b82634d 100644
--- a/src/mapblock.cpp
+++ b/src/mapblock.cpp
@@ -987,6 +987,16 @@ scene::SMesh* makeMapBlockMesh(MeshMakeData *data)
g_texturesource->getTextureId("wood.png"));
material_wood.setTexture(0, pa_wood.atlas);
+ // Papyrus material
+ video::SMaterial material_papyrus;
+ material_papyrus.setFlag(video::EMF_LIGHTING, false);
+ material_papyrus.setFlag(video::EMF_BILINEAR_FILTER, false);
+ material_papyrus.setFlag(video::EMF_FOG_ENABLE, true);
+ material_papyrus.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
+ AtlasPointer pa_papyrus = g_texturesource->getTexture(
+ g_texturesource->getTextureId("papyrus.png"));
+ material_papyrus.setTexture(0, pa_papyrus.atlas);
+
for(s16 z=0; z<MAP_BLOCKSIZE; z++)
for(s16 y=0; y<MAP_BLOCKSIZE; y++)
for(s16 x=0; x<MAP_BLOCKSIZE; x++)
@@ -1612,8 +1622,56 @@ scene::SMesh* makeMapBlockMesh(MeshMakeData *data)
}
}
+ else if(n.d == CONTENT_PAPYRUS)
+ {
+ u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
+ video::SColor c(255,l,l,l);
+
+ for(u32 j=0; j<4; j++)
+ {
+ video::S3DVertex vertices[4] =
+ {
+ video::S3DVertex(-BS/2,-BS/2,0, 0,0,0, c,
+ pa_papyrus.x0(), pa_papyrus.y1()),
+ video::S3DVertex(BS/2,-BS/2,0, 0,0,0, c,
+ pa_papyrus.x1(), pa_papyrus.y1()),
+ video::S3DVertex(BS/2,BS/2,0, 0,0,0, c,
+ pa_papyrus.x1(), pa_papyrus.y0()),
+ video::S3DVertex(-BS/2,BS/2,0, 0,0,0, c,
+ pa_papyrus.x0(), pa_papyrus.y0()),
+ };
+
+ if(j == 0)
+ {
+ for(u16 i=0; i<4; i++)
+ vertices[i].Pos.rotateXZBy(45);
+ }
+ else if(j == 1)
+ {
+ for(u16 i=0; i<4; i++)
+ vertices[i].Pos.rotateXZBy(-45);
+ }
+ else if(j == 2)
+ {
+ for(u16 i=0; i<4; i++)
+ vertices[i].Pos.rotateXZBy(135);
+ }
+ else if(j == 3)
+ {
+ for(u16 i=0; i<4; i++)
+ vertices[i].Pos.rotateXZBy(-135);
+ }
+ for(u16 i=0; i<4; i++)
+ {
+ vertices[i].Pos += intToFloat(p + blockpos_nodes, BS);
+ }
+ u16 indices[] = {0,1,2,2,3,0};
+ // Add to mesh collector
+ collector.append(material_papyrus, vertices, 4, indices, 6);
+ }
+ }
}
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index cef9bbf03..954c85f2f 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -241,6 +241,16 @@ void init_mapnode()
f->is_ground_content = true;
f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ i = CONTENT_PAPYRUS;
+ f = &g_content_features[i];
+ f->setInventoryTexture("papyrus.png");
+ f->light_propagates = true;
+ f->param_type = CPT_LIGHT;
+ f->is_ground_content = true;
+ f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+ f->solidness = 0; // drawn separately, makes no faces
+ f->walkable = false;
+
i = CONTENT_GLASS;
f = &g_content_features[i];
f->light_propagates = true;
diff --git a/src/mapnode.h b/src/mapnode.h
index e8cc0ab51..52d0199c4 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -105,6 +105,7 @@ void init_content_inventory_texture_paths();
#define CONTENT_CACTUS 23
#define CONTENT_BRICK 24
#define CONTENT_CLAY 25
+#define CONTENT_PAPYRUS 26
/*
Content feature list
diff --git a/src/materials.cpp b/src/materials.cpp
index 8c23056f2..e95ca7ba9 100644
--- a/src/materials.cpp
+++ b/src/materials.cpp
@@ -76,6 +76,7 @@ void initializeMaterialProperties()
setWoodLikeDiggingProperties(CONTENT_TREE, 1.0);
setWoodLikeDiggingProperties(CONTENT_LEAVES, 0.15);
setWoodLikeDiggingProperties(CONTENT_CACTUS, 0.75);
+ setWoodLikeDiggingProperties(CONTENT_PAPYRUS, 0.25);
setWoodLikeDiggingProperties(CONTENT_GLASS, 0.15);
setWoodLikeDiggingProperties(CONTENT_FENCE, 0.75);
setWoodLikeDiggingProperties(CONTENT_WOOD, 0.75);
diff --git a/src/server.cpp b/src/server.cpp
index 17850c5fa..e9875456c 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -4111,6 +4111,7 @@ void setCreativeInventory(Player *player)
CONTENT_TREE,
CONTENT_LEAVES,
CONTENT_CACTUS,
+ CONTENT_PAPYRUS,
CONTENT_GLASS,
CONTENT_FENCE,
CONTENT_MESE,
diff --git a/src/tile.cpp b/src/tile.cpp
index 71e0c9638..c77262c49 100644
--- a/src/tile.cpp
+++ b/src/tile.cpp
@@ -517,6 +517,7 @@ void TextureSource::buildMainAtlas()
sourcelist.push_back("leaves.png");
sourcelist.push_back("cactus_side.png");
sourcelist.push_back("cactus_top.png");
+ sourcelist.push_back("papyrus.png");
sourcelist.push_back("glass.png");
sourcelist.push_back("mud.png^grass_side.png");
sourcelist.push_back("cobble.png");