From 8a8d5370b5be3f98c3d0ee0b868e0ead2ccf693d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 9 Sep 2021 13:12:31 +0800 Subject: [PATCH] 1 --- server/gameserver/buff.cc | 5 ++++- server/gameserver/creature.cc | 10 ++++++++++ server/gameserver/metadata.cc | 22 ++++++++++++++++++++++ server/gameserver/metadata.h | 2 ++ server/tools/protobuild/metatable.proto | 2 ++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 6212fc1..e09d56e 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -363,7 +363,10 @@ void Buff::ProcSprint() std::set enemys; buff->owner->GetHitEnemys(enemys, buff->meta->param4); for (auto& enemy : enemys) { - if (enemy->IsEntityType(ET_Car)) { + if (!buff->meta->int_param5 && enemy->IsEntityType(ET_Car)) { + continue; + } + if (enemy->IsHuman() && enemy->AsHuman()->GetCar()) { continue; } if (hited_objects->find(enemy->GetUniId()) == hited_objects->end()) { diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 5730fae..ad61a21 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -303,6 +303,16 @@ int Creature::AddBuff(Creature* caster, int skill_lv, MetaData::Skill* buff_skill_meta) { + if (buff_meta->only_spec_race) { + if (!a8::HasBitFlag(buff_meta->only_spec_race, GetEntityType())) { + return 0; + } + } + if (buff_meta->exclude_spec_race) { + if (a8::HasBitFlag(buff_meta->exclude_spec_race, GetEntityType())) { + return 0; + } + } if (buff_meta->i->buff_interval() > 0) { if (buff_interval_hash_.find(buff_meta->i->buff_id()) != buff_interval_hash_.end()) { return 0; diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index ca00c60..598bcf0 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -934,6 +934,28 @@ namespace MetaData param4_int_list.push_back(a8::XValue(str).GetInt()); } } + { + std::vector strings; + a8::Split(i->only_spec_race(), strings, '|'); + for (auto& str : strings) { + int n = a8::XValue(str); + if (n <= 0 || n > 63) { + abort(); + } + a8::SetBitFlag(only_spec_race, n); + } + } + { + std::vector strings; + a8::Split(i->exclude_spec_race(), strings, '|'); + for (auto& str : strings) { + int n = a8::XValue(str); + if (n <= 0 || n > 63) { + abort(); + } + a8::SetBitFlag(exclude_spec_race, n); + } + } { std::vector strings; a8::Split(i->tag(), strings, '|'); diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 6dfa590..dac5177 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -237,6 +237,8 @@ namespace MetaData std::set immune_buffeffect; std::vector> hero_infos; std::set tags; + long long only_spec_race = 0; + long long exclude_spec_race = 0; std::vector child_buff_list; }; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 9ce4479..b942f9d 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -288,6 +288,8 @@ message Buff optional int32 buff_interval = 24; optional string tag = 25; optional int32 post_battle_valid = 26; + optional string only_spec_race = 27; + optional string exclude_spec_race = 28; } message Drop