diff --git a/server/gameserver/building.cc b/server/gameserver/building.cc index 7397a26..3c48362 100644 --- a/server/gameserver/building.cc +++ b/server/gameserver/building.cc @@ -38,7 +38,7 @@ void Building::RecalcSelfCollider() obj.y() - obj.height()/2.0 - meta->i->tileheight()/2.0); collider->_max = a8::Vec2(obj.x() + obj.width()/2.0 - meta->i->tilewidth()/2.0, obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0); - AddCollider(collider); + AddEntityCollider(collider); collider_list.push_back(collider); permanent_map_service->AddCollider(collider); } diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 2db0cfa..0ece412 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -35,7 +35,7 @@ void Bullet::RecalcSelfCollider() if (!self_collider_) { self_collider_ = new CircleCollider(); self_collider_->owner = this; - AddCollider(self_collider_); + AddEntityCollider(self_collider_); } self_collider_->pos = a8::Vec2(); self_collider_->rad = gun_meta->i->bullet_rad(); @@ -228,7 +228,7 @@ void Bullet::MapServiceUpdate() #if 1 { std::set colliders; - room->map_service.GetColliders(GetX(), GetY(), colliders); + room->map_service->GetColliders(room, GetX(), GetY(), colliders); for (ColliderComponent* collider : colliders) { if (TestCollision(room, collider)) { objects.insert(collider->owner); diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index a627f95..1063901 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -229,6 +229,8 @@ enum EntitySubType_e EST_None = 0, EST_Player = 1, EST_Android = 2, + EST_PermanentObstacle = 3, + EST_RoomObstacle = 4 }; enum PropertyType_e @@ -298,3 +300,5 @@ const int DEFAULT_BORN_POINT_Y = 3000; const int ADPLAY_BUFFID = 1006; const int FIXED_OBJECT_MAXID = 2048; + +const int MAX_ROOM_IDX = 2048; diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc index 184f78b..f193a14 100644 --- a/server/gameserver/entity.cc +++ b/server/gameserver/entity.cc @@ -112,7 +112,7 @@ void Entity::BroadcastDeleteState(Room* room) } } -void Entity::AddCollider(ColliderComponent* collider) +void Entity::AddEntityCollider(ColliderComponent* collider) { colliders.push_back(collider); } diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index 1a05728..0721838 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -44,7 +44,7 @@ class Entity bool TestCollisionEx(Room* room, const a8::Vec2& aabb_pos, AabbCollider& aabb_box); void BroadcastFullState(Room* room); void BroadcastDeleteState(Room* room); - void AddCollider(ColliderComponent* collider); + void AddEntityCollider(ColliderComponent* collider); a8::Vec2 GetPos() { return pos_; }; bool IsPermanent(); void SetPos(a8::Vec2 pos) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 14035e5..13af9f0 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -422,7 +422,7 @@ void Human::RecalcSelfCollider() if (!self_collider_) { self_collider_ = new CircleCollider(); self_collider_->owner = this; - AddCollider(self_collider_); + AddEntityCollider(self_collider_); } self_collider_->pos = a8::Vec2(); if (skin_tank_meta) { @@ -440,7 +440,7 @@ bool Human::IsCollisionInMapService() } std::set colliders; - room->map_service.GetColliders(GetX(), GetY(), colliders); + room->map_service->GetColliders(room, GetX(), GetY(), colliders); AabbCollider aabb_box; GetAabbBox(aabb_box); @@ -1322,7 +1322,6 @@ bool Human::CanSee(const Human* hum) const return room->grid_service.InView(grid_id, hum->grid_id); } - void Human::RecalcVolume() { MetaData::Equip* backpack_meta = MetaMgr::Instance()->GetEquip(backpack); @@ -2381,7 +2380,7 @@ void Human::FindLocationWithTarget(Entity* target) if (!building) { bool is_collision = false; std::set colliders; - room->map_service.GetColliders(GetX(), GetY(), colliders); + room->map_service->GetColliders(room, GetX(), GetY(), colliders); for (ColliderComponent* collider : colliders) { if (TestCollision(room, collider)) { is_collision = true; diff --git a/server/gameserver/mapservice.cc b/server/gameserver/mapservice.cc index 3ba63a7..34752eb 100644 --- a/server/gameserver/mapservice.cc +++ b/server/gameserver/mapservice.cc @@ -6,6 +6,7 @@ #include "mapservice.h" #include "collider.h" #include "entity.h" +#include "roomobstacle.h" MapService::MapService() { @@ -65,6 +66,10 @@ void MapService::UnInit() void MapService::AddCollider(ColliderComponent* collider) { + if (!(collider->owner->entity_type == ET_Obstacle || + collider->owner->entity_type == ET_Building)) { + abort(); + } CellNode* top_node = nullptr; CellNode* bot_node = nullptr; switch (collider->type) { @@ -161,7 +166,10 @@ void MapService::RemoveCollider(ColliderComponent* collider) } } -void MapService::GetColliders(float world_x, float world_y, std::set& colliders) +void MapService::GetColliders(Room* room, + float world_x, + float world_y, + std::set& colliders) { int center_grid_id = GetGridId(world_x, world_y); if (center_grid_id < 0 || center_grid_id >= max_grid_id_) { @@ -176,7 +184,42 @@ void MapService::GetColliders(float world_x, float world_y, std::setcollider); + switch (node->collider->owner->entity_type) { + case ET_Obstacle: + { + switch (node->collider->owner->entity_subtype) { + case EST_PermanentObstacle: + { + colliders.insert(node->collider); + } + break; + case EST_RoomObstacle: + { + RoomObstacle* obstacle = (RoomObstacle*)node->collider->owner; + if (obstacle->room == room) { + colliders.insert(node->collider); + } + } + break; + default: + { + abort(); + } + break; + } + } + break; + case ET_Building: + { + colliders.insert(node->collider); + } + break; + default: + { + abort(); + } + break; + } } } } diff --git a/server/gameserver/mapservice.h b/server/gameserver/mapservice.h index 6cf8cd8..a8b1297 100644 --- a/server/gameserver/mapservice.h +++ b/server/gameserver/mapservice.h @@ -9,6 +9,7 @@ struct CellNode CellNode* next = nullptr; }; +class Room; class MapService { public: @@ -20,7 +21,10 @@ class MapService void AddCollider(ColliderComponent* collider); void RemoveCollider(ColliderComponent* collider); - void GetColliders(float world_x, float world_y, std::set& colliders); + void GetColliders(Room* room, + float world_x, + float world_y, + std::set& colliders); private: int GetGridId(float world_x, float world_y); diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 526c3c2..a55ade0 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -18,6 +18,7 @@ enum ObstacleDataFlags_e Obstacle::Obstacle():Entity() { entity_type = ET_Obstacle; + entity_subtype = EST_PermanentObstacle; ++App::Instance()->perf.entity_num[ET_Obstacle]; } @@ -40,7 +41,7 @@ void Obstacle::RecalcSelfCollider() if (!self_collider2_) { self_collider2_ = new AabbCollider(); self_collider2_->owner = this; - AddCollider(self_collider2_); + AddEntityCollider(self_collider2_); a8::Vec2 old_pos = GetPos(); { SetPos(a8::Vec2(building_->GetX() + door_state1_->x() - building_->meta->i->tilewidth() / 2.0, @@ -69,7 +70,7 @@ void Obstacle::RecalcSelfCollider() if (!self_collider_) { self_collider_ = new CircleCollider(); self_collider_->owner = this; - AddCollider(self_collider_); + AddEntityCollider(self_collider_); } self_collider_->pos = a8::Vec2(); self_collider_->rad = meta->i->height() / 2.0; @@ -81,7 +82,7 @@ void Obstacle::RecalcSelfCollider() if (!self_collider2_) { self_collider2_ = new AabbCollider(); self_collider2_->owner = this; - AddCollider(self_collider2_); + AddEntityCollider(self_collider2_); } self_collider2_->_min = a8::Vec2(meta->i->width() / -2.0f, meta->i->height() / -2.0f); self_collider2_->_max = a8::Vec2(meta->i->width() / 2.0f, meta->i->height() / 2.0f); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 6e97b4e..86530d4 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -80,7 +80,6 @@ void Room::UnInit() } removed_robot_hash_.clear(); grid_service.UnInit(); - map_service.UnInit(); } void Room::Update(int delta_time) @@ -668,7 +667,7 @@ void Room::FindLocationWithAabb(Entity* target, const a8::Vec2& aabb_pos, AabbCo bool is_collision = false; std::set colliders; - map_service.GetColliders(pos.x, pos.y, colliders); + map_service->GetColliders(this, pos.x, pos.y, colliders); for (ColliderComponent* collider : colliders) { if (collider->IntersectEx(pos, aabb_box)) { is_collision = true; diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 719474c..f817275 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -38,6 +38,7 @@ class AabbCollider; class Room { public: + int room_idx = 0; long long room_uuid = 0; MetaData::Map* map_meta = nullptr; std::string map_tpl_name; @@ -51,7 +52,7 @@ public: timer_list* game_over_timer = nullptr; a8::XTimer xtimer; GridService grid_service; - MapService map_service; + MapService* map_service = nullptr; long long battle_start_frameno_ = 0; long long pending_request = 0; long long last_debugout_tick = 0; diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index e4d916e..1ff594d 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -134,6 +134,7 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) if (!room) { room = new Room(); room->room_type = self_room_type; + room->map_service = map_service_; room->room_uuid = App::Instance()->NewUuid(); room->spawn_points = &spawn_points_; room->loots = &loots_; @@ -474,9 +475,6 @@ Obstacle* RoomMgr::InternalCreateObstacle(int id, float x, float y, MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(id); if (thing) { Obstacle* entity = new Obstacle(); - #if 0 - entity->room = this; - #endif entity->meta = thing; entity->is_permanent = true; entity->permanent_map_service = map_service_; diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index b54c630..d504010 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -13,7 +13,7 @@ RoomObstacle::RoomObstacle():Obstacle() { - + entity_subtype = EST_RoomObstacle; } RoomObstacle::~RoomObstacle() @@ -36,11 +36,11 @@ void RoomObstacle::RecalcSelfCollider() if (!self_collider_) { self_collider_ = new CircleCollider(); self_collider_->owner = this; - AddCollider(self_collider_); + AddEntityCollider(self_collider_); } self_collider_->pos = a8::Vec2(); self_collider_->rad = meta->i->height() / 2.0; - permanent_map_service->AddCollider(self_collider_); + room->map_service->AddCollider(self_collider_); } break; case 2: @@ -48,11 +48,11 @@ void RoomObstacle::RecalcSelfCollider() if (!self_collider2_) { self_collider2_ = new AabbCollider(); self_collider2_->owner = this; - AddCollider(self_collider2_); + AddEntityCollider(self_collider2_); } self_collider2_->_min = a8::Vec2(meta->i->width() / -2.0f, meta->i->height() / -2.0f); self_collider2_->_max = a8::Vec2(meta->i->width() / 2.0f, meta->i->height() / 2.0f); - permanent_map_service->AddCollider(self_collider2_); + room->map_service->AddCollider(self_collider2_); } break; }