]> git.lizzy.rs Git - minetest.git/commitdiff
Add node pos to node damage HP change reason (#13196)
authorRiley Adams <radar6255@yahoo.com>
Mon, 10 Apr 2023 22:04:52 +0000 (18:04 -0400)
committerGitHub <noreply@github.com>
Mon, 10 Apr 2023 22:04:52 +0000 (23:04 +0100)
doc/lua_api.txt
src/script/cpp_api/s_base.cpp
src/server/player_sao.cpp
src/server/player_sao.h

index 2179f44b537a52b619c707f3cf12a2775298ab74..3e85da2f6f70224988744534c6d9df9b6bda0b8b 100644 (file)
@@ -5266,6 +5266,7 @@ Call these functions only at load time!
             * `fall`
             * `node_damage`: `damage_per_second` from a neighboring node.
                              `reason.node` will hold the node name or nil.
+                             `reason.node_pos` will hold the position of the node
             * `drown`
             * `respawn`
         * Any of the above types may have additional fields from mods.
index b91f5961367173bcabda55034174ce02e44ab255..c2b2f8a90fd5a682998ca21f2c935497b40231b1 100644 (file)
@@ -488,6 +488,9 @@ void ScriptApiBase::pushPlayerHPChangeReason(lua_State *L, const PlayerHPChangeR
        if (!reason.node.empty()) {
                lua_pushstring(L, reason.node.c_str());
                lua_setfield(L, -2, "node");
+
+               push_v3s16(L, reason.node_pos);
+               lua_setfield(L, -2, "node_pos");
        }
 }
 
index 9aa7ce39fc405c5af6b3d93ad5a440ec8f6b41fd..1255a44615db1ee132d6d3919ecfb893ce71c820 100644 (file)
@@ -185,6 +185,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
        if (!isImmortal() && m_node_hurt_interval.step(dtime, 1.0f)) {
                u32 damage_per_second = 0;
                std::string nodename;
+        v3s16 node_pos;
                // Lowest and highest damage points are 0.1 within collisionbox
                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) {
                                damage_per_second = c.damage_per_second;
                                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) {
                        damage_per_second = c.damage_per_second;
                        nodename = c.name;
+            node_pos = ptop;
                }
 
                if (damage_per_second != 0 && m_hp > 0) {
                        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);
                }
        }
index bd190d323ad1575220bb2409c86e1071f6853a19..6d8498d8d0c66621df631614ccaa740a0ee5caec 100644 (file)
@@ -245,6 +245,7 @@ struct PlayerHPChangeReason
        ServerActiveObject *object = nullptr;
        // For NODE_DAMAGE
        std::string node;
+    v3s16 node_pos;
 
        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) {}
 };