From 88258b53718a78bf8b74b6c37fdd3f7c0b93e254 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 21 Jul 2021 06:54:00 +0000 Subject: [PATCH] 1 --- server/gameserver/buff.cc | 48 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 3f1fd8d..3abb67c 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -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 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 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