diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 8284500..1abce4e 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -8,6 +8,7 @@ #include "collider.h" #include "loot.h" #include "collision.h" +#include "building.h" Human::Human() { @@ -642,18 +643,20 @@ void Human::FindLocation() { { std::vector objects; - int detection_flags = 0; - { - a8::SetBitFlag(detection_flags, ET_Building); - } - room->CollisionDetection(this, detection_flags, objects); + room->BuildingBoxBoundCollisionDetection(this, objects); if (objects.size() > 1) { abort(); } if (!objects.empty()) { Building* building = (Building*)objects[0]; - Vector2D a_min; - Vector2D a_max; + 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 + ); Vector2D new_pos; bool ret = CalcCircleAabbSafePoint( a_min, @@ -665,6 +668,9 @@ void Human::FindLocation() if (!ret) { abort(); } + if (ret) { + pos = new_pos; + } } } } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 891c2ce..6d06fd4 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -400,6 +400,31 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vector& objects) +{ + 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() + )) { + objects.push_back(pair.second); + } + } + } +} + void Room::AddDeletedObject(unsigned short obj_uniid, bool soft_delete) { std::set* deleted_objects = nullptr; @@ -781,6 +806,7 @@ void Room::UpdateGas() gas_data.gas_start_frameno = frame_no; ShuaPlane(); RoomMgr::Instance()->RemoveFromInactiveRoomHash(room_uuid); + #if 1 xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * 3, a8::XParams() .SetSender(this), @@ -800,6 +826,7 @@ void Room::UpdateGas() }); }, &xtimer_attacher.timer_list_); + #endif } } break; diff --git a/server/gameserver/room.h b/server/gameserver/room.h index d9288e1..351884e 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -53,6 +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 AddDeletedObject(unsigned short obj_uniid, bool soft_delete); void BeAddedObject(Entity* entity);