1
This commit is contained in:
parent
9630044bf9
commit
f5d9dbfe46
@ -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;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user