Files
2HUCardTDGame/game/scripts/vscripts/abilities/abilitykomachi.lua
2021-11-10 08:48:00 -05:00

292 lines
9.8 KiB
Lua
Executable File

function OnAttackKomachi01(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local effectIndex = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_02.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex , 0, caster:GetOrigin())
ParticleManager:SetParticleControl(effectIndex , 1, caster:GetOrigin())
ParticleManager:SetParticleControlForward(effectIndex, 1, caster:GetForwardVector())
ParticleManager:DestroyParticleSystem(effectIndex, false)
end
function OnAttackLandedKomachi01(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local range = caster:Script_GetAttackRange()
local targets = THTD_FindUnitsInRadius(caster,caster:GetAbsOrigin(),range)
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)
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
end
function OnCreatedKomachi01Buff(keys)
-- 被动需要加延时确保在初始化之后
keys.target:SetContextThink(DoUniqueString("dota_timer"),
function()
if GameRules:IsGamePaused() then return 0.1 end
keys.target:THTD_AddCritChance(keys.chance, "thtd_komachi_01_chance")
return nil
end,
0.3)
end
function OnThinkKomachi01(keys)
local caster = keys.caster
local range = caster:Script_GetAttackRange()
local targets = THTD_FindUnitsInRadius(caster,caster:GetAbsOrigin(),range)
local crit = 0
local chance = 0
for k,v in pairs(targets) do
local lostHp = 100 - v:GetHealthPercent()
crit = crit + math.floor(lostHp/4) * keys.crit_bonus
end
caster:THTD_AddCritDamage(crit, "thtd_komachi_01_bonus")
end
function OnSpellStartKomachi02(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local targetPoint = keys.target_points[1]
local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_dark_seer/dark_seer_vacuum.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 0, targetPoint)
ParticleManager:SetParticleControl(effectIndex, 1, Vector(keys.radius,0, 0))
caster:EmitSound("Hero_Dark_Seer.Vacuum")
local time = math.floor(keys.duration_time * 100 + 0.5) / 100
local tick = 0.03
caster:SetContextThink(DoUniqueString("thtd_komachi_02"),
function()
if THTD_IsValid(caster) == false then
ParticleManager:DestroyParticleSystem(effectIndex, true)
return nil
end
if time < 0 then
ParticleManager:DestroyParticleSystem(effectIndex, true)
caster:StopSound("Hero_Dark_Seer.Vacuum")
targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius)
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)
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
return nil
end
local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius)
for k, v in pairs(targets) do
local distance = (v:GetAbsOrigin() - targetPoint):Length2D()
local in_pull = 700
local new_pos = GetGroundPosition(v:GetAbsOrigin(), v)
if distance > 20 then
local direction = (targetPoint - new_pos):Normalized()
direction.z = 0.0
new_pos = new_pos + direction * in_pull * tick
end
v:SetOrigin(new_pos)
end
time = time - tick
return tick
end,
0)
end
function OnSpellStartKomachi03(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local targetUnit = keys.target
local targets = {}
local count = 0
local modifierName = "modifier_komachi_03_debuff"
if not targetUnit:HasModifier(modifierName) then
table.insert(targets, targetUnit)
count = count + 1
end
if count < keys.max_count then
local rangeTargets = THTD_FindUnitsInRadius(caster,targetUnit:GetAbsOrigin(),1000)
for k,v in pairs(rangeTargets) do
if not v:HasModifier(modifierName) then
table.insert(targets, v)
count = count + 1
if count >= keys.max_count then
break
end
end
end
end
if #targets == 0 then
keys.ability:EndCooldown()
return
end
for _,target in pairs(targets) do
keys.ability:ApplyDataDrivenModifier(caster, target, modifierName, {})
end
end
function OnCreatedKomachi03Debuff(keys)
keys.target:AddDamageIncomingAll(keys.damage_up, "thtd_komachi_02_damage_up")
end
function OnDestroyKomachi03Debuff(keys)
local caster = keys.caster
local target = keys.target
target:AddDamageIncomingAll("thtd_komachi_02_damage_up")
local effectIndex = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_03_explosion_2.vpcf", PATTACH_CUSTOMORIGIN, target)
ParticleManager:SetParticleControl(effectIndex , 0, target:GetOrigin() + Vector(0,0,128))
ParticleManager:DestroyParticleSystem(effectIndex, false)
end
function OnSpellStartKomachi04(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
local vecCaster = caster:GetOrigin()
if target:HasModifier("modifier_komachi_04") then
keys.ability:EndCooldown()
return
end
keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_komachi_04",{Duration = 2.0})
keys.ability:ApplyDataDrivenModifier(caster,target,"modifier_komachi_04",{Duration = 2.0})
target.komachi_04_damage_lock = true
local rad = GetRadBetweenTwoVec2D(caster:GetOrigin(),target:GetOrigin())
local tarForward = Vector(math.cos(rad),math.sin(rad),0)
target:SetForwardVector(tarForward)
-- 渐隐效果
-- local effectIndex_start = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_04_start.vpcf", PATTACH_CUSTOMORIGIN, nil)
-- ParticleManager:SetParticleControl(effectIndex_start, 0, vecCaster)
-- ParticleManager:SetParticleControlForward(effectIndex_start, 0, tarForward)
-- caster:SetContextThink(DoUniqueString("OnKomachi04SpellStart"),
-- function ()
-- if GameRules:IsGamePaused() then return 0.03 end
local effectIndex = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_04_blink.vpcf", PATTACH_CUSTOMORIGIN, target)
ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()-tarForward*250)
ParticleManager:SetParticleControlForward(effectIndex, 0, tarForward)
caster:SetOrigin(target:GetOrigin()-tarForward*150)
caster:SetForwardVector(tarForward)
caster:StartGesture(ACT_DOTA_CAST_ABILITY_4)
-- return nil
-- end,
-- 2.0)
local time = 2.0
caster:SetContextThink(DoUniqueString("OnKomachi04SpellStart_stage_2"),
function ()
if GameRules:IsGamePaused() then return 0.1 end
if not THTD_IsValid(caster) then
target.komachi_04_damage_lock = false
target:RemoveModifierByName("modifier_komachi_04")
ParticleManager:DestroyParticleSystem(effectIndex, true)
if caster ~= nil and caster:IsNull() == false then
caster:RemoveModifierByName("modifier_komachi_04")
end
return nil
end
if not THTD_IsValid(target) then
caster:SetOrigin(vecCaster)
caster:RemoveModifierByName("modifier_komachi_04")
if target ~= nil and target:IsNull() == false then
target:RemoveModifierByName("modifier_komachi_04")
end
caster:EmitSound("Hero_Axe.Culling_Blade_Success")
local bonusTime = math.floor(keys.duration_time * 100 + 0.5) / 100
local modifier = caster:FindModifierByName("modifier_komachi_04_buff")
if modifier == nil then
keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_komachi_04_buff",{Duration=bonusTime})
else
modifier:SetDuration(bonusTime, false)
end
if keys.bonus_power > 0 then
local skipedCount = 0
if SpawnSystem.ReachToWave ~= nil then
if caster.skiped_wave == nil then
caster.skiped_wave = SpawnSystem.ReachToWave + 50 - SpawnSystem.CurWave - 1
end
elseif caster.skiped_wave ~= nil then
skipedCount = caster.skiped_wave * 2
caster.skiped_wave = nil
end
modifier = caster:FindModifierByName("modifier_komachi_04_kill_power_bonus")
if modifier == nil then
keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_komachi_04_kill_power_bonus",{}):SetStackCount(1)
caster:THTD_AddBasePower(keys.bonus_power)
elseif modifier:GetStackCount() < 999 then
local addCount = math.min(999 - modifier:GetStackCount(), 1 + skipedCount)
modifier:SetStackCount(modifier:GetStackCount() + addCount)
caster:THTD_AddBasePower(keys.bonus_power * addCount)
end
end
return nil
end
if time <= 0 then
target.komachi_04_damage_lock = false
caster:RemoveModifierByName("modifier_komachi_04")
target:RemoveModifierByName("modifier_komachi_04")
local effectIndex_end = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_04_scythe.vpcf", PATTACH_CUSTOMORIGIN, target)
ParticleManager:SetParticleControl(effectIndex_end, 0, target:GetOrigin())
ParticleManager:SetParticleControl(effectIndex_end, 1, target:GetOrigin())
caster:SetOrigin(vecCaster)
if target:GetHealthPercent() <= keys.hp_kill then
caster:NpcKill(target)
else
caster:AbilityKill(target, keys.ability)
end
time = -1
return 0.1
end
if time <= -1 then
return nil
end
time = time - 0.1
return 0.1
end,
0)
end
function OnCreatedKomachi04Buff(keys)
local target = keys.target
target:THTD_AddAttackSpeed(keys.attack_speed, "thtd_komachi_04_bonus")
target:AddDamageOutgoingAll(keys.damage_up, "thtd_komachi_04_bonus")
end
function OnDestroyKomachi04Buff(keys)
local target = keys.target
target:THTD_AddAttackSpeed("thtd_komachi_04_bonus")
target:AddDamageOutgoingAll("thtd_komachi_04_bonus")
end