261 lines
10 KiB
Lua
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
|