From 3129b7ff542000cb0c1cef5ae312684b1f4005ed Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 4 Nov 2021 17:20:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A9=BA=E8=A2=AD=E9=A2=84?= =?UTF-8?q?=E8=AD=A6coredump=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/mapservice.cc | 21 +++++++++++++++++++++ server/gameserver/mapservice.h | 1 + server/gameserver/room.cc | 10 ++++++++++ server/gameserver/room.h | 1 + server/gameserver/roomobstacle.cc | 22 ++++++++++++++-------- 5 files changed, 47 insertions(+), 8 deletions(-) diff --git a/server/gameserver/mapservice.cc b/server/gameserver/mapservice.cc index dc735a9..7caf4a7 100644 --- a/server/gameserver/mapservice.cc +++ b/server/gameserver/mapservice.cc @@ -69,6 +69,27 @@ void MapService::UnInit() } +bool MapService::CanAdd(const a8::Vec2& pos, int rad) +{ + //上 + if (pos.y + rad + 10 > map_height_) { + return false; + } + //下 + if (rad + 10 > pos.y) { + return false; + } + //左 + if (rad + 10 > pos.x) { + return false; + } + //右 + if (pos.x + rad + 10 > map_width_) { + return false; + } + return true; +} + void MapService::AddCollider(ColliderComponent* collider) { if (!(collider->owner->IsEntityType(ET_Obstacle) || diff --git a/server/gameserver/mapservice.h b/server/gameserver/mapservice.h index 9f20a9e..0729510 100644 --- a/server/gameserver/mapservice.h +++ b/server/gameserver/mapservice.h @@ -38,6 +38,7 @@ class MapService void UnInit(); void AddCollider(ColliderComponent* collider); + bool CanAdd(const a8::Vec2& pos, int rad); void RemoveCollider(ColliderComponent* collider); void GetColliders(Room* room, float world_x, diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 1e6c795..2eaf670 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -4010,3 +4010,13 @@ void Room::AddTeam(class MatchTeam* team) } NotifyUiUpdate(); } + +bool Room::CanAddObstacle(const a8::Vec2& pos, int obstacle_id) +{ + MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(obstacle_id); + if (!thing_meta) { + return false; + } + int rad = std::max(thing_meta->i->width(), thing_meta->i->height()); + return map_service->CanAdd(pos, rad); +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 34365cc..f9ab9a6 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -227,6 +227,7 @@ public: void SetInfiniteBulletMode(); bool IsInfiniteBulletMode() { return infinite_bullet_mode_; }; void AddToPostBattleAutoFreeList(xtimer_list* timer); + bool CanAddObstacle(const a8::Vec2& pos, int obstacle_id); private: void ShuaAndroid(); diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index cc0ac0b..17a3dcf 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -720,14 +720,20 @@ void RoomObstacle::InstallPreExplostionSummonTimer() [] (const a8::XParams& param) { RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); - RoomObstacle* p = obstacle->room->CreateObstacle - ( - param.param1, - obstacle->GetPos().x + param.param2.GetDouble(), - obstacle->GetPos().y + param.param3.GetDouble() - ); - if (p) { - p->Active(); + a8::Vec2 pos = a8::Vec2( + obstacle->GetPos().x + param.param2.GetDouble(), + obstacle->GetPos().y + param.param3.GetDouble() + ); + if (obstacle->room->CanAddObstacle(pos, param.param1)) { + RoomObstacle* p = obstacle->room->CreateObstacle + ( + param.param1, + pos.x, + pos.y + ); + if (p) { + p->Active(); + } } }, &xtimer_attacher.timer_list_