From 7ba76ad4ebd743cea0b738ef921c65bb188d609d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 9 Apr 2021 19:05:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=B9=E9=87=8Fbuff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.cc | 31 +++++++++++++++++- server/gameserver/metadata.cc | 59 +++++++++++++++++++++++++++++++++++ server/gameserver/metadata.h | 1 + 3 files changed, 90 insertions(+), 1 deletion(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index d726838..471c73e 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -37,7 +37,36 @@ void Buff::ProcIntervalAddBuff(Creature* caster) void Buff::ProcBatchAddBuff(Creature* caster) { - + for (auto& tuple : meta->batch_add_list) { + int rand_space = std::get<0>(tuple); + const auto& items = std::get<1>(tuple); + if (items.empty()) { + abort(); + } + int rnd = rand(); + if (rand_space == -1) { + //概率 + rnd = rnd % 10000; + if (rnd < std::get<1>(items[0])){ + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(std::get<0>(items[0])); + if (buff_meta) { + owner->AddBuff(caster, buff_meta, 1, nullptr); + } + } + } else { + //权重 + rnd = rnd % rand_space; + for (const auto& item : items) { + if (rnd <= std::get<1>(item)) { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(std::get<0>(item)); + if (buff_meta) { + owner->AddBuff(caster, buff_meta, 1, nullptr); + } + break; + } + } + } + } } void Buff::InternalTimerAddBuff(Creature* caster) diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 09a6233..dfbb4d4 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -555,6 +555,65 @@ namespace MetaData } } } + if (i->buff_effect() == kBET_BatchAddBuff) { + std::vector strings1; + a8::Split(i->buff_param1(), strings1, '|'); + for (auto& str1 : strings1) { + std::vector strings2; + a8::Split(str1, strings2, '|'); + for (auto& str2 : strings2) { + if (str2.size() < 1) { + abort(); + } + auto& p = a8::FastAppend(batch_add_list); + if (str2[0] != '!') { + //概率 + std::vector strings3; + a8::Split(str2, strings3, ':'); + if (strings3.size() != 2) { + abort(); + } + if (a8::XValue(strings3[1]).GetInt() <= 0) { + abort(); + } + std::get<0>(p) = -1; + std::get<1>(p).push_back + ( + std::make_tuple(a8::XValue(strings3[0]), + a8::XValue(strings3[1])) + ); + } else { + //权重 + std::vector strings3; + a8::Split(str2, strings3, '$'); + int rand_space = 0; + for (const std::string& str3 : strings3) { + std::vector strings4; + a8::Split(str3, strings4, ':'); + if (strings4.size() != 2) { + abort(); + } + std::string tmp_str = strings4[0]; + a8::ReplaceString(tmp_str, "!", ""); + int buff_id = a8::XValue(tmp_str); + int weight = a8::XValue(strings4[1]); + if (weight <= 0) { + abort(); + } + + rand_space += weight; + std::get<1>(p).push_back + ( + std::make_tuple(buff_id, + rand_space) + ); + } + std::get<0>(p) = rand_space; + } + } + int i = 0; + } + } } bool Buff::EffectCanStack() diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 3b3ec25..85bb08f 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -170,6 +170,7 @@ namespace MetaData float param3 = 0.0f; float param4 = 0.0f; std::vector param2_int_list; + std::vector>>> batch_add_list; std::vector>> post_remove_action; std::set immune_buffeffect; };