From a38c7b3fa62a0c5ad1f66e83742f163579222650 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 25 Oct 2022 18:19:27 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 30 ++++++++++++++++++++++++++---- server/gameserver/metadata.cc | 21 +++++++++++++++++++++ server/gameserver/metadata.h | 4 ++++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 3f200d83..13579981 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1035,8 +1035,11 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase) a8::Vec2 old_dir = GetMoveDir(); a8::Vec2 old_pos = GetPos(); if (CurrentSkill()->GetMinorType() == SMT_NONE) { - int buff_id = phase->param3.GetInt(); - TryAddBuff(this, buff_id); + int buff_id1 = phase->param3_ints.size() > 0 ? phase->param3_ints[0] : 0; + int buff_id2 = phase->param3_ints.size() > 1 ? phase->param3_ints[1] : 0; + int buff_id3 = phase->param3_ints.size() > 2 ? phase->param3_ints[2] : 0; + TryAddBuff(this, buff_id1); + int land_effect_buff_uniid = TryAddBuff(this, buff_id3); #ifdef DEBUG a8::XPrintf("old_pos:%f,%f\n", {GetPos().x, GetPos().y}); #endif @@ -1061,15 +1064,17 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase) #else phase->param2.GetInt() * 1000, #endif - [this, pre_pos, pre_dir, buff_id, skill_meta] () { + [this, pre_pos, pre_dir, buff_id1, buff_id2, buff_id3, land_effect_buff_uniid, + skill_meta] () { a8::Vec2 old_dir = GetMoveDir(); a8::Vec2 old_pos = GetPos(); float distance = GetPos().Distance(pre_pos); + RemoveBuffByUniId(land_effect_buff_uniid); if (distance > 0.0001f) { a8::Vec2 new_dir = pre_pos - GetPos(); new_dir.Normalize(); SetMoveDir(new_dir); - TryAddBuff(this, buff_id); + TryAddBuff(this, buff_id2); _UpdateMove(distance); } SetMoveDir(old_dir); @@ -1079,6 +1084,23 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase) skill_meta); } ); + room->xtimer.AddDeadLineTimerAndAttach + ( +#if 1 + skill_meta->number_meta->float_time * 1000, +#else + phase->param2.GetInt() * 1000, +#endif + a8::XParams() + .SetSender(this) + .SetParam1(land_effect_buff_uniid), + [] (const a8::XParams& param) + { + Creature* c = (Creature*)param.sender.GetUserData(); + int land_effect_buff_uniid = param.param1; + c->RemoveBuffByUniId(land_effect_buff_uniid); + }, + &xtimer_attacher.timer_list_); } SetMoveDir(old_dir); } diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index b5e854d7..18520292 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -1001,6 +1001,27 @@ namespace MetaData phase.param1 = a8::XValue(phase.param1_str); phase.param2 = a8::XValue(phase.param2_str); phase.param3 = a8::XValue(phase.param3_str); + { + std::vector strings; + a8::Split(phase.param1_str, strings, '|'); + for (auto& str : strings) { + phase.param1_ints.push_back(a8::XValue(str)); + } + } + { + std::vector strings; + a8::Split(phase.param2_str, strings, '|'); + for (auto& str : strings) { + phase.param2_ints.push_back(a8::XValue(str)); + } + } + { + std::vector strings; + a8::Split(phase.param3_str, strings, '|'); + for (auto& str : strings) { + phase.param3_ints.push_back(a8::XValue(str)); + } + } phases.push_back(phase); } } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index b8adc58d..9266f794 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -303,6 +303,10 @@ namespace MetaData std::string param1_str; std::string param2_str; std::string param3_str; + + std::vector param1_ints; + std::vector param2_ints; + std::vector param3_ints; }; struct Skill