1
0
mirror of https://github.com/minetest/minetest.git synced 2025-07-01 07:30:23 +02:00

Modifying fall damage via armor group (#11080)

Adds a new fall_damage_add_percent armor group which influences the fall damage in addition to the existing node group.
This commit is contained in:
Wuzzy
2021-04-11 15:09:37 +00:00
committed by GitHub
parent 0abc1e98ed
commit 4b8209d9a4
2 changed files with 32 additions and 9 deletions

View File

@ -235,7 +235,16 @@ void ClientEnvironment::step(float dtime)
&player_collisions);
}
bool player_immortal = lplayer->getCAO() && lplayer->getCAO()->isImmortal();
bool player_immortal = false;
f32 player_fall_factor = 1.0f;
GenericCAO *playercao = lplayer->getCAO();
if (playercao) {
player_immortal = playercao->isImmortal();
int addp_p = itemgroup_get(playercao->getGroups(),
"fall_damage_add_percent");
// convert armor group into an usable fall damage factor
player_fall_factor = 1.0f + (float)addp_p / 100.0f;
}
for (const CollisionInfo &info : player_collisions) {
v3f speed_diff = info.new_speed - info.old_speed;;
@ -248,17 +257,20 @@ void ClientEnvironment::step(float dtime)
speed_diff.Z = 0;
f32 pre_factor = 1; // 1 hp per node/s
f32 tolerance = BS*14; // 5 without damage
f32 post_factor = 1; // 1 hp per node/s
if (info.type == COLLISION_NODE) {
const ContentFeatures &f = m_client->ndef()->
get(m_map->getNode(info.node_p));
// Determine fall damage multiplier
int addp = itemgroup_get(f.groups, "fall_damage_add_percent");
pre_factor = 1.0f + (float)addp / 100.0f;
// Determine fall damage modifier
int addp_n = itemgroup_get(f.groups, "fall_damage_add_percent");
// convert node group to an usable fall damage factor
f32 node_fall_factor = 1.0f + (float)addp_n / 100.0f;
// combine both player fall damage modifiers
pre_factor = node_fall_factor * player_fall_factor;
}
float speed = pre_factor * speed_diff.getLength();
if (speed > tolerance && !player_immortal) {
f32 damage_f = (speed - tolerance) / BS * post_factor;
if (speed > tolerance && !player_immortal && pre_factor > 0.0f) {
f32 damage_f = (speed - tolerance) / BS;
u16 damage = (u16)MYMIN(damage_f + 0.5, U16_MAX);
if (damage != 0) {
damageLocalPlayer(damage, true);