diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 107e8849..1b8fc381 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1006,6 +1006,7 @@ void Creature::DoSkill(int skill_id, curr_skill_ = skill; playing_skill = true; skill_pos = GetPos().ToGlmVec3(); + skill->skill_pos = skill_pos; context_dir = skill_dir_; context_pos = GetPos(); context_pos.AddGlmVec3(skill_dir_ * skill_distance_); diff --git a/server/gameserver/lispenv.cc b/server/gameserver/lispenv.cc index 2652b6d2..7acba94d 100644 --- a/server/gameserver/lispenv.cc +++ b/server/gameserver/lispenv.cc @@ -169,7 +169,15 @@ public: { double result = 0.0f; if (context_.buff->GetCaster().Get()) { - result = context_.buff->GetCaster().Get()->skill_pos.x; + if (context_.buff->GetCaster().Get() && context_.buff->skill_meta) { + Skill* skill = context_.buff->GetCaster().Get()->GetSkill + (context_.buff->skill_meta->skill_id()); + if (skill) { + result = skill->skill_pos.x; + } + } else { + result = context_.buff->GetCaster().Get()->skill_pos.x; + } } return std::make_shared(a8::lisp::Atom(result)); }); @@ -180,7 +188,15 @@ public: { double result = 0.0f; if (context_.buff->GetCaster().Get()) { - result = context_.buff->GetCaster().Get()->skill_pos.y; + if (context_.buff->GetCaster().Get() && context_.buff->skill_meta) { + Skill* skill = context_.buff->GetCaster().Get()->GetSkill + (context_.buff->skill_meta->skill_id()); + if (skill) { + result = skill->skill_pos.y; + } + } else { + result = context_.buff->GetCaster().Get()->skill_pos.y; + } } return std::make_shared(a8::lisp::Atom(result)); }); @@ -191,7 +207,15 @@ public: { double result = 0.0f; if (context_.buff->GetCaster().Get()) { - result = context_.buff->GetCaster().Get()->skill_pos.z; + if (context_.buff->GetCaster().Get() && context_.buff->skill_meta) { + Skill* skill = context_.buff->GetCaster().Get()->GetSkill + (context_.buff->skill_meta->skill_id()); + if (skill) { + result = skill->skill_pos.z; + } + } else { + result = context_.buff->GetCaster().Get()->skill_pos.z; + } } return std::make_shared(a8::lisp::Atom(result)); }); diff --git a/server/gameserver/skill.h b/server/gameserver/skill.h index 449b66df..587cc31a 100644 --- a/server/gameserver/skill.h +++ b/server/gameserver/skill.h @@ -26,6 +26,7 @@ class Skill long long last_use_frameno = 0; a8::Attacher xtimer_attacher; int force_use_times = 0; + glm::vec3 skill_pos = glm::vec3(0.0f, 0.0f, 0.0f); void Initialzie(); void SetMeta(const mt::Skill* meta);