Проблема с lua талантом.

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
Вообщем сделал скилл,делаю для него свой талант,но вот проблема,на вид всё правильно,но выдаёт ошибку, типо значение не найдено.
abilities\snow_ball.lua:41: attempt to call method 'HasTalent' (a nil value)

Если нужно,вот сама 41-ая строка:

Код:
         local pers = self:GetAbility():GetSpecialValueFor("health")
          if self:GetCaster():HasTalent("special_bonus_unique_snow2") then
              local value = self:GetCaster():FindTalentValue("special_bonus_unique_snow2")
              pers = value + pers
Также вот сам бонус,который улучшает скилл:

Код:
        "special_bonus_unique_snow2"
    {
        // General
        //-------------------------------------------------------------------------------------------------------------
        "ID"                                        "30000"
        "BaseClass"             "special_bonus_undefined"
        "AbilityType"                        "DOTA_ABILITY_TYPE_ATTRIBUTES"
        "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_PASSIVE"

        // Special
        //-------------------------------------------------------------------------------------------------------------
        "AbilitySpecial"
        {
            "01"
            {
                "var_type"                    "FIELD_INTEGER"
                "value"                "50"
            }
        }
    }

Что не так?
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
На клиенте нет такой функции
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Хотя возможно проблема не в этом. Покажи код полностью
 

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
Код:
if snow_ball == nil then snow_ball = class({}) end

LinkLuaModifier("modifier_snow_ball", "abilities/snow_ball", LUA_MODIFIER_MOTION_NONE)

function snow_ball:GetIntrinsicModifierName()
  return "modifier_snow_ball"
end

if modifier_snow_ball == nil then modifier_snow_ball = class({}) end

function modifier_snow_ball:IsHidden()
  return false
end

function modifier_snow_ball:IsPurgable()
  return false
end

function modifier_snow_ball:DeclareFunctions()
    local funcs = {
        MODIFIER_EVENT_ON_ATTACK_LANDED,
    }

    return funcs
end

function modifier_snow_ball:OnAttackLanded( params )
    if IsServer() then
        if params.attacker == self:GetParent() and ( not self:GetParent():IsIllusion() ) then
            if self:GetParent():PassivesDisabled() then
                return 0
            end
      if self:GetAbility():IsCooldownReady() then
        local target = params.target
        if target ~= nil and target:IsBuilding() == false then
                    if target:GetUnitName() == "npc_dota_warlock_golem_1" then
                        return nil
                    end
          local pers = self:GetAbility():GetSpecialValueFor("health_pers")
          --if self:GetCaster():HasTalent("special_bonus_unique_snow2") then
              --local value = self:GetCaster():FindTalentValue("special_bonus_snow2")
              --pers = value + pers
          end
          if target:GetHealthPercent() <= self:GetAbility():GetSpecialValueFor("health") then
            EmitSoundOn("Hero_Oracle.FalsePromise.FP", self:GetCaster())
            local nFXIndex = ParticleManager:CreateParticle( "particles/econ/items/phantom_assassin/phantom_assassin_arcana_elder_smith/phantom_assassin_crit_arcana_swoop_c.vpcf", PATTACH_CUSTOMORIGIN, target );
                ParticleManager:SetParticleControlEnt( nFXIndex, 0, target, PATTACH_POINT_FOLLOW, "attach_hitloc", target:GetOrigin(), true );
            ParticleManager:SetParticleControlEnt( nFXIndex, 1, target, PATTACH_POINT_FOLLOW, "attach_hitloc", target:GetOrigin(), true );
            ParticleManager:SetParticleControl( nFXIndex, 2, Vector(100, 100, 100))
            ParticleManager:SetParticleControlEnt( nFXIndex, 10, target, PATTACH_POINT_FOLLOW, "attach_hitloc", target:GetOrigin(), true );
                ParticleManager:ReleaseParticleIndex( nFXIndex );
            target:Kill(self:GetAbility(), self:GetCaster())
            self:GetAbility():StartCooldown(self:GetAbility():GetCooldown(self:GetAbility():GetLevel()))
          end
        end
      end
        end
    end

    return 0
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Ты функцию HasTalent себе в кастомку добавлял?
Найди её в той кастомке где ты подсмотрел HasTalent и добавь себе.
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
talents.lua, utils.lua) Хз
Если смотришь на гитхабе то поиск используй
 

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
Точно такая же?
Вот так написано в util.lua где я нашёл. Себе вписал также. (кроме Hastalent,я ещё добавил они вроде подходили. Потом убрал,результаты не менялись.)
Код:
function CDOTA_BaseNPC:HasTalent(talentName)
    if self:HasAbility(talentName) then
        if self:FindAbilityByName(talentName):GetLevel() > 0 then return true end
    end
    return false
end

function CDOTA_BaseNPC:FindTalentValue(talentName)
    if self:HasAbility(talentName) then
        return self:FindAbilityByName(talentName):GetSpecialValueFor("value")
    end
    return nil
end

function CDOTABaseAbility:GetTalentSpecialValueFor(value)
    local base = self:GetSpecialValueFor(value)
    local talentName
    local kv = self:GetAbilityKeyValues()
    for k,v in pairs(kv) do -- trawl through keyvalues
        if k == "AbilitySpecial" then
            for l,m in pairs(v) do
                if m[value] then
                    talentName = m["LinkedSpecialBonus"]
                end
            end
        end
    end
    if talentName then
        local talent = self:GetCaster():FindAbilityByName(talentName)
        if talent and talent:GetLevel() > 0 then base = base + talent:GetSpecialValueFor("value") end
    end
    return base
