forked from Mirrorlandia_minetest/minetest
Fixes around ServerActiveObject on_punch handling
This commit is contained in:
parent
8d6a0b917c
commit
e774d8ca2f
@ -3900,6 +3900,7 @@ Callbacks:
|
|||||||
* `dir`: unit vector of direction of punch. Always defined. Points from the
|
* `dir`: unit vector of direction of punch. Always defined. Points from the
|
||||||
puncher to the punched.
|
puncher to the punched.
|
||||||
* `damage`: damage that will be done to entity.
|
* `damage`: damage that will be done to entity.
|
||||||
|
* Can return `true` to prevent the default damage mechanism.
|
||||||
* `on_death(self, killer)`
|
* `on_death(self, killer)`
|
||||||
* Called when the object dies.
|
* Called when the object dies.
|
||||||
* `killer`: an `ObjectRef` (can be `nil`)
|
* `killer`: an `ObjectRef` (can be `nil`)
|
||||||
|
@ -653,7 +653,7 @@ u16 LuaEntitySAO::punch(v3f dir,
|
|||||||
if (!damage_handled) {
|
if (!damage_handled) {
|
||||||
if (result.did_punch) {
|
if (result.did_punch) {
|
||||||
setHP((s32)getHP() - result.damage,
|
setHP((s32)getHP() - result.damage,
|
||||||
PlayerHPChangeReason(PlayerHPChangeReason::SET_HP));
|
PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, puncher));
|
||||||
|
|
||||||
std::string str = gob_cmd_punched(getHP());
|
std::string str = gob_cmd_punched(getHP());
|
||||||
// create message and add to list
|
// create message and add to list
|
||||||
@ -663,10 +663,10 @@ u16 LuaEntitySAO::punch(v3f dir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (getHP() == 0 && !isGone()) {
|
if (getHP() == 0 && !isGone()) {
|
||||||
m_pending_removal = true;
|
|
||||||
clearParentAttachment();
|
clearParentAttachment();
|
||||||
clearChildAttachments();
|
clearChildAttachments();
|
||||||
m_env->getScriptIface()->luaentity_on_death(m_id, puncher);
|
m_env->getScriptIface()->luaentity_on_death(m_id, puncher);
|
||||||
|
m_pending_removal = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
actionstream << puncher->getDescription() << " (id=" << puncher->getId() <<
|
actionstream << puncher->getDescription() << " (id=" << puncher->getId() <<
|
||||||
@ -675,6 +675,7 @@ u16 LuaEntitySAO::punch(v3f dir,
|
|||||||
"), damage=" << (old_hp - (s32)getHP()) <<
|
"), damage=" << (old_hp - (s32)getHP()) <<
|
||||||
(damage_handled ? " (handled by Lua)" : "") << std::endl;
|
(damage_handled ? " (handled by Lua)" : "") << std::endl;
|
||||||
|
|
||||||
|
// TODO: give Lua control over wear
|
||||||
return result.wear;
|
return result.wear;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1166,6 +1166,8 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
|
|||||||
u16 wear = pointed_object->punch(dir, &toolcap, playersao,
|
u16 wear = pointed_object->punch(dir, &toolcap, playersao,
|
||||||
time_from_last_punch);
|
time_from_last_punch);
|
||||||
|
|
||||||
|
// Callback may have changed item, so get it again
|
||||||
|
playersao->getWieldedItem(&selected_item);
|
||||||
bool changed = selected_item.addWear(wear, m_itemdef);
|
bool changed = selected_item.addWear(wear, m_itemdef);
|
||||||
if (changed)
|
if (changed)
|
||||||
playersao->setWieldedItem(selected_item);
|
playersao->setWieldedItem(selected_item);
|
||||||
|
Loading…
Reference in New Issue
Block a user