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_Obstacle:
case ET_Building: 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 (!collider->owner->dead && TestCollision((ColliderComponent*)collider)) {
if (last_collision_door != collider->owner) { if (last_collision_door != collider->owner) {
return true; return true;
@ -1517,7 +1510,6 @@ void Human::ProcBuffEffect(Buff* buff)
void Human::OnAttack() void Human::OnAttack()
{ {
#if 0
if (a8::HasBitFlag(status, HS_InGrass)) { if (a8::HasBitFlag(status, HS_InGrass)) {
if (HasBuffEffect(BET_Hide)) { if (HasBuffEffect(BET_Hide)) {
RemoveBuff(buff_effect_[BET_Hide]->meta->i->buff_id()); RemoveBuff(buff_effect_[BET_Hide]->meta->i->buff_id());
@ -1544,12 +1536,10 @@ void Human::OnAttack()
&xtimer_attacher.timer_list_); &xtimer_attacher.timer_list_);
} }
} }
#endif
} }
void Human::OnEnterGrass() void Human::OnEnterGrass()
{ {
#if 0
if (a8::HasBitFlag(status, HS_InGrass)) { if (a8::HasBitFlag(status, HS_InGrass)) {
return; return;
} }
@ -1578,12 +1568,10 @@ void Human::OnEnterGrass()
.SetSender(this), .SetSender(this),
hide_func, hide_func,
&xtimer_attacher.timer_list_); &xtimer_attacher.timer_list_);
#endif
} }
void Human::OnLeaveGrass() void Human::OnLeaveGrass()
{ {
#if 0
a8::UnSetBitFlag(status, HS_InGrass); a8::UnSetBitFlag(status, HS_InGrass);
if (grass_hide_timer_list_) { if (grass_hide_timer_list_) {
room->xtimer.DeleteTimer(grass_hide_timer_list_); room->xtimer.DeleteTimer(grass_hide_timer_list_);
@ -1591,6 +1579,7 @@ void Human::OnLeaveGrass()
} }
if (leave_grass_timer_list_) { if (leave_grass_timer_list_) {
room->xtimer.DeleteTimer(leave_grass_timer_list_); room->xtimer.DeleteTimer(leave_grass_timer_list_);
}
leave_grass_timer_list_ = leave_grass_timer_list_ =
room->xtimer.AddDeadLineTimerAndAttach(MetaMgr::Instance()->grass_show_time * SERVER_FRAME_RATE, room->xtimer.AddDeadLineTimerAndAttach(MetaMgr::Instance()->grass_show_time * SERVER_FRAME_RATE,
a8::XParams() a8::XParams()
@ -1602,8 +1591,39 @@ void Human::OnLeaveGrass()
hum->RemoveBuff(HIDE_BUFF_ID); hum->RemoveBuff(HIDE_BUFF_ID);
}, },
&xtimer_attacher.timer_list_); &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();
}
} }
#endif
} }
void Human::_UpdateMove(int speed) void Human::_UpdateMove(int speed)
@ -1620,6 +1640,7 @@ void Human::_UpdateMove(int speed)
} }
room->grid_service.MoveHuman(this); room->grid_service.MoveHuman(this);
} }
CheckGrass();
} }
void Human::ClearFrameData() void Human::ClearFrameData()
@ -1697,8 +1718,9 @@ void Human::Revive()
{ {
dead = false; dead = false;
health = GetMaxHP(); health = GetMaxHP();
CheckGrass();
{ {
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(1006); MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(1003);
if (buff_meta) { if (buff_meta) {
AddBuff(buff_meta); AddBuff(buff_meta);
} }

View File

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

View File

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

View File

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