Взаимодействие с талантами

Neirokan

Новичок
22 Июл 2019
1
0
Здравствуйте. Решил я посмотреть на одну из кастомок, которые шли вместе с инструментами, а именно lua_ability_example. Создав копию, я заметил, что некоторые способности не работали и решил, что стоит попробовать их починить, заодно приобрести базовое понимание lua скриптов в доте. Дошёл до взаимодействия с талантами. Начал с пассивки лины и тут же застрял. Решил брать значения из таланта через FindAbilityByName, но похоже на клиенте какие-то обрезанные структуры... Или я что-то не понял. Посоветуйте, как обойти такую напасть?
Lua:
function modifier_lina_fiery_soul_lua:OnCreated( kv )
    self.fiery_soul_attack_speed_bonus = self:GetAbility():GetSpecialValueFor( "fiery_soul_attack_speed_bonus" )
    self.fiery_soul_move_speed_bonus   = self:GetAbility():GetSpecialValueFor( "fiery_soul_move_speed_bonus" )
    self.fiery_soul_max_stacks         = self:GetAbility():GetSpecialValueFor( "fiery_soul_max_stacks" )
    self.duration_tooltip              = self:GetAbility():GetSpecialValueFor( "duration_tooltip" )
    
    self.flFierySoulDuration = 0
    
    print("")
    print("Created")
    print("Server: ", IsServer())
    --Поиск названия таблиц, на которые ссылаются базовые классы
    searchtype(_G, self["BaseClass"])
    searchtype(_G, self:GetAbility()["BaseClass"])
    searchtype(_G, self:GetAbility():GetCaster()["BaseClass"])
    
    local talent = self:GetAbility():GetCaster():FindAbilityByName("special_bonus_unique_lina_2")
    if talent and talent:GetLevel() > 0 then
        self.fiery_soul_attack_speed_bonus = self.fiery_soul_attack_speed_bonus + talent:GetSpecialValueFor("value")
        self.fiery_soul_move_speed_bonus   = self.fiery_soul_move_speed_bonus   + talent:GetSpecialValueFor("value2")
    end

    if IsServer() then
        self.nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_lina/lina_fiery_soul.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() )
        ParticleManager:SetParticleControl( self.nFXIndex, 1, Vector( self:GetStackCount(), 0, 0 ) )
        self:AddParticle( self.nFXIndex, false, false, -1, false, false )
    end
end

--------------------------------------------------------------------------------

function modifier_lina_fiery_soul_lua:OnRefresh( kv )
    self.fiery_soul_attack_speed_bonus = self:GetAbility():GetSpecialValueFor( "fiery_soul_attack_speed_bonus" )
    self.fiery_soul_move_speed_bonus   = self:GetAbility():GetSpecialValueFor( "fiery_soul_move_speed_bonus" )
    self.fiery_soul_max_stacks         = self:GetAbility():GetSpecialValueFor( "fiery_soul_max_stacks" )
    self.duration_tooltip              = self:GetAbility():GetSpecialValueFor( "duration_tooltip" )
    
    print("")
    print("Refresh")
    print("Server: ", IsServer())
    --Поиск названия таблиц, на которые ссылаются базовые классы
    searchtype(_G, self["BaseClass"])
    searchtype(_G, self:GetAbility()["BaseClass"])
    searchtype(_G, self:GetAbility():GetCaster()["BaseClass"])
    
    local talent = self:GetAbility():GetCaster():FindAbilityByName("special_bonus_unique_lina_2")
    if talent and talent:GetLevel() > 0 then
        self.fiery_soul_attack_speed_bonus = self.fiery_soul_attack_speed_bonus + talent:GetSpecialValueFor("value")
        self.fiery_soul_move_speed_bonus   = self.fiery_soul_move_speed_bonus   + talent:GetSpecialValueFor("value2")
    end
    
    if IsServer() then
        ParticleManager:SetParticleControl( self.nFXIndex, 1, Vector( self:GetStackCount(), 0, 0 ) )
    end
end
--Прокачка пассивки
Created
Server: true
CDOTA_Modifier_Lua
CDOTA_Ability_Lua
Can't find this type

Refresh
Server: true
CDOTA_Modifier_Lua
CDOTA_Ability_Lua
Can't find this type

Created
Server: false
C_DOTA_Modifier_Lua
C_DOTA_Ability_Lua
Can't find this type
Script Runtime Error: ...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:135: attempt to call method 'FindAbilityByName' (a nil value)
stack traceback:
...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:135: in function <...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:119>

--Использование способности и появление эффекта
Refresh
Server: false
C_DOTA_Modifier_Lua
C_DOTA_Ability_Lua
Can't find this type
Script Runtime Error: ...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:164: attempt to call method 'FindAbilityByName' (a nil value)
stack traceback:
...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:164: in function <...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:150>

