194 lines
6.9 KiB
Lua
194 lines
6.9 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_juggernaut_samurai_soul = __TS__Class()
|
|
local ability_juggernaut_samurai_soul = ____exports.ability_juggernaut_samurai_soul
|
|
ability_juggernaut_samurai_soul.name = "ability_juggernaut_samurai_soul"
|
|
ability_juggernaut_samurai_soul.____file_path = "scripts/vscripts/abilities/heroes/juggernaut/ability_juggernaut_samurai_soul.lua"
|
|
__TS__ClassExtends(ability_juggernaut_samurai_soul, BaseAbility)
|
|
function ability_juggernaut_samurai_soul.prototype.GetIntrinsicModifierName(self)
|
|
return "modifier_juggernaut_samurai_soul"
|
|
end
|
|
ability_juggernaut_samurai_soul = __TS__Decorate(
|
|
ability_juggernaut_samurai_soul,
|
|
ability_juggernaut_samurai_soul,
|
|
{registerAbility(nil)},
|
|
{kind = "class", name = "ability_juggernaut_samurai_soul"}
|
|
)
|
|
____exports.ability_juggernaut_samurai_soul = ability_juggernaut_samurai_soul
|
|
____exports.modifier_juggernaut_samurai_soul = __TS__Class()
|
|
local modifier_juggernaut_samurai_soul = ____exports.modifier_juggernaut_samurai_soul
|
|
modifier_juggernaut_samurai_soul.name = "modifier_juggernaut_samurai_soul"
|
|
modifier_juggernaut_samurai_soul.____file_path = "scripts/vscripts/abilities/heroes/juggernaut/ability_juggernaut_samurai_soul.lua"
|
|
__TS__ClassExtends(modifier_juggernaut_samurai_soul, BaseModifier)
|
|
function modifier_juggernaut_samurai_soul.prototype.____constructor(self, ...)
|
|
BaseModifier.prototype.____constructor(self, ...)
|
|
self.lastAttackTime = 0
|
|
self.RESET_TIMEOUT = self:GetAbility():GetSpecialValueFor("cooldown")
|
|
self.maxRestoreCount = 2
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.IsHidden(self)
|
|
return false
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.IsPurgable(self)
|
|
return false
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.IsDebuff(self)
|
|
if self:GetStackCount() > 0 then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.RemoveOnDeath(self)
|
|
return false
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.OnCreated(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local ability = self:GetAbility()
|
|
if ability then
|
|
local configuredLimit = ability:GetSpecialValueFor("max_restore_count")
|
|
if configuredLimit > 0 then
|
|
self.maxRestoreCount = configuredLimit
|
|
end
|
|
end
|
|
self:StartIntervalThink(0.1)
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.OnIntervalThink(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local currentTime = GameRules:GetGameTime()
|
|
local timeSinceLastAttack = currentTime - self.lastAttackTime
|
|
if timeSinceLastAttack >= self.RESET_TIMEOUT and self:GetStackCount() > 0 then
|
|
local parent = self:GetParent()
|
|
if parent and parent:IsRealHero() then
|
|
local hero = parent
|
|
self:SetStackCount(0)
|
|
hero:CalculateStatBonus(true)
|
|
end
|
|
end
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.DeclareFunctions(self)
|
|
return {
|
|
MODIFIER_PROPERTY_MIN_HEALTH,
|
|
MODIFIER_PROPERTY_STATS_AGILITY_BONUS,
|
|
MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
|
|
MODIFIER_PROPERTY_STATS_STRENGTH_BONUS,
|
|
MODIFIER_EVENT_ON_DEATH
|
|
}
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.OnDeath(self, event)
|
|
if event.unit == self:GetParent() then
|
|
self:GetCaster():RemoveModifierByName("modifier_juggernaut_samurai_soul")
|
|
end
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.GetModifierBonusStats_Strength(self)
|
|
if not IsServer() then
|
|
return 0
|
|
end
|
|
local parent = self:GetParent()
|
|
if not parent then
|
|
return 0
|
|
end
|
|
if parent:PassivesDisabled() then
|
|
return 0
|
|
end
|
|
if not parent:IsRealHero() then
|
|
return 0
|
|
end
|
|
local hero = parent
|
|
local baseStr = hero:GetBaseStrength()
|
|
return -baseStr * (self:GetStackCount() * (0.01 * self:GetAbility():GetSpecialValueFor("debuff_pct")))
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.GetModifierBonusStats_Agility(self)
|
|
if not IsServer() then
|
|
return 0
|
|
end
|
|
local parent = self:GetParent()
|
|
if not parent then
|
|
return 0
|
|
end
|
|
if parent:PassivesDisabled() then
|
|
return 0
|
|
end
|
|
if not parent:IsRealHero() then
|
|
return 0
|
|
end
|
|
local hero = parent
|
|
local baseAgi = hero:GetBaseAgility()
|
|
return -baseAgi * (self:GetStackCount() * (0.01 * self:GetAbility():GetSpecialValueFor("debuff_pct")))
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.GetModifierBonusStats_Intellect(self)
|
|
if not IsServer() then
|
|
return 0
|
|
end
|
|
local parent = self:GetParent()
|
|
if not parent then
|
|
return 0
|
|
end
|
|
if parent:PassivesDisabled() then
|
|
return 0
|
|
end
|
|
if not parent:IsRealHero() then
|
|
return 0
|
|
end
|
|
local hero = parent
|
|
local baseInt = hero:GetBaseIntellect()
|
|
return -baseInt * (self:GetStackCount() * (0.01 * self:GetAbility():GetSpecialValueFor("debuff_pct")))
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.GetMinHealth(self)
|
|
if self:GetParent():PassivesDisabled() then
|
|
return 0
|
|
end
|
|
self:SetDuration(11, true)
|
|
self.lastAttackTime = GameRules:GetGameTime()
|
|
if self:GetStackCount() >= self.maxRestoreCount then
|
|
return 0
|
|
end
|
|
if self:GetCaster():GetHealth() < 10 then
|
|
self:GetCaster():SetHealth(self:GetCaster():GetMaxHealth())
|
|
self:IncrementStackCount()
|
|
self:GetCaster():CalculateStatBonus(true)
|
|
end
|
|
return 1
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.OnDestroy(self)
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
local caster = self:GetCaster()
|
|
local ability = self:GetAbility()
|
|
if caster and not caster:IsNull() and caster:IsAlive() and ability and not ability:IsNull() then
|
|
caster:AddNewModifier(
|
|
self:GetParent(),
|
|
ability,
|
|
"modifier_juggernaut_samurai_soul",
|
|
{}
|
|
)
|
|
end
|
|
end
|
|
function modifier_juggernaut_samurai_soul.prototype.GetTexture(self)
|
|
if self:GetStackCount() > 0 then
|
|
return "new_heroes/juggernaut_death"
|
|
else
|
|
return "new_heroes/juggernaut_miracle"
|
|
end
|
|
end
|
|
modifier_juggernaut_samurai_soul = __TS__Decorate(
|
|
modifier_juggernaut_samurai_soul,
|
|
modifier_juggernaut_samurai_soul,
|
|
{registerModifier(nil)},
|
|
{kind = "class", name = "modifier_juggernaut_samurai_soul"}
|
|
)
|
|
____exports.modifier_juggernaut_samurai_soul = modifier_juggernaut_samurai_soul
|
|
return ____exports
|