From e3f8fb5adff7e3389d7452185e75032caf582248 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 6 Mar 2021 20:09:46 +0800 Subject: [PATCH 01/14] add GetSpecColliders --- server/gameserver/mapservice.cc | 27 +++++++++++++++++++++++++++ server/gameserver/mapservice.h | 5 +++++ 2 files changed, 32 insertions(+) diff --git a/server/gameserver/mapservice.cc b/server/gameserver/mapservice.cc index 7b7f5cf..7da2f31 100644 --- a/server/gameserver/mapservice.cc +++ b/server/gameserver/mapservice.cc @@ -225,6 +225,33 @@ void MapService::GetColliders(Room* room, } } +void MapService::GetSpecColliders(long long flags, + 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_) { + return; + } + for (int i = 0; i < a8::ArraySize(grid_offset_arr_); ++i) { + int grid_id = center_grid_id + grid_offset_arr_[i]; + if (grid_id >= 0 && grid_id < max_grid_id_) { + list_head* head = &map_cells_[grid_id]; + if (list_empty(head)) { + continue; + } + struct CellNode *node, *tmp; + list_for_each_entry_safe(node, tmp, head, entry) { + if (a8::HasBitFlag(flags, node->collider->tag)) { + colliders.insert(node->collider); + } + } + } + } +} + int MapService::GetGridId(float world_x, float world_y) { int grid_id = (int)(world_x/cell_width_) + (int)(world_y/cell_width_) * map_width_; diff --git a/server/gameserver/mapservice.h b/server/gameserver/mapservice.h index c30ce69..f7d81bf 100644 --- a/server/gameserver/mapservice.h +++ b/server/gameserver/mapservice.h @@ -43,6 +43,11 @@ class MapService float world_x, float world_y, std::set& colliders); + void GetSpecColliders(long long flags, + Room* room, + float world_x, + float world_y, + std::set& colliders); int FindPathRequest(Human* hum, const a8::Vec2& start_pos, const a8::Vec2& end_pos, From a23de49951405beaecbdf2da4016d7aed9632533 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 6 Mar 2021 20:55:16 +0800 Subject: [PATCH 02/14] add GetSpecColliders --- server/gameserver/constant.h | 5 ++++- server/gameserver/human.cc | 6 ++++++ server/gameserver/human.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 7d1841d..bac9e77 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -332,7 +332,10 @@ enum AIMode_e enum ColliderTag_e { - kHalfWallTag = 1 + kHalfWallTag = 1, + kColliderTag_Grass = 2, //草丛 + kColliderTag_Water = 3, //水 + kColliderTag_Ice = 4, //冰 }; enum GameChannel_e diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 740a4f5..3881b96 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2184,6 +2184,7 @@ void Human::_InternalUpdateMove(float speed) SetPos(old_pos + a8::Vec2(nx, ny)); room->grid_service->MoveHuman(this); + CheckSpecObject(); } void Human::ClearFrameData() @@ -4280,3 +4281,8 @@ void Human::DoGetOnWithCar(Car* car) { car->GetOn(this); } + +void Human::CheckSpecObject() +{ + +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 91428f7..a693c86 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -355,6 +355,7 @@ private: void NextReload(int prev_weapon_id, int prev_weapon_idx); void DoGetOnWithLoot(Loot* loot_entity); void DoGetOnWithCar(Car* car); + void CheckSpecObject(); protected: int level_ = 0; From 21a5be0d4f7da690c98f91c7ec4fa916e3c7d064 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 6 Mar 2021 21:27:18 +0800 Subject: [PATCH 03/14] 1 --- server/gameserver/human.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 3881b96..f8aed6f 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4284,5 +4284,19 @@ void Human::DoGetOnWithCar(Car* car) void Human::CheckSpecObject() { + long long spec_flags = 0; + a8::SetBitFlag(spec_flags, kColliderTag_Grass); + a8::SetBitFlag(spec_flags, kColliderTag_Water); + a8::SetBitFlag(spec_flags, kColliderTag_Ice); + std::set colliders; + room->map_service->GetSpecColliders(spec_flags, room, GetPos().x, GetPos().y, colliders); + for (const ColliderComponent* collider : colliders) { + switch (collider->owner->GetEntityType()) { + case ET_Loot: + break; + default: + break; + } + } } From 8ce7854986ac26ed5a68fe199fbb9060fe7c7423 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 8 Mar 2021 10:36:39 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E6=B7=BB=E5=8A=A0grass=20water=20ice?= =?UTF-8?q?=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 64 +++++++++++++++++++++++++++++++++++++- server/gameserver/human.h | 6 ++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index f8aed6f..86e5f87 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4291,12 +4291,74 @@ void Human::CheckSpecObject() std::set colliders; room->map_service->GetSpecColliders(spec_flags, room, GetPos().x, GetPos().y, colliders); + bool in_grass = false; + bool in_water = false; + bool in_ice = false; for (const ColliderComponent* collider : colliders) { switch (collider->owner->GetEntityType()) { - case ET_Loot: + case ET_Obstacle: + case ET_Building: break; default: break; } } + + if (in_grass) { + if (!HasBuffEffect(kBET_InGrass)) { + OnEnterGrass(); + } + } else { + if (HasBuffEffect(kBET_InGrass)) { + OnLeaveGrass(); + } + } + if (in_water) { + if (!HasBuffEffect(kBET_InWater)) { + OnEnterWater(); + } + } else { + if (HasBuffEffect(kBET_InWater)) { + OnLeaveWater(); + } + } + if (in_ice) { + if (!HasBuffEffect(kBET_InIce)) { + OnEnterIce(); + } + } else { + if (HasBuffEffect(kBET_InIce)) { + OnLeaveIce(); + } + } +} + +void Human::OnEnterGrass() +{ + +} + +void Human::OnLeaveGrass() +{ + +} + +void Human::OnEnterWater() +{ + +} + +void Human::OnLeaveWater() +{ + +} + +void Human::OnEnterIce() +{ + +} + +void Human::OnLeaveIce() +{ + } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index a693c86..e6452b3 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -356,6 +356,12 @@ private: void DoGetOnWithLoot(Loot* loot_entity); void DoGetOnWithCar(Car* car); void CheckSpecObject(); + void OnEnterGrass(); + void OnLeaveGrass(); + void OnEnterWater(); + void OnLeaveWater(); + void OnEnterIce(); + void OnLeaveIce(); protected: int level_ = 0; From 3fe0802f454e459aa33894dbb3cbb880e599c995 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 8 Mar 2021 13:10:08 +0800 Subject: [PATCH 05/14] 1 --- server/gameserver/android.ai.cc | 3 + server/gameserver/constant.h | 4 + server/gameserver/human.cc | 151 ++++++++++++++++++++++++++++++-- server/gameserver/human.h | 7 ++ server/gameserver/metamgr.h | 10 +++ 5 files changed, 169 insertions(+), 6 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index ce6a220..9fcf947 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -706,6 +706,9 @@ Human* AndroidNewAI::GetTarget() if (a8::HasBitFlag(hum->status, HS_Disable)) { return; } + if (hum->HasBuffEffect(kBET_InGrass)) { + return; + } if (myself->team_id == hum->team_id) { return; } diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index bac9e77..d7f9fd8 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -405,3 +405,7 @@ const int HUNLUAN_BUFFID = 6001; const int DRIVER_BUFFID = 6003; const int PASSENGER_BUFFID = 6004; + +const int GRASS_HIDE_BUFF_ID = 6005; +const int WATER_BUFF_ID = 6006; +const int ICE_BUFF_ID = 6007; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 86e5f87..9e97c9c 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4335,30 +4335,169 @@ void Human::CheckSpecObject() void Human::OnEnterGrass() { - + if (leave_grass_timer_) { + room->xtimer.DeleteTimer(leave_grass_timer_); + leave_grass_timer_ = nullptr; + } + if (hide_grass_timer_) { + room->xtimer.DeleteTimer(hide_grass_timer_); + hide_grass_timer_ = nullptr; + } + hide_grass_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->grass_invisible_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(GRASS_HIDE_BUFF_ID); + if (buff_meta) { + hum->AddBuff(hum, buff_meta, 1); + } + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->hide_grass_timer_ = nullptr; + }); } void Human::OnLeaveGrass() { - + if (hide_grass_timer_) { + room->xtimer.DeleteTimer(hide_grass_timer_); + hide_grass_timer_ = nullptr; + } + if (leave_grass_timer_) { + room->xtimer.DeleteTimer(leave_grass_timer_); + } + leave_grass_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->grass_show_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->leave_grass_timer_ = nullptr; + hum->RemoveBuffById(GRASS_HIDE_BUFF_ID); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->leave_grass_timer_ = nullptr; + }); } void Human::OnEnterWater() { - + if (leave_water_timer_) { + room->xtimer.DeleteTimer(leave_water_timer_); + leave_water_timer_ = nullptr; + } + if (hide_water_timer_) { + room->xtimer.DeleteTimer(hide_water_timer_); + hide_water_timer_ = nullptr; + } + hide_water_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->water_invisible_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(WATER_BUFF_ID); + if (buff_meta) { + hum->AddBuff(hum, buff_meta, 1); + } + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->hide_water_timer_ = nullptr; + }); } void Human::OnLeaveWater() { - + if (hide_water_timer_) { + room->xtimer.DeleteTimer(hide_water_timer_); + hide_water_timer_ = nullptr; + } + if (leave_water_timer_) { + room->xtimer.DeleteTimer(leave_water_timer_); + } + leave_water_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->water_show_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->RemoveBuffById(WATER_BUFF_ID); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->leave_water_timer_ = nullptr; + }); } void Human::OnEnterIce() { - + if (leave_ice_timer_) { + room->xtimer.DeleteTimer(leave_ice_timer_); + leave_ice_timer_ = nullptr; + } + if (hide_ice_timer_) { + room->xtimer.DeleteTimer(hide_ice_timer_); + hide_ice_timer_ = nullptr; + } + hide_ice_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->ice_invisible_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(ICE_BUFF_ID); + if (buff_meta) { + hum->AddBuff(hum, buff_meta, 1); + } + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->hide_ice_timer_ = nullptr; + }); } void Human::OnLeaveIce() { - + if (hide_ice_timer_) { + room->xtimer.DeleteTimer(hide_ice_timer_); + hide_ice_timer_ = nullptr; + } + if (leave_ice_timer_) { + room->xtimer.DeleteTimer(leave_ice_timer_); + } + leave_ice_timer_ = room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->ice_show_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->RemoveBuffById(ICE_BUFF_ID); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->leave_ice_timer_ = nullptr; + }); } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index e6452b3..79c278f 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -436,6 +436,13 @@ private: Entity* last_collision_door_ = nullptr; long long jump_frameno_ = 0; + xtimer_list* leave_grass_timer_ = nullptr; + xtimer_list* hide_grass_timer_ = nullptr; + xtimer_list* leave_water_timer_ = nullptr; + xtimer_list* hide_water_timer_ = nullptr; + xtimer_list* leave_ice_timer_ = nullptr; + xtimer_list* hide_ice_timer_ = nullptr; + friend class FrameMaker; friend class FrameEvent; }; diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index e3ffdb0..17b7195 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -124,6 +124,16 @@ class MetaMgr : public a8::Singleton int level1room_robot_autodie_distance = 0; std::string level1room_born_point; + float grass_invisible_time = 0.5; + float grass_show_time = 0.5f; + float grass_invisible_time2 = 2.0f; + float water_invisible_time = 0.5; + float water_show_time = 0.5f; + float water_invisible_time2 = 2.0f; + float ice_invisible_time = 0.5; + float ice_show_time = 0.5f; + float ice_invisible_time2 = 2.0f; + #if 0 int refresh_robot_min_num = 0; int refresh_robot_max_num = 0; From ae4a083fe3baa4631edf8ed30012c640bc6164d3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 8 Mar 2021 16:35:41 +0800 Subject: [PATCH 06/14] 1 --- server/gameserver/constant.h | 4 + server/gameserver/human.cc | 205 +++++++---------------------------- server/gameserver/human.h | 23 ++-- third_party/a8engine | 2 +- 4 files changed, 52 insertions(+), 182 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index d7f9fd8..f62d0a1 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -333,9 +333,11 @@ enum AIMode_e enum ColliderTag_e { kHalfWallTag = 1, + kColliderSpecTag_Begin = 2, kColliderTag_Grass = 2, //草丛 kColliderTag_Water = 3, //水 kColliderTag_Ice = 4, //冰 + kColliderSpecTag_End = 4, }; enum GameChannel_e @@ -409,3 +411,5 @@ const int PASSENGER_BUFFID = 6004; const int GRASS_HIDE_BUFF_ID = 6005; const int WATER_BUFF_ID = 6006; const int ICE_BUFF_ID = 6007; + +const long long SPEC_MAP_OBJECT_FLAGS = A8_DEFINE_RANGE_BIT(long long, kColliderSpecTag_Begin, kColliderSpecTag_End); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 9e97c9c..4598b3f 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4284,179 +4284,44 @@ void Human::DoGetOnWithCar(Car* car) void Human::CheckSpecObject() { - long long spec_flags = 0; - a8::SetBitFlag(spec_flags, kColliderTag_Grass); - a8::SetBitFlag(spec_flags, kColliderTag_Water); - a8::SetBitFlag(spec_flags, kColliderTag_Ice); std::set colliders; - room->map_service->GetSpecColliders(spec_flags, room, GetPos().x, GetPos().y, colliders); + room->map_service->GetSpecColliders(SPEC_MAP_OBJECT_FLAGS, room, GetPos().x, GetPos().y, colliders); - bool in_grass = false; - bool in_water = false; - bool in_ice = false; + long long flags = 0; for (const ColliderComponent* collider : colliders) { switch (collider->owner->GetEntityType()) { case ET_Obstacle: case ET_Building: + { + if (TestCollision(room, (ColliderComponent*)collider)) { + flags |= collider->tag; + } + } break; default: break; } } - if (in_grass) { - if (!HasBuffEffect(kBET_InGrass)) { - OnEnterGrass(); - } - } else { - if (HasBuffEffect(kBET_InGrass)) { - OnLeaveGrass(); - } - } - if (in_water) { - if (!HasBuffEffect(kBET_InWater)) { - OnEnterWater(); - } - } else { - if (HasBuffEffect(kBET_InWater)) { - OnLeaveWater(); - } - } - if (in_ice) { - if (!HasBuffEffect(kBET_InIce)) { - OnEnterIce(); - } - } else { - if (HasBuffEffect(kBET_InIce)) { - OnLeaveIce(); + for (int i = kColliderSpecTag_Begin; i <= kColliderSpecTag_End; ++i) { + SpecMapObject& map_obj = spec_map_objects_[i - kColliderSpecTag_Begin]; + int buff_effect = 0; + if (a8::HasBitFlag(flags, i)) { + if (!HasBuffEffect(buff_effect)) { + OnEnterSpecMapArea(i, map_obj); + } + } else { + if (HasBuffEffect(buff_effect)) { + OnLeaveSpecMapArea(i, map_obj); + } } } } -void Human::OnEnterGrass() +void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj) { - if (leave_grass_timer_) { - room->xtimer.DeleteTimer(leave_grass_timer_); - leave_grass_timer_ = nullptr; - } - if (hide_grass_timer_) { - room->xtimer.DeleteTimer(hide_grass_timer_); - hide_grass_timer_ = nullptr; - } - hide_grass_timer_ = room->xtimer.AddDeadLineTimerAndAttach - (MetaMgr::Instance()->grass_invisible_time * SERVER_FRAME_RATE, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(GRASS_HIDE_BUFF_ID); - if (buff_meta) { - hum->AddBuff(hum, buff_meta, 1); - } - }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->hide_grass_timer_ = nullptr; - }); -} - -void Human::OnLeaveGrass() -{ - if (hide_grass_timer_) { - room->xtimer.DeleteTimer(hide_grass_timer_); - hide_grass_timer_ = nullptr; - } - if (leave_grass_timer_) { - room->xtimer.DeleteTimer(leave_grass_timer_); - } - leave_grass_timer_ = room->xtimer.AddDeadLineTimerAndAttach - (MetaMgr::Instance()->grass_show_time * SERVER_FRAME_RATE, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->leave_grass_timer_ = nullptr; - hum->RemoveBuffById(GRASS_HIDE_BUFF_ID); - }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->leave_grass_timer_ = nullptr; - }); -} - -void Human::OnEnterWater() -{ - if (leave_water_timer_) { - room->xtimer.DeleteTimer(leave_water_timer_); - leave_water_timer_ = nullptr; - } - if (hide_water_timer_) { - room->xtimer.DeleteTimer(hide_water_timer_); - hide_water_timer_ = nullptr; - } - hide_water_timer_ = room->xtimer.AddDeadLineTimerAndAttach - (MetaMgr::Instance()->water_invisible_time * SERVER_FRAME_RATE, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(WATER_BUFF_ID); - if (buff_meta) { - hum->AddBuff(hum, buff_meta, 1); - } - }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->hide_water_timer_ = nullptr; - }); -} - -void Human::OnLeaveWater() -{ - if (hide_water_timer_) { - room->xtimer.DeleteTimer(hide_water_timer_); - hide_water_timer_ = nullptr; - } - if (leave_water_timer_) { - room->xtimer.DeleteTimer(leave_water_timer_); - } - leave_water_timer_ = room->xtimer.AddDeadLineTimerAndAttach - (MetaMgr::Instance()->water_show_time * SERVER_FRAME_RATE, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->RemoveBuffById(WATER_BUFF_ID); - }, - &xtimer_attacher.timer_list_, - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - hum->leave_water_timer_ = nullptr; - }); -} - -void Human::OnEnterIce() -{ - if (leave_ice_timer_) { - room->xtimer.DeleteTimer(leave_ice_timer_); - leave_ice_timer_ = nullptr; - } - if (hide_ice_timer_) { - room->xtimer.DeleteTimer(hide_ice_timer_); - hide_ice_timer_ = nullptr; - } - hide_ice_timer_ = room->xtimer.AddDeadLineTimerAndAttach + ClearSpecMapAreaTimer(map_obj); + map_obj.enter_timer = room->xtimer.AddDeadLineTimerAndAttach (MetaMgr::Instance()->ice_invisible_time * SERVER_FRAME_RATE, a8::XParams() .SetSender(this), @@ -4471,21 +4336,14 @@ void Human::OnEnterIce() &xtimer_attacher.timer_list_, [] (const a8::XParams& param) { - Human* hum = (Human*)param.sender.GetUserData(); - hum->hide_ice_timer_ = nullptr; + Human* hum = (Human*)param.sender.GetUserData(); }); } -void Human::OnLeaveIce() +void Human::OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj) { - if (hide_ice_timer_) { - room->xtimer.DeleteTimer(hide_ice_timer_); - hide_ice_timer_ = nullptr; - } - if (leave_ice_timer_) { - room->xtimer.DeleteTimer(leave_ice_timer_); - } - leave_ice_timer_ = room->xtimer.AddDeadLineTimerAndAttach + ClearSpecMapAreaTimer(map_obj); + map_obj.leave_timer = room->xtimer.AddDeadLineTimerAndAttach (MetaMgr::Instance()->ice_show_time * SERVER_FRAME_RATE, a8::XParams() .SetSender(this), @@ -4498,6 +4356,17 @@ void Human::OnLeaveIce() [] (const a8::XParams& param) { Human* hum = (Human*)param.sender.GetUserData(); - hum->leave_ice_timer_ = nullptr; }); } + +void Human::ClearSpecMapAreaTimer(SpecMapObject& map_obj) +{ + if (map_obj.leave_timer) { + room->xtimer.DeleteTimer(map_obj.leave_timer); + map_obj.leave_timer = nullptr; + } + if (map_obj.enter_timer) { + room->xtimer.DeleteTimer(map_obj.enter_timer); + map_obj.enter_timer = nullptr; + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 79c278f..2ceeae0 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -28,6 +28,12 @@ enum HumanStatus HS_End }; +struct SpecMapObject +{ + struct xtimer_list* leave_timer = nullptr; + struct xtimer_list* enter_timer = nullptr; +}; + struct xtimer_list; class CircleCollider; class AabbCollider; @@ -356,12 +362,9 @@ private: void DoGetOnWithLoot(Loot* loot_entity); void DoGetOnWithCar(Car* car); void CheckSpecObject(); - void OnEnterGrass(); - void OnLeaveGrass(); - void OnEnterWater(); - void OnLeaveWater(); - void OnEnterIce(); - void OnLeaveIce(); + void OnEnterSpecMapArea(int tag, SpecMapObject& map_obj); + void OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj); + void ClearSpecMapAreaTimer(SpecMapObject& map_obj); protected: int level_ = 0; @@ -426,6 +429,7 @@ private: std::array buff_attr_rate_ = {}; std::array fixed_object_sync_flags_ = {}; + std::array spec_map_objects_ = {}; bool already_report_battle_ = false; bool sent_battlereport_ = false; @@ -436,13 +440,6 @@ private: Entity* last_collision_door_ = nullptr; long long jump_frameno_ = 0; - xtimer_list* leave_grass_timer_ = nullptr; - xtimer_list* hide_grass_timer_ = nullptr; - xtimer_list* leave_water_timer_ = nullptr; - xtimer_list* hide_water_timer_ = nullptr; - xtimer_list* leave_ice_timer_ = nullptr; - xtimer_list* hide_ice_timer_ = nullptr; - friend class FrameMaker; friend class FrameEvent; }; diff --git a/third_party/a8engine b/third_party/a8engine index a0d01a5..9f43c10 160000 --- a/third_party/a8engine +++ b/third_party/a8engine @@ -1 +1 @@ -Subproject commit a0d01a57a5792268b7dd0c144dfda00e7e171d80 +Subproject commit 9f43c10312f3f3adccab2d477365c0c1d9200e03 From eca4f8f95ed43ead9f3b4b564b4875fe7a0a6a6d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 8 Mar 2021 17:12:46 +0800 Subject: [PATCH 07/14] 1 --- server/gameserver/constant.h | 4 ---- server/gameserver/human.cc | 25 ++++++++++++++------- server/gameserver/metamgr.cc | 42 ++++++++++++++++++++++++++++++++++++ server/gameserver/metamgr.h | 3 +++ 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index f62d0a1..541a693 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -408,8 +408,4 @@ const int HUNLUAN_BUFFID = 6001; const int DRIVER_BUFFID = 6003; const int PASSENGER_BUFFID = 6004; -const int GRASS_HIDE_BUFF_ID = 6005; -const int WATER_BUFF_ID = 6006; -const int ICE_BUFF_ID = 6007; - const long long SPEC_MAP_OBJECT_FLAGS = A8_DEFINE_RANGE_BIT(long long, kColliderSpecTag_Begin, kColliderSpecTag_End); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 4598b3f..96f6460 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -4322,13 +4322,16 @@ void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj) { ClearSpecMapAreaTimer(map_obj); map_obj.enter_timer = room->xtimer.AddDeadLineTimerAndAttach - (MetaMgr::Instance()->ice_invisible_time * SERVER_FRAME_RATE, + (MetaMgr::Instance()->GetSpecMapAreaEnterTime(tag) * SERVER_FRAME_RATE, a8::XParams() - .SetSender(this), + .SetSender(this) + .SetParam1(&map_obj) + .SetParam2(tag), [] (const a8::XParams& param) { Human* hum = (Human*)param.sender.GetUserData(); - MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(ICE_BUFF_ID); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff + (MetaMgr::Instance()->GetSpecMapAreaBuffId(param.param2)); if (buff_meta) { hum->AddBuff(hum, buff_meta, 1); } @@ -4336,27 +4339,33 @@ void Human::OnEnterSpecMapArea(int tag, SpecMapObject& map_obj) &xtimer_attacher.timer_list_, [] (const a8::XParams& param) { - Human* hum = (Human*)param.sender.GetUserData(); + SpecMapObject* map_obj = (SpecMapObject*)param.param1.GetUserData(); + map_obj->enter_timer = nullptr; }); + } void Human::OnLeaveSpecMapArea(int tag, SpecMapObject& map_obj) { ClearSpecMapAreaTimer(map_obj); map_obj.leave_timer = room->xtimer.AddDeadLineTimerAndAttach - (MetaMgr::Instance()->ice_show_time * SERVER_FRAME_RATE, + (MetaMgr::Instance()->GetSpecMapAreaLeaveTime(tag) * SERVER_FRAME_RATE, a8::XParams() - .SetSender(this), + .SetSender(this) + .SetParam1(&map_obj) + .SetParam2(tag), [] (const a8::XParams& param) { Human* hum = (Human*)param.sender.GetUserData(); - hum->RemoveBuffById(ICE_BUFF_ID); + hum->RemoveBuffById((MetaMgr::Instance()->GetSpecMapAreaBuffId(param.param2))); }, &xtimer_attacher.timer_list_, [] (const a8::XParams& param) { - Human* hum = (Human*)param.sender.GetUserData(); + SpecMapObject* map_obj = (SpecMapObject*)param.param1.GetUserData(); + map_obj->leave_timer = nullptr; }); + } void Human::ClearSpecMapAreaTimer(SpecMapObject& map_obj) diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 37f55ce..ecc599a 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -871,3 +871,45 @@ std::string MetaMgr::GetText(const std::string& textid, const std::string& def_t auto itr = loader_->text_hash.find(textid); return itr != loader_->text_hash.end() ? itr->second : def_text; } + +int MetaMgr::GetSpecMapAreaBuffId(int tag) +{ + switch (tag) { + case kColliderTag_Grass: + return 6005; + case kColliderTag_Water: + return 6006; + case kColliderTag_Ice: + return 6007; + default: + return 0; + } +} + +int MetaMgr::GetSpecMapAreaEnterTime(int tag) +{ + switch (tag) { + case kColliderTag_Grass: + return grass_invisible_time; + case kColliderTag_Water: + return water_invisible_time; + case kColliderTag_Ice: + return ice_invisible_time; + default: + return 0; + } +} + +int MetaMgr::GetSpecMapAreaLeaveTime(int tag) +{ + switch (tag) { + case kColliderTag_Grass: + return grass_show_time; + case kColliderTag_Water: + return water_show_time; + case kColliderTag_Ice: + return ice_show_time; + default: + return 0; + } +} diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 17b7195..a281536 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -52,6 +52,9 @@ class MetaMgr : public a8::Singleton MetaData::Robot* RandRobot(std::set& refreshed_robot_set); MetaData::AI* GetAI(int ai_level, int ai_mode); std::string GetText(const std::string& textid, const std::string& def_text=""); + int GetSpecMapAreaBuffId(int tag); + int GetSpecMapAreaEnterTime(int tag); + int GetSpecMapAreaLeaveTime(int tag); int gas_inactive_time = 10; int newbie_gas_inactive_time = 5; From 829b72261c896ec80d691dbcde6bc0e021d7b591 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 25 Mar 2021 13:27:01 +0800 Subject: [PATCH 08/14] 1 --- server/gameserver/metamgr.cc | 14 ++++++++++++++ server/gameserver/metamgr.h | 2 ++ server/tools/protobuild/metatable.proto | 18 +++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 7785226..59274df 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -76,6 +76,8 @@ public: std::map building_hash; std::map drop_hash; std::map> maptpl_meta_hash; + std::map> terrain_meta_hash; + std::map> layer_meta_hash; std::map> maptpl_hash; std::map dress_hash; std::vector dress_vec; @@ -738,6 +740,18 @@ std::vector* MetaMgr::GetMapTplThing(std::string& map_nam return itr != loader_->maptpl_hash.end() ? &itr->second : nullptr; } +std::list* MetaMgr::GetTerrainJson(std::string& map_name) +{ + auto itr = loader_->terrain_meta_hash.find(map_name); + return itr != loader_->terrain_meta_hash.end() ? &itr->second : nullptr; +} + +std::list* MetaMgr::GetMapLayer(std::string& map_name) +{ + auto itr = loader_->layer_meta_hash.find(map_name); + return itr != loader_->layer_meta_hash.end() ? &itr->second : nullptr; +} + std::list& MetaMgr::GetAirDrops() { return loader_->airdrop_list; diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 0990bda..5960f57 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -32,6 +32,8 @@ class MetaMgr : public a8::Singleton MetaData::Drop* GetDrop(int drop_id); MetaData::SafeArea* GetSafeArea(int area_id); std::vector* GetMapTplThing(std::string& map_name); + std::list* GetTerrainJson(std::string& map_name); + std::list* GetMapLayer(std::string& map_name); std::list& GetAirDrops(); MetaData::AirDrop* GetAirDrop(int airdrop_id); MetaData::AirLine* RandAirLine(int map_id); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index b6d91d6..208b4cd 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -357,4 +357,20 @@ message MapTplThingJson optional float param3 = 11; optional string object_type = 12; optional int32 _object_type = 13; -} \ No newline at end of file +} + +message TerrainJson +{ + optional int32 map_id = 1; + repeated int32 dust = 2; + repeated int32 water = 3; + repeated int32 grass = 4; +} + +message MapLayerJson +{ + optional string name = 1; + optional int32 width = 2; + optional int32 height = 3; + repeated int32 grids = 4; +} From 6d9f77e14f5a582dad766f96367819dbdebb127c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 25 Mar 2021 13:31:59 +0800 Subject: [PATCH 09/14] 1 --- server/gameserver/metamgr.cc | 6 +++--- server/gameserver/metamgr.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 59274df..47fa777 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -76,7 +76,7 @@ public: std::map building_hash; std::map drop_hash; std::map> maptpl_meta_hash; - std::map> terrain_meta_hash; + std::map terrain_meta_hash; std::map> layer_meta_hash; std::map> maptpl_hash; std::map dress_hash; @@ -740,9 +740,9 @@ std::vector* MetaMgr::GetMapTplThing(std::string& map_nam return itr != loader_->maptpl_hash.end() ? &itr->second : nullptr; } -std::list* MetaMgr::GetTerrainJson(std::string& map_name) +metatable::TerrainJson* MetaMgr::GetTerrainJson(int map_id) { - auto itr = loader_->terrain_meta_hash.find(map_name); + auto itr = loader_->terrain_meta_hash.find(map_id); return itr != loader_->terrain_meta_hash.end() ? &itr->second : nullptr; } diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 5960f57..779bf89 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -32,7 +32,7 @@ class MetaMgr : public a8::Singleton MetaData::Drop* GetDrop(int drop_id); MetaData::SafeArea* GetSafeArea(int area_id); std::vector* GetMapTplThing(std::string& map_name); - std::list* GetTerrainJson(std::string& map_name); + metatable::TerrainJson* GetTerrainJson(int map_id); std::list* GetMapLayer(std::string& map_name); std::list& GetAirDrops(); MetaData::AirDrop* GetAirDrop(int airdrop_id); From a22e67c927b7e25faefee51e1df5eab93e87a28c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 25 Mar 2021 17:13:46 +0800 Subject: [PATCH 10/14] 1 --- server/gameserver/metamgr.cc | 37 ++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 47fa777..66517b3 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -63,6 +63,7 @@ public: std::list ai_meta_list; std::list ai_list; std::list text_meta_list; + std::list terrain_meta_list; std::map parameter_hash; std::map gamemap_hash; @@ -76,7 +77,6 @@ public: std::map building_hash; std::map drop_hash; std::map> maptpl_meta_hash; - std::map terrain_meta_hash; std::map> layer_meta_hash; std::map> maptpl_hash; std::map dress_hash; @@ -143,6 +143,7 @@ public: f8::ReadCsvMetaFile(res_path + "robot@robot.csv", robot_meta_list); f8::ReadCsvMetaFile(res_path + "ai@ai.csv", ai_meta_list); f8::ReadCsvMetaFile(res_path + "text@text.csv", text_meta_list); + f8::ReadJsonMetaFile(res_path + "terrain.json", terrain_meta_list); BindToMetaData(); #if 1 { @@ -445,14 +446,26 @@ private: #if 1 { for (auto& tuple : item.template_list) { - auto itr = maptpl_meta_hash.find(std::get<0>(tuple)); - if (itr == maptpl_meta_hash.end()) { - maptpl_meta_hash[std::get<0>(tuple)] = std::list(); - itr = maptpl_meta_hash.find(std::get<0>(tuple)); - } else { - itr->second.clear(); + { + auto itr = maptpl_meta_hash.find(std::get<0>(tuple)); + if (itr == maptpl_meta_hash.end()) { + maptpl_meta_hash[std::get<0>(tuple)] = std::list(); + itr = maptpl_meta_hash.find(std::get<0>(tuple)); + } else { + itr->second.clear(); + } + f8::ReadJsonMetaFile(res_path + std::get<0>(tuple) + ".json", itr->second); + } + { + auto itr = layer_meta_hash.find(std::get<0>(tuple)); + if (itr == layer_meta_hash.end()) { + layer_meta_hash[std::get<0>(tuple)] = std::list(); + itr = layer_meta_hash.find(std::get<0>(tuple)); + } else { + itr->second.clear(); + } + f8::ReadJsonMetaFile(res_path + std::get<0>(tuple) + ".layers.json", itr->second); } - f8::ReadJsonMetaFile(res_path + std::get<0>(tuple) + ".json", itr->second); } } #endif @@ -742,8 +755,12 @@ std::vector* MetaMgr::GetMapTplThing(std::string& map_nam metatable::TerrainJson* MetaMgr::GetTerrainJson(int map_id) { - auto itr = loader_->terrain_meta_hash.find(map_id); - return itr != loader_->terrain_meta_hash.end() ? &itr->second : nullptr; + for (auto& itr : loader_->terrain_meta_list) { + if (itr.map_id() == map_id) { + return &itr; + } + } + return nullptr; } std::list* MetaMgr::GetMapLayer(std::string& map_name) From 244d15e1c6577dff7cc5792fedbfe78b88cf0989 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 26 Mar 2021 16:30:21 +0800 Subject: [PATCH 11/14] 1 --- server/gameserver/mapinstance.cc | 98 ++++++++++++++++++++++++++++++-- server/gameserver/mapinstance.h | 3 +- server/gameserver/mapservice.cc | 3 + server/gameserver/obstacle.cc | 5 ++ server/gameserver/obstacle.h | 1 + 5 files changed, 105 insertions(+), 5 deletions(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 01f784d..cb2c293 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -34,6 +34,7 @@ void MapInstance::Init() map_meta_->i->map_height() / MAP_GRID_WIDTH, MAP_GRID_WIDTH); CreateThings(); + CreateTerrain(); a8::UdpLog::Instance()->Info ("map_id:%d current_uniid:%d loots:%d mini_room_spawn_points:%d normal_room_spawn_points:%d " "building_num:%d obstalce_num:%d obstacle0_num:%d " @@ -149,6 +150,94 @@ void MapInstance::CreateThings() } } +void MapInstance::CreateTerrain() +{ + metatable::TerrainJson* terrain = MetaMgr::Instance()->GetTerrainJson(map_id); + std::list* layers = MetaMgr::Instance()->GetMapLayer(map_tpl_name_); + if (!terrain || !layers) { + abort(); + } + if (layers->empty()) { + return; + } + metatable::MapLayerJson* first_layer = nullptr; + for (auto layer : *layers) { + if (!first_layer) { + first_layer = &layer; + } + if (layer.width() != first_layer->width()) { + abort(); + } + if (layer.height() != first_layer->height()) { + abort(); + } + if (layer.grids().size() != first_layer->grids().size()) { + abort(); + } + } + if (first_layer->grids().size() != first_layer->width() * first_layer->height()) { + abort(); + } + if (first_layer->grids().size() <= 0) { + abort(); + } + + std::vector grids; + grids.reserve(first_layer->grids().size()); + for (int i = 0; i < first_layer->grids().size(); ++i) { + grids.push_back(0); + } + std::set dusts; + for (auto idx : terrain->dust()) { + dusts.insert(idx); + } + std::set waters; + for (auto idx : terrain->water()) { + waters.insert(idx); + } + std::set grasses; + for (auto idx : terrain->grass()) { + grasses.insert(idx); + } + + int mask = A8_DEFINE_RANGE_BIT(int, 0, 22); + for (auto layer : *layers) { + for (int i = 0; i < first_layer->grids().size(); ++i) { + int grid_val = layer.grids(i) & mask; + if (grid_val != 0) { + grids[i] = grid_val; + } + } + } + + MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(0); + if (thing_meta) { + for (int w = 0; w < first_layer->width(); ++w) { + for (int h = 0; h < first_layer->height(); ++h) { + int grid_val = grids[w * first_layer->width() + h]; + if (grid_val != 0) { + float x = w * thing_meta->i->width() + thing_meta->i->width() / 2.0f; + float y = h * thing_meta->i->height() + thing_meta->i->height() / 2.0f; + int collider_tag = 0; + if (dusts.find(grid_val) != dusts.end()) { + a8::SetBitFlag(collider_tag, kColliderTag_Ice); + } else if (waters.find(grid_val) != waters.end()) { + a8::SetBitFlag(collider_tag, kColliderTag_Water); + } else if (grasses.find(grid_val) != grasses.end()) { + a8::SetBitFlag(collider_tag, kColliderTag_Grass); + } + if (collider_tag != 0) { + InternalCreateObstacle(thing_meta->i->thing_id(), x, y, collider_tag, + [] (Obstacle* entity) + { + }); + } + } + } + } + } +} + void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl) { int thing_id = thing_tpl.RandThing(); @@ -157,7 +246,7 @@ void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl) if (thing_meta->i->is_house()) { CreateBuilding(thing_id, thing_tpl.i->x(), thing_tpl.i->y()); } else { - InternalCreateObstacle(thing_id, thing_tpl.i->x(), thing_tpl.i->y(), + InternalCreateObstacle(thing_id, thing_tpl.i->x(), thing_tpl.i->y(), 0, [] (Obstacle* entity) { }); @@ -192,7 +281,7 @@ void MapInstance::CreateBuilding(int thing_id, float building_x, float building_ MetaData::Building::Door* door_meta = &building->meta->doors[door_idx]; float x = building->GetX() + door_meta->state0->x() - building->meta->i->tilewidth() / 2.0; float y = building->GetY() + door_meta->state0->y() - building->meta->i->tileheight() / 2.0; - InternalCreateObstacle(DOOR_THING_ID, x, y, + InternalCreateObstacle(DOOR_THING_ID, x, y, 0, [building, door_idx] (Obstacle* entity) { entity->SetDoorInfo(building, door_idx); @@ -206,7 +295,7 @@ void MapInstance::CreateBuilding(int thing_id, float building_x, float building_ int rnd = rand () % obj._rand_space(); for (auto& pair : obj._things()) { if (rnd <= pair.value()) { - InternalCreateObstacle(pair.key(), x, y, + InternalCreateObstacle(pair.key(), x, y, 0, [building] (Obstacle* entity) { entity->SetBuilding(building); @@ -219,12 +308,13 @@ void MapInstance::CreateBuilding(int thing_id, float building_x, float building_ buildings_.push_back(building); } -Obstacle* MapInstance::InternalCreateObstacle(int id, float x, float y, +Obstacle* MapInstance::InternalCreateObstacle(int id, float x, float y, int collider_tag, std::function on_precreate) { MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(id); if (thing) { Obstacle* entity = EntityFactory::Instance()->MakeObstacle(AllocUniid()); + entity->collider_tag = collider_tag; entity->meta = thing; entity->is_permanent = true; entity->permanent_map_service = map_service_; diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 278dd63..76de008 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -26,9 +26,10 @@ class MapInstance private: void CreateThings(); + void CreateTerrain(); void CreateMapObject(MetaData::MapTplThing& thing_tpl); void CreateBuilding(int thing_id, float building_x, float building_y); - Obstacle* InternalCreateObstacle(int id, float x, float y, + Obstacle* InternalCreateObstacle(int id, float x, float y, int collider_tag, std::function on_precreate); Entity* GetEntityByUniId(int uniid); int AllocUniid(); diff --git a/server/gameserver/mapservice.cc b/server/gameserver/mapservice.cc index 7da2f31..4c47aac 100644 --- a/server/gameserver/mapservice.cc +++ b/server/gameserver/mapservice.cc @@ -184,6 +184,9 @@ void MapService::GetColliders(Room* room, } struct CellNode *node, *tmp; list_for_each_entry_safe(node, tmp, head, entry) { + if (node->collider->tag != 0) { + continue; + } switch (node->collider->owner->GetEntityType()) { case ET_Obstacle: { diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 4300de4..d331e17 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -97,6 +97,9 @@ void Obstacle::RecalcSelfCollider() self_collider_->pos = a8::Vec2(); self_collider_->rad = 0.0f; } + for (auto collider : colliders_) { + collider->tag = collider_tag; + } } void Obstacle::FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) @@ -171,12 +174,14 @@ void Obstacle::GetAabbBox(AabbCollider& aabb_box) if (self_collider_) { aabb_box.active = true; aabb_box.owner = this; + aabb_box.tag = collider_tag; aabb_box._min.x = -self_collider_->rad; aabb_box._min.y = -self_collider_->rad; aabb_box._max.x = self_collider_->rad; aabb_box._max.y = self_collider_->rad; return; } + aabb_box.tag = collider_tag; aabb_box.active = true; aabb_box.owner = this; } diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 8427265..a335df7 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -25,6 +25,7 @@ class Obstacle : public Entity MetaData::MapThing* meta = nullptr; MapService* permanent_map_service = nullptr; bool is_permanent = false; + int collider_tag = 0; virtual ~Obstacle() override; virtual void Initialize() override; From a13f4d0147855123ddff301fcfca421601f858d0 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 26 Mar 2021 17:07:30 +0800 Subject: [PATCH 12/14] 1 --- server/gameserver/metamgr.cc | 8 ++++---- server/tools/protobuild/metatable.proto | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 66517b3..ddb4689 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -457,14 +457,14 @@ private: f8::ReadJsonMetaFile(res_path + std::get<0>(tuple) + ".json", itr->second); } { - auto itr = layer_meta_hash.find(std::get<0>(tuple)); + auto itr = layer_meta_hash.find(meta.map_pic()); if (itr == layer_meta_hash.end()) { - layer_meta_hash[std::get<0>(tuple)] = std::list(); - itr = layer_meta_hash.find(std::get<0>(tuple)); + layer_meta_hash[meta.map_pic()] = std::list(); + itr = layer_meta_hash.find(meta.map_pic()); } else { itr->second.clear(); } - f8::ReadJsonMetaFile(res_path + std::get<0>(tuple) + ".layers.json", itr->second); + f8::ReadJsonMetaFile(res_path + meta.map_pic() + ".layers.json", itr->second); } } } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 208b4cd..b65722e 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -33,6 +33,7 @@ message Map optional int32 map_mode = 10; optional int32 safearea = 11; optional string game_start_buff_list = 12; + optional string map_pic = 13; } message MapThing From 6e0392cb3cc95bd7c2f6b9c0e7231dda29b66a0b Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 26 Mar 2021 17:44:14 +0800 Subject: [PATCH 13/14] 1 --- server/gameserver/metamgr.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index ddb4689..181acc6 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -1,5 +1,8 @@ #include "precompile.h" +#include +#include + #include #include @@ -464,7 +467,10 @@ private: } else { itr->second.clear(); } - f8::ReadJsonMetaFile(res_path + meta.map_pic() + ".layers.json", itr->second); + std::string filename = res_path + "map" + meta.map_pic() + ".layers.json"; + if (access("test.c", F_OK) != -1) { + f8::ReadJsonMetaFile(filename, itr->second); + } } } } From 3a41ec842853274c78c613a2417ea5abda37bee4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 26 Mar 2021 20:17:57 +0800 Subject: [PATCH 14/14] 1 --- server/gameserver/mapinstance.cc | 5 +++-- server/gameserver/metamgr.cc | 6 +++--- server/gameserver/metamgr.h | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index cb2c293..77294ba 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -153,9 +153,10 @@ void MapInstance::CreateThings() void MapInstance::CreateTerrain() { metatable::TerrainJson* terrain = MetaMgr::Instance()->GetTerrainJson(map_id); - std::list* layers = MetaMgr::Instance()->GetMapLayer(map_tpl_name_); + std::list* layers = MetaMgr::Instance()->GetMapLayer(map_meta_->i->map_pic()); if (!terrain || !layers) { - abort(); + return; + //abort(); } if (layers->empty()) { return; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 181acc6..9bfcb28 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -468,7 +468,7 @@ private: itr->second.clear(); } std::string filename = res_path + "map" + meta.map_pic() + ".layers.json"; - if (access("test.c", F_OK) != -1) { + if (access(filename.c_str(), F_OK) != -1) { f8::ReadJsonMetaFile(filename, itr->second); } } @@ -753,7 +753,7 @@ MetaData::SafeArea* MetaMgr::GetSafeArea(int area_id) return itr != loader_->safearea_hash.end() ? itr->second : nullptr; } -std::vector* MetaMgr::GetMapTplThing(std::string& map_name) +std::vector* MetaMgr::GetMapTplThing(const std::string& map_name) { auto itr = loader_->maptpl_hash.find(map_name); return itr != loader_->maptpl_hash.end() ? &itr->second : nullptr; @@ -769,7 +769,7 @@ metatable::TerrainJson* MetaMgr::GetTerrainJson(int map_id) return nullptr; } -std::list* MetaMgr::GetMapLayer(std::string& map_name) +std::list* MetaMgr::GetMapLayer(const std::string& map_name) { auto itr = loader_->layer_meta_hash.find(map_name); return itr != loader_->layer_meta_hash.end() ? &itr->second : nullptr; diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 779bf89..5ec8475 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -31,9 +31,9 @@ class MetaMgr : public a8::Singleton MetaData::Building* GetBuilding(int building_id); MetaData::Drop* GetDrop(int drop_id); MetaData::SafeArea* GetSafeArea(int area_id); - std::vector* GetMapTplThing(std::string& map_name); + std::vector* GetMapTplThing(const std::string& map_name); metatable::TerrainJson* GetTerrainJson(int map_id); - std::list* GetMapLayer(std::string& map_name); + std::list* GetMapLayer(const std::string& map_name); std::list& GetAirDrops(); MetaData::AirDrop* GetAirDrop(int airdrop_id); MetaData::AirLine* RandAirLine(int map_id);