From 32d2325e208b2b98ed9a28aa716694916b05a5c0 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 13 Apr 2021 21:17:29 +0800 Subject: [PATCH] 1 --- server/gameserver/android.ai.cc | 1 + server/gameserver/human.cc | 54 +++++++++++++++++++++++++++++++++ server/gameserver/human.h | 2 ++ server/gameserver/player.cc | 1 + 4 files changed, 58 insertions(+) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 3c0bd22..5d7bc99 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -73,6 +73,7 @@ void AndroidNewAI::Update(int delta_time) return; } UpdateNewAI(); + hum->UpdateViewObjects(); } float AndroidNewAI::GetAttackRate() diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 250cbd3..68366eb 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3262,6 +3262,24 @@ void Human::OnLand() if (IsAndroid() && team_uuid.empty()) { MustBeAddBuff(this, kBeRecycleBuffId); } + if (IsPlayer()) { + refresh_view_timer_ = room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE * 8, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->UpdateViewObjects(); + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->refresh_view_timer_ = nullptr; + }); + } } void Human::NextReload(int prev_weapon_id, int prev_weapon_idx) @@ -3433,3 +3451,39 @@ void Human::GetHitAabbBox(AabbCollider& aabb_box) } } +void Human::UpdateViewObjects() +{ + if (view_objects_.size() >= 2) { + std::vector deleted_humans; + for (Human* hum : view_objects_) { + if (hum->dead || hum->GetPos().ManhattanDistance(GetPos()) > 1000) { + deleted_humans.push_back(hum); + } + } + for (Human* hum : deleted_humans) { + view_objects_.erase(hum); + } + } + if (view_objects_.size() < 2) { + TouchAllLayerHumanList + ( + [this] (Human* hum, bool& stop) + { + if (hum->IsAndroid() && !hum->dead && view_objects_.find(hum) == view_objects_.end()) { + if (hum->GetPos().ManhattanDistance(GetPos()) < 1000) { + view_objects_.insert(hum); + } + if (view_objects_.size() >= 2) { + stop = true; + return; + } + } + }); + } + if (view_objects_.size() < 2) { + room->GetIncubator()->AllocAndroid(this, 1 + rand() % 2); + if (refresh_view_timer_) { + room->xtimer.ModifyTimer(refresh_view_timer_, SERVER_FRAME_RATE * (8 + (rand() % 3))); + } + } +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 40ddcf0..188afcb 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -243,6 +243,7 @@ class Human : public Creature void SetSeat(int seat) { seat_ = seat; } void DeadDrop(); virtual std::string GetName() override { return name;}; + void UpdateViewObjects(); protected: void _InternalUpdateMove(float speed); @@ -331,6 +332,7 @@ protected: Car* car_ = nullptr; int seat_ = 0; std::set view_objects_; + xtimer_list* refresh_view_timer_ = nullptr; private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 68795aa..789384e 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -129,6 +129,7 @@ void Player::InternalUpdate(int delta_time) if (has_use_item_id) { UpdateUseItemId(); } + UpdateViewObjects(); } }