Вспомогательные триггеры позволяющие прокачать способности с 1 до максимально возможного уровня (при наличии очков способностей и уровня)
Для изначальных реализаций использовался лишь jass, для некоторых потребуется поддержка макросов (cjass)
(Макрос в реализации с лимитом можно убрать просто подставив число)
На тестовой карте 9 реализаций (6 на jass, 3 на GUI):
  1. Jass
  2. Jass рекурсией (минус в постоянном создании объекта триггера, плюс в простоте)
  3. Jass с лимитом на прокачку за клик (используется макрос, можно убрать)
  4. Jass с черным списком способностей для авто прокачки (используются макросы)
  5. Jass с лимитом и черным списком (используются макросы)
  6. Jass при повышении уровня (используются макросы)
  1. Custom script на GUI (альтернатива jass, немного медленее из-за действий в Actions)
  2. Custom script на GUI с лимитом
  3. GUI рекурсией
Инициализация (для триггера при повышении уровня указано вместе с кодом)
// Без черного списка (используется Evaluate(condition) из-за преимущества в скорости перед Action)
function InitTrig_Jass takes nothing returns nothing
    set gg_trg_Jass = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Jass, EVENT_PLAYER_HERO_SKILL)
    call TriggerAddCondition(gg_trg_Jass, function Trig_Jass_Evaluate)
endfunction

// С черным списком (BLACKLIST_INIT - макрос)
function InitTrig_JassBlacklist takes nothing returns nothing
    set gg_trg_JassBlacklist = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_JassBlacklist, EVENT_PLAYER_HERO_SKILL)
    call TriggerAddCondition(gg_trg_JassBlacklist, function Trig_JassBlacklist_Condition)
    call TriggerAddAction(gg_trg_JassBlacklist, function Trig_JassBlacklist_Actions)
    BLACKLIST_INIT
endfunction
Jass рекурсией
function Trig_JassRecursion_Evaluate takes nothing returns boolean
    call SelectHeroSkill(GetTriggerUnit(), GetLearnedSkill())
    return false
endfunction
Jass
function Trig_Jass_Evaluate takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local integer abilid = GetLearnedSkill()
    local integer lvl = GetLearnedSkillLevel()
    
    call DisableTrigger(GetTriggeringTrigger())
    
    loop
        exitwhen GetHeroSkillPoints(u) < 1
        call SelectHeroSkill(u, abilid)
        exitwhen lvl == GetUnitAbilityLevel(u, abilid)
        set lvl = lvl + 1
    endloop
    
    call EnableTrigger(GetTriggeringTrigger())
    
    set u = null
    return false
endfunction
Jass с лимитом
define private LIMIT_LEARN_PER_TIME = 1

function Trig_JassLimit_Evaluate takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local integer abilid = GetLearnedSkill()
    local integer lvl = GetLearnedSkillLevel()
    local integer leftLearns = LIMIT_LEARN_PER_TIME
    
    call DisableTrigger(GetTriggeringTrigger())
    
    loop
        exitwhen GetHeroSkillPoints(u) < 1
        call SelectHeroSkill(u, abilid)
        exitwhen lvl == GetUnitAbilityLevel(u, abilid)
        set lvl = lvl + 1
        set leftLearns = leftLearns - 1
        exitwhen leftLearns == 0
    endloop
    
    call EnableTrigger(GetTriggeringTrigger())
    
    set u = null
    return false
endfunction
Jass с черным списком
globals
    integer array g_blacklist_autolearn
    integer g_blacklist_autolearn_count = 0
endglobals

define private BLACKLIST_ADD(abilityId) = {
    set g_blacklist_autolearn[g_blacklist_autolearn_count] = abilityId
    set g_blacklist_autolearn_count = g_blacklist_autolearn_count + 1
}

define private BLACKLIST_INIT = {
    BLACKLIST_ADD('AHhb')
    BLACKLIST_ADD('AHad')
}

function Trig_JassBlacklist_Condition takes nothing returns boolean
    local integer abilid = GetLearnedSkill()
    local integer i = 0
    local integer count = g_blacklist_autolearn_count
    
    loop
        if (abilid == g_blacklist_autolearn[i]) then
            return false
        endif
        
        set i = i + 1
        exitwhen i == count
    endloop
    
    return true
endfunction

function Trig_JassBlacklist_Actions takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local integer abilid = GetLearnedSkill()
    local integer lvl = GetLearnedSkillLevel()
    
    call DisableTrigger(GetTriggeringTrigger())
    
    loop
        exitwhen GetHeroSkillPoints(u) < 1
        call SelectHeroSkill(u, abilid)
        exitwhen lvl == GetUnitAbilityLevel(u, abilid)
        set lvl = lvl + 1
    endloop
    
    call EnableTrigger(GetTriggeringTrigger())
    
    set u = null
    return false
endfunction
Jass с лимитом и черным списком
globals
    integer array g_blacklist_autolearn
    integer g_blacklist_autolearn_count = 0
endglobals

define private LIMIT_LEARN_PER_TIME = 1

define private BLACKLIST_ADD(abilityId) = {
    set g_blacklist_autolearn[g_blacklist_autolearn_count] = abilityId
    set g_blacklist_autolearn_count = g_blacklist_autolearn_count + 1
}