end
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Вот так написано в util.lua где я нашёл. Себе вписал также. (кроме Hastalent,я ещё добавил они вроде подходили. Потом убрал,результаты не менялись.)
Код:
function CDOTA_BaseNPC:HasTalent(talentName)
    if self:HasAbility(talentName) then
        if self:FindAbilityByName(talentName):GetLevel() > 0 then return true end
    end
    return false
end

function CDOTA_BaseNPC:FindTalentValue(talentName)
    if self:HasAbility(talentName) then
        return self:FindAbilityByName(talentName):GetSpecialValueFor("value")
    end
    return nil
end

function CDOTABaseAbility:GetTalentSpecialValueFor(value)
    local base = self:GetSpecialValueFor(value)
    local talentName
    local kv = self:GetAbilityKeyValues()
    for k,v in pairs(kv) do -- trawl through keyvalues
        if k == "AbilitySpecial" then
            for l,m in pairs(v) do
                if m[value] then
                    talentName = m["LinkedSpecialBonus"]
                end
            end
        end
    end
    if talentName then
        local talent = self:GetCaster():FindAbilityByName(talentName)
        if talent and talent:GetLevel() > 0 then base = base + talent:GetSpecialValueFor("value") end
    end
    return base
end
Я думаю можно заменить например талант на модификатор, тоесть при выборе таланта, ты выбираешь модификатор дополнительный, он как раз и ссылается на модификатор таланта, и собственно в коде пишешь HasModifier, ну как то так, чисто мое предположение реализации.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Вот так написано в util.lua где я нашёл. Себе вписал также. (кроме Hastalent,я ещё добавил они вроде подходили. Потом убрал,результаты не менялись.)
Код:
function CDOTA_BaseNPC:HasTalent(talentName)
    if self:HasAbility(talentName) then
        if self:FindAbilityByName(talentName):GetLevel() > 0 then return true end
    end
    return false
end

function CDOTA_BaseNPC:FindTalentValue(talentName)
    if self:HasAbility(talentName) then
        return self:FindAbilityByName(talentName):GetSpecialValueFor("value")
    end
    return nil
end

function CDOTABaseAbility:GetTalentSpecialValueFor(value)
    local base = self:GetSpecialValueFor(value)
    local talentName
    local kv = self:GetAbilityKeyValues()
    for k,v in pairs(kv) do -- trawl through keyvalues
        if k == "AbilitySpecial" then
            for l,m in pairs(v) do
                if m[value] then
                    talentName = m["LinkedSpecialBonus"]
                end
            end
        end
    end
    if talentName then
        local talent = self:GetCaster():FindAbilityByName(talentName)
        if talent and talent:GetLevel() > 0 then base = base + talent:GetSpecialValueFor("value") end
    end
    return base
end


ZLOY, конечно, довольно мягко тебе, Pupok, намекает, но ты вообще разбирался в файлах проекта, который копируешь?

Суть ошибки в том, что ты вызываешь у handle героя метод HasTalant, которого естественного у него нет, так как метод это самописный.
Ребята из того проекта переписали сам класс героя, добавив к нему этот самописный метод. Тебе нужно разобраться, какие файлы в их проекте отвечают за это "переопределение"/"расширение" класса и скопировать их себе в точности. Только тогда у тебя заработает это обращение HasTalant.

Можно конечно поступить проще: просто в скрипте твоей абилки проверять у героя наличие этого таланта.
 

EYEOFLIE

Активный
28 Янв 2018
137
4
ZLOY, конечно, довольно мягко тебе, Pupok, намекает, но ты вообще разбирался в файлах проекта, который копируешь?

Суть ошибки в том, что ты вызываешь у handle героя метод HasTalant, которого естественного у него нет, так как метод это самописный.
Ребята из того проекта переписали сам класс героя, добавив к нему этот самописный метод. Тебе нужно разобраться, какие файлы в их проекте отвечают за это "переопределение"/"расширение" класса и скопировать их себе в точности. Только тогда у тебя заработает это обращение HasTalant.

Можно конечно поступить проще: просто в скрипте твоей абилки проверять у героя наличие этого таланта.
Это'Он из имбы взял наверное, только у них видел таланты самопальные хДД), еще нравится когда комменты в коде по типу, "Валвы офигели, я должен писать 30 строк кода ради одной шняги которую не могут добавить в простейшей команде, тип изи дело"
 

EYEOFLIE

Активный
28 Янв 2018
137
4
ZLOY, конечно, довольно мягко тебе, Pupok, намекает, но ты вообще разбирался в файлах проекта, который копируешь?

Суть ошибки в том, что ты вызываешь у handle героя метод HasTalant, которого естественного у него нет, так как метод это самописный.
Ребята из того проекта переписали сам класс героя, добавив к нему этот самописный метод. Тебе нужно разобраться, какие файлы в их проекте отвечают за это "переопределение"/"расширение" класса и скопировать их себе в точности. Только тогда у тебя заработает это обращение HasTalant.

Можно конечно поступить проще: просто в скрипте твоей абилки проверять у героя наличие этого таланта.
Не знаешь случаем, как в HasModifier задать не один модификатор, на например 10, но не писать else if 10 раз, а задать одному имени значения, просто тип получаемой инфы hscript выводит а нужен csstring
 

EYEOFLIE

Активный
28 Янв 2018
137
4
Извини, но я не понял, что ты имеешь в виду.
что то типа такого:
Код:
if target:HasModifier(modifier) then
target:RemoveModifierByName(modifier)
end
Но вместо modifier задать не один модификатор который имеет цель, а несколько, что-бы не писать elseif 20 раз если есть еще 20 модификаторов, а задать их в стак, пробывал но не получалось, выводило что значение получаемое не соответствует типу нужного значения.
 
Реклама: