草丛Ok
This commit is contained in:
parent
0efdb6e23c
commit
a4ff6a50e8
@ -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);
|
||||
}
|
||||
|
@ -209,6 +209,7 @@ class Human : public Entity
|
||||
void OnAttack();
|
||||
void OnEnterGrass();
|
||||
void OnLeaveGrass();
|
||||
void CheckGrass();
|
||||
|
||||
protected:
|
||||
void _UpdateMove(int speed);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user