Skip to content

Commit

Permalink
Add per-node climb speed modifier
Browse files Browse the repository at this point in the history
  • Loading branch information
Wuzzy2 committed Jun 4, 2024
1 parent 8723235 commit 86e1bf1
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 7 deletions.
7 changes: 7 additions & 0 deletions doc/lua_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -9381,6 +9381,13 @@ Used by `minetest.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,
Expand Down
41 changes: 39 additions & 2 deletions games/devtest/mods/testnodes/properties.lua
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,41 @@ minetest.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
minetest.register_node("testnodes:climbable_nojump", {
description = S("Downwards-climbable Node").."\n"..
Expand All @@ -227,7 +262,8 @@ minetest.register_node("testnodes:climbable_nojump", {


minetest.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,

Expand All @@ -241,7 +277,8 @@ minetest.register_node("testnodes:climbable_nodescend", {
})

minetest.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,

Expand Down
11 changes: 7 additions & 4 deletions src/client/localplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,9 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d,
} 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;
}
}

/*
Expand Down Expand Up @@ -613,7 +616,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"
Expand Down Expand Up @@ -649,9 +652,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;
}
}
}
Expand Down Expand Up @@ -704,7 +707,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;
}
}

Expand Down
1 change: 1 addition & 0 deletions src/client/localplayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class LocalPlayer : public Player
// 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;

Expand Down
9 changes: 8 additions & 1 deletion src/nodedef.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,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)
Expand Down Expand Up @@ -553,6 +554,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)
Expand Down Expand Up @@ -683,7 +685,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) {};
}

#ifndef SERVER
Expand Down
2 changes: 2 additions & 0 deletions src/nodedef.h
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,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)
Expand Down
4 changes: 4 additions & 0 deletions src/script/common/c_content.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -966,6 +966,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)
Expand Down Expand Up @@ -1099,6 +1101,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");
}

/******************************************************************************/
Expand Down

0 comments on commit 86e1bf1

Please sign in to comment.