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

151 lines
5.5 KiB
Lua

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
local ____item_shameful_pipe = require("items.quest_items.item_shameful_pipe")
local modifier_item_shameful_pipe = ____item_shameful_pipe.modifier_item_shameful_pipe
local ____luck = require("utils.luck")
local rollLuckChance = ____luck.rollLuckChance
____exports.bone_armor = __TS__Class()
local bone_armor = ____exports.bone_armor
bone_armor.name = "bone_armor"
bone_armor.____file_path = "scripts/vscripts/abilities/creep/bone_armor.lua"
__TS__ClassExtends(bone_armor, BaseAbility)
function bone_armor.prototype.Precache(self, context)
PrecacheResource("particle", "particles/econ/items/centaur/centaur_crownfall_belt/centaur_crownfall_belt_retaliate.vpcf", context)
end
function bone_armor.prototype.GetIntrinsicModifierName(self)
return "modifier_bone_armor_passive"
end
bone_armor = __TS__Decorate(
bone_armor,
bone_armor,
{registerAbility(nil)},
{kind = "class", name = "bone_armor"}
)
____exports.bone_armor = bone_armor
____exports.modifier_bone_armor_passive = __TS__Class()
local modifier_bone_armor_passive = ____exports.modifier_bone_armor_passive
modifier_bone_armor_passive.name = "modifier_bone_armor_passive"
modifier_bone_armor_passive.____file_path = "scripts/vscripts/abilities/creep/bone_armor.lua"
__TS__ClassExtends(modifier_bone_armor_passive, BaseModifier)
function modifier_bone_armor_passive.prototype.IsHidden(self)
return true
end
function modifier_bone_armor_passive.prototype.IsDebuff(self)
return false
end
function modifier_bone_armor_passive.prototype.IsPurgable(self)
return false
end
function modifier_bone_armor_passive.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_EVENT_ON_ATTACK_LANDED}
end
function modifier_bone_armor_passive.prototype.GetModifierPhysicalArmorBonus(self)
local ____opt_0 = self:GetAbility()
return ____opt_0 and ____opt_0:GetSpecialValueFor("armor_bonus") or 0
end
function modifier_bone_armor_passive.prototype.playRetaliateParticle(self)
ParticleManager:CreateParticle(
"particles/econ/items/centaur/centaur_crownfall_belt/centaur_crownfall_belt_retaliate.vpcf",
PATTACH_ABSORIGIN_FOLLOW,
self:GetParent()
)
end
function modifier_bone_armor_passive.prototype.hasHeroNearCreep(self, creep, radius)
local heroes = FindUnitsInRadius(
creep:GetTeamNumber(),
creep:GetAbsOrigin(),
nil,
radius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
DOTA_UNIT_TARGET_HERO,
DOTA_UNIT_TARGET_FLAG_NONE,
FIND_ANY_ORDER,
false
)
for ____, hero in ipairs(heroes) do
if hero and IsValidEntity(hero) and hero:IsAlive() and hero:IsRealHero() then
return true
end
end
return false
end
function modifier_bone_armor_passive.prototype.applyReflectedDamage(self, attacker, parent, ability, eventDamage)
local reflectChance = ability:GetSpecialValueFor("damage_reflect_chance")
if not rollLuckChance(nil, attacker, reflectChance / 100) then
return
end
local reflectPct = ability:GetSpecialValueFor("damage_reflect_pct")
local reflectDamage = eventDamage * (reflectPct / 100)
if reflectDamage <= 0 then
return
end
ApplyDamage({
victim = attacker,
attacker = parent,
damage = reflectDamage,
damage_type = DAMAGE_TYPE_PHYSICAL,
ability = ability
})
self:playRetaliateParticle()
end
function modifier_bone_armor_passive.prototype.OnAttackLanded(self, event)
if not IsServer() then
return
end
if event.target ~= self:GetParent() then
return
end
local attacker = event.attacker
if not attacker or not IsValidEntity(attacker) or not attacker:IsAlive() then
return
end
if not attacker:IsHero() or not attacker:IsRealHero() then
return
end
if not attacker:IsRangedAttacker() then
return
end
if attacker:HasModifier(modifier_item_shameful_pipe.name) then
return
end
local ability = self:GetAbility()
if not ability then
return
end
local parent = self:GetParent()
local heroProximityRadius = ability:GetSpecialValueFor("hero_proximity_radius")
local heroNearCreep = self:hasHeroNearCreep(parent, heroProximityRadius)
if not heroNearCreep then
local isolatedMultiplier = ability:GetSpecialValueFor("isolated_damage_multiplier")
local damage = event.damage * isolatedMultiplier
if damage > 0 then
ApplyDamage({
victim = attacker,
attacker = parent,
damage = damage,
damage_type = DAMAGE_TYPE_PHYSICAL,
ability = ability
})
self:playRetaliateParticle()
end
return
end
self:applyReflectedDamage(attacker, parent, ability, event.damage)
end
modifier_bone_armor_passive = __TS__Decorate(
modifier_bone_armor_passive,
modifier_bone_armor_passive,
{registerModifier(nil)},
{kind = "class", name = "modifier_bone_armor_passive"}
)
____exports.modifier_bone_armor_passive = modifier_bone_armor_passive
return ____exports