From 92c7eb62c018a8eb0d22d5229618de9abaf83bf8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 28 Mar 2024 16:38:48 +0800 Subject: [PATCH] 1 --- server/gameserver/room.cc | 53 +++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index b59d7727..6cbc9d65 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -3728,7 +3728,13 @@ void Room::MobaBatterysUpdate() ( [side, &target, ¢er, &tuple, &last_distance] (Human* hum) -> bool { - if (hum->side != side) { + if (hum->side != side && + !hum->dead && + !a8::HasBitFlag(hum->status, CS_Disable) && + !hum->HasBuffEffect(kBET_Hide) && + !hum->HasBuffEffect(kBET_Dive) && + !hum->HasBuffEffect(kBET_Invincible) + ) { float distance = hum->GetPos().Distance2D2(center); if (distance < std::get<1>(tuple)) { if (!target.Get() || distance < last_distance) { @@ -3741,7 +3747,7 @@ void Room::MobaBatterysUpdate() }); if (!target.Get() || (target.Get() && last_distance <= 0.000001f)) { - break; + continue; } glm::vec3 bullet_dir = target.Get()->GetPos().ToGlmVec3() - center; @@ -3752,7 +3758,7 @@ void Room::MobaBatterysUpdate() #ifdef MYDEBUG abort(); #endif - return; + continue; } glm::vec3 bullet_born_pos = std::get<0>(tuple); @@ -3765,14 +3771,51 @@ void Room::MobaBatterysUpdate() 1, bullet_born_pos, bullet_dir, - 0, //last_distance, + last_distance, 0, 0, nullptr, shot_uniid, -1); + float fly_time = last_distance / weapon_meta->bullet_speed(); + xtimer.SetTimeoutWpEx + ( + fly_time * SERVER_FRAME_RATE, + [this, target_pos = target.Get()->GetPos().ToGlmVec3(), side, weapon_meta] + (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + TraverseHumanList + ( + [this, side, target_pos, weapon_meta] (Human* hum) -> bool + { + if (hum->side != side && + !hum->dead && + !a8::HasBitFlag(hum->status, CS_Disable) && + !hum->HasBuffEffect(kBET_Hide) && + !hum->HasBuffEffect(kBET_Dive) && + !hum->HasBuffEffect(kBET_Invincible) + ) { + if (hum->GetPos().Distance2D2(target_pos) < weapon_meta->bullet_rad()) { + hum->BeKill( + VP_Explosion, + "", + weapon_meta->id(), + VP_Explosion, + "" + ); + } + } + return true; + }); + } + }, + &xtimer_attacher_); #ifdef MYDEBUG - a8::XPrintf("MobaBatterysUpdate fly_distanc:%f\n", {last_distance}); + a8::XPrintf("MobaBatterysUpdate fly_distance:%f fly_time:%f speed:%f\n", + {last_distance, + fly_time, + weapon_meta->bullet_speed()}); #endif } }