184 lines
6.8 KiB
Lua
Executable File
184 lines
6.8 KiB
Lua
Executable File
function OnFuto01AttackLanded(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local target = keys.target
|
|
|
|
if caster.thtd_futo_01_effct_index == nil then
|
|
caster.thtd_futo_01_effct_index = 1
|
|
end
|
|
|
|
if caster.thtd_futo_01_effct_index == 1 then
|
|
local damage = caster:THTD_GetStarDamage() * keys.damage1 * (1 + GetFuto02Buff(caster))
|
|
local targets =
|
|
FindUnitsInLine(
|
|
caster:GetTeamNumber(),
|
|
target:GetOrigin(),
|
|
target:GetOrigin() + 800 * -target:GetForwardVector(),
|
|
nil,
|
|
200,
|
|
keys.ability:GetAbilityTargetTeam(),
|
|
keys.ability:GetAbilityTargetType(),
|
|
keys.ability:GetAbilityTargetFlags()
|
|
)
|
|
for k,v in pairs(targets) do
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = v,
|
|
attacker = caster,
|
|
damage = damage,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
end
|
|
elseif caster.thtd_futo_01_effct_index == 2 then
|
|
if caster.__foto_lock ~= true then
|
|
caster.__foto_lock = true
|
|
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),1200)
|
|
local damage = caster:THTD_GetStarDamage() * keys.damage2 * (1 + GetFuto02Buff(caster))
|
|
for i=1,#targets do
|
|
local unit = targets[i]
|
|
if unit~=nil and unit:IsNull()==false and unit~=target and unit:IsAlive() then
|
|
caster:PerformAttack(unit,false,false,false,false,true,false,false)
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = unit,
|
|
attacker = caster,
|
|
damage = damage,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
end
|
|
end
|
|
caster.__foto_lock = false
|
|
end
|
|
elseif caster.thtd_futo_01_effct_index == 3 then
|
|
local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range)
|
|
local damage = caster:THTD_GetStarDamage() * keys.damage3 * 0.3 * (1 + GetFuto02Buff(caster))
|
|
for k,v in pairs(targets) do
|
|
local time = keys.duration_time
|
|
v:AddPoison(1, caster)
|
|
v:SetContextThink(DoUniqueString("thtd_futo_01_damage_think"),
|
|
function()
|
|
if GameRules:IsGamePaused() then return 0.03 end
|
|
if time <= 0 then
|
|
v:AddPoison(-1)
|
|
return nil
|
|
end
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = v,
|
|
attacker = caster,
|
|
damage = damage,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
time = time - 0.3
|
|
return 0.3
|
|
end,
|
|
0.3)
|
|
end
|
|
elseif caster.thtd_futo_01_effct_index == 4 then
|
|
local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range)
|
|
local damage = caster:THTD_GetStarDamage() * keys.damage4 * (1 + GetFuto02Buff(caster))
|
|
for k,v in pairs(targets) do
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = v,
|
|
attacker = caster,
|
|
damage = damage,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
end
|
|
|
|
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_futo/ability_thtd_futo_01_fire.vpcf", PATTACH_CUSTOMORIGIN, target)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin())
|
|
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
|
elseif caster.thtd_futo_01_effct_index == 5 then
|
|
local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range)
|
|
for k,v in pairs(targets) do
|
|
if not v:HasModifier("modifier_futo_01_lock") then
|
|
keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_futo_01_lock", {Duration = 1.0})
|
|
UnitStunTarget(caster,v,keys.stun_time)
|
|
end
|
|
end
|
|
elseif caster.thtd_futo_01_effct_index == 6 then
|
|
local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range)
|
|
local damage = keys.attack_damage * keys.crit * (1 + GetFuto02Buff(caster))
|
|
for k,v in pairs(targets) do
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = v,
|
|
attacker = caster,
|
|
damage = damage,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
SendOverheadEventMessage(caster:GetPlayerOwner(), OVERHEAD_ALERT_CRITICAL, v, damage, caster:GetPlayerOwner() )
|
|
end
|
|
end
|
|
|
|
caster.thtd_futo_01_effct_index = RandomInt(1,6)
|
|
caster:SetRangedProjectileName("particles/heroes/thtd_futo/ability_futo_base_attack_"..caster.thtd_futo_01_effct_index..".vpcf")
|
|
end
|
|
|
|
function OnFuto02Kill(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local modifier = caster:FindModifierByName("modifier_futo_02_buff")
|
|
if modifier==nil then
|
|
modifier = keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_futo_02_buff", {Duration = keys.duration_time})
|
|
modifier:SetStackCount(1)
|
|
else
|
|
if modifier:GetStackCount() < keys.max_count then
|
|
modifier:SetStackCount(modifier:GetStackCount()+1)
|
|
end
|
|
modifier:SetDuration(keys.duration_time,false)
|
|
end
|
|
end
|
|
|
|
function GetFuto02Buff(caster)
|
|
local modifier = caster:FindModifierByName("modifier_futo_02_buff")
|
|
if modifier~=nil then
|
|
return modifier:GetStackCount() * caster:GetAbilityValue("thtd_futo_02", "damage_up", true)
|
|
end
|
|
return 0
|
|
end
|
|
|
|
function OnFuto03SpellStart(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local targetPoint = keys.target_points[1]
|
|
|
|
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_futo/ability_thtd_futo_03.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, targetPoint)
|
|
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
|
|
|
local time = keys.duration_time
|
|
caster:SetContextThink(DoUniqueString("thtd_futo_03_spell_think"),
|
|
function()
|
|
if GameRules:IsGamePaused() then return 0.03 end
|
|
if time <= 0 then return nil end
|
|
local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range)
|
|
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 * (1 + GetFuto02Buff(caster))
|
|
if caster:HasModifier("modifier_miko_02_buff") and caster.thtd_miko_buff_futo03 ~= nil then
|
|
damage = damage * (1 + caster.thtd_miko_buff_futo03/100)
|
|
end
|
|
for k,v in pairs(targets) do
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = v,
|
|
attacker = caster,
|
|
damage = damage,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
end
|
|
time = time - 0.2
|
|
return 0.2
|
|
end,
|
|
0)
|
|
end |