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

AlexInCube

Пользователь
31 Окт 2018
29
0
Есть свой windrun врки и я хочу для него сделать таланты +40% к уклонениям или +40% к замедлению, но как это сделать?
Код:
Код:
"windrunner_windrun_datadriven"
    {
    // General
    //-------------------------------------------------------------------------------------------------------------
    "BaseClass"                "ability_datadriven"
    "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
    "SpellImmunityType"                "SPELL_IMMUNITY_ENEMIES_NO"
    "AbilityTextureName"            "windrun"
    
    // Casting
    //-------------------------------------------------------------------------------------------------------------
    "AbilityCastPoint"                "0.3 0.3 0.3 0.3"

    // Time       
    //-------------------------------------------------------------------------------------------------------------
    "AbilityCooldown"                "15.0 15.0 15.0 15.0"
    "AbilityDuration"                "3 4 5 6"

    // Cost
    //-------------------------------------------------------------------------------------------------------------
    "AbilityManaCost"                "100 100 100 100"

    // Stats
    //-------------------------------------------------------------------------------------------------------------
    "AbilityModifierSupportValue"    "0.1"    // Mostly about dodging all attacks

    // Special
    //-------------------------------------------------------------------------------------------------------------
    "AbilitySpecial"
    {
        "01"
        {
            "var_type"                    "FIELD_INTEGER"
            "movespeed_bonus_pct"        "50 50 50 50"       
        }
        "02"
        {
            "var_type"                    "FIELD_INTEGER"
            "evasion_pct_tooltip"        "20 25 30 35"
        }
        "03"
        {
            "var_type"                    "FIELD_INTEGER"
            "enemy_movespeed_bonus_pct"    "-8 -16 -24 -30"
        }
        "04"
        {
            "var_type"                    "FIELD_INTEGER"
            "radius"                    "300 300 300 300"
        }
        "05"
        {
            "var_type"                    "FIELD_FLOAT"
            "duration"                    "3 4 5 6"
        }
        // Extra variables
        "06"
        {
            "var_type"                    "FIELD_FLOAT"
            "linger_duration"            "2.0"
        }
    }
    
    // Data driven
    //-------------------------------------------------------------------------------------------------------------
    "precache"
    {
        "soundfile"                    "soundevents/custom_sounds.vsndevts"
        "particle"                    "particles/units/heroes/hero_windrunner/windrunner_windrun.vpcf"
    }
    
    "OnSpellStart"
    {
        "FireSound"
        {
            "Target"                "CASTER"
            "EffectName"            "funbrawl.popytnogovitra"
        }
    
        "ApplyModifier"
        {
            "Target"                "CASTER"
            "ModifierName"            "modifier_windrun_caster_datadriven"
        }
        
        "ApplyModifier"
        {
            "Target"                "CASTER"
            "ModifierName"            "modifier_windrun_debuff_aura_datadriven"
        }
    }
    
    "Modifiers"
    {
        "modifier_windrun_caster_datadriven"
        {
            "Duration"                "%duration"
            
            "EffectName"            "particles/units/heroes/hero_windrunner/windrunner_windrun.vpcf"
            "EffectAttachType"        "follow_origin"
            
            "Properties"
            {
                "MODIFIER_PROPERTY_EVASION_CONSTANT"            "%evasion_pct_tooltip"
                "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE"    "%movespeed_bonus_pct"
            }
        }
    
        "modifier_windrun_debuff_aura_datadriven"
        {
            "Duration"                "%duration"
        
            "IsHidden"                "1"
            "Aura"                    "modifier_windrun_debuff_datadriven"
            "Aura_Radius"            "%radius"
            "Aura_Teams"            "DOTA_UNIT_TARGET_TEAM_ENEMY"
            "Aura_Types"            "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
        }
        
        "modifier_windrun_debuff_datadriven"
        {
            "IsDebuff"                "1"
        
            "OnCreated"
            {
                "RemoveModifier"
                {
                    "Target"        "TARGET"
                    "ModifierName"    "modifier_windrun_debuff_datadriven"
                }
            }
        
            "OnDestroy"
            {
                "ApplyModifier"
                {
                    "Target"        "TARGET"
                    "ModifierName"    "modifier_windrun_debuff_linger_datadriven"
                }
            }
            
            "Properties"
            {
                "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE"    "%enemy_movespeed_bonus_pct"
            }
        }
        
        "modifier_windrun_debuff_linger_datadriven"
        {
            "Duration"                "%linger_duration"
            
            "IsPurgable"        "1"
            "IsDebuff"    "1"
        
            "Properties"
            {
                "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE"    "%enemy_movespeed_bonus_pct"
            }
        }
    }
    }
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Есть свой windrun врки и я хочу для него сделать таланты +40% к уклонениям или +40% к замедлению, но как это сделать?
Код:
Код:
"windrunner_windrun_datadriven"
    {
    // General
    //-------------------------------------------------------------------------------------------------------------
    "BaseClass"                "ability_datadriven"
    "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
    "SpellImmunityType"                "SPELL_IMMUNITY_ENEMIES_NO"
    "AbilityTextureName"            "windrun"
   
    // Casting
    //-------------------------------------------------------------------------------------------------------------
    "AbilityCastPoint"                "0.3 0.3 0.3 0.3"

    // Time      
    //-------------------------------------------------------------------------------------------------------------
    "AbilityCooldown"                "15.0 15.0 15.0 15.0"
    "AbilityDuration"                "3 4 5 6"

    // Cost
    //-------------------------------------------------------------------------------------------------------------
    "AbilityManaCost"                "100 100 100 100"

    // Stats
    //-------------------------------------------------------------------------------------------------------------
    "AbilityModifierSupportValue"    "0.1"    // Mostly about dodging all attacks

    // Special
    //-------------------------------------------------------------------------------------------------------------
    "AbilitySpecial"
    {
        "01"
        {
            "var_type"                    "FIELD_INTEGER"
            "movespeed_bonus_pct"        "50 50 50 50"      
        }
        "02"
        {
            "var_type"                    "FIELD_INTEGER"
            "evasion_pct_tooltip"        "20 25 30 35"
        }
        "03"
        {
            "var_type"                    "FIELD_INTEGER"
            "enemy_movespeed_bonus_pct"    "-8 -16 -24 -30"
        }
        "04"
        {
            "var_type"                    "FIELD_INTEGER"
            "radius"                    "300 300 300 300"
        }
        "05"
        {
            "var_type"                    "FIELD_FLOAT"
            "duration"                    "3 4 5 6"
        }
        // Extra variables
        "06"
        {
            "var_type"                    "FIELD_FLOAT"
            "linger_duration"            "2.0"
        }
    }
   
    // Data driven
    //-------------------------------------------------------------------------------------------------------------
    "precache"
    {
        "soundfile"                    "soundevents/custom_sounds.vsndevts"
        "particle"                    "particles/units/heroes/hero_windrunner/windrunner_windrun.vpcf"
    }
   
    "OnSpellStart"
    {
        "FireSound"
        {
            "Target"                "CASTER"
            "EffectName"            "funbrawl.popytnogovitra"
        }
   
        "ApplyModifier"
        {
            "Target"                "CASTER"
            "ModifierName"            "modifier_windrun_caster_datadriven"
        }
       
        "ApplyModifier"
        {
            "Target"                "CASTER"
            "ModifierName"            "modifier_windrun_debuff_aura_datadriven"
        }
    }
   
    "Modifiers"
    {
        "modifier_windrun_caster_datadriven"
        {
            "Duration"                "%duration"
           
            "EffectName"            "particles/units/heroes/hero_windrunner/windrunner_windrun.vpcf"
            "EffectAttachType"        "follow_origin"
           
            "Properties"
            {
                "MODIFIER_PROPERTY_EVASION_CONSTANT"            "%evasion_pct_tooltip"
                "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE"    "%movespeed_bonus_pct"
            }
        }
   
        "modifier_windrun_debuff_aura_datadriven"
        {
            "Duration"                "%duration"
       
            "IsHidden"                "1"
            "Aura"                    "modifier_windrun_debuff_datadriven"
            "Aura_Radius"            "%radius"
            "Aura_Teams"            "DOTA_UNIT_TARGET_TEAM_ENEMY"
            "Aura_Types"            "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
        }
       
        "modifier_windrun_debuff_datadriven"
        {
            "IsDebuff"                "1"
       
            "OnCreated"
            {
                "RemoveModifier"
                {
                    "Target"        "TARGET"
                    "ModifierName"    "modifier_windrun_debuff_datadriven"
                }
            }
       
            "OnDestroy"
            {
                "ApplyModifier"
                {
                    "Target"        "TARGET"
                    "ModifierName"    "modifier_windrun_debuff_linger_datadriven"
                }
            }
           
            "Properties"
            {
                "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE"    "%enemy_movespeed_bonus_pct"
            }
        }
       
        "modifier_windrun_debuff_linger_datadriven"
        {
            "Duration"                "%linger_duration"
           
            "IsPurgable"        "1"
            "IsDebuff"    "1"
       
            "Properties"
            {
                "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE"    "%enemy_movespeed_bonus_pct"
            }
        }
    }
    }
