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

128 lines
4.8 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
____exports.ability_dragon_scales = __TS__Class()
local ability_dragon_scales = ____exports.ability_dragon_scales
ability_dragon_scales.name = "ability_dragon_scales"
ability_dragon_scales.____file_path = "scripts/vscripts/abilities/heroes/smaug/ability_dragon_scales.lua"
__TS__ClassExtends(ability_dragon_scales, BaseAbility)
function ability_dragon_scales.prototype.OnSpellStart(self)
if not IsServer() then
return
end
self:GetCaster():AddNewModifier(
self:GetCaster(),
self,
____exports.modifier_dragon_scales.name,
{duration = self:GetSpecialValueFor("duration")}
)
end
ability_dragon_scales = __TS__Decorate(
ability_dragon_scales,
ability_dragon_scales,
{registerAbility(nil)},
{kind = "class", name = "ability_dragon_scales"}
)
____exports.ability_dragon_scales = ability_dragon_scales
____exports.modifier_dragon_scales = __TS__Class()
local modifier_dragon_scales = ____exports.modifier_dragon_scales
modifier_dragon_scales.name = "modifier_dragon_scales"
modifier_dragon_scales.____file_path = "scripts/vscripts/abilities/heroes/smaug/ability_dragon_scales.lua"
__TS__ClassExtends(modifier_dragon_scales, BaseModifier)
function modifier_dragon_scales.prototype.IsHidden(self)
return false
end
function modifier_dragon_scales.prototype.IsPurgable(self)
return false
end
function modifier_dragon_scales.prototype.IsDebuff(self)
return true
end
function modifier_dragon_scales.prototype.IsBuff(self)
return true
end
function modifier_dragon_scales.prototype.RemoveOnDeath(self)
return false
end
function modifier_dragon_scales.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_TAKEDAMAGE, MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE}
end
function modifier_dragon_scales.prototype.CheckState(self)
return {[MODIFIER_STATE_STUNNED] = true, [MODIFIER_STATE_MUTED] = true, [MODIFIER_STATE_SILENCED] = true}
end
function modifier_dragon_scales.prototype.OnTakeDamage(self, event)
if not IsServer() then
return
end
local target = event.unit
local caster = self:GetParent()
local originalDamage = event.original_damage
local damageType = event.damage_type
if target == caster and not caster:PassivesDisabled() then
local ability = self:GetAbility()
if not ability then
return
end
local reflect = ability:GetSpecialValueFor("reflect")
local minRadius = ability:GetSpecialValueFor("min_radius")
local maxRadius = ability:GetSpecialValueFor("max_radius")
local all = FindUnitsInRadius(
target:GetTeamNumber(),
caster:GetAbsOrigin(),
nil,
maxRadius,
DOTA_UNIT_TARGET_TEAM_ENEMY,
bit.bor(DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_BASIC),
DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES,
FIND_ANY_ORDER,
false
)
for ____, hero in ipairs(all) do
local distance = (caster:GetAbsOrigin() - hero:GetAbsOrigin()):Length2D()
local dif = distance - 300
local reflectPercent = distance <= minRadius and reflect or reflect - 0.0175 * dif
local damage = originalDamage / 100 * reflectPercent
ApplyDamage({
victim = hero,
attacker = caster,
damage = damage,
damage_type = damageType,
damage_flags = DOTA_DAMAGE_FLAG_HPLOSS,
ability = ability
})
end
end
end
function modifier_dragon_scales.prototype.GetModifierIncomingDamage_Percentage(self)
local ability = self:GetAbility()
if not ability then
return 0
end
local invul = ability:GetSpecialValueFor("invul")
if invul ~= nil and invul ~= nil then
return invul
end
return ability:GetSpecialValueFor("reflect")
end
function modifier_dragon_scales.prototype.GetEffectName(self)
return "particles/econ/items/medusa/medusa_daughters/medusa_daughters_mana_shield.vpcf"
end
function modifier_dragon_scales.prototype.GetEffectAttachType(self)
return PATTACH_ABSORIGIN_FOLLOW
end
modifier_dragon_scales = __TS__Decorate(
modifier_dragon_scales,
modifier_dragon_scales,
{registerModifier(nil)},
{kind = "class", name = "modifier_dragon_scales"}
)
____exports.modifier_dragon_scales = modifier_dragon_scales
return ____exports