111 lines
3.8 KiB
Lua
Executable File
111 lines
3.8 KiB
Lua
Executable File
|
|
--[[ abilities/traps/arrow.lua ]]
|
|
|
|
arrow = class({})
|
|
|
|
----------------------------------------------------------------------------------------
|
|
|
|
function arrow:Precache( context )
|
|
|
|
PrecacheResource( "particle", "particles/traps/temple_trap_arrow.vpcf", context )
|
|
PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context )
|
|
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function arrow:OnSpellStart()
|
|
self.start_radius = self:GetSpecialValueFor( "start_radius" )
|
|
self.end_radius = self:GetSpecialValueFor( "end_radius" )
|
|
self.speed = self:GetLevelSpecialValueFor( "speed", GameRules.Aghanim:GetAscensionLevel() )
|
|
self.max_hp_pct_damage = self:GetLevelSpecialValueFor( "max_hp_pct_damage", GameRules.Aghanim:GetAscensionLevel() )
|
|
--printf( "ascension level: %d; speed: %d; percent damage: %d", GameRules.Aghanim:GetAscensionLevel(), self.speed, self.max_hp_pct_damage )
|
|
|
|
local vPos = nil
|
|
if self:GetCursorTarget() then
|
|
vPos = self:GetCursorTarget():GetOrigin()
|
|
else
|
|
vPos = self:GetCursorPosition()
|
|
end
|
|
|
|
local fRangeToTarget = ( self:GetCaster():GetOrigin() - vPos ):Length2D()
|
|
|
|
local vDirection = vPos - self:GetCaster():GetOrigin()
|
|
vDirection.z = 0.0
|
|
vDirection = vDirection:Normalized()
|
|
|
|
self.speed = self.speed * ( ( fRangeToTarget ) / ( fRangeToTarget -self.start_radius ) )
|
|
|
|
local info = {
|
|
EffectName = "particles/traps/temple_trap_arrow.vpcf",
|
|
Ability = self,
|
|
vSpawnOrigin = self:GetCaster():GetOrigin(),
|
|
fStartRadius = self.start_radius,
|
|
fEndRadius = self.end_radius,
|
|
vVelocity = vDirection * self.speed,
|
|
fDistance = fRangeToTarget,
|
|
Source = self:GetCaster(),
|
|
iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
|
|
iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
|
|
}
|
|
|
|
ProjectileManager:CreateLinearProjectile( info )
|
|
|
|
EmitSoundOn( "AghanimsFortress.FireTrap", self:GetCaster() )
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function arrow:OnProjectileHit( hTarget, vLocation )
|
|
if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then
|
|
if hTarget:HasModifier( "modifier_treasure_chest" ) then
|
|
return false
|
|
end
|
|
|
|
--[[
|
|
local modifierKnockback =
|
|
{
|
|
center_x = vLocation.x,
|
|
center_y = vLocation.y,
|
|
center_z = vLocation.z,
|
|
duration = 0.3,
|
|
knockback_duration = 0.3,
|
|
knockback_distance = 450,
|
|
knockback_height = 50,
|
|
}
|
|
hTarget:AddNewModifier( hTarget, nil, "modifier_knockback", modifierKnockback )
|
|
]]
|
|
|
|
local fMaxHealth = hTarget:GetMaxHealth()
|
|
local fDamage = math.ceil( fMaxHealth * ( self.max_hp_pct_damage / 100.0 ) )
|
|
--printf( "arrow:OnProjectileHit - applying %.2f damage to target with %.2f max health", fDamage, fMaxHealth )
|
|
|
|
local damageSource = self:GetCaster()
|
|
local damage = {
|
|
victim = hTarget,
|
|
attacker = damageSource,
|
|
damage = fDamage,
|
|
damage_type = DAMAGE_TYPE_PURE,
|
|
ability = self
|
|
}
|
|
ApplyDamage( damage )
|
|
|
|
if not ( hTarget:IsNull() ) and hTarget ~= nil then
|
|
local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil )
|
|
ParticleManager:SetParticleControlEnt( nFXIndex, 0, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetOrigin(), true )
|
|
ParticleManager:SetParticleControl( nFXIndex, 1, hTarget:GetOrigin() )
|
|
ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() )
|
|
ParticleManager:SetParticleControlEnt( nFXIndex, 10, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true )
|
|
ParticleManager:ReleaseParticleIndex( nFXIndex )
|
|
|
|
EmitSoundOn( "Dungeon.BloodSplatterImpact", hTarget )
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|