diff --git a/server/gameserver/building.cc b/server/gameserver/building.cc index 0871a7c..13c3679 100644 --- a/server/gameserver/building.cc +++ b/server/gameserver/building.cc @@ -33,7 +33,7 @@ void Building::RecalcSelfCollider() obj.y() - obj.height()/2.0 - meta->i->tileheight()/2.0); collider->_max = Vector2D(obj.x() + obj.width()/2.0 - meta->i->tilewidth()/2.0, obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0); - colliders.push_back(collider); + AddCollider(collider); } } diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 3d07681..7ed127b 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -93,7 +93,7 @@ void Bullet::RecalcSelfCollider() if (!self_collider_) { self_collider_ = new CircleCollider(); self_collider_->owner = this; - colliders.push_back(self_collider_); + AddCollider(self_collider_); } self_collider_->pos = Vector2D(); self_collider_->rad = gun_meta->i->bullet_rad(); @@ -148,7 +148,6 @@ void Bullet::OnHit(std::set& objects) obstacle->meta->i->damage() > 0.01f) { obstacle->Explosion(this); } - obstacle->ClearColliders(); room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop()); } obstacle->BroadcastFullState(); diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index e50233d..354b083 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -31,6 +31,9 @@ ColliderComponent* Entity::GetBoxBound() bool Entity::TestCollision(Entity* b) { + if (b->dead) { + return false; + } for (auto& a_collider : colliders) { for (auto& b_collider : b->colliders) { if (a_collider->Intersect(b_collider)) { @@ -141,3 +144,8 @@ void Entity::BroadcastDeleteState() } } } + +void Entity::AddCollider(ColliderComponent* collider) +{ + colliders.push_back(collider); +} diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index 63c671b..30a405a 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -48,9 +48,10 @@ class Entity Room* room = nullptr; Vector2D pos; int updated_times = 0; - std::list colliders; bool deleted = false; a8::XTimerAttacher xtimer_attacher; + bool dead = false; + long long dead_frameno = 0; int grid_id = 0; std::set grid_list; @@ -65,9 +66,13 @@ class Entity virtual float GetSpeed() { return 1.0f;}; virtual ColliderComponent* GetBoxBound(); bool TestCollision(Entity* b); - void ClearColliders(); void FindLocationWithTarget(Entity* target); void BroadcastFullState(); void BroadcastDeleteState(); + void AddCollider(ColliderComponent* collider); +private: + std::list colliders; + + void ClearColliders(); }; diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index eca2f77..ec1a32f 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -25,7 +25,7 @@ void Hero::RecalcSelfCollider() if (!self_collider_) { self_collider_ = new CircleCollider(); self_collider_->owner = this; - colliders.push_back(self_collider_); + AddCollider(self_collider_); } self_collider_->pos = Vector2D(); self_collider_->rad = master->GetRadius(); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index c0223fb..4636075 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -274,7 +274,7 @@ void Human::RecalcSelfCollider() if (!self_collider_) { self_collider_ = new CircleCollider(); self_collider_->owner = this; - colliders.push_back(self_collider_); + AddCollider(self_collider_); } self_collider_->pos = Vector2D(); self_collider_->rad = meta->i->radius(); diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 0103c8a..be5918d 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -33,7 +33,7 @@ void Obstacle::RecalcSelfCollider() if (!self_collider2_) { self_collider2_ = new AabbCollider(); self_collider2_->owner = this; - colliders.push_back(self_collider2_); + AddCollider(self_collider2_); } if (door_state == DoorStateClose) { self_collider2_->_min = Vector2D(0.0f - door_state0->width() / 2.0f, @@ -51,7 +51,7 @@ void Obstacle::RecalcSelfCollider() if (!self_collider_) { self_collider_ = new CircleCollider(); self_collider_->owner = this; - colliders.push_back(self_collider_); + AddCollider(self_collider_); } self_collider_->pos = Vector2D(); self_collider_->rad = meta->i->height() / 2.0; @@ -62,7 +62,7 @@ void Obstacle::RecalcSelfCollider() if (!self_collider2_) { self_collider2_ = new AabbCollider(); self_collider2_->owner = this; - colliders.push_back(self_collider2_); + AddCollider(self_collider2_); } self_collider2_->_min = Vector2D(meta->i->width() / -2.0f, meta->i->height() / -2.0f); self_collider2_->_max = Vector2D(meta->i->width() / 2.0f, meta->i->height() / 2.0f); @@ -192,7 +192,6 @@ void Obstacle::Explosion(Bullet* bullet) obstacle->dead = obstacle->health <= 0.01f; obstacle->dead_frameno = room->frame_no; if (obstacle->dead) { - obstacle->ClearColliders(); room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop()); } obstacle->BroadcastFullState(); diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 13f4a7b..ee09a64 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -25,8 +25,6 @@ class Obstacle : public Entity public: MetaData::MapThing* meta = nullptr; float health = 0.0f; - bool dead = false; - long long dead_frameno = 0; bool is_door = false; int door_id = 0;