Make MapNode handle paramtype2≠leveled properly (#7958)
authorVitaliy <numzer0@yandex.ru>
Tue, 11 Dec 2018 23:02:09 +0000 (02:02 +0300)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Tue, 11 Dec 2018 23:02:09 +0000 (00:02 +0100)
src/mapnode.cpp

index ffba2f599d501671c3608768f8a680b02b423c91..4cc9985c0c372de77dd1d83bc0450a0fb7c41176 100644 (file)
@@ -611,41 +611,44 @@ u8 MapNode::getLevel(const NodeDefManager *nodemgr) const
                return getParam2() & LIQUID_LEVEL_MASK;
        if(f.liquid_type == LIQUID_FLOWING) // can remove if all param_type_2 setted
                return getParam2() & LIQUID_LEVEL_MASK;
-       if(f.leveled || f.param_type_2 == CPT2_LEVELED) {
-                u8 level = getParam2() & LEVELED_MASK;
-                if(level)
+       if (f.param_type_2 == CPT2_LEVELED) {
+               u8 level = getParam2() & LEVELED_MASK;
+               if (level)
                        return level;
-                if(f.leveled > LEVELED_MAX)
-                       return LEVELED_MAX;
-                return f.leveled; //default
        }
-       return 0;
+       if (f.leveled > LEVELED_MAX)
+               return LEVELED_MAX;
+       return f.leveled;
 }
 
 u8 MapNode::setLevel(const NodeDefManager *nodemgr, s8 level)
 {
        u8 rest = 0;
-       if (level < 1) {
-               setContent(CONTENT_AIR);
-               return 0;
-       }
        const ContentFeatures &f = nodemgr->get(*this);
        if (f.param_type_2 == CPT2_FLOWINGLIQUID
-               || f.liquid_type == LIQUID_FLOWING
-               || f.liquid_type == LIQUID_SOURCE) {
+                       || f.liquid_type == LIQUID_FLOWING
+                       || f.liquid_type == LIQUID_SOURCE) {
+               if (level <= 0) { // liquid can’t exist with zero level
+                       setContent(CONTENT_AIR);
+                       return 0;
+               }
                if (level >= LIQUID_LEVEL_SOURCE) {
                        rest = level - LIQUID_LEVEL_SOURCE;
                        setContent(nodemgr->getId(f.liquid_alternative_source));
+                       setParam2(0);
                } else {
                        setContent(nodemgr->getId(f.liquid_alternative_flowing));
-                       setParam2(level & LIQUID_LEVEL_MASK);
+                       setParam2((level & LIQUID_LEVEL_MASK) | (getParam2() & ~LIQUID_LEVEL_MASK));
                }
-       } else if (f.leveled || f.param_type_2 == CPT2_LEVELED) {
-               if (level > LEVELED_MAX) {
+       } else if (f.param_type_2 == CPT2_LEVELED) {
+               if (level < 0) { // zero means default for a leveled nodebox
+                       rest = level;
+                       level = 0;
+               } else if (level > LEVELED_MAX) {
                        rest = level - LEVELED_MAX;
                        level = LEVELED_MAX;
                }
-               setParam2(level & LEVELED_MASK);
+               setParam2((level & LEVELED_MASK) | (getParam2() & ~LEVELED_MASK));
        }
        return rest;
 }
@@ -653,7 +656,6 @@ u8 MapNode::setLevel(const NodeDefManager *nodemgr, s8 level)
 u8 MapNode::addLevel(const NodeDefManager *nodemgr, s8 add)
 {
        s8 level = getLevel(nodemgr);
-       if (add == 0) level = 1;
        level += add;
        return setLevel(nodemgr, level);
 }