Files
2HUCardTDGame/scripts/vscripts/abilities/abilitybyakuren.lua
2021-10-24 15:36:18 -04:00

371 lines
15 KiB
Lua
Executable File

function OnByakuren01SpellStartUp(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
--解决浮点数精度问题
local tick_step = math.floor(keys.tick_step * 100 + 0.5) / 100
local min_tick = math.floor(keys.min_tick * 100 + 0.5) / 100
local max_tick = math.floor(keys.max_tick * 100 + 0.5) / 100
local base_tick = math.floor(keys.base_tick * 100 + 0.5) / 100
if caster.thtd_byakuren_01_attack_time == nil then
caster.thtd_byakuren_01_attack_time = base_tick
end
if caster.thtd_byakuren_01_extra_damage == nil then
caster.thtd_byakuren_01_extra_damage = 100
end
if caster.thtd_byakuren_01_attack_time > min_tick then
caster.thtd_byakuren_01_attack_time = caster.thtd_byakuren_01_attack_time - tick_step
caster.thtd_byakuren_01_extra_damage = caster.thtd_byakuren_01_extra_damage - keys.extra_damage
local modifier = caster:FindModifierByName("modifier_attack_time") or caster:AddNewModifier(caster, nil, "modifier_attack_time", {})
if modifier ~= nil then
if caster.thtd_byakuren_01_attack_time <= min_tick then
modifier:SetStackCount((caster.thtd_byakuren_01_attack_time+tick_step)*10)
else
modifier:SetStackCount(caster.thtd_byakuren_01_attack_time*10)
end
end
end
ByakurenUpdateBuff(caster)
end
function OnByakuren01SpellStartDown(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
--解决浮点数精度问题
local tick_step = math.floor(keys.tick_step * 100 + 0.5) / 100
local min_tick = math.floor(keys.min_tick * 100 + 0.5) / 100
local max_tick = math.floor(keys.max_tick * 100 + 0.5) / 100
if caster.thtd_byakuren_01_attack_time == nil then
caster.thtd_byakuren_01_attack_time = base_tick
end
if caster.thtd_byakuren_01_extra_damage == nil then
caster.thtd_byakuren_01_extra_damage = 100
end
if caster.thtd_byakuren_01_attack_time < max_tick then
caster.thtd_byakuren_01_attack_time = caster.thtd_byakuren_01_attack_time + tick_step
caster.thtd_byakuren_01_extra_damage = caster.thtd_byakuren_01_extra_damage + keys.extra_damage
local modifier = caster:FindModifierByName("modifier_attack_time") or caster:AddNewModifier(caster, nil, "modifier_attack_time", {})
if modifier ~= nil then
modifier:SetStackCount(caster.thtd_byakuren_01_attack_time*10)
end
end
ByakurenUpdateBuff(caster)
end
function ByakurenUpdateBuff(caster)
local ability = caster:FindAbilityByName("thtd_byakuren_01")
local base_tick = math.floor(ability:GetSpecialValueFor("base_tick") * 100 + 0.5) / 100
if caster.thtd_byakuren_01_attack_time == nil then
caster.thtd_byakuren_01_attack_time = base_tick
end
if caster.thtd_byakuren_01_extra_damage == nil then
caster.thtd_byakuren_01_extra_damage = 100
end
if caster.thtd_byakuren_01_attack_time > base_tick then
caster:RemoveModifierByName("modifier_byakuren_attack_down")
caster:RemoveModifierByName("modifier_byakuren_attack_equal")
ability:ApplyDataDrivenModifier(caster, caster, "modifier_byakuren_attack_up", {})
elseif caster.thtd_byakuren_01_attack_time == base_tick then
caster:RemoveModifierByName("modifier_byakuren_attack_down")
caster:RemoveModifierByName("modifier_byakuren_attack_up")
ability:ApplyDataDrivenModifier(caster, caster, "modifier_byakuren_attack_equal", {})
elseif caster.thtd_byakuren_01_attack_time < base_tick then
caster:RemoveModifierByName("modifier_byakuren_attack_up")
caster:RemoveModifierByName("modifier_byakuren_attack_equal")
ability:ApplyDataDrivenModifier(caster, caster, "modifier_byakuren_attack_down", {})
end
local modifier = caster:FindModifierByName("modifier_byakuren_damage_percent") or ability:ApplyDataDrivenModifier(caster, caster, "modifier_byakuren_damage_percent", {})
if modifier ~= nil then
modifier:SetStackCount(caster.thtd_byakuren_01_extra_damage)
end
local ability = caster:FindAbilityByName("thtd_byakuren_04")
if ability:GetLevel() > 0 then
if caster.thtd_byakuren_01_attack_time > base_tick then
if caster:HasModifier("modifier_byakuren_04_magic_buff") == false then
ability:ApplyDataDrivenModifier(caster,caster,"modifier_byakuren_04_magic_buff", nil)
end
if caster:HasModifier("modifier_byakuren_04_physical_buff") then
caster:RemoveModifierByName("modifier_byakuren_04_physical_buff")
end
if caster:HasModifier("modifier_byakuren_04_pure_buff") then
caster:RemoveModifierByName("modifier_byakuren_04_pure_buff")
end
elseif caster.thtd_byakuren_01_attack_time == base_tick then
if caster:HasModifier("modifier_byakuren_04_pure_buff") == false then
ability:ApplyDataDrivenModifier(caster,caster,"modifier_byakuren_04_pure_buff", nil)
end
if caster:HasModifier("modifier_byakuren_04_magic_buff") then
caster:RemoveModifierByName("modifier_byakuren_04_magic_buff")
end
if caster:HasModifier("modifier_byakuren_04_physical_buff") then
caster:RemoveModifierByName("modifier_byakuren_04_physical_buff")
end
elseif caster.thtd_byakuren_01_attack_time < base_tick then
if caster:HasModifier("modifier_byakuren_04_magic_buff") then
caster:RemoveModifierByName("modifier_byakuren_04_magic_buff")
end
if caster:HasModifier("modifier_byakuren_04_pure_buff") then
caster:RemoveModifierByName("modifier_byakuren_04_pure_buff")
end
end
else
if caster:HasModifier("modifier_byakuren_04_physical_buff") then
caster:RemoveModifierByName("modifier_byakuren_04_physical_buff")
end
if caster:HasModifier("modifier_byakuren_04_pure_buff") then
caster:RemoveModifierByName("modifier_byakuren_04_pure_buff")
end
if caster:HasModifier("modifier_byakuren_04_magic_buff") then
caster:RemoveModifierByName("modifier_byakuren_04_magic_buff")
end
end
end
function OnByakuren01AttackLanded(keys)
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
if caster.thtd_byakuren_01_extra_damage == nil then
caster.thtd_byakuren_01_extra_damage = 100
end
local factor = 1 + THTD_GetStarLotusBuffedTowerCount(caster) * keys.damage_up / 100
local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range)
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * factor * caster.thtd_byakuren_01_extra_damage / 100
for k,v in pairs(targets) do
local damage_table = {
victim = v,
attacker = caster,
damage = damage,
ability = keys.ability,
damage_type = keys.ability:GetAbilityDamageType(),
damage_flags = DOTA_DAMAGE_FLAG_NONE,
}
local base_tick = math.floor(keys.base_tick * 100 + 0.5) / 100
if caster.thtd_byakuren_01_attack_time == base_tick then
damage_table.damage_type = DAMAGE_TYPE_PURE
elseif caster.thtd_byakuren_01_attack_time > base_tick then
damage_table.damage_type = DAMAGE_TYPE_MAGICAL
elseif caster.thtd_byakuren_01_attack_time < base_tick then
damage_table.damage_type = DAMAGE_TYPE_PHYSICAL
end
UnitDamageTarget(damage_table)
end
local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_abaddon/abaddon_aphotic_shield_explosion.vpcf",PATTACH_CUSTOMORIGIN,caster)
ParticleManager:SetParticleControl(particle,0,target:GetOrigin()+Vector(0,0,64))
ParticleManager:DestroyParticleSystem(particle,false)
end
function OnByakuren03SpellThink(keys)
if GameRules:IsGamePaused() then return end
if keys.ability == nil or keys.ability:GetLevel() < 1 then return end
local caster = EntIndexToHScript(keys.caster_entindex)
local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetOrigin(),2500)
for k,v in pairs(targets) do
if v:HasModifier("modifier_byakuren_03_buff") == false then
if THTD_IsStarLotusTower(v) then
if v.thtd_byakuren_03_religious_count == nil then
v.thtd_byakuren_03_religious_count = 0
end
v.thtd_byakuren_03_religious_count = v.thtd_byakuren_03_religious_count + 1
SendOverheadEventMessage(v:GetPlayerOwner(), OVERHEAD_ALERT_BONUS_POISON_DAMAGE, v, v.thtd_byakuren_03_religious_count, v:GetPlayerOwner() )
if v.thtd_byakuren_03_religious_count > 6000 then
local unitName = v:GetUnitName()
if unitName == "nazrin" then
v.thtd_byakuren_buff_nazrin = keys.ability:GetSpecialValueFor("nazrin")
elseif unitName == "toramaru" then
v.thtd_byakuren_buff_toramaru = keys.ability:GetSpecialValueFor("toramaru")
elseif unitName == "kogasa" then
v.thtd_byakuren_buff_kogasa = keys.ability:GetSpecialValueFor("kogasa")
elseif unitName == "nue" then
v.thtd_byakuren_buff_nue = keys.ability:GetSpecialValueFor("nue")
elseif unitName == "minamitsu" then
v.thtd_byakuren_buff_minamitsu = keys.ability:GetSpecialValueFor("minamitsu")
elseif unitName == "kyouko" then
v.thtd_byakuren_buff_kyouko = keys.ability:GetSpecialValueFor("kyouko")
end
keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_byakuren_03_buff", nil)
end
end
end
end
end
local thtd_byakuren_04_point =
{
[1] = Vector(-340,-145,32),
[2] = Vector(340,-145,32),
[3] = Vector(-185,220,32),
[0] = Vector(185,220,32),
}
function OnByakuren04AttackLanded(keys)
if keys.ability:GetLevel() < 1 then return end
local caster = EntIndexToHScript(keys.caster_entindex)
local target = keys.target
if caster.thtd_byakuren_04_init ~= true then
caster.thtd_byakuren_04_init = true
ByakurenUpdateBuff(caster)
end
local base_tick = math.floor(caster:GetAbilityValue("thtd_byakuren_01", "base_tick") * 100 + 0.5) / 100
if caster.thtd_byakuren_01_attack_time == nil then
caster.thtd_byakuren_01_attack_time = base_tick
end
if caster.thtd_byakuren_01_extra_damage == nil then
caster.thtd_byakuren_01_extra_damage = 100
end
local buffedCount = THTD_GetStarLotusBuffedTowerCount(caster)
local buffedBonus = keys.power_bonus
if caster.thtd_byakuren_01_attack_time > base_tick then
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.range)
if #targets > 0 then
local count = 1
local outCount = math.floor((keys.damage_count + buffedCount - 1)/#targets) + 1
local damageCount = {}
for iOut=1,outCount do
for i=1,#targets do
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_byakuren/ability_byakuren_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+thtd_byakuren_04_point[count%4])
ParticleManager:SetParticleControl(effectIndex, 1, targets[i]:GetOrigin())
ParticleManager:SetParticleControl(effectIndex, 3, targets[i]:GetOrigin())
ParticleManager:SetParticleControl(effectIndex, 9, caster:GetOrigin()+thtd_byakuren_04_point[count%4])
ParticleManager:DestroyParticleSystemTime(effectIndex,2.0)
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_byakuren/ability_byakuren_04_item.vpcf", PATTACH_CUSTOMORIGIN, caster)
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+thtd_byakuren_04_point[count%4])
ParticleManager:DestroyParticleSystemTime(effectIndex,1.0)
damageCount[i] = (damageCount[i] or 0) + 1
count = count + 1
if count > (keys.damage_count + buffedCount) then
break
end
end
if count > (keys.damage_count + buffedCount) then
break
end
end
-- PrintTable(damageCount)
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (caster.thtd_byakuren_01_extra_damage/100) * (1 + buffedCount * buffedBonus/100)
for i=1,#targets do
if damageCount[i] ~= nil then
local damage_table = {
victim = targets[i],
attacker = caster,
damage = damage * damageCount[i],
ability = keys.ability,
damage_type = DAMAGE_TYPE_MAGICAL,
damage_flags = DOTA_DAMAGE_FLAG_NONE,
}
UnitDamageTarget(damage_table)
end
end
end
return
end
if caster.thtd_byakuren_01_attack_time == base_tick then
if caster.thtd_byakuren_04_attack_count == nil then
caster.thtd_byakuren_04_attack_count = 0
end
caster.thtd_byakuren_04_attack_count = caster.thtd_byakuren_04_attack_count + 1
if caster.thtd_byakuren_04_attack_count >= keys.max_count / (1 + buffedCount * buffedBonus/100) then
caster.thtd_byakuren_04_attack_count = 0
local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.range)
local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + buffedCount * buffedBonus/100)
for k,v in pairs(targets) do
local damage_table = {
victim = v,
attacker = caster,
damage = damage,
ability = keys.ability,
damage_type = DAMAGE_TYPE_PURE,
damage_flags = DOTA_DAMAGE_FLAG_NONE,
}
UnitDamageTarget(damage_table)
local particle = ParticleManager:CreateParticle("particles/heroes/byakuren/ability_byakuren_02.vpcf",PATTACH_CUSTOMORIGIN,caster)
ParticleManager:SetParticleControl(particle,0,v:GetOrigin())
ParticleManager:SetParticleControl(particle,1,v:GetOrigin())
ParticleManager:DestroyParticleSystem(particle,false)
end
end
return
end
if caster.thtd_byakuren_01_attack_time < base_tick then
if RollPercentage(keys.chance) and caster:HasModifier("modifier_byakuren_04_physical_buff") == false then
caster.byakuren_04_power_bonus = buffedCount * buffedBonus
keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_byakuren_04_physical_buff", {Duration = keys.duration_time})
end
end
end
function OnCreatedByakuren04PhysicalBuff(keys)
local target = keys.target
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_byakuren/ability_byakuren_04_phy.vpcf",PATTACH_CUSTOMORIGIN,target)
ParticleManager:SetParticleControl(effectIndex,0,target:GetOrigin()+Vector(0,0,32))
ParticleManager:DestroyParticleSystemTime(effectIndex, keys.duration_time)
target.thtd_byakuren_04_physical_buff_effect = effectIndex
local bonus = target.byakuren_04_power_bonus
target:THTD_AddPowerPercentage(bonus, "thtd_byakuren_04_physical_buff")
target:THTD_AddAttackPercentage(bonus, "thtd_byakuren_04_physical_buff")
target:THTD_AddAttackSpeed(keys.attack_speed, "thtd_byakuren_04_physical_buff")
target:THTD_AddBaseAttack(keys.attack_bonus, "thtd_byakuren_04_physical_buff")
target:THTD_AddBasePower(keys.attack_bonus, "thtd_byakuren_04_physical_buff")
end
function OnDestroyByakuren04PhysicalBuff(keys)
local target = keys.target
ParticleManager:DestroyParticleSystem(target.thtd_byakuren_04_physical_buff_effect, true)
target:THTD_AddPowerPercentage("thtd_byakuren_04_physical_buff")
target:THTD_AddAttackPercentage("thtd_byakuren_04_physical_buff")
target:THTD_AddAttackSpeed("thtd_byakuren_04_physical_buff")
target:THTD_AddBaseAttack("thtd_byakuren_04_physical_buff")
target:THTD_AddBasePower("thtd_byakuren_04_physical_buff")
end
function OnCreatedByakuren04PureBuff(keys)
local target = keys.target
target:THTD_AddCritDamage(keys.crit_damage, "thtd_byakuren_04_pure_buff")
target:THTD_AddCritChance(keys.crit_change, "thtd_byakuren_04_pure_buff")
end
function OnDestroyByakuren04PureBuff(keys)
local target = keys.target
target:THTD_AddCritDamage("thtd_byakuren_04_pure_buff")
target:THTD_AddCritChance("thtd_byakuren_04_pure_buff")
end
function OnCreatedByakuren04Buff(keys)
keys.target:AddDamageOutgoingMagical(keys.penetration, "thtd_byakuren_04_damage_up")
end
function OnDestroyByakuren04Buff(keys)
keys.target:AddDamageOutgoingMagical("thtd_byakuren_04_damage_up")
end