Писать скилл на луа.
 

SniperX

Друзья CG
26 Фев 2018
539
100
Проект
Dota 2x4
Эх пишешь абилку на датадривен и делаешь применение модифаера через Lua, и чекаешь если талант вкачан, то применяется модифаер который имеет больше уклонения, а если нет то обычный
 

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")
    self.talent1 = self:GetCaster():FindAbilityByName("special_bonus_unique_windranger_9")
    
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 then return self.bonusevasion + 40 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
 
20 Дек 2016
892
170
мувспид перестал работать
Именно мувспид, или может уклонение? Потому что для мувспида у тебя никаких условий нету, а в уклонении проверяется наличие таланта. Но если если у героя нет такого таланта вообще, то возникнет ошибка.

И да, на клиенте нет FindAbilityByName, поэтому этот блок кода, и все связанное с талантом нужно делать при условии
Код:
if IsServer() then
    self.talent1 = self:GetCaster():FindAbilityByName('...')
end
 

AlexInCube

Пользователь
31 Окт 2018
29
0
Именно мувспид, или может уклонение? Потому что для мувспида у тебя никаких условий нету, а в уклонении проверяется наличие таланта. Но если если у героя нет такого таланта вообще, то возникнет ошибка.

И да, на клиенте нет FindAbilityByName, поэтому этот блок кода, и все связанное с талантом нужно делать при условии
Код:
if IsServer() then
    self.talent1 = self:GetCaster():FindAbilityByName('...')
