1
This commit is contained in:
parent
8b76a1cd57
commit
32d2325e20
@ -73,6 +73,7 @@ void AndroidNewAI::Update(int delta_time)
|
||||
return;
|
||||
}
|
||||
UpdateNewAI();
|
||||
hum->UpdateViewObjects();
|
||||
}
|
||||
|
||||
float AndroidNewAI::GetAttackRate()
|
||||
|
@ -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<Human*> 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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<Human*> view_objects_;
|
||||
xtimer_list* refresh_view_timer_ = nullptr;
|
||||
|
||||
private:
|
||||
CircleCollider* self_collider_ = nullptr;
|
||||
|
@ -129,6 +129,7 @@ void Player::InternalUpdate(int delta_time)
|
||||
if (has_use_item_id) {
|
||||
UpdateUseItemId();
|
||||
}
|
||||
UpdateViewObjects();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user