From 787b43b2183262a08726434e2597638ad85bfb72 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Tue, 13 Aug 2013 23:06:39 +0200 Subject: [PATCH] Send player damage to all clients and apply [brighten --- src/content_cao.cpp | 23 ++++++++++++++++++++++- src/content_sao.cpp | 34 +++++++++++++++------------------- src/content_sao.h | 2 ++ src/server.cpp | 6 ++++++ 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 20f5fd3d..bb8dad03 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -1739,8 +1739,29 @@ public: { /*s16 damage =*/ readS16(is); s16 result_hp = readS16(is); - + + // Use this instead of the send damage to not interfere with prediction + s16 damage = m_hp - result_hp; + m_hp = result_hp; + + if (damage > 0) { + if (m_hp <= 0) { + // TODO: Execute defined fast response + // As there is no definition, make a smoke puff + ClientSimpleObject *simple = createSmokePuff( + m_smgr, m_env, m_position, + m_prop.visual_size * BS); + m_env->addSimpleObject(simple); + } else { + // TODO: Execute defined fast response + // Flashing shall suffice as there is no definition + m_reset_textures_timer = 0.05; + if(damage >= 2) + m_reset_textures_timer += 0.05 * damage; + updateTextures("^[brighten"); + } + } } else if(cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS) { diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 347e8892..9b4ae610 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -942,6 +942,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_, m_player(player_), m_peer_id(peer_id_), m_inventory(NULL), + m_damage(0), m_last_good_position(0,0,0), m_time_from_last_punch(0), m_nocheat_dig_pos(32767, 32767, 32767), @@ -1298,14 +1299,6 @@ int PlayerSAO::punch(v3f dir, 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; } @@ -1318,6 +1311,13 @@ s16 PlayerSAO::getHP() const return m_player->hp; } +s16 PlayerSAO::readDamage() +{ + s16 damage = m_damage; + m_damage = 0; + return damage; +} + void PlayerSAO::setHP(s16 hp) { s16 oldhp = m_player->hp; @@ -1335,19 +1335,15 @@ void PlayerSAO::setHP(s16 hp) m_player->hp = hp; - if(hp != oldhp) + 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); + if(oldhp > hp) + m_damage += oldhp - hp; } + + // Update properties on death + if((hp == 0) != (oldhp == 0)) + m_properties_sent = false; } u16 PlayerSAO::getBreath() const diff --git a/src/content_sao.h b/src/content_sao.h index de4ac2d3..6b97cb14 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -193,6 +193,7 @@ public: void rightClick(ServerActiveObject *clicker); s16 getHP() const; void setHP(s16 hp); + s16 readDamage(); u16 getBreath() const; void setBreath(u16 breath); void setArmorGroups(const ItemGroupList &armor_groups); @@ -283,6 +284,7 @@ private: Player *m_player; u16 m_peer_id; Inventory *m_inventory; + s16 m_damage; // Cheat prevention LagPool m_dig_pool; diff --git a/src/server.cpp b/src/server.cpp index 5ecdddcb..561e03c7 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "filesys.h" #include "mapblock.h" #include "serverobject.h" +#include "genericobject.h" #include "settings.h" #include "profiler.h" #include "log.h" @@ -3828,6 +3829,11 @@ void Server::SendPlayerHP(u16 peer_id) assert(playersao); playersao->m_hp_not_sent = false; SendHP(m_con, peer_id, playersao->getHP()); + + // 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_back(aom); } void Server::SendPlayerBreath(u16 peer_id)