LinkLuaModifier("modifier_custom_ability", "path/to/modifier_custom_ability.lua", LUA_MODIFIER_MOTION_NONE)
custom_ability = class({})
function custom_ability:GetBehavior()
return DOTA_ABILITY_BEHAVIOR_POINT + DOTA_ABILITY_BEHAVIOR_DIRECTIONAL
end
function custom_ability:OnSpellStart()
local caster = self:GetCaster()
local point = self:GetCursorPosition()
local direction = (point - caster:GetAbsOrigin()):Normalized()
-- Создаем модификатор для применения способности
caster:AddNewModifier(caster, self, "modifier_custom_ability", { duration = self:GetSpecialValueFor("duration") })
-- Применяем способность в направлении курсора
caster:SetForwardVector(direction)
end
modifier_custom_ability = class({})
function modifier_custom_ability:IsHidden()
return true
end
function modifier_custom_ability:OnCreated()
if not IsServer() then return end
local caster = self:GetCaster()
local ability = self:GetAbility()
local direction = caster:GetForwardVector()
-- Применяем эффект способности в направлении курсора
local projectile_info = {
Ability = ability,
EffectName = "particles/custom_ability_effect.vpcf",
vSpawnOrigin = caster:GetAbsOrigin(),
fDistance = ability:GetSpecialValueFor("range"),
fStartRadius = ability:GetSpecialValueFor("start_radius"),
fEndRadius = ability:GetSpecialValueFor("end_radius"),
Source = caster,
bHasFrontalCone = false,
bReplaceExisting = false,
iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
bDeleteOnHit = true,
vVelocity = direction * ability:GetSpecialValueFor("speed"),
bProvidesVision = false,
}
ProjectileManager:CreateLinearProjectile(projectile_info)
end
function modifier_custom_ability:OnDestroy()
if not IsServer() then return end
-- Здесь можно добавить дополнительные действия при окончании способности
end