331 lines
15 KiB
Lua
331 lines
15 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 __TS__ArrayForEach = ____lualib.__TS__ArrayForEach
|
|
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.bristleback_quill_spray_custom = __TS__Class()
|
|
local bristleback_quill_spray_custom = ____exports.bristleback_quill_spray_custom
|
|
bristleback_quill_spray_custom.name = "bristleback_quill_spray_custom"
|
|
bristleback_quill_spray_custom.____file_path = "scripts/vscripts/abilities/heroes/bristleback/bristleback_quill_spray_custom.lua"
|
|
__TS__ClassExtends(bristleback_quill_spray_custom, BaseAbility)
|
|
function bristleback_quill_spray_custom.prototype.Precache(self, context)
|
|
PrecacheResource("particle", "particles/units/heroes/hero_bristleback/bristleback_quill_spray.vpcf", context)
|
|
PrecacheResource("particle", "particles/units/heroes/hero_bristleback/bristleback_quill_spray_impact.vpcf", context)
|
|
PrecacheResource("particle", "particles/units/heroes/hero_bristleback/bristleback_quill_spray_hit.vpcf", context)
|
|
PrecacheResource("particle", "particles/units/heroes/hero_bristleback/bristleback_quill_spray_hit_creep.vpcf", context)
|
|
end
|
|
function bristleback_quill_spray_custom.prototype.GetCastRange(self, location, target)
|
|
return self:GetSpecialValueFor("radius")
|
|
end
|
|
function bristleback_quill_spray_custom.prototype.OnSpellStart(self)
|
|
self:MakeSpray(nil, nil)
|
|
end
|
|
function bristleback_quill_spray_custom.prototype.GetIntrinsicModifierName(self)
|
|
return ____exports.modifier_bristleback_quill_spray_autocast_custom.name
|
|
end
|
|
function bristleback_quill_spray_custom.prototype.MakeSpray(self, location, isPassive)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local caster = self:GetCaster()
|
|
local projectile_speed = self:GetSpecialValueFor("projectile_speed")
|
|
local radius = self:GetSpecialValueFor("radius")
|
|
local duration = radius / projectile_speed
|
|
if location == nil then
|
|
caster:FadeGesture(ACT_DOTA_CAST_ABILITY_2)
|
|
caster:StartGesture(ACT_DOTA_CAST_ABILITY_2)
|
|
end
|
|
local x = nil
|
|
local y = nil
|
|
if location ~= nil then
|
|
x = location.x
|
|
y = location.y
|
|
end
|
|
____exports.modifier_bristleback_quillspray_custom_thinker:apply(caster, caster, self, {x = x, y = y, duration = duration, passive = isPassive})
|
|
EmitSoundOn("Hero_Bristleback.QuillSpray.Cast", caster)
|
|
end
|
|
bristleback_quill_spray_custom = __TS__Decorate(
|
|
bristleback_quill_spray_custom,
|
|
bristleback_quill_spray_custom,
|
|
{registerAbility(nil)},
|
|
{kind = "class", name = "bristleback_quill_spray_custom"}
|
|
)
|
|
____exports.bristleback_quill_spray_custom = bristleback_quill_spray_custom
|
|
____exports.modifier_bristleback_quill_spray_autocast_custom = __TS__Class()
|
|
local modifier_bristleback_quill_spray_autocast_custom = ____exports.modifier_bristleback_quill_spray_autocast_custom
|
|
modifier_bristleback_quill_spray_autocast_custom.name = "modifier_bristleback_quill_spray_autocast_custom"
|
|
modifier_bristleback_quill_spray_autocast_custom.____file_path = "scripts/vscripts/abilities/heroes/bristleback/bristleback_quill_spray_custom.lua"
|
|
__TS__ClassExtends(modifier_bristleback_quill_spray_autocast_custom, BaseModifier)
|
|
function modifier_bristleback_quill_spray_autocast_custom.prototype.____constructor(self, ...)
|
|
BaseModifier.prototype.____constructor(self, ...)
|
|
self.ability = self:GetAbility()
|
|
end
|
|
function modifier_bristleback_quill_spray_autocast_custom.prototype.IsPurgable(self)
|
|
return false
|
|
end
|
|
function modifier_bristleback_quill_spray_autocast_custom.prototype.IsPurgeException(self)
|
|
return false
|
|
end
|
|
function modifier_bristleback_quill_spray_autocast_custom.prototype.IsHidden(self)
|
|
return true
|
|
end
|
|
function modifier_bristleback_quill_spray_autocast_custom.prototype.OnCreated(self, params)
|
|
self:StartIntervalThink(0.1)
|
|
end
|
|
function modifier_bristleback_quill_spray_autocast_custom.prototype.OnIntervalThink(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local parent = self:GetParent()
|
|
if self.ability:GetAutoCastState() == true and self.ability:IsFullyCastable() and not parent:IsChanneling() and not self.ability:IsHidden() then
|
|
parent:CastAbilityNoTarget(
|
|
self.ability,
|
|
parent:GetPlayerID()
|
|
)
|
|
end
|
|
end
|
|
modifier_bristleback_quill_spray_autocast_custom = __TS__Decorate(
|
|
modifier_bristleback_quill_spray_autocast_custom,
|
|
modifier_bristleback_quill_spray_autocast_custom,
|
|
{registerModifier(nil)},
|
|
{kind = "class", name = "modifier_bristleback_quill_spray_autocast_custom"}
|
|
)
|
|
____exports.modifier_bristleback_quill_spray_autocast_custom = modifier_bristleback_quill_spray_autocast_custom
|
|
____exports.modifier_bristleback_quillspray_custom_thinker = __TS__Class()
|
|
local modifier_bristleback_quillspray_custom_thinker = ____exports.modifier_bristleback_quillspray_custom_thinker
|
|
modifier_bristleback_quillspray_custom_thinker.name = "modifier_bristleback_quillspray_custom_thinker"
|
|
modifier_bristleback_quillspray_custom_thinker.____file_path = "scripts/vscripts/abilities/heroes/bristleback/bristleback_quill_spray_custom.lua"
|
|
__TS__ClassExtends(modifier_bristleback_quillspray_custom_thinker, BaseModifier)
|
|
function modifier_bristleback_quillspray_custom_thinker.prototype.____constructor(self, ...)
|
|
BaseModifier.prototype.____constructor(self, ...)
|
|
self.caster = self:GetCaster()
|
|
self.parent = self:GetParent()
|
|
self.ability = self:GetAbility()
|
|
self.radius = 0
|
|
self.quill_base_damage = 0
|
|
self.quill_stack_damage = 0
|
|
self.quill_stack_duration = 0
|
|
self.max_damage = 0
|
|
self.attack_damage_bonus_pct = 0
|
|
self.hit_enemies = {}
|
|
self.cast_point = Vector(0, 0, 0)
|
|
self.passive = false
|
|
end
|
|
function modifier_bristleback_quillspray_custom_thinker.prototype.IsHidden(self)
|
|
return true
|
|
end
|
|
function modifier_bristleback_quillspray_custom_thinker.prototype.IsPurgable(self)
|
|
return false
|
|
end
|
|
function modifier_bristleback_quillspray_custom_thinker.prototype.RemoveOnDeath(self)
|
|
return false
|
|
end
|
|
function modifier_bristleback_quillspray_custom_thinker.prototype.GetAttributes(self)
|
|
return MODIFIER_ATTRIBUTE_MULTIPLE
|
|
end
|
|
function modifier_bristleback_quillspray_custom_thinker.prototype.OnCreated(self, params)
|
|
self.radius = self.ability:GetSpecialValueFor("radius")
|
|
self.quill_base_damage = self.ability:GetSpecialValueFor("quill_base_damage")
|
|
self.quill_stack_damage = self.ability:GetSpecialValueFor("quill_stack_damage")
|
|
self.quill_stack_duration = self.ability:GetSpecialValueFor("quill_stack_duration")
|
|
self.max_damage = self.ability:GetSpecialValueFor("max_damage")
|
|
self.attack_damage_bonus_pct = self.ability:GetSpecialValueFor("attack_damage_bonus_pct")
|
|
self.passive = params.passive
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
self.cast_point = self.parent:GetAbsOrigin()
|
|
if params.x ~= nil and params.y ~= nil then
|
|
self.cast_point = GetGroundPosition(
|
|
Vector(params.x, params.y, 0),
|
|
nil
|
|
)
|
|
end
|
|
local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_bristleback/bristleback_quill_spray.vpcf", PATTACH_WORLDORIGIN, nil)
|
|
ParticleManager:SetParticleControl(particle, 0, self.cast_point)
|
|
self:AddParticle(
|
|
particle,
|
|
false,
|
|
false,
|
|
-1,
|
|
false,
|
|
false
|
|
)
|
|
self.hit_enemies = {}
|
|
self:StartIntervalThink(FrameTime())
|
|
end
|
|
function modifier_bristleback_quillspray_custom_thinker.prototype.OnIntervalThink(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local radius_pct = math.min(
|
|
(self:GetDuration() - self:GetRemainingTime()) / self:GetDuration(),
|
|
1
|
|
)
|
|
local origin = self.cast_point
|
|
local enemies = FindUnitsInRadius(
|
|
self.parent:GetTeamNumber(),
|
|
origin,
|
|
nil,
|
|
self.radius * radius_pct,
|
|
DOTA_UNIT_TARGET_TEAM_ENEMY,
|
|
DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP,
|
|
DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES,
|
|
FIND_ANY_ORDER,
|
|
false
|
|
)
|
|
__TS__ArrayForEach(
|
|
enemies,
|
|
function(____, enemy)
|
|
if not (self.hit_enemies[enemy:GetEntityIndex()] ~= nil) then
|
|
self.hit_enemies[enemy:GetEntityIndex()] = true
|
|
local quill_spray_stacks = 0
|
|
local quill_spray_modifier = enemy:FindModifierByName("modifier_bristleback_quill_spray_custom")
|
|
if quill_spray_modifier ~= nil then
|
|
quill_spray_stacks = quill_spray_modifier:GetStackCount()
|
|
end
|
|
local attackBonus = self.caster:GetAverageTrueAttackDamage(enemy) * self.attack_damage_bonus_pct / 100
|
|
local damage_flags = DOTA_DAMAGE_FLAG_BYPASSES_BLOCK
|
|
ApplyDamage({
|
|
victim = enemy,
|
|
damage = math.min(self.quill_base_damage + self.quill_stack_damage * quill_spray_stacks + attackBonus, self.max_damage),
|
|
damage_type = DAMAGE_TYPE_PHYSICAL,
|
|
damage_flags = damage_flags,
|
|
attacker = self.caster,
|
|
ability = self.ability
|
|
})
|
|
local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_bristleback/bristleback_quill_spray_impact.vpcf", PATTACH_ABSORIGIN_FOLLOW, enemy)
|
|
ParticleManager:SetParticleControlEnt(
|
|
particle,
|
|
1,
|
|
enemy,
|
|
PATTACH_ABSORIGIN_FOLLOW,
|
|
"attach_hitloc",
|
|
enemy:GetAbsOrigin(),
|
|
true
|
|
)
|
|
ParticleManager:ReleaseParticleIndex(particle)
|
|
EmitSoundOn("Hero_Bristleback.QuillSpray.Target", enemy)
|
|
____exports.modifier_bristleback_quill_spray_custom:apply(
|
|
enemy,
|
|
self.caster,
|
|
self.ability,
|
|
{duration = self.quill_stack_duration * (1 - enemy:GetStatusResistance())}
|
|
)
|
|
____exports.modifier_bristleback_quill_spray_custom_count:apply(
|
|
enemy,
|
|
self.caster,
|
|
self.ability,
|
|
{duration = self.quill_stack_duration * (1 - enemy:GetStatusResistance())}
|
|
)
|
|
end
|
|
end
|
|
)
|
|
end
|
|
modifier_bristleback_quillspray_custom_thinker = __TS__Decorate(
|
|
modifier_bristleback_quillspray_custom_thinker,
|
|
modifier_bristleback_quillspray_custom_thinker,
|
|
{registerModifier(nil)},
|
|
{kind = "class", name = "modifier_bristleback_quillspray_custom_thinker"}
|
|
)
|
|
____exports.modifier_bristleback_quillspray_custom_thinker = modifier_bristleback_quillspray_custom_thinker
|
|
____exports.modifier_bristleback_quill_spray_custom = __TS__Class()
|
|
local modifier_bristleback_quill_spray_custom = ____exports.modifier_bristleback_quill_spray_custom
|
|
modifier_bristleback_quill_spray_custom.name = "modifier_bristleback_quill_spray_custom"
|
|
modifier_bristleback_quill_spray_custom.____file_path = "scripts/vscripts/abilities/heroes/bristleback/bristleback_quill_spray_custom.lua"
|
|
__TS__ClassExtends(modifier_bristleback_quill_spray_custom, BaseModifier)
|
|
function modifier_bristleback_quill_spray_custom.prototype.____constructor(self, ...)
|
|
BaseModifier.prototype.____constructor(self, ...)
|
|
self.parent = self:GetParent()
|
|
end
|
|
function modifier_bristleback_quill_spray_custom.prototype.IsPurgable(self)
|
|
return false
|
|
end
|
|
function modifier_bristleback_quill_spray_custom.prototype.OnCreated(self, params)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
self:IncrementStackCount()
|
|
local particle_name = "particles/units/heroes/hero_bristleback/bristleback_quill_spray_hit.vpcf"
|
|
if self.parent:IsCreep() then
|
|
particle_name = "particles/units/heroes/hero_bristleback/bristleback_quill_spray_hit_creep.vpcf"
|
|
end
|
|
local particle = ParticleManager:CreateParticle(particle_name, PATTACH_ABSORIGIN_FOLLOW, self.parent)
|
|
ParticleManager:SetParticleControlEnt(
|
|
particle,
|
|
0,
|
|
self.parent,
|
|
PATTACH_ABSORIGIN_FOLLOW,
|
|
"attach_hitloc",
|
|
self.parent:GetAbsOrigin(),
|
|
true
|
|
)
|
|
ParticleManager:SetParticleControlEnt(
|
|
particle,
|
|
1,
|
|
self.parent,
|
|
PATTACH_ABSORIGIN_FOLLOW,
|
|
"attach_hitloc",
|
|
self.parent:GetAbsOrigin(),
|
|
true
|
|
)
|
|
self:AddParticle(
|
|
particle,
|
|
false,
|
|
false,
|
|
-1,
|
|
false,
|
|
false
|
|
)
|
|
end
|
|
function modifier_bristleback_quill_spray_custom.prototype.OnRefresh(self, params)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
self:IncrementStackCount()
|
|
end
|
|
modifier_bristleback_quill_spray_custom = __TS__Decorate(
|
|
modifier_bristleback_quill_spray_custom,
|
|
modifier_bristleback_quill_spray_custom,
|
|
{registerModifier(nil)},
|
|
{kind = "class", name = "modifier_bristleback_quill_spray_custom"}
|
|
)
|
|
____exports.modifier_bristleback_quill_spray_custom = modifier_bristleback_quill_spray_custom
|
|
____exports.modifier_bristleback_quill_spray_custom_count = __TS__Class()
|
|
local modifier_bristleback_quill_spray_custom_count = ____exports.modifier_bristleback_quill_spray_custom_count
|
|
modifier_bristleback_quill_spray_custom_count.name = "modifier_bristleback_quill_spray_custom_count"
|
|
modifier_bristleback_quill_spray_custom_count.____file_path = "scripts/vscripts/abilities/heroes/bristleback/bristleback_quill_spray_custom.lua"
|
|
__TS__ClassExtends(modifier_bristleback_quill_spray_custom_count, BaseModifier)
|
|
function modifier_bristleback_quill_spray_custom_count.prototype.IsHidden(self)
|
|
return true
|
|
end
|
|
function modifier_bristleback_quill_spray_custom_count.prototype.IsPurgable(self)
|
|
return false
|
|
end
|
|
function modifier_bristleback_quill_spray_custom_count.prototype.GetAttributes(self)
|
|
return MODIFIER_ATTRIBUTE_MULTIPLE
|
|
end
|
|
function modifier_bristleback_quill_spray_custom_count.prototype.OnDestroy(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local modifier = self:GetParent():FindModifierByName("modifier_bristleback_quill_spray_custom")
|
|
if modifier ~= nil then
|
|
modifier:DecrementStackCount()
|
|
end
|
|
end
|
|
modifier_bristleback_quill_spray_custom_count = __TS__Decorate(
|
|
modifier_bristleback_quill_spray_custom_count,
|
|
modifier_bristleback_quill_spray_custom_count,
|
|
{registerModifier(nil)},
|
|
{kind = "class", name = "modifier_bristleback_quill_spray_custom_count"}
|
|
)
|
|
____exports.modifier_bristleback_quill_spray_custom_count = modifier_bristleback_quill_spray_custom_count
|
|
return ____exports
|