Простые вопросы #2

Hulimontana

Новичок
19 Апр 2019
6
0
1
29
Реакции
0 0 0
День добрый. Как ограничить выбор команды для игроков? Чтобы в начале игры, при загрузке ни у кого не было возможности выбирать сторону Dire или Radiant. Либо оставить лишь одну сторону для выбора, либо вообще убрать этот экран с выбором команды.
 

Wolf_TMB

Новичок
8 Апр 2019
7
0
1
Реакции
0 0 0
Здравствуйте. Пишу скил, который за каждое съеденное дерево должен давать интеллект (5, 10, 15), но модификатор стакается, а интеллект не даётся.
Lua:
LinkLuaModifier("modifier_oracle_add_int", "abilities/oracle/oracle_add_int.lua", LUA_MODIFIER_MOTION_NONE)
if oracle_add_int == nil then
    oracle_add_int = class({})
end
function oracle_add_int:GetAOERadius()
    return 100
end
function oracle_add_int:OnSpellStart()
    local target = self:GetCursorTarget()
    GridNav:DestroyTreesAroundPoint( target:GetOrigin(), 1, false )
    local caster = self:GetCaster()
    local current_stack = nil
    if caster:HasModifier( "modifier_oracle_add_int" ) then
        current_stack = caster:GetModifierStackCount( "modifier_oracle_add_int", self )
        caster:AddNewModifier(caster, self, "modifier_oracle_add_int", { duration = inf})
        caster:SetModifierStackCount( "modifier_oracle_add_int", self, current_stack + 1 )
    else
        caster:AddNewModifier(caster, self, "modifier_oracle_add_int", { duration = inf})
        caster:SetModifierStackCount( "modifier_oracle_add_int", self, 1 )
    end
    if current_stack == nil then current_stack = 1 end
    local int = self:GetSpecialValueFor("int")
    local bonus_int = int*current_stack
end
if modifier_oracle_add_int == nil then
    modifier_oracle_add_int = class({})
end
function modifier_oracle_add_int:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
    }
    return funcs
end
function modifier_oracle_add_int:IsDebuff()
    return false
end
function modifier_oracle_add_int:IsHidden()
    return false
end
function modifier_oracle_add_int:IsPurgable()
    return false
end
function modifier_oracle_add_int:GetModifierBonusStats_Intellect( params )
    return bonus_int
end
 
Реклама:

danilkoo832832

Пользователь
5 Фев 2016
36
3
8
18
Реакции
3 0 0
День добрый. Как ограничить выбор команды для игроков? Чтобы в начале игры, при загрузке ни у кого не было возможности выбирать сторону Dire или Radiant. Либо оставить лишь одну сторону для выбора, либо вообще убрать этот экран с выбором команды.
Я думаю стоит создать 1 команду и уже потом распределять всех игроков по командам. Я таким не занимался, но скорее всего делается через эту процедуру SetTeam
 

danilkoo832832

Пользователь
5 Фев 2016
36
3
8
18
Реакции
3 0 0
Здравствуйте. Пишу скил, который за каждое съеденное дерево должен давать интеллект (5, 10, 15), но модификатор стакается, а интеллект не даётся.
Lua:
LinkLuaModifier("modifier_oracle_add_int", "abilities/oracle/oracle_add_int.lua", LUA_MODIFIER_MOTION_NONE)
if oracle_add_int == nil then
    oracle_add_int = class({})
end
function oracle_add_int:GetAOERadius()
    return 100
end
function oracle_add_int:OnSpellStart()
    local target = self:GetCursorTarget()
    GridNav:DestroyTreesAroundPoint( target:GetOrigin(), 1, false )
    local caster = self:GetCaster()
    local current_stack = nil
    if caster:HasModifier( "modifier_oracle_add_int" ) then
        current_stack = caster:GetModifierStackCount( "modifier_oracle_add_int", self )
        caster:AddNewModifier(caster, self, "modifier_oracle_add_int", { duration = inf})
        caster:SetModifierStackCount( "modifier_oracle_add_int", self, current_stack + 1 )
    else
        caster:AddNewModifier(caster, self, "modifier_oracle_add_int", { duration = inf})
        caster:SetModifierStackCount( "modifier_oracle_add_int", self, 1 )
    end
    if current_stack == nil then current_stack = 1 end
    local int = self:GetSpecialValueFor("int")
    local bonus_int = int*current_stack
end
if modifier_oracle_add_int == nil then
    modifier_oracle_add_int = class({})
end
function modifier_oracle_add_int:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_STATS_INTELLECT_BONUS,
    }
    return funcs
end
function modifier_oracle_add_int:IsDebuff()
    return false
end
function modifier_oracle_add_int:IsHidden()
    return false
end
function modifier_oracle_add_int:IsPurgable()
    return false
end
function modifier_oracle_add_int:GetModifierBonusStats_Intellect( params )
    return bonus_int
