Как передавать локальную переменную между функциями внутри триггера без использования глобальной переменной?
В общих чертах понимаю что через take и return но до конца дойти не могу, пожалуйста ответ с подробным примером.

Похожие вопросы:

ответ
Хэш таблица. Удобна и практична. Кстати, не забудь создать глобальную переменную Hash, типа хэш-таблица и при инициализации карты инициализировать Hash, иначе не будет работать.
function Trig_HealImp_Timer takes nothing returns nothing 
     local timer t = GetExpiredTimer() 
     local integer hid = GetHandleId(t) 
     local unit caster = LoadUnitHandle(udg_Hash, hid, 0) //Наш юнит хранится по ссылке "0", вытаскиваем его, чтобы с ним работать
     local integer i = LoadInteger(udg_Hash, hid, 1)  //Счетчик
    local real hp1 = GetUnitState(caster, ConvertUnitState(0)) //текущее здоровье
    local real hp = GetUnitState(caster, ConvertUnitState(1)) //максимальное здоровье
    local real chp = (hp/100)*0.8 //значение, на которое лечим юнит
     if i != 50 then //Срабатывание таймера 0,1. Так как длительность лечения составляет 5 сек, то таймер должен сработать 50 раз. Кстати, исходя из этого, высчитываем chp.
          set i = i + 1 //Увеличиваем значение счетчика
          call SetUnitState(caster, ConvertUnitState(0), hp1+chp) //лечим юнит
          call SaveInteger(udg_Hash, hid, 1, i) //Сохраняем новое значение счетчика. Если этого не будет, счетчик вечно будет равен 0.
     else //Когда счетчик равен 50, мы останавливаем таймер и чистим Хэш
         call PauseTimer(t) 
         call DestroyTimer(t) 
         call FlushChildHashtable(udg_Hash, hid) 
     endif 
     set t=null
     set caster = null 
endfunction 

function Trig_HealImp_Actions takes nothing returns nothing
    local timer t = CreateTimer()  //Таймер
     local integer hid = GetHandleId(t) )  //Id таймера
     local unit caster =GetTriggerUnit() //юнит, который мы будем лечить, по факту тот, кто активировал способность
     call SaveUnitHandle(udg_Hash, hid, 0, caster) //сохраняем в Хэш юнит caster с ссылкой "0".
     call SaveInteger(udg_Hash, hid, 1, 0) //сохраняем значение 0 с ссылкой "1". Это будет счетчик длительности лечения.
     call TimerStart(t, 0.1, true, function Trig_HealImp_Timer) //запускаем таймер. 
     set t = null  
     set caster = null 
endfunction
ответ
Конечно - глобальные переменные, хештаблицы, все функции Get в соответствующих потоках.
ответ
всегда по ссылке для handle-типов, всегда по значению для остальных
изменить это невозможно
никак, использовать глобалку, куда сохранять локалку перед нулением
нет, нету
ну или аналоги всего этого есть в продвинутых редакторах, не знаю, пусть те, кто ими пользуются, скажут

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

ответ
Хэш таблица. Удобна и практична. Кстати, не забудь создать глобальную переменную Hash, типа хэш-таблица и при инициализации карты инициализировать Hash, иначе не будет работать.
function Trig_HealImp_Timer takes nothing returns nothing 
     local timer t = GetExpiredTimer() 
     local integer hid = GetHandleId(t) 
     local unit caster = LoadUnitHandle(udg_Hash, hid, 0) //Наш юнит хранится по ссылке "0", вытаскиваем его, чтобы с ним работать
     local integer i = LoadInteger(udg_Hash, hid, 1)  //Счетчик
    local real hp1 = GetUnitState(caster, ConvertUnitState(0)) //текущее здоровье
    local real hp = GetUnitState(caster, ConvertUnitState(1)) //максимальное здоровье
    local real chp = (hp/100)*0.8 //значение, на которое лечим юнит
     if i != 50 then //Срабатывание таймера 0,1. Так как длительность лечения составляет 5 сек, то таймер должен сработать 50 раз. Кстати, исходя из этого, высчитываем chp.
          set i = i + 1 //Увеличиваем значение счетчика
          call SetUnitState(caster, ConvertUnitState(0), hp1+chp) //лечим юнит
          call SaveInteger(udg_Hash, hid, 1, i) //Сохраняем новое значение счетчика. Если этого не будет, счетчик вечно будет равен 0.
     else //Когда счетчик равен 50, мы останавливаем таймер и чистим Хэш
         call PauseTimer(t) 
         call DestroyTimer(t) 
         call FlushChildHashtable(udg_Hash, hid) 
     endif 
     set t=null
     set caster = null 
endfunction 

function Trig_HealImp_Actions takes nothing returns nothing
    local timer t = CreateTimer()  //Таймер
     local integer hid = GetHandleId(t) )  //Id таймера
     local unit caster =GetTriggerUnit() //юнит, который мы будем лечить, по факту тот, кто активировал способность
     call SaveUnitHandle(udg_Hash, hid, 0, caster) //сохраняем в Хэш юнит caster с ссылкой "0".
     call SaveInteger(udg_Hash, hid, 1, 0) //сохраняем значение 0 с ссылкой "1". Это будет счетчик длительности лечения.
     call TimerStart(t, 0.1, true, function Trig_HealImp_Timer) //запускаем таймер. 
     set t = null  
     set caster = null 
