This commit is contained in:
aozhiwei 2019-07-12 16:04:12 +08:00
parent 0efdb6e23c
commit a4ff6a50e8
4 changed files with 75 additions and 26 deletions

View File

@ -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<ColliderComponent*> 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);
}

View File

@ -209,6 +209,7 @@ class Human : public Entity
void OnAttack();
void OnEnterGrass();
void OnLeaveGrass();
void CheckGrass();
protected:
void _UpdateMove(int speed);

View File

@ -176,7 +176,32 @@ void MapService::GetColliders(float world_x, float world_y, std::set<ColliderCom
}
struct CellNode *node, *tmp;
list_for_each_entry_safe(node, tmp, head, entry) {
colliders.insert(node->collider);
if (node->collider->tag != ColliderTag_Grass) {
colliders.insert(node->collider);
}
}
}
}
}
void MapService::GetGrassColliders(float world_x, float world_y, std::set<ColliderComponent*>& 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);
}
}
}
}

View File

@ -21,6 +21,7 @@ class MapService
void AddCollider(ColliderComponent* collider);
void RemoveCollider(ColliderComponent* collider);
void GetColliders(float world_x, float world_y, std::set<ColliderComponent*>& colliders);
void GetGrassColliders(float world_x, float world_y, std::set<ColliderComponent*>& colliders);
private:
int GetGridId(float world_x, float world_y);