From b3fb8beff52acb292349259b04e2d1abb2e9dd98 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 6 Jun 2019 14:48:33 +0800 Subject: [PATCH] 1 --- server/gameserver/bullet.cc | 24 ++++++++++++++++++++++++ server/gameserver/bullet.h | 3 +++ server/gameserver/obstacle.h | 3 +++ 3 files changed, 30 insertions(+) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 84d5376..5eb8a36 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -103,6 +103,15 @@ void Bullet::OnHit(std::set& objects) } obstacle->ClearColliders(); room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop()); + #ifdef RAY_DETECTION + if (!obstacle->observer_set.empty()) { + for (Bullet* bullet : obstacle->observer_set) { + bullet->touch_object = nullptr; + bullet->RayDetection(); + } + obstacle->observer_set.clear(); + } + #endif } obstacle->BroadcastFullState(); } @@ -174,6 +183,7 @@ void Bullet::ProcBomb() } break; } + ClearRayData(); room->RemoveObjectLater(this); } @@ -194,6 +204,7 @@ void Bullet::RayDetectionUpdate() if (IsBomb()) { ProcBomb(); } else { + ClearRayData(); room->RemoveObjectLater(this); } } else { @@ -223,6 +234,7 @@ void Bullet::RayDetectionUpdate() if (!objects.empty()) { OnHit(objects); } + ClearRayData(); room->RemoveObjectLater(this); } } @@ -230,6 +242,16 @@ void Bullet::RayDetectionUpdate() } #endif +void Bullet::ClearRayData() +{ +#ifdef RAY_DETECTION + if (touch_object) { + touch_object->observer_set.erae(this); + touch_object = nullptr; + } +#endif +} + void Bullet::FrameDetectionUpdate() { pos = pos + dir * gun_meta->i->bullet_speed() / (float)SERVER_FRAME_RATE; @@ -238,6 +260,7 @@ void Bullet::FrameDetectionUpdate() if (IsBomb()) { ProcBomb(); } else { + ClearRayData(); room->RemoveObjectLater(this); } } else { @@ -287,6 +310,7 @@ void Bullet::FrameDetectionUpdate() if (!objects.empty()) { OnHit(objects); } + ClearRayData(); room->RemoveObjectLater(this); } } diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 406dabc..3910df8 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -10,6 +10,7 @@ namespace MetaData } class Human; +class Obstacle; class CircleCollider; class Bullet : public Entity { @@ -25,6 +26,7 @@ class Bullet : public Entity #ifdef RAY_DETECTION float target_distance = 0.0f; Vector2D target_point; + Obstacle* touch_object = nullptr; #endif Bullet(); @@ -35,6 +37,7 @@ class Bullet : public Entity #ifdef RAY_DETECTION void RayDetection(); #endif + void ClearRayData(); private: diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 13f4a7b..10123fe 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -36,6 +36,9 @@ class Obstacle : public Entity int door_house_uniid = 0; const metatable::DoorObjJson* door_state0 = nullptr; const metatable::DoorObjJson* door_state1 = nullptr; +#ifdef RAY_DETECTION + std::set observer_set; +#endif Obstacle(); virtual ~Obstacle() override;