From d43e781022fdba7b9ad0c26871152b0468e63488 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 19:36:36 +0800 Subject: [PATCH 1/3] 1 --- server/gameserver/bullet.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 9e8d0e4e..47dec281 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -80,7 +80,10 @@ void Bullet::OnHit(std::set& objects) if (IsFlyHook()) { if (sender.Get() && !sender.Get()->dead) { for (auto& target : objects) { - ProcFlyHook(target); + if (target->IsCreature(room) && + !((Creature*)target)->IsCar()) { + ProcFlyHook(target); + } break; } } From 9b77cb1b911d2cd06435110e153af517d4ac743d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 20:12:46 +0800 Subject: [PATCH 2/3] 1 --- server/gameserver/bullet.cc | 14 ++++++++++++-- server/gameserver/creature.cc | 3 ++- server/gameserver/creature.h | 3 ++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 47dec281..73423044 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -809,9 +809,19 @@ void Bullet::ProcFlyHook(Entity* target) if (target->IsCreature(room)) { Creature* c = (Creature*)target; room->frame_event.AddPropChg(c->GetWeakPtrRef(), kPropBeHook, 0, sender.Get()->GetUniId()); - c->AutoNavigation(born_pos, gun_meta->i->bullet_speed() * 2); + int buff_uniid = c->TryAddBuff(c, gun_meta->i->buffid()); + c->AutoNavigation(born_pos, gun_meta->i->bullet_speed() * 2, + [buff_uniid] (Creature* c) + { + c->RemoveBuffByUniId(buff_uniid); + } + ); } else { - sender.Get()->AutoNavigation(GetPos(), gun_meta->i->bullet_speed() * 2); + sender.Get()->AutoNavigation(GetPos(), gun_meta->i->bullet_speed() * 2, + [] (Creature* c) + { + + }); } sender.Get()->IncDisableMoveTimes(); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 0ce13f2c..5ee4f5a6 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -3616,7 +3616,8 @@ void Creature::_UpdateSpecMove() } } -void Creature::AutoNavigation(a8::Vec2 target_pos, float speed) +void Creature::AutoNavigation(a8::Vec2 target_pos, float speed, + std::function cb) { float distance = GetPos().Distance(target_pos); if (distance < 0.001f) { diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 5e28151a..6f166c3a 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -278,7 +278,8 @@ class Creature : public MoveableEntity float GetAttrAbs(int attr_id); float GetAttrRate(int attr_id); void RecalcDtoAttr(); - void AutoNavigation(a8::Vec2 target_pos, float speed); + void AutoNavigation(a8::Vec2 target_pos, float speed, + std::function cb); void AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id); void LockAttackDir(int time); From d943bdf50e9d8c5dc22261e9c6d2c2621b6f04d5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 10 Oct 2022 20:40:17 +0800 Subject: [PATCH 3/3] 1 --- server/gameserver/bullet.cc | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 73423044..c78f5516 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -614,7 +614,19 @@ void Bullet::Check(float distance) sender.Get()->IncDisableAttackDirTimes(); sender.Get()->room->xtimer.AddDeadLineTimerAndAttach ( - (0.2 + distance / gun_meta->i->bullet_speed() / 2) * SERVER_FRAME_RATE, + (distance / gun_meta->i->bullet_speed() / 2) * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(sender.Get()), + [] (const a8::XParams& param) + { + Creature* c = (Creature*)param.sender.GetUserData(); + c->RemoveBuffById(kKeepShotAnimiBuffId); + }, + &sender.Get()->xtimer_attacher.timer_list_ + ); + sender.Get()->room->xtimer.AddDeadLineTimerAndAttach + ( + (0.75 + distance / gun_meta->i->bullet_speed() / 2) * SERVER_FRAME_RATE, a8::XParams() .SetSender(sender.Get()), [] (const a8::XParams& param) @@ -622,7 +634,6 @@ void Bullet::Check(float distance) Creature* c = (Creature*)param.sender.GetUserData(); c->DecDisableMoveTimes(); c->DecDisableAttackDirTimes(); - c->RemoveBuffById(kKeepShotAnimiBuffId); }, &sender.Get()->xtimer_attacher.timer_list_ ); @@ -827,7 +838,7 @@ void Bullet::ProcFlyHook(Entity* target) sender.Get()->IncDisableMoveTimes(); sender.Get()->room->xtimer.AddDeadLineTimerAndAttach ( - (distance / gun_meta->i->bullet_speed() / 2) * SERVER_FRAME_RATE, + (distance / gun_meta->i->bullet_speed() / 2 + 0.75) * SERVER_FRAME_RATE, a8::XParams() .SetSender(sender.Get()), [] (const a8::XParams& param)