From 8364eeb6f66b0404000a77578b0be10f1714bbee Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 30 Jun 2021 09:17:21 +0000 Subject: [PATCH] 1 --- server/gameserver/constant.h | 9 ++ server/gameserver/metadata.cc | 50 ++++++++ server/gameserver/metadata.h | 2 + server/gameserver/trigger.cc | 217 ++++++++++++---------------------- server/gameserver/trigger.h | 1 + 5 files changed, 136 insertions(+), 143 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 7b3d0b4..3124ceb 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -410,6 +410,15 @@ enum BuffOpt_e kBuffOptEnd }; +enum HpOpt_e +{ + kHpOptLeAbs = 0, + kHpOptLeRate = 1, + kHpOptGeAbs = 2, + kHpOptGeRate = 3, + kHpOptEnd +}; + const char* const PROJ_NAME_FMT = "game%d_gameserver"; const char* const PROJ_ROOT_FMT = "/data/logs/%s"; diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index f14d3d5..52b58aa 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -339,6 +339,35 @@ namespace MetaData return weapon_idx; } + bool Equip::Match(CondAddBuff_e cond, int val) + { + switch (cond) { + case kCondBuffUpdateWeaponId: + case kCondBuffShotWeaponId: + { + return val == i->id(); + } + break; + case kCondBuffUpdateWeaponSlot: + case kCondBuffShotWeaponSlot: + { + return val == i->_inventory_slot(); + } + break; + case kCondBuffUpdateWeaponType: + case kCondBuffShotWeaponType: + { + return val == i->equip_subtype(); + } + break; + default: + { + return false; + } + break; + } + } + void EquipUpgrade::Init() { const int MAX_LV = 20; @@ -905,6 +934,27 @@ namespace MetaData return immune_buffeffect.find(buff_effect) != immune_buffeffect.end(); } + bool Buff::Match(CondAddBuff_e cond, int val) + { + switch (cond) { + case kCondBuffUpdateBuffId: + { + return val == i->buff_id(); + } + break; + case kCondBuffUpdateBuffEffect: + { + return val == i->buff_effect(); + } + break; + default: + { + return false; + } + break; + } + } + 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 0153583..fba00d3 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -88,6 +88,7 @@ namespace MetaData void Init(); int GetWeaponIdx(); + bool Match(CondAddBuff_e cond, int val); }; struct EquipUpgrade @@ -196,6 +197,7 @@ namespace MetaData void Init(); bool EffectCanStack(); bool IsImmuneBuffEffect(int buff_effect); + bool Match(CondAddBuff_e cond, int val); float param1 = 0.0f; float param2 = 0.0f; diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index 11e461a..4dc809e 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -20,59 +20,23 @@ void Trigger::UnInit() void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon) { MetaData::Equip* new_weapon_meta = new_weapon->meta; - { + for (int cond = kCondBuffUpdateWeaponId; cond <= kCondBuffUpdateWeaponType; cond++) { TraverseCondBuffs - (kCondBuffUpdateWeaponId, - [this, new_weapon_meta] (Buff* buff, bool& stop) + (cond, + [this, cond, new_weapon_meta] (Buff* buff, bool& stop) { - if (buff->meta->int_param2 == new_weapon_meta->i->id()) { + if (new_weapon_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) { switch (buff->meta->int_param3) { case kWeaponOptTakeon: - case kWeaponOptKeep: { AddBuff(buff->meta->int_param1, buff->meta->int_param4); } break; - default: - { - } - break; - } - } - }); - } - { - TraverseCondBuffs - (kCondBuffUpdateWeaponSlot, - [this, new_weapon_meta] (Buff* buff, bool& stop) - { - if (buff->meta->int_param2 == new_weapon_meta->i->_inventory_slot()) { - switch (buff->meta->int_param3) { - case kWeaponOptTakeon: case kWeaponOptKeep: { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); - } - break; - default: - { - } - break; - } - } - }); - } - { - TraverseCondBuffs - (kCondBuffUpdateWeaponType, - [this, new_weapon_meta] (Buff* buff, bool& stop) - { - if (buff->meta->int_param2 == new_weapon_meta->i->equip_subtype()) { - switch (buff->meta->int_param3) { - case kWeaponOptTakeon: - case kWeaponOptKeep: - { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); + if (!owner_->GetBuffById(buff->meta->int_param4)) { + AddBuff(buff->meta->int_param1, buff->meta->int_param4); + } } break; default: @@ -87,32 +51,12 @@ void Trigger::TakeonWeapon(Weapon* old_weapon, Weapon* new_weapon) void Trigger::Shot(MetaData::Equip* weapon_meta) { - { + for (int cond = kCondBuffShotWeaponId; cond <= kCondBuffShotWeaponType; ++cond) { TraverseCondBuffs - (kCondBuffShotWeaponId, - [this, weapon_meta] (Buff* buff, bool& stop) + (cond, + [this, cond, weapon_meta] (Buff* buff, bool& stop) { - if (buff->meta->int_param2 == weapon_meta->i->id()) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); - } - }); - } - { - TraverseCondBuffs - (kCondBuffShotWeaponSlot, - [this, weapon_meta] (Buff* buff, bool& stop) - { - if (buff->meta->int_param2 == weapon_meta->i->_inventory_slot()) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); - } - }); - } - { - TraverseCondBuffs - (kCondBuffShotWeaponType, - [this, weapon_meta] (Buff* buff, bool& stop) - { - if (buff->meta->int_param2 == weapon_meta->i->equip_subtype()) { + if (weapon_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) { AddBuff(buff->meta->int_param1, buff->meta->int_param4); } }); @@ -121,30 +65,27 @@ void Trigger::Shot(MetaData::Equip* weapon_meta) void Trigger::Kill(Creature* target) { - { - TraverseCondBuffs - (kCondBuffKillTarget, - [this] (Buff* buff, bool& stop) - { - if (buff->meta->int_param2 >= 1) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); - } - }); - } + ++kill_num_; + TraverseCondBuffs + (kCondBuffKillTarget, + [this] (Buff* buff, bool& stop) + { + if (buff->meta->int_param2 == kill_num_) { + AddBuff(buff->meta->int_param1, buff->meta->int_param4); + } + }); } void Trigger::UseItemAction(int slot_id) { - { - TraverseCondBuffs - (kCondBuffEatDrug, - [this, slot_id] (Buff* buff, bool& stop) - { - if (buff->meta->int_param2 == slot_id) { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); - } - }); - } + TraverseCondBuffs + (kCondBuffEatDrug, + [this, slot_id] (Buff* buff, bool& stop) + { + if (buff->meta->int_param2 == slot_id) { + AddBuff(buff->meta->int_param1, buff->meta->int_param4); + } + }); } void Trigger::UseSkill(Skill* skill) @@ -161,7 +102,41 @@ void Trigger::UseSkill(Skill* skill) void Trigger::HpChg(float old_hp, float new_hp) { - + TraverseCondBuffs + (kCondBuffHp, + [this] (Buff* buff, bool& stop) + { + bool match = false; + switch (buff->meta->int_param3) { + case kHpOptLeAbs: + { + match = owner_->GetHP() < buff->meta->int_param2; + } + break; + case kHpOptLeRate: + { + match = (owner_->GetHP() / owner_->GetMaxHP() * 100) < buff->meta->int_param2; + } + break; + case kHpOptGeAbs: + { + match = owner_->GetHP() > buff->meta->int_param2; + } + break; + case kHpOptGeRate: + { + match = (owner_->GetHP() / owner_->GetMaxHP() * 100) > buff->meta->int_param2; + } + break; + default: + { + } + break; + } + if (match && !owner_->GetBuffById(buff->meta->int_param4)) { + AddBuff(buff->meta->int_param1, buff->meta->int_param4); + } + }); } void Trigger::Die() @@ -219,38 +194,23 @@ void Trigger::AddBuff(int cond, int buff_id) void Trigger::ActiveBuff(MetaData::Buff* buff_meta) { - { + for (int cond = kCondBuffUpdateBuffId; cond <= kCondBuffUpdateBuffEffect; ++cond) { TraverseCondBuffs - (kCondBuffUpdateBuffId, - [this, buff_meta] (Buff* buff, bool& stop) + (cond, + [this, cond, buff_meta] (Buff* buff, bool& stop) { - if (buff->meta->int_param2 == buff_meta->i->buff_id()) { + if (buff_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) { switch (buff->meta->int_param3) { case kBuffOptActive: - case kBuffOptKeep: { AddBuff(buff->meta->int_param1, buff->meta->int_param4); } break; - default: - { - } - break; - } - } - }); - } - { - TraverseCondBuffs - (kCondBuffUpdateBuffEffect, - [this, buff_meta] (Buff* buff, bool& stop) - { - if (buff->meta->int_param2 == buff_meta->i->buff_effect()) { - switch (buff->meta->int_param3) { - case kBuffOptActive: case kBuffOptKeep: { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); + if (!owner_->GetBuffById(buff->meta->int_param4)) { + AddBuff(buff->meta->int_param1, buff->meta->int_param4); + } } break; default: @@ -265,48 +225,19 @@ void Trigger::ActiveBuff(MetaData::Buff* buff_meta) void Trigger::DeactiveBuff(MetaData::Buff* buff_meta) { - { + for (int cond = kCondBuffUpdateBuffId; cond <= kCondBuffUpdateBuffEffect; ++cond) { TraverseCondBuffs - (kCondBuffUpdateBuffId, - [this, buff_meta] (Buff* buff, bool& stop) + (cond, + [this, cond, buff_meta] (Buff* buff, bool& stop) { - if (buff->meta->int_param2 == buff_meta->i->buff_id()) { + if (buff_meta->Match((CondAddBuff_e)cond, buff->meta->int_param2)) { switch (buff->meta->int_param3) { case kBuffOptDeactive: - { - owner_->RemoveBuffById(buff->meta->int_param4); - } - break; case kBuffOptKeep: - { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); - } - break; - default: - { - } - break; - } - } - }); - } - { - TraverseCondBuffs - (kCondBuffUpdateBuffEffect, - [this, buff_meta] (Buff* buff, bool& stop) - { - if (buff->meta->int_param2 == buff_meta->i->buff_effect()) { - switch (buff->meta->int_param3) { - case kBuffOptDeactive: { owner_->RemoveBuffById(buff->meta->int_param4); } break; - case kBuffOptKeep: - { - AddBuff(buff->meta->int_param1, buff->meta->int_param4); - } - break; default: { } diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h index 6ba094e..beeb97e 100644 --- a/server/gameserver/trigger.h +++ b/server/gameserver/trigger.h @@ -34,4 +34,5 @@ public: private: Creature* owner_ = nullptr; + int kill_num_ = 0; };