Моя карта разрастается все больше и потихоньку начинаю сокращать и по возможности оптимизировать код.
Идея в том, что я хочу на один триггер повесить несколько заклинаний с событием "боевая единица приводит способность в действие и условием if, then.
Одно из заклинаний просто выполняет действие. Другое имеет ожидание ( вейт или таймер не важно)
Я так понял, каждый раз событие запускается в отдельном потоке и это ничем не грозит, даже если внутри одного будет loop ? То есть ожидание до определенного события?
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
4
Забыть что такой wait. Все через таймер!
В целом, если много триггеров с одинаковым событием, можно объединить их в одну (или на несколько). Думаю это может снизить нагрузку на цп. Главное потом не запутаться во всем этом.
Этот комментарий удален
28
юзай это xgm.guru/p/wc3/spellcast
library AllGlobalsLib initializer init
globals
    constant hashtable H = InitHashtable( )
    constant key AbilityKey
endglobals

private function actions takes nothing returns nothing
    if HaveSavedString( H, GetSpellAbilityId( ), AbilityKey ) then
        call ExecuteFunc( LoadStr( H, GetSpellAbilityId( ), AbilityKey ) )
    endif
endfunction

private function init takes nothing returns nothing
    local trigger trg = CreateTrigger( )
    local integer i = 0
    
    loop
        call TriggerRegisterPlayerUnitEvent( trg, Player( i ), EVENT_PLAYER_UNIT_SPELL_EFFECT, null )
        set i = i + 1
        exitwhen i >= bj_MAX_PLAYER_SLOTS
    endloop
    
    call TriggerAddAction( trg, function actions )
    
    call SaveStr( H, 'A000', AbilityKey, "FirstAbility_Actions" )
    call SaveStr( H, 'A001', AbilityKey, "SecondAbility_Actions" )
    call SaveStr( H, 'A002', AbilityKey, "ThirdAbility_Actions" )
    call SaveStr( H, 'A003', AbilityKey, "FourthAbility_Actions" )
    
    set trg = null
endfunction
endlibrary
просто сохраняешь в равкод абилки вызываемую ей функцию, ты сможешь получать кастера, точку каста, цель каста и всё остальное, поскольку ExecuteFunc наследует параметры потока, из которого вызывается эта функция, создавая новый поток
4
Или при инициализации карты выключить все триггеры со способностями. И когда игрок выберет некого героя, включить триггеры способностей только выбранного героя.
Ответы (1)
30
Joma, из нужно не выключать, а не создавать. При выборе героя создать три горы и повесить на них нужные действия.
23
Ну если у тебя в if'е стоит цикл, или даже вейт в цикле (при условии что счётчик цикла локальный или есть нормальное условие выхода из цикла, тоже с локалками) и есть return'ы, то работать будет нормально. Желательно сделать ещё и более общие условия, чтобы отсеять например не героев или здания итд итп
Ответы (6)
30
EugeAl, не забудь уточнить, что общие условия необходимо в начале проверять чтоб как можно раньше завершить функцию. А то были прецеденты.
23
nazarpunk, ну блин, это и так очевидно. Думаю, разберётся автор поста)
30
EugeAl, ты много чужого кода читал? Просто я с позиции своего опыта говорю.
23
nazarpunk, доводилось... чуть мозг не сломал себе
В общем да, все общие условия нужно первым делом проверять, а потом уже конкретику проверять
30
EugeAl, ну вот, так что лучше взять за правило, что даже очевидные вещи желательно лишний раз уточнить.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.