end
да перепутал, уклонения не работают.
 

AlexInCube

Пользователь
31 Окт 2018
29
0
И да, на клиенте нет FindAbilityByName, поэтому этот блок кода, и все связанное с талантом нужно делать при условии
Код:
if IsServer() then
    self.talent1 = self:GetCaster():FindAbilityByName('...')
end
[/QUOTE]
Я написал твой код, и пытаюсь вывести через print(self.talent1), но пишет nil даже если талант есть.
 

SniperX

Друзья CG
26 Фев 2018
539
100
Проект
Dota 2x4
Я написал модификатор и он работает, уклонения и мувспид даются. Но, когда я попытался добавить талант сюда, то мувспид перестал работать и я не знаю что не так.
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")
    self.talent1 = self:GetCaster():FindAbilityByName("special_bonus_unique_windranger_9")
  
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 then return self.bonusevasion + 40 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
Не проще ли сделать на datadriven? Если хочешь могу скинуть в пример мою абилку
 

AlexInCube

Пользователь
31 Окт 2018
29
0
Не проще ли сделать на datadriven? Если хочешь могу скинуть в пример мою абилку
этот спел был изначально на датадрайвене, но когда мне понадобились таланты, мне сказали сделать на lua или у тебя datadriven абилка с талантами?
 

SniperX

Друзья CG
26 Фев 2018
539
100
Проект
Dota 2x4
этот спел был изначально на датадрайвене, но когда мне понадобились таланты, мне сказали сделать на lua или у тебя datadriven абилка с талантами?
Вот моя абилка, там если есть талант то, длительность эффекта будет длиться больше
C++:
"am_bkb"
    {
        "BaseClass"                     "ability_datadriven"
        "AbilityBehavior"               "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
        "AbilityTextureName"            "antimage_counterspell"
        "AbilityCastPoint"              "0"
        "AbilityCastRange"              "0"
        "AbilityCooldown"               "19"
        "AbilityManaCost"               "75"
        "AbilitySpecial"
        {
            "01"
            {
                "var_type"              "FIELD_FLOAT"
                "duration"              "2 3 4 5"
            }
            "02"
            {
                "var_type"                "FIELD_FLOAT"
                "duration_talent"        "4 5 6 7"
            }
        }
        "OnSpellStart"
        {
            "FireSound"
            {
                "EffectName"    "DOTA_Item.BlackKingBar.Activate"
                "Target"        "CASTER"
            }
            "RunScript"
            {
                "ScriptFile"    "newabilities/am.lua"
                "Function"        "rage_start"
            }
        }
        "Modifiers"
        {
            "modifier_am_bkb"
            {
                "EffectName"        "particles/items_fx/black_king_bar_avatar.vpcf"
                "EffectAttachType"    "follow_origin"
                "States"
                {
                    "MODIFIER_STATE_MAGIC_IMMUNE"        "MODIFIER_STATE_VALUE_ENABLED"
                }
                "OnDestroy"
                {
                    "RunScript"
                    {
                        "ScriptFile"        "newabilities/am.lua"
                        "Function"            "rage_end"
                    }
                }
            }
        }
    }
