Я пытаюсь работать с локальными переменными, но у меня не получается объявить их правильно. Куда мне их впихнуть? Если я объявляю их в основной программе, компилятор ругается на функции (логично, ведь они не знают переменных). Суть состоит в том, чтобы "Буран" был без канала со стороны Архимага. Есть ли что-то вроде "forward" для того, чтобы описать функцию после того, как написал название?
function Trig_Cast_Func012001 takes nothing returns boolean
    return ( GetUnitTypeId(GetSpellAbilityUnit()) == 'Hamg' )
endfunction

function Trig_Cast_Func012002 takes nothing returns boolean
    return ( GetSpellAbilityId() == 'A003' )
endfunction

function Trig_Cast_Conditions takes nothing returns boolean
    if ( not GetBooleanAnd( Trig_Cast_Func012001(), Trig_Cast_Func012002() ) ) then
        return false
    endif
    return true
endfunction

function Trig_Cast_Func005Func001Func001C takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A003', unit) == 3 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Cast_Func005Func001C takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A003', unit) == 2 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Cast_Func005C takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A003', unit) == 1 ) ) then
        return false
    endif
    return true
endfunction

function Trig_Cast_Actions takes nothing returns nothing
    local unit archmage = GetSpellAbilityUnit()
    local location point = GetSpellTargetLoc()
    if ( Trig_Cast_Func005C() ) then
        call CreateNUnitsAtLoc( 1, 'e000', GetOwningPlayer(archmage), GetUnitLoc(archmage), GetUnitFacing(archmage) )
    else
        if ( Trig_Cast_Func005Func001C() ) then
            call CreateNUnitsAtLoc( 1, 'e001', GetOwningPlayer(archmage), GetUnitLoc(archmage), GetUnitFacing(archmage) )
        else
            if ( Trig_Cast_Func005Func001Func001C() ) then
                call CreateNUnitsAtLoc( 1, 'e002', GetOwningPlayer(archmage), GetUnitLoc(archmage), GetUnitFacing(archmage) )
            else
                return
            endif
        endif
    endif
    local unit blizzard = GetLastCreatedUnit()
    call IssuePointOrderLoc( blizzard, "blizzard", point )
    call UnitApplyTimedLifeBJ( 3.00, 'BTLF', blizzard )
endfunction

//===========================================================================
function InitTrig_Cast takes nothing returns nothing
    set gg_trg_Cast = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Cast, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Cast, Condition( function Trig_Cast_Conditions ) )
    call TriggerAddAction( gg_trg_Cast, function Trig_Cast_Actions )
endfunction

Принятый ответ

  1. Все локалки должны объявляться в начале функции (у тебя local unit blizzard = GetLastCreatedUnit() вообще где-то в конце, объявляй в начале, а потом при создании юнита задавай).
  2. Если в функции function Trig_Cast_Func005C и других подобных unit - это локалка, объявленная в другой, то так делать нельзя. Используй глобалку или перестраивай ифзенэлс.
  3. Ну и утечек, необнулений хватает (н-р, точка кастера тоже должна задаваться в переменную и обнуляться).
5
21
7 лет назад
5
  1. Все локалки должны объявляться в начале функции (у тебя local unit blizzard = GetLastCreatedUnit() вообще где-то в конце, объявляй в начале, а потом при создании юнита задавай).
  2. Если в функции function Trig_Cast_Func005C и других подобных unit - это локалка, объявленная в другой, то так делать нельзя. Используй глобалку или перестраивай ифзенэлс.
  3. Ну и утечек, необнулений хватает (н-р, точка кастера тоже должна задаваться в переменную и обнуляться).
Принятый ответ
0
16
7 лет назад
0
ClotPh:
  1. Все локалки должны объявляться в начале функции (у тебя local unit blizzard = GetLastCreatedUnit() вообще где-то в конце, объявляй в начале, а потом при создании юнита задавай).
  2. Если в функции function Trig_Cast_Func005C и других подобных unit - это локалка, объявленная в другой, то так делать нельзя. Используй глобалку или перестраивай ифзенэлс.
  3. Ну и утечек, необнулений хватает (н-р, точка кастера тоже должна задаваться в переменную и обнуляться).
Обнуления я потом сделаю, я сейчас ещё даже дебаговые сообщения не убрал. (отсюда убрал) А так - спасибо, от души!
1
28
7 лет назад
1
Naadir, всё что он написал есть вот в этих статьях
0
16
7 лет назад
Отредактирован Naadir
0
Так. Успех весьма вдохновляет, теперь я вижу, что перевод в текст триггера отвратителен. Куча бесполезных функций, которые мешают сделать нормальную штуковину.
nvc123:
Naadir, всё что он написал есть вот в этих статьях
Спасибо! Я как раз их начал смотреть.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.