1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00
This commit is contained in:
Wuzzy 2025-06-23 23:17:12 +02:00 committed by GitHub
commit 1cb8a1c1a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 37 additions and 18 deletions

View file

@ -1346,7 +1346,7 @@ local function handle_kill_command(killer, victim)
core.log("action", string.format("%s killed %s", killer, victim)) core.log("action", string.format("%s killed %s", killer, victim))
end end
-- Kill victim -- Kill victim
victimref:set_hp(0) victimref:set_hp(0, {type="set_hp", detail="__builtin:kill_command"})
return true, S("@1 has been killed.", victim) return true, S("@1 has been killed.", victim)
end end

View file

@ -435,7 +435,7 @@ function core.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed
core.add_item(pos, replace_with_item) core.add_item(pos, replace_with_item)
end end
user:set_hp(user:get_hp() + hp_change) user:set_hp(user:get_hp() + hp_change, {type="set_hp", detail="__builtin:item_eat"})
return nil -- don't overwrite wield item a second time return nil -- don't overwrite wield item a second time
end end

View file

@ -6172,25 +6172,13 @@ Call these functions only at load time!
calculating the HP change. This clamping has been removed as of calculating the HP change. This clamping has been removed as of
version 5.10.0 version 5.10.0
* `reason`: a PlayerHPChangeReason table. * `reason`: a PlayerHPChangeReason table.
* The `type` field will have one of the following values:
* `set_hp`: A mod or the engine called `set_hp` without
giving a type - use this for custom damage types.
* `punch`: Was punched. `reason.object` will hold the puncher, or nil if none.
* `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.
* `reason.from` will be `mod` or `engine`.
* `modifier`: when true, the function should return the actual `hp_change`. * `modifier`: when true, the function should return the actual `hp_change`.
Note: modifiers only get a temporary `hp_change` that can be modified by later modifiers. Note: modifiers only get a temporary `hp_change` that can be modified by later modifiers.
Modifiers can return true as a second argument to stop the execution of further functions. Modifiers can return true as a second argument to stop the execution of further functions.
Non-modifiers receive the final HP change calculated by the modifiers. Non-modifiers receive the final HP change calculated by the modifiers.
* `core.register_on_dieplayer(function(ObjectRef, reason))` * `core.register_on_dieplayer(function(ObjectRef, reason))`
* Called when a player dies * Called when a player dies
* `reason`: a PlayerHPChangeReason table, see register_on_player_hpchange * `reason`: a `PlayerHPChangeReason` table
* For customizing the death screen, see `core.show_death_screen`. * For customizing the death screen, see `core.show_death_screen`.
* `core.register_on_respawnplayer(function(ObjectRef))` * `core.register_on_respawnplayer(function(ObjectRef))`
* Called when player is to be respawned * Called when player is to be respawned
@ -8410,7 +8398,7 @@ child will follow movement and rotation of that bone.
* note: this is called `right_click` for historical reasons only * note: this is called `right_click` for historical reasons only
* `get_hp()`: returns number of health points * `get_hp()`: returns number of health points
* `set_hp(hp, reason)`: set number of health points * `set_hp(hp, reason)`: set number of health points
* See reason in register_on_player_hpchange * reason: A PlayerHPChangeReason table (optional)
* Is limited to the range of 0 ... 65535 (2^16 - 1) * Is limited to the range of 0 ... 65535 (2^16 - 1)
* For players: HP are also limited by `hp_max` specified in object properties * For players: HP are also limited by `hp_max` specified in object properties
* `get_inventory()`: returns an `InvRef` for players, otherwise returns `nil` * `get_inventory()`: returns an `InvRef` for players, otherwise returns `nil`
@ -11196,6 +11184,36 @@ See [Decoration types]. Used by `core.register_decoration`.
} }
``` ```
PlayerHPChangeReason table definition
-------------------------------------
The `PlayerHPChangeReason` table specifies a reason for player health changes.
* The `type` field will have one of the following values:
* `set_hp`: A mod or the engine called `set_hp`, either without
giving a reason, or by setting `set_hp` as damage type
explicitly
* `punch`: Was punched. `reason.object` will hold the puncher, or nil if none.
* `fall`: Fall damage.
* `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`: Drowning damage from a node with the `drowning` field set.
`reason.node` and `reason.node_pos` are same as for `node_damage`
* `respawn`: HP restored by respawning.
* The `detail` field may optionally be used to provide a more detailed reason
as a string. It's recommended to follow the `modname:detail` naming convention.
These detail names exist by default:
* `__builtin:item_eat`: HP change caused by `core.do_item_eat`
* `__builtin:kill_command`: `/kill` command
* The `from` field denotes the origin of the HP change:
* `engine`: Engine
* `mod`: Mod or builtin
* Mods may add additional fields
Note: The `from` field doesn't need to be provided in the `set_hp` method,
the engine will automatically set it to `mod`.
Chat command definition Chat command definition
----------------------- -----------------------

View file

@ -154,7 +154,8 @@ void PlayerSAO::step(float dtime, bool send_recommended)
// No more breath, damage player // No more breath, damage player
if (m_breath == 0) { if (m_breath == 0) {
PlayerHPChangeReason reason(PlayerHPChangeReason::DROWNING); std::string nodename = c.name;
PlayerHPChangeReason reason(PlayerHPChangeReason::DROWNING, nodename, p);
setHP(m_hp - c.drowning, reason); setHP(m_hp - c.drowning, reason);
} }
} }

View file

@ -245,7 +245,7 @@ struct PlayerHPChangeReason
// For PLAYER_PUNCH // For PLAYER_PUNCH
ServerActiveObject *object = nullptr; ServerActiveObject *object = nullptr;
// For NODE_DAMAGE // For NODE_DAMAGE and DROWNING
std::string node; std::string node;
v3s16 node_pos; v3s16 node_pos;