Как сделать талант?

AlexInCube

Пользователь
31 Окт 2018
29
0
Скинь полностью код, как у тебя это реализовано ?
Я писал так:
Lua:
modifier_windrun_casterlua = class({})

function modifier_windrun_casterlua:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_EVASION_CONSTANT,
        MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
    }

    return funcs
end

function modifier_windrun_casterlua:OnCreated( kv )
    self.bonusmovespeed = self:GetAbility():GetSpecialValueFor("movespeed_bonus_pct")
    self.bonusevasion = self:GetAbility():GetSpecialValueFor("evasion_pct_tooltip")
    print(self:GetCaster())
    print(self.talent1)
    if IsServer() then
    self.talent1 = self:GetCaster():FindAbilityByName("special_bonus_unique_windranger_9")
    end
    
end

function modifier_windrun_casterlua:OnRefresh( kv )
    self.bonusmovespeed = self:GetAbility():GetSpecialValueFor("movespeed_bonus_pct")
    self.bonusevasion = self:GetAbility():GetSpecialValueFor("evasion_pct_tooltip")
    self.talent1 = self:GetCaster():FindAbilityByName("special_bonus_unique_windranger_9")
end

function modifier_windrun_casterlua:GetModifierEvasion_Constant( params )
    if self.talent1:GetLevel() == 1 and IsServer() then return self.bonusevasion else return self.bonusevasion end
end

function modifier_windrun_casterlua:GetModifierMoveSpeedBonus_Percentage( params )
    return self.bonusmovespeed
end

function modifier_windrun_casterlua:IsBuff()
    return true
end

function modifier_windrun_casterlua:IsHidden()
    return false
end

function modifier_windrun_casterlua:IsPurgable()
    return true
end

function modifier_windrun_casterlua:GetEffectName()
    return "particles/units/heroes/hero_windrunner/windrunner_windrun.vpcf"
end

function modifier_windrun_casterlua:GetEffectAttachType()
    return PATTACH_ABSORIGIN_FOLLOW
end
 
20 Дек 2016
783
114
Я писал так:
Lua:
function modifier_windrun_casterlua:OnCreated( kv )
    self.bonusmovespeed = self:GetAbility():GetSpecialValueFor("movespeed_bonus_pct")
    self.bonusevasion = self:GetAbility():GetSpecialValueFor("evasion_pct_tooltip")
    print(self:GetCaster())
    print(self.talent1)
    if IsServer() then
    self.talent1 = self:GetCaster():FindAbilityByName("special_bonus_unique_windranger_9")
    end
   
end
Ты рофлишь что ли? Конечно тебе не выведет талант, если ты пытаешься вывести его раньше, чем записал.
 
  • Хаха
Реакции: Niker323
20 Дек 2016
783
114
Код:
if self.talent1:GetLevel() == 1 and IsServer() then return self.bonusevasion else return self.bonusevasion end
Что-то я не вижу разницы между значением с талантом и без... Проверка IsServer тут скорее всего тоже не нужна, а если и нужна, то делать ее надо раньше, чем self.talent1:GetLevel() ==1
А вообще проще записать значение уклонения с учетом таланта в OnCreated, а потом вообще к этому таланту не обращаться

Код:
...

function modifier_windrun_casterlua:OnCreated( kv )
    self.bonusmovespeed = self:GetAbility():GetSpecialValueFor("movespeed_bonus_pct")
    self.bonusevasion = self:GetAbility():GetSpecialValueFor("evasion_pct_tooltip")
    if IsServer() then
        local talent1 = self:GetCaster():FindAbilityByName("special_bonus_unique_windranger_9")
        if talent1 and not talent1:IsNull() and talent1:IsLearned() then
            print('talent 1 detected')
            self.bonusevasion = self.bonusevasion + 40
        end
    end
end

...

function modifier_windrun_casterlua:GetModifierEvasion_Constant( params )
    return self.bonusevasion
end

...
 
Последнее редактирование:

AlexInCube

Пользователь
31 Окт 2018
29
0
Что-то я не вижу разницы между значением с талантом и без... Проверка IsServer тут скорее всего тоже не нужна, а если и нужна, то делать ее надо раньше, чем self.talent1:GetLevel() ==1
А вообще проще записать значение уклонения с учетом таланта в OnCreated, а потом вообще к этому таланту не обращаться

