From 3522bb307a7992fc53e8b40107f0af01fc82b2ad Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 20 Jul 2021 03:13:43 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A9=B1=E6=95=A3=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.cc | 19 +++++++++++++ server/gameserver/buff.h | 1 + server/gameserver/constant_export.h | 3 ++ server/gameserver/creature.cc | 38 +++++++++++++++++++++++-- server/gameserver/creature.h | 2 ++ server/gameserver/metadata.cc | 8 ++++++ server/gameserver/metadata.h | 2 ++ server/tools/protobuild/metatable.proto | 1 + 8 files changed, 72 insertions(+), 2 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 037395e..706487d 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -529,3 +529,22 @@ void Buff::ProcOnceChgAttr() { } + +void Buff::ProcDisperse() +{ + std::vector del_buffs; + owner->TraverseBuff + ( + [this, &del_buffs] (Buff* buff, bool& stop) + { + for (int tag : meta->param1_int_set) { + if (buff->meta->tags.find(tag) != buff->meta->tags.end()) { + del_buffs.push_back(buff->buff_uniid); + break; + } + } + }); + for (int buff_uniid : del_buffs) { + owner->RemoveBuffByUniId(buff_uniid); + } +} diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index 0f5cac0..1d72ddc 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -69,6 +69,7 @@ class Buff void ProcSeletTargetWithSelfPos(); void ProcTurnOver(); void ProcPullToWalkable(); + void ProcDisperse(); private: void InternalTimerAddBuff(); diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index 0470efa..4f77c55 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -86,6 +86,9 @@ enum BuffEffectType_e kBET_MountainTop = 63, //在山顶 kBET_UseSkill = 64, //使用技能 kBET_CamouflageAddition = 65, //对抗伪装 + kBET_AutoShot = 66, //自动射击 + kBET_BeatBack = 67, //击退 + kBET_Disperse = 68, //驱散 kBET_End }; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index c7f12fd..1a5ea08 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -409,10 +409,27 @@ int Creature::TryAddBuff(Creature* caster, int buff_id) void Creature::RemoveBuffById(int buff_id) { - std::vector> removed_buffs; + int buff_uniid = 0; for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { Buff& buff = *itr; if (buff.meta->i->buff_id() == buff_id) { + buff_uniid = buff.buff_uniid; + break; + } + } + if (buff_uniid != 0) { + RemoveBuffByUniId(buff_uniid); + } +} + +void Creature::RemoveBuffByUniId(int buff_uniid) +{ + int buff_id = 0; + std::vector> removed_buffs; + for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { + Buff& buff = *itr; + if (buff.buff_uniid == buff_uniid) { + buff_id = buff.meta->i->buff_id(); removed_buffs.push_back(std::make_tuple(buff.meta, buff.GetCaster().Get())); OnBuffRemove(buff); buff.UnInit(); @@ -472,7 +489,7 @@ void Creature::RemoveBuffById(int buff_id) SendDebugMsg(a8::Format("移除buff_id:%d", { buff_id - })); + })); #endif } @@ -912,6 +929,7 @@ Skill* Creature::CurrentSkill() void Creature::ProcBuffEffect(Creature* caster, Buff* buff) { + MetaData::Buff* buff_meta = buff->meta; switch (buff->meta->i->buff_effect()) { case kBET_ChgAttr: case kBET_Car: @@ -1209,6 +1227,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) } } break; + case kBET_Disperse: + { + buff->ProcDisperse(); + } + break; default: { } @@ -2418,3 +2441,14 @@ void Creature::ProcOnceChgAttrBuff(MetaData::Buff* buff_meta) break; } } + +void Creature::TraverseBuff(std::function func) +{ + bool stop = false; + for (auto& buff : buff_list_) { + func(&buff, stop); + if (stop) { + return; + } + } +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 9218d77..4195fce 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -103,6 +103,7 @@ class Creature : public MoveableEntity int MustBeAddBuff(Creature* caster, int buff_id); int TryAddBuff(Creature* caster, int buff_id); void RemoveBuffById(int buff_id); + void RemoveBuffByUniId(int buff_uniid); void ClearBuffById(int buff_id); void RecalcBuffAttr(); void RemoveBuffByEffectId(int buff_effect_id); @@ -207,6 +208,7 @@ class Creature : public MoveableEntity Trigger* GetTrigger() { return trigger_; }; std::shared_ptr& GetAbility() { return ability_; }; void RefreshHP(); + void TraverseBuff(std::function func); protected: diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index b78103c..485869f 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -822,6 +822,7 @@ namespace MetaData a8::Split(i->buff_param1(), strings, '|'); for (auto& str : strings) { param1_int_list.push_back(a8::XValue(str).GetInt()); + param1_int_set.insert(a8::XValue(str).GetInt()); } } { @@ -849,6 +850,13 @@ namespace MetaData param4_int_list.push_back(a8::XValue(str).GetInt()); } } + { + std::vector strings; + a8::Split(i->tag(), strings, '|'); + for (auto& str : strings) { + tags.insert(a8::XValue(str).GetInt()); + } + } { std::vector strings; a8::Split(i->post_remove_action(), strings, '|'); diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 4a7ed6e..105d277 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -213,6 +213,7 @@ namespace MetaData int int_param5 = 0; std::vector param1_int_list; std::vector param2_int_list; + std::set param1_int_set; std::set param2_int_set; std::vector param3_int_list; std::vector param4_int_list; @@ -220,6 +221,7 @@ namespace MetaData std::vector>> post_remove_action; std::set immune_buffeffect; std::vector> hero_infos; + std::set tags; std::vector child_buff_list; }; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 2b18247..ff0eb57 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -258,6 +258,7 @@ message Buff optional int32 coexist_num = 18; optional int32 dead_valid = 23; optional int32 buff_interval = 24; + optional string tag = 25; } message Drop