From a4ff6a50e8e13607637f94cb675a299fcd631eba Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 12 Jul 2019 16:04:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8D=89=E4=B8=9BOk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 72 +++++++++++++++++++++------------ server/gameserver/human.h | 1 + server/gameserver/mapservice.cc | 27 ++++++++++++- server/gameserver/mapservice.h | 1 + 4 files changed, 75 insertions(+), 26 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index eb4fc84..a2042eb 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -312,13 +312,6 @@ bool Human::IsCollisionInMapService() case ET_Obstacle: case ET_Building: { - if (collider->tag == ColliderTag_Grass) { - if (TestCollision((ColliderComponent*)collider)) { - if (!a8::HasBitFlag(status, HS_InGrass)) { - OnEnterGrass(); - } - } - } if (!collider->owner->dead && TestCollision((ColliderComponent*)collider)) { if (last_collision_door != collider->owner) { return true; @@ -1517,7 +1510,6 @@ void Human::ProcBuffEffect(Buff* buff) void Human::OnAttack() { - #if 0 if (a8::HasBitFlag(status, HS_InGrass)) { if (HasBuffEffect(BET_Hide)) { RemoveBuff(buff_effect_[BET_Hide]->meta->i->buff_id()); @@ -1544,12 +1536,10 @@ void Human::OnAttack() &xtimer_attacher.timer_list_); } } - #endif } void Human::OnEnterGrass() { - #if 0 if (a8::HasBitFlag(status, HS_InGrass)) { return; } @@ -1578,12 +1568,10 @@ void Human::OnEnterGrass() .SetSender(this), hide_func, &xtimer_attacher.timer_list_); - #endif } void Human::OnLeaveGrass() { - #if 0 a8::UnSetBitFlag(status, HS_InGrass); if (grass_hide_timer_list_) { room->xtimer.DeleteTimer(grass_hide_timer_list_); @@ -1591,19 +1579,51 @@ void Human::OnLeaveGrass() } if (leave_grass_timer_list_) { room->xtimer.DeleteTimer(leave_grass_timer_list_); - leave_grass_timer_list_ = - 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_list_ = nullptr; - hum->RemoveBuff(HIDE_BUFF_ID); - }, - &xtimer_attacher.timer_list_); } - #endif + leave_grass_timer_list_ = + 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_list_ = nullptr; + hum->RemoveBuff(HIDE_BUFF_ID); + }, + &xtimer_attacher.timer_list_); +} + +void Human::CheckGrass() +{ + bool in_grass = false; + std::set colliders; + room->map_service.GetGrassColliders(pos.x, pos.y, colliders); + + for (const ColliderComponent* collider : colliders) { + switch (collider->owner->entity_type) { + case ET_Obstacle: + case ET_Building: + { + if (TestCollision((ColliderComponent*)collider)) { + in_grass = true; + break; + } + } + break; + default: + break; + } + } + + if (in_grass) { + if (!a8::HasBitFlag(status, HS_InGrass)) { + OnEnterGrass(); + } + } else { + if (a8::HasBitFlag(status, HS_InGrass)) { + OnLeaveGrass(); + } + } } void Human::_UpdateMove(int speed) @@ -1620,6 +1640,7 @@ void Human::_UpdateMove(int speed) } room->grid_service.MoveHuman(this); } + CheckGrass(); } void Human::ClearFrameData() @@ -1697,8 +1718,9 @@ void Human::Revive() { dead = false; health = GetMaxHP(); + CheckGrass(); { - MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(1006); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(1003); if (buff_meta) { AddBuff(buff_meta); } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index aed8121..1371060 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -209,6 +209,7 @@ class Human : public Entity void OnAttack(); void OnEnterGrass(); void OnLeaveGrass(); + void CheckGrass(); protected: void _UpdateMove(int speed); diff --git a/server/gameserver/mapservice.cc b/server/gameserver/mapservice.cc index 4806020..d1a1fc8 100644 --- a/server/gameserver/mapservice.cc +++ b/server/gameserver/mapservice.cc @@ -176,7 +176,32 @@ void MapService::GetColliders(float world_x, float world_y, std::setcollider); + if (node->collider->tag != ColliderTag_Grass) { + colliders.insert(node->collider); + } + } + } + } +} + +void MapService::GetGrassColliders(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 (head->next == nullptr && head->prev == nullptr) { + continue; + } + struct CellNode *node, *tmp; + list_for_each_entry_safe(node, tmp, head, entry) { + if (node->collider->tag == ColliderTag_Grass) { + colliders.insert(node->collider); + } } } } diff --git a/server/gameserver/mapservice.h b/server/gameserver/mapservice.h index 6cf8cd8..683338e 100644 --- a/server/gameserver/mapservice.h +++ b/server/gameserver/mapservice.h @@ -21,6 +21,7 @@ class MapService void AddCollider(ColliderComponent* collider); void RemoveCollider(ColliderComponent* collider); void GetColliders(float world_x, float world_y, std::set& colliders); + void GetGrassColliders(float world_x, float world_y, std::set& colliders); private: int GetGridId(float world_x, float world_y);