diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index ba259f2..e9c290d 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -7,6 +7,7 @@ #include "obstacle.h" #include "player.h" #include "app.h" +#include "movement.h" Bullet::Bullet():Entity() { @@ -16,6 +17,8 @@ Bullet::Bullet():Entity() Bullet::~Bullet() { + delete movement; + movement = nullptr; --App::Instance()->perf.entity_num[ET_Bullet]; } @@ -23,6 +26,8 @@ void Bullet::Initialize() { Entity::Initialize(); RecalcSelfCollider(); + movement = new MovementComponent(); + movement->owner = this; } void Bullet::Update(int delta_time) @@ -194,7 +199,6 @@ bool Bullet::IsBomb() meta->i->_inventory_slot() == 6; } -#ifdef RAY_DETECTION void Bullet::RayDetectionUpdate() { pos = pos + dir * gun_meta->i->bullet_speed() / (float)SERVER_FRAME_RATE; @@ -219,11 +223,12 @@ void Bullet::RayDetectionUpdate() } } }//end for + movement->GetCollisionObjects(objects); float bullet_range = gun_meta->i->range(); if (gun_upgrade_meta && gun_upgrade_meta->attr[EA_ShotRange] > 0) { bullet_range += gun_upgrade_meta->attr[EA_ShotRange]; } - if (!objects.empty() || distance > bullet_range || distance >= target_distance || + if (!objects.empty() || distance > bullet_range || distance >= movement->target_distance || (IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance) ) { if (IsBomb()) { @@ -239,7 +244,6 @@ void Bullet::RayDetectionUpdate() } } } -#endif void Bullet::ClearRayData() { @@ -263,12 +267,8 @@ void Bullet::FrameDetectionUpdate() std::set objects; for (auto& grid : grid_list) { for (Human* hum: grid->human_list) { -#if 0 - if (hum != player && !hum->dead) { -#else if (hum != player && !hum->dead && (hum->team_id == 0 || player->team_id != hum->team_id)) { -#endif if (TestCollision(hum)) { objects.insert(hum); } diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 052635c..05caaa4 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -12,6 +12,7 @@ namespace MetaData class Human; class Obstacle; class CircleCollider; +class MovementComponent; class Bullet : public Entity { public: @@ -23,15 +24,14 @@ class Bullet : public Entity Vector2D born_pos; Vector2D born_dir; float fly_distance = 0.0f; + MovementComponent* movement = nullptr; Bullet(); virtual ~Bullet() override; virtual void Initialize() override; virtual void Update(int delta_time) override; void RecalcSelfCollider(); -#ifdef RAY_DETECTION void RayDetection(); -#endif void ClearRayData(); private: @@ -39,9 +39,7 @@ class Bullet : public Entity void OnHit(std::set& objects); void ProcBomb(); bool IsBomb(); -#ifdef RAY_DETECTION void RayDetectionUpdate(); -#endif void FrameDetectionUpdate(); private: diff --git a/server/gameserver/movement.cc b/server/gameserver/movement.cc index e69de29..eee649d 100644 --- a/server/gameserver/movement.cc +++ b/server/gameserver/movement.cc @@ -0,0 +1,13 @@ +#include "precompile.h" + +#include "movement.h" + +void MovementComponent::GetCollisionObjects(std::set& objects) +{ + +} + +bool MovementComponent::TestCollision() +{ + return false; +} diff --git a/server/gameserver/movement.h b/server/gameserver/movement.h index 71606b7..c5c04d0 100644 --- a/server/gameserver/movement.h +++ b/server/gameserver/movement.h @@ -5,10 +5,10 @@ class MovementComponent { public: Entity* owner = nullptr; -#ifdef RAY_DETECTION float target_distance = 0.0f; Vector2D target_point; std::set detection_objects; -#endif + void GetCollisionObjects(std::set& objects); + bool TestCollision(); }; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 5d76468..4a55c2e 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -604,6 +604,9 @@ void Room::CreateBullet(Human* hum, Weapon* weapon, bullet->Initialize(); AddObjectLater(bullet); grid_service.AddBullet(bullet); +#ifdef RAY_DETECTION + bullet->RayDetection(); +#endif } void Room::RemoveObjectLater(Entity* entity)