From 970a4de0d147994978ca62c89a8b30753274523c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 29 Dec 2022 15:13:10 +0800 Subject: [PATCH] 1 --- server/gameserver/buff/sprint.cc | 132 ++++++++++++++++--------------- server/gameserver/buff/sprint.h | 3 +- 2 files changed, 70 insertions(+), 65 deletions(-) diff --git a/server/gameserver/buff/sprint.cc b/server/gameserver/buff/sprint.cc index fd283c94..f362cbf8 100644 --- a/server/gameserver/buff/sprint.cc +++ b/server/gameserver/buff/sprint.cc @@ -19,7 +19,7 @@ void SprintBuff::Activate() if (caster_.Get()->IsPlayer()) { SprintMove(); - CollisionCheck(); + CoCollisionCheck(); } ProcSkill(); } @@ -72,7 +72,7 @@ void SprintBuff::SprintMove() #endif } -void SprintBuff::CollisionCheck() +void SprintBuff::CoCollisionCheck() { std::map hited_objects = std::map(); Position pre_pos; @@ -83,73 +83,77 @@ void SprintBuff::CollisionCheck() [this, hited_objects, pre_pos] (int event, const a8::Args* args) mutable { - Buff* buff = this; - if (!buff->meta->_param3_int_list.empty() || buff->skill_meta) { - std::set enemys; - Position old_pos = buff->owner->GetPos(); - - if (pre_pos.ManhattanDistance2D(buff->owner->GetPos()) > 2) { - a8::Vec2 dir = buff->owner->GetPos().CalcDir2D(pre_pos); - dir.Normalize(); - float distance = buff->owner->GetPos().Distance2D2(pre_pos); - for (int i = 0; i < (distance + 6); i += 5) { - // 999 -#if 1 -#else - buff->owner->MutablePos.FromVec2((pre_pos) + (dir * i)); -#endif - buff->owner->GetHitEnemys(enemys, buff->meta->_param4); - for (auto& enemy : enemys) { - if (enemy->IsEntityType(ET_Car)) { - continue; - } - auto itr = hited_objects.find(enemy->GetUniId()); - if (itr != hited_objects.end()) { - if ((buff->owner->room->GetFrameNo() - itr->second) * FRAME_RATE_MS < - buff->meta->_int_param5) { - continue; - } - } - hited_objects[enemy->GetUniId()] = buff->owner->room->GetFrameNo(); - for (int buff_id : buff->meta->_param3_int_list) { - enemy->TryAddBuff(buff->owner, buff_id); - } - if (buff->skill_meta) { - switch (buff->skill_meta->GetMagicId()) { - case MAGIC_YMCZ: - { - float dmg = SkillHelper::GetYmczDmg(buff->owner, - enemy, - buff->skill_meta); - if (dmg > 0.0001f) { - enemy->DecHP( - dmg, - buff->owner->GetUniId(), - buff->owner->GetName(), - 0, - buff->owner->GetUniId(), - buff->owner->GetName() - ); - } - } - break; - default: - { - } - break; - } - } - } - } - } - - buff->owner->SetPos(old_pos); - pre_pos = buff->owner->GetPos(); + if (!meta->_param3_int_list.empty() || skill_meta) { + Check(pre_pos, hited_objects); } }, &xtimer_attacher); } +void SprintBuff::Check(Position& pre_pos, std::map& hited_objects) +{ + std::set enemys; + Position old_pos = owner->GetPos(); + + if (pre_pos.ManhattanDistance2D(owner->GetPos()) > 2) { + a8::Vec2 dir = owner->GetPos().CalcDir2D(pre_pos); + dir.Normalize(); + float distance = owner->GetPos().Distance2D2(pre_pos); + for (int i = 0; i < (distance + 6); i += 5) { + // 999 +#if 1 +#else + owner->MutablePos.FromVec2((pre_pos) + (dir * i)); +#endif + owner->GetHitEnemys(enemys, meta->_param4); + for (auto& enemy : enemys) { + if (enemy->IsEntityType(ET_Car)) { + continue; + } + auto itr = hited_objects.find(enemy->GetUniId()); + if (itr != hited_objects.end()) { + if ((owner->room->GetFrameNo() - itr->second) * FRAME_RATE_MS < + meta->_int_param5) { + continue; + } + } + hited_objects[enemy->GetUniId()] = owner->room->GetFrameNo(); + for (int buff_id : meta->_param3_int_list) { + enemy->TryAddBuff(owner, buff_id); + } + if (skill_meta) { + switch (skill_meta->GetMagicId()) { + case MAGIC_YMCZ: + { + float dmg = SkillHelper::GetYmczDmg(owner, + enemy, + skill_meta); + if (dmg > 0.0001f) { + enemy->DecHP( + dmg, + owner->GetUniId(), + owner->GetName(), + 0, + owner->GetUniId(), + owner->GetName() + ); + } + } + break; + default: + { + } + break; + } + } + } + } + } + + owner->SetPos(old_pos); + pre_pos = owner->GetPos(); +} + void SprintBuff::ProcSkill() { if (skill_meta) { diff --git a/server/gameserver/buff/sprint.h b/server/gameserver/buff/sprint.h index 2d37dedc..7f36e747 100644 --- a/server/gameserver/buff/sprint.h +++ b/server/gameserver/buff/sprint.h @@ -11,7 +11,8 @@ class SprintBuff : public Buff private: void SprintMove(); - void CollisionCheck(); + void CoCollisionCheck(); + void Check(Position& pre_pos, std::map& hited_objects); void ProcSkill(); };