forked from Mirrorlandia_minetest/minetest
Make MapNode handle paramtype2≠leveled properly (#7958)
This commit is contained in:
parent
ca141ed491
commit
3bfb8284b8
@ -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 can’t 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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user