From e8d711dcd3fa26511648815cae8b0500f591dcbb Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 17 Jun 2021 18:48:52 +0800 Subject: [PATCH] =?UTF-8?q?buff=20post=20action=E6=B7=BB=E5=8A=A0addbuff?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.cc | 14 ++++++++++++++ server/gameserver/buff.h | 5 +++++ server/gameserver/constant.h | 3 ++- server/gameserver/constant_export.h | 1 + server/gameserver/creature.cc | 16 +++++++++++++--- server/gameserver/creature.h | 1 + server/gameserver/metadata.cc | 5 ++++- 7 files changed, 40 insertions(+), 5 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 548806c..80eb9de 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -450,3 +450,17 @@ void Buff::ProcTurnOver(Creature* caster) ); } } + +CreatureWeakPtr& Buff::GetCaster() +{ + return caster_; +} + +void Buff::SetCaster(Creature* caster) +{ + if (caster) { + caster_.Attach(caster); + } else { + caster_.Reset(); + } +} diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index 33ff2bd..52c297c 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -1,5 +1,7 @@ #pragma once +#include "weakptr.h" + namespace MetaData { struct Player; @@ -36,6 +38,8 @@ class Buff bool NeedSync(Human* hum); void FillMFBuff(cs::MFBuff* buff_pb); bool FreezeOperate(); + CreatureWeakPtr& GetCaster(); + void SetCaster(Creature* caster); void ProcDelayAddBuff(Creature* caster); void ProcIntervalAddBuff(Creature* caster); @@ -59,4 +63,5 @@ private: private: int hold_curr_weapon_idx_ = 0; std::list hold_weapons_; + CreatureWeakPtr caster_; }; diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 376b269..b381665 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -323,7 +323,8 @@ enum GameChannel_e enum PostBuffAction_e { kRemoveBuffByIdAction = 1, - kRemoveBuffByEffectAction = 2 + kRemoveBuffByEffectAction = 2, + kAddBuffAction = 3 }; enum ObstacleType_e diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index adea1ac..c4ec44e 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -67,6 +67,7 @@ enum BuffEffectType_e kBET_InGrass = 56, //在草丛 kBET_InWater = 57, //在水里 kBET_InIce = 58, //在冰里 + kBET_PullToWalkable = 59, //从碰撞里以自己方向拖出来直到没有碰撞 kBET_BatchAddBuff = 60, //批量添加buff kBET_BeRecycle = 61, //待回收 kBET_Trace = 62, //追踪玩家 diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 0a076c4..c5e7f0c 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -192,6 +192,7 @@ void Creature::AddBuff(Creature* caster, } } Buff* buff = &a8::FastAppend(buff_list_); + buff->SetCaster(caster); buff->skill_lv = skill_lv; buff->owner = this; buff->meta = buff_meta; @@ -272,7 +273,7 @@ void Creature::TryAddBuff(Creature* caster, int buff_id) void Creature::RemoveBuffById(int buff_id) { - std::vector removed_buffs; + std::vector> removed_buffs; for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { Buff& buff = *itr; if (buff.meta->i->buff_id() == buff_id) { @@ -280,13 +281,15 @@ void Creature::RemoveBuffById(int buff_id) if (!list_empty(&buff.depend_entry)) { list_del_init(&buff.depend_entry); } - removed_buffs.push_back(buff.meta); + removed_buffs.push_back(std::make_tuple(buff.meta, buff.GetCaster().Get())); OnBuffRemove(buff); buff_list_.erase(itr); break; } } - for (MetaData::Buff* buff_meta : removed_buffs) { + for (auto& tuple1 : removed_buffs) { + MetaData::Buff* buff_meta = std::get<0>(tuple1); + Creature* caster = std::get<1>(tuple1); for (const auto& tuple : buff_meta->post_remove_action) { switch (std::get<0>(tuple)) { case kRemoveBuffByIdAction: @@ -303,6 +306,13 @@ void Creature::RemoveBuffById(int buff_id) } } break; + case kAddBuffAction: + { + for (int buff_id :std::get<1>(tuple)) { + TryAddBuff(caster, buff_id); + } + } + break; default: break; } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 420e0c7..f398404 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -3,6 +3,7 @@ #include "weakptr.h" #include "moveableentity.h" #include "buff.h" +#include "weakptr.h" #include "cs_proto.pb.h" diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 7463ce3..cdae379 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -765,12 +765,15 @@ namespace MetaData std::vector strings3; a8::Split(strings2[1], strings3, ';'); if (strings2[0] == "remove_buff_by_id" || - strings2[0] == "remove_buff_by_effect") { + strings2[0] == "remove_buff_by_effect" || + strings2[0] == "add_buff") { auto& action = a8::FastAppend(post_remove_action); if (strings2[0] == "remove_buff_by_id") { std::get<0>(action) = kRemoveBuffByIdAction; } else if (strings2[0] == "remove_buff_by_effect") { std::get<0>(action) = kRemoveBuffByEffectAction; + } else if (strings2[0] == "add_buff") { + std::get<0>(action) = kAddBuffAction; } for (auto& str3 : strings3) { if (!str3.empty()) {