Files
2026-05-29 15:11:31 +07:00

261 lines
10 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 BaseItem = ____dota_ts_adapter.BaseItem
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
local BaseModifier = ____dota_ts_adapter.BaseModifier
local PARTICLE_BLADEMAIL = "particles/econ/items/spectre/spectre_arcana/spectre_arcana_blademail.vpcf"
____exports.item_blademail_2 = __TS__Class()
local item_blademail_2 = ____exports.item_blademail_2
item_blademail_2.name = "item_blademail_2"
item_blademail_2.____file_path = "scripts/vscripts/items/default_items/item_blademail_2.lua"
__TS__ClassExtends(item_blademail_2, BaseItem)
function item_blademail_2.prototype.Precache(self, context)
PrecacheResource("particle", PARTICLE_BLADEMAIL, context)
end
function item_blademail_2.prototype.GetIntrinsicModifierName(self)
return "modifier_item_blademail_2"
end
function item_blademail_2.prototype.GetAOERadius(self)
return self:GetSpecialValueFor("radius")
end
function item_blademail_2.prototype.OnSpellStart(self)
if not IsServer() then
return
end
local caster = self:GetCaster()
if not caster then
return
end
local duration = self:GetSpecialValueFor("active_duration")
caster:AddNewModifier(caster, self, ____exports.modifier_item_blademail_2_active.name, {duration = duration})
EmitSoundOn("DOTA_Item.BladeMail.Activate", caster)
end
item_blademail_2 = __TS__Decorate(
item_blademail_2,
item_blademail_2,
{registerAbility(nil)},
{kind = "class", name = "item_blademail_2"}
)
____exports.item_blademail_2 = item_blademail_2
--- Носитель: отражение части входящего урона; аура на союзников и врагов в радиусе.
____exports.modifier_item_blademail_2 = __TS__Class()
local modifier_item_blademail_2 = ____exports.modifier_item_blademail_2
modifier_item_blademail_2.name = "modifier_item_blademail_2"
modifier_item_blademail_2.____file_path = "scripts/vscripts/items/default_items/item_blademail_2.lua"
__TS__ClassExtends(modifier_item_blademail_2, BaseModifier)
function modifier_item_blademail_2.prototype.RemoveOnDeath(self)
return false
end
function modifier_item_blademail_2.prototype.IsHidden(self)
return true
end
function modifier_item_blademail_2.prototype.IsPurgable(self)
return false
end
function modifier_item_blademail_2.prototype.IsAura(self)
return true
end
function modifier_item_blademail_2.prototype.GetModifierAura(self)
return "modifier_item_blademail_2_aura"
end
function modifier_item_blademail_2.prototype.GetAuraRadius(self)
return self:GetAbility():GetSpecialValueFor("radius")
end
function modifier_item_blademail_2.prototype.GetAuraDuration(self)
return 0.5
end
function modifier_item_blademail_2.prototype.GetAuraSearchTeam(self)
return DOTA_UNIT_TARGET_TEAM_BOTH
end
function modifier_item_blademail_2.prototype.GetAuraSearchType(self)
return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC
end
function modifier_item_blademail_2.prototype.GetAuraSearchFlags(self)
return DOTA_UNIT_TARGET_FLAG_NONE
end
function modifier_item_blademail_2.prototype.DeclareFunctions(self)
return {MODIFIER_EVENT_ON_TAKEDAMAGE, MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT}
end
function modifier_item_blademail_2.prototype.GetModifierPhysicalArmorBonus(self)
return self:GetAbility():GetSpecialValueFor("bonus_armor")
end
function modifier_item_blademail_2.prototype.GetModifierAttackSpeedBonus_Constant(self)
return self:GetAbility():GetSpecialValueFor("attack_speed")
end
function modifier_item_blademail_2.prototype.OnTakeDamage(self, event)
if not IsServer() then
return
end
local parent = self:GetParent()
local ability = self:GetAbility()
if not ability or event.unit ~= parent then
return
end
if event.damage <= 0 then
return
end
if bit.band(event.damage_flags, DOTA_DAMAGE_FLAG_HPLOSS) == DOTA_DAMAGE_FLAG_HPLOSS then
return
end
if bit.band(event.damage_flags, DOTA_DAMAGE_FLAG_REFLECTION) == DOTA_DAMAGE_FLAG_REFLECTION then
return
end
local attacker = event.attacker
if not attacker or attacker:IsNull() or not attacker:IsAlive() then
return
end
if attacker == parent then
return
end
if attacker:GetTeamNumber() == parent:GetTeamNumber() then
return
end
if attacker:IsBuilding() or attacker:IsOther() then
return
end
local isActive = parent:HasModifier(____exports.modifier_item_blademail_2_active.name)
local reflectPct = ability:GetSpecialValueFor("reflect_pct") * 0.01
if isActive then
reflectPct = ability:GetSpecialValueFor("active_reflect_pct") * 0.01
parent:HealWithParams(
event.damage,
ability,
false,
false,
parent,
false
)
SendOverheadEventMessage(
nil,
OVERHEAD_ALERT_HEAL,
parent,
event.damage,
nil
)
end
if reflectPct <= 0 then
return
end
local reflectDamage = event.damage * reflectPct
if reflectDamage <= 0 then
return
end
ApplyDamage({
victim = attacker,
attacker = parent,
damage = reflectDamage,
damage_type = event.damage_type,
ability = ability,
damage_flags = DOTA_DAMAGE_FLAG_REFLECTION + DOTA_DAMAGE_FLAG_NO_SPELL_AMPLIFICATION
})
end
modifier_item_blademail_2 = __TS__Decorate(
modifier_item_blademail_2,
modifier_item_blademail_2,
{registerModifier(nil)},
{kind = "class", name = "modifier_item_blademail_2"}
)
____exports.modifier_item_blademail_2 = modifier_item_blademail_2
--- Актив: ванильный визуал и 100% отражения из KV.
____exports.modifier_item_blademail_2_active = __TS__Class()
local modifier_item_blademail_2_active = ____exports.modifier_item_blademail_2_active
modifier_item_blademail_2_active.name = "modifier_item_blademail_2_active"
modifier_item_blademail_2_active.____file_path = "scripts/vscripts/items/default_items/item_blademail_2.lua"
__TS__ClassExtends(modifier_item_blademail_2_active, BaseModifier)
function modifier_item_blademail_2_active.prototype.RemoveOnDeath(self)
return true
end
function modifier_item_blademail_2_active.prototype.IsHidden(self)
return false
end
function modifier_item_blademail_2_active.prototype.IsDebuff(self)
return false
end
function modifier_item_blademail_2_active.prototype.IsPurgable(self)
return true
end
function modifier_item_blademail_2_active.prototype.GetEffectName(self)
return PARTICLE_BLADEMAIL
end
function modifier_item_blademail_2_active.prototype.GetEffectAttachType(self)
return PATTACH_ABSORIGIN_FOLLOW
end
function modifier_item_blademail_2_active.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_MIN_HEALTH}
end
function modifier_item_blademail_2_active.prototype.GetMinHealth(self)
return 1
end
function modifier_item_blademail_2_active.prototype.GetTexture(self)
return "../items/default_items/blademail_2"
end
modifier_item_blademail_2_active = __TS__Decorate(
modifier_item_blademail_2_active,
modifier_item_blademail_2_active,
{registerModifier(nil)},
{kind = "class", name = "modifier_item_blademail_2_active"}
)
____exports.modifier_item_blademail_2_active = modifier_item_blademail_2_active
--- Аура: союзникам +броня и +скорость атаки, врагам столько же со знаком минус.
____exports.modifier_item_blademail_2_aura = __TS__Class()
local modifier_item_blademail_2_aura = ____exports.modifier_item_blademail_2_aura
modifier_item_blademail_2_aura.name = "modifier_item_blademail_2_aura"
modifier_item_blademail_2_aura.____file_path = "scripts/vscripts/items/default_items/item_blademail_2.lua"
__TS__ClassExtends(modifier_item_blademail_2_aura, BaseModifier)
function modifier_item_blademail_2_aura.prototype.RemoveOnDeath(self)
return true
end
function modifier_item_blademail_2_aura.prototype.IsHidden(self)
return false
end
function modifier_item_blademail_2_aura.prototype.IsPurgable(self)
return false
end
function modifier_item_blademail_2_aura.prototype.IsDebuff(self)
local caster = self:GetCaster()
if not caster then
return true
end
return self:GetParent():GetTeamNumber() ~= caster:GetTeamNumber()
end
function modifier_item_blademail_2_aura.prototype.IsBuff(self)
return not self:IsDebuff()
end
function modifier_item_blademail_2_aura.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT}
end
function modifier_item_blademail_2_aura.prototype.GetModifierPhysicalArmorBonus(self)
local ability = self:GetAbility()
local caster = self:GetCaster()
if not ability or not caster then
return 0
end
local v = ability:GetSpecialValueFor("aura_armor")
return self:GetParent():GetTeamNumber() == caster:GetTeamNumber() and v or -v
end
function modifier_item_blademail_2_aura.prototype.GetModifierAttackSpeedBonus_Constant(self)
local ability = self:GetAbility()
local caster = self:GetCaster()
if not ability or not caster then
return 0
end
local v = ability:GetSpecialValueFor("aura_attack_speed")
return self:GetParent():GetTeamNumber() == caster:GetTeamNumber() and v or -v
end
function modifier_item_blademail_2_aura.prototype.GetTexture(self)
return "../items/default_items/blademail_2"
end
modifier_item_blademail_2_aura = __TS__Decorate(
modifier_item_blademail_2_aura,
modifier_item_blademail_2_aura,
{registerModifier(nil)},
{kind = "class", name = "modifier_item_blademail_2_aura"}
)
____exports.modifier_item_blademail_2_aura = modifier_item_blademail_2_aura
return ____exports