--Исчезновение эффекта
Refresh
Server: false
C_DOTA_Modifier_Lua
C_DOTA_Ability_Lua
Can't find this type
Script Runtime Error: ...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:164: attempt to call method 'FindAbilityByName' (a nil value)
stack traceback:
...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:164: in function <...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:150>
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Здравствуйте. Решил я посмотреть на одну из кастомок, которые шли вместе с инструментами, а именно lua_ability_example. Создав копию, я заметил, что некоторые способности не работали и решил, что стоит попробовать их починить, заодно приобрести базовое понимание lua скриптов в доте. Дошёл до взаимодействия с талантами. Начал с пассивки лины и тут же застрял. Решил брать значения из таланта через FindAbilityByName, но похоже на клиенте какие-то обрезанные структуры... Или я что-то не понял. Посоветуйте, как обойти такую напасть?
Lua:
function modifier_lina_fiery_soul_lua:OnCreated( kv )
    self.fiery_soul_attack_speed_bonus = self:GetAbility():GetSpecialValueFor( "fiery_soul_attack_speed_bonus" )
    self.fiery_soul_move_speed_bonus   = self:GetAbility():GetSpecialValueFor( "fiery_soul_move_speed_bonus" )
    self.fiery_soul_max_stacks         = self:GetAbility():GetSpecialValueFor( "fiery_soul_max_stacks" )
    self.duration_tooltip              = self:GetAbility():GetSpecialValueFor( "duration_tooltip" )
   
    self.flFierySoulDuration = 0
   
    print("")
    print("Created")
    print("Server: ", IsServer())
    --Поиск названия таблиц, на которые ссылаются базовые классы
    searchtype(_G, self["BaseClass"])
    searchtype(_G, self:GetAbility()["BaseClass"])
    searchtype(_G, self:GetAbility():GetCaster()["BaseClass"])
   
    local talent = self:GetAbility():GetCaster():FindAbilityByName("special_bonus_unique_lina_2")
    if talent and talent:GetLevel() > 0 then
        self.fiery_soul_attack_speed_bonus = self.fiery_soul_attack_speed_bonus + talent:GetSpecialValueFor("value")
        self.fiery_soul_move_speed_bonus   = self.fiery_soul_move_speed_bonus   + talent:GetSpecialValueFor("value2")
    end

    if IsServer() then
        self.nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_lina/lina_fiery_soul.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() )
        ParticleManager:SetParticleControl( self.nFXIndex, 1, Vector( self:GetStackCount(), 0, 0 ) )
        self:AddParticle( self.nFXIndex, false, false, -1, false, false )
    end
end

--------------------------------------------------------------------------------

function modifier_lina_fiery_soul_lua:OnRefresh( kv )
    self.fiery_soul_attack_speed_bonus = self:GetAbility():GetSpecialValueFor( "fiery_soul_attack_speed_bonus" )
    self.fiery_soul_move_speed_bonus   = self:GetAbility():GetSpecialValueFor( "fiery_soul_move_speed_bonus" )
    self.fiery_soul_max_stacks         = self:GetAbility():GetSpecialValueFor( "fiery_soul_max_stacks" )
    self.duration_tooltip              = self:GetAbility():GetSpecialValueFor( "duration_tooltip" )
   
    print("")
    print("Refresh")
    print("Server: ", IsServer())
    --Поиск названия таблиц, на которые ссылаются базовые классы
    searchtype(_G, self["BaseClass"])
    searchtype(_G, self:GetAbility()["BaseClass"])
    searchtype(_G, self:GetAbility():GetCaster()["BaseClass"])
   
    local talent = self:GetAbility():GetCaster():FindAbilityByName("special_bonus_unique_lina_2")
    if talent and talent:GetLevel() > 0 then
        self.fiery_soul_attack_speed_bonus = self.fiery_soul_attack_speed_bonus + talent:GetSpecialValueFor("value")
        self.fiery_soul_move_speed_bonus   = self.fiery_soul_move_speed_bonus   + talent:GetSpecialValueFor("value2")
    end
   
    if IsServer() then
        ParticleManager:SetParticleControl( self.nFXIndex, 1, Vector( self:GetStackCount(), 0, 0 ) )
    end
end
--Прокачка пассивки
Created
Server: true
CDOTA_Modifier_Lua
CDOTA_Ability_Lua
Can't find this type

Refresh
Server: true
CDOTA_Modifier_Lua
CDOTA_Ability_Lua
Can't find this type

Created
Server: false
C_DOTA_Modifier_Lua
C_DOTA_Ability_Lua
Can't find this type
Script Runtime Error: ...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:135: attempt to call method 'FindAbilityByName' (a nil value)
stack traceback:
...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:135: in function <...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:119>

--Использование способности и появление эффекта
Refresh
Server: false
C_DOTA_Modifier_Lua
C_DOTA_Ability_Lua
Can't find this type
Script Runtime Error: ...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:164: attempt to call method 'FindAbilityByName' (a nil value)
stack traceback:
...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:164: in function <...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:150>

--Исчезновение эффекта
Refresh
Server: false
C_DOTA_Modifier_Lua
C_DOTA_Ability_Lua
Can't find this type
Script Runtime Error: ...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:164: attempt to call method 'FindAbilityByName' (a nil value)
stack traceback:
...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:164: in function <...y_copy\scripts\vscripts\modifier_lina_fiery_soul_lua.lua:150>
Ну да, офк на клиенте нет этой функции. Значение на сервере добавляй, на клиенте есть linked что то там в кв
 
Реклама: