diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 7c92ee9b..e44c62f9 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -29,6 +29,7 @@ #include "stats.h" #include "movement.h" #include "hero.h" +#include "skill.h" #include "mt/Param.h" #include "mt/Equip.h" @@ -1090,3 +1091,14 @@ void Bullet::ProcRequestBulletDmg(int shield_hit, int strength_wall_uniid, int t } } } + +const mt::Skill* Bullet::GetSkillMeta() +{ + if (sender.Get() && skill_meta) { + Skill* skill = sender.Get()->GetSkill(skill_meta->skill_id()); + if (skill) { + return skill->GetCurrSkillMeta(); + } + } + return skill_meta; +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 8b5696bd..bd95fc54 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -48,7 +48,7 @@ class Bullet : public MoveableEntity, public IBullet virtual const glm::vec3& GetDir() override { return dir; }; virtual float GetStrengthenWall() override { return strengthen_wall; }; virtual long long GetWeaponUniId() override { return weapon_uniid; }; - virtual const mt::Skill* GetSkillMeta() override {return skill_meta; }; + virtual const mt::Skill* GetSkillMeta() override; virtual const mt::Equip* GetGunMeta() override { return gun_meta; }; virtual const mt::Equip* GetBulletMeta() override { return meta; }; virtual CreatureWeakPtr GetSender() override { return sender; }; diff --git a/server/gameserver/lispenv.cc b/server/gameserver/lispenv.cc index e728d280..49dda9a0 100644 --- a/server/gameserver/lispenv.cc +++ b/server/gameserver/lispenv.cc @@ -6,6 +6,7 @@ #include "creature.h" #include "glmhelper.h" #include "room.h" +#include "skill.h" #include "mt/Skill.h" #include "mt/SkillNumber.h" @@ -27,7 +28,16 @@ public: } a8::lisp::Atom atom = std::any_cast(params->at(0)->value); int idx = atom.val; - result = context_.buff->skill_meta->_number_meta->GetAttrByIdx(idx); + if (context_.buff->GetCaster().Get()) { + Skill* skill = context_.buff->GetCaster().Get()->GetSkill(context_.buff->skill_meta->skill_id()); + if (skill) { + result = skill->GetCurrSkillMeta()->_number_meta->GetAttrByIdx(idx); + } else { + result = context_.buff->skill_meta->_number_meta->GetAttrByIdx(idx); + } + } else { + result = context_.buff->skill_meta->_number_meta->GetAttrByIdx(idx); + } return std::make_shared(a8::lisp::Atom(result)); }); RegisterCProc diff --git a/server/gameserver/virtualbullet.cc b/server/gameserver/virtualbullet.cc index 37aea5ad..f06ca507 100644 --- a/server/gameserver/virtualbullet.cc +++ b/server/gameserver/virtualbullet.cc @@ -10,6 +10,7 @@ #include "human.h" #include "stats.h" #include "hero.h" +#include "skill.h" #include "mt/Param.h" #include "mt/Buff.h" @@ -30,6 +31,12 @@ long long VirtualBullet::GetWeaponUniId() const mt::Skill* VirtualBullet::GetSkillMeta() { + if (sender.Get() && skill_meta) { + Skill* skill = sender.Get()->GetSkill(skill_meta->skill_id()); + if (skill) { + return skill->GetCurrSkillMeta(); + } + } return skill_meta; }