Код:
...

function modifier_windrun_casterlua:OnCreated( kv )
    self.bonusmovespeed = self:GetAbility():GetSpecialValueFor("movespeed_bonus_pct")
    self.bonusevasion = self:GetAbility():GetSpecialValueFor("evasion_pct_tooltip")
    if IsServer() then
        local talent1 = self:GetCaster():FindAbilityByName("special_bonus_unique_windranger_9")
        if talent1 and not talent1:IsNull() and talent1:IsLearned() then
            print('talent 1 detected')
            self.bonusevasion = self.bonusevasion + 40
        end
    end
end

...

function modifier_windrun_casterlua:GetModifierEvasion_Constant( params )
    return self.bonusevasion
end

...
пишет:
Script Runtime Error: ...cripts\heroes\hero_kirill\modifier_windrun_casterlua.lua:17: attempt to call method 'IsLearned' (a nil value)
stack traceback:
...cripts\heroes\hero_kirill\modifier_windrun_casterlua.lua:17: in function <...cripts\heroes\hero_kirill\modifier_windrun_casterlua.lua:12>
[C]: in function 'AddNewModifier'
...funbrawl\scripts\vscripts\heroes\hero_kirill\windrun.lua:10: in function <...funbrawl\scripts\vscripts\heroes\hero_kirill\windrun.lua:3>

Я написал if talent1 and not talent1:IsNull() and talent1:GetLevel()==1 then и в консоли талант находит если его прокачать, но условие self.bonusevasion = self.bonusevasion + 40 не работает.
 
Последнее редактирование:

AlexInCube

Пользователь
31 Окт 2018
29
0
Я ща решил дописать в конце print(self.bonusevasion) и там показывает 75 как и должно при прокачке таланта, но модификатор накладывает значение которое без +40
 
Последнее редактирование:
20 Дек 2016
783
114
Я ща решил дописать в конце print(self.bonusevasion) и там показывает 75 как и должно при прокачке таланта, но модификатор накладывает значение которое без +40
А откуда ты знаешь, какое значение он накладывает?
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,334
99
Я ща решил дописать в конце print(self.bonusevasion) и там показывает 75 как и должно при прокачке таланта, но модификатор накладывает значение которое без +40
На сервере модификатор накладывает правильное значение, а на клиенте без, потому что на клиенте не было никаких вычислений и соответственно не пибавлялось 40, клиент не знает, что значение увеличилось
 
20 Дек 2016
783
114
Я у героя смотрю статы и там уклонения написаны же.
То, что написано в статах, это инфа с клиента. Я просто не думал, что уклонения в статах пишут. Сейчас у тебя по сути уклонения работают как надо, но отображается неправильное значение.

Проблема талантов на клиенте в том, что на нем не работет FindAbilityByName, то есть клиент не может узнать, есть ли у героя талант, и соответственно не отображает значение с талантом. Ему надо передать инфу о наличии таланта с сервера. Способов это сделать не очень много.
В данном случае это проще всего сделать через стаки.
Код:
function modifier_windrun_casterlua:OnCreated( kv )
    self.bonusmovespeed = self:GetAbility():GetSpecialValueFor("movespeed_bonus_pct")
    if IsServer() then
        local bonusevasion = self:GetAbility():GetSpecialValueFor("evasion_pct_tooltip")
        local talent1 = self:GetCaster():FindAbilityByName("special_bonus_unique_windranger_9")
        if talent1 and not talent1:IsNull() and talent1:IsTrained() then
            bonusevasion = bonusevasion + 40
        end
        self:SetStackCount( -bonusevasion ) -- Ставим отрицательное количество стаков, чтобы стаки не отображались на иконке бафа.
    end
end

...

function modifier_windrun_casterlua:GetModifierEvasion_Constant( params )
    return -self:GetStackCount()
end

...
Однако, если нужно будет учитывать несколько талантов для одной способности, то такой способ уже не сработает и придется использовать CustomNetTables
А можно вообще забить на отображение в статах и ничего этого не делать, ведь работают по факту измененные значения.
 
Реклама: