From ed676e46781f12a1d2ca5aeb05e272eb3da4fe02 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 1 Jul 2021 03:37:02 +0000 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 18 ++++++--- server/gameserver/human.cc | 2 +- server/gameserver/metadata.cc | 14 +++++++ server/gameserver/metadata.h | 2 + server/gameserver/trigger.cc | 70 ++++++++++++++++++++++------------- server/gameserver/trigger.h | 6 ++- 6 files changed, 77 insertions(+), 35 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index fdb507f..03d6ceb 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1049,12 +1049,18 @@ void Creature::AddSkill(int skill_id) { MetaData::Skill* skill_meta = MetaMgr::Instance()->GetSkill(skill_id); if (skill_meta && !GetSkill(skill_id)) { - Skill* skill = new Skill; - skill->owner = this; - skill->meta = skill_meta; - skill->xtimer_attacher.xtimer = &room->xtimer; - skill->Initialzie(); - skill_hash_[skill_id] = skill; + if (skill_meta->i->skill_type() == 1) { + Skill* skill = new Skill; + skill->owner = this; + skill->meta = skill_meta; + skill->xtimer_attacher.xtimer = &room->xtimer; + skill->Initialzie(); + skill_hash_[skill_id] = skill; + } else if (skill_meta->i->skill_type() == 2) { + AddPassiveSkill(skill_id); + } else { + return; + } } } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 84d76f3..e21763c 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -909,7 +909,7 @@ void Human::DecHP(float dec_hp, int killer_id, const std::string& killer_name, i } room->frame_event.AddHpChg(GetWeakPtrRef()); } - GetTrigger()->HpChg(old_hp, GetHP()); + GetTrigger()->HpChg(); } void Human::AddToNewObjects(Entity* entity) diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 52b58aa..6f496a3 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -811,6 +811,20 @@ namespace MetaData param2_int_list.push_back(a8::XValue(str).GetInt()); } } + { + std::vector strings; + a8::Split(i->buff_param3(), strings, ':'); + for (auto& str : strings) { + param3_int_list.push_back(a8::XValue(str).GetInt()); + } + } + { + std::vector strings; + a8::Split(i->buff_param4(), strings, ':'); + for (auto& str : strings) { + param4_int_list.push_back(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 fba00d3..af323b2 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -209,6 +209,8 @@ namespace MetaData int int_param4 = 0; std::vector param1_int_list; std::vector param2_int_list; + std::vector param3_int_list; + std::vector param4_int_list; std::vector>>> batch_add_list; std::vector>> post_remove_action; std::set immune_buffeffect; diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index 4dc809e..59b8ca1 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -29,14 +29,12 @@ void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon) switch (buff->meta->int_param3) { case kWeaponOptTakeon: { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); + AddBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } break; case kWeaponOptKeep: { - if (!owner_->GetBuffById(buff->meta->int_param4)) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); - } + TryAddBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } break; default: @@ -57,7 +55,7 @@ void Trigger::Shot(MetaData::Equip* weapon_meta) [this, cond, weapon_meta] (Buff* buff, bool& stop) { if (weapon_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); + AddBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } }); } @@ -71,7 +69,7 @@ void Trigger::Kill(Creature* target) [this] (Buff* buff, bool& stop) { if (buff->meta->int_param2 == kill_num_) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); + AddBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } }); } @@ -83,7 +81,7 @@ void Trigger::UseItemAction(int slot_id) [this, slot_id] (Buff* buff, bool& stop) { if (buff->meta->int_param2 == slot_id) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); + AddBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } }); } @@ -95,12 +93,12 @@ void Trigger::UseSkill(Skill* skill) [this, skill] (Buff* buff, bool& stop) { if (buff->meta->int_param2 == skill->meta->i->skill_id()) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); + AddBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } }); } -void Trigger::HpChg(float old_hp, float new_hp) +void Trigger::HpChg() { TraverseCondBuffs (kCondBuffHp, @@ -133,8 +131,8 @@ void Trigger::HpChg(float old_hp, float new_hp) } break; } - if (match && !owner_->GetBuffById(buff->meta->int_param4)) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); + if (match) { + TryAddBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } }); } @@ -179,19 +177,10 @@ void Trigger::TriggeCondBuffAll(int cond) (cond, [this, cond] (Buff* buff, bool& stop) { - AddBuff(cond, buff->meta->int_param4); + AddBuffs(cond, buff->meta->param4_int_list); }); } -void Trigger::AddBuff(int cond, int buff_id) -{ -#ifdef DEBUG - owner_->MustBeAddBuff(owner_, buff_id); -#else - owner_->TryBeAddBuff(owner_, buff_id); -#endif -} - void Trigger::ActiveBuff(MetaData::Buff* buff_meta) { for (int cond = kCondBuffUpdateBuffId; cond <= kCondBuffUpdateBuffEffect; ++cond) { @@ -203,14 +192,12 @@ void Trigger::ActiveBuff(MetaData::Buff* buff_meta) switch (buff->meta->int_param3) { case kBuffOptActive: { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); + AddBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } break; case kBuffOptKeep: { - if (!owner_->GetBuffById(buff->meta->int_param4)) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); - } + TryAddBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } break; default: @@ -235,7 +222,7 @@ void Trigger::DeactiveBuff(MetaData::Buff* buff_meta) case kBuffOptDeactive: case kBuffOptKeep: { - owner_->RemoveBuffById(buff->meta->int_param4); + RemoveBuffs(buff->meta->int_param1, buff->meta->param4_int_list); } break; default: @@ -247,3 +234,34 @@ void Trigger::DeactiveBuff(MetaData::Buff* buff_meta) }); } } + +void Trigger::TryAddBuffs(int cond, std::vector& buffids) +{ + for (int buffid : buffids) { + if (!owner_->GetBuffById(buffid)) { +#ifdef DEBUG + owner_->MustBeAddBuff(owner_, buffid); +#else + owner_->TryBeAddBuff(owner_, buffid); +#endif + } + } +} + +void Trigger::AddBuffs(int cond, std::vector& buffids) +{ + for (int buffid : buffids) { +#ifdef DEBUG + owner_->MustBeAddBuff(owner_, buffid); +#else + owner_->TryBeAddBuff(owner_, buffid); +#endif + } +} + +void Trigger::RemoveBuffs(int cond, std::vector& buffids) +{ + for (int buffid : buffids) { + owner_->RemoveBuffById(buffid); + } +} diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h index beeb97e..696ed7f 100644 --- a/server/gameserver/trigger.h +++ b/server/gameserver/trigger.h @@ -22,7 +22,7 @@ public: void Kill(Creature* target); void UseItemAction(int slot_id); void UseSkill(Skill* skill); - void HpChg(float old_hp, float new_hp); + void HpChg(); void Die(); void ActiveBuff(MetaData::Buff* buff_meta); void DeactiveBuff(MetaData::Buff* buff_meta); @@ -30,7 +30,9 @@ public: private: void TraverseCondBuffs(int cond, std::function func); void TriggeCondBuffAll(int cond); - void AddBuff(int cond, int buff_id); + void TryAddBuffs(int cond, std::vector& buffids); + void AddBuffs(int cond, std::vector& buffids); + void RemoveBuffs(int cond, std::vector& buffids); private: Creature* owner_ = nullptr;