diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 422c545e..a82f4656 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -2452,6 +2452,9 @@ void Creature::SummonObstacle(Buff* buff, int id, const a8::Vec2& target_pos) } obstacle->context_ability = context_ability; slave_things_.push_back(std::make_tuple(buff->meta->i->buff_id(), obstacle)); + if (buff->skill_meta) { + SkillHelper::ProcSummonObstacle(buff->skill_meta, obstacle); + } #ifdef DEBUG SendDebugMsg(a8::Format("召唤物件 buff_id:%d thing_id:%d pos:%f,%f target_pos:%f,%f", {buff->meta->i->buff_id(), diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index d491c086..30cd7592 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -1053,12 +1053,12 @@ namespace MetaData } } - int Skill::GetMagicId() + int Skill::GetMagicId() const { return magic_id; } - bool Skill::IsTurnOverSkill() + bool Skill::IsTurnOverSkill() const { return !phases.empty() && phases[0].func_id == kSkill_TurnOver; } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index e7709b9f..95efe434 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -318,8 +318,8 @@ namespace MetaData std::set buff_list; std::map> trigger_type_buffs; std::vector phases; - bool IsTurnOverSkill(); - int GetMagicId(); + bool IsTurnOverSkill() const; + int GetMagicId() const; private: int magic_id = 0; int base_skill_id = 0; diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index 4da7ef9c..7d61bbf9 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -362,7 +362,7 @@ void RoomObstacle::Active() break; } if (meta->i->life_time() > 0) { - room->xtimer.AddDeadLineTimerAndAttach + xtimer_list* timer = room->xtimer.AddDeadLineTimerAndAttach ( meta->i->life_time() / FRAME_RATE_MS, a8::XParams() @@ -374,6 +374,7 @@ void RoomObstacle::Active() }, &xtimer_attacher.timer_list_ ); + life_time_timer = room->xtimer.GetTimerPtr(timer); } } diff --git a/server/gameserver/roomobstacle.h b/server/gameserver/roomobstacle.h index 9a655b03..942a6ab6 100644 --- a/server/gameserver/roomobstacle.h +++ b/server/gameserver/roomobstacle.h @@ -25,6 +25,7 @@ class RoomObstacle : public Obstacle MetaData::Buff* buff_meta = nullptr; MetaData::Skill* skill_meta = nullptr; long long born_frameno = 0; + std::weak_ptr life_time_timer; virtual ~RoomObstacle() override; virtual void Initialize() override; diff --git a/server/gameserver/skillhelper.cc b/server/gameserver/skillhelper.cc index b1913e0c..496db7d7 100644 --- a/server/gameserver/skillhelper.cc +++ b/server/gameserver/skillhelper.cc @@ -7,6 +7,7 @@ #include "skill.h" #include "metadata.h" #include "room.h" +#include "roomobstacle.h" std::map SkillHelper::magic_skill_hash_; std::map SkillHelper::skill_magic_hash_; @@ -282,3 +283,26 @@ bool SkillHelper::ProcBulletDmg(Bullet* bullet, Creature* target, float& finaly_ } return false; } + +void SkillHelper::ProcSummonObstacle(const MetaData::Skill* skill_meta, RoomObstacle* ob) +{ + if (!skill_meta || skill_meta->number_meta) { + return; + } + switch (skill_meta->GetMagicId()) { + case MAGIC_WLFB: + case MAGIC_YLZ: + { + if (!ob->life_time_timer.expired()) { + ob->room->xtimer.ModifyTimer(ob->life_time_timer, + skill_meta->number_meta->float_time * 1000 / FRAME_RATE_MS); + } + } + break; + default: + { + } + break; + } + +} diff --git a/server/gameserver/skillhelper.h b/server/gameserver/skillhelper.h index a8178812..4ce42cbe 100644 --- a/server/gameserver/skillhelper.h +++ b/server/gameserver/skillhelper.h @@ -7,6 +7,7 @@ namespace MetaData class Bullet; class Creature; +class RoomObstacle; class SkillHelper { public: @@ -36,6 +37,7 @@ class SkillHelper static void ProcBulletHitBuff(Bullet* bullet, Creature* c, int buff_uniid); static bool ProcBulletDmg(Bullet* bullet, Creature* target, float& finaly_dmg); + static void ProcSummonObstacle(const MetaData::Skill* skill_meta, RoomObstacle* ob); private: diff --git a/third_party/a8engine b/third_party/a8engine index cf4607dd..9d9efccd 160000 --- a/third_party/a8engine +++ b/third_party/a8engine @@ -1 +1 @@ -Subproject commit cf4607dd902bcca2ec8e849b51a1968ffb2dc0ca +Subproject commit 9d9efccd69f5a81ac2905617d2fe4d197394f27c