Skip to content

Commit 3bfb828

Browse files
numberZeronerzhul
authored andcommittedDec 11, 2018
Make MapNode handle paramtype2≠leveled properly (#7958)
1 parent ca141ed commit 3bfb828

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed
 

‎src/mapnode.cpp

+20-18
Original file line numberDiff line numberDiff line change
@@ -611,49 +611,51 @@ u8 MapNode::getLevel(const NodeDefManager *nodemgr) const
611611
return getParam2() & LIQUID_LEVEL_MASK;
612612
if(f.liquid_type == LIQUID_FLOWING) // can remove if all param_type_2 setted
613613
return getParam2() & LIQUID_LEVEL_MASK;
614-
if(f.leveled || f.param_type_2 == CPT2_LEVELED) {
615-
u8 level = getParam2() & LEVELED_MASK;
616-
if(level)
614+
if (f.param_type_2 == CPT2_LEVELED) {
615+
u8 level = getParam2() & LEVELED_MASK;
616+
if (level)
617617
return level;
618-
if(f.leveled > LEVELED_MAX)
619-
return LEVELED_MAX;
620-
return f.leveled; //default
621618
}
622-
return 0;
619+
if (f.leveled > LEVELED_MAX)
620+
return LEVELED_MAX;
621+
return f.leveled;
623622
}
624623

625624
u8 MapNode::setLevel(const NodeDefManager *nodemgr, s8 level)
626625
{
627626
u8 rest = 0;
628-
if (level < 1) {
629-
setContent(CONTENT_AIR);
630-
return 0;
631-
}
632627
const ContentFeatures &f = nodemgr->get(*this);
633628
if (f.param_type_2 == CPT2_FLOWINGLIQUID
634-
|| f.liquid_type == LIQUID_FLOWING
635-
|| f.liquid_type == LIQUID_SOURCE) {
629+
|| f.liquid_type == LIQUID_FLOWING
630+
|| f.liquid_type == LIQUID_SOURCE) {
631+
if (level <= 0) { // liquid can’t exist with zero level
632+
setContent(CONTENT_AIR);
633+
return 0;
634+
}
636635
if (level >= LIQUID_LEVEL_SOURCE) {
637636
rest = level - LIQUID_LEVEL_SOURCE;
638637
setContent(nodemgr->getId(f.liquid_alternative_source));
638+
setParam2(0);
639639
} else {
640640
setContent(nodemgr->getId(f.liquid_alternative_flowing));
641-
setParam2(level & LIQUID_LEVEL_MASK);
641+
setParam2((level & LIQUID_LEVEL_MASK) | (getParam2() & ~LIQUID_LEVEL_MASK));
642642
}
643-
} else if (f.leveled || f.param_type_2 == CPT2_LEVELED) {
644-
if (level > LEVELED_MAX) {
643+
} else if (f.param_type_2 == CPT2_LEVELED) {
644+
if (level < 0) { // zero means default for a leveled nodebox
645+
rest = level;
646+
level = 0;
647+
} else if (level > LEVELED_MAX) {
645648
rest = level - LEVELED_MAX;
646649
level = LEVELED_MAX;
647650
}
648-
setParam2(level & LEVELED_MASK);
651+
setParam2((level & LEVELED_MASK) | (getParam2() & ~LEVELED_MASK));
649652
}
650653
return rest;
651654
}
652655

653656
u8 MapNode::addLevel(const NodeDefManager *nodemgr, s8 add)
654657
{
655658
s8 level = getLevel(nodemgr);
656-
if (add == 0) level = 1;
657659
level += add;
658660
return setLevel(nodemgr, level);
659661
}

0 commit comments

Comments
 (0)
Please sign in to comment.