239 lines
7.4 KiB
Lua
Executable File
239 lines
7.4 KiB
Lua
Executable File
function OnSakuya01SpellStart(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local targetPoint = keys.target_points[1]
|
|
|
|
local powerDamage = 0
|
|
local pv = caster:GetAbilityPowerValue("thtd_sakuya_01")
|
|
if pv ~= nil then
|
|
powerDamage = pv[1]
|
|
end
|
|
|
|
caster.power_damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage()
|
|
|
|
if caster:IsPower666() then
|
|
caster.power_damage = caster.power_damage * 4
|
|
end
|
|
|
|
if caster:IsPower999() then
|
|
caster.power_damage = caster.power_damage * 12
|
|
end
|
|
|
|
if caster.thtd_sakuya_03_casted == true then
|
|
caster.power_damage = caster.power_damage * (1 - caster:GetAbilityValue("thtd_sakuya_03", "damage_down")/100)
|
|
end
|
|
|
|
local rad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint)
|
|
local forward = Vector(math.cos(rad),math.sin(rad),caster:GetForwardVector().z)
|
|
|
|
local info =
|
|
{
|
|
Ability = keys.ability,
|
|
EffectName = "particles/thd2/heroes/sakuya/ability_sakuya_01.vpcf",
|
|
vSpawnOrigin = caster:GetOrigin() + Vector(0,0,128),
|
|
fDistance = 1000,
|
|
fStartRadius = 150,
|
|
fEndRadius = 150,
|
|
Source = caster,
|
|
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 = forward * 2000,
|
|
bProvidesVision = true,
|
|
iVisionRadius = 1000,
|
|
iVisionTeamNumber = caster:GetTeamNumber()
|
|
}
|
|
local projectile = ProjectileManager:CreateLinearProjectile(info)
|
|
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
|
|
|
|
local count = keys.max_count
|
|
|
|
for i=1,count do
|
|
local iVec = Vector( math.cos(rad + math.pi/36*(i+0.5)) * 2000 , math.sin(rad + math.pi/36*(i+0.5)) * 2000 , caster:GetForwardVector().z )
|
|
info.vVelocity = iVec
|
|
projectile = ProjectileManager:CreateLinearProjectile(info)
|
|
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
|
|
iVec = Vector( math.cos(rad - math.pi/36*(i+0.5)) * 2000 , math.sin(rad - math.pi/36*(i+0.5)) * 2000 , caster:GetForwardVector().z )
|
|
info.vVelocity = iVec
|
|
projectile = ProjectileManager:CreateLinearProjectile(info)
|
|
ParticleManager:DestroyLinearProjectileSystem(projectile,false)
|
|
end
|
|
end
|
|
|
|
function OnSakuya01ProjectileHit(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local target = keys.target
|
|
|
|
local DamageTable = {
|
|
ability = keys.ability,
|
|
victim = target,
|
|
attacker = caster,
|
|
damage = caster.power_damage,
|
|
damage_type = keys.ability:GetAbilityDamageType(),
|
|
damage_flags = DOTA_DAMAGE_FLAG_NONE
|
|
}
|
|
UnitDamageTarget(DamageTable)
|
|
end
|
|
|
|
local sakuya_02_black_list =
|
|
{
|
|
"thtd_lily_01",
|
|
"thtd_daiyousei_01",
|
|
"thtd_koishi_04",
|
|
"thtd_sakuya_02",
|
|
"thtd_sakuya_03",
|
|
"thtd_yuuka_04",
|
|
"thtd_yukari_03",
|
|
"thtd_yukari_04",
|
|
"thtd_flandre_01",
|
|
"thtd_mokou_03",
|
|
"thtd_eirin_03",
|
|
"thtd_patchouli_04",
|
|
"thtd_hatate_02",
|
|
"thtd_sanae_03",
|
|
"thtd_minamitsu_02",
|
|
"thtd_minamitsu_03",
|
|
"thtd_toramaru_01",
|
|
"thtd_toramaru_02",
|
|
"thtd_toramaru_03",
|
|
"thtd_kanako_04",
|
|
"thtd_sanae_04",
|
|
"thtd_miko_04",
|
|
"thtd_keine_01",
|
|
"thtd_keine_03",
|
|
"thtd_suika_04",
|
|
"thtd_yuugi_03",
|
|
"thtd_alice_03",
|
|
"shinki_dragon_01",
|
|
"thtd_kagerou_03",
|
|
"death_prophet_exorcism",
|
|
"thtd_letty_01",
|
|
"thtd_suwako_04",
|
|
"thtd_komachi_04",
|
|
"thtd_junko_03",
|
|
"thtd_junko_04",
|
|
"thtd_clownpiece_03",
|
|
"thtd_kyouko_02",
|
|
"thtd_shikieiki_04",
|
|
"thtd_shinki_03",
|
|
|
|
}
|
|
|
|
function IsInSakuya02BlackList(ability)
|
|
for k,v in pairs(sakuya_02_black_list) do
|
|
if ability:GetAbilityName() == v then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function OnSakuya02SpellStart(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
local target = keys.target
|
|
local targetPoint = keys.target:GetOrigin()
|
|
-- local cooldown = keys.ability:GetCooldown(keys.ability:GetLevel() - 1) --获取当前等级的冷却时间
|
|
local cooldown = keys.ability:GetCooldownTimeRemaining() -- 或者 keys.ability:GetCooldownTime() 技能当前实际冷却时间
|
|
if keys.ability:GetLevel() >= 2 then
|
|
local unitName = target:GetUnitName()
|
|
if unitName == "remilia" or unitName == "flandre" or unitName == "patchouli" or unitName == "sakuya" or unitName == "koakuma" or unitName == "meirin" then
|
|
cooldown = cooldown * 0.5
|
|
keys.ability:EndCooldown()
|
|
keys.ability:StartCooldown(cooldown)
|
|
end
|
|
end
|
|
|
|
if target:THTD_IsTower() and target:HasModifier("modifier_sakuya_02_buff") == false then
|
|
caster.thtd_last_cast_unit = target
|
|
keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_sakuya_02_buff", {duration=cooldown})
|
|
|
|
local effectIndex = ParticleManager:CreateParticle("particles/thd2/items/item_pocket_watch.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin())
|
|
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
|
|
|
for i=2,5 do
|
|
local ability = target:GetAbilityByIndex(i)
|
|
if ability~=nil and IsInSakuya02BlackList(ability) == false then
|
|
ability:EndCooldown()
|
|
target:GiveMana(target:GetRealManaCost(ability))
|
|
end
|
|
end
|
|
|
|
if caster == target then
|
|
target:THTD_AddManaRegenPercentage(keys.mana_reg)
|
|
caster:SetContextThink(DoUniqueString("ability_reimu_03"),
|
|
function()
|
|
if target~=nil and target:IsNull()==false and target:IsAlive() then
|
|
target:THTD_AddManaRegenPercentage(-keys.mana_reg)
|
|
end
|
|
return nil
|
|
end,
|
|
cooldown-0.2)
|
|
end
|
|
end
|
|
end
|
|
|
|
function OnSakuya03SpellStart(keys)
|
|
local caster = EntIndexToHScript(keys.caster_entindex)
|
|
|
|
local powerCd = 0
|
|
local pv = caster:GetAbilityPowerValue("thtd_sakuya_03")
|
|
if pv ~= nil then
|
|
powerCd = pv[1]
|
|
end
|
|
if powerCd > 0 then
|
|
caster:ReCooldown(keys.ability, powerCd)
|
|
end
|
|
|
|
local duration = math.floor(100 * keys.duration_time + 0.5) / 100
|
|
local range = keys.range
|
|
local pauseUnit = {}
|
|
|
|
local effectIndex = ParticleManager:CreateParticle("particles/heroes/muyue/ability_muyue_014_aeons.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
|
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin())
|
|
ParticleManager:SetParticleControl(effectIndex, 1, Vector(range,range,range))
|
|
|
|
caster.thtd_sakuya_03_casted = true
|
|
caster:SetContextThink(DoUniqueString("ability_reimu_03"),
|
|
function()
|
|
if GameRules:IsGamePaused() then return 0.1 end
|
|
|
|
if duration < 0 or THTD_IsValid(caster) == false then
|
|
for k,v in pairs(pauseUnit) do
|
|
if v~=nil and v:IsNull()==false and v:IsAlive() then
|
|
v:RemoveModifierByName("modifier_sakuya_03_time_pause_debuff")
|
|
end
|
|
end
|
|
ParticleManager:DestroyParticleSystem(effectIndex,true)
|
|
pauseUnit = {}
|
|
caster.thtd_sakuya_03_casted = nil
|
|
return nil
|
|
end
|
|
|
|
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),range)
|
|
|
|
for k,v in pairs(targets) do
|
|
if v:HasModifier("modifier_sakuya_03_time_pause_debuff") == false then
|
|
keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_sakuya_03_time_pause_debuff", nil)
|
|
pauseUnit[v:GetEntityIndex()] = v
|
|
end
|
|
end
|
|
|
|
if caster:GetMana() < caster:GetMaxMana() then
|
|
caster:SetMana(caster:GetMaxMana())
|
|
end
|
|
|
|
local ability = caster:FindAbilityByName("thtd_sakuya_01")
|
|
local unit = targets[1]
|
|
if unit ~= nil and unit:IsNull() == false and ability:IsFullyCastable() then
|
|
caster:CastAbilityOnPosition(unit:GetOrigin(), ability, caster:GetPlayerOwnerID())
|
|
end
|
|
|
|
duration = duration - 0.1
|
|
return 0.1
|
|
end,
|
|
0)
|
|
end |