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();
std::set<int>* hited_objects = new std::set<int>;
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<int>* hited_objects = (std::set<int>*)param.param1.GetUserData();
std::set<Creature*> 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<int>* hited_objects = (std::set<int>*)param.param1.GetUserData();
a8::Vec2* pre_pos = (a8::Vec2*)param.param2.GetUserData();
delete pre_pos;
delete hited_objects;
});
}

View File

@ -2275,17 +2275,21 @@ void Creature::SetDef(float def)
void Creature::GetHitEnemys(std::set<Creature*>& 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)