diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index a502d5f..d602317 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -472,6 +472,11 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& skill_dir, c RemoveBuffByEffectId(kBET_Camouflage); } DoSkillPostProc(true, skill_id, target_id, target_pos); + if (skill_id != TURN_OVER_SKILL_ID) { + CreatureWeakPtr ptr; + ptr.Attach(this); + room->frame_event.AddPlaySkill(ptr, skill_id); + } } else { DoSkillPostProc(false, skill_id, target_id, target_pos); } diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index f7dc666..f9b3f63 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -160,6 +160,28 @@ void FrameEvent::AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos) } } +void FrameEvent::AddPlaySkill(CreatureWeakPtr& sender, int skill_id) +{ + if (!sender.Get()) { + return; + } + { + auto& tuple = a8::FastAppend(play_skills_); + std::get<0>(tuple).Attach(sender.Get()); + auto& p = std::get<1>(tuple); + p.set_skill_id(skill_id); + } + { + int idx = play_skills_.size() - 1; + sender.Get()->TouchAllLayerHumanList + ( + [idx] (Human* hum, bool& stop) + { + hum->play_skills_.push_back(idx); + }); + } +} + void FrameEvent::AddHpChg(Human* sender) { chged_hps_.push_back(sender); @@ -325,6 +347,9 @@ void FrameEvent::Clear() if (!smokes_.empty()) { smokes_.clear(); } + if (!play_skills_.empty()) { + play_skills_.clear(); + } if (!emotes_.empty()) { emotes_.clear(); } diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index d9be0c6..2fe8849 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -22,6 +22,7 @@ public: float fly_distance); void AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_pos); void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos); + void AddPlaySkill(CreatureWeakPtr& sender, int skill_id); void AddExplosionEx(CreatureWeakPtr& sender, int item_id, a8::Vec2 bomb_pos, int effect); void AddBulletNumChg(Human* hum); void AddHpChg(Human* hum); @@ -42,6 +43,7 @@ private: std::vector> bullets_; std::vector> explosions_; std::vector> smokes_; + std::vector> play_skills_; std::vector> emotes_; std::vector> chged_buffs_; std::vector> chged_items_; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 9c44176..823846f 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -96,6 +96,14 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) } } } + for (size_t idx : hum->play_skills_) { + if (idx < room->frame_event.play_skills_.size()) { + auto& tuple = room->frame_event.play_skills_[idx]; + if (std::get<0>(tuple).Get() && hum->CanSee(std::get<0>(tuple).Get())) { + *msg->add_play_skill_list() = std::get<1>(tuple); + } + } + } for (size_t idx : hum->emotes_) { if (idx < room->frame_event.emotes_.size()) { auto& tuple = room->frame_event.emotes_[idx]; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index ebd2ba5..19a7954 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2029,6 +2029,9 @@ void Human::ClearFrameData() if (!smokes_.empty()) { smokes_.clear(); } + if (!play_skills_.empty()) { + play_skills_.clear(); + } if (!emotes_.empty()) { emotes_.clear(); } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 6b6c758..960f925 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -308,6 +308,7 @@ protected: std::vector emotes_; std::vector bullets_; std::vector smokes_; + std::vector play_skills_; std::vector explosions_; std::vector chged_buffs_; std::set observers_;