define private BLACKLIST_INIT = {
    BLACKLIST_ADD('AHhb')
    BLACKLIST_ADD('AHad')
}

function Trig_JassLimitBlacklist_Condition takes nothing returns boolean
    local integer abilid = GetLearnedSkill()
    local integer i = 0
    local integer count = g_blacklist_autolearn_count
    
    loop
        if (abilid == g_blacklist_autolearn[i]) then
            return false
        endif
        
        set i = i + 1
        exitwhen i == count
    endloop
    
    return true
endfunction

function Trig_JassLimitBlacklist_Actions takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local integer abilid = GetLearnedSkill()
    local integer lvl = GetLearnedSkillLevel()
    local integer leftLearns = LIMIT_LEARN_PER_TIME
    
    call DisableTrigger(GetTriggeringTrigger())
    
    loop
        exitwhen GetHeroSkillPoints(u) < 1
        call SelectHeroSkill(u, abilid)
        exitwhen lvl == GetUnitAbilityLevel(u, abilid)
        set lvl = lvl + 1
        set leftLearns = leftLearns - 1
        exitwhen leftLearns == 0
    endloop
    
    call EnableTrigger(GetTriggeringTrigger())
    
    set u = null
    return false
endfunction
Jass при повышении уровня
globals
    integer array g_levelup_autolearn
    integer g_levelup_autolearn_count = 0
endglobals

define private ABILITY_ADD(abilityId) = {
    set g_levelup_autolearn[g_levelup_autolearn_count] = abilityId
    set g_levelup_autolearn_count = g_levelup_autolearn_count + 1
}

define private ABILITIES_INIT = {
    ABILITY_ADD('AHhb')
    ABILITY_ADD('AHad')
}

function Trig_JassOnLevelUp_Evaluate takes nothing returns boolean
    local unit u = GetTriggerUnit()
    local integer points = GetHeroSkillPoints(u)
    local integer abilid = g_levelup_autolearn[0]
    local integer i = 0
    local integer j
    local integer count = g_levelup_autolearn_count
    
    loop
        exitwhen points < 1
        call SelectHeroSkill(u, abilid)
        set j = GetHeroSkillPoints(u)
        
        if (points != j) then
            set points = j
            
            if (points > 0) then
                loop
                    call SelectHeroSkill(u, abilid)
                    set j = GetHeroSkillPoints(u)
                    exitwhen points == j
                    set points = j
                    exitwhen points < 1
                endloop
            endif
        endif
        
        set i = i + 1
        exitwhen i == count
        set abilid = g_levelup_autolearn[i]
    endloop
    
    set u = null
    return false
endfunction

//===========================================================================
function InitTrig_JassOnLevelUp takes nothing returns nothing
    ABILITIES_INIT
    
    if (g_levelup_autolearn_count > 0) then
        set gg_trg_JassOnLevelUp = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ(gg_trg_JassOnLevelUp, EVENT_PLAYER_HERO_LEVEL)
        call TriggerAddCondition(gg_trg_JassOnLevelUp, function Trig_JassOnLevelUp_Evaluate)
    endif
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
7
Добавил 6 реализаций (в сумме 8)
3 на jass и 3 на gui (2 состоят из custom script из-за отсутствия exitwhen на GUI)
Ответы (6)
7
rsfghd, добавил, осталось ждать подтверждение модерацией
28
nik5960nik, ни разу, каты юзай
код 1
Ляля
Код 2
Куку


>> код 1
Ляля
<<
>> Код 2
Куку
<<
28
nik5960nik, и у тебя не джасс, а* вджасс с сджассом. Если ты отключишь их, твой код работать не будет, компилятор ошибку выдаст
7
rsfghd,
Изначальные версии на чистом jass, обычная и с лимитом (указал что нужно подставить число для лимита вместо макроса для чистого jass)
А так нет возможности выбрать несколько языков у ресурса
+ могу добавить альтернативную реализацию уже без макросов
7
rsfghd, про каты не знал (как добавить), спасибо теперь лучше стало
23
Я так понимаю, это прокачка геройских абилок, судя по функциям Get learned skill и событию player hero skill.
А как же автопрокачка обычных абилок?
Например, создать триггер с событием - герой повышает уровень
В функции действия записать, что если герой имеет абилку из числа прописанных в массиве, то поднять её уровень на 1 (Например, в случайном порядке)
В массив соответственно прописать равкоды абилок, + оставить возможность добавлять туда свои абилки через гуи
И также добавить скрипт инициализации на старте, который проверит всех героев на карте на их уровень и качнет им абилки сразу до уровня героя (тоже в случайном порядке, например)
При этом нужно скрипт запустить с отложенным на 1 секунд стартом, чтобы в массив успели прописаться абилки, добавленные пользователем в триггере "инициализация карты"
Здесь, правда, придётся карту-пример прикладывать, а не только код
Ответы (1)
7
EugeAl, добавил реализацию с повышением уровня, список способностей указывается как и в триггере с черным списком
Чтобы оставить комментарий, пожалуйста, войдите на сайт.