mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-22 17:18:39 +00:00
Add per-node climb speed modifier
This commit is contained in:
parent
c49ff76955
commit
a76bfcc6ac
7 changed files with 68 additions and 7 deletions
|
@ -9849,6 +9849,13 @@ Used by `core.register_node`.
|
|||
-- (see `liquid_move_physics`), the movement speed will also be
|
||||
-- affected by the `movement_liquid_*` settings.
|
||||
|
||||
climb_factor = 1.0,
|
||||
-- The speed at which a climbable node can be climbed is multiplied
|
||||
-- with this number. Must not be negative. No effect if node isn't
|
||||
-- climbable.
|
||||
-- Note: To set the base climbing speed in your game,
|
||||
-- change the setting "movement_speed_climb".
|
||||
|
||||
buildable_to = false, -- If true, placed nodes can replace this node
|
||||
|
||||
floodable = false,
|
||||
|
|
|
@ -209,6 +209,41 @@ core.register_node("testnodes:climbable", {
|
|||
groups = {dig_immediate=3},
|
||||
})
|
||||
|
||||
minetest.register_node("testnodes:climbable_fast", {
|
||||
description = S("Fast Climbable Node").."\n"..
|
||||
S("You can climb up and down, faster than usual"),
|
||||
climbable = true,
|
||||
climb_factor = 2.0,
|
||||
walkable = false,
|
||||
|
||||
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
tiles = {"testnodes_climbable_top.png^[colorize:#FFFFFF:140","testnodes_climbable_top.png^[colorize:#FFFFFF:140","testnodes_climbable_side.png^[colorize:#FFFFFF:140"},
|
||||
use_texture_alpha = "clip",
|
||||
drawtype = "nodebox",
|
||||
node_box = climbable_nodebox,
|
||||
groups = {dig_immediate=3},
|
||||
})
|
||||
minetest.register_node("testnodes:climbable_slow", {
|
||||
description = S("Slow Climbable Node").."\n"..
|
||||
S("You can climb up and down, slower than usual"),
|
||||
climbable = true,
|
||||
climb_factor = 0.5,
|
||||
walkable = false,
|
||||
|
||||
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
tiles = {"testnodes_climbable_top.png^[colorize:#000000:140","testnodes_climbable_top.png^[colorize:#000000:140","testnodes_climbable_side.png^[colorize:#000000:140"},
|
||||
use_texture_alpha = "clip",
|
||||
drawtype = "nodebox",
|
||||
node_box = climbable_nodebox,
|
||||
groups = {dig_immediate=3},
|
||||
})
|
||||
|
||||
-- Climbable only downwards with sneak key
|
||||
core.register_node("testnodes:climbable_nojump", {
|
||||
description = S("Downwards-climbable Node").."\n"..
|
||||
|
@ -227,7 +262,8 @@ core.register_node("testnodes:climbable_nojump", {
|
|||
|
||||
|
||||
core.register_node("testnodes:climbable_nodescend", {
|
||||
description = S("Upwards-climbable Node"),
|
||||
description = S("Upwards-climbable Node").."\n"..
|
||||
S("You can climb only upwards"),
|
||||
climbable = true,
|
||||
walkable = false,
|
||||
|
||||
|
@ -241,7 +277,8 @@ core.register_node("testnodes:climbable_nodescend", {
|
|||
})
|
||||
|
||||
core.register_node("testnodes:climbable_nodescend_nojump", {
|
||||
description = S("Horizontal-only Climbable Node"),
|
||||
description = S("Horizontal-only Climbable Node").."\n"..
|
||||
S("You hold on to this node but can't climb vertically"),
|
||||
climbable = true,
|
||||
walkable = false,
|
||||
|
||||
|
|
|
@ -318,6 +318,9 @@ void LocalPlayer::move(f32 dtime, Environment *env,
|
|||
} else {
|
||||
is_climbing = (nodemgr->get(node.getContent()).climbable ||
|
||||
nodemgr->get(node2.getContent()).climbable) && !free_move;
|
||||
if (is_climbing) {
|
||||
node_climb_factor = nodemgr->get(node.getContent()).climb_factor;
|
||||
}
|
||||
}
|
||||
|
||||
// Player object property step height is multiplied by BS in
|
||||
|
@ -584,7 +587,7 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
|
|||
speedV.Y = -speed_walk;
|
||||
swimming_vertical = true;
|
||||
} else if (is_climbing && !m_disable_descend) {
|
||||
speedV.Y = -movement_speed_climb * physics_override.speed_climb;
|
||||
speedV.Y = -movement_speed_climb * physics_override.speed_climb * node_climb_factor;
|
||||
} else {
|
||||
// If not free movement but fast is allowed, aux1 is
|
||||
// "Turbo button"
|
||||
|
@ -620,9 +623,9 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
|
|||
swimming_vertical = true;
|
||||
} else if (is_climbing && !m_disable_descend) {
|
||||
if (fast_climb)
|
||||
speedV.Y = -speed_fast;
|
||||
speedV.Y = -speed_fast * node_climb_factor;
|
||||
else
|
||||
speedV.Y = -movement_speed_climb * physics_override.speed_climb;
|
||||
speedV.Y = -movement_speed_climb * physics_override.speed_climb * node_climb_factor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -675,7 +678,7 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
|
|||
if (fast_climb)
|
||||
speedV.Y = speed_fast;
|
||||
else
|
||||
speedV.Y = movement_speed_climb * physics_override.speed_climb;
|
||||
speedV.Y = movement_speed_climb * physics_override.speed_climb * node_climb_factor;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ public:
|
|||
// Slows down the player when moving through
|
||||
u8 move_resistance = 0;
|
||||
bool is_climbing = false;
|
||||
f32 node_climb_factor = 1.0f;
|
||||
bool swimming_vertical = false;
|
||||
bool swimming_pitch = false;
|
||||
|
||||
|
|
|
@ -406,6 +406,7 @@ void ContentFeatures::reset()
|
|||
move_resistance = 0;
|
||||
liquid_move_physics = false;
|
||||
post_effect_color_shaded = false;
|
||||
climb_factor = 1.0;
|
||||
}
|
||||
|
||||
void ContentFeatures::setAlphaFromLegacy(u8 legacy_alpha)
|
||||
|
@ -533,6 +534,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
|
|||
writeU8(os, move_resistance);
|
||||
writeU8(os, liquid_move_physics);
|
||||
writeU8(os, post_effect_color_shaded);
|
||||
writeF32(os, climb_factor);
|
||||
}
|
||||
|
||||
void ContentFeatures::deSerialize(std::istream &is, u16 protocol_version)
|
||||
|
@ -663,7 +665,12 @@ void ContentFeatures::deSerialize(std::istream &is, u16 protocol_version)
|
|||
if (is.eof())
|
||||
throw SerializationError("");
|
||||
post_effect_color_shaded = tmp;
|
||||
} catch (SerializationError &e) {};
|
||||
|
||||
f32 ftmp = readF32(is);
|
||||
if (is.eof())
|
||||
throw SerializationError("");
|
||||
climb_factor = ftmp;
|
||||
} catch(SerializationError &e) {};
|
||||
}
|
||||
|
||||
#if CHECK_CLIENT_BUILD()
|
||||
|
|
|
@ -387,6 +387,8 @@ struct ContentFeatures
|
|||
bool diggable;
|
||||
// Player can climb these
|
||||
bool climbable;
|
||||
// Climb speed factor
|
||||
f32 climb_factor;
|
||||
// Player can build on these
|
||||
bool buildable_to;
|
||||
// Player cannot build to these (placement prediction disabled)
|
||||
|
|
|
@ -951,6 +951,8 @@ void read_content_features(lua_State *L, ContentFeatures &f, int index)
|
|||
errorstream << "Field \"liquid_move_physics\": Invalid type!" << std::endl;
|
||||
}
|
||||
lua_pop(L, 1);
|
||||
|
||||
getfloatfield(L, index, "climb_factor", f.climb_factor);
|
||||
}
|
||||
|
||||
void push_content_features(lua_State *L, const ContentFeatures &c)
|
||||
|
@ -1084,6 +1086,8 @@ void push_content_features(lua_State *L, const ContentFeatures &c)
|
|||
lua_setfield(L, -2, "move_resistance");
|
||||
lua_pushboolean(L, c.liquid_move_physics);
|
||||
lua_setfield(L, -2, "liquid_move_physics");
|
||||
lua_pushnumber(L, c.climb_factor);
|
||||
lua_setfield(L, -2, "climb_factor");
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue