Fixes around ServerActiveObject on_punch handling

This commit is contained in:
sfan5 2020-03-04 19:13:26 +01:00
parent 8d6a0b917c
commit e774d8ca2f
3 changed files with 6 additions and 2 deletions

@ -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);