mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-11 17:51:04 +00:00
Rework functionality of leveled nodes (#9852)
Co-authored-by: sfan5 <sfan5@live.de> Co-authored-by: SmallJoker <SmallJoker@users.noreply.github.com>
This commit is contained in:
parent
7d3972a504
commit
c94d37827d
8 changed files with 79 additions and 34 deletions
|
@ -584,7 +584,7 @@ u8 MapNode::getMaxLevel(const NodeDefManager *nodemgr) const
|
|||
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;
|
||||
return f.leveled_max;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -603,14 +603,15 @@ u8 MapNode::getLevel(const NodeDefManager *nodemgr) const
|
|||
if (level)
|
||||
return level;
|
||||
}
|
||||
if (f.leveled > LEVELED_MAX)
|
||||
return LEVELED_MAX;
|
||||
// Return static value from nodedef if param2 isn't used for level
|
||||
if (f.leveled > f.leveled_max)
|
||||
return f.leveled_max;
|
||||
return f.leveled;
|
||||
}
|
||||
|
||||
u8 MapNode::setLevel(const NodeDefManager *nodemgr, s8 level)
|
||||
s8 MapNode::setLevel(const NodeDefManager *nodemgr, s16 level)
|
||||
{
|
||||
u8 rest = 0;
|
||||
s8 rest = 0;
|
||||
const ContentFeatures &f = nodemgr->get(*this);
|
||||
if (f.param_type_2 == CPT2_FLOWINGLIQUID
|
||||
|| f.liquid_type == LIQUID_FLOWING
|
||||
|
@ -631,18 +632,18 @@ u8 MapNode::setLevel(const NodeDefManager *nodemgr, s8 level)
|
|||
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;
|
||||
} else if (level > f.leveled_max) {
|
||||
rest = level - f.leveled_max;
|
||||
level = f.leveled_max;
|
||||
}
|
||||
setParam2((level & LEVELED_MASK) | (getParam2() & ~LEVELED_MASK));
|
||||
}
|
||||
return rest;
|
||||
}
|
||||
|
||||
u8 MapNode::addLevel(const NodeDefManager *nodemgr, s8 add)
|
||||
s8 MapNode::addLevel(const NodeDefManager *nodemgr, s16 add)
|
||||
{
|
||||
s8 level = getLevel(nodemgr);
|
||||
s16 level = getLevel(nodemgr);
|
||||
level += add;
|
||||
return setLevel(nodemgr, level);
|
||||
}
|
||||
|
|
|
@ -268,12 +268,12 @@ struct MapNode
|
|||
std::vector<aabb3f> *boxes, u8 neighbors = 0) const;
|
||||
|
||||
/*
|
||||
Liquid helpers
|
||||
Liquid/leveled helpers
|
||||
*/
|
||||
u8 getMaxLevel(const NodeDefManager *nodemgr) const;
|
||||
u8 getLevel(const NodeDefManager *nodemgr) const;
|
||||
u8 setLevel(const NodeDefManager *nodemgr, s8 level = 1);
|
||||
u8 addLevel(const NodeDefManager *nodemgr, s8 add = 1);
|
||||
s8 setLevel(const NodeDefManager *nodemgr, s16 level = 1);
|
||||
s8 addLevel(const NodeDefManager *nodemgr, s16 add = 1);
|
||||
|
||||
/*
|
||||
Serialization functions
|
||||
|
|
|
@ -368,6 +368,7 @@ void ContentFeatures::reset()
|
|||
floodable = false;
|
||||
rightclickable = true;
|
||||
leveled = 0;
|
||||
leveled_max = LEVELED_MAX;
|
||||
liquid_type = LIQUID_NONE;
|
||||
liquid_alternative_flowing = "";
|
||||
liquid_alternative_source = "";
|
||||
|
@ -478,6 +479,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
|
|||
writeU8(os, legacy_wallmounted);
|
||||
|
||||
os << serializeString(node_dig_prediction);
|
||||
writeU8(os, leveled_max);
|
||||
}
|
||||
|
||||
void ContentFeatures::correctAlpha(TileDef *tiles, int length)
|
||||
|
@ -586,6 +588,10 @@ void ContentFeatures::deSerialize(std::istream &is)
|
|||
|
||||
try {
|
||||
node_dig_prediction = deSerializeString(is);
|
||||
u8 tmp_leveled_max = readU8(is);
|
||||
if (is.eof()) /* readU8 doesn't throw exceptions so we have to do this */
|
||||
throw SerializationError("");
|
||||
leveled_max = tmp_leveled_max;
|
||||
} catch(SerializationError &e) {};
|
||||
}
|
||||
|
||||
|
|
|
@ -326,8 +326,10 @@ struct ContentFeatures
|
|||
std::vector<content_t> connects_to_ids;
|
||||
// Post effect color, drawn when the camera is inside the node.
|
||||
video::SColor post_effect_color;
|
||||
// Flowing liquid or snow, value = default level
|
||||
// Flowing liquid or leveled nodebox, value = default level
|
||||
u8 leveled;
|
||||
// Maximum value for leveled nodes
|
||||
u8 leveled_max;
|
||||
|
||||
// --- LIGHTING-RELATED ---
|
||||
|
||||
|
|
|
@ -694,6 +694,8 @@ ContentFeatures read_content_features(lua_State *L, int index)
|
|||
f.liquid_range = getintfield_default(L, index,
|
||||
"liquid_range", f.liquid_range);
|
||||
f.leveled = getintfield_default(L, index, "leveled", f.leveled);
|
||||
f.leveled_max = getintfield_default(L, index,
|
||||
"leveled_max", f.leveled_max);
|
||||
|
||||
getboolfield(L, index, "liquid_renewable", f.liquid_renewable);
|
||||
f.drowning = getintfield_default(L, index,
|
||||
|
@ -860,6 +862,8 @@ void push_content_features(lua_State *L, const ContentFeatures &c)
|
|||
lua_setfield(L, -2, "post_effect_color");
|
||||
lua_pushnumber(L, c.leveled);
|
||||
lua_setfield(L, -2, "leveled");
|
||||
lua_pushnumber(L, c.leveled_max);
|
||||
lua_setfield(L, -2, "leveled_max");
|
||||
lua_pushboolean(L, c.sunlight_propagates);
|
||||
lua_setfield(L, -2, "sunlight_propagates");
|
||||
lua_pushnumber(L, c.light_source);
|
||||
|
|
|
@ -529,13 +529,13 @@ int ModApiEnvMod::l_set_node_level(lua_State *L)
|
|||
|
||||
// add_node_level(pos, level)
|
||||
// pos = {x=num, y=num, z=num}
|
||||
// level: 0..63
|
||||
// level: -127..127
|
||||
int ModApiEnvMod::l_add_node_level(lua_State *L)
|
||||
{
|
||||
GET_ENV_PTR;
|
||||
|
||||
v3s16 pos = read_v3s16(L, 1);
|
||||
u8 level = 1;
|
||||
s16 level = 1;
|
||||
if(lua_isnumber(L, 2))
|
||||
level = lua_tonumber(L, 2);
|
||||
MapNode n = env->getMap().getNode(pos);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue