This commit is contained in:
aozhiwei 2021-09-17 03:54:24 +00:00
parent 9630044bf9
commit f5d9dbfe46
2 changed files with 35 additions and 12 deletions

View File

@ -381,34 +381,53 @@ void Buff::ProcSprint()
} }
Player* hum = (Player*)caster_.Get(); Player* hum = (Player*)caster_.Get();
std::set<int>* hited_objects = new std::set<int>; std::set<int>* hited_objects = new std::set<int>;
a8::Vec2* pre_pos = new a8::Vec2;
*pre_pos = owner->GetPos();
owner->room->xtimer.AddRepeatTimerAndAttach owner->room->xtimer.AddRepeatTimerAndAttach
( (
1, 1,
a8::XParams() a8::XParams()
.SetSender(this) .SetSender(this)
.SetParam1(hited_objects), .SetParam1(hited_objects)
.SetParam2(pre_pos),
[] (const a8::XParams& param) [] (const a8::XParams& param)
{ {
Buff* buff = (Buff*)param.sender.GetUserData(); Buff* buff = (Buff*)param.sender.GetUserData();
a8::Vec2* pre_pos = (a8::Vec2*)param.param2.GetUserData();
std::set<int>* hited_objects = (std::set<int>*)param.param1.GetUserData(); std::set<int>* hited_objects = (std::set<int>*)param.param1.GetUserData();
std::set<Creature*> enemys; std::set<Creature*> enemys;
buff->owner->GetHitEnemys(enemys, buff->meta->param2); 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) { for (auto& enemy : enemys) {
if (enemy->IsEntityType(ET_Car)) { if (enemy->IsEntityType(ET_Car)) {
continue; continue;
} }
if (hited_objects->find(enemy->GetUniId()) != hited_objects->end()) { if (hited_objects->find(enemy->GetUniId()) == hited_objects->end()) {
hited_objects->insert(enemy->GetUniId()); hited_objects->insert(enemy->GetUniId());
for (int buff_id : buff->meta->param3_int_list) { for (int buff_id : buff->meta->param3_int_list) {
enemy->TryAddBuff(buff->owner, buff_id); enemy->TryAddBuff(buff->owner, buff_id);
} }
} }
} }
}
}
buff->owner->SetPos(old_pos);
*pre_pos = buff->owner->GetPos();
}, },
&xtimer_attacher.timer_list_, &xtimer_attacher.timer_list_,
[] (const a8::XParams& param) [] (const a8::XParams& param)
{ {
std::set<int>* hited_objects = (std::set<int>*)param.param1.GetUserData(); std::set<int>* hited_objects = (std::set<int>*)param.param1.GetUserData();
a8::Vec2* pre_pos = (a8::Vec2*)param.param2.GetUserData();
delete pre_pos;
delete hited_objects; delete hited_objects;
}); });
} }

View File

@ -2275,17 +2275,21 @@ void Creature::SetDef(float def)
void Creature::GetHitEnemys(std::set<Creature*>& enemys, float radius) void Creature::GetHitEnemys(std::set<Creature*>& enemys, float radius)
{ {
float min_distance = 9999999999;
room->grid_service->TraverseCreatures room->grid_service->TraverseCreatures
(room->GetRoomIdx(), (room->GetRoomIdx(),
GetGridList(), GetGridList(),
[this, &enemys, radius] (Creature* c, bool& stop) [this, &enemys, radius, &min_distance] (Creature* c, bool& stop)
{ {
if (IsProperTarget(c)) { 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); enemys.insert(c);
} }
} }
}); });
int i = 0;
} }
void Creature::AddHp(float hp) void Creature::AddHp(float hp)