304 lines
10 KiB
Lua
Executable File
304 lines
10 KiB
Lua
Executable File
function OnSpellStartKyouko01(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local targetPoint = keys.ability:GetCursorPosition()
|
|
local effects = {
|
|
"particles/units/heroes/hero_queenofpain/queen_sonic_wave.vpcf",
|
|
"particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave.vpcf",
|
|
"particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave_v2.vpcf",
|
|
}
|
|
|
|
local powerDamageUp = 0
|
|
local pv = caster:GetAbilityPowerValue("thtd_kyouko_01")
|
|
if pv ~= nil then
|
|
powerDamageUp = pv[1]
|
|
end
|
|
caster.thtd_kyouko_01_damage_up = keys.damage_up + powerDamageUp
|
|
|
|
if caster:IsPower999() then
|
|
if caster.kyouko_power999_bonus ~= true then
|
|
caster:THTD_AddCritChance(75)
|
|
caster:THTD_AddCritDamage(500)
|
|
caster.kyouko_power999_bonus = true
|
|
end
|
|
else
|
|
if caster.kyouko_power999_bonus == true then
|
|
caster:THTD_AddCritChance(-75)
|
|
caster:THTD_AddCritDamage(-500)
|
|
caster.kyouko_power999_bonus = nil
|
|
end
|
|
end
|
|
|
|
local direction = (targetPoint - caster:GetAbsOrigin()):Normalized()
|
|
direction.z = 0
|
|
|
|
if caster:IsPower666() then
|
|
local count = 3
|
|
caster:SetContextThink(DoUniqueString("dota_timer"),
|
|
function()
|
|
if GameRules:IsGamePaused() then return 0.1 end
|
|
count = count - 1
|
|
if count < 0 then
|
|
return nil
|
|
end
|
|
|
|
local info =
|
|
{
|
|
Ability = keys.ability,
|
|
EffectName = effects[#effects - count],
|
|
vSpawnOrigin = caster:GetAbsOrigin(),
|
|
fDistance = keys.distance,
|
|
fStartRadius = keys.starting_aoe,
|
|
fEndRadius = keys.final_aoe,
|
|
Source = caster,
|
|
iSourceAttachment = "mouth",
|
|
bHasFrontalCone = false,
|
|
bReplaceExisting = false,
|
|
iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
|
|
iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE,
|
|
iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
|
|
fExpireTime = GameRules:GetGameTime() + 10.0,
|
|
bDeleteOnHit = false,
|
|
vVelocity = direction * keys.speed,
|
|
bProvidesVision = false,
|
|
ExtraData = {}
|
|
}
|
|
ProjectileManager:CreateLinearProjectile(info)
|
|
return 1.0
|
|
end,
|
|
0)
|
|
else
|
|
local info =
|
|
{
|
|
Ability = keys.ability,
|
|
EffectName = effects[RandomInt(1, #effects)],
|
|
vSpawnOrigin = caster:GetAbsOrigin(),
|
|
fDistance = keys.distance,
|
|
fStartRadius = keys.starting_aoe,
|
|
fEndRadius = keys.final_aoe,
|
|
Source = caster,
|
|
iSourceAttachment = "mouth",
|
|
bHasFrontalCone = false,
|
|
bReplaceExisting = false,
|
|
iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY,
|
|
iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE,
|
|
iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
|
|
fExpireTime = GameRules:GetGameTime() + 10.0,
|
|
bDeleteOnHit = false,
|
|
vVelocity = direction * keys.speed,
|
|
bProvidesVision = false,
|
|
ExtraData = {}
|
|
}
|
|
ProjectileManager:CreateLinearProjectile(info)
|
|
end
|
|
end
|
|
|
|
function OnProjectileHitUnitKyouko01(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local target = keys.target
|
|
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + (caster.thtd_byakuren_buff_kyouko or 0)/100)
|
|
|
|
local crit = 1.0
|
|
local modifier = target:FindModifierByName("modifier_thtd_kyouko_01_debuff")
|
|
if modifier ~= nil then
|
|
local count = modifier:GetStackCount()
|
|
crit = crit + count * caster.thtd_kyouko_01_damage_up/100
|
|
modifier:SetStackCount(math.min(999, count+1))
|
|
else
|
|
keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_thtd_kyouko_01_debuff", nil):SetStackCount(1)
|
|
end
|
|
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = target,
|
|
attacker = caster,
|
|
damage = damage * crit,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
end
|
|
|
|
|
|
function OnSpellStartKyouko02(keys)
|
|
local caster = keys.caster
|
|
|
|
if caster:IsPower999() then
|
|
if caster.kyouko_power999_bonus ~= true then
|
|
caster:THTD_AddCritChance(75)
|
|
caster:THTD_AddCritDamage(500)
|
|
caster.kyouko_power999_bonus = true
|
|
end
|
|
else
|
|
if caster.kyouko_power999_bonus == true then
|
|
caster:THTD_AddCritChance(-75)
|
|
caster:THTD_AddCritDamage(-500)
|
|
caster.kyouko_power999_bonus = nil
|
|
end
|
|
end
|
|
|
|
caster.thtd_kyouko_02_first = true
|
|
|
|
if caster:IsPower666() then
|
|
local count = 3
|
|
caster:SetContextThink(DoUniqueString("dota_timer"),
|
|
function()
|
|
if GameRules:IsGamePaused() then return 0.1 end
|
|
if count == 2 then caster.thtd_kyouko_02_first = false end
|
|
count = count - 1
|
|
if count < 0 then
|
|
return nil
|
|
end
|
|
OnSpellStartKyouko02Work(keys)
|
|
return 0.9
|
|
end,
|
|
0)
|
|
else
|
|
OnSpellStartKyouko02Work(keys)
|
|
end
|
|
end
|
|
|
|
function OnSpellStartKyouko02Work(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local targetPoint = keys.target_points[1]
|
|
|
|
local effects = {
|
|
[1] = {
|
|
["start"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_start.vpcf",
|
|
["ground"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_ground.vpcf",
|
|
["proj"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_proj.vpcf",
|
|
},
|
|
[2] = {
|
|
["start"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_start_v2.vpcf",
|
|
["ground"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_ground_v2.vpcf",
|
|
["proj"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_proj_v2.vpcf",
|
|
},
|
|
}
|
|
local effectTable = effects[RandomInt(1,2)]
|
|
|
|
local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range)
|
|
|
|
-- if #targets > 0 then
|
|
-- EmitSoundOnLocationWithCaster(targetPoint, "Hero_EarthShaker.EchoSlam", caster)
|
|
-- else
|
|
-- EmitSoundOnLocationWithCaster(targetPoint, "Hero_EarthShaker.EchoSlamSmall", caster)
|
|
-- end
|
|
|
|
-- caster:SetContextThink(DoUniqueString("OnSpellStartKyouko02"),
|
|
-- function()
|
|
-- if #targets == 2 then
|
|
-- local random_response = RandomInt(1, 4)
|
|
-- if random_response >= 3 then random_response = random_response + 1 end
|
|
-- EmitSoundOnLocationWithCaster(targetPoint, "earthshaker_erth_ability_echo_0"..random_response, caster)
|
|
-- elseif #targets >= 3 then
|
|
-- EmitSoundOnLocationWithCaster(targetPoint, "earthshaker_erth_ability_echo_03", caster)
|
|
-- elseif #targets == 0 then
|
|
-- EmitSoundOnLocationWithCaster(targetPoint, "earthshaker_erth_ability_echo_0"..(RandomInt(6, 7)), caster)
|
|
-- end
|
|
-- return nil
|
|
-- end,
|
|
-- 0.5)
|
|
|
|
local powerDamage = 0
|
|
local pv = caster:GetAbilityPowerValue("thtd_kyouko_02")
|
|
if pv ~= nil then
|
|
powerDamage = pv[1]
|
|
end
|
|
caster.thtd_kyouko_02_damage = (keys.power_damage + powerDamage) * caster:THTD_GetStarDamage()
|
|
|
|
local effect_counter = 0
|
|
|
|
local count = 0
|
|
for _, enemy in pairs(targets) do
|
|
count = count + 1
|
|
if count%5 == 0 then
|
|
if effect_counter < 5 then
|
|
effect_counter = effect_counter + 1
|
|
end
|
|
caster:SetContextThink(DoUniqueString("OnSpellStartKyouko02"),
|
|
function()
|
|
local echo_slam_death_pfx = ParticleManager:CreateParticle(effectTable["ground"], PATTACH_ABSORIGIN, enemy)
|
|
ParticleManager:SetParticleControl(echo_slam_death_pfx, 6, Vector(math.min(effect_counter, 1), math.min(effect_counter, 1), math.min(effect_counter, 1)))
|
|
ParticleManager:SetParticleControl(echo_slam_death_pfx, 10, Vector(keys.duration_time + 1, 0, 0)) -- earth particle duration
|
|
ParticleManager:ReleaseParticleIndex(echo_slam_death_pfx)
|
|
return nil
|
|
end,
|
|
0.1)
|
|
end
|
|
|
|
local crit = 1.0
|
|
local modifier = enemy:FindModifierByName("modifier_thtd_kyouko_01_debuff")
|
|
if modifier ~= nil then
|
|
crit = crit + modifier:GetStackCount() * caster.thtd_kyouko_01_damage_up/100
|
|
end
|
|
|
|
if caster.thtd_kyouko_02_first == true then UnitStunTarget(caster,enemy,keys.duration_time) end
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = enemy,
|
|
attacker = caster,
|
|
damage = caster.thtd_kyouko_02_damage * crit,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
if enemy.is_random_boss == true then
|
|
local pfx_screen = ParticleManager:CreateParticleForPlayer("particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_aftershock_screen.vpcf", PATTACH_ABSORIGIN_FOLLOW, enemy, caster:GetPlayerOwner())
|
|
ParticleManager:ReleaseParticleIndex(pfx_screen)
|
|
end
|
|
|
|
local echo_enemies = THTD_FindUnitsInRadius(caster,enemy:GetAbsOrigin(),keys.range)
|
|
|
|
for _, echo_enemy in pairs(echo_enemies) do
|
|
if echo_enemy ~= enemy then
|
|
-- echo_enemy:EmitSound("Hero_EarthShaker.EchoSlamEcho")
|
|
ProjectileManager:CreateTrackingProjectile(
|
|
{
|
|
Target = echo_enemy,
|
|
Source = enemy,
|
|
Ability = keys.ability,
|
|
EffectName = effectTable["proj"],
|
|
iMoveSpeed = 1100,
|
|
vSourceLoc = enemy:GetAbsOrigin(),
|
|
bDrawsOnMinimap = false,
|
|
bDodgeable = false,
|
|
bIsAttack = false,
|
|
bVisibleToEnemies = true,
|
|
bReplaceExisting = false,
|
|
flExpireTime = GameRules:GetGameTime() + 10.0,
|
|
bProvidesVision = false,
|
|
ExtraData = {}
|
|
})
|
|
end
|
|
end
|
|
end
|
|
|
|
local echo_slam_particle = ParticleManager:CreateParticle(effectTable["start"], PATTACH_ABSORIGIN, caster)
|
|
ParticleManager:SetParticleControl(echo_slam_particle, 0, targetPoint)
|
|
ParticleManager:SetParticleControl(echo_slam_particle, 10, Vector(keys.duration_time + 1, 0, 0))
|
|
ParticleManager:SetParticleControl(echo_slam_particle, 11, Vector(math.min(#targets, 1), math.min(#targets, 1), 0 ))
|
|
ParticleManager:ReleaseParticleIndex(echo_slam_particle)
|
|
|
|
end
|
|
|
|
function OnProjectileHitUnitKyouko02(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local target = keys.target
|
|
|
|
if caster.thtd_kyouko_02_first == true then UnitStunTarget(caster,target,keys.duration_time) end
|
|
|
|
local crit = 1.0
|
|
local modifier = target:FindModifierByName("modifier_thtd_kyouko_01_debuff")
|
|
if modifier ~= nil then
|
|
crit = crit + modifier:GetStackCount() * caster.thtd_kyouko_01_damage_up/100
|
|
end
|
|
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = target,
|
|
attacker = caster,
|
|
damage = caster.thtd_kyouko_02_damage * crit,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
end |