end
Если я всё правильно понял то в local bonus_int = int*current_stack ты создаешь переменную с интой, но потом она очищается из-за того что она выходит из зоны видимости, а когда ретурн делаешь возвращаешь nil
 

Wolf_TMB

Новичок
8 Апр 2019
7
0
1
Реакции
0 0 0
Если я всё правильно понял то в local bonus_int = int*current_stack ты создаешь переменную с интой, но потом она очищается из-за того что она выходит из зоны видимости, а когда ретурн делаешь возвращаешь nil
Собственно поэтому и задал вопрос, ибо не знаю как это пофиксить.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,156
93
48
20
Реакции
92 0 1
Собственно поэтому и задал вопрос, ибо не знаю как это пофиксить.
тебе все значения внутри модификатора нужно получать, а ты их пытаешься достать вообще из другой функции в абилке
 

Wolf_TMB

Новичок
8 Апр 2019
7
0
1
Реакции
0 0 0
тебе все значения внутри модификатора нужно получать, а ты их пытаешься достать вообще из другой функции в абилке
Я уже с этим разобрался, но у меня возник другой вопрос. Почему в OnSpellStart используется self для передачи абилки, а в модификаторе нужно указывать self:GetAbility()?

Вот из другого скила
Код:
    local damage = {
                        victim = self:GetCursorTarget(),
                        attacker = self:GetCaster(),
                        damage = self:GetSpecialValueFor("damage") + Intellect,
                        damage_type = DAMAGE_TYPE_MAGICAL,
                        ability = self
                    }

    ApplyDamage( damage )
И ability = self:GetAbility() уже не работает. Просто не очень понимаю этого
 
Реклама:

I_GRIN_I

Друзья CG
15 Мар 2016
1,156
93
48
20
Реакции
92 0 1
Я уже с этим разобрался, но у меня возник другой вопрос. Почему в OnSpellStart используется self для передачи абилки, а в модификаторе нужно указывать self:GetAbility()?

Вот из другого скила
Код:
    local damage = {
                        victim = self:GetCursorTarget(),
                        attacker = self:GetCaster(),
                        damage = self:GetSpecialValueFor("damage") + Intellect,
                        damage_type = DAMAGE_TYPE_MAGICAL,
                        ability = self
                    }

    ApplyDamage( damage )
И ability = self:GetAbility() уже не работает. Просто не очень понимаю этого
self - это переменная в которой содержится объект, у которого вызывается функция. Тоесть внутри абилки это сама абилка, а внутри модификатора это уже не абилка, а сам модификатор, поэтому у модификатора нужно спросить, чтобы он дал абилку
 

Wolf_TMB

Новичок
8 Апр 2019
7
0
1
Реакции
0 0 0
self - это переменная в которой содержится объект, у которого вызывается функция. Тоесть внутри абилки это сама абилка, а внутри модификатора это уже не абилка, а сам модификатор, поэтому у модификатора нужно спросить, чтобы он дал абилку
Это многое объясняет, спасибо большое.
 

danilkoo832832

Пользователь
5 Фев 2016
36
3
8
18
Реакции
3 0 0
При взрыве мины тетчиса создаётся еще 1 под тем юнитом который получил урон, но 2 мина урон не имеет.
Я создаю 2ю мину через mine = CreateUnitByName("npc_dota_techies_land_mine",victim:GetAbsOrigin(),true,nil,nil,attacker:GetTeam()), а после присваиваю мине модификатор mine:AddNewModifier(mine,nil, "modifier_techies_land_mine" ,{damage = 200})
Предполагаю что я в таблицу с модификатором прописываю не те ключи, но какие надо понять не могу
 

SniperX

