X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapnode.cpp;h=d52677be07540def4fc0a15b8b3e0022c6887b4f;hb=e9e9fd7c3f12bc5119b567ad37527d777859dbc0;hp=4707978cbc2a4803fa651060404277648f296511;hpb=3aedfac9685c2d9ae8bac5a5b7e72e527f22c08d;p=dragonfireclient.git diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 4707978cb..d52677be0 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -364,9 +364,7 @@ u8 MapNode::getMaxLevel(INodeDefManager *nodemgr) const { const ContentFeatures &f = nodemgr->get(*this); // todo: after update in all games leave only if (f.param_type_2 == - if( f.liquid_type == LIQUID_SOURCE - || f.liquid_type == LIQUID_FLOWING - || f.param_type_2 == CPT2_FLOWINGLIQUID) + if( f.liquid_type == LIQUID_FLOWING || f.param_type_2 == CPT2_FLOWINGLIQUID) return LIQUID_LEVEL_MAX; if(f.leveled || f.param_type_2 == CPT2_LEVELED) return LEVELED_MAX; @@ -385,29 +383,28 @@ u8 MapNode::getLevel(INodeDefManager *nodemgr) const return getParam2() & LIQUID_LEVEL_MASK; if(f.leveled || f.param_type_2 == CPT2_LEVELED) { u8 level = getParam2() & LEVELED_MASK; - if(level) return level; - if(f.leveled > LEVELED_MAX) return LEVELED_MAX; + if(level) + return level; + if(f.leveled > LEVELED_MAX) + return LEVELED_MAX; return f.leveled; //default } return 0; } -u8 MapNode::addLevel(INodeDefManager *nodemgr, s8 add) +u8 MapNode::setLevel(INodeDefManager *nodemgr, s8 level) { - s8 level = getLevel(nodemgr); u8 rest = 0; - if (add == 0) level = 1; - level += add; if (level < 1) { setContent(CONTENT_AIR); return 0; } 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_SOURCE) { - if (level >= LIQUID_LEVEL_MAX) { - rest = level - LIQUID_LEVEL_MAX; + if (level >= LIQUID_LEVEL_SOURCE) { + rest = level - LIQUID_LEVEL_SOURCE; setContent(nodemgr->getId(f.liquid_alternative_source)); } else { setContent(nodemgr->getId(f.liquid_alternative_flowing)); @@ -423,6 +420,31 @@ u8 MapNode::addLevel(INodeDefManager *nodemgr, s8 add) return rest; } +u8 MapNode::addLevel(INodeDefManager *nodemgr, s8 add) +{ + s8 level = getLevel(nodemgr); + if (add == 0) level = 1; + level += add; + return setLevel(nodemgr, level); +} + +void MapNode::freezeMelt(INodeDefManager *ndef) { + u8 level_was_max = this->getMaxLevel(ndef); + u8 level_was = this->getLevel(ndef); + this->setContent(ndef->getId(ndef->get(*this).freezemelt)); + u8 level_now_max = this->getMaxLevel(ndef); + if (level_was_max && level_was_max != level_now_max) { + u8 want = (float)level_now_max / level_was_max * level_was; + if (!want) + want = 1; + if (want != level_was) + this->setLevel(ndef, want); + //errorstream<<"was="<<(int)level_was<<"/"<<(int)level_was_max<<" nowm="<<(int)want<<"/"<<(int)level_now_max<< " => "<<(int)this->getLevel(ndef)<< std::endl; + } + if (this->getMaxLevel(ndef) && !this->getLevel(ndef)) + this->addLevel(ndef); +} + u32 MapNode::serializedLength(u8 version) { if(!ser_ver_supported(version)) @@ -467,8 +489,7 @@ void MapNode::deSerialize(u8 *source, u8 version) param0 = readU16(source+0); param1 = readU8(source+2); param2 = readU8(source+3); - } - else{ + }else{ param0 = readU8(source+0); param1 = readU8(source+1); param2 = readU8(source+2);