From e584fcb352ac49868645726f09dbaccb33767245 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 1 Aug 2019 15:20:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=80=A7=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/constant.h | 9 ++++++++ server/gameserver/frameevent.cc | 29 ++++++++++++++++++++++-- server/gameserver/frameevent.h | 7 +++++- server/gameserver/framemaker.cc | 40 +++++++++++++++++++++++++++++---- server/gameserver/human.cc | 10 +++++++-- server/gameserver/human.h | 4 +++- 6 files changed, 89 insertions(+), 10 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 065c637..e674b7a 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -209,6 +209,15 @@ enum ColliderTag_e kColliderTag_Loot = 2, //掉落物 }; +enum PropertyType_e +{ + kPropHp = 1, + kPropMaxHp = 2, + kPropInventory = 3, + kPropSkillLeftTime = 4, + kPropSkillCd = 5 +}; + const char* const kPROJ_NAME_FMT = "game%d_gameserver"; const char* const kPROJ_ROOT_FMT = "/data/logs/%s"; diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index f86f1cb..5703cf7 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -214,15 +214,31 @@ void FrameEvent::RemoveBuff(Human* hum, int buff_id) } } -void FrameEvent::AddPropertyChg(Human* hum) +void FrameEvent::AddHpChg(Human* hum) { + chged_hps_.push_back(hum); + int idx = chged_hps_.size() - 1; for (auto& cell : hum->grid_list) { for (auto& hum : cell->human_list) { - hum->property_chged_humans_.insert(hum); + hum->chged_hps_.push_back(idx); } } } +void FrameEvent::AddInventoryChg(Human* hum) +{ + chged_inventorys_.push_back(hum); + int idx = chged_inventorys_.size(); + hum->chged_inventorys_.push_back(idx); +} + +void FrameEvent::AddSkillCdChg(Human* hum) +{ + chged_skillcds_.push_back(hum); + int idx = chged_skillcds_.size(); + hum->chged_skillcds_.push_back(idx); +} + void FrameEvent::Clear() { if (!explosions_.empty()) { @@ -252,4 +268,13 @@ void FrameEvent::Clear() if (!chged_buffs_.empty()) { chged_buffs_.clear(); } + if (!chged_hps_.empty()) { + chged_hps_.clear(); + } + if (!chged_inventorys_.empty()) { + chged_inventorys_.clear(); + } + if (!chged_skillcds_.empty()) { + chged_skillcds_.clear(); + } } diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index 1383fde..23165a8 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -23,7 +23,9 @@ public: void AddRevive(Human* hum); void AddBuff(Human* hum, Buff* buff); void RemoveBuff(Human* hum, int buff_id); - void AddPropertyChg(Human* hum); + void AddHpChg(Human* hum); + void AddInventoryChg(Human* hum); + void AddSkillCdChg(Human* hum); void Clear(); private: @@ -36,6 +38,9 @@ private: std::vector> chged_buffs_; std::vector revive_objs_; std::vector> dead_objs_; + std::vector chged_hps_; + std::vector chged_inventorys_; + std::vector chged_skillcds_; friend class FrameMaker; }; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 5603115..7847c1a 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -73,10 +73,42 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum) p->add_values(std::get<1>(room->frame_event.dead_objs_[idx])); } } - for (size_t idx : hum->chged_buffs_) { - if (idx < room->frame_event.chged_buffs_.size()) { - auto p = msg->add_chged_buff_list(); - *p = std::get<1>(room->frame_event.chged_buffs_[idx]); + for (size_t idx : hum->chged_hps_) { + if (idx < room->frame_event.chged_hps_.size()) { + { + auto p = msg->add_chged_property_list(); + p->set_property_type(kPropHp); + p->set_value(room->frame_event.chged_hps_[idx]->GetHP()); + } + { + auto p = msg->add_chged_property_list(); + p->set_property_type(kPropMaxHp); + p->set_value(room->frame_event.chged_hps_[idx]->GetMaxHP()); + } + } + } + for (size_t idx : hum->chged_inventorys_) { + if (idx < room->frame_event.chged_inventorys_.size()) { + { + auto p = msg->add_chged_property_list(); + p->set_property_type(kPropInventory); + p->set_property_subtype(kWEAPON_SLOT); + p->set_value(room->frame_event.chged_inventorys_[idx]->GetInventory(kWEAPON_SLOT)); + } + } + } + for (size_t idx : hum->chged_skillcds_) { + if (idx < room->frame_event.chged_skillcds_.size()) { + { + auto p = msg->add_chged_property_list(); + p->set_property_type(kPropSkillLeftTime); + p->set_value(room->frame_event.chged_skillcds_[idx]->GetSkillLeftTime()); + } + { + auto p = msg->add_chged_property_list(); + p->set_property_type(kPropSkillCd); + p->set_value(room->frame_event.chged_skillcds_[idx]->GetSkillCd()); + } } } if (room->frame_event.airdrops_.size() > 0) { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index eb1ab70..221c4fc 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1852,8 +1852,14 @@ void Human::ClearFrameData() if (!dead_objs_.empty()) { dead_objs_.clear(); } - if (!property_chged_humans_.empty()) { - property_chged_humans_.clear(); + if (!chged_hps_.empty()) { + chged_hps_.clear(); + } + if (!chged_inventorys_.empty()) { + chged_inventorys_.clear(); + } + if (!chged_skillcds_.empty()) { + chged_skillcds_.clear(); } } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 20657ce..0c6c36e 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -245,7 +245,9 @@ protected: std::vector chged_buffs_; std::vector revive_objs_; std::vector dead_objs_; - std::set property_chged_humans_; + std::vector chged_hps_; + std::vector chged_inventorys_; + std::vector chged_skillcds_; std::set observers_; Human* follow_target_ = nullptr; bool follow_synced_active_player_ = false;