diff --git a/server/gameserver/building.cc b/server/gameserver/building.cc index 5876de0..00b7b16 100644 --- a/server/gameserver/building.cc +++ b/server/gameserver/building.cc @@ -66,3 +66,19 @@ void Building::FillMFObjectFull(cs::MFObjectFull* full_data) p->set_building_id(meta->i->_building_id()); } + +ColliderComponent* Building::GetBoxBound() +{ + AabbCollider* collider = new AabbCollider(); + collider->active = true; + collider->owner = this; + collider->_min = Vector2D( + pos.x - meta->i->tilewidth()/2.0, + pos.y - meta->i->tileheight()/2.0 + ); + collider->_max = Vector2D( + pos.x + meta->i->tilewidth()/2.0, + pos.y + meta->i->tileheight()/2.0 + ); + return collider; +} diff --git a/server/gameserver/building.h b/server/gameserver/building.h index 1d046fa..ea976d0 100644 --- a/server/gameserver/building.h +++ b/server/gameserver/building.h @@ -24,5 +24,5 @@ class Building : public Entity void RecalcSelfCollider(); virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override; - + virtual ColliderComponent* GetBoxBound() override; }; diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index 0d1c89a..3229dac 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -54,31 +54,6 @@ void Entity::FindLocationWithTarget(Entity* target) ColliderComponent* a_collider = GetBoxBound(); Vector2D old_pos = pos; Vector2D new_pos = pos; - #if 0 - { - std::vector objects; - room->BuildingBoxBoundCollisionDetection(this, objects); - if (objects.size() > 1) { - abort(); - } - if (!objects.empty()) { - Building* building = (Building*)objects[0]; - ColliderComponent* building_collider = building->GetBoxBound(); - bool ret = a_collider->CalcSafePoint(building_collider, new_pos); - if (!ret) { - abort(); - } - if (ret) { - pos = new_pos; - DestoryCollider(a_collider); - DestoryCollider(building_collider); - return; - } else { - DestoryCollider(building_collider); - } - } - } - #endif ColliderComponent* target_collider = target->GetBoxBound(); { bool ret = a_collider->CalcSafePoint(target_collider, new_pos); diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index 73fad18..f5be628 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -12,11 +12,11 @@ enum EntityType_e ET_Player = 1, ET_Obstacle = 2, ET_Building = 3, - ET_LootSpawner = 4, + //ET_LootSpawner = 4, ET_Loot = 5, - ET_DeadBody = 6, - ET_Decal = 7, - ET_Projectile = 8, + //ET_DeadBody = 6, + //ET_Decal = 7, + //ET_Projectile = 8, ET_Smoke = 9, ET_Bullet = 20, diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 957e30b..e118af0 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -110,6 +110,15 @@ void Human::FillMFObjectFull(cs::MFObjectFull* full_data) } } +ColliderComponent* Human::GetBoxBound() +{ + CircleCollider* collider = new CircleCollider(); + collider->owner = this; + collider->pos = pos; + collider->rad = GetRadius(); + return collider; +} + void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb) { stats_pb->set_player_id(entity_uniid); diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 2e5a55d..c6b9df4 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -91,6 +91,7 @@ class Human : public Entity virtual float GetSpeed() override; virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override; + virtual ColliderComponent* GetBoxBound() override; virtual void FillMFPlayerStats(cs::MFPlayerStats* stats); void FillMFTeamData(cs::MFTeamData* team_data); void Shot(Vector2D& target_dir); diff --git a/server/gameserver/loot.h b/server/gameserver/loot.h index 00f2ae3..66e8a93 100644 --- a/server/gameserver/loot.h +++ b/server/gameserver/loot.h @@ -24,5 +24,4 @@ class Loot : public Entity void RecalcSelfCollider(); virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override; - }; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index c9f6ebf..9f81a4f 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -106,3 +106,18 @@ void Obstacle::FillMFObjectFull(cs::MFObjectFull* full_data) } } } + +ColliderComponent* Obstacle::GetBoxBound() +{ + if (self_collider_) { + CircleCollider* collider = new CircleCollider(); + *collider = *self_collider_; + return collider; + } + if (self_collider2_) { + AabbCollider* collider = new AabbCollider(); + *collider = *self_collider2_; + return collider; + } + return nullptr; +} diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 1b07e73..5b0e35b 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -41,7 +41,7 @@ class Obstacle : public Entity void RecalcSelfCollider(); virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override; - + virtual ColliderComponent* GetBoxBound() override; private: CircleCollider* self_collider_ = nullptr; AabbCollider* self_collider2_ = nullptr; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index e199fb9..01164dd 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -365,6 +365,9 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vectorentity_type == ET_Player) { if (sender->entity_type == ET_Bullet) { Bullet* bullet = (Bullet*)sender; @@ -400,29 +403,19 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vector& objects) +void Room::BuildingBoxBoundCollisionDetection(Entity* sender, std::vector& objects) { + ColliderComponent* a_collider = sender->GetBoxBound(); for (auto& pair : uniid_hash_) { if (pair.second->entity_type == ET_Building) { - Building* building = (Building*)pair.second; - Vector2D a_min = Vector2D( - building->pos.x - building->meta->i->tilewidth()/2.0, - building->pos.y - building->meta->i->tileheight()/2.0 - ); - Vector2D a_max = Vector2D( - building->pos.x + building->meta->i->tilewidth()/2.0, - building->pos.y + building->meta->i->tileheight()/2.0 - ); - if (IntersectAabbCircle( - a_min, - a_max, - hum->pos, - hum->GetRadius() - )) { + ColliderComponent* target_collider = pair.second->GetBoxBound(); + if (a_collider->Intersect(target_collider)) { objects.push_back(pair.second); } + DestoryCollider(target_collider); } } + DestoryCollider(a_collider); } void Room::AddDeletedObject(unsigned short obj_uniid, bool soft_delete) diff --git a/server/gameserver/room.h b/server/gameserver/room.h index adb1176..c2c3747 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -53,7 +53,7 @@ public: Human* FindEnemy(Human* hum); void CollisionDetection(Entity* sender, int detection_flags, std::vector& objects); - void BuildingBoxBoundCollisionDetection(Human* hum, std::vector& objects); + void BuildingBoxBoundCollisionDetection(Entity* sender, std::vector& objects); void AddDeletedObject(unsigned short obj_uniid, bool soft_delete); void BeAddedObject(Entity* entity);