Files
Dota-Zombie-Invasion/scripts/vscripts/abilities/heroes/axe/axe_culling_blade_custom.lua
T
2026-05-29 15:11:31 +07:00

335 lines
13 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local ____exports = {}
local ____dota_ts_adapter = require("lib.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
--- Навсегда броня: стаки × armor_per_creep_kill (крип +0.1, герой — через armor_per_stack).
local function axeCullingAddPermanentArmor(self, caster, ability, flatArmor)
if flatArmor <= 0 then
return
end
local step = ability:GetSpecialValueFor("armor_per_creep_kill")
if step <= 0 then
return
end
local addStacks = math.floor(flatArmor / step + 0.5)
if addStacks < 1 then
addStacks = 1
end
local m = caster:FindModifierByName(____exports.modifier_axe_culling_blade_armor_stack.name)
if not m then
m = caster:AddNewModifier(caster, ability, ____exports.modifier_axe_culling_blade_armor_stack.name, {})
end
if m ~= nil then
m:SetStackCount(m:GetStackCount() + addStacks)
end
end
local function axeReduceAllAbilityCooldowns(self, caster, seconds)
if seconds <= 0 then
return
end
do
local i = 0
while i < 24 do
do
local ab = caster:GetAbilityByIndex(i)
if not ab or ab:IsNull() then
goto __continue10
end
local remaining = ab:GetCooldownTimeRemaining()
if remaining <= 0 then
goto __continue10
end
ab:EndCooldown()
local next = math.max(0, remaining - seconds)
if next > 0 then
ab:StartCooldown(next)
end
end
::__continue10::
i = i + 1
end
end
end
____exports.axe_culling_blade_custom = __TS__Class()
local axe_culling_blade_custom = ____exports.axe_culling_blade_custom
axe_culling_blade_custom.name = "axe_culling_blade_custom"
axe_culling_blade_custom.____file_path = "scripts/vscripts/abilities/heroes/axe/axe_culling_blade_custom.lua"
__TS__ClassExtends(axe_culling_blade_custom, BaseAbility)
function axe_culling_blade_custom.prototype.GetIntrinsicModifierName(self)
return ____exports.modifier_axe_culling_blade_shard_cdr.name
end
function axe_culling_blade_custom.prototype.Precache(self, context)
PrecacheResource("particle", "particles/units/heroes/hero_axe/axe_culling_blade.vpcf", context)
PrecacheResource("particle", "particles/econ/items/axe/ti9_jungle_axe/ti9_jungle_axe_culling_blade_sprint_fire.vpcf", context)
PrecacheResource("soundfile", "soundevents/game_sounds_heroes/game_sounds_axe.vsndevts", context)
end
function axe_culling_blade_custom.prototype.GetCastRange(self, location, target)
return self:GetSpecialValueFor("AbilityCastRange")
end
function axe_culling_blade_custom.prototype.GetAOERadius(self)
return self:GetSpecialValueFor("cull_radius")
end
function axe_culling_blade_custom.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
local point = self:GetCursorPosition()
local cullRadius = self:GetSpecialValueFor("cull_radius")
local buffRadius = self:GetSpecialValueFor("speed_aoe")
local creepArmor = self:GetSpecialValueFor("armor_per_creep_kill")
local heroArmor = self:GetSpecialValueFor("armor_per_stack")
EmitSoundOn("Hero_Axe.Culling_Blade", caster)
local enemies = FindUnitsInRadius(
caster:GetTeamNumber(),
point,
nil,
cullRadius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES,
FIND_ANY_ORDER,
false
)
local anyExecuted = false
for ____, target in ipairs(enemies) do
do
if not target or not target:IsAlive() or target:IsInvulnerable() then
goto __continue20
end
self:playCullingBladeParticle(caster, target)
EmitSoundOn("Hero_Axe.Culling_Blade", target)
local wasHero = target:IsHero()
local bonusAttackDamage = caster:GetAverageTrueAttackDamage(target)
ApplyDamage({
victim = target,
attacker = caster,
damage = bonusAttackDamage,
damage_type = self:GetAbilityDamageType(),
ability = self
})
if target:IsAlive() then
caster:PerformAttack(
target,
false,
true,
true,
true,
false,
false,
true
)
end
if not target:IsAlive() then
anyExecuted = true
EmitSoundOn("Hero_Axe.Culling_Blade_Success", target)
if not wasHero and creepArmor > 0 then
axeCullingAddPermanentArmor(nil, caster, self, creepArmor)
elseif wasHero and heroArmor > 0 then
axeCullingAddPermanentArmor(nil, caster, self, heroArmor)
end
end
end
::__continue20::
end
if anyExecuted then
local durBase = self:GetSpecialValueFor("speed_duration")
local dur = caster:HasScepter() and self:GetSpecialValueFor("scepter_speed_duration") or durBase
local tm = caster:GetTeamNumber()
local unitList = FindUnitsInRadius(
tm,
caster:GetAbsOrigin(),
nil,
buffRadius,
DOTA_UNIT_TARGET_TEAM_FRIENDLY,
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, unit in ipairs(unitList) do
do
if not unit or not unit:IsAlive() then
goto __continue28
end
unit:AddNewModifier(caster, self, ____exports.modifier_axe_culling_blade_movespeed.name, {duration = dur})
end
::__continue28::
end
end
end
function axe_culling_blade_custom.prototype.playCullingBladeParticle(self, caster, target)
local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_axe/axe_culling_blade.vpcf", PATTACH_ABSORIGIN_FOLLOW, target)
ParticleManager:SetParticleControl(
particle,
0,
caster:GetAbsOrigin()
)
ParticleManager:SetParticleControl(
particle,
1,
target:GetAbsOrigin()
)
ParticleManager:SetParticleControlEnt(
particle,
2,
target,
PATTACH_ABSORIGIN_FOLLOW,
"attach_hitloc",
target:GetAbsOrigin(),
true
)
ParticleManager:ReleaseParticleIndex(particle)
end
axe_culling_blade_custom = __TS__Decorate(
axe_culling_blade_custom,
axe_culling_blade_custom,
{registerAbility(nil)},
{kind = "class", name = "axe_culling_blade_custom"}
)
____exports.axe_culling_blade_custom = axe_culling_blade_custom
____exports.modifier_axe_culling_blade_shard_cdr = __TS__Class()
local modifier_axe_culling_blade_shard_cdr = ____exports.modifier_axe_culling_blade_shard_cdr
modifier_axe_culling_blade_shard_cdr.name = "modifier_axe_culling_blade_shard_cdr"
modifier_axe_culling_blade_shard_cdr.____file_path = "scripts/vscripts/abilities/heroes/axe/axe_culling_blade_custom.lua"
__TS__ClassExtends(modifier_axe_culling_blade_shard_cdr, BaseModifier)
function modifier_axe_culling_blade_shard_cdr.prototype.IsHidden(self)
return true
end
function modifier_axe_culling_blade_shard_cdr.prototype.IsPurgable(self)
return false
end
function modifier_axe_culling_blade_shard_cdr.prototype.RemoveOnDeath(self)
return false
end
function modifier_axe_culling_blade_shard_cdr.prototype.OnCreated(self)
if not IsServer() then
return
end
local parent = self:GetParent()
self.killListener = ListenToGameEvent(
"entity_killed",
function(event)
local attacker = EntIndexToHScript(event.entindex_attacker)
local killed = EntIndexToHScript(event.entindex_killed)
local ____temp_0
if event.entindex_inflictor ~= nil and event.entindex_inflictor ~= 0 then
____temp_0 = EntIndexToHScript(event.entindex_inflictor)
else
____temp_0 = nil
end
local inflictor = ____temp_0
if not attacker or not killed then
return
end
if attacker ~= parent then
return
end
if inflictor and not inflictor:IsNull() then
return
end
if not parent:IsRealHero() or parent:IsIllusion() then
return
end
if parent:PassivesDisabled() then
return
end
if not parent:HasScepter() then
return
end
if not killed:IsCreep() then
return
end
axeReduceAllAbilityCooldowns(nil, parent, 1)
end,
nil
)
end
function modifier_axe_culling_blade_shard_cdr.prototype.OnDestroy(self)
if self.killListener ~= nil then
StopListeningToGameEvent(self.killListener)
self.killListener = nil
end
end
modifier_axe_culling_blade_shard_cdr = __TS__Decorate(
modifier_axe_culling_blade_shard_cdr,
modifier_axe_culling_blade_shard_cdr,
{registerModifier(nil)},
{kind = "class", name = "modifier_axe_culling_blade_shard_cdr"}
)
____exports.modifier_axe_culling_blade_shard_cdr = modifier_axe_culling_blade_shard_cdr
____exports.modifier_axe_culling_blade_armor_stack = __TS__Class()
local modifier_axe_culling_blade_armor_stack = ____exports.modifier_axe_culling_blade_armor_stack
modifier_axe_culling_blade_armor_stack.name = "modifier_axe_culling_blade_armor_stack"
modifier_axe_culling_blade_armor_stack.____file_path = "scripts/vscripts/abilities/heroes/axe/axe_culling_blade_custom.lua"
__TS__ClassExtends(modifier_axe_culling_blade_armor_stack, BaseModifier)
function modifier_axe_culling_blade_armor_stack.prototype.IsHidden(self)
return false
end
function modifier_axe_culling_blade_armor_stack.prototype.IsPurgable(self)
return false
end
function modifier_axe_culling_blade_armor_stack.prototype.IsDebuff(self)
return false
end
function modifier_axe_culling_blade_armor_stack.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS}
end
function modifier_axe_culling_blade_armor_stack.prototype.GetModifierPhysicalArmorBonus(self)
local ab = self:GetAbility()
if not ab then
return 0
end
return self:GetStackCount() * ab:GetSpecialValueFor("armor_per_creep_kill")
end
modifier_axe_culling_blade_armor_stack = __TS__Decorate(
modifier_axe_culling_blade_armor_stack,
modifier_axe_culling_blade_armor_stack,
{registerModifier(nil)},
{kind = "class", name = "modifier_axe_culling_blade_armor_stack"}
)
____exports.modifier_axe_culling_blade_armor_stack = modifier_axe_culling_blade_armor_stack
____exports.modifier_axe_culling_blade_movespeed = __TS__Class()
local modifier_axe_culling_blade_movespeed = ____exports.modifier_axe_culling_blade_movespeed
modifier_axe_culling_blade_movespeed.name = "modifier_axe_culling_blade_movespeed"
modifier_axe_culling_blade_movespeed.____file_path = "scripts/vscripts/abilities/heroes/axe/axe_culling_blade_custom.lua"
__TS__ClassExtends(modifier_axe_culling_blade_movespeed, BaseModifier)
function modifier_axe_culling_blade_movespeed.prototype.IsHidden(self)
return false
end
function modifier_axe_culling_blade_movespeed.prototype.IsPurgable(self)
return true
end
function modifier_axe_culling_blade_movespeed.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT}
end
function modifier_axe_culling_blade_movespeed.prototype.GetModifierMoveSpeedBonus_Percentage(self)
return self:GetAbility():GetSpecialValueFor("speed_bonus")
end
function modifier_axe_culling_blade_movespeed.prototype.CheckState(self)
return {[MODIFIER_STATE_DEBUFF_IMMUNE] = true}
end
function modifier_axe_culling_blade_movespeed.prototype.GetModifierAttackSpeedBonus_Constant(self)
return self:GetAbility():GetSpecialValueFor("attack_speed_bonus")
end
function modifier_axe_culling_blade_movespeed.prototype.GetEffectName(self)
return "particles/econ/items/axe/ti9_jungle_axe/ti9_jungle_axe_culling_blade_sprint_fire.vpcf"
end
function modifier_axe_culling_blade_movespeed.prototype.GetEffectAttachType(self)
return PATTACH_ABSORIGIN_FOLLOW
end
modifier_axe_culling_blade_movespeed = __TS__Decorate(
modifier_axe_culling_blade_movespeed,
modifier_axe_culling_blade_movespeed,
{registerModifier(nil)},
{kind = "class", name = "modifier_axe_culling_blade_movespeed"}
)
____exports.modifier_axe_culling_blade_movespeed = modifier_axe_culling_blade_movespeed
return ____exports