From b712fd0edc645fc047f5b4c9d10bdd625a28e6e8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 28 May 2021 10:24:23 +0800 Subject: [PATCH] 1 --- server/gameserver/buff.cc | 24 ++++++++++++++++++++++-- server/gameserver/creature.cc | 14 ++++++++++++++ server/gameserver/creature.h | 1 + 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 83d5d7b..2aecdb4 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -415,8 +415,28 @@ void Buff::ProcTurnOver(Creature* caster) //穿墙 } else { owner->_UpdateMove(distance); - if (!meta->param2_int_list.empty()) { - + } + if (!meta->param2_int_list.empty()) { + int time = 0; + float moved_distance = owner->GetPos().Distance(old_pos); + if (std::abs(moved_distance) > 0.01f) { + time = ((moved_distance / distance) * meta->param3) / FRAME_RATE_MS; } + owner->room->xtimer.AddDeadLineTimerAndAttach + ( + time, + a8::XParams() + .SetSender(owner) + .SetParam1(meta), + [] (const a8::XParams& param) + { + Creature* c = (Creature*)param.sender.GetUserData(); + MetaData::Buff* buff_meta = (MetaData::Buff*)param.param1.GetUserData(); + for (int buff_id : buff_meta->param2_int_list) { + c->TryAddBuff(c, buff_id); + } + }, + &owner->xtimer_attacher.timer_list_ + ); } } diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index c595044..4bfb03c 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1796,3 +1796,17 @@ void Creature::AddHp(float hp) } } +bool Creature::TryMove(const a8::Vec2& target_pos, a8::Vec2& out_pos) +{ + bool move_ok = false; + a8::Vec2 old_pos = GetPos(); + out_pos = GetPos(); + + SetPos(target_pos); + if (CollisonDetection()) { + out_pos = target_pos; + move_ok = true; + } else { + } + return move_ok; +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 4376815..938df6c 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -174,6 +174,7 @@ class Creature : public MoveableEntity float GetHP(); float GetMaxHP(); void GetHitEnemys(std::set& enemys); + bool TryMove(const a8::Vec2& target_pos, a8::Vec2& out_pos); private: