From 417813f2d53c178bb5991d3d33c3c21cedf2e35f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 31 Jul 2020 11:08:20 +0800 Subject: [PATCH] 1 --- server/gameserver/human.cc | 13 +++++++++++++ server/gameserver/human.h | 1 + server/gameserver/metadata.cc | 12 ++++++++++++ server/gameserver/metadata.h | 2 ++ server/tools/protobuild/metatable.proto | 4 ++++ 5 files changed, 32 insertions(+) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 0366eda..9061f60 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2831,6 +2831,9 @@ void Human::AddBuff(Human* caster, if (GetBuffById(buff_meta->i->buff_id())) { return; } + if (IsImmuneBuffEffect(buff_meta->i->buff_effect())) { + return; + } if (!buff_meta->EffectCanStack()) { Buff* buff = GetBuffByEffectId(buff_meta->i->buff_effect()); if (buff) { @@ -2877,6 +2880,16 @@ void Human::AddBuff(Human* caster, ProcBuffEffect(caster, buff); } +bool Human::IsImmuneBuffEffect(int buff_effect) +{ + for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { + if (itr->meta->IsImmuneBuffEffect(buff_effect)) { + return true; + } + } + return false; +} + void Human::RemoveBuffById(int buff_id) { for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 08aa30a..8b248ab 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -253,6 +253,7 @@ class Human : public MoveableEntity MetaData::Buff* buff_meta, int skill_lv, MetaData::Skill* buff_skill_meta = nullptr); + bool IsImmuneBuffEffect(int buff_effect); void RemoveBuffById(int buff_id); void RemoveBuffByEffectId(int buff_effect_id); void ClearBuffList(); diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 929948e..6302ab2 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -450,6 +450,13 @@ namespace MetaData param2 = a8::XValue(i->buff_param2()).GetDouble(); param3 = a8::XValue(i->buff_param3()).GetDouble(); param4 = a8::XValue(i->buff_param4()).GetDouble(); + { + std::vector strings; + a8::Split(i->immune_buffeffect_list(), strings, '|'); + for (auto& str : strings) { + immune_buffeffect.insert(a8::XValue(str)); + } + } } bool Buff::EffectCanStack() @@ -457,6 +464,11 @@ namespace MetaData return i->buff_effect() == kBET_ChgAttr; } + bool Buff::IsImmuneBuffEffect(int buff_effect) + { + return immune_buffeffect.find(buff_effect) != immune_buffeffect.end(); + } + void Dress::Init() { for (int j = 0; j < i->max_lv(); ++j) { diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 0e2331f..3da5088 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -152,11 +152,13 @@ namespace MetaData void Init(); bool EffectCanStack(); + bool IsImmuneBuffEffect(int buff_effect); float param1 = 0.0f; float param2 = 0.0f; float param3 = 0.0f; float param4 = 0.0f; + std::set immune_buffeffect; }; struct SkillPhase diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 6cb6622..c49b5f5 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -141,6 +141,9 @@ message Robot optional int32 skin = 3; optional int32 weapon_id = 4; optional int32 weapon_lv = 5; + + optional int32 zbmode_weapon_id = 6; + optional int32 zbmode_weapon_lv = 7; } message Skill @@ -185,6 +188,7 @@ message Buff required string buff_param4 = 9; required float duration_time = 10; optional float buff_valueup = 11; + required string immune_buffeffect_list = 12; } message Drop