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:
@ -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);
|
||||
|
Reference in New Issue
Block a user