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

224 lines
8.0 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 BaseModifier = ____dota_ts_adapter.BaseModifier
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.modifier_general_hunger = __TS__Class()
local modifier_general_hunger = ____exports.modifier_general_hunger
modifier_general_hunger.name = "modifier_general_hunger"
modifier_general_hunger.____file_path = "scripts/vscripts/abilities/modifiers/modifier_general_hunger.lua"
__TS__ClassExtends(modifier_general_hunger, BaseModifier)
function modifier_general_hunger.prototype.____constructor(self, ...)
BaseModifier.prototype.____constructor(self, ...)
self.maxstack = 100
end
function modifier_general_hunger.prototype.IsHidden(self)
return false
end
function modifier_general_hunger.prototype.IsDebuff(self)
return false
end
function modifier_general_hunger.prototype.IsPurgable(self)
return false
end
function modifier_general_hunger.prototype.OnCreated(self, params)
if IsServer() then
self:SetDuration(3.01, true)
self:StartIntervalThink(3)
end
end
function modifier_general_hunger.prototype.OnRefresh(self, params)
if IsServer() then
self:SetDuration(3.01, true)
self:StartIntervalThink(3)
end
end
function modifier_general_hunger.prototype.OnIntervalThink(self)
if IsServer() then
self:SetStackCount(self:GetStackCount() - 1)
self:SetDuration(3.01, true)
if self:GetStackCount() < 1 then
self:Destroy()
end
end
end
function modifier_general_hunger.prototype.DeclareFunctions(self)
return {MODIFIER_PROPERTY_STATS_AGILITY_BONUS, MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, MODIFIER_PROPERTY_STATS_STRENGTH_BONUS}
end
function modifier_general_hunger.prototype.GetModifierBonusStats_Strength(self)
if not IsServer() then
return 0
end
local parent = self:GetParent()
if not parent then
return 0
end
if not parent:IsRealHero() then
return 0
end
do
local function ____catch(e)
return true, 0
end
local ____try, ____hasReturned, ____returnValue = pcall(function()
local hero = parent
local baseStr = hero:GetBaseStrength() or 0
return true, math.ceil(baseStr * (self:GetStackCount() * 0.01))
end)
if not ____try then
____hasReturned, ____returnValue = ____catch(____hasReturned)
end
if ____hasReturned then
return ____returnValue
end
end
end
function modifier_general_hunger.prototype.GetModifierBonusStats_Agility(self)
if not IsServer() then
return 0
end
local parent = self:GetParent()
if not parent then
return 0
end
if not parent:IsRealHero() then
return 0
end
local hero = parent
local baseAgi = hero:GetBaseAgility()
return math.ceil(baseAgi * (self:GetStackCount() * 0.01))
end
function modifier_general_hunger.prototype.GetModifierBonusStats_Intellect(self)
if not IsServer() then
return 0
end
local parent = self:GetParent()
if not parent then
return 0
end
if not parent:IsRealHero() then
return 0
end
do
local function ____catch(e)
return true, 0
end
local ____try, ____hasReturned, ____returnValue = pcall(function()
local hero = parent
local baseInt = hero:GetBaseIntellect() or 0
return true, math.ceil(baseInt * (self:GetStackCount() * 0.01))
end)
if not ____try then
____hasReturned, ____returnValue = ____catch(____hasReturned)
end
if ____hasReturned then
return ____returnValue
end
end
end
function modifier_general_hunger.prototype.IncrementStackCount(self)
if self:GetStackCount() >= self.maxstack then
self:SetStackCount(self.maxstack)
else
BaseModifier.prototype.SetStackCount(
self,
self:GetStackCount() + 1
)
end
end
function modifier_general_hunger.prototype.GetTexture(self)
return "life_stealer_rage"
end
modifier_general_hunger = __TS__Decorate(
modifier_general_hunger,
modifier_general_hunger,
{registerModifier(nil)},
{kind = "class", name = "modifier_general_hunger"}
)
____exports.modifier_general_hunger = modifier_general_hunger
--- Несколько экземпляров на юните — у каждого свой таймер (каждый приём пищи живёт 60 сек).
____exports.modifier_general_hunger_fulled = __TS__Class()
local modifier_general_hunger_fulled = ____exports.modifier_general_hunger_fulled
modifier_general_hunger_fulled.name = "modifier_general_hunger_fulled"
modifier_general_hunger_fulled.____file_path = "scripts/vscripts/abilities/modifiers/modifier_general_hunger.lua"
__TS__ClassExtends(modifier_general_hunger_fulled, BaseModifier)
function modifier_general_hunger_fulled.prototype.IsHidden(self)
return false
end
function modifier_general_hunger_fulled.prototype.IsDebuff(self)
return false
end
function modifier_general_hunger_fulled.prototype.IsPurgable(self)
return false
end
function modifier_general_hunger_fulled.prototype.GetAttributes(self)
return MODIFIER_ATTRIBUTE_MULTIPLE
end
function modifier_general_hunger_fulled.prototype.OnCreated(self, params)
if IsServer() then
local duration = params.duration or 60
self:SetDuration(duration, true)
end
end
modifier_general_hunger_fulled = __TS__Decorate(
modifier_general_hunger_fulled,
modifier_general_hunger_fulled,
{registerModifier(nil)},
{kind = "class", name = "modifier_general_hunger_fulled"}
)
____exports.modifier_general_hunger_fulled = modifier_general_hunger_fulled
--- Максимум «слотов» сытости для еды с баффами (энерго-напиток и т.п.). Каждый слот = один приём, свой таймер 60 сек.
____exports.BUFF_FOOD_MAX_SLOTS = 3
--- Слот сытости от еды с баффами. Вешается только такими предметами (energy_drink и т.д.). Лимит BUFF_FOOD_MAX_SLOTS штук.
____exports.modifier_buff_food_slot = __TS__Class()
local modifier_buff_food_slot = ____exports.modifier_buff_food_slot
modifier_buff_food_slot.name = "modifier_buff_food_slot"
modifier_buff_food_slot.____file_path = "scripts/vscripts/abilities/modifiers/modifier_general_hunger.lua"
__TS__ClassExtends(modifier_buff_food_slot, BaseModifier)
function modifier_buff_food_slot.prototype.IsHidden(self)
return true
end
function modifier_buff_food_slot.prototype.IsDebuff(self)
return false
end
function modifier_buff_food_slot.prototype.IsPurgable(self)
return false
end
function modifier_buff_food_slot.prototype.GetAttributes(self)
return MODIFIER_ATTRIBUTE_MULTIPLE
end
function modifier_buff_food_slot.prototype.OnCreated(self, params)
if IsServer() then
local duration = params.duration or 60
self:SetDuration(duration, true)
end
end
function modifier_buff_food_slot.prototype.GetTexture(self)
return "life_stealer_rage"
end
modifier_buff_food_slot = __TS__Decorate(
modifier_buff_food_slot,
modifier_buff_food_slot,
{registerModifier(nil)},
{kind = "class", name = "modifier_buff_food_slot"}
)
____exports.modifier_buff_food_slot = modifier_buff_food_slot
--- Считает, сколько слотов бафф-еды сейчас на юните (для проверки лимита).
function ____exports.getBuffFoodSlotCount(self, unit)
local count = 0
do
local i = 0
while i < unit:GetModifierCount() do
if unit:GetModifierNameByIndex(i) == ____exports.modifier_buff_food_slot.name then
count = count + 1
end
i = i + 1
end
end
return count
end
return ____exports