From af66554d4d7f30442a05d7580010354c4aea2a66 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 9 Jul 2019 18:00:57 +0800 Subject: [PATCH] 1 --- server/gameserver/constant.h | 11 ++++ server/gameserver/frameevent.cc | 42 +++++++++++---- server/gameserver/frameevent.h | 8 +-- server/gameserver/framemaker.cc | 16 +++--- server/gameserver/human.cc | 74 ++++++++++++++++++++++++++ server/gameserver/human.h | 8 +++ server/gameserver/metadata.cc | 20 +++++++ server/gameserver/metadata.h | 16 +++--- server/gameserver/metamgr.cc | 14 ++--- server/tools/protobuild/cs_proto.proto | 1 + 10 files changed, 176 insertions(+), 34 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 33ed6d9..62fae9b 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -184,6 +184,17 @@ enum BuffTriggerType_e BTT_UseItem = 6 //使用道具触发 }; +enum BuffEffectType_e +{ + BET_ChgAttr = 1, //改变属性 + BET_Vertigo = 2, //眩晕 + BET_LastDmg = 3, //持续伤害 + BET_LastBurn = 4, //持续灼烧 + BET_Invincible = 5, //无敌 + BET_Hide = 6, //隐身 + BET_Dcgr = 7, //电磁干扰 +}; + enum SkillFunc_e { Skill_FuncNone = 0, diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 9602a22..3de5bda 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -148,19 +148,39 @@ void FrameEvent::AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos) } } -void FrameEvent::AddDead(Human* sender) +void FrameEvent::AddDead(Human* hum) { - dead_objs_.push_back( - std::make_tuple( - sender->entity_uniid, - MetaMgr::Instance()->revive_time * 1000 - ) - ); + { + dead_objs_.push_back( + std::make_tuple( + hum->entity_uniid, + MetaMgr::Instance()->revive_time * 1000 + ) + ); + } + { + int dead_idx = dead_objs_.size() - 1; + for (auto& cell : hum->grid_list) { + for (auto& hum : cell->human_list) { + hum->dead_objs_.push_back(dead_idx); + } + } + } } -void FrameEvent::AddRevive(Human* sender) +void FrameEvent::AddRevive(Human* hum) { - revive_objids_.push_back(sender->entity_uniid); + { + revive_objs_.push_back(hum->entity_uniid); + } + { + int revive_idx = revive_objs_.size() - 1; + for (auto& cell : hum->grid_list) { + for (auto& hum : cell->human_list) { + hum->revive_objs_.push_back(revive_idx); + } + } + } } void FrameEvent::Clear() @@ -183,8 +203,8 @@ void FrameEvent::Clear() if (airdrops_.size() > 0) { airdrops_.Clear(); } - if (!revive_objids_.empty()) { - revive_objids_.clear(); + if (!revive_objs_.empty()) { + revive_objs_.clear(); } if (!dead_objs_.empty()) { dead_objs_.clear(); diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index b47f009..5e274c0 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -14,8 +14,8 @@ public: void AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_pos); void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos); void AddExplosionEx(Human* sender, int item_id, a8::Vec2 bomb_pos, int effect); - void AddDead(Human* sender); - void AddRevive(Human* sender); + void AddDead(Human* hum); + void AddRevive(Human* hum); void Clear(); private: @@ -25,7 +25,9 @@ private: std::vector> explosions_; std::vector> smokes_; std::vector> emotes_; - std::vector revive_objids_; + std::vector> add_buffs_; + std::vector remove_buffs_; + std::vector revive_objs_; std::vector> dead_objs_; friend class FrameMaker; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index e270ab3..d6d973e 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -63,13 +63,17 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum) } } } - for (int objid : room->frame_event.revive_objids_) { - msg->add_revive_objids(objid); + for (int idx : hum->revive_objs_) { + if (idx < room->frame_event.revive_objs_.size()) { + msg->add_revive_objids(room->frame_event.revive_objs_[idx]); + } } - for (auto& tuple : room->frame_event.dead_objs_) { - auto p = msg->add_dead_objs(); - p->add_values(std::get<0>(tuple)); - p->add_values(std::get<1>(tuple)); + for (int idx : hum->dead_objs_) { + if (idx < room->frame_event.dead_objs_.size()) { + auto p = msg->add_dead_objs(); + p->add_values(std::get<0>(room->frame_event.dead_objs_[idx])); + p->add_values(std::get<1>(room->frame_event.dead_objs_[idx])); + } } 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 a6e8b06..bfceb45 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1299,7 +1299,53 @@ int Human::GetSkillCd() void Human::TriggerBuff(std::set& target_list, BuffTriggerType_e trigger_type) { + auto itr = skill_meta->trigger_type_buffs.find(trigger_type); + if (itr != skill_meta->trigger_type_buffs.end()) { + for (MetaData::Buff* buff_meta : itr->second) { + for (Entity* entity : target_list) { + if (entity->entity_type != ET_Player) { + continue; + } + Human* hum = (Human*)entity; + switch (buff_meta->i->buff_target()) { + case 1: //自己 + { + if (hum == this) { + hum->AddBuff(buff_meta); + } + } + break; + case 2: //友军 + { + if (hum->team_id == team_id) { + hum->AddBuff(buff_meta); + } + } + break; + case 3: //敌军 + { + if (hum->team_id != team_id) { + hum->AddBuff(buff_meta); + } + } + break; + } + }//end for target_list + }//end for buff_list + } +} +void Human::AddBuff(MetaData::Buff* buff_meta) +{ + if (!buff_meta->EffectCanStack()) { + Buff* buff = GetBuffByEffectId(buff_meta->i->buff_effect()); + if (buff) { + return; + } + } + Buff* buff = &a8::FastAppend(buff_list_); + buff->meta = buff_meta; + buff_effect_hash_[buff->meta->i->buff_id()] = buff; } void Human::_UpdateMove(int speed) @@ -1356,6 +1402,18 @@ void Human::ClearFrameData() if (!emotes_.empty()) { emotes_.clear(); } + if (!add_buffs_.empty()) { + add_buffs_.clear(); + } + if (!remove_buffs_.empty()) { + remove_buffs_.clear(); + } + if (!revive_objs_.empty()) { + revive_objs_.clear(); + } + if (!dead_objs_.empty()) { + dead_objs_.clear(); + } } void Human::DeadDrop() @@ -1394,3 +1452,19 @@ void Human::SelectSkillTargets(const a8::Vec2& target_pos, std::set& ta { } + +Buff* Human::GetBuffById(int buff_id) +{ + for (Buff& buff : buff_list_) { + if (buff.meta->i->buff_id() == buff_id) { + return &buff; + } + } + return nullptr; +} + +Buff* Human::GetBuffByEffectId(int effect_id) +{ + auto itr = buff_effect_hash_.find(effect_id); + return itr != buff_effect_hash_.end() ? itr->second : nullptr; +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index f4e3a09..a49e6bc 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -199,6 +199,7 @@ class Human : public Entity int GetSkillLeftTime(); int GetSkillCd(); void TriggerBuff(std::set& target_list, BuffTriggerType_e trigger_type); + void AddBuff(MetaData::Buff* buff_meta); protected: void _UpdateMove(int speed); @@ -208,6 +209,8 @@ private: void DeadDrop(); void Revive(); void SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list); + Buff* GetBuffById(int buff_id); + Buff* GetBuffByEffectId(int effect_id); protected: long long last_shot_frameno_ = 0; @@ -234,6 +237,10 @@ protected: std::vector bullets_; std::vector smokes_; std::vector explosions_; + std::vector add_buffs_; + std::vector remove_buffs_; + std::vector revive_objs_; + std::vector dead_objs_; std::set observers_; Human* follow_target_ = nullptr; bool follow_synced_active_player = false; @@ -242,6 +249,7 @@ private: CircleCollider* self_collider_ = nullptr; long long last_sync_gas_frameno = 0; std::list buff_list_; + std::map buff_effect_hash_; bool already_report_battle_ = false; bool sent_game_end_ = false; diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 360ed51..02f8bb3 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -1,6 +1,7 @@ #include "precompile.h" #include "metadata.h" +#include "metamgr.h" namespace MetaData { @@ -395,12 +396,31 @@ namespace MetaData } } } + { + for (int buff_id : buff_list) { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (!buff_meta) { + abort(); + } + auto itr = trigger_type_buffs.find(buff_meta->i->buff_id()); + if (itr != trigger_type_buffs.end()) { + itr->second.insert(buff_meta); + } else { + trigger_type_buffs[buff_meta->i->buff_id()] = std::set({buff_meta}); + } + } + } } void Buff::Init() { } + bool Buff::EffectCanStack() + { + return i->buff_effect() == BET_ChgAttr; + } + void Dress::Init() { for (size_t j = 0; j < i->max_lv(); ++j) { diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 1a2a015..a7d6e24 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -126,6 +126,14 @@ namespace MetaData int rand_space = 0; }; + struct Buff + { + const metatable::Buff* i = nullptr; + + void Init(); + bool EffectCanStack(); + }; + struct SkillPhase { int phase_idx = 0; @@ -146,16 +154,10 @@ namespace MetaData void Init(); std::set buff_list; + std::map> trigger_type_buffs; std::vector phases; }; - struct Buff - { - const metatable::Buff* i = nullptr; - - void Init(); - }; - struct Dress { const metatable::Dress* i = nullptr; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index d837bcd..7a60d71 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -247,13 +247,6 @@ private: dress_hash[item.i->id()] = &item; } - for (auto& meta : skill_meta_list) { - MetaData::Skill& item = a8::FastAppend(skill_list); - item.i = &meta; - item.Init(); - skill_hash[item.i->skill_id()] = &item; - } - for (auto& meta : buff_meta_list) { MetaData::Buff& item = a8::FastAppend(buff_list); item.i = &meta; @@ -261,6 +254,13 @@ private: buff_hash[item.i->buff_id()] = &item; } + for (auto& meta : skill_meta_list) { + MetaData::Skill& item = a8::FastAppend(skill_list); + item.i = &meta; + item.Init(); + skill_hash[item.i->skill_id()] = &item; + } + for (auto& meta : attr_meta_list) { MetaData::Attr& item = a8::FastAppend(attr_list); item.i = &meta; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 36292a5..9877440 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -466,6 +466,7 @@ message MFBullet //只有追踪类子弹以下两个字段才有意义 optional int32 bullet_uniid = 7; //子弹唯一id optional int32 target_id = 8; //目标id + optional int32 hit_time = 9; //命中时间(毫秒) optional int32 gun_id = 10; //枪id optional float fly_distance = 11; //只有手雷和烟雾弹时这个字段才有意义