diff --git a/src/map/lua/lua_baseentity.cpp b/src/map/lua/lua_baseentity.cpp index 5439d84c9e3..2010a4f1473 100644 --- a/src/map/lua/lua_baseentity.cpp +++ b/src/map/lua/lua_baseentity.cpp @@ -16587,15 +16587,32 @@ void CLuaBaseEntity::useMobAbility(sol::variadic_args va) // clang-format off m_PBaseEntity->PAI->QueueAction(queueAction_t(0ms, true, [PTarget, skillid, PMobSkill](auto PEntity) { - if (PTarget) + auto mobObj = dynamic_cast(PEntity); + + // has both a valid target (specified by user and mob) + if (PTarget && mobObj) { - PEntity->PAI->MobSkill(PTarget->targid, skillid); + float currentDistance = distance(mobObj->loc.p, PTarget->loc.p); + if (currentDistance <= PMobSkill->getDistance()) + { + PEntity->PAI->MobSkill(PTarget->targid, skillid); + } } - else if (dynamic_cast(PEntity)) + // does not have a specified target so default to current battle target + else if (mobObj) { if (PMobSkill->getValidTargets() & TARGET_ENEMY) { - PEntity->PAI->MobSkill(static_cast(PEntity)->GetBattleTargetID(), skillid); + auto defaultTarget = mobObj->GetBattleTarget(); + if (defaultTarget) + { + // check distance from player or mob will use TP move and 'lock' itself + float currentDistance = distance(mobObj->loc.p, defaultTarget->loc.p); + if (currentDistance <= PMobSkill->getDistance()) + { + PEntity->PAI->MobSkill(defaultTarget->targid, skillid); + } + } } else if (PMobSkill->getValidTargets() & TARGET_SELF) {