Make MapNode handle paramtype2≠leveled properly (#7958)

master
Vitaliy 2018-12-12 02:02:09 +03:00 committed by Loïc Blot
parent ca141ed491
commit 3bfb8284b8
1 changed files with 20 additions and 18 deletions

View File

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