diff --git a/server/gameserver/buff/callfunc.cc b/server/gameserver/buff/callfunc.cc index 830621cc..629adea8 100644 --- a/server/gameserver/buff/callfunc.cc +++ b/server/gameserver/buff/callfunc.cc @@ -27,6 +27,7 @@ #include "virtualbullet.h" #include "shot.h" #include "entityfactory.h" +#include "gridcell.h" #include "mt/Buff.h" #include "mt/Equip.h" @@ -35,6 +36,7 @@ void CallFuncBuff::Activate() { + int buff_id = meta->buff_id(); hold_weapon_ = owner->GetCurrWeapon(); switch ((BuffCallFunc_e)meta->_int_buff_param1) { case BuffCallFunc_e::kAddMinorMode: @@ -280,6 +282,7 @@ void CallFuncBuff::Activate() void CallFuncBuff::Deactivate() { + int buff_id = meta->buff_id(); if (deactivate_cb_) { deactivate_cb_(); } @@ -562,6 +565,7 @@ void CallFuncBuff::ProcAddEnergyShield() void CallFuncBuff::ProcAddHp() { + int buff_id = meta->buff_id(); if (!owner->dead && !owner->downed) { if (std::abs(owner->GetMaxHP() - owner->GetHP()) < 0.001f) { is_valid_ = false; @@ -1266,6 +1270,7 @@ void CallFuncBuff::SpecCenterRangeHoldBuff() void CallFuncBuff::InternalRangeHoldBuff(std::function get_center_func) { + int buff_id = meta->buff_id(); if (owner->dead && !meta->dead_valid()) { return; } @@ -1345,28 +1350,29 @@ void CallFuncBuff::InternalRangeHoldBuff(std::function get_cen { float range = meta->GetBuffParam2(this); std::set hit_humans; - owner->room->TraverseAliveHumanList - ( - [this, range, &hit_humans, &get_center_func] (Human* hum) mutable - { - if (meta->buff_id() == 203032) { - int i = 0; - } - glm::vec3 center; - if (get_center_func(center)) { - if (a8::IntersectCylinderCylinder + glm::vec3 center; + if (get_center_func(center)) { + std::set grid_list; + owner->room->grid_service->GetAllCellsByXy + ( + owner->room, + center.x, + center.z, + grid_list); + owner->room->grid_service->TraverseCreatures + (owner->room->GetRoomIdx(), + grid_list, + [this, range, &hit_humans, ¢er] (Creature* c, bool& stop) + { + if (!c->dead && c->IsHuman() && a8::IntersectCylinderCylinder ( center, owner->GetRadius(), 10, - hum->GetPos().ToGlmVec3(), range, 10 + c->GetPos().ToGlmVec3(), range, 10 )) { - if (meta->buff_id() == 203032) { - int i = 0; - } - hit_humans.insert(hum); + hit_humans.insert(c); } - } - return true; - }); + }); + } std::vector leave_humans; for (auto& pair : context->in_human_infos) { if (hit_humans.find(pair.second.c.Get()) == hit_humans.end()) { @@ -1394,6 +1400,9 @@ void CallFuncBuff::InternalRangeHoldBuff(std::function get_cen (int event, const a8::Args* args) mutable { if (a8::TIMER_EXEC_EVENT == event) { + if (meta->buff_id() == 303013) { + int i = 0; + } check_cb(); } }, @@ -1414,14 +1423,16 @@ void CallFuncBuff::InternalRangeHoldBuff(std::function get_cen context->in_human_infos.clear(); }; { - event_handlers_.push_back(owner->GetTrigger()->AddListener - ( - kDieEvent, - [this, clear_func] (const a8::Args& args) mutable - { - clear_func(); - } - )); + if (!meta->dead_valid()) { + event_handlers_.push_back(owner->GetTrigger()->AddListener + ( + kDieEvent, + [this, clear_func] (const a8::Args& args) mutable + { + clear_func(); + } + )); + } deactivate_cb_ = [this, clear_func] () mutable {