Активный
26 Фев 2018
103
12
18
steamcommunity.com
Проект
Белоозерская Потасовка - Updated
Реакции
8 0 4
C++:
"heartstopper_aura_datadriven"
{
    "BaseClass"                "ability_datadriven"
    "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA"
    "AbilityUnitTargetTeam"            "DOTA_UNIT_TARGET_TEAM_ENEMY"
    "SpellImmunityType"                "SPELL_IMMUNITY_ENEMIES_YES"
    "AbilityTextureName"            "necrolyte_heartstopper_aura"
    "AbilityCastRange"                "900"
    "AbilitySpecial"
    {
        "01"
        {
            "var_type"            "FIELD_INTEGER"
            "aura_radius"        "900"        // If you change this, also change the AbilityCastRange above
        }
        "02"
        {
            "var_type"            "FIELD_FLOAT"
            "aura_damage"        "-0.6 -1.0 -1.4 -1.8"
        }
        "03"
        {
            "var_type"            "FIELD_FLOAT"
            "aura_damage_interval"        "0.2"
        }
    }
    "Modifiers"
    {
        "modifier_heartstopper_aura_datadriven"
        {
            "Passive"        "1"
            "IsHidden"        "1"
            "Aura"             "modifier_heartstopper_debuff_datadriven"
            "Aura_Radius"     "%aura_radius"
            "Aura_Teams"     "DOTA_UNIT_TARGET_TEAM_ENEMY"
            "Aura_Types"     "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
            "Aura_Flags"    "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
        }
        "modifier_heartstopper_debuff_datadriven"
        {
            "IsDebuff"    "1"
            "IsHidden"    "1"
            "ThinkInterval"    "%aura_damage_interval"
            "OnIntervalThink"
            {
                "RunScript"
                {
                    "ScriptFile"            "heroes/hero_necrolyte/heartstopper_aura.lua"
                    "Function"                "HeartstopperAura"
                    "visibility_modifier"    "modifier_heartstopper_debuff_visibility"
                }
            }
            "OnDestroy"
            {
                "RemoveModifier"
                {
                    "ModifierName"    "modifier_heartstopper_debuff_visibility"
                    "Target"         "TARGET"
                }
            }
        }
        "modifier_heartstopper_debuff_visibility"
        {
            "IsDebuff"        "1"
            "IsHidden"        "0"
            "IsPurgable"     "0"
            "Passive"        "0"
        }
    }
}
Lua:
function HeartstopperAura( keys )
    local caster = keys.caster
    local ability = keys.ability
    local target = keys.target
    local target_max_hp = target:GetMaxHealth() / 100
    local aura_damage = ability:GetLevelSpecialValueFor("aura_damage", (ability:GetLevel() - 1))
    local aura_damage_interval = ability:GetLevelSpecialValueFor("aura_damage_interval", (ability:GetLevel() - 1))
    -- Shows the debuff on the target's modifier bar only if Necrophos is visible
    local visibility_modifier = keys.visibility_modifier
    if target:CanEntityBeSeenByMyTeam(caster) then
        ability:ApplyDataDrivenModifier(caster, target, visibility_modifier, {})
    else
        target:RemoveModifierByName(visibility_modifier)
    end
    local damage_table = {}
    damage_table.attacker = caster
    damage_table.victim = target
    damage_table.damage_type = DAMAGE_TYPE_PURE
    damage_table.ability = ability
    damage_table.damage = target_max_hp * -aura_damage * aura_damage_interval
    damage_table.damage_flags = DOTA_DAMAGE_FLAG_HPLOSS -- Doesnt trigger abilities and items that get disabled by damage
    ApplyDamage(damage_table)
end
 
20 Дек 2016
618
126
28
11
Проект
DI:LS
Реакции
126 0 0
Можно ли как-то в кв увеличить максимальное количество скилпоинтов? Добавил герою одну способность, теперь даже на максимальном уровне не хватает четырех очков до макс. прокачки всех способностей и талантов.
 
Реклама:

Wolf_TMB

Новичок
8 Апр 2019
7
0
1
Реакции
0 0 0
Можно ли как-то в кв увеличить максимальное количество скилпоинтов? Добавил герою одну способность, теперь даже на максимальном уровне не хватает четырех очков до макс. прокачки всех способностей и талантов.
Можно увеличить максимальный уровень героев в кастомке
 
20 Дек 2016
618
126
28
11
Проект
DI:LS
Реакции
126 0 0
Можно увеличить максимальный уровень героев в кастомке
Мне не это нужно. Например у инвокера предусмотрено 25 апгрейдов на 25 уровней, т.к. сферы имеют по 7 уровней. У остальных героев - 19 апгрейдов, причем на 17 уровне очко улучшения не дается. Если дать сферы инвокера другому герою, он их не сможет прокачать все до конца, т.к. не хватает скилпоинтов. У меня похожая ситуация, только мне не макс уровень способностей увеличить надо, а добавить пятую.
 

bobi

Активный
24 Июл 2017
74
15
8
Реакции
15 0 0
Мне не это нужно. Например у инвокера предусмотрено 25 апгрейдов на 25 уровней, т.к. сферы имеют по 7 уровней. У остальных героев - 19 апгрейдов, причем на 17 уровне очко улучшения не дается. Если дать сферы инвокера другому герою, он их не сможет прокачать все до конца, т.к. не хватает скилпоинтов. У меня похожая ситуация, только мне не макс уровень способностей увеличить надо, а добавить пятую.
мб выдавать в ручную через слушателя?

ListenToGameEvent('dota_player_gained_level', Dynamic_Wrap(GameMode, 'OnPlayerLevelUp'), self)
 
20 Дек 2016
618
126
28
11
Проект
DI:LS
Реакции
126 0 0
мб выдавать в ручную через слушателя?
Я так и сделал, просто в других кастомках с измененным количеством апгрейдов такого слушателя нет (во всяком случае в тех, которые я посмотрел), и в кв тоже ничего с этим связанного, тем не менее прокачка работает нормально. Скорее всего это решает SetUseCustomHeroLevels. А способ через слушателя не работает для нон-плеер героев, в принципе пофиг, но все равно не приятно.
 
Реклама:
Реклама: