From 710ea892d09ce72aeccb85ab179b9cce2e1440fd Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 1 Mar 2023 16:37:02 +0800 Subject: [PATCH] 1 --- server/gameserver/buff/sprint.cc | 42 ++++++++++++++++++++++++++------ server/gameserver/buff/sprint.h | 3 +-- server/gameserver/human.cc | 6 ----- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/server/gameserver/buff/sprint.cc b/server/gameserver/buff/sprint.cc index 6bf7feac..dd8bbfff 100644 --- a/server/gameserver/buff/sprint.cc +++ b/server/gameserver/buff/sprint.cc @@ -7,9 +7,11 @@ #include "skill.h" #include "room.h" #include "human.h" +#include "ability.h" #include "mt/Buff.h" #include "mt/Skill.h" +#include "mt/SkillNumber.h" void SprintBuff::Activate() { @@ -100,22 +102,23 @@ void SprintBuff::CoCollisionCheck() std::map hited_objects = std::map(); Position pre_pos; pre_pos = owner->GetPos(); + Position src_pos = owner->GetPos(); owner->room->xtimer.SetIntervalEx ( 1, - [this, hited_objects, pre_pos] + [this, hited_objects, pre_pos, src_pos] (int event, const a8::Args* args) mutable { if (a8::TIMER_EXEC_EVENT == event) { if (!meta->_buff_param3_int_list.empty() || skill_meta) { - Check(pre_pos, hited_objects); + Check(pre_pos, src_pos, hited_objects); } } }, &xtimer_attacher); } -void SprintBuff::Check(Position& pre_pos, std::map& hited_objects) +void SprintBuff::Check(Position& pre_pos, Position& src_pos, std::map& hited_objects) { if (pre_pos.ManhattanDistance2D(owner->GetPos()) < 2) { ++stop_times_; @@ -134,6 +137,32 @@ void SprintBuff::Check(Position& pre_pos, std::map& hited_object return; } stop_times_ = 0; + if (skill_meta) { + switch (skill_meta->GetMagicId()) { + case MAGIC_20901_XIONG: + { + float moved_distance = owner->GetPos().Distance2D2(src_pos); + if (moved_distance >= skill_meta->_number_meta->_float_range) { + owner->room->xtimer.SetTimeoutEx + ( + 1, + [this] (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + owner->RemoveBuffByUniId(buff_uniid); + } + }, + &xtimer_attacher); + } + return; + } + break; + default: + { + } + break; + } + } glm::vec3 dir = owner->GetPos().ToGlmVec3() - pre_pos.ToGlmVec3(); dir.y = 0.0f; @@ -204,6 +233,7 @@ void SprintBuff::ProcSkill() owner->room->xtimer.ModifyTime (remover_timer, SkillHelper::GetYmczBuffTime(skill_meta) / FRAME_RATE_MS); + owner->GetAbility()->AddSpeedAddition(skill_meta->_number_meta->_float_speed); } break; default: @@ -218,9 +248,5 @@ void SprintBuff::ProcSkill() void SprintBuff::ProcXiongHun() { owner->TryAddBuff(owner, 209016); -} - -float SprintBuff::GetSpeed() -{ - return meta->_buff_param2; + owner->GetAbility()->DelSpeedAddition(skill_meta->_number_meta->_float_speed); } diff --git a/server/gameserver/buff/sprint.h b/server/gameserver/buff/sprint.h index 40f1c8fa..bc8e117e 100644 --- a/server/gameserver/buff/sprint.h +++ b/server/gameserver/buff/sprint.h @@ -8,12 +8,11 @@ class SprintBuff : public Buff virtual void Activate() override; virtual void Deactivate() override; - float GetSpeed(); private: void SprintMove(); void CoCollisionCheck(); - void Check(Position& pre_pos, std::map& hited_objects); + void Check(Position& pre_pos, Position& src_pos, std::map& hited_objects); void OnEnemyHit(Creature* enemy); void ProcSkill(); void ProcXiongHun(); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index f7e7a704..fc8d8a4f 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -492,12 +492,6 @@ float Human::GetSpeed() return buff->meta->_buff_param2; } } - { - Buff* buff = GetBuffByEffectId(kBET_Sprint); - if (buff) { - return ((SprintBuff*)buff)->GetSpeed(); - } - } float speed = 1.0; if (downed) { speed = meta->move_speed3();