From af4e7708c773436680f11f1f249e7023fc420248 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 20 Jul 2021 10:15:00 +0000 Subject: [PATCH] =?UTF-8?q?=E7=BF=BB=E6=BB=9AOk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.cc | 31 ++++++++++++++++++------------- server/gameserver/creature.cc | 31 +++++++++++++++++++++++++++++++ server/gameserver/creature.h | 1 + 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index acbdf11..3f1fd8d 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -464,20 +464,18 @@ void Buff::ProcTurnOver() a8::Vec2 old_pos = owner->GetPos(); float distance = owner->HasBuffEffect(kBET_Car) ? phase->param1.GetDouble() * 1.5 : phase->param1.GetDouble(); - if (meta->int_param1 == 1) { - //穿墙 - } else { - owner->_UpdateMove(distance); + 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) { + + } } 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, + meta->int_param4 / FRAME_RATE_MS, a8::XParams() .SetSender(owner) .SetParam1(meta), @@ -485,9 +483,16 @@ void Buff::ProcTurnOver() { 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); - } + c->TraverseCreatures + ( + [c, buff_meta] (Creature* target, bool& stop) + { + if (c->GetPos().Distance(target->GetPos()) < buff_meta->int_param3) { + for (int buff_id : buff_meta->param2_int_list) { + target->TryAddBuffWithTarget(c, buff_id); + } + } + }); }, &owner->xtimer_attacher.timer_list_ ); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 04b43e0..79d51de 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -410,6 +410,37 @@ int Creature::TryAddBuff(Creature* caster, int buff_id) return -1; } +int Creature::TryAddBuffWithTarget(Creature* caster, int buff_id) +{ + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (buff_meta) { + bool be_add = false; + switch (buff_meta->i->buff_target()) { + case kBuffTargetSelf: + { + be_add = caster == this; + } + break; + case kBuffTargetFriendly: + { + team_id == caster->team_id; + } + break; + case kBuffTargetEnemy: + { + team_id != caster->team_id; + } + break; + default: + { + } + break; + } + return TryAddBuff(caster, buff_id); + } + return -1; +} + void Creature::RemoveBuffById(int buff_id) { int buff_uniid = 0; diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 864e8ec..0ff67ab 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -103,6 +103,7 @@ class Creature : public MoveableEntity bool IsImmuneBuffEffect(int buff_effect); int MustBeAddBuff(Creature* caster, int buff_id); int TryAddBuff(Creature* caster, int buff_id); + int TryAddBuffWithTarget(Creature* caster, int buff_id); void RemoveBuffById(int buff_id); void RemoveBuffByUniId(int buff_uniid); void ClearBuffById(int buff_id);