1
This commit is contained in:
parent
0e3fccd389
commit
88258b5371
@ -466,11 +466,53 @@ void Buff::ProcTurnOver()
|
||||
owner->HasBuffEffect(kBET_Car) ? phase->param1.GetDouble() * 1.5 : phase->param1.GetDouble();
|
||||
owner->_UpdateMove(distance);
|
||||
int moved_distance = (int)owner->GetPos().Distance(old_pos);
|
||||
moved_distance = std::max(moved_distance, 200);
|
||||
if (!meta->param1_int_list.empty()) {
|
||||
for (int i = 0; i < moved_distance; i += 5) {
|
||||
moved_distance = std::min(moved_distance, 200);
|
||||
if (!meta->param1_int_list.empty() && moved_distance > 2) {
|
||||
std::set<Creature*> target_list;
|
||||
owner->TraverseCreatures
|
||||
(
|
||||
[this, &target_list] (Creature* c, bool& stop)
|
||||
{
|
||||
if (owner->IsProperTarget(c) && owner->GetPos().Distance(c->GetPos()) < 300) {
|
||||
target_list.insert(c);
|
||||
}
|
||||
});
|
||||
|
||||
a8::Vec2 curr_pos = owner->GetPos();
|
||||
a8::Vec2 dir = owner->GetPos() - old_pos;
|
||||
dir.Normalize();
|
||||
for (int i = 5; i < moved_distance; i += 5) {
|
||||
owner->SetPos(old_pos + dir * i);
|
||||
std::list<Creature*> hit_objects;
|
||||
for (auto& target : target_list) {
|
||||
if (owner->TestCollision(owner->room, target)) {
|
||||
hit_objects.push_back(target);
|
||||
}
|
||||
}
|
||||
for (auto& target : hit_objects) {
|
||||
target_list.erase(target);
|
||||
target->room->xtimer.AddDeadLineTimerAndAttach
|
||||
(
|
||||
meta->int_param4 / FRAME_RATE_MS * (i / moved_distance),
|
||||
a8::XParams()
|
||||
.SetSender(target)
|
||||
.SetParam1(meta)
|
||||
.SetParam2(owner->GetUniId()),
|
||||
[] (const a8::XParams& param)
|
||||
{
|
||||
Creature* c = (Creature*)param.sender.GetUserData();
|
||||
MetaData::Buff* buff_meta = (MetaData::Buff*)param.param1.GetUserData();
|
||||
Entity* caster = c->room->GetEntityByUniId(param.param2);
|
||||
if (caster && caster->IsCreature(c->room)) {
|
||||
for (int buff_id : buff_meta->param1_int_list) {
|
||||
c->TryAddBuff((Creature*)caster, buff_id);
|
||||
}
|
||||
}
|
||||
},
|
||||
&target->xtimer_attacher.timer_list_);
|
||||
}
|
||||
}
|
||||
owner->SetPos(curr_pos);
|
||||
}
|
||||
if (!meta->param2_int_list.empty()) {
|
||||
owner->room->xtimer.AddDeadLineTimerAndAttach
|
||||
|
Loading…
x
Reference in New Issue
Block a user