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

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