From 8a17ecec4b61e5aefd4ea82c4b151a4f6ac2d217 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 27 Sep 2022 15:01:59 +0800 Subject: [PATCH] 1 --- server/gameserver/battledatacontext.cc | 3 +++ server/gameserver/bullet.cc | 18 ++++++++++++++++++ server/gameserver/bullet.h | 2 ++ server/gameserver/metadata.cc | 2 +- server/gameserver/metadata.h | 2 +- server/gameserver/player.cc | 11 +++++++---- 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/server/gameserver/battledatacontext.cc b/server/gameserver/battledatacontext.cc index 1936f17e..87854f8c 100644 --- a/server/gameserver/battledatacontext.cc +++ b/server/gameserver/battledatacontext.cc @@ -491,6 +491,9 @@ float BattleDataContext::CalcDmg(Creature* target, Bullet* bullet) { float total_atk = GetTotalAtk(bullet); float normal_dmg = total_atk * (1 - target->GetBattleContext()->GetDef() / 1000); + if (bullet->strengthen_wall) { + normal_dmg *= 1.2f; + } float crit = IsCrit(bullet) ? GetCritRate(bullet) : 0; float dodge = IsDodge(bullet) ? GetDodgeRuduce(bullet) : 0; float finaly_dmg = normal_dmg * (1.0f + crit + dodge); diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 47eff662..f2fa4273 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -85,6 +85,7 @@ void Bullet::OnHit(std::set& objects) } else { for (auto& target : objects) { bool old_is_dead = target->IsDead(room); + TriggerHitBuff(target); target->OnBulletHit(this); if (target->IsDead(room) && !old_is_dead) { OnKillTarget(target); @@ -837,3 +838,20 @@ void Bullet::ForceRemove() later_removed_ = true; } } + +void Bullet::TriggerHitBuff(Entity* e) +{ + if (!e->IsDead(room) && e->IsCreature(room)) { + Creature* c = (Creature*)e; + for (int buff_id : gun_meta->hit_buff_list) { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (buff_meta) { + c->AddBuff( + sender.Get(), + buff_meta, + skill_meta + ); + } + } + } +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index ba7c3ffe..596e3604 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -33,6 +33,7 @@ class Bullet : public MoveableEntity float fly_distance = 0.0f; MovementComponent* movement = nullptr; int trace_target_id = 0; + int strengthen_wall = 0; virtual ~Bullet() override; virtual void Initialize() override; @@ -45,6 +46,7 @@ class Bullet : public MoveableEntity bool IsPreBattleBullet(); void ForceRemove(); void OnHit(std::set& objects); + void TriggerHitBuff(Entity* e); protected: Bullet(); diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 9ed8f0c4..0970efb1 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -493,7 +493,7 @@ namespace MetaData std::vector strings; a8::Split(i->hit_buff(), strings, '|'); for (auto& str : strings) { - hit_buff_list.push(a8::XValue(str)); + hit_buff_list.push_back(a8::XValue(str)); } } } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index cd00ec6d..25de503d 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -109,7 +109,7 @@ namespace MetaData std::vector> power_charge; MetaData::Buff* buff_meta = nullptr; std::vector> car_buff_list; - std::vector> hit_buff_list; + std::vector hit_buff_list; int car_active_buff_id = 0; int car_deactive_buff_id = 0; long long special_damage_type = 0; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 06ea2c7c..79d6c795 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1153,10 +1153,13 @@ void Player::_CMRequestBulletDmg(f8::MsgHdr& hdr, const cs::CMRequestBulletDmg& } } if (!shield) { - c->DecHP(dmg, - GetUniId(), - GetName(), - std::get<1>(tuple)); + bullet->strengthen_wall = msg.strengthen_wall_uniid() ? 1 : 0; + std::set objects; + objects.insert(c); + bullet->OnHit(objects); + #if 0 + c->OnBulletHit(bullet); + #endif } } #ifdef DEBUG