ServerRemotePlayer implements ServerActiveObject
[oweals/minetest.git] / src / content_mapnode.cpp
index ec0a7df05e3d09e7eee5484f7671536cad40ac32..f10b941ba57b6ea1b261bfef91a9342b06002a6b 100644 (file)
@@ -107,6 +107,7 @@ void content_mapnode_init()
        bool new_style_water = g_settings->getBool("new_style_water");
        bool new_style_leaves = g_settings->getBool("new_style_leaves");
        bool invisible_stone = g_settings->getBool("invisible_stone");
+       bool opaque_water = g_settings->getBool("opaque_water");
 
        content_t i;
        ContentFeatures *f = NULL;
@@ -398,7 +399,8 @@ void content_mapnode_init()
        f->liquid_alternative_source = CONTENT_WATERSOURCE;
        f->liquid_viscosity = WATER_VISC;
 #ifndef SERVER
-       f->vertex_alpha = WATER_ALPHA;
+       if(!opaque_water)
+               f->vertex_alpha = WATER_ALPHA;
        f->post_effect_color = video::SColor(64, 100, 100, 200);
        if(f->special_material == NULL && g_texturesource)
        {
@@ -408,10 +410,17 @@ void content_mapnode_init()
                f->special_material->setFlag(video::EMF_BACK_FACE_CULLING, false);
                f->special_material->setFlag(video::EMF_BILINEAR_FILTER, false);
                f->special_material->setFlag(video::EMF_FOG_ENABLE, true);
-               f->special_material->MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
+               if(!opaque_water)
+                       f->special_material->MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
                AtlasPointer *pa_water1 = new AtlasPointer(g_texturesource->getTexture(
                                g_texturesource->getTextureId("water.png")));
                f->special_material->setTexture(0, pa_water1->atlas);
+
+               // Flowing water material, backface culled
+               f->special_material2 = new video::SMaterial;
+               *f->special_material2 = *f->special_material;
+               f->special_material2->setFlag(video::EMF_BACK_FACE_CULLING, true);
+               
                f->special_atlas = pa_water1;
        }
 #endif
@@ -432,8 +441,10 @@ void content_mapnode_init()
                if(g_texturesource)
                        t.texture = g_texturesource->getTexture("water.png");
                
-               t.alpha = WATER_ALPHA;
-               t.material_type = MATERIAL_ALPHA_VERTEX;
+               if(!opaque_water){
+                       t.alpha = WATER_ALPHA;
+                       t.material_type = MATERIAL_ALPHA_VERTEX;
+               }
                t.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING;
                f->setAllTiles(t);
 #endif
@@ -450,11 +461,12 @@ void content_mapnode_init()
        f->liquid_alternative_source = CONTENT_WATERSOURCE;
        f->liquid_viscosity = WATER_VISC;
 #ifndef SERVER
-       f->vertex_alpha = WATER_ALPHA;
+       if(!opaque_water)
+               f->vertex_alpha = WATER_ALPHA;
        f->post_effect_color = video::SColor(64, 100, 100, 200);
        if(f->special_material == NULL && g_texturesource)
        {
-               // Flowing water material
+               // New-style water source material (mostly unused)
                f->special_material = new video::SMaterial;
                f->special_material->setFlag(video::EMF_LIGHTING, false);
                f->special_material->setFlag(video::EMF_BACK_FACE_CULLING, false);
@@ -476,7 +488,7 @@ void content_mapnode_init()
        f->light_propagates = false;
        f->light_source = LIGHT_MAX-1;
        f->solidness = 0; // Drawn separately, makes no faces
-       f->visual_solidness = 2;
+       f->visual_solidness = 1; // Does not completely cover block boundaries
        f->walkable = false;
        f->pointable = false;
        f->diggable = false;
@@ -497,10 +509,17 @@ void content_mapnode_init()
                f->special_material->setFlag(video::EMF_BILINEAR_FILTER, false);
                f->special_material->setFlag(video::EMF_FOG_ENABLE, true);
                f->special_material->MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
+
                AtlasPointer *pa_lava1 = new AtlasPointer(
                        g_texturesource->getTexture(
                                g_texturesource->getTextureId("lava.png")));
                f->special_material->setTexture(0, pa_lava1->atlas);
+
+               // Flowing lava material, backface culled
+               f->special_material2 = new video::SMaterial;
+               *f->special_material2 = *f->special_material;
+               f->special_material2->setFlag(video::EMF_BACK_FACE_CULLING, true);
+
                f->special_atlas = pa_lava1;
        }
 #endif
@@ -544,7 +563,7 @@ void content_mapnode_init()
        f->post_effect_color = video::SColor(192, 255, 64, 0);
        if(f->special_material == NULL && g_texturesource)
        {
-               // Flowing lava material
+               // New-style lava source material (mostly unused)
                f->special_material = new video::SMaterial;
                f->special_material->setFlag(video::EMF_LIGHTING, false);
                f->special_material->setFlag(video::EMF_BACK_FACE_CULLING, false);
@@ -555,6 +574,7 @@ void content_mapnode_init()
                        g_texturesource->getTexture(
                                g_texturesource->getTextureId("lava.png")));
                f->special_material->setTexture(0, pa_lava1->atlas);
+
                f->special_atlas = pa_lava1;
        }
 #endif