Add node pos to node damage HP change reason (#13196)

This commit is contained in:
Riley Adams 2023-04-10 18:04:52 -04:00 committed by GitHub
parent 1d88d85f1c
commit 73391013f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 10 additions and 2 deletions

@ -5266,6 +5266,7 @@ Call these functions only at load time!
* `fall` * `fall`
* `node_damage`: `damage_per_second` from a neighboring node. * `node_damage`: `damage_per_second` from a neighboring node.
`reason.node` will hold the node name or nil. `reason.node` will hold the node name or nil.
`reason.node_pos` will hold the position of the node
* `drown` * `drown`
* `respawn` * `respawn`
* Any of the above types may have additional fields from mods. * Any of the above types may have additional fields from mods.

@ -488,6 +488,9 @@ void ScriptApiBase::pushPlayerHPChangeReason(lua_State *L, const PlayerHPChangeR
if (!reason.node.empty()) { if (!reason.node.empty()) {
lua_pushstring(L, reason.node.c_str()); lua_pushstring(L, reason.node.c_str());
lua_setfield(L, -2, "node"); lua_setfield(L, -2, "node");
push_v3s16(L, reason.node_pos);
lua_setfield(L, -2, "node_pos");
} }
} }

@ -185,6 +185,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
if (!isImmortal() && m_node_hurt_interval.step(dtime, 1.0f)) { if (!isImmortal() && m_node_hurt_interval.step(dtime, 1.0f)) {
u32 damage_per_second = 0; u32 damage_per_second = 0;
std::string nodename; std::string nodename;
v3s16 node_pos;
// Lowest and highest damage points are 0.1 within collisionbox // Lowest and highest damage points are 0.1 within collisionbox
float dam_top = m_prop.collisionbox.MaxEdge.Y - 0.1f; float dam_top = m_prop.collisionbox.MaxEdge.Y - 0.1f;
@ -198,6 +199,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
if (c.damage_per_second > damage_per_second) { if (c.damage_per_second > damage_per_second) {
damage_per_second = c.damage_per_second; damage_per_second = c.damage_per_second;
nodename = c.name; nodename = c.name;
node_pos = p;
} }
} }
@ -209,11 +211,12 @@ void PlayerSAO::step(float dtime, bool send_recommended)
if (c.damage_per_second > damage_per_second) { if (c.damage_per_second > damage_per_second) {
damage_per_second = c.damage_per_second; damage_per_second = c.damage_per_second;
nodename = c.name; nodename = c.name;
node_pos = ptop;
} }
if (damage_per_second != 0 && m_hp > 0) { if (damage_per_second != 0 && m_hp > 0) {
s32 newhp = (s32)m_hp - (s32)damage_per_second; s32 newhp = (s32)m_hp - (s32)damage_per_second;
PlayerHPChangeReason reason(PlayerHPChangeReason::NODE_DAMAGE, nodename); PlayerHPChangeReason reason(PlayerHPChangeReason::NODE_DAMAGE, nodename, node_pos);
setHP(newhp, reason); setHP(newhp, reason);
} }
} }

@ -245,6 +245,7 @@ struct PlayerHPChangeReason
ServerActiveObject *object = nullptr; ServerActiveObject *object = nullptr;
// For NODE_DAMAGE // For NODE_DAMAGE
std::string node; std::string node;
v3s16 node_pos;
inline bool hasLuaReference() const { return lua_reference >= 0; } inline bool hasLuaReference() const { return lua_reference >= 0; }
@ -296,5 +297,5 @@ struct PlayerHPChangeReason
{ {
} }
PlayerHPChangeReason(Type type, std::string node) : type(type), node(node) {} PlayerHPChangeReason(Type type, std::string node, v3s16 node_pos) : type(type), node(node), node_pos(node_pos) {}
}; };