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