diff --git a/server/gameserver/gridservice.cc b/server/gameserver/gridservice.cc index 57f86b8..c40db9e 100644 --- a/server/gameserver/gridservice.cc +++ b/server/gameserver/gridservice.cc @@ -278,6 +278,12 @@ bool GridService::InView(int a_grid, int b_grid) a_grid + grid_offset_arr_[8] == b_grid; } +bool GridService::InView(int grid_id, float x, float y) +{ + int b_grid_id = grid_id = x/cell_width_ + (y/cell_width_) * cell_count_per_row_; + return InView(grid_id, b_grid_id); +} + void GridService::GetGridList(int grid_id, int offset, std::set& grid_list) { diff --git a/server/gameserver/gridservice.h b/server/gameserver/gridservice.h index 028a427..9245ab0 100644 --- a/server/gameserver/gridservice.h +++ b/server/gameserver/gridservice.h @@ -45,6 +45,7 @@ class GridService bool HumanInGridList(Human* hum, std::set& grid_list); bool EntityInGridList(Room* room, Entity* entity, std::set& grid_list); bool InView(int a_grid, int b_grid); + bool InView(int grid_id, float x, float y); private: inline void GetGridList(int grid_id, int offset, diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 9b2ef05..f16da22 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1323,6 +1323,9 @@ void Human::OnGridListChange(std::set& old_grid_list, } } } + if (IsPlayer() && on_grid_chg) { + on_grid_chg(this); + } } void Human::FillMFActivePlayerData(cs::MFActivePlayerData* player_data) diff --git a/server/gameserver/human.h b/server/gameserver/human.h index dbc38c2..dda3111 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -141,6 +141,8 @@ class Human : public MoveableEntity bool playing_skill = false; xtimer_list* ad_timer_ = nullptr; + std::function on_grid_chg; + Human(); virtual ~Human() override; virtual void Initialize() override; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 4d81152..b92760e 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1711,6 +1711,8 @@ void Room::NotifyGameStart() pair.second->SendNotifyMsg(msg); if (room_type == RT_NewBrid) { first_newbie = pair.second; + } else if (room_type == RT_MidBrid) { + pair.second->on_grid_chg = std::bind(&Room::OnHumanGridChg, this, std::placeholders::_1); } } xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * 1, @@ -2233,3 +2235,18 @@ void Room::ProcDisableHuman() } } } + +void Room::OnHumanGridChg(Human* target) +{ + for (auto& pair : human_hash_) { + Human* hum = pair.second; + if (hum->IsAndroid() && + a8::HasBitFlag(hum->status, HS_Disable) && + !hum->real_dead && + hum->team_uuid.empty() && + grid_service->InView(target->grid_id, hum->GetPos().x, hum->GetPos().y) + ) { + EnableHuman(hum); + } + } +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 04804f5..4d32696 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -166,6 +166,7 @@ private: void CheckAutoDie(Human* hum, int autodie_time, int autodie_distance, int check_times); bool HasPlayerInRound(const a8::Vec2& pos, float rad); void ProcDisableHuman(); + void OnHumanGridChg(Human* target); private: int elapsed_time_ = 0;