diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index d1a1e91..b70633b 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -166,6 +166,8 @@ enum EntitySubType_e enum PropertyType_e { + kPropHp = 1, + kPropMaxHp = 2, kPropTankBulletNum = 6, kPropTankOil = 7 }; diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 49eeead..1359319 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -180,6 +180,17 @@ void FrameEvent::AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos) } } +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->chged_hps_.push_back(idx); + } + } +} + void FrameEvent::Clear() { if (!explosions_.empty()) { @@ -209,4 +220,7 @@ void FrameEvent::Clear() if (!chged_tank_oil_max_.empty()) { chged_tank_oil_max_.clear(); } + if (!chged_hps_.empty()) { + chged_hps_.clear(); + } } diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index ca2b4cd..c56472c 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -17,6 +17,7 @@ public: void AddTankBulletNumChg(Human* hum); void AddTankOilValueChg(Human* hum); void AddTankOilMaxChg(Human* hum); + void AddHpChg(Human* hum); void Clear(); private: @@ -29,6 +30,7 @@ private: std::vector chged_tank_bullet_nums_; std::vector chged_tank_oil_value_; std::vector chged_tank_oil_max_; + std::vector chged_hps_; friend class FrameMaker; }; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index d6c25ae..59257f5 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -114,6 +114,25 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum) p->set_value(target->tank_oil_value); } } + for (size_t idx : hum->chged_hps_) { + if (idx < room->frame_event.chged_hps_.size()) { + Human* target = room->frame_event.chged_hps_[idx]; + if (hum->CanSee(target)) { + { + auto p = msg->add_chged_property_list(); + p->set_obj_id(target->entity_uniid); + p->set_property_type(kPropHp); + p->set_value(target->GetHP()); + } + { + auto p = msg->add_chged_property_list(); + p->set_obj_id(target->entity_uniid); + p->set_property_type(kPropMaxHp); + p->set_value(target->GetMaxHP()); + } + } + } + } if (room->frame_event.airdrops_.size() > 0) { *msg->mutable_airdrop() = room->frame_event.airdrops_.Get(0); } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 1c87284..8ae2b33 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -485,6 +485,11 @@ float Human::GetRadius() return meta->i->radius(); } +float Human::GetHP() +{ + return health; +} + float Human::GetMaxHP() { return meta->i->health(); @@ -839,7 +844,11 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i } } } + #if 1 + room->frame_event.AddHpChg(this); + #else SyncAroundPlayers(__FILE__, __LINE__, __func__); + #endif } void Human::AddToNewObjects(Entity* entity) @@ -2033,6 +2042,9 @@ void Human::ClearFrameData() if (!chged_tank_oil_max_.empty()){ chged_tank_oil_max_.clear(); } + if (!chged_hps_.empty()) { + chged_hps_.clear(); + } } void Human::GenBattleReportData(a8::MutableXObject* params) diff --git a/server/gameserver/human.h b/server/gameserver/human.h index dd3750a..79a1a82 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -145,6 +145,7 @@ class Human : public Entity bool IsCollisionInMapService(); void FindPathInMapService(); float GetRadius(); + float GetHP(); float GetMaxHP(); void UpdatePoisoning(); void SyncAroundPlayers(const char* file, int line, const char* func); @@ -252,6 +253,7 @@ protected: std::vector chged_tank_bullet_nums_; std::vector chged_tank_oil_value_; std::vector chged_tank_oil_max_; + std::vector chged_hps_; Human* follow_target_ = nullptr; bool follow_synced_active_player = false;