This commit is contained in:
aozhiwei 2021-07-21 06:54:00 +00:00
parent 0e3fccd389
commit 88258b5371

View File

@ -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