314 lines
10 KiB
Lua
Executable File
314 lines
10 KiB
Lua
Executable File
function OnKaguya01SpellStart(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
|
|
local count = keys.max_count
|
|
caster:SetContextThink(DoUniqueString("thtd_kaguya01_spell_think"),
|
|
function()
|
|
if GameRules:IsGamePaused() then return 0.03 end
|
|
if count <= 0 then
|
|
return nil
|
|
end
|
|
OnKaguya01SpellThink(keys,count)
|
|
count = count - 1
|
|
return 0.7
|
|
end,
|
|
0)
|
|
end
|
|
|
|
function OnKaguya01SpellThink(keys,count)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local targetPoint = keys.target_points[1]
|
|
|
|
for i=1,count*5 do
|
|
local forwardVector = caster:GetForwardVector()
|
|
local rollRad = i*math.pi*2/(count*5)
|
|
local forwardCos = forwardVector.x
|
|
local forwardSin = forwardVector.y
|
|
local damageVector = Vector(math.cos(rollRad)*forwardCos - math.sin(rollRad)*forwardSin,
|
|
forwardSin*math.cos(rollRad) + forwardCos*math.sin(rollRad),
|
|
0) * count*100 + targetPoint
|
|
|
|
local effectIndex
|
|
if((i*count*5)%3==0)then
|
|
effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/kaguya/ability_kaguya01_light.vpcf", PATTACH_CUSTOMORIGIN, nil)
|
|
elseif((i*count*5)%3==1)then
|
|
effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/kaguya/ability_kaguya01_light_green.vpcf", PATTACH_CUSTOMORIGIN, nil)
|
|
elseif((i*count*5)%3==2)then
|
|
effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/kaguya/ability_kaguya01_light_red.vpcf", PATTACH_CUSTOMORIGIN, nil)
|
|
end
|
|
|
|
ParticleManager:SetParticleControl(effectIndex, 0, damageVector)
|
|
ParticleManager:SetParticleControl(effectIndex, 1, damageVector)
|
|
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
|
|
|
local targets = THTD_FindUnitsInRadius(caster,damageVector,keys.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
|
|
end
|
|
|
|
function OnKaguya02SpellThink(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
if keys.ability:GetLevel() < 1 then return end
|
|
|
|
if caster.thtd_kaguya_02_count == nil then
|
|
caster.thtd_kaguya_02_count = 0
|
|
end
|
|
|
|
if caster.thtd_kaguya_02_count == 0 then
|
|
local effectName = "particles/econ/items/windrunner/wr_ti8_immortal_shoulder/wr_ti8_shackleshot_pair_rope_target_glow.vpcf"
|
|
local effectIndex = ParticleManager:CreateParticle(effectName, PATTACH_ABSORIGIN_FOLLOW, caster)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin() + Vector(0, 0, 100))
|
|
ParticleManager:ReleaseParticleIndex(effectIndex)
|
|
end
|
|
|
|
caster.thtd_kaguya_02_count = caster.thtd_kaguya_02_count + 1
|
|
if caster.thtd_kaguya_02_count >= 20 then
|
|
caster.thtd_kaguya_02_count = 0
|
|
end
|
|
|
|
local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetAbsOrigin(),1000)
|
|
for k,v in pairs(targets) do
|
|
local modifier = v:FindModifierByName("modifier_kaguya_02_buff")
|
|
-- 持续时间比think大一点
|
|
if modifier == nil then
|
|
keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_kaguya_02_buff", {Duration = 0.3})
|
|
else
|
|
modifier:SetDuration(0.3, false)
|
|
end
|
|
end
|
|
end
|
|
|
|
function OnCreatedKaguya02_buff(keys)
|
|
local target = keys.target
|
|
local factor = 0.5
|
|
if target:GetUnitName() == "kaguya" then
|
|
factor = 1
|
|
end
|
|
target:THTD_AddCritChance(keys.bonus_chance * factor, "thtd_kaguya_02_bonus")
|
|
target:THTD_AddCritDamage(keys.bonus_crit * factor, "thtd_kaguya_02_bonus")
|
|
end
|
|
|
|
function OnRemoveKaguya02_buff(keys)
|
|
local target = keys.target
|
|
target:THTD_AddCritChance("thtd_kaguya_02_bonus")
|
|
target:THTD_AddCritDamage("thtd_kaguya_02_bonus")
|
|
end
|
|
|
|
function OnKaguya03SpellStart(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
|
|
if caster.thtd_kaguya_03_roll == false then
|
|
caster.thtd_kaguya_03_roll = true
|
|
else
|
|
caster.thtd_kaguya_03_roll = false
|
|
end
|
|
end
|
|
|
|
function OnUpgradeKaguya03(keys)
|
|
local caster = keys.caster
|
|
local friends = THTD_FindFriendlyUnitsAll(caster)
|
|
local enemies = THTD_FindUnitsAll(caster)
|
|
for i=1,4 do
|
|
local buff = "modifier_kaguya_03_"..i.."_buff"
|
|
local debuff = "modifier_kaguya_03_"..i.."_debuff"
|
|
for k,v in pairs(friends) do
|
|
if v:FindModifierByNameAndCaster(buff,caster)~=nil then
|
|
v:RemoveModifierByName(buff)
|
|
end
|
|
end
|
|
for k,v in pairs(enemies) do
|
|
if v:FindModifierByNameAndCaster(debuff,caster)~=nil then
|
|
v:RemoveModifierByName(debuff)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function OnKaguya03SpellThink(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
if keys.ability:GetLevel() < 1 then return end
|
|
if GameRules:IsGamePaused() then return end
|
|
if caster:THTD_IsHidden() then
|
|
OnKaguya03ReleaseBall(caster)
|
|
return
|
|
end
|
|
|
|
if caster.thtd_kaguya_03_treasure_table == nil then
|
|
caster.thtd_kaguya_03_treasure_table = {}
|
|
end
|
|
|
|
if caster.thtd_kaguya_03_think_count == nil then
|
|
caster.thtd_kaguya_03_think_count = 0
|
|
end
|
|
|
|
if caster.thtd_kaguya_03_roll ~= false then
|
|
if caster.thtd_kaguya_03_think_count < 360 then
|
|
caster.thtd_kaguya_03_think_count = caster.thtd_kaguya_03_think_count + 1
|
|
else
|
|
caster.thtd_kaguya_03_think_count = 0
|
|
end
|
|
end
|
|
|
|
if caster.thtd_effect_count == nil then
|
|
caster.thtd_effect_count = 1
|
|
end
|
|
|
|
-- 旋转宝具
|
|
for i=1,4 do
|
|
if caster.thtd_kaguya_03_treasure_table[i] == nil then
|
|
caster.thtd_kaguya_03_treasure_table[i] = {}
|
|
end
|
|
if caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] == nil then
|
|
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_kaguya/thtd_kaguya_03_"..i..".vpcf", PATTACH_CUSTOMORIGIN, caster)
|
|
ParticleManager:SetParticleControl(effectIndex, 1, Vector(1/12,0,0))
|
|
ParticleManager:SetParticleControl(effectIndex, 2, Vector(500/12,0,0))
|
|
caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] = effectIndex
|
|
end
|
|
|
|
if caster.thtd_kaguya_03_roll ~= false then
|
|
caster.thtd_kaguya_03_treasure_table[i]["origin"] = caster:GetOrigin() +
|
|
Vector(
|
|
math.cos(i*2*math.pi/4 + caster.thtd_kaguya_03_think_count * math.pi/180)*400,
|
|
math.sin(i*2*math.pi/4 + caster.thtd_kaguya_03_think_count * math.pi/180)*400,
|
|
150)
|
|
end
|
|
end
|
|
|
|
local friends = {}
|
|
local enemies = {}
|
|
if caster.thtd_effect_count >= 10 then
|
|
friends = THTD_FindFriendlyUnitsAll(caster)
|
|
enemies = THTD_FindUnitsAll(caster)
|
|
end
|
|
for i=1,4 do
|
|
if caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] ~= nil then
|
|
ParticleManager:SetParticleControl(caster.thtd_kaguya_03_treasure_table[i]["effectIndex"], 0, caster.thtd_kaguya_03_treasure_table[i]["origin"] )
|
|
end
|
|
|
|
if caster.thtd_effect_count >= 10 then
|
|
local buff = "modifier_kaguya_03_"..i.."_buff"
|
|
local debuff = "modifier_kaguya_03_"..i.."_debuff"
|
|
for k,v in pairs(friends) do
|
|
if GetDistanceBetweenTwoVec2D(caster.thtd_kaguya_03_treasure_table[i]["origin"], v:GetOrigin()) > keys.range then
|
|
if v:FindModifierByNameAndCaster(buff,caster)~=nil then
|
|
v:RemoveModifierByName(buff)
|
|
end
|
|
else
|
|
if v:HasModifier(buff) == false then
|
|
keys.ability:ApplyDataDrivenModifier(caster, v, buff, {})
|
|
end
|
|
end
|
|
end
|
|
for k,v in pairs(enemies) do
|
|
if GetDistanceBetweenTwoVec2D(caster.thtd_kaguya_03_treasure_table[i]["origin"], v:GetOrigin()) > keys.range then
|
|
if v:FindModifierByNameAndCaster(debuff,caster)~=nil then
|
|
v:RemoveModifierByName(debuff)
|
|
end
|
|
else
|
|
if i ~= 2 and v:HasModifier(debuff) == false then
|
|
keys.ability:ApplyDataDrivenModifier(caster, v, debuff, {})
|
|
end
|
|
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2
|
|
if i == 2 then
|
|
damage = damage * (1 + keys.damage_up/100)
|
|
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)
|
|
end
|
|
end
|
|
if i == 4 then caster.thtd_effect_count = 1 end
|
|
else
|
|
if i == 4 then caster.thtd_effect_count = caster.thtd_effect_count + 1 end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function OnKaguya03ReleaseBall(caster)
|
|
if caster.thtd_kaguya_03_treasure_table ~= nil and caster.thtd_kaguya_03_treasure_table[1] ~= nil and caster.thtd_kaguya_03_treasure_table[1]["effectIndex"] ~= nil then
|
|
local friends = THTD_FindFriendlyUnitsAll(caster)
|
|
local enemies = THTD_FindUnitsAll(caster)
|
|
|
|
for i=1,4 do
|
|
local buff = "modifier_kaguya_03_"..i.."_buff"
|
|
local debuff = "modifier_kaguya_03_"..i.."_debuff"
|
|
for k,v in pairs(friends) do
|
|
if v:FindModifierByNameAndCaster(buff,caster)~=nil then
|
|
v:RemoveModifierByName(buff)
|
|
end
|
|
end
|
|
for k,v in pairs(enemies) do
|
|
if v:FindModifierByNameAndCaster(debuff,caster)~=nil then
|
|
v:RemoveModifierByName(debuff)
|
|
end
|
|
end
|
|
|
|
if caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] ~= nil then
|
|
ParticleManager:DestroyParticleSystem(caster.thtd_kaguya_03_treasure_table[i]["effectIndex"],true)
|
|
caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] = nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function OnCreatedKaguya03_2_buff(keys)
|
|
keys.target:THTD_AddAttackPercentage(keys.attack_percent, "thtd_kaguya_03_2_buff_bonus")
|
|
end
|
|
|
|
function OnDestroyKaguya03_2_buff(keys)
|
|
keys.target:THTD_AddAttackPercentage("thtd_kaguya_03_2_buff_bonus")
|
|
end
|
|
|
|
function OnCreatedKaguya03_3_debuff(keys)
|
|
keys.target:AddDamageIncomingAll(keys.incoming_percent, "thtd_kaguya_03_3_debuff_damage_up")
|
|
end
|
|
|
|
function OnRemoveKaguya03_3_debuff(keys)
|
|
keys.target:AddDamageIncomingAll("thtd_kaguya_03_3_debuff_damage_up")
|
|
end
|
|
|
|
function OnCreatedKaguya03_3_buff(keys)
|
|
keys.target:AddDamageOutgoingAll(keys.outgoing_percent, "thtd_kaguya_03_3_damage_up")
|
|
end
|
|
|
|
function OnDestroyKaguya03_3_buff(keys)
|
|
keys.target:AddDamageOutgoingAll("thtd_kaguya_03_3_damage_up")
|
|
end
|
|
|
|
function OnCreatedKaguya03_4_debuff(keys)
|
|
local target = keys.target
|
|
|
|
target:AddPhysicalArmor(-keys.armor)
|
|
end
|
|
|
|
function OnDestroyKaguya03_4_debuff(keys)
|
|
local target = keys.target
|
|
|
|
target:AddPhysicalArmor(keys.armor)
|
|
end
|
|
|
|
function OnCreatedKaguya03_4_buff(keys)
|
|
keys.target:AddDamageOutgoingPhysical(keys.penetration, "thtd_kaguya_03_4_damage_up")
|
|
end
|
|
|
|
function OnDestroyKaguya03_4_buff(keys)
|
|
keys.target:AddDamageOutgoingPhysical("thtd_kaguya_03_4_damage_up")
|
|
end |