Lua:
function rage_start( keys )
    local caster = keys.caster
    local ability = keys.ability
    local duration = ability:GetLevelSpecialValueFor("duration", (ability:GetLevel() - 1))
    local duration_talent = ability:GetLevelSpecialValueFor("duration_talent", (ability:GetLevel() - 1))
    caster:Purge(false, true, false, true, false)
    caster:SetModelScale(1.2)
    if caster:FindAbilityByName("am_bkb_talent"):GetLevel() == 1 then
        ability:ApplyDataDrivenModifier(caster, caster, "modifier_am_bkb", {duration = duration_talent})
    else
        ability:ApplyDataDrivenModifier(caster, caster, "modifier_am_bkb", {duration = duration})
    end
end
function rage_end( keys )
    local caster = keys.caster
    caster:SetModelScale(1)
end
C++:
"am_bkb_talent"
    {
        "BaseClass"    "special_bonus_undefined"
        "AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES"
    }
 

AlexInCube

Пользователь
31 Окт 2018
29
0
У меня такие таланты работают и так, но мне надо талант чтобы в модификаторе работал. Не на длительность, на увеличение уклонений или мса.
 

SniperX

Друзья CG
26 Фев 2018
539
100
Проект
Dota 2x4
У меня такие таланты работают и так, но мне надо талант чтобы в модификаторе работал. Не на длительность, на увеличение уклонений или мса.
Так ты делай так чтобы другой модификатор навешивался а не этот
 

SniperX

Друзья CG
26 Фев 2018
539
100
Проект
Dota 2x4
У меня такие таланты работают и так, но мне надо талант чтобы в модификаторе работал. Не на длительность, на увеличение уклонений или мса.
например если есть талант то он навешивает модифаер обычный, а если с талантом то другой и более крутой
 
20 Дек 2016
892
170
Не проще ли сделать на datadriven?
например если есть талант то он навешивает модифаер обычный, а если с талантом то другой и более крутой

Нет блять, не проще. Какой придурок станет делать новый модификатор и описание для него каждый раз, когда надо добавить талант, если можно просто подменять значение в луа? А если у него один талант будет менять уклонение, а второй скорость? Ты ему 4 модификатора сделать предложишь?
Если сам не умеешь делать на луа, то не надо других в дд тянуть, тем более что у чела получился нормальный луа-код.
 
20 Дек 2016
892
170
Я написал твой код, и пытаюсь вывести через print(self.talent1), но пишет nil даже если талант есть.
Где именно ты пытаешься это вывести? Проверь, что название талнта правильное, или просто еще раз код скинь
 

AlexInCube

Пользователь
31 Окт 2018
29
0
Где именно ты пытаешься это вывести? Проверь, что название талнта правильное, или просто еще раз код скинь
я писал в модификаторе когда он создаётся после
if IsServer() then
self.talent1 = self:GetCaster():FindAbilityByName('...')
end
в консоли пишет nil, а когда я убирал проверку на сервер, то что-то писал но не понятно что.
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
195
www.dotabuff.com
Проект
Roshan defense
Скинь полностью код, как у тебя это реализовано ?
 
20 Дек 2016
892
170
я писал в модификаторе когда он создаётся после
if IsServer() then
self.talent1 = self:GetCaster():FindAbilityByName('...')
end
в консоли пишет nil, а когда я убирал проверку на сервер, то что-то писал но не понятно что.
Код при создании модификатора выполняется 2 раза. 1 раз на сервере, и 1 раз на клиенте. Именно поэтому и нужна проверка IsServer, чтобы регистрация таланта происходила только на сервере. Скорее всего с сервера он вывел то, что надо, а с клиента логично nil, так и должно быть. GetModifierEvasion_Constant все равно выполняется только на сервере (вроде бы), так что роли это не сыграет.

Если nil пишет 2 раза подряд, значит ты неправильно указал имя способности в FindAbilityByName, или не добавил эту способность герою, или не зарегистрировал ее в npc_abilities_custom.
 
Реклама: