Решено Modifiers для innate

rosomaxa12

Активный
24 Авг 2018
75
3
Проект
colosseum
В общем решил сделать кастомный innate для Акса. Брал за основу innate´s от Valve
Код:
    "axe_innate_regen"
    {
        "BaseClass"             "ability_lua"
        "ScriptFile"            "abilities/axe_innate_regen"
        "AbilityBehavior"       "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_INNATE_UI"
        "MaxLevel"                "4"
        "Innate"                "1"
      
        "AbilityValues"
        {
            "health_regen_per_unit"
            {
                "value"                        "2"
            }
            "mana_regen_per_unit"
            {
                "value"                        "1"
            }
            "radius"
            {
                "value"                        "300"
            }
            "max_units"
            {
                "value"                        "30"
            }
        }
    }

Как я понял "AbilitySpecial" заменили на "AbilityValues" и немного их переделали, ок. Сам скилл и modifier я подключил, в игре он виден
Но чтобы я не менял в самом modifier мне всегда выдает nil value на выходе. Что-то поменялось в modifiers также или я в чем-то ошибаюсь. Вот код


Lua:
if modifier_axe_innate_regen == nil then
    modifier_axe_innate_regen = class({})
end

function modifier_axe_innate_regen:IsHidden()
    return false
end

function modifier_axe_innate_regen:IsPurgable()
    return false
end

function modifier_axe_innate_regen:RemoveOnDeath()
    return false
end

function modifier_axe_innate_regen:OnCreated(kv)
    if IsServer() then
    local ability = self:GetAbility()
        self.healthRegenPerUnit = ability:GetSpecialValueFor("health_regen_per_unit")
        self.manaRegenPerUnit = ability:GetSpecialValueFor("mana_regen_per_unit")
        self.radius = ability:GetSpecialValueFor("radius")
        self.maxUnits = ability:GetSpecialValueFor("max_units")

        self.currentRegenCount = 0
        self:StartIntervalThink(0.5)
    end
end

function modifier_axe_innate_regen:OnIntervalThink()
    if IsServer() then
        local parent = self:GetParent()
      
        -- Поиск всех вражеских юнитов (крипы и герои) в радиусе
        local enemyUnits = FindUnitsInRadius(
            parent:GetTeamNumber(),
            parent:GetAbsOrigin(),
            nil,
            self.radius,
            DOTA_UNIT_TARGET_TEAM_ENEMY,
            DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO,
            DOTA_UNIT_TARGET_FLAG_NONE,
            FIND_ANY_ORDER,
            false
        )
        local unitCount = #enemyUnits
        if unitCount > self.maxUnits then
            unitCount = self.maxUnits
        end
        self.currentRegenCount = unitCount

        -- Отдельно ищем вражеских героев для отображения (для стаков модификатора)
        local enemyHeroes = FindUnitsInRadius(
            parent:GetTeamNumber(),
            parent:GetAbsOrigin(),
            nil,
            self.radius,
            DOTA_UNIT_TARGET_TEAM_ENEMY,
            DOTA_UNIT_TARGET_HERO,
            DOTA_UNIT_TARGET_FLAG_NONE,
            FIND_ANY_ORDER,
            false
        )
        local heroCount = #enemyHeroes
        self:SetStackCount(heroCount)
    end
end

function modifier_axe_innate_regen:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT,
        MODIFIER_PROPERTY_MANA_REGEN_CONSTANT
    }
    return funcs
end

function modifier_axe_innate_regen:GetModifierConstantHealthRegen()
    return self.healthRegenPerUnit * self.currentRegenCount
end

function modifier_axe_innate_regen:GetModifierConstantManaRegen()
    return self.manaRegenPerUnit * self.currentRegenCount
end

Собственно и сами ошибки из консоли
Код:
    ...scripts\vscripts\modifiers\modifier_axe_innate_regen.lua:79: in function <...scripts\vscripts\modifiers\modifier_axe_innate_regen.lua:78>
Script Runtime Error: ...scripts\vscripts\modifiers\modifier_axe_innate_regen.lua:79: attempt to perform arithmetic on field 'healthRegenPerUnit' (a nil value)
stack traceback:
    ...scripts\vscripts\modifiers\modifier_axe_innate_regen.lua:79: in function <...scripts\vscripts\modifiers\modifier_axe_innate_regen.lua:78>
...scripts\vscripts\modifiers\modifier_axe_innate_regen.lua:83: attempt to perform arithmetic on field 'manaRegenPerUnit' (a nil value)
stack traceback:
 
Последнее редактирование:
Попробуй убрать проверку IsServer() в блоке OnCreated
Как бы я не менял этот код, даже с помощью gpt ошибка всегда заключается в конечной установке этих характеристик герою.
Я попробовал создать другой скил (ульт легионке) и ошибка всегда в
function modifier_gladiators_unite_buff_simple:GetModifierPhysicalArmorBonus()
print(self.bonusArmor)
return self.bonusArmor or 0
end

Ибо в консоле всегда идет сначала 2 раза нормальное значение а потом nil. Либо если я уберу как ты и посоветовал IsServer() в блоке OnCreated то просто выдает 0.
Либо Валве что-то сломали либо даже gpt не вкурсе как это дерьмо исправить
 
Короче, проблема была в том где и что проверять .На сервере или у клиента. Такие вещи как проверка данных скила лучше делать на стороне клиента а остальные механики на стороне сервера. Звучит просто и понятно но я заманался с этим 2 дня.
 
  • Нравится
Реакции: vulkantsk
Реклама: