292 lines
9.8 KiB
Lua
Executable File
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 |