endfunction
ответ
Конечно - глобальные переменные, хештаблицы, все функции Get в соответствующих потоках.
ответ
всегда по ссылке для handle-типов, всегда по значению для остальных
изменить это невозможно
никак, использовать глобалку, куда сохранять локалку перед нулением
нет, нету
ну или аналоги всего этого есть в продвинутых редакторах, не знаю, пусть те, кто ими пользуются, скажут

Принятый ответ
26
Если триггер один, там же просто указывается локалка, как если бы это была глобалка. Разве нет?
21
8gabriel8:
Если триггер один, там же просто указывается локалка, как если бы это была глобалка. Разве нет?
Он не хочет глобалки вообще.Мне кажется ему нужно передать значение локальной между триггерами
21
Локальная переменная - ссылка на игровой объект, доступная только внутри функции. Как вариант в конце функции возвращать ее значение (returns yourType). Дальше использовать эту функцию в качестве принимаемого аргумента другой функции, а другую - в третьей. Но это как минимум странный подход.
Лучше опиши задачу, которую ты пытаешься решить, а мы подскажем наиболее оптимальное решение.
21
Raised:
Локальная переменная - ссылка на игровой объект, доступная только внутри функции. Как вариант в конце функции возвращать ее значение (returns yourType). Дальше использовать эту функцию в качестве принимаемого аргумента другой функции, а другую - в третьей. Но это как минимум странный подход.
Лучше опиши задачу, которую ты пытаешься решить, а мы подскажем наиболее оптимальное решение.
Ниче не понял. Локальная в другой триггер не перейдет или будет утечка.Что с ней делать,если не копировать значение в глобалку?
28
Локальная в другой триггер не перейдет или будет утечка.
Какая утечка? Ты знаешь, что такое memory leaks (утечки)?
2
Raised, мне нужно вместо глобальной udg_u_dark1 переменной использовать локальную u, а ее как то перенести в функцию, не используя глобальную.
Загруженные файлы
32
Frzctions, переписать весь этот ужас с нуля, потом кто такой udg_u_dark1, потом как насчет кода а не скрина.
2
quq_CCCP, прошу (а по поводу переписывания, то при конвертации в текст, ничего особо "нового" не выйдет).

code

function Trig_Dark_Explosion_Copy_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A005' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Dark_Explosion_Copy_Func010Func001C takes nothing returns boolean
    if ( not  ( IsUnitAlly(GetEnumUnit(),GetOwningPlayer(GetSpellAbilityUnit()))!=true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Dark_Explosion_Copy_Func010A takes nothing returns nothing
    if ( Trig_Dark_Explosion_Copy_Func010Func001C() ) then
        call UnitDamageTargetBJ( udg_u_dark1, GetEnumUnit(), ( I2R(GetHeroStatBJ(bj_HEROSTAT_STR, GetSpellAbilityUnit(), true)) * 25.00 ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
    else
        call SetUnitLifeBJ(GetEnumUnit(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetEnumUnit()) + I2R(GetHeroStatBJ(bj_HEROSTAT_STR, GetSpellAbilityUnit(), true))))
    endif
endfunction

function Trig_Dark_Explosion_Copy_Actions takes nothing returns nothing
    local effect e = null
    local unit u = null
    call CreateNUnitsAtLocFacingLocBJ( 1, 'e000', Player(0), GetUnitLoc(GetSpellAbilityUnit()), GetUnitLoc(GetTriggerUnit()) )
    set u = GetLastCreatedUnit()
    call AddSpecialEffectLocBJ(GetUnitLoc(u), "war3mapImported\\DarkNova.mdx")
    set e = GetLastCreatedEffectBJ()
    call SetUnitLifeBJ(GetSpellAbilityUnit(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetSpellAbilityUnit()) + ( I2R(GetHeroStatBJ(bj_HEROSTAT_STR, GetSpellAbilityUnit(), true)) * 3.00 ) ))
    set udg_ug_dark2=GetUnitsInRangeOfLocAll(650.00, GetUnitLoc(u))
    call ForGroupBJ( udg_ug_dark2, function Trig_Dark_Explosion_Copy_Func010A )
    call DestroyGroup(udg_ug_dark2)
    call DestroyEffect(e)
    call RemoveUnit(u)
endfunction

//===========================================================================
function InitTrig_Dark_Explosion_Copy takes nothing returns nothing
    set gg_trg_Dark_Explosion_Copy = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Dark_Explosion_Copy, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Dark_Explosion_Copy, Condition( function Trig_Dark_Explosion_Copy_Conditions ) )
    call TriggerAddAction( gg_trg_Dark_Explosion_Copy, function Trig_Dark_Explosion_Copy_Actions )
endfunction
замечание от Raised: Пожалуйста используйте форматирование.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.