Система для применения способностей которые написаны на глобальных переменных.
Будет ли "оно" нормально работать?
function AbilityEffect takes nothing returns nothing
    local integer id = GetSpellAbilityId()
    if id == 'A000' then
        call TriggerExecute(Mx[1])
    elseif id == 'A001' then
        call TriggerExecute(Mx[2])
    elseif id == 'A002' then
        call TriggerExecute(Mx[3])
    elseif id == 'A003' then
        call TriggerExecute(Mx[4])
    elseif id == 'A004' then
        call TriggerExecute(Mx[5])
    endif
endfunction

function InitTrig_AbilityCastSystem takes nothing returns nothing
    set Mx[0] = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(Mx[0], EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddAction(Mx[0], function AbilityEffect)
endfunction

damn..
попробуй лучше это xgm.guru/p/wc3/Preryvanie-vnutri-triggera-kZA/comments/view/5417...
без всяких елсеифов
`
ОЖИДАНИЕ РЕКЛАМЫ...
30
Замени TriggerExecute на прямой вызов функции.
А в место elseif юзай отдельный if then внутри которого делай return. Тогда будет шик. Можешь ещё популярные абилки повыше расположить.

Для пущего перфекционизма можешь раскрыть TriggerRegisterAnyUnitEventBJ и повесить все события за один проход.
Ответы (8)
30
LastUchiha, открой функцию и посмотри что а цикл внутри. Ты его гоняешь каждый раз. А можно за один раз всё сделать.
15
nazarpunk, а если функция в другом триггере? Оно её вроде не видит.
15
function InitTrig_AbilityCastSystem takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer i = 0
    
    loop
        call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)    
        set i = i + 1
        exitwhen i == 12
    endloop
    
    call TriggerAddAction(t, function AbilityEffect)
    set t = null
endfunction
так должно быть?
30
LastUchiha, да, только все три горы регистрируй в этом цикле.
25
Тру посоны сделали бы на lua вызовом функции из таблицы по ключу
function AbilityEffect()
 	CustomAbilities[GetSpellAbilityId()]()
end
Ответы (1)
26
Makeba, либо так либо ид конвертить в номер массива функции.

Id=id2fnc(GetSpellAbilityId()); TriggerExecute(mx[id]). Для конвертации можешь обрезать равкод вычетая n, чтобы за лимит массива не уходить.

Еще где-то я выкладывал CodeLib там можно запускать любые функции даже из строки, через boolexpr
23
Хм, ну если у тебя абилки имеют именно такие равкоды, от А000 до А004, то можно вообще сделать
function AbilityEffect takes nothing returns nothing
    local integer id = GetSpellAbilityId()
    if id >= 'A000' and id <= 'A004' then
        call TriggerExecute( Mx[ id - 'A000' ] )
    endif
endfunction

//только первый задействованный индекс массива должен быть 0, а не 1, а максимальный 4, а не 5
Ответы (1)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.