From d25eeeee6138e6f4836bb16ab6e821c7d471b621 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 19 Jan 2024 19:11:10 +0800 Subject: [PATCH] 1 --- server/gameserver/buff/callfunc.cc | 10 +++++++--- server/gameserver/bullet.cc | 12 +++++++++--- server/gameserver/bullet.h | 3 ++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/server/gameserver/buff/callfunc.cc b/server/gameserver/buff/callfunc.cc index 33c12c28..7b2704db 100644 --- a/server/gameserver/buff/callfunc.cc +++ b/server/gameserver/buff/callfunc.cc @@ -1457,11 +1457,15 @@ void CallFuncBuff::Shot() if (ignore_original_dmg) { owner->GetAbility()->IncSwitch(kIgnoreOriginalDmg); } + CreatureWeakPtr owner_wp = owner->GetWeakPtrRef(); + int buff_uniid_copy = buff_uniid; auto on_bullet_exit = - [] (Bullet* bullet) - { + [owner_wp, buff_uniid_copy] (Bullet* bullet) mutable + { + if (owner_wp.Get()) { - }; + } + }; glm::vec3 old_attack_dir = owner->GetAttackDir(); if (spec_target_pos) { glm::vec3 target_pos = glm::vec3(x, y, z); diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index b5b0acdc..60e5ec1c 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -126,7 +126,9 @@ void Bullet::OnHit(std::set& objects) ProcFlyHook(target); if (!c || (c->team_id != sender.Get()->team_id)) { if (!c || !c->IsCar()) { - target->OnBulletHit(this); + if (!ignore_original_dmg) { + target->OnBulletHit(this); + } } } break; @@ -150,7 +152,9 @@ void Bullet::OnHit(std::set& objects) if (!eat) { bool old_is_dead = target->IsDead(room); TriggerHitBuff(target); - target->OnBulletHit(this); + if (!ignore_original_dmg) { + target->OnBulletHit(this); + } if (target->IsDead(room) && !old_is_dead) { OnKillTarget(target); } @@ -811,6 +815,9 @@ void Bullet::ForceRemove() if (!keep_shot_animi_timer_ptr.expired()) { room->xtimer.Delete(keep_shot_animi_timer_ptr); } + if (on_bullet_exit) { + on_bullet_exit(this); + } } } @@ -1076,7 +1083,6 @@ void Bullet::ProcRequestBulletDmg(int shield_hit, int strength_wall_uniid, int t if (!sender.Get()) { return; } - GetMutablePos().FromGlmVec3(pos); room->grid_service->MoveBullet(this); float distance = GlmHelper::Norm(GetPos().ToGlmVec3() - born_pos.ToGlmVec3()); diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index b5e8623e..644b21f7 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -33,7 +33,8 @@ class Bullet : public MoveableEntity, public IBullet a8::XTimerWp keep_shot_animi_timer_ptr; float shot_animi_time = 0.0f; std::shared_ptr> reporter_list; - + bool ignore_original_dmg = false; + std::function on_bullet_exit = nullptr; virtual ~Bullet() override; virtual void Initialize() override;