128 lines
4.8 KiB
Lua
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
|