diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index fe58c40..e9ad719 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -381,34 +381,53 @@ void Buff::ProcSprint() } Player* hum = (Player*)caster_.Get(); std::set* hited_objects = new std::set; + a8::Vec2* pre_pos = new a8::Vec2; + *pre_pos = owner->GetPos(); owner->room->xtimer.AddRepeatTimerAndAttach ( 1, a8::XParams() .SetSender(this) - .SetParam1(hited_objects), + .SetParam1(hited_objects) + .SetParam2(pre_pos), [] (const a8::XParams& param) { Buff* buff = (Buff*)param.sender.GetUserData(); + a8::Vec2* pre_pos = (a8::Vec2*)param.param2.GetUserData(); std::set* hited_objects = (std::set*)param.param1.GetUserData(); std::set enemys; - buff->owner->GetHitEnemys(enemys, buff->meta->param2); - for (auto& enemy : enemys) { - if (enemy->IsEntityType(ET_Car)) { - continue; - } - if (hited_objects->find(enemy->GetUniId()) != hited_objects->end()) { - hited_objects->insert(enemy->GetUniId()); - for (int buff_id : buff->meta->param3_int_list) { - enemy->TryAddBuff(buff->owner, buff_id); + a8::Vec2 old_pos = buff->owner->GetPos(); + + if (pre_pos->ManhattanDistance(buff->owner->GetPos()) > 2) { + a8::Vec2 dir = buff->owner->GetPos() - (*pre_pos); + dir.Normalize(); + float distance = buff->owner->GetPos().Distance((*pre_pos)); + for (int i = 0; i < (distance + 6); i += 5) { + buff->owner->SetPos((*pre_pos) + (dir * i)); + buff->owner->GetHitEnemys(enemys, buff->meta->param4); + for (auto& enemy : enemys) { + if (enemy->IsEntityType(ET_Car)) { + continue; + } + if (hited_objects->find(enemy->GetUniId()) == hited_objects->end()) { + hited_objects->insert(enemy->GetUniId()); + for (int buff_id : buff->meta->param3_int_list) { + enemy->TryAddBuff(buff->owner, buff_id); + } + } } } } + + buff->owner->SetPos(old_pos); + *pre_pos = buff->owner->GetPos(); }, &xtimer_attacher.timer_list_, [] (const a8::XParams& param) { std::set* hited_objects = (std::set*)param.param1.GetUserData(); + a8::Vec2* pre_pos = (a8::Vec2*)param.param2.GetUserData(); + delete pre_pos; delete hited_objects; }); } diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 700dc29..ac0d057 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2275,17 +2275,21 @@ void Creature::SetDef(float def) void Creature::GetHitEnemys(std::set& enemys, float radius) { + float min_distance = 9999999999; room->grid_service->TraverseCreatures (room->GetRoomIdx(), GetGridList(), - [this, &enemys, radius] (Creature* c, bool& stop) + [this, &enemys, radius, &min_distance] (Creature* c, bool& stop) { if (IsProperTarget(c)) { - if (!c->dead && GetPos().Distance(c->GetPos()) < radius) { + float distance = GetPos().Distance(c->GetPos()); + min_distance = std::min(min_distance, distance); + if (distance < radius) { enemys.insert(c); } } }); + int i = 0; } void Creature::AddHp(float hp)