int PlayerSAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch) { // It's best that attachments cannot be punched if (isAttached()) return 0; if (!toolcap) return 0; // No effect if PvP disabled if (g_settings->getBool("enable_pvp") == false) { if (puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) { std::string str = gob_cmd_punched(0, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push(aom); return 0; } } HitParams hitparams = getHitParams(m_armor_groups, toolcap, time_from_last_punch); std::string punchername = "nil"; if (puncher != 0) punchername = puncher->getDescription(); PlayerSAO *playersao = m_player->getPlayerSAO(); bool damage_handled = m_env->getScriptIface()->on_punchplayer(playersao, puncher, time_from_last_punch, toolcap, dir, hitparams.hp); if (!damage_handled) { setHP(getHP() - hitparams.hp); } else { // override client prediction if (puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) { std::string str = gob_cmd_punched(0, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push(aom); } } actionstream << "Player " << m_player->getName() << " punched by " << punchername; if (!damage_handled) { actionstream << ", damage " << hitparams.hp << " HP"; } else { actionstream << ", damage handled by lua"; } actionstream << std::endl; return hitparams.wear; }
void PlayerSAO::setHP(s16 hp) { s16 oldhp = m_player->hp; if(hp < 0) hp = 0; else if(hp > PLAYER_MAX_HP) hp = PLAYER_MAX_HP; if(hp < oldhp && g_settings->getBool("enable_damage") == false) { m_hp_not_sent = true; // fix wrong prediction on client return; } m_player->hp = hp; if(hp != oldhp) m_hp_not_sent = true; // On death or reincarnation send an active object message if((hp == 0) != (oldhp == 0)) { // Will send new is_visible value based on (getHP()!=0) m_properties_sent = false; // Send new HP std::string str = gob_cmd_punched(0, getHP()); ActiveObjectMessage aom(getId(), true, str); m_messages_out.push_back(aom); } }
int PlayerSAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch) { // It's best that attachments cannot be punched if(isAttached()) return 0; if(!toolcap) return 0; // No effect if PvP disabled if(g_settings->getBool("enable_pvp") == false){ if(puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER){ std::string str = gob_cmd_punched(0, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push_back(aom); return 0; } } HitParams hitparams = getHitParams(m_armor_groups, toolcap, time_from_last_punch); std::string punchername = "nil"; if ( puncher != 0 ) punchername = puncher->getDescription(); actionstream<<"Player "<<m_player->getName()<<" punched by " <<punchername<<", damage "<<hitparams.hp <<" HP"<<std::endl; setHP(getHP() - hitparams.hp); if(hitparams.hp != 0) { std::string str = gob_cmd_punched(hitparams.hp, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push_back(aom); } return hitparams.wear; }
int LuaEntitySAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch) { if(!m_registered){ // Delete unknown LuaEntities when punched m_removed = true; return 0; } // It's best that attachments cannot be punched if(isAttached()) return 0; ItemStack *punchitem = NULL; ItemStack punchitem_static; if(puncher){ punchitem_static = puncher->getWieldedItem(); punchitem = &punchitem_static; } PunchDamageResult result = getPunchDamage( m_armor_groups, toolcap, punchitem, time_from_last_punch); if(result.did_punch) { setHP(getHP() - result.damage); std::string punchername = "nil"; if ( puncher != 0 ) punchername = puncher->getDescription(); actionstream<<getDescription()<<" punched by " <<punchername<<", damage "<<result.damage <<" hp, health now "<<getHP()<<" hp"<<std::endl; { std::string str = gob_cmd_punched(result.damage, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push_back(aom); } if(getHP() == 0) m_removed = true; } ENV_TO_SA(m_env)->luaentity_Punch(m_id, puncher, time_from_last_punch, toolcap, dir); return result.wear; }
int LuaEntitySAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, float time_from_last_punch) { if (!m_registered) { // Delete unknown LuaEntities when punched m_pending_removal = true; return 0; } ItemStack *punchitem = NULL; ItemStack punchitem_static; if (puncher) { punchitem_static = puncher->getWieldedItem(); punchitem = &punchitem_static; } PunchDamageResult result = getPunchDamage( m_armor_groups, toolcap, punchitem, time_from_last_punch); bool damage_handled = m_env->getScriptIface()->luaentity_Punch(m_id, puncher, time_from_last_punch, toolcap, dir, result.did_punch ? result.damage : 0); if (!damage_handled) { if (result.did_punch) { setHP(getHP() - result.damage, PlayerHPChangeReason(PlayerHPChangeReason::SET_HP)); if (result.damage > 0) { std::string punchername = puncher ? puncher->getDescription() : "nil"; actionstream << getDescription() << " punched by " << punchername << ", damage " << result.damage << " hp, health now " << getHP() << " hp" << std::endl; } std::string str = gob_cmd_punched(result.damage, getHP()); // create message and add to list ActiveObjectMessage aom(getId(), true, str); m_messages_out.push(aom); } } if (getHP() == 0 && !isGone()) { m_pending_removal = true; clearParentAttachment(); clearChildAttachments(); m_env->getScriptIface()->luaentity_on_death(m_id, puncher); } return result.wear; }
void Server::SendPlayerHP(u16 peer_id) { DSTACK(FUNCTION_NAME); PlayerSAO *playersao = getPlayerSAO(peer_id); if (!playersao) return; SendHP(peer_id, playersao->getHP()); m_script->player_event(playersao,"health_changed"); // Send to other clients std::string str = gob_cmd_punched(playersao->readDamage(), playersao->getHP()); ActiveObjectMessage aom(playersao->getId(), true, str); playersao->m_messages